Дисципліна “Засоби системного програмування”
Структура програми написаної мовою програмування СІ. Прокоментувати програму та вказати результат.
а) int x=1, y=2;
#include <stdio.h>
void main (void)
{ extern int x;
printf ("x=%d y=%d \n", x, y);
{ int x=3; printf ("x=%d y=%d \n", x, y); }
{ int y=4; printf ("x=%d y=%d \n", x, y); }
}
x=3 y=4
x=3 y=4
x=4 y=5
x=1 y=2
x=3 y=2
x=1 y=4
б) int x=2, y=3;
#include <stdio.h>
void main (void)
{ extern int x;
printf ("x=%d y=%d \n",++x,++y);
{ int x=3; printf ("x=%d y=%d \n",x++,y++); }
{ int y=4; printf ("x=%d y=%d \n",++x,++y); }
}
2. Поняття СІ-машини. Сутність передпроцесора. Макровизначення та макрофункції. Прокоментувати програму та вказати результат.
a-b=-11
а) #define PRN(v) printf(#v"=%d",v)
#define a 5-b
#define b c-5
void main(void)
{ int c=3
PRN(a-b);
}
7
-6
б) #include <stdio.h>
#define NEW(x) 2*x
void main()
{ int y=2;
printf("\n%d", NEW(y+3) );
printf("\n%d", y*NEW(-y+2) );
}
9 5
в) #define MAX(a,b) (a)>(b) ? (a) : (b)
void main()
{ int x=5;
printf("%d %d", MAX( (x++)+3, x-2 ), x);
}
3. Характеристика типів даних мови програмування СІ. Перетворення типів даних.
Прокоментувати програму та вказати результат.
52-1
а) #define NEW N*N
#define N 7
#include <stdio.h>
void main(void)
{ int a=NEW;
printf("%d -%c", a+2, a++);
49 1
}
б) #include <stdio.h>
void main(void)
{ int і = 030061;
printf("%d %c\n", (char)i, *(char*)&і );
}
65 - C
в) #include <stdio.h>
void main(void)
{ int a=0x4142;
printf("%d - %c", a /256, a+1 );
}
4. Поняття покажчика в мові програмування СІ. Покажчики та масиви. Адресна арифметика. Прокоментувати програму та вказати результат.
3
5
а) #include <stdio.h>
void main(void)
{ char *ptr;
for( ptr="12345"; *++ptr; )
printf(" %c \n",*(ptr++ +1));
}
234567
4567
67
б) #include <stdio.h>
void main(void)
{ char s[ ]="1234567";
int *p=(int*)&s[1];
for(; (char)*p; )
printf("%s\n", (char*)p++);
}
345
5
в) #include <stdio.h>
void main(void)
{ char *p;
for(p="12345"; *++p; )
puts(p++ +1);
}
5. Операції мови програмування СІ та їх пріоритет. Порядок обчислення виразів. Побічні ефекти. Перетворення та приведення типів. Прокоментувати програму та вказати результат.
4 5 -1
а) #include <stdio.h>
void main(void)
{ int a=3, b=6, c=1;
c -= -(a++) + --b;
printf("%d %d %d\n", a, b, c);
}
-3 5 2
б) #include <stdio.h>
void main(void)
{ int a = -2, b = 5, c = 3;
c -= (a--) + (b | 02) >> 2;
printf( "%d %d %d\n", a, b, c );
}
в) #include <stdio.h>
-16 64
void main(void)
{ int b = 63, a;
a = -(b+=1) >>2 ;
printf("%d %d ", a, b);
}
1 1 3
г) #include <stdio.h>
void main(void)
{ int a = 2, b = 3, c = 4;
c += (b&=1) - a--;
printf( "%d %d %d\n", a, b, c );
}
6. Функції та структура програми мовою програмування СІ. Оголошення функцій. Поняття прототипу. Порядок передачі та перетворення аргументів.
Написати функцію.
а) Написати СІ-функцію згідно прототипу char* strstring(char *str1, char* str2). Функція повертає покажчик на перше входження інвертованого рядка згідно адреси str2 в рядок, адреса якого задається значенням аргументу str1.
б) Написати функцію, яка із двох рядків тексту формує третій рядок способом вибору символів, які не повторюються в перших двох. Аргументами функції являються адреси вхідних рядків. Функція повертає адресу утвореного рядка.
в) Написати СІ-функцію для вводу з клавіатури шістнадцяткового числа цілого типу за допомогою стандартної функції getchar().
г) Написати функцію виводу даних цілого типу на екран у двійковій системі числення за допомогою стандартної функції putchar();
д) Написати функцію пошуку в списку групи студентів із заданим прізвищем згідно прототипу: int find_name_list( char **list, int count, char * name), де list – адреса масиву покажчиків на символьні рядки; count – кількість студентів у групі, name-задане прізвище.
Поняття покажчика на функцію в мові програмування СІ. Приклади використання.
а) Написати функцію, обов'язковим параметром якої є вказівник на однопараметричну функцію y=f(x) і яка знаходить мінімум заданої функції шляхом табуляції на відрізку [a,b].
б) Прокоментувати програму та вказати результат.
E
5
#include <stdio.h>
int fun(int i) { int j=1;
return(i+ ++j); }
void main()
{ struct {int (*p)(int);
char c;
int i; } s={fun,'A'};
s.i=fun(3);
s.c = (*s.p)(2+s.c);
putchar(s.c);
printf("\n %d",s.i );
}
8. Багатомодульне програмування засобами мови СІ. Поняття файлу проекту. Використання директив умовної компіляції. Навести приклади.
9. Класи пам’яті в мові програмування СІ. Глобальні та локальні змінні.
Прокоментувати програму та вказати результат.
а) char arr[ ]= "12345";
int v=5;
11 4 345
11 4 45
11 4 5
#include <stdio.h>
fun1 (int p)
{ return (p*p); }
void fun2(void)
{ int vv;
char *ptr=arr+3;
static char *str=arr+2;
vv=fun1(v-2)+2;
printf("%d %c %s\n",vv,*ptr++,str++);
}
void main(void)
{ int i;
for(i=0;i<3;fun2(),i++); }
5 0
5 1
5 2
5 3
5 4
б) void fun(void)
{ static char str[ ] = "12345", *ptr = "12345";
printf(" %c %c \n", *(str+4), *ptr++ -1);
}
void main (void)
{ int i;
for(i=0; i<5; fun(), i++);
}
в) static char arr[ ]= "Екзамен";
int v=5;
6 з мен7 а мен8 м мен
#include <stdio.h>
void fun2(void)
{ char *ptr=arr+4;
static char *str= arr+2;
printf("%d %c %s",++v,*str++,ptr++);
}
void main(void)
{ int i;
for(i=0; i<3; fun2(), i++) ;
}
г) void fun(void)
{ static char str[ ] = "123456789";
3 1
3 3
3 5
3 7
3 9
static int *ptr = (int*)str;
printf(" %c %c \n",*(str+2),*ptr++);
}
void main (void)
{ int i;
for(i=0; i<5; fun(),i++ );
}
д) #include <stdio.h>
4 2345
4 345
4 45
void fun(void)
{ static char str[ ] = "12345", *ptr = str+3;
printf(" %c %s \n",*(str+3), ptr++ - 2);
}
void main (void)
{ int i;
for(i=0; i<3; fun(), i++ );
}
Оголошення та ініціалізація масивів в мові програмування СІ. Зв'язок масивів з покажчиками.
Прокоментувати програму та вказати результат.
а) #include <stdio.h>
void main(void)
{ int m[3][2]={1,2,3,4,5,6}, (*ptr)[3]=((*)[3])m+1;
printf("%d %d", *(*ptr+2), ptr[0][2] );
}
б) #include <stdio.h>
void main(void)
{ int mm[ ][2]={1,2,3,4,5,6}, (*p)[3]=((*)[3])mm[1]-1;
printf("%d %d", (*++p)[1], p[0][1]);
}
в) #include <stdio.h>
void main(void)
{ int mm[2][3]={{1,2,3},{4,5,6}}, (*p)[2]=((*)[2])&mm[0]+1;
printf("%d %d", (*(p-1))[1],*(*(p+1)) );
}
11. Оголошення масивів покажчиків в мові програмування СІ. Використання командного рядка аргументів. Привести приклад.
12. Використання структур в мові програмування СІ. Опис типу, оголошення та ініціалізація змінних. Операції звертання до структурних змінних.
Прокоментувати оголошення та вказати результат операції sizeof():
а) struct A {
char ch;
17
4
union { float a, b; } max,min;
struct { char c1,c2;
unsigned i:2;
int :8;
unsigned j:4;
int x; } y;
int i;
} s1, *p = &s1;
/* sizeof(s1)==? */
/* sizeof(p->max)==? */
б) struct list { char ch;
7
2
struct list *p3;
union { char c1;
int c2;} v,*p;
} st,*ptr = &st ;
/* sizeof (struct list)==? */
/* sizeof (ptr->v)==? */
в) struct SS { char c;
unsigned i:2;
7
1
int :3;
int j:6;
unsigned :0;
int k:10;
int x; } y;
/* sizeof(y)==? */ /* sizeof(y.c)==? */
13. Використання об’єднань в мові програмування СІ. Опис типу, оголошення та ініціалізація змінних. Операції звертання до змінних типу об’єднань.
Прокоментувати програму та вказати результат.
а) #include <stdio.h>
С
void main()
{ union { int mas[2][2], i;
char mm[3][2];
} y = {65,66,67,68};
printf(" %c ",**(y.mm+1)+1 );
}
А
б) #include <stdio.h>
void main()
{ union { char c1;
char c2;
int i;} v, *p=&v;
p->c1 = 'j';
p->c2 = 'b';
v.i = 65;
printf(" %c ", p->c1);
}
1 6
в) #include <stdio.h>
void main()
{ union { int i;
float x,y;
char mm[3][2];
} y = {0x3031};
printf(" %c %d ", *(*(y.mm+0) ), sizeof(y) );
}
14. Практика програмування мовою СІ з використанням структур даних типу: черг, списків, дерев. Функції динамічного розподілу пам’яті.
Написати фунцкцію згідно завдання.
Заданий список згідно структури #define struct list
LIST { LIST *past, *next;
char lastname[20];
char firstname[10];
int jear; };
а) Написати функцію роздруку усіх записів у списку згідно вказаного прізвища. Адреса початку списку та прізвище задаються через аргументи функції.
б) Написати функцію розширення списку новим записом згідно алфавіту. Адреса початку списку та інформація полів lastname I firstname задаються через аргументи функції.
в) Написати функцію роздруку усіх записів у списку згідно вказаного року народження. Адреса початку списку та рік народження для пошуку задаються через аргументи функції.
г) Написати функцію вилученя із списку записів згідно вказаного прізвища. Адреса початку списку та прізвище задаються через аргументи функції.
д) Написати функцію підрахунку кількості записів у списку. Адреса початку списку задається через аргумент функції.ї