4-Amaliy ish Mavzu: Takrorlanuvchi tuzilmali algoritmlar va ularning dasturi Ishdan maqsad



Yüklə 151,36 Kb.
səhifə5/7
tarix05.11.2022
ölçüsü151,36 Kb.
#67527
1   2   3   4   5   6   7
Dasturlash. 4-amaliy ishi 46b78f5d79eff0b68db01199c725339f

Murakkab siklni sindirish.
Masala. To’g’ri burchakli uchburchakning barcha tomonlari uzunliklari natural sonlar. Uning gipatenuzasi c berilgan. Uning katetlarini topish lozim. To’gri burchakli uchburchak shartini qanoatlantiradigan istalgan javoblardan birini topish yetarli. (1≤c≤103).
Yechimi. c≤1000 bo’lganligi uchun uchburchak katetlari uzunliklari ham 1000 dan oshmaydi. Katetlarni mumkin bo’lgan barcha variantlarini tekshirib chiqish uchun a katetni i paramertli sikl sifatida qaraymiz, b katetni i sikl ichida j parametrli sikl sifatida to’g’ri burchakli uchburchak bo’lish shartini qanoatlantirilishini tekshirish lozim(i2+j2=c2):
#include
using namespace std;
int main() {
int c;
cout<<"c=";
cin>>c;
bool found = false;
int a = 0, b = 0;
for (int i = 1; i <= 1000; i++) {
for (int j = 1; j <= 1000; j++) {
if (i*i + j*j==c*c) {
a = i;
b = j;
found = true;
}
}
}
if (found)
cout< else
cout<<"Bunday sonlar yo'q";
}

Dastur yechimin tahlil qilib chiqamiz. c-gipotenuza uzunligini kiritamiz. found mantiqiy o’zgaruvchi e’lon qilamiz, bu o’zgaruvchida bunday gipotenuzali to’gri burchakli uchburchak mavjud yoki yo’qligi haqidagi mantiqiy ma’lumotni saqlaymiz. Dastlab bunday uchburchak mavjud emas deb tasavvur qilamiz(found = false). a katet sifatida i o’zgaruvchi bilan 1 dan 1000 gacha bo’lgan(1000 ning o’rniga c gacha tekshirish ham mumkin) iteratsiya qilamiz, bu sikl ichida b katet sifatida j o’zgaruvchi bilan iteratsiya aylantiramiz. Agar i, j va c sonlari to’g’ri burchakli uchburchak shartini qanoatlantirsa(if (i*i + j*j==c*c)) , u holda a katet sifatida i o’zgaruvchini, b katet sifatida j o’zgaruvchini qiymatlarini o’zlashtiramiz (a = i;b = j;) va topilganligi haqidagi ma’lumotni saqlaydigan mantiqiy o’zgaruvchiga rost qiymatini o’zlashtiramiz(found = true;).


Lekin bu ichma-ich sikl barcha variantlarni ko’rib chiqadi. Bizga faqat bitta variant kerak bo’lganligi sababli agar katetlar topilsa, siklni to’xtatishimiz foydaliroq bo’ladi. Siklni to’xtatish uchun quyidagicha yozish mumkin:
for (int i = 1; i <= 1000; i++) {
for (int j = 1; j <= 1000; j++) {
if (i*i + j*j==c*c) {
a = i;
b = j;
found = true;
break;
}
}
}

Bu shaklda siklni sindiradigan bo’lsak faqat ichki sikl sinadi, tashqi sikl keyingi iteratsiyadan davom qiladi. Siklni butunlay sindirish uchun har bir tashqi sikl iteratsiyasidan oldin tekshiramiz, agar javob topilgan bo’lsa u holda tashqi siklni sindiramiz.


for (int i = 1; i <= 1000; i++) {
if (found)
break;
for (int j = 1; j <= 1000; j++) {
if (i*i + j*j==c*c) {
a = i;
b = j;
found = true;
break;
}
}
}



Yüklə 151,36 Kb.

Dostları ilə paylaş:
1   2   3   4   5   6   7




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©azkurs.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin