Skip to content

Commit 39e37b6

Browse files
committed
Semester 1 exam task added
1 parent f8bd271 commit 39e37b6

File tree

17 files changed

+690
-0
lines changed

17 files changed

+690
-0
lines changed

Exam/Semester_1/list_t.c

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
4+
typedef struct node_t {
5+
int value;
6+
struct node_t *prev;
7+
struct node_t *next;
8+
} node_t;
9+
10+
typedef struct list_t {
11+
node_t* head;
12+
node_t* tail; // доп задание
13+
size_t size;
14+
} list_t;
15+
16+
void init(list_t *list) {
17+
list -> head = NULL;
18+
list -> tail = NULL;
19+
list -> size = 0;
20+
}
21+
22+
void old_push_back(list_t* list, int val) {
23+
node_t* temp = (node_t*) malloc(sizeof(node_t));
24+
temp->value = val;
25+
temp->next = NULL;
26+
node_t* curr;
27+
if (list->head != NULL) {
28+
curr = list->head;
29+
while (curr->next != NULL)
30+
curr = curr->next;
31+
curr->next = temp;
32+
temp->prev = curr;
33+
} else {
34+
list->head = temp;
35+
temp->prev = NULL;
36+
}
37+
list->size++;
38+
}
39+
40+
// здесь с использованием tail
41+
void push_back(list_t* list, int val) {
42+
node_t* temp = (node_t*)malloc(sizeof(node_t));
43+
temp->value = val;
44+
temp->next = NULL;
45+
46+
if (list->size == 0) {
47+
list->head = temp;
48+
list->tail = temp;
49+
temp->prev = NULL;
50+
} else {
51+
temp->prev = list->tail;
52+
list->tail->next = temp;
53+
list->tail = temp;
54+
}
55+
list->size++;
56+
}
57+
58+
void destroy(list_t* list) {
59+
// проходим по всему списку и все заменяем на NULL
60+
node_t *curr = list->head;
61+
node_t *prev = NULL;
62+
while (curr != NULL) {
63+
prev = curr;
64+
curr = curr->next;
65+
free(prev);
66+
}
67+
list -> head = NULL;
68+
list -> size = 0;
69+
// по факту это просто init()
70+
}
71+
72+
73+
void insert(list_t* list, node_t* node, int val) {
74+
// еще нужно проверить, не равнво ли node != head и node != tail
75+
node_t* temp = (node_t*)malloc(sizeof(node_t));
76+
temp->value = val;
77+
temp->prev = node;
78+
temp->next = node->next;
79+
node->next = temp;
80+
node->next->prev = temp;
81+
list->size++;
82+
}
83+
84+
void set(list_t* list, int index, int val) {
85+
node_t* curr = list->head;
86+
int i = 0;
87+
while (i != index) {
88+
curr = curr->next;
89+
i++;
90+
}
91+
curr->value = val;
92+
}
93+
94+
int get(list_t* list, int index) {
95+
if (index < 0 || index >= list->size) return -1;
96+
node_t* curr = list->head;
97+
for (int i = 0; i < index; i++) curr = curr->next;
98+
return curr->value;
99+
}
100+
101+
void erase(list_t* list, node_t* node) {
102+
if (node == list->head) { // проверка на head
103+
list->head = list->head->next;
104+
if (node->next != NULL) // проверка на tail
105+
node->next->prev = NULL;
106+
} else {
107+
node->prev->next = node->next;
108+
if (node->next != NULL) // проверка на tail
109+
node->next->prev = node->prev;
110+
}
111+
free(node);
112+
list->size--;
113+
}
114+
115+
int find(list_t* list, int val) {
116+
node_t* curr = list->head;
117+
int index = 0;
118+
while (curr != NULL) {
119+
if (curr->value == val) return index;
120+
curr = curr->next;
121+
index++;
122+
}
123+
return -1;
124+
} // можно идти с конца если индекс больше середины
125+
126+
void print_list(list_t* list) {
127+
node_t* curr = list->head;
128+
while (curr != NULL) {
129+
printf("%d ", curr->value);
130+
curr = curr->next;
131+
}
132+
}
133+
134+
int main (int argc, char *argv[]) {
135+
list_t list;
136+
init(&list);
137+
138+
for (int i = 0; i < 10; i++) old_push_back(&list, i);
139+
140+
print_list(&list);
141+
printf("\n");
142+
143+
printf("%d\n", find(&list, 8));
144+
145+
set(&list, 7, 99999);
146+
print_list(&list);
147+
printf("\n");
148+
149+
insert(&list, (&list)->head, 15);
150+
print_list(&list);
151+
printf("\n");
152+
153+
printf("%d\n", get(&list, 8));
154+
155+
print_list(&list);
156+
printf("\n");
157+
158+
old_push_back(&list, 123);
159+
print_list(&list);
160+
}

