8-bo‘lim
Sikllar
for, while va do-while sikllari, break va continue, ichma-ich sikllar, cheksiz sikl xavfi va sikl tanlash qoidalari.
Ushbu bo‘lim mundarijasi
Sikl - bir xil ishni bir necha marta takrorlash usuli. C da uch xil sikl bor.
for sikli #
#include <stdio.h>
int main(void) {
for (int i = 1; i <= 5; i++) {
printf("Aylanish %d\n", i);
}
printf("Sikl tugadi.\n");
return 0;
}
Aylanish 1
Aylanish 2
Aylanish 3
Aylanish 4
Aylanish 5
Sikl tugadi.
for (int i = ...) - C99 dan beriEski C89 da o'zgaruvchi sikldan oldin e'lon qilinishi kerak edi:
int i;
for (i = 0; i < 5; i++) { ... }
Zamonaviy C da sikl ichida e'lon qilgan ma'qul - o'zgaruvchi faqat
siklda yashaydi va tashqarida chalkashlik keltirmaydi. Buning uchun
-std=c17 (yoki -std=c99) bayrog'i kerak.
Turli qadamlar #
#include <stdio.h>
int main(void) {
printf("Teskari: ");
for (int i = 5; i >= 1; i--) {
printf("%d ", i);
}
printf("\n");
printf("Ikkitalab: ");
for (int i = 0; i <= 10; i += 2) {
printf("%d ", i);
}
printf("\n");
printf("Ikki barobar: ");
for (int i = 1; i <= 64; i *= 2) {
printf("%d ", i);
}
printf("\n");
return 0;
}
Teskari: 5 4 3 2 1
Ikkitalab: 0 2 4 6 8 10
Ikki barobar: 1 2 4 8 16 32 64
while sikli #
#include <stdio.h>
int main(void) {
int qoldiq = 100;
int kun = 0;
while (qoldiq > 0) {
qoldiq -= 30;
kun++;
printf("%d-kun: qoldiq %d\n", kun, qoldiq);
}
printf("Zaxira %d kunga yetdi.\n", kun);
return 0;
}
1-kun: qoldiq 70
2-kun: qoldiq 40
3-kun: qoldiq 10
4-kun: qoldiq -20
Zaxira 4 kunga yetdi.
do-while sikli #
#include <stdio.h>
int main(void) {
int son = 100;
/* while: shart yolg'on - tana umuman bajarilmaydi */
while (son < 10) {
printf("while ichida\n");
son++;
}
/* do-while: tana kamida bir marta bajariladi */
do {
printf("do-while ichida (son = %d)\n", son);
son++;
} while (son < 10);
return 0;
}
do-while ichida (son = 100)
do-while da nuqtali verguldo {
...
} while (shart); /* nuqtali vergul MAJBURIY */
while va for da esa aksincha - qavsdan keyin nuqtali vergul
qo'yilmaydi.
break va continue #
#include <stdio.h>
int main(void) {
printf("break bilan:\n");
for (int i = 1; i <= 10; i++) {
if (i == 5) {
break; /* siklni butunlay to'xtatadi */
}
printf("%d ", i);
}
printf("\n");
printf("continue bilan:\n");
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) {
continue; /* shu aylanishni o'tkazib yuboradi */
}
printf("%d ", i);
}
printf("\n");
return 0;
}
break bilan:
1 2 3 4
continue bilan:
1 3 5 7 9
break va continue farqi| Nima qiladi | |
|---|---|
break | Sikldan butunlay chiqadi |
continue | Joriy aylanishni tugatib, keyingisiga o'tadi |
for siklida continue qadam qismini (i++) bajaradi. Lekin
while da ehtiyot bo'ling:
int i = 0;
while (i < 10) {
if (i == 5) continue; /* CHEKSIZ SIKL: i oshmaydi! */
i++;
}
Ichma-ich sikllar #
#include <stdio.h>
int main(void) {
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= 5; j++) {
printf("%3d", i * j);
}
printf("\n");
}
return 0;
}
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
Uchburchak chizish #
#include <stdio.h>
int main(void) {
int balandlik = 5;
for (int qator = 1; qator <= balandlik; qator++) {
for (int bosh = 0; bosh < balandlik - qator; bosh++) {
printf(" ");
}
for (int yulduz = 0; yulduz < 2 * qator - 1; yulduz++) {
printf("*");
}
printf("\n");
}
return 0;
}
*
***
*****
*******
*********
break faqat bittasini to'xtatadifor (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (j == 1) break; /* faqat ichki siklni to'xtatadi */
}
/* tashqi sikl davom etadi */
}
Ikkalasidan chiqish uchun bayroq ishlating:
int topildi = 0;
for (int i = 0; i < 3 && !topildi; i++) {
for (int j = 0; j < 3; j++) {
if (shart) {
topildi = 1;
break;
}
}
}
Cheksiz sikl #
#include <stdio.h>
int main(void) {
int hisob = 0;
for (;;) { /* cheksiz sikl */
hisob++;
if (hisob >= 3) {
printf("Uch marta aylandi, chiqamiz.\n");
break;
}
printf("Aylanish %d\n", hisob);
}
return 0;
}
Aylanish 1
Aylanish 2
Uch marta aylandi, chiqamiz.
for (;;) va while (1) - ikkalasi ham cheksiz sikl. Ular menyu va
server dasturlarida ataylab ishlatiladi.
Eng ko'p uchraydigan sabablar:
/* 1. Hisoblagich oshmaydi */
int i = 0;
while (i < 10) {
printf("%d\n", i); /* i++ unutilgan */
}
/* 2. Shart hech qachon yolg'on bo'lmaydi */
for (unsigned int i = 10; i >= 0; i--) { ... }
/* 3. Nuqtali vergul sikl oxirida */
for (int i = 0; i < 10; i++); /* diqqat: ; */
{
printf("%d\n", i); /* siklga kirmaydi */
}
Dastur qotib qolsa, terminalda Ctrl+C bosing.
Qaysi siklni tanlash? #
| Holat | Sikl |
|---|---|
| Aylanishlar soni ma'lum | for |
| Massiv yoki oraliqni aylanish | for |
| Shart bo'yicha, soni noma'lum | while |
| Fayl oxirigacha o'qish | while |
| Kamida bir marta bajarilishi kerak | do-while |
| Menyu, foydalanuvchi kiritishi | do-while |
Amaliy misollar #
Yig'indi va o'rtacha #
#include <stdio.h>
int main(void) {
int baholar[] = {85, 92, 78, 95, 88};
int soni = 5;
int yigindi = 0;
for (int i = 0; i < soni; i++) {
yigindi += baholar[i];
}
printf("Yig'indi: %d\n", yigindi);
printf("O'rtacha: %.2f\n", (double) yigindi / soni);
return 0;
}
Yig'indi: 438
O'rtacha: 87.60
Faktorial #
#include <stdio.h>
int main(void) {
int n = 10;
long long faktorial = 1;
for (int i = 2; i <= n; i++) {
faktorial *= i;
}
printf("%d! = %lld\n", n, faktorial);
return 0;
}
10! = 3628800
Tub sonlarni topish #
#include <stdio.h>
int main(void) {
int chegara = 30;
printf("2 dan %d gacha tub sonlar:\n", chegara);
for (int son = 2; son <= chegara; son++) {
int tubmi = 1;
for (int bolvchi = 2; bolvchi * bolvchi <= son; bolvchi++) {
if (son % bolvchi == 0) {
tubmi = 0;
break;
}
}
if (tubmi) {
printf("%d ", son);
}
}
printf("\n");
return 0;
}
2 dan 30 gacha tub sonlar:
2 3 5 7 11 13 17 19 23 29
bolvchi * bolvchi <= son nima uchun?Sonning bo'luvchisini son gacha emas, faqat kvadrat ildizigacha
qidirish yetarli.
Sabab: agar son = a * b bo'lsa va a > √son bo'lsa, unda b < √son
bo'lishi shart - ya'ni kichikroq bo'luvchini biz allaqachon topgan
bo'lardik.
100 uchun 10 tagacha, 10000 uchun 100 tagacha tekshiramiz - bu tezlikni keskin oshiradi.
Sonlar yig'indisi #
#include <stdio.h>
int main(void) {
int son = 4729;
int asl = son;
int yigindi = 0;
while (son > 0) {
yigindi += son % 10; /* oxirgi raqamni olamiz */
son /= 10; /* oxirgi raqamni tashlaymiz */
}
printf("%d sonining raqamlari yig'indisi: %d\n", asl, yigindi);
return 0;
}
4729 sonining raqamlari yig'indisi: 22
- 1 dan 100 gacha sonlar yig'indisini hisoblang.
- 10 dan 1 gacha teskari sanang.
- Berilgan sonning ko'paytuv jadvalini chiqaring.
breakvacontinuefarqini o'z misolingizda ko'rsating.- To'g'ri to'rtburchak shaklida yulduzchalar chizing.
- Piramida shaklini chizing (yuqoridagi misol asosida).
- Sonning faktorialini hisoblang va 20! da nima bo'lishini kuzating.
- 100 gacha bo'lgan tub sonlarni toping.
- Sonni teskari aylantiring (1234 → 4321).
- Fibonachchi ketma-ketligining birinchi 15 hadini chiqaring.
Xulosa #
for- aylanishlar soni ma'lum bo'lganda.while- shart bo'yicha, soni noma'lum bo'lganda.do-while- tana kamida bir marta bajarilishi kerak bo'lganda.foruch qismdan iborat: boshlang'ich (bir marta), shart (har aylanishdan oldin), qadam (har aylanishdan keyin).breaksikldan chiqadi,continuekeyingi aylanishga o'tadi.whileichidacontinueishlatganda hisoblagichni oshirishni unutmang.- Ichma-ich siklda
breakfaqat bitta siklni to'xtatadi. for (;;)vawhile (1)- ataylab yaratilgan cheksiz sikl.- Sikl qavsidan keyin nuqtali vergul qo'ymang.
Keyingi bo'limda massivlarni o'rganamiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.