Skip to content

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:

  1. Akkaunt yaratish
  2. Balans ko'rish
  3. Pul kiritish (deposit)
  4. Pul olib chiqish (withdraw)
  5. Tranzaksiyalar tarixi (oxirgi 10)
  6. Foiz hisoblash
  7. 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

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

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

6. Loyiha tahlili

Qaysi tushunchalar ishlatildi?

TushunchaQayerda
Variablesbalance, account_name
ConstantsMAX_TRANSACTIONS, INTEREST_RATE
Arraystransaction_history[]
Stringsaccount_name
Functions8 ta funksiya
Conditionalsif, if-else, switch
Loopsdo-while (menu), for (foiz)
scanf/printfInput/output
string.hstrlen
Validationhar funksiyada tekshirish

Yaxshilash mumkin

  1. Struct ishlatish (5-oyda)
  2. Fayl saqlash (8-oyda)
  3. Bir nechta akkaunt (struct massivi)
  4. Parol himoyasi
  5. GUI (lekin terminal'da)

7. Muqobil loyihalar

Talaba boshqa loyiha tanlasa ham bo'ladi:

Loyiha 2: Kalkulyator (kengaytirilgan)

c
- Asosiy 4 amal
- Power, sqrt
- Trigonometric (sin, cos)
- Log (logarithm)
- Tarix
- History/memory tugmalari

Loyiha 3: Talaba bazasi

c
- Talaba qo'shish (ism, yosh, ball)
- Ko'rish
- Tahrirlash
- O'chirish
- Saralash (ball bo'yicha)
- Qidirish (ism bo'yicha)
- Statistika

Loyiha 4: Quiz o'yini

c
- 10 ta savol
- Har savol uchun 4 ta variant
- Score hisoblash
- Yakuniy natija
- High score
- Qaytadan boshlash

Loyiha 5: To-Do list

c
- Vazifa qo'shish
- Bajarilgan deb belgilash
- O'chirish
- Ko'rish
- Filtrlash (bajarilgan/bajarilmagan)

Loyiha 6: Restoran menyusi va buyurtma

c
- Menyu ko'rsatish
- Buyurtma qo'shish
- Jami summa
- Chegirma
- Chek chiqarish

Loyiha 7: Game — Hangman

c
- Random so'z tanlash
- Harf taxmin qilish
- ASCII art hangman
- Hayotlar soni
- Yutish/yutqazish

8. Loyiha qoidalari

Yaxshi loyiha

  1. Funksiyalar — har vazifa alohida
  2. Comments — kerakli joylarda
  3. Validation — barcha foydalanuvchi inputlari
  4. Error handling — xato xabarlari
  5. README.md — qanday ishlatish
  6. Git — har bosqichda commit
  7. Test — har xil holatlarda sinash

9. README.md namuna

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

MIT

10. Loyiha topshirish

GitHub'ga yuklash

bash
$ 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 main

Talab qilinadigan

  1. GitHub repo — public, README bilan
  2. Kompilyatsiya — xato yo'q
  3. Funksionallik — barcha menu ishlaydi
  4. Validation — xato kiritishga to'g'ri reaksiya
  5. 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:

markdown
# 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:

bash
$ mkdir c-mini-loyiha
$ cd c-mini-loyiha
$ git init
$ touch main.c README.md .gitignore

.gitignore:

*.o
*.out
bank   # kompilyatsiya qilingan fayl
.DS_Store

README.md:

  • Loyihaning qisqacha tavsifi
  • Imkoniyatlari ro'yxati
  • Kompilyatsiya buyrug'i

Initial commit:

bash
$ git add .
$ git commit -m "feat: initial setup"

Topshiriq 4 — Skeleton kod

Loyihangizning birinchi skeleton kodi:

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

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

Commit:

bash
$ git add main.c
$ git commit -m "feat: add menu skeleton"
$ git push

Topshiriq 5 — Funksiyalarni qo'shing

Har bitta funksiyani alohida commit qiling:

bash
# 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:

bash
$ git commit -m "fix: add input validation"

Topshiriq 7 — README.md

README.md ni chiroyli to'ldiring (Markdown bilan):

markdown
# [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:

bash
$ git commit -m "docs: update README"
$ git push

Topshiriq 8 — Test qiling

Loyihangizni har xil holatlarda sinab ko'ring:

  1. To'g'ri input
  2. Manfiy raqam
  3. Nol
  4. Juda katta raqam
  5. Bo'sh string
  6. Maxsus belgilar
  7. Limitdan oshish

Har sinov natijasini daftarga yozing.

Bug topsangiz — tuzating va commit:

bash
$ git commit -m "fix: handle negative input"

Topshiriq 9 — Final loyiha

Final commit va GitHub'ga push:

bash
$ git add .
$ git commit -m "docs: final version"
$ git push

GitHub'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)

TerminQisqacha izoh
Mini projectKichik to'liq loyiha
SkeletonBo'sh tuzilma, kelajakda to'ldiriladi
ValidationInput tekshirish
Error handlingXatolar bilan ishlash
README.mdLoyiha hujjati
Compound interestMurakkab foiz
Menu-drivenMenyu asoslangan dastur
Global stateGlobal o'zgaruvchilar

Keyingi dars

12-dars: Oylik imtihon →

Master IT o'quv markazi — o'qitish rejasi