Sikllar — for, while, do-while

~20 daq · C tili · Asoslar

Sikl nima?

Tasavvur qiling: 100 ta son yig'indisini hisoblash kerak. Sicl bo'lmasa:

int yigindi = 0;
yigindi += 1;
yigindi += 2;
yigindi += 3;
// ... 100 qator!

Bu yomon. Sikl bilan:

int yigindi = 0;
for (int i = 1; i <= 100; i++) {
    yigindi += i;
}

Atigi 3 qator. Sikl — bir ishni belgilangan marta yoki shart bajarilguncha takrorlaydi.

C da uch xil sikl:

for      → necha marta takrorlanishini oldindan bilsak
while    → shart bajarilguncha (oldindan noma'lum)
do-while → kamida bir marta bajarilishi kerak bo'lsa

1. for sikli

Sintaksis

for (boshlang'ich; shart; qadam) {
    // tanasi
}

Uch qism nima qiladi?

for (int i = 0;   i < 5;   i++)
         │            │       │
         │            │       └── har iteratsiyada i ni 1 ga oshir
         │            └────────── i < 5 bo'lsa davom et
         └─────────────────────── i ni 0 dan boshlash (bir marta)

Vizual ishlash tartibi

┌─────────────────────────────────────────┐
│  1. boshlang'ich: int i = 0             │
│                                         │
│  2. shart: i < 5 → to'g'rimi?          │
│       ha → tanani bajar                 │
│       yo'q → sikldan chiq              │
│                                         │
│  3. qadam: i++                          │
│                                         │
│  4. 2-qadamga qayt                      │
└─────────────────────────────────────────┘

Oddiy misol

#include <stdio.h>

int main() {
    for (int i = 1; i <= 5; i++) {
        printf("%d-qadam\n", i);
    }
    printf("Sikl tugadi\n");
    return 0;
}

Natija:

1-qadam
2-qadam
3-qadam
4-qadam
5-qadam
Sikl tugadi

Teskari sanash

for (int i = 5; i >= 1; i--) {
    printf("%d...\n", i);
}
printf("Start!\n");

Natija:

5...
4...
3...
2...
1...
Start!

Ikki qadam

// Juft sonlar: 0, 2, 4, 6, 8, 10
for (int i = 0; i <= 10; i += 2) {
    printf("%d ", i);
}
printf("\n");

Natija:

0 2 4 6 8 10

2. while sikli

Sintaksis

while (shart) {
    // shart to'g'ri ekan davom et
}

for dan farqi

for   → necha marta — oldindan ma'lum
while → qachon to'xtash — shart bilan aniqlanadi

Vizual ishlash

┌──────────────────────────────┐
│  shart tekshiriladi          │
│       │                      │
│   ha ─┼──► tanani bajar      │
│       │         │            │
│      yo'q       └──► qaytib  │
│       │              shart   │
│       ▼          tekshiriladi│
│     chiq                     │
└──────────────────────────────┘

Misol — 1 dan N gacha yig'indi

#include <stdio.h>

int main() {
    int n, i = 1, yigindi = 0;

    printf("N ni kiriting: ");
    scanf("%d", &n);

    while (i <= n) {
        yigindi += i;
        i++;
    }

    printf("1 dan %d gacha yig'indi: %d\n", n, yigindi);
    return 0;
}

Natija (n = 100):

1 dan 100 gacha yig'indi: 5050

Misol — Raqam topish o'yini

#include <stdio.h>

int main() {
    int maxsus = 42;
    int taxmin;

    printf("1-100 orasidagi sonni toping!\n");

    printf("Taxminingiz: ");
    scanf("%d", &taxmin);

    while (taxmin != maxsus) {
        if (taxmin < maxsus)
            printf("Kattaroq!\n");
        else
            printf("Kichikroq!\n");

        printf("Taxminingiz: ");
        scanf("%d", &taxmin);
    }

    printf("To'g'ri! Son %d edi.\n", maxsus);
    return 0;
}

Ishlash:

1-100 orasidagi sonni toping!
Taxminingiz: 50
Kichikroq!
Taxminingiz: 25
Kattaroq!
Taxminingiz: 42
To'g'ri! Son 42 edi.

3. do-while sikli

Sintaksis

do {
    // tanasi
} while (shart);

while dan farqi

while    → avval shart, keyin tana (0 marta ham bo'lishi mumkin)
do-while → avval tana, keyin shart (kamida 1 marta)

Vizual ishlash

┌──────────────────────────────┐
│  tanani bajar  ◄─────────┐  │
│       │                  │  │
│  shart tekshiriladi      │  │
│       │                  │  │
│   ha ─┼──────────────────┘  │
│       │                     │
│      yo'q                   │
│       │                     │
│       ▼                     │
│     chiq                    │
└──────────────────────────────┘

Misol — Menyu

#include <stdio.h>

int main() {
    int tanlov;

    do {
        printf("\n=== MENYU ===\n");
        printf("1. Salom de\n");
        printf("2. Son yig'indisi\n");
        printf("0. Chiqish\n");
        printf("Tanlov: ");
        scanf("%d", &tanlov);

        switch (tanlov) {
            case 1:
                printf("Salom, Dunyo!\n");
                break;
            case 2:
                printf("1+2+...+10 = 55\n");
                break;
            case 0:
                printf("Xayr!\n");
                break;
            default:
                printf("Noto'g'ri tanlov!\n");
        }

    } while (tanlov != 0);

    return 0;
}

Ishlash:

=== MENYU ===
1. Salom de
2. Son yig'indisi
0. Chiqish
Tanlov: 1
Salom, Dunyo!

=== MENYU ===
...
Tanlov: 0
Xayr!

💡 Qoida: Menyu, parol tekshiruvi, kiritish validatsiyasi — do-while uchun ideal.


4. break va continue

break — sikldan chiqish

for (int i = 1; i <= 10; i++) {
    if (i == 5) break;      // 5 ga yetganda chiq
    printf("%d ", i);
}
// Natija: 1 2 3 4

continue — bu iteratsiyani o'tkazib yuborish

for (int i = 1; i <= 10; i++) {
    if (i % 2 == 0) continue;  // juftlarni o'tkazib yubor
    printf("%d ", i);
}
// Natija: 1 3 5 7 9

Farqi vizual

break:                    continue:
  i=1 → chiqar           i=1 → chiqar
  i=2 → chiqar           i=2 → o'tkazib yubor (juft)
  i=3 → chiqar           i=3 → chiqar
  i=4 → chiqar           i=4 → o'tkazib yubor (juft)
  i=5 → STOP!            i=5 → chiqar
  (6,7,8... bajarilmaydi) i=6 → o'tkazib yubor (juft)
                          ...

5. Ichma-ich sikllar — Nested loops

Sikl ichida sikl bo'lishi mumkin.

#include <stdio.h>

int main() {
    // Ko'paytirish jadvali
    for (int i = 1; i <= 5; i++) {
        for (int j = 1; j <= 5; j++) {
            printf("%4d", i * j);
        }
        printf("\n");
    }
    return 0;
}

Natija:

   1   2   3   4   5
   2   4   6   8  10
   3   6   9  12  15
   4   8  12  16  20
   5  10  15  20  25

Yulduzchalar chizish

for (int i = 1; i <= 5; i++) {
    for (int j = 1; j <= i; j++) {
        printf("* ");
    }
    printf("\n");
}

Natija:

*
* *
* * *
* * * *
* * * * *

6. Cheksiz sikl

Ba'zan qasddан cheksiz sikl kerak:

while (1) {
    // istalgancha davom et
    // faqat break bilan chiqish
}

for (;;) {
    // bu ham cheksiz
}

⚠️ Diqqat: Cheksiz sikldan chiqish uchun break yoki return bo'lishi shart. Aks holda dastur "muzlab" qoladi.


Qaysi siklni tanlash?

Necha marta — oldindan ma'lum?
  → for

Shart bajarilguncha, necha marta noma'lum?
  → while

Kamida bir marta bajarilishi kerak?
  → do-while

Menyu, parol, kiritish validatsiyasi?
  → do-while

Vazifalar


✏️ Vazifa 1 — N gacha yig'indi

Foydalanuvchidan N son oling. 1 dan N gacha barcha sonlar yig'indisini chiqaring.

Input Output
5 15
10 55
100 5050

Hint: yigindi += i


✏️ Vazifa 2 — Ko'paytma

Foydalanuvchidan N son oling. 1 dan N gacha barcha sonlar ko'paytmasini chiqaring. (Faktorial: N!)

Input Output
5 120
6 720
10 3628800

Hint: long long tur ishlating — katta sonlar uchun.


✏️ Vazifa 3 — Juft sonlar

Foydalanuvchidan N son oling. 1 dan N gacha barcha juft sonlarni chiqaring.

Input Output
10 2 4 6 8 10
7 2 4 6

Hint: i % 2 == 0 yoki i += 2


✏️ Vazifa 4 — Raqamlar yig'indisi

Foydalanuvchidan butun son oling. Uning raqamlari yig'indisini toping.

Input Output
1234 10
9999 36
305 8

✏️ Vazifa 5 — Eng katta bo'luvchi (EKUB)

Foydalanuvchidan ikkita son oling. Evklid algoritmida EKUB (GCD) ni toping.

Input Output
48 18 6
100 75 25
7 13 1

✏️ Vazifa 6 — Tub son tekshiruvi

Foydalanuvchidan son oling. Tub son ekanligini aniqlang. (Tub son — faqat 1 va o'ziga bo'linadigan son)

Input Output
7 Tub son
12 Tub emas
2 Tub son
1 Tub emas

✏️ Vazifa 7 — Sonni teskari chiqarish

Foydalanuvchidan butun son oling. Raqamlarini teskari tartibda chiqaring.

Input Output
1234 4321
1000 0001
789 987

Hint: son % 10 — oxirgi raqam, son /= 10 — kesib tashla.


✏️ Vazifa 8 — Fibonacci

Foydalanuvchidan N oling. Fibonacci ketma-ketligining N ta hadini chiqaring.

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...
Har had = oldingi ikki hadning yig'indisi
Input Output
7 0 1 1 2 3 5 8
10 0 1 1 2 3 5 8 13 21 34

✏️ Vazifa 9 — Paxta terish

Dam olish kuni talabalar paxta terimiga hasharga chiqishdi. N nafar qiz va M nafar yigit musobaqa o'ynashdi.

Har bir qiz o'rtacha k1 kg, har bir yigit k2 kg paxta terdi.

Hisoblang:

  • Umumiy paxta og'irligi S — tonnada
  • Har bir talaba tergan o'rtacha Q — kilogrammda
Input Output
N=20 M=15 k1=12 k2=10 S=0.39 tonna, Q=11.14 kg
N=10 M=10 k1=8 k2=8 S=0.16 tonna, Q=8.00 kg

Hint:

double jami_kg = (double)(N*k1 + M*k2);
double S = jami_kg / 1000.0;
double Q = jami_kg / (N + M);

✏️ Vazifa 10 — Mukofot

Yuqoridagi paxta masalasiga ko'ra, tadbirkor talabalarni mukofotlashga qaror qildi:

  • Qizlar ko'p tersa → har bir qizga 3 ta shokolad, aks holda 1 ta shokolad
  • Yigitlar g'alaba qozonsa → har bir yigitga 2 ta muzqaymoq, aks holda 1 ta muzqaymoq

Jami necha dona shokolad va muzqaymoq sotib olindi?

Input Output
N=20 M=15 k1=12 k2=10 60 ta shokolad, 15 ta muzqaymoq
N=10 M=10 k1=8 k2=10 10 ta shokolad, 20 ta muzqaymoq

✏️ Vazifa 11 — Uchburchak tekshiruvi

Foydalanuvchidan uch tomonni oling (a, b, c). Uchburchak hosil qila oladimi?

Qoida: har bir tomon qolgan ikki tomonning
yig'indisidan kichik bo'lishi kerak.
a < b+c  va  b < a+c  va  c < a+b
Input Output
3 4 5 Uchburchak bo'ladi
1 2 10 Uchburchak bo'lmaydi

✏️ Vazifa 12 — Yil fasli

Foydalanuvchidan oy raqamini oling (1-12). Qaysi fasl ekanligini chiqaring.

12, 1, 2  → Qish
3, 4, 5   → Bahor
6, 7, 8   → Yoz
9, 10, 11 → Kuz
Input Output
3 Bahor
7 Yoz
11 Kuz
1 Qish

✏️ Vazifa 13 — Sonni tasniflash

Foydalanuvchidan son oling. Bir vaqtda bir nechta xususiyatini chiqaring:

Kiriting: 12
Musbat:        ha
Juft:          ha
3 ga bo'linadi: ha
4 ga bo'linadi: ha
Input Musbat Juft 3 ga 4 ga
12 ha ha ha ha
-9 yo'q yo'q ha yo'q
7 ha yo'q yo'q yo'q

✏️ Vazifa 14 — Parol tekshiruvi

Foydalanuvchidan parol uzunligini (int) oling.

8 dan qisqa     → "Juda qisqa"
8 dan 12 gacha  → "Qabul qilindi"
12 dan uzun     → "Juda uzun"
Input Output
5 Juda qisqa
10 Qabul qilindi
20 Juda uzun

✏️ Vazifa 15 — Uch son tartibda

Foydalanuvchidan 3 ta son oling. Ular o'sish tartibida (a < b < c) joylashganmi?

Input Output
1 5 9 Tartibda
3 1 7 Tartibda emas
5 5 9 Tartibda emas

Hint: a < b && b < c


⭐ Qo'shimcha vazifalar


✏️ Vazifa 16 — Armstrong soni [qiyin]

N xonali son Armstrong soni hisoblanadi, agar har bir raqamining N-darajasining yig'indisi sonning o'ziga teng bo'lsa.

153 = 1³ + 5³ + 3³ = 1 + 125 + 27 = 153 ✓
370 = 3³ + 7³ + 0³ = 27 + 343 + 0 = 370 ✓

Foydalanuvchidan son oling. Armstrong sonmi?

Input Output
153 Armstrong soni
370 Armstrong soni
123 Armstrong soni emas

Hint: pow() o'rniga oddiy ko'paytirish ishlating.


✏️ Vazifa 17 — Sonlar orasidagi tub sonlar [qiyin]

Foydalanuvchidan a va b oling. a dan b gacha barcha tub sonlarni chiqaring.

Input Output
1 20 2 3 5 7 11 13 17 19
10 30 11 13 17 19 23 29

Hint: Har bir son uchun tub tekshiruvi — ichma-ich sikl.


✏️ Vazifa 18 — Raqamlar o'yini [qiyin]

Kompyuter 1-100 orasida maxfiy son tanlaydi (int maxfiy = 73).

Foydalanuvchi topgunicha urinadi:

  • Katta bo'lsa → "Kattaroq son kiring"
  • Kichik bo'lsa → "Kichikroq son kiring"
  • To'g'ri → "Barakalla! N ta urinishda topdingiz"
Urinishlar Output
50, 75, 60, 73 Barakalla! 4 ta urinishda topdingiz

Hint: do-while + urinishlar hisoblagichi.


✏️ Vazifa 19 — Ko'paytirish jadvali [qiyin]

Foydalanuvchidan N oling. N x N ko'paytirish jadvalini chiqaring.

Input Output
3 1 2 3 / 2 4 6 / 3 6 9
5 5x5 jadval

Hint: Ichma-ich for, %4d format ishlating.


✏️ Vazifa 20 — Raqamli piramida [yulduzcha]

Foydalanuvchidan N oling. Raqamli piramida chiqaring:

N = 5:
    1
   121
  12321
 1234321
123454321

Hint: Uch qism — bo'sh joy, o'sish, kamayish. Ichma-ich 3 ta sikl kerak.


Xulosa

Sikl Qachon Kalit farq
for Necha marta — ma'lum Boshlanish, shart, qadam
while Shart bo'yicha Avval shart
do-while Kamida 1 marta Avval tana
break Sikldan chiqish Butunlay to'xtaydi
continue Iteratsiyani o'tkazish Keyingisiga o'tadi

Keyingi dars

Sikllar bilan ko'p masalalarni yechdik. 1-bo'lim yakunida barcha bilimlarni mustahkamlovchi amaliy mashqlar.

10-dars: 1-bo'lim mashqlari va masalalar