11-dars: Mini loyiha — Bank Boshqaruv Tizimi
Dars haqida
Davomiyligi: 90 daqiqa Maqsad: Talaba 4-oyda o'rgangan barcha tushunchalarni birlashtirib to'liq amaliy dastur yarata olishi kerak.
1. Loyiha tavsifi
Bank Boshqaruv Tizimi — terminal ilovasi.
Imkoniyatlari:
- Akkaunt yaratish
- Balans ko'rish
- Pul kiritish (deposit)
- Pul olib chiqish (withdraw)
- Tranzaksiyalar tarixi (oxirgi 10)
- Foiz hisoblash
- Chiqish
2. Loyihada ishlatiladigan tushunchalar
3. Loyiha tuzilmasi
bank/
├── main.c — asosiy fayl
├── README.md — hujjat
└── Makefile — kompilyatsiya (ixtiyoriy)4. To'liq dastur — main.c
#include <stdio.h>
#include <string.h>
#include <ctype.h>
// Konstantalar
#define MAX_TRANSACTIONS 10
#define MIN_DEPOSIT 1000.0
#define MAX_WITHDRAW 5000000.0
#define INTEREST_RATE 0.05 // 5% yillik
// Akkaunt strukturasi (oddiy — strukturalar 5-oyda)
double balance = 0.0;
char account_name[100] = "";
double transaction_history[MAX_TRANSACTIONS];
int transaction_count = 0;
// Funksiyalar prototypelari
void create_account(void);
void show_balance(void);
void deposit(void);
void withdraw(void);
void show_history(void);
void calculate_interest(void);
void print_menu(void);
void add_transaction(double amount);
int is_account_created(void);
int main(void) {
int choice;
printf("=== BANK BOSHQARUV TIZIMI ===\n");
printf("Foundation 4-oy Mini Loyihasi\n\n");
do {
print_menu();
scanf("%d", &choice);
switch (choice) {
case 1: create_account(); break;
case 2: show_balance(); break;
case 3: deposit(); break;
case 4: withdraw(); break;
case 5: show_history(); break;
case 6: calculate_interest(); break;
case 0: printf("\nXayr! Rahmat\n"); break;
default: printf("\nNoma'lum tanlov\n");
}
if (choice != 0) {
printf("\nDavom etish uchun Enter bosing...");
while (getchar() != '\n'); // input buffer tozalash
getchar();
}
} while (choice != 0);
return 0;
}
void print_menu(void) {
printf("\n=========== MENU ===========\n");
printf("1. Akkaunt yaratish\n");
printf("2. Balansni ko'rish\n");
printf("3. Pul kiritish\n");
printf("4. Pul olish\n");
printf("5. Tranzaksiyalar tarixi\n");
printf("6. Foiz hisoblash\n");
printf("0. Chiqish\n");
printf("============================\n");
printf("Tanlov: ");
}
int is_account_created(void) {
if (strlen(account_name) == 0) {
printf("\nAvval akkaunt yarating!\n");
return 0;
}
return 1;
}
void create_account(void) {
if (strlen(account_name) > 0) {
printf("\nAkkaunt allaqachon yaratilgan: %s\n", account_name);
return;
}
printf("\nIsmingizni kiriting: ");
scanf("%99s", account_name);
printf("Boshlang'ich balans: ");
scanf("%lf", &balance);
if (balance < 0) {
printf("Manfiy balans bo'lmaydi. 0 ga belgilanadi.\n");
balance = 0;
}
add_transaction(balance);
printf("\n✓ Akkaunt yaratildi!\n");
printf("Ism: %s\n", account_name);
printf("Balans: %.2f\n", balance);
}
void show_balance(void) {
if (!is_account_created()) return;
printf("\n=== BALANS ===\n");
printf("Ism: %s\n", account_name);
printf("Balans: %.2f\n", balance);
}
void deposit(void) {
if (!is_account_created()) return;
double amount;
printf("\nQancha kiritmoqchisiz: ");
scanf("%lf", &amount);
if (amount < MIN_DEPOSIT) {
printf("Xato: minimum %.2f\n", MIN_DEPOSIT);
return;
}
balance += amount;
add_transaction(amount);
printf("\n✓ %.2f qo'shildi\n", amount);
printf("Yangi balans: %.2f\n", balance);
}
void withdraw(void) {
if (!is_account_created()) return;
double amount;
printf("\nQancha olmoqchisiz: ");
scanf("%lf", &amount);
if (amount <= 0) {
printf("Xato: musbat summa kiriting\n");
return;
}
if (amount > MAX_WITHDRAW) {
printf("Xato: bir martada maksimum %.2f\n", MAX_WITHDRAW);
return;
}
if (amount > balance) {
printf("Xato: balansda yetarli pul yo'q\n");
printf("Balans: %.2f\n", balance);
return;
}
balance -= amount;
add_transaction(-amount);
printf("\n✓ %.2f olib chiqildi\n", amount);
printf("Yangi balans: %.2f\n", balance);
}
void add_transaction(double amount) {
if (transaction_count < MAX_TRANSACTIONS) {
transaction_history[transaction_count++] = amount;
} else {
// Eskisini olib tashlash (shift)
for (int i = 0; i < MAX_TRANSACTIONS - 1; i++) {
transaction_history[i] = transaction_history[i + 1];
}
transaction_history[MAX_TRANSACTIONS - 1] = amount;
}
}
void show_history(void) {
if (!is_account_created()) return;
printf("\n=== TARIX (oxirgi %d) ===\n", MAX_TRANSACTIONS);
if (transaction_count == 0) {
printf("Tarix bo'sh\n");
return;
}
for (int i = 0; i < transaction_count; i++) {
if (transaction_history[i] > 0) {
printf("%d. +%.2f (kiritildi)\n", i + 1, transaction_history[i]);
} else if (transaction_history[i] < 0) {
printf("%d. %.2f (olindi)\n", i + 1, transaction_history[i]);
} else {
printf("%d. 0.00\n", i + 1);
}
}
}
void calculate_interest(void) {
if (!is_account_created()) return;
int years;
printf("\nNecha yil uchun: ");
scanf("%d", &years);
if (years <= 0) {
printf("Xato: yillar 1+ bo'lishi kerak\n");
return;
}
// Compound interest
double total = balance;
for (int i = 0; i < years; i++) {
total *= (1 + INTEREST_RATE);
}
double interest = total - balance;
printf("\n=== FOIZ HISOBI ===\n");
printf("Hozirgi balans: %.2f\n", balance);
printf("Foiz stavkasi: %.1f%%\n", INTEREST_RATE * 100);
printf("Davr: %d yil\n", years);
printf("Yakuniy summa: %.2f\n", total);
printf("Foydasi: %.2f\n", interest);
}5. Kompilyatsiya va ishga tushirish
$ gcc main.c -o bank
$ ./bank6. Loyiha tahlili
Qaysi tushunchalar ishlatildi?
| Tushuncha | Qayerda |
|---|---|
| Variables | balance, account_name |
| Constants | MAX_TRANSACTIONS, INTEREST_RATE |
| Arrays | transaction_history[] |
| Strings | account_name |
| Functions | 8 ta funksiya |
| Conditionals | if, if-else, switch |
| Loops | do-while (menu), for (foiz) |
| scanf/printf | Input/output |
| string.h | strlen |
| Validation | har funksiyada tekshirish |
Yaxshilash mumkin
- Struct ishlatish (5-oyda)
- Fayl saqlash (8-oyda)
- Bir nechta akkaunt (struct massivi)
- Parol himoyasi
- GUI (lekin terminal'da)
7. Muqobil loyihalar
Talaba boshqa loyiha tanlasa ham bo'ladi:
Loyiha 2: Kalkulyator (kengaytirilgan)
- Asosiy 4 amal
- Power, sqrt
- Trigonometric (sin, cos)
- Log (logarithm)
- Tarix
- History/memory tugmalariLoyiha 3: Talaba bazasi
- Talaba qo'shish (ism, yosh, ball)
- Ko'rish
- Tahrirlash
- O'chirish
- Saralash (ball bo'yicha)
- Qidirish (ism bo'yicha)
- StatistikaLoyiha 4: Quiz o'yini
- 10 ta savol
- Har savol uchun 4 ta variant
- Score hisoblash
- Yakuniy natija
- High score
- Qaytadan boshlashLoyiha 5: To-Do list
- Vazifa qo'shish
- Bajarilgan deb belgilash
- O'chirish
- Ko'rish
- Filtrlash (bajarilgan/bajarilmagan)Loyiha 6: Restoran menyusi va buyurtma
- Menyu ko'rsatish
- Buyurtma qo'shish
- Jami summa
- Chegirma
- Chek chiqarishLoyiha 7: Game — Hangman
- Random so'z tanlash
- Harf taxmin qilish
- ASCII art hangman
- Hayotlar soni
- Yutish/yutqazish8. Loyiha qoidalari
Yaxshi loyiha
- Funksiyalar — har vazifa alohida
- Comments — kerakli joylarda
- Validation — barcha foydalanuvchi inputlari
- Error handling — xato xabarlari
- README.md — qanday ishlatish
- Git — har bosqichda commit
- Test — har xil holatlarda sinash
9. README.md namuna
# Bank Boshqaruv Tizimi
C tilida yozilgan terminal-asoslangan bank ilovasi.
## Imkoniyatlari
- Akkaunt yaratish
- Balans ko'rish
- Pul kiritish (deposit)
- Pul olib chiqish (withdraw)
- Tranzaksiyalar tarixi
- Foiz hisoblash (compound interest)
## O'rnatish
\`\`\`bash
gcc main.c -o bank
./bank
\`\`\`
## Foydalanish
1. Birinchi navbatda **Akkaunt yarating** (menyu — 1)
2. **Balans ko'ring** (2)
3. **Pul kiriting** (3) yoki **oling** (4)
4. **Tarixni ko'ring** (5)
5. **Foiz hisoblang** (6) — necha yildan keyin balans
## Cheklovlar
- Minimum kirish: 1000
- Maksimum chiqish: 5,000,000
- Tarix: oxirgi 10 ta tranzaksiya
- Yillik foiz: 5%
## Texnologiyalar
- C (ANSI C99)
- gcc compiler
## Muallif
Akmal Karimov — Foundation 4-oy
## Litsenziya
MIT10. Loyiha topshirish
GitHub'ga yuklash
$ cd ~/c-darslari
$ mkdir bank-loyiha
$ cd bank-loyiha
$ # main.c va README.md yarating
$ git init
$ git add .
$ git commit -m "feat: initial bank app"
$ git remote add origin https://github.com/USERNAME/bank-loyiha.git
$ git push -u origin mainTalab qilinadigan
- GitHub repo — public, README bilan
- Kompilyatsiya — xato yo'q
- Funksionallik — barcha menu ishlaydi
- Validation — xato kiritishga to'g'ri reaksiya
- Code quality — funksiyalar bo'lingan, comment'lar bor
Darsdagi topshiriqlar
Topshiriq 1 — Loyihani tanlang
Yuqorida 7 ta loyiha bor. Birini tanlang YOKI o'zingizning g'oyangiz:
- Bank Boshqaruv Tizimi
- Kalkulyator (kengaytirilgan)
- Talaba bazasi
- Quiz o'yini
- To-Do list
- Restoran menyusi
- Hangman
- O'z g'oyangiz
Tanlovingizni daftarga yozing va nima qiladini 3 jumla bilan tushuntiring.
Topshiriq 2 — Reja
Loyiha uchun batafsil reja:
# Loyiha rejasi
## Maqsad
[1 paragraf]
## Imkoniyatlar (features)
1. ...
2. ...
3. ...
4. ...
5. ...
## Funksiyalar
- main()
- function_1() — vazifasi
- function_2() — vazifasi
- ...
## Constants
- MAX_X = ...
- MIN_Y = ...
## Variables (global)
- balance
- name
- ...
## Validation rules
- ...
## Menu tuzilmasi
1. ...
2. ...Drive'ga: reja.md
Topshiriq 3 — Boshlash
GitHub'da yangi repo: c-mini-loyiha
Local:
$ mkdir c-mini-loyiha
$ cd c-mini-loyiha
$ git init
$ touch main.c README.md .gitignore.gitignore:
*.o
*.out
bank # kompilyatsiya qilingan fayl
.DS_StoreREADME.md:
- Loyihaning qisqacha tavsifi
- Imkoniyatlari ro'yxati
- Kompilyatsiya buyrug'i
Initial commit:
$ git add .
$ git commit -m "feat: initial setup"Topshiriq 4 — Skeleton kod
Loyihangizning birinchi skeleton kodi:
#include <stdio.h>
// TODO: yana funksiyalar
void print_menu(void) {
printf("\n=== MENU ===\n");
printf("1. ...\n");
printf("2. ...\n");
printf("0. Chiqish\n");
printf("Tanlov: ");
}
int main(void) {
int choice;
printf("=== MENING LOYIHAM ===\n");
do {
print_menu();
scanf("%d", &choice);
switch (choice) {
case 1: printf("Hali yozilmagan\n"); break;
case 2: printf("Hali yozilmagan\n"); break;
case 0: printf("Xayr!\n"); break;
default: printf("Noma'lum\n");
}
} while (choice != 0);
return 0;
}Kompilyatsiya:
$ gcc main.c -o app
$ ./appCommit:
$ git add main.c
$ git commit -m "feat: add menu skeleton"
$ git pushTopshiriq 5 — Funksiyalarni qo'shing
Har bitta funksiyani alohida commit qiling:
# 1-funksiya
$ git add main.c
$ git commit -m "feat: add create_account function"
# 2-funksiya
$ git add main.c
$ git commit -m "feat: add deposit function"
# 3-funksiya
$ git add main.c
$ git commit -m "feat: add withdraw function"
...Kamida 5–7 commit.
Har commit'dan keyin push.
Topshiriq 6 — Validation qo'shing
Har funksiyaga input validation:
- Manfiy summa qabul qilmaslik
- 0 ga bo'lmaslik
- Bo'sh string qabul qilmaslik
- Limit'larni tekshirish
Commit:
$ git commit -m "fix: add input validation"Topshiriq 7 — README.md
README.md ni chiroyli to'ldiring (Markdown bilan):
# [Loyiha nomi]
Qisqacha tavsif.
## Imkoniyatlar
- ✓ Feature 1
- ✓ Feature 2
- ✓ Feature 3
## Ekran ko'rinishlari
\`\`\`
=== MENU ===
1. ...
\`\`\`
## O'rnatish
\`\`\`bash
gcc main.c -o app
./app
\`\`\`
## Foydalanish
[1-2 paragraf yo'l-yo'riq]
## Texnologiyalar
- C
- gcc
## Muallif
Ism Familiya — [@username](https://github.com/username)Commit:
$ git commit -m "docs: update README"
$ git pushTopshiriq 8 — Test qiling
Loyihangizni har xil holatlarda sinab ko'ring:
- To'g'ri input
- Manfiy raqam
- Nol
- Juda katta raqam
- Bo'sh string
- Maxsus belgilar
- Limitdan oshish
Har sinov natijasini daftarga yozing.
Bug topsangiz — tuzating va commit:
$ git commit -m "fix: handle negative input"Topshiriq 9 — Final loyiha
Final commit va GitHub'ga push:
$ git add .
$ git commit -m "docs: final version"
$ git pushGitHub'da:
- Repo Public bo'lsin
- README chiroyli ko'rinsin
- Kamida 7-10 commit bo'lsin
- Loyiha ishlasin
Link Drive'ga yoki email orqali o'qituvchiga.
Topshiriq 10 — Demo video (ixtiyoriy)
1-2 daqiqali demo video yozing (telefon yoki ekran yozish bilan):
- Loyihangizni tanishtiring
- Asosiy funksionallikni ko'rsating
- Eng qiyin qism qaysi edi?
Drive'ga yoki YouTube'ga (private/unlisted) yuklang.
Asosiy tushunchalar (lug'at)
| Termin | Qisqacha izoh |
|---|---|
| Mini project | Kichik to'liq loyiha |
| Skeleton | Bo'sh tuzilma, kelajakda to'ldiriladi |
| Validation | Input tekshirish |
| Error handling | Xatolar bilan ishlash |
| README.md | Loyiha hujjati |
| Compound interest | Murakkab foiz |
| Menu-driven | Menyu asoslangan dastur |
| Global state | Global o'zgaruvchilar |