Основи системного програмування — 02

У цьому уроці ми розглянемо основи мови C та поступово перейдемо до вивчення pointer'ів (покажчиків) у наступному уроці. Це стане основою для глибшого занурення в системне програмування.

Struct

Struct дозволяє зберігати кілька різних типів даних. Наприклад, уявімо студента, у якого є кілька параметрів: номер студентського квитка, оцінка, ім'я, прізвище тощо. Ми можемо об'єднати ці дані в один тип, створивши struct.

Примітка: Оголошення struct зазвичай розміщується поза функцією main.

#include  
#include  

struct ogrenci{  
 int ogrNo;  
 double not;  
};  

int main(){  
 struct ogrenci ogr1;  
 ogr1.ogrNo = 10;  
 ogr1.not = 10.25;  
 printf("No: %d,Not: %f", ogr1.ogrNo, ogr1.not);  
 return 0;  
}

Замість того, щоб оголошувати struct у main, можна зробити це так:

struct ogrenci{  
 int ogrNo;  
 double not;  
} ogr1, ogr2, ogr3;

typedef

Для зручності читання використовують typedef. Якщо ви не хочете кожного разу писати повне оголошення struct, typedef дозволяє створити коротшу назву для типу.

typedef struct ogrenci{  
 int ogrNo;  
 double not;  
} ogr;  

int main(){  
 ogr ogr1, ogr2;  
 ogr1.ogrNo = 10;  
}

Ще один приклад:

#include  
#include  

typedef struct dd{  
 int a[10];  
} dizi;  

int main(){  
 dizi d1, d2;  
 for (int i = 0; i < 10; i++)  
   d1.a[i] = i;  
 d2 = d1;  
 for (int i = 0; i < 10; i++)  
   printf("%d %d\n", d1.a[i], d2.a[i]);  
 return 0;  
}

Виведення буде:

1 1   
2 2   
3 3   
4 4  
5 5   
6 6   
7 7   
8 8   
9 9

Typecasting

У цьому прикладі ми маємо два цілих числа та один тип double. Якщо ми поділимо два цілих числа, результат буде цілим, навіть якщо результат зберігається в змінній типу double.

int main(){  
 int i = 10, j = 3;  
 double ort;  
 ort = i / j;  
 printf("Ort: %f\n", ort);  
}

Результат:

Ort: 3.0000

Ми очікуємо, що результат буде 3.33. Що потрібно зробити? Перетворити одне з чисел на тип double, щоб отримати точний результат.

ort = (double)i / j;

Тепер результат буде:

Ort: 3.3333 ✅

Інші приклади коду

char ch = 'a';  
int b;  
b = (int)ch;  
printf("ch: %c, b: %d\n", ch, b);

Результат:

ch: a, b: 97 (ASCI код)
char a[] = {'A', 'D', 'E', 'M'};  
printf("a = %c", a[2]);

Результат:

a = E

Пройдемо по всьому масиву:

char a[] = {'A', 'D', 'E', 'M'};  
for (int i = 0; i < 4; i++)  
   printf("%c ", a[i]);

Результат:

A D E M

Створення масивів в C

Якщо ви не хочете ініціалізувати масив на початку, як у випадку з {'A', 'D', 'E', 'M'}, то ви повинні вказати розмір масиву.

int dizi[] ❌ int dizi[] = {1, 2, 3, 4} ✅
int dizi[5];  
dizi[0] = 1;  
dizi[1] = 2;  
dizi[2] = 3;  
dizi[3] = 4;
char a[] = {'A', 'D', 'E', 'M'};  
// Масив стає рядком, коли ми оголошуємо його таким чином.
printf("%s\n", a);

Результат:

ADEM

Функції в C

Оголошення простих функцій:

void yazdir(){  
 printf("Merhaba Dunya\n");  
}  

int main(){  
 yazdir();  
 return 0;  
}

Результат:

Merhaba Dunya

Функція з параметром:

void yazdir(int a){  
 printf("main'den gelen deger: %d\n", a);  
}  

int main(){  
 yazdir(10);  
 return 0;  
}

Результат:

main'den gelen deger: 10

Функція для обчислення суми:

void topla(int a, int b){  
 printf("Toplam: %d\n", a + b);  
}  

int main(){  
 topla(10, 7);  
 return 0;  
}

Результат:

Toplam: 17

Функція, що повертає значення:

int topla(int a, int b){  
 return a + b;  
}  

int main(){  
 printf("Toplam: %d\n", topla(10, 7));  
 return 0;  
}

Або ми можемо зробити так:

int t;  
t = topla(10, 7);  
printf("Toplam: %d\n", t);

Результат:

Toplam: 17

Оголошення функції після main

int main(){  
 int t;  
 t = topla(10, 7);  
 printf("Toplam: %d\n", t);  
 return 0;  
}  

int topla(int a, int b){  
 return a + b;  
}

Це дасть помилку, тому що функцію потрібно спочатку декларувати перед її використанням в main. Тому оголошуємо тип повернення функції та параметри перед основною функцією.

int topla(int, int);  

int main(){  
 int t;  
 t = topla(10, 7);  
 printf("Toplam: %d\n", t);  
 return 0;  
}  

int topla(int a, int b){  
 return a + b;  
}

Тепер код працює правильно. Якщо ми хочемо використовувати функцію після main, її потрібно спочатку декларувати.

Якщо ми хочемо, щоб функція повертала не тільки суму двох чисел, але й їх різницю, це не можливо в рамках однієї функції. Однак, ми можемо застосувати інший підхід:

🧠 Використовувати pointer'и!

Один із найпоширеніших способів використання pointer'ів — це повернення кількох значень з функції. В наступному уроці ми розглянемо, як працювати з pointer'ами (покажчиками).

Перекладено з: Sistem Programlama Basic Ders Serisi — 02