9-dars: Struct (tuzilma)
Dars haqida
Davomiyligi: 90 daqiqa Maqsad: Talaba struct (tuzilma) ni bilishi, foydalanishi, struct array va struct funksiyalar bilan ishlay olishi kerak.
1. Struct nima?
Struct — bir nechta turli maydonlarni bitta nom ostida birlashtirish.
struct Talaba {
char name[50];
int age;
double score;
};Talaba — name, age, score to'plami.
2. Nima uchun struct?
Struct'siz:
char name[50];
int age;
double score;
// Yana bir talaba?
char name2[50];
int age2;
double score2;
// 100 ta talaba — uzoq!Struct bilan:
struct Talaba {
char name[50];
int age;
double score;
};
struct Talaba akmal;
struct Talaba aziza;
struct Talaba talabalar[100]; // 100 ta talaba3. Struct e'lon qilish
// Variant 1: alohida
struct Point {
int x;
int y;
};
struct Point p1;
// Variant 2: e'lon va o'zgaruvchi birga
struct Point {
int x;
int y;
} p1, p2;
// Variant 3: typedef bilan (`struct` yozish kerak emas)
typedef struct {
int x;
int y;
} Point;
Point p1; // `struct` kerak emastypedef
typedef — eng keng tarqalgan yondashuv. Kod toza ko'rinadi.
4. Maydonlarga kirish
. (dot) operator:
typedef struct {
char name[50];
int age;
double score;
} Talaba;
Talaba a;
strcpy(a.name, "Akmal");
a.age = 22;
a.score = 95.5;
printf("Ism: %s\n", a.name);
printf("Yosh: %d\n", a.age);
printf("Ball: %.1f\n", a.score);5. Initialize
Talaba a = {"Akmal", 22, 95.5};
// Yoki nomli (C99+):
Talaba b = {.name = "Aziza", .age = 19, .score = 92.0};6. Struct nusxalash
C'da struct'ni to'g'ridan-to'g'ri nusxalash mumkin:
Talaba a = {"Akmal", 22, 95.5};
Talaba b = a; // OK, butun struct nusxalanadi
b.score = 80.0;
printf("%.1f\n", a.score); // 95.5 (o'zgarmadi)(Massivlar bilan bunday emas — alohida.)
7. Struct array
Talaba talabalar[3] = {
{"Akmal", 22, 95.5},
{"Aziza", 19, 92.0},
{"Botir", 25, 78.5}
};
for (int i = 0; i < 3; i++) {
printf("%s (yosh: %d, ball: %.1f)\n",
talabalar[i].name,
talabalar[i].age,
talabalar[i].score);
}8. Struct va funksiyalar
Pass by value (nusxa)
void print(Talaba t) {
printf("%s, %d, %.1f\n", t.name, t.age, t.score);
}
int main(void) {
Talaba a = {"Akmal", 22, 95.5};
print(a); // nusxa uzatiladi
return 0;
}Pass by pointer (manzil)
void print(const Talaba *t) {
printf("%s, %d, %.1f\n", t->name, t->age, t->score);
}
int main(void) {
Talaba a = {"Akmal", 22, 95.5};
print(&a);
return 0;
}-> operator
Pointer orqali maydonga kirish:
t->name ekvivalent: (*t).nameStruct juda katta bo'lsa — pointer orqali uzatish tezroq.
9. Struct return
Talaba create_student(const char *name, int age) {
Talaba t;
strcpy(t.name, name);
t.age = age;
t.score = 0;
return t; // butun struct qaytariladi
}10. Nested struct
Struct ichida struct:
typedef struct {
int day;
int month;
int year;
} Date;
typedef struct {
char name[50];
Date birthday;
} Person;
Person p;
strcpy(p.name, "Akmal");
p.birthday.day = 15;
p.birthday.month = 5;
p.birthday.year = 1995;11. Struct va malloc
Talaba *t = malloc(sizeof(Talaba));
strcpy(t->name, "Akmal");
t->age = 22;
t->score = 95.5;
free(t);Dinamik massiv:
int n = 100;
Talaba *students = malloc(n * sizeof(Talaba));
for (int i = 0; i < n; i++) {
sprintf(students[i].name, "Talaba_%d", i);
students[i].age = 18 + i % 10;
students[i].score = 50 + i;
}
free(students);12. To'liq misol: Talabalar bazasi
#include <stdio.h>
#include <string.h>
typedef struct {
char name[50];
int age;
double score;
} Talaba;
void print_student(const Talaba *t) {
printf("Ism: %-15s Yosh: %d Ball: %.1f\n", t->name, t->age, t->score);
}
double average_score(const Talaba *talabalar, int n) {
double sum = 0;
for (int i = 0; i < n; i++) {
sum += talabalar[i].score;
}
return sum / n;
}
int find_max(const Talaba *talabalar, int n) {
int max_idx = 0;
for (int i = 1; i < n; i++) {
if (talabalar[i].score > talabalar[max_idx].score) {
max_idx = i;
}
}
return max_idx;
}
int main(void) {
Talaba talabalar[5] = {
{"Akmal", 22, 95.5},
{"Aziza", 19, 92.0},
{"Botir", 25, 78.5},
{"Dilshod", 21, 88.0},
{"Eldor", 20, 65.5}
};
int n = 5;
printf("=== TALABALAR ===\n");
for (int i = 0; i < n; i++) {
print_student(&talabalar[i]);
}
printf("\nO'rtacha: %.2f\n", average_score(talabalar, n));
int max_idx = find_max(talabalar, n);
printf("Eng yuqori: %s (%.1f)\n",
talabalar[max_idx].name,
talabalar[max_idx].score);
return 0;
}13. Struct sort
void sort_by_score(Talaba *talabalar, int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (talabalar[j].score < talabalar[j+1].score) {
Talaba temp = talabalar[j];
talabalar[j] = talabalar[j+1];
talabalar[j+1] = temp;
}
}
}
}14. Misol: Geometriya
typedef struct {
double x;
double y;
} Point;
typedef struct {
Point center;
double radius;
} Circle;
typedef struct {
Point p1;
Point p2;
} Line;
double distance(Point a, Point b) {
double dx = a.x - b.x;
double dy = a.y - b.y;
return sqrt(dx*dx + dy*dy); // math.h kerak
}
double circle_area(Circle c) {
return 3.14159 * c.radius * c.radius;
}15. Bit fields
Maxsus — bit darajasidagi struct:
struct Flags {
unsigned int is_active : 1; // 1 bit
unsigned int priority : 3; // 3 bit (0-7)
unsigned int category : 4; // 4 bit (0-15)
};Foydalanish — kam, tizim dasturlashda.
16. Union (qisqacha)
Struct'ga o'xshash, lekin bir vaqtda faqat bitta maydon.
union Value {
int i;
float f;
char s[20];
};
union Value v;
v.i = 42;
// yoki
v.f = 3.14;
// yoki
strcpy(v.s, "Hello");Hajmi — eng katta maydon.
Foydalanish — kam.
17. Enum (qisqacha)
Enum — nomli konstantalar:
typedef enum {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
} Day;
Day today = MONDAY;
switch (today) {
case MONDAY: printf("Dushanba\n"); break;
case TUESDAY: printf("Seshanba\n"); break;
// ...
}Aslida 0, 1, 2, ... bilan saqlanadi.
18. Memory alignment
typedef struct {
char c; // 1 bayt
int i; // 4 bayt
char c2; // 1 bayt
} Test;
printf("%zu\n", sizeof(Test)); // 12 (alignment uchun)C alignment uchun bo'sh joy qoldiradi (tezlik uchun).
Maydonlarni kattadan kichikga tartiblash — hajmni kamaytiradi:
typedef struct {
int i; // 4
char c; // 1
char c2; // 1
} Better; // 8 byteDarsdagi topshiriqlar
1 — Birinchi struct
first-struct.c — Talaba struct yarating va bitta talaba ma'lumotini chiqaring.
2 — Struct array
students.c — Dars matnidagi to'liq talabalar bazasi.
3 — Struct sort
sort-students.c:
- Ball bo'yicha sort (descending)
- Ism bo'yicha sort (alphabetic)
- Yosh bo'yicha sort
4 — Geometry
geometry.c — Point, Circle, Line struct'lari.
Funksiyalar:
- distance(Point a, Point b)
- circle_area(Circle c)
- circle_perimeter(Circle c)
- line_length(Line l)
- is_inside(Point p, Circle c) — point doirada bormi?
5 — Mahsulot inventari
inventory.c:
typedef struct {
char name[50];
double price;
int quantity;
} Product;- 10 ta mahsulot
- Jami qiymat
- Eng arzon
- Eng qimmat
- Mahsulot qidirish (nom bo'yicha)
6 — Nested struct
nested.c — Date va Person struct'lari.
Person p = {"Akmal", {15, 5, 1995}};
printf("%s tug'ilgan: %d.%d.%d\n", p.name,
p.birthday.day, p.birthday.month, p.birthday.year);7 — Dinamik struct
dynamic.c:
Foydalanuvchi N kiritsin, keyin N ta talaba ma'lumotini olib statistika chiqarish.
8 — Library
library.c — kichik kutubxona:
typedef struct {
char title[100];
char author[50];
int year;
int available; // 1 — bor, 0 — yo'q
} Book;
Book library[100];
int book_count = 0;
void add_book(const char *title, const char *author, int year);
void show_books(void);
void borrow_book(const char *title);
void return_book(const char *title);
Book *find_book(const char *title);9 — Bank account
account.c:
typedef struct {
int id;
char owner[50];
double balance;
} Account;
void deposit(Account *acc, double amount);
void withdraw(Account *acc, double amount);
void transfer(Account *from, Account *to, double amount);
void show_account(const Account *acc);10 — GitHub
$ mkdir 5-oy-dars-9
$ git add . && git commit -m "feat: dars 9 - structs" && git pushLug'at
| Termin | Izoh |
|---|---|
| struct | Tuzilma — maydonlar to'plami |
| typedef | Tur uchun alias |
| Field / Member | Maydon |
Dot operator (.) | Maydonga kirish |
Arrow operator (->) | Pointer orqali maydon |
| Nested struct | Struct ichida struct |
| Union | Bir vaqtda bitta maydon |
| Enum | Nomli konstantalar |
| Memory alignment | Xotirada tekislash |
| Pass by value | Nusxa uzatish |
| Pass by pointer | Manzil uzatish |