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
- Talaba qo'shish
- Barcha talabalarni ko'rsatish
- Talabani qidirish (ism bo'yicha)
- Talabani yangilash
- Talabani o'chirish
- Ball bo'yicha sort
- Statistika
- Faylga saqlash
- Fayldan yuklash
- Chiqish
3. Struct dizayni
typedef struct {
int id;
char name[50];
int age;
double score;
char group[10];
} Student;4. To'liq dastur
#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
$ gcc main.c -o students
$ ./studentsSinash:
- Talabalar qo'shing
- Sort qiling
- Statistika ko'ring
- Chiqing (avtomatik saqlanadi)
- 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,A14. 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
typedef struct {
int id;
char owner[50];
char password[20];
double balance;
Transaction history[100];
} Account;Library management
typedef struct {
int id;
char title[100];
char author[50];
int year;
int available;
char borrower[50];
} Book;Inventory system
typedef struct {
int id;
char name[100];
double price;
int quantity;
char category[30];
} Product;Quiz system
typedef struct {
char question[200];
char options[4][50];
int correct_answer;
} Question;Hospital patients
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
$ mkdir c-mini-loyiha-2
$ cd c-mini-loyiha-2
$ git initREADME.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:
$ gcc -Wall -Wextra main.c -o app
$ ./app
# ko'p marta sinab ko'ring
$ git add . && git commit -m "feat: final version" && git pushRepo URL'ni o'qituvchiga email orqali.
Asosiy tushunchalar (lug'at)
| Termin | Izoh |
|---|---|
| CRUD | Create, Read, Update, Delete |
| Mini project | Kichik to'liq dastur |
| Persistence | Faylga saqlash |
| Validation | Input tekshirish |
| Menu-driven | Menyu asoslangan |
| State management | Holat boshqarish |