Skip to content

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.

c
struct Talaba {
    char name[50];
    int age;
    double score;
};

Talaba — name, age, score to'plami.

2. Nima uchun struct?

Struct'siz:

c
char name[50];
int age;
double score;

// Yana bir talaba?
char name2[50];
int age2;
double score2;

// 100 ta talaba — uzoq!

Struct bilan:

c
struct Talaba {
    char name[50];
    int age;
    double score;
};

struct Talaba akmal;
struct Talaba aziza;

struct Talaba talabalar[100];  // 100 ta talaba

3. Struct e'lon qilish

c
// 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 emas

typedef

typedef — eng keng tarqalgan yondashuv. Kod toza ko'rinadi.

4. Maydonlarga kirish

. (dot) operator:

c
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

c
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:

c
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

c
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)

c
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)

c
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:

c
t->name    ekvivalent: (*t).name

Struct juda katta bo'lsa — pointer orqali uzatish tezroq.

9. Struct return

c
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:

c
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

c
Talaba *t = malloc(sizeof(Talaba));
strcpy(t->name, "Akmal");
t->age = 22;
t->score = 95.5;

free(t);

Dinamik massiv:

c
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

c
#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

c
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

c
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:

c
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.

c
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:

c
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

c
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:

c
typedef struct {
    int i;      // 4
    char c;     // 1
    char c2;    // 1
} Better;       // 8 byte

Darsdagi topshiriqlar

1 — Birinchi struct

first-struct.cTalaba 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:

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.cDate va Person struct'lari.

c
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:

c
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:

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

bash
$ mkdir 5-oy-dars-9
$ git add . && git commit -m "feat: dars 9 - structs" && git push

Lug'at

TerminIzoh
structTuzilma — maydonlar to'plami
typedefTur uchun alias
Field / MemberMaydon
Dot operator (.)Maydonga kirish
Arrow operator (->)Pointer orqali maydon
Nested structStruct ichida struct
UnionBir vaqtda bitta maydon
EnumNomli konstantalar
Memory alignmentXotirada tekislash
Pass by valueNusxa uzatish
Pass by pointerManzil uzatish

Keyingi dars

10-dars: File I/O →

Master IT o'quv markazi — o'qitish rejasi