Ehtimol, sizda hali ham savollaringiz bor, shuning uchun bitta oddiy dasturni ko'rib chiqaylik.
Quyidagi dastur 1 dan N gacha bo'lgan sonlarning ko'paytmasini topadi (faktorial):
#include
Using namespace std;
int main () {
int n; // n o'zgaruvchisini yarating
cout << "N ="; // xabarni ko'rsatish cin >> n; // qiymatni o'qing
int res = 1; // res o'zgaruvchisini yarating
// unda biz sikl natijasini saqlaymiz
for (int i = 1; i <= n; i ++) // for tsikli
res * = i; // ilgari olingan qiymatni i ga ko'paytiring
cout << "RES =" << res << endl; // dastur natijasini ko'rsatish
qaytish 0;
}
Bu dasturning mumkin bo'lgan natijalaridan biri:
Endi kodni tahlil qilishni boshlaymiz:
6-qator: biz n o'zgaruvchisini yaratamiz. Kelajakda biz uni tsiklning holatida ishlatamiz.
10-qator: bizga tsikl natijasini saqlaydigan o'zgaruvchi kerak. Shuning uchun biz res o'zgaruvchisini yaratamiz.
11-qator: Endi biz for tsikliga o'tamiz. Keling, bu erda batafsilroq ko'rib chiqaylik:
i o'zgaruvchisi hisoblagich sifatida ishlatiladi. Biz darhol uni 1 ga qo'ydik (aslida ikkitadan boshlash mumkin edi, chunki 1 ga ko'paytirish mantiqiy emas);
siklning bajarilishi sharti bo'sh tengsizlikdir. i n dan kichik yoki teng bo'lganda sikl ishlaydi;
har bir iteratsiyadan so'ng biz hisoblagich qiymatini bittaga oshiramiz (ko'paytirish operatsiyasi). Bu quyidagi belgiga ekvivalent: i = i + 1.
14-qator: Dastur natijasini foydalanuvchi ekranida ko'rsatamiz.
Ushbu misol looplarning imkoniyatlarini aniq ko'rsatadi. Biroq, keling, for tsiklining moslashuvchanligini aniq ko'rsatadigan yana bir variantini ko'rib chiqaylik:
int a, b;
for (a = 140, b = 1742; a! = b;) {
if (a> b)
a - = b;
else
b - = a;
}
cout << a;
1
2
3
4
5
6
7
8
9
|
int a, b;
for (a = 140, b = 1742; a != b; ) {
if (a > b)
a -= b;
else
b -= a;
}
cout << a;
|
Ushbu dastur GCD ni topish algoritmini amalga oshirishdir. Keling, uning ishini tahlil qilmaylik, faqat ushbu kodning xususiyatlarini ko'rib chiqaylik:
bir vaqtning o'zida bir nechta o'zgaruvchilarni hisoblagich sifatida ko'rsatish mumkin. Shuningdek, ular to'g'ridan-to'g'ri blokning o'zida e'lon qilinishi shart emas;
bloklarning har biri (ulardan 3 tasi bor) butunlay yo'q bo'lishi mumkin. Mana cheksiz tsikl qanday ishlashiga yaxshi misol:
for (;;) {}
1
for (;;) {}
Ushbu kod foydalanuvchi dasturdan majburan chiqmaguncha bajariladi.
Ko'pincha siz for tsiklining faqat bitta variantidan foydalanishingiz kerak bo'ladi. Biroq, agar siz aniq vazifalarni bajarishingiz kerak bo'lsa, unda siz o'zingizning xohishingizga ko'ra for tsiklini nozik sozlashingiz mumkin.
Mumkin bo'lgan xatolar
Tsikl bir vaqtning o'zida ish uchun juda qulay vositadir, lekin ayni paytda u ko'plab yashirin tahdidlar bilan to'la. Tajribasiz koderlar xatoliklarga yo'l qo'yishi mumkin, chunki dastur muvaffaqiyatli kompilyatsiya qilinadi va ishlay boshlaydi.
Segfault
Ushbu xatoning sabablari ko'p. Siz bu haqda ko'proq Vikipediyada o'qishingiz mumkin. Looplar bilan ishlashda u quyidagicha paydo bo'lishi mumkin:
for (int i; i <10; i ++) {
}
1
2
3
for (int i; i <10; i ++) {
}
Bu yerda menga qiymat berilmaganini payqagandirsiz. Dastlab, o'zgaruvchida "axlat" mavjud (siz nima haqida gapirayotganimni tushunish uchun ekranda bunday axlatni ko'rsatishingiz mumkin). Tabiiyki, axlatga hech narsa qo'shib bo'lmaydi - dastur buziladi. O'zingiz yaratgan o'zgaruvchilarni har doim nolga tushirishni odat qilishga harakat qiling. Bu o'z dasturlaringizni yozishda sizni katta miqdordagi qiyinchiliklardan xalos qiladi. Ba'zi kompilyatorlar o'zgaruvchilar yaratilganda ularni nolga qo'yadi. Masalan, gcc kompilyatori buni amalga oshiradi.
Cheksiz tsikl
Ushbu xato ko'pincha noto'g'ri holat yoki tsikldagi hisoblagich qiymatining o'zgarishi tufayli yuzaga keladi.
Keling, oddiy misolni ko'rib chiqaylik:
1
2
3
|
for (int i = 0; i < 10; i++) {
r += --i;
}
|
Xulosa
Men bu mustaqil ishni bajarish davomida Bizning holatlarimizda u nolga tenglashtiriladi. Boshlashdan keyin nuqta-vergul qo'yiladi; ... Keyin shartni qo'yamiz: i <500 (demak, i 500 dan kichik bo'lsa, tsikl tanasidagi kod takrorlanadi) va yana nuqta-vergul; ... Aynan shu dasturga siklning tanasi qancha vaqt bajarilishini "aytib beradi" (jingalak qavslardagi kod {}). Nihoyat, biz tsiklning har bir bosqichida men qanday o'zgarishini ko'rsatamiz (bizda postfiks o'sishidan foydalanib, bittaga ko'payamiz). Qavslar ichida nima borligini bitta jumlada tasvirlab bersangiz, buyruq shunday eshitiladi - i o'zgaruvchisi besh yuzdan kam bo'lganda sikl tanasini bajaring, tsiklning har bir bosqichida i ni birdan oshiring. Loop qadami iteratsiya deb ham ataladi. Hisoblagich o'zgaruvchisi esa nazorat o'zgaruvchisidir, chunki u iteratsiyalar sonini boshqaradi. Keling, misolimizdan tsiklning bir necha bosqichlarini aniqlik uchun tahlil qilaylik. Siqnalning birinchi iteratsiyasida boshqaruv o'zgaruvchisi 0 ga teng. Shuning uchun birlikni ko'rsatish uchun i + 1 (0 + 1) ifodasidan foydalanamiz. Siklning tanasi bajarilganda boshqaruv o'zgaruvchisi i for operatoridan keyin qavs ichida () ko'rsatganimizdek o'zgartiriladi (ko'paytiriladi) - ya'ni bittaga teng bo'ladi. Ikkinchi iteratsiya shartni tekshirish bilan boshlanadi (bizda i <500). Agar i haqiqatdan <500 bo'lsa, tsikl tanasining bajarilishi takrorlanadi - ekranda yana i + 1 ko'rsatiladi, bu 1 + 1 ga ekvivalent, ya'ni 2. Boshqarish o'zgaruvchisi bo'lganda tsikl oxirgi marta bajariladi. 499 ga teng va ekranda i + 1 (499 + 1) qiymati ko'rsatiladi. Shundan so'ng uning qiymati yana bittaga ortadi, lekin siklni takrorlash sharti endi bajarilmaydi, chunki i (500) 500 dan kam emas. sikl tugagandan so'ng, dastur keyingi qatorni bajarishga o'tadi. halqa tanasining yopilish} jingalak qavsdan keyin joylashgan kod. Dasturni ishga tushirish orqali dastur natijasini o'zingiz ko'ring.
500>500>