Exam/Semester_1/n1_1.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// это фрагмент программы на си
2+
void main() {
3+
int a = 0;
4+
int b = 42;
5+
int c = a + b;
6+
}
7+
8+
// а это фрагмент программы на ассембере
9+
// load 500 1 // перемещяем из 500 ячейки оперативки в 1 регистр
10+
// load 300 2 // перемещяем из 300 ячейки оперативки во 2 регистр
11+
// sum 1 2 3 // складываем значения в 1 и 2 регистрах и вносим в регистр 3
12+
// dump 3 700 // записываем значение из регистра 3 в 700 ячейку оперативки

Exam/Semester_1/n1_2.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#define test 42 // константа
2+
3+
#define sum(a, b) a + b // макрос
4+
5+
#define include_libs 1 // настройка
6+
7+
#ifdef include_libs // эту проверку выполняет препроцессор
8+
#include <stdio.h>
9+
#include <stdlib.h>
10+
#endif
11+
12+
void main() {
13+
int a = 1;
14+
int b = 42;
15+
16+
int x = sum(a, b); // тут просто происходит замена на макрос sum
17+
int y = sum(a, b) * 2; // a + b * 2
18+
int z = (sum(a, b)) * 2; // (a + b) * 2
19+
printf("%d %d %d", x, y, z);
20+
21+
}

Exam/Semester_1/n2_1.c

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
void main() {
2+
// основные типы данных
3+
char a = -1; // 1 байт
4+
short b = -2; // 2 байта
5+
int c = -3; // 4 байта
6+
long d = -4; // 4 байта
7+
long long e = -5; // 8 байт
8+
9+
unsigned char v = 6; // 1 байт без знака
10+
unsigned short w = 7; // 2 байта без знака
11+
unsigned int x = 8; // 4 байта без знака
12+
unsigned long y = 9; // 4 байта без знака
13+
unsigned long long z = 10; // 8 байт без знака
14+
15+
float fl = 42.42; // 4 байта
16+
double db = 4242.42424242; // 8 байт
17+
18+
// приведение типов данных
19+
char some_char = 42;
20+
int some_int = (int) some_char;
21+
22+
some_int = 1234567;
23+
some_char = (char) some_int; // число обрежется до 8 младших битов
24+
25+
int n = 3;
26+
int m = 5;
27+
double some_double_1 = n / m; // будет 0 так как мы делим intы
28+
double some_double_2 = ((double) n) / m; // теперь мы doube делим на int = double
29+
}

Exam/Semester_1/n2_2.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
void main() {
2+
int a = 3;
3+
int b = 5;
4+
5+
int c1 = a + b;
6+
int c2 = a - b;
7+
unsigned int c21 = a - b;
8+
int c3 = a * b;
9+
int c41 = a / b;
10+
float c42 = a / b;
11+
float c43 = ((float) a) / b;
12+
13+
int d0 = ~a;
14+
int d1 = a & b;
15+
int d2 = a | b;
16+
int d3 = a ^ b;
17+
18+
// побитовый сдвиг влево на 2
19+
int e_l = a << 2; // 00000011 << 00001100 (12)
20+
21+
// побитовый сдвиг вправо на 1
22+
int e_r = b >> 1; // 00000101 >> 00000010 (3)
23+
}

