For parametrli va ichma-ich
joylashgan takrorlash operatori
Ma’ruza №9.
Maqsad
Quyidagi tushunchalar bilan tanishish:
• for operatori yordamida sikllarni tashkil etish;
• Uch xil ko’rinishdagi siklning o’xshash va farqli jihatlarini qarab
chiqish;
• Ichma ich sikllarni yozish;
• Sonli xatoliklarni kamaytirish texnikasini bilib olish;
• break va continue operatorlaridan foydalanish;
• Palindrom sonni aniqlash dasturini yozish;
• Tub sonni aniqlovchi dastur yozish.
for sikli
for sikli sikllarni yozishning ixchamlashgan sintaksisiga ega.
Biz shu paytgacha sikllarni quyidagicha yozib kelgan edik:
i=boshlangichQiymat;
while (i<oxirgiQiymat)
{
//sikl tanasi
…
i++; //siklni nazorat qiluvchi o’zgaruvchi
}
for sikli
for siklida yuqoridagi holatni sodda ko’rinishda yozish mumkin:
for (i=boshlangichQiymat; i<oxirgiQiymat; i++)
{
//sikl tanasi
…
}
for sikli blok-sxemasi
Boshlang’ich-qiymat
Sikldavomli
-sharti
Buyruq(lar)
(sikl tanasi)
Har-qadamdan-keyingiharakat
cout<<“C++ ga
xush kelibsiz\n”;
for sikli
Agar siklga oid buyruq bitta bo’lsa qavslarni tashlab yuborish mumkin.
Maslahat.
Siklda nazorat o’zgaruvchisi siklning nazorat qismida yoki undan oldin
e’lon qilinishi mumkin. Agar siklning nazorat o’zgaruvchisi(boshlang’ich
qiymati) faqat siklda qo’llaniladigan bo’lsa, uni for siklning boshlang’ich
qiymat qismida e’lon qilgan ma’qul. Agar boshlang’ich qiymat siklda
e’lon qilinsa, undan sikldan tashqarida foydalanib bo’lmaydi. Yuqoridagi
misolda i o’zgruvchisidan sikldan tashqarida foydalanib bo’lmaydi,
chunki u for siklining ichida e’lon qilingan.
Eslatma!
for siklida boshlang’ich qiymatni vergullar orqali ajratilgan bir necha
o’zgaruvchilar e’lon qilib berish ham mumkin:
Sikldan quyidagicha ham foydalanish mumkin:
Bu to’g’ri, ammo o’qish uchun qiyinchilik tug’diradi. Shuning uchun for
siklidan bunday ko’rinishda foydalanmagan ma’qul.
Eslatma!
Agar sikl sharti qolib ketsa, u cheksiz sikl ekanligini anglatadi.
Qaysi sikl operatoridan foydalanish kerak?
O’zingizga qulay bo’lgan while, do-while yoki for sikl
operatorlaridan foydalanishingiz mumkin.
Qaysi sikl operatoridan foydalanish kerak?
Umuman olganda, qaytarilishlar soni oldindan ma’lum bo’lgan hollarda
for sikli qo’llaniladi. Misol uchun biror xabarni 100 marta ekranga
chiqarish kerak bo’lgan hollarda. Takrorlanishlar soni aniq bo’lmagan
hollarda esa while siklidan foydalaniladi. Misol uchun 0 kiritilmaguncha
sonlarni kiritish. Sikl shartigacha sikl tanasi bajarilishi lozim bo’lgan
paytda while o’rniga do-while siklidan foydalangan ma’qul.
Umumiy xatoliklar
do-while da (;) qo’yish lozim!
Ichma-ich sikllar
Bir sikl boshqa bir siklning ichida bo’lishi mumkin.
Ichma-ich sikllar tashqi va bir necha ichki sikllardan iborat bo’ladi.
Tashqi sikl har safar takrorlanganda, ichki sikl to’liq takrorlanadi.
Quyida ko’paytirish jadvalini ichma-ich sikl yordamida chiqarish
dasturini qaraymiz:
Listing 5.8 KupaytirishJadvali.cpp
Natijasi
Eslatma!
Ichma-ich sikllar bajarilishi juda uzoq vaqt olishi mumkin. Quyidagi
holatni tekshirib ko’ring:
Bu yerda takrorlanish 1 trillion marta sodir bo’ladi. Agar bir harakatga 1
millisekund ketsa, u holda sikl to’liq bajarilishi uchun 277 soat vaqt
kerak bo’ladi.
Sonli xatolarni kamaytirish
Sikl shartida haqiqiy sonlardan foydalanish sonli xatoliklarga olib
kelishi mumkin.
Haqiqiy sonlar dasturda sonli xatoliklarni sodir qilish ehtimoli mavjud.
Quyidagi 5.9 listingda 0.01 dan boshlanuvchi va 1.0 da tugovchi, har
qadami 0.01 ga oshib boruvchi yig’indini aniqlash masalasi qaralgan.
Quyidagicha: 0.01+0.02+0.03+…
Listing 5.9 TestSum.cpp
Natija
Natija 49.5 bo’ldi, ammo 50.5 chiqishi lozim edi. Qanday sodir
bo’ldi? Har bir takrorlanishda i 0.01 ga ortib boraverdi. Sikl
tugayotganda i ning qiymati 1 dan kata bo’ldi (aynan 1 ga teng
emas). Shuning uchun i qiymat sum ga qo’shilmadi.
Bu muammo qanday yechiladi?
Buni quyidagicha amalga oshirish mumkin:
double joriyQiymat = 0.01;
for (int count = 0; count < 100; count++)
{
sum += joriyQiymat;
joriyQiymat += 0.01;
}
Muammoning yechimi
Natija
break operatori
Natijasi
continue operatori
Natija