Skip to content

11-dars: Mini loyiha — Talabalar boshqaruv tizimi

Dars haqida

Davomiyligi: 90 daqiqa Maqsad: 5-oyda o'rgangan barcha tushunchalarni — array, struct, file I/O, pointer — birlashtirish.

1. Loyiha tavsifi

Talabalar Boshqaruv Tizimi — to'liq CRUD ilovasi.

CRUD:

  • Create — yaratish
  • Read — o'qish
  • Update — yangilash
  • Delete — o'chirish

2. Imkoniyatlari

  1. Talaba qo'shish
  2. Barcha talabalarni ko'rsatish
  3. Talabani qidirish (ism bo'yicha)
  4. Talabani yangilash
  5. Talabani o'chirish
  6. Ball bo'yicha sort
  7. Statistika
  8. Faylga saqlash
  9. Fayldan yuklash
  10. Chiqish

3. Struct dizayni

c
typedef struct {
    int id;
    char name[50];
    int age;
    double score;
    char group[10];
} Student;

4. To'liq dastur

c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_STUDENTS 100
#define FILENAME "students.dat"

typedef struct {
    int id;
    char name[50];
    int age;
    double score;
    char group[10];
} Student;

Student students[MAX_STUDENTS];
int student_count = 0;
int next_id = 1;

// Funksiya prototypelari
void print_menu(void);
void add_student(void);
void show_all(void);
void search_student(void);
void update_student(void);
void delete_student(void);
void sort_by_score(void);
void show_stats(void);
void save_to_file(void);
void load_from_file(void);
int find_by_id(int id);

int main(void) {
    load_from_file();  // Boshlanganda yuklash
    
    int choice;
    
    do {
        print_menu();
        if (scanf("%d", &choice) != 1) {
            while (getchar() != '\n');
            choice = -1;
        }
        
        switch (choice) {
            case 1: add_student(); break;
            case 2: show_all(); break;
            case 3: search_student(); break;
            case 4: update_student(); break;
            case 5: delete_student(); break;
            case 6: sort_by_score(); break;
            case 7: show_stats(); break;
            case 8: save_to_file(); break;
            case 9: load_from_file(); break;
            case 0:
                save_to_file();
                printf("Xayr!\n");
                break;
            default:
                printf("Noma'lum tanlov\n");
        }
    } while (choice != 0);
    
    return 0;
}

void print_menu(void) {
    printf("\n========= MENU =========\n");
    printf("1. Talaba qo'shish\n");
    printf("2. Barcha talabalar\n");
    printf("3. Qidirish\n");
    printf("4. Yangilash\n");
    printf("5. O'chirish\n");
    printf("6. Ball bo'yicha sort\n");
    printf("7. Statistika\n");
    printf("8. Faylga saqlash\n");
    printf("9. Fayldan yuklash\n");
    printf("0. Chiqish\n");
    printf("========================\n");
    printf("Tanlov: ");
}

void add_student(void) {
    if (student_count >= MAX_STUDENTS) {
        printf("Maksimum yetildi\n");
        return;
    }
    
    Student s;
    s.id = next_id++;
    
    printf("Ism: ");
    scanf("%49s", s.name);
    
    printf("Yosh: ");
    scanf("%d", &s.age);
    
    printf("Ball: ");
    scanf("%lf", &s.score);
    
    printf("Guruh: ");
    scanf("%9s", s.group);
    
    students[student_count++] = s;
    printf("✓ Qo'shildi (ID: %d)\n", s.id);
}

void show_all(void) {
    if (student_count == 0) {
        printf("Talaba yo'q\n");
        return;
    }
    
    printf("\n%-5s %-15s %-5s %-7s %-10s\n", 
           "ID", "Ism", "Yosh", "Ball", "Guruh");
    printf("------------------------------------------------\n");
    
    for (int i = 0; i < student_count; i++) {
        printf("%-5d %-15s %-5d %-7.1f %-10s\n",
               students[i].id, students[i].name, students[i].age,
               students[i].score, students[i].group);
    }
}

void search_student(void) {
    char query[50];
    printf("Ism: ");
    scanf("%49s", query);
    
    int found = 0;
    for (int i = 0; i < student_count; i++) {
        if (strstr(students[i].name, query) != NULL) {
            printf("ID: %d, Ism: %s, Yosh: %d, Ball: %.1f, Guruh: %s\n",
                   students[i].id, students[i].name, students[i].age,
                   students[i].score, students[i].group);
            found++;
        }
    }
    
    if (found == 0) {
        printf("Topilmadi\n");
    } else {
        printf("Topildi: %d\n", found);
    }
}

int find_by_id(int id) {
    for (int i = 0; i < student_count; i++) {
        if (students[i].id == id) return i;
    }
    return -1;
}

void update_student(void) {
    int id;
    printf("ID: ");
    scanf("%d", &id);
    
    int idx = find_by_id(id);
    if (idx == -1) {
        printf("Topilmadi\n");
        return;
    }
    
    printf("Yangi ism (eski: %s): ", students[idx].name);
    scanf("%49s", students[idx].name);
    
    printf("Yangi yosh: ");
    scanf("%d", &students[idx].age);
    
    printf("Yangi ball: ");
    scanf("%lf", &students[idx].score);
    
    printf("Yangi guruh: ");
    scanf("%9s", students[idx].group);
    
    printf("✓ Yangilandi\n");
}

void delete_student(void) {
    int id;
    printf("ID: ");
    scanf("%d", &id);
    
    int idx = find_by_id(id);
    if (idx == -1) {
        printf("Topilmadi\n");
        return;
    }
    
    // Shift
    for (int i = idx; i < student_count - 1; i++) {
        students[i] = students[i + 1];
    }
    student_count--;
    
    printf("✓ O'chirildi\n");
}

void sort_by_score(void) {
    for (int i = 0; i < student_count - 1; i++) {
        for (int j = 0; j < student_count - 1 - i; j++) {
            if (students[j].score < students[j+1].score) {
                Student t = students[j];
                students[j] = students[j+1];
                students[j+1] = t;
            }
        }
    }
    printf("✓ Sortlangan (ball bo'yicha)\n");
}

void show_stats(void) {
    if (student_count == 0) {
        printf("Talaba yo'q\n");
        return;
    }
    
    double sum = 0;
    double max = students[0].score;
    double min = students[0].score;
    int passed = 0;
    
    for (int i = 0; i < student_count; i++) {
        sum += students[i].score;
        if (students[i].score > max) max = students[i].score;
        if (students[i].score < min) min = students[i].score;
        if (students[i].score >= 60) passed++;
    }
    
    double avg = sum / student_count;
    
    printf("\n=== STATISTIKA ===\n");
    printf("Jami talabalar: %d\n", student_count);
    printf("O'rtacha ball: %.2f\n", avg);
    printf("Eng yuqori: %.1f\n", max);
    printf("Eng past: %.1f\n", min);
    printf("O'tganlar: %d (%.1f%%)\n", passed, 
           (double)passed / student_count * 100);
}

void save_to_file(void) {
    FILE *fp = fopen(FILENAME, "wb");
    if (!fp) {
        printf("Faylni yaratib bo'lmadi\n");
        return;
    }
    
    fwrite(&student_count, sizeof(int), 1, fp);
    fwrite(&next_id, sizeof(int), 1, fp);
    fwrite(students, sizeof(Student), student_count, fp);
    
    fclose(fp);
    printf("✓ %d talaba saqlandi\n", student_count);
}

void load_from_file(void) {
    FILE *fp = fopen(FILENAME, "rb");
    if (!fp) {
        printf("Fayl yo'q (yangi boshlash)\n");
        return;
    }
    
    fread(&student_count, sizeof(int), 1, fp);
    fread(&next_id, sizeof(int), 1, fp);
    fread(students, sizeof(Student), student_count, fp);
    
    fclose(fp);
    printf("✓ %d talaba yuklandi\n", student_count);
}

5. Kompilyatsiya va sinash

bash
$ gcc main.c -o students
$ ./students

Sinash:

  1. Talabalar qo'shing
  2. Sort qiling
  3. Statistika ko'ring
  4. Chiqing (avtomatik saqlanadi)
  5. Yana ishga tushiring — yuklanadi

6. Yaxshilashlar

1. Linked List

Massiv o'rniga linked list — cheksiz hajm.

2. Bir nechta fayl

Kodni main.c, student.c, student.h ga bo'lish.

3. JSON / CSV format

Binary o'rniga matn formatda saqlash.

ID,Ism,Yosh,Ball,Guruh
1,Akmal,22,95.5,A1
2,Aziza,19,92.0,A1

4. Sort variantlari

Ism, yosh, ID bo'yicha ham sort.

5. Filter

  • Faqat o'tganlar
  • Ma'lum guruhdan
  • Ma'lum yosh oralig'idan

6. Excel export

CSV format — Excel'da ochiladi.

7. Boshqa loyiha variantlari

Bank account system

c
typedef struct {
    int id;
    char owner[50];
    char password[20];
    double balance;
    Transaction history[100];
} Account;

Library management

c
typedef struct {
    int id;
    char title[100];
    char author[50];
    int year;
    int available;
    char borrower[50];
} Book;

Inventory system

c
typedef struct {
    int id;
    char name[100];
    double price;
    int quantity;
    char category[30];
} Product;

Quiz system

c
typedef struct {
    char question[200];
    char options[4][50];
    int correct_answer;
} Question;

Hospital patients

c
typedef struct {
    int id;
    char name[50];
    int age;
    char diagnosis[100];
    char doctor[50];
} Patient;

Darsdagi topshiriqlar

1 — Loyihani tanlash

Yuqorida 5+ ta variant. Tanlang YOKI o'zingizniki.

Drive'ga reja.md:

  • Loyiha nomi
  • Tavsif
  • Struct dizayni
  • Funksiyalar ro'yxati
  • Imkoniyatlar (CRUD + qo'shimcha)

2 — GitHub repo

bash
$ mkdir c-mini-loyiha-2
$ cd c-mini-loyiha-2
$ git init

README.md to'liq qiling.

3 — Skeleton

Minimal ishlovchi skeleton:

  • Menu
  • main funksiyasi
  • Funksiya prototypelari

Initial commit.

4 — Add va Show

Eng oddiy ikki funksiya — add va show.

Sinab ko'ring.

Commit: feat: add and show functions

5 — Search, Update, Delete

Qolgan CRUD funksiyalari.

Har birini alohida commit.

6 — Sort va Statistika

  • Ball bo'yicha sort
  • O'rtacha, max, min, count

Commit.

7 — File I/O

Save va Load funksiyalari.

Binary fayl ishlatish.

8 — Validation

Har input uchun tekshirish:

  • Salbiy raqam
  • Bo'sh string
  • Limit oshish
  • ID mavjudligi

Commit: fix: add input validation

9 — README

README.md ni to'liq qiling:

  • Tavsif
  • Imkoniyatlar
  • Kompilyatsiya
  • Foydalanish
  • Screenshot (ASCII art)
  • Kelajak rejasi

Commit: docs: complete README

10 — Final

Final test va push:

bash
$ gcc -Wall -Wextra main.c -o app
$ ./app
# ko'p marta sinab ko'ring
$ git add . && git commit -m "feat: final version" && git push

Repo URL'ni o'qituvchiga email orqali.

Asosiy tushunchalar (lug'at)

TerminIzoh
CRUDCreate, Read, Update, Delete
Mini projectKichik to'liq dastur
PersistenceFaylga saqlash
ValidationInput tekshirish
Menu-drivenMenyu asoslangan
State managementHolat boshqarish

Keyingi dars

12-dars: Oylik imtihon →

Master IT o'quv markazi — o'qitish rejasi