Exam/Semester_1/n3_1.c

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#include <stdio.h>
2+
3+
void main() {
4+
int a = 3;
5+
int b = 5;
6+
7+
int c1 = a < b;
8+
int c2 = a > b;
9+
int c3 = a <= b;
10+
int c4 = a >= b;
11+
int c5 = a == b;
12+
int c6 = a != b;
13+
14+
int sum = 0;
15+
int i = 0;
16+
for (i = 0; i < 10; i++) {
17+
sum += i;
18+
}
19+
20+
sum = 0;
21+
for (i = 0; i <= 100; i *= 2)
22+
sum += i;
23+
24+
i = 0;
25+
sum = 0;
26+
while (i < 10) {
27+
sum += i;
28+
i++;
29+
}
30+
31+
i = 0;
32+
sum = 0;
33+
do {
34+
sum += i;
35+
i++;
36+
} while (i < 10);
37+
}

Exam/Semester_1/n3_2.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#include <stdio.h>
2+
3+
void main() {
4+
for (int i = 0; i < 10; i++) {
5+
if (i == 6) break;
6+
printf("%d ", i);
7+
}
8+
printf("\n");
9+
10+
for (int i = 0; i < 10; i++) {
11+
if (i == 6) continue;
12+
printf("%d ", i);
13+
}
14+
printf("\n");
15+
16+
for (int a = 0; a < 10; a++) {
17+
for (int b = 0; b < 10; b++) {
18+
for (int c = 0; c < 10; c++) {
19+
if ((a == 6) && (b == 1) && (c == 8)) goto exit;
20+
printf("%d%d%d ", a, b, c);
21+
}
22+
}
23+
}
24+
exit:
25+
printf("\nexit");
26+
}

Exam/Semester_1/n4_1.c

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#include <stdio.h>
2+
3+
void main () {
4+
int a = 1;
5+
int b = 2;
6+
7+
if (a == b) {
8+
printf("это неправда");
9+
} else if (a > b) {
10+
printf("это тоже неправда");
11+
} else if (a < b) {
12+
printf("вот это уже правда");
13+
} else {
14+
printf("это не выполнится");
15+
}
16+
17+
int s = 1;
18+
switch (s) {
19+
case 0:
20+
printf("s = 0");
21+
break;
22+
case 1:
23+
printf("s = 1");
24+
break;
25+
default:
26+
printf("s равен чему-то другому");
27+
break;
28+
}
29+
}

Exam/Semester_1/n5_1.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#include <stdio.h>
2+
3+
void main() {
4+
int int_arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
5+
int arr_2d[2][2] = {{1, 2}, {3, 4}};
6+
char char_arr[] = "hello world"; // строки заканчиваются числом 0
7+
8+
int_arr[1] = 42;
9+
int_arr[15] = 42; // ошибка (выход за границу массива)
10+
// эта ошибка не улавливается компилятором
11+
12+
for (int i = 0; i < 10; i++)
13+
printf("%d ", int_arr[i]);
14+
printf("\n");
15+
16+
for (int i = 0; char_arr[i] != 0; i++)
17+
printf("%c", char_arr[i]);
18+
printf("\n");
19+
20+
// ввод массива с клавиатуры
21+
int test_arr[10] = {0}; // зануление массива
22+
for (int i = 0; i < 10; i++) {
23+
scanf("%d", &test_arr[i]);
24+
}
25+
26+
for (int i = 0; i < 10; i++)
27+
printf("%d ", test_arr[i]);
28+
}

0 commit comments

Comments
 (0)