Дисципліна “Засоби системного програмування”
Структура програми написаної мовою програмування СІ.
а) 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);}
ERROR нема #include <stdio.h> Нема ; у рядку int c=3
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 7
в) #define MAX(a,b) (a)>(b) ? (a) : (b)
void main()
{ int x=5;
printf("%d %d", MAX( (x++)+3, x-2 ), x);}
ERROR нема #include <stdio.h>

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 ); }
-16 64
в) #include <stdio.h>
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 );}
Поняття покажчика на функцію в мові програмування СІ. Приклади використання.
а) Написати функцію, обов'язковим параметром якої є вказівник на однопараметричну функцію 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;
5 0
5 1
5 2
5 3
5 4
for(i=0;i<3;fun2(),i++); }
б) 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. Використання структур в мові програмування СІ. Опис типу, оголошення та ініціалізація змінних. Операції звертання до структурних змінних.
а) 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 задаються через аргументи функції.
в) Написати функцію роздруку усіх записів у списку згідно вказаного року народження. Адреса початку списку та рік народження для пошуку задаються через аргументи функції.
г) Написати функцію вилученя із списку записів згідно вказаного прізвища. Адреса початку списку та прізвище задаються через аргументи функції.
д) Написати функцію підрахунку кількості записів у списку. Адреса початку списку задається через аргумент функції.