İç-içə dövrlər

   Dövri alqoritmlərdə bir çox hallarda iç-içə dövrlərdən istifadə olunur. Dövrün içində dövr məntiqini anlamaq üçün iki misalı nəzərdən keçirəcəyik.

Vurma cədvəli

Aşağıdakı proqram vurma cədvəlini ekrana çıxarır:

print("Vurma Cədvəli\n")
for i in range(1, 11):
    for j in range(1,11):
        print(i,'*',j,'=',i*j)
    print()

   Proqram kodundan da gördüyünüz kimi burada iç-içə iki sayğaclı dövr operatorundan istifadə edilir. Əvvəlcə xarici dövr (i parametrli) öz işinə başlayaraq ilk səfər icra olunur. Bu zaman bu dövrün gövdəsində yer alan daxili dövr (j paremetrli) 10 dəfə icra olunaraq öz işini yekunlaşdırır. Daha sonra boş sətir buraxmaq üçün print() funksiyası işə düşür və bununla da xarici dövr özünün növbəti addımına keçir. Proses bu minval ilə davam edir və xarici dövrün 10-cu icrasından sonra yekunlaşır.

Bir rəqəmliyə qədər cəm

   Gəlin belə bir maraqlı proqram tərtib edək. Verilmiş natural ədədin rəqəmlərini cəmləyək, alınan cəmin rəqəmlərini də cəmləyək, və bu prosesi tək rəqəmli ədəd alınana qədər davam etdirək. Məsələ aydın olsun deyə aşağıdakı nümunəyə nəzər yetirin:

534981479385 → 5 + 3 + 4 + 9 + 8 + 1 + 4 + 7 + 9 + 3 + 8 + 5 = 66
66 → 6 + 6 = 12
12 → 1 + 2 = 3

   Məsələnin həlli üçün aşağıdakı proqramı tərtib edə bilərik:

n = int(input())
s = 0

while n>9:
    while n>0:
        s = s + n % 10
        n = n // 10
    n = s
    s = 0

print(n)

   Proqramı incələsəniz görəcəksiniz ki, biz burada iç-içə iki şərtli dövr operatorundan istifadə etmişik. Daxili dövrdə ədəd (n) rəqəmlərinə ayrılır və cəmlənir (s). Daha sonra cəm yenidən ədədə mənimsədilir və sıfırlanır. Xarici dövrdə isə şərt kimi alınan ədədin 9-dan böyük olması götürülür. Beləliklə dövri əməliyyat yekun ədəd bir rəqəmli alınanadək davam etdirilir.

  Əslində Python proqramlaşdırma dilinin hazır funksiyalarından istifadə etməklə verilmiş məsələni aşağıdakı alqoritmlə daha qısa yoldan da həll etmək olar:

n = int(input())
while n>9:
    n = sum(map(int, str(n)))
print(n)

   Təbii ki, bu halda iç-içə dövrlərin istifadəsinə ehtiyac qalmır və bir dövrlə kifayətlənmək mümkün olur.

Sonsuz dövrlər

   Bildiyiniz kimi əgər bir proqram daxilində müəyyən əməliyyatları ardıcıl şəkildə təkrarlamaq lazım gəlirsə, biz dövr operatorlarına müraciət edirik. Dövr operatorları icrası təkrarlanan eyni proqram fraqmentlərini dəfələrlə yazmaqdan bizi azad edir. 

   Python proqramlaşdırma dilində iki növ dövr operatoru nəzərdə tutulmuşdur. Əgər təkrarlanmaların sayı daha öncədən məlumdursa, sayğaclı dövr (for), məlum deyilsə, şərtli dövr (while) operatorundan istifadə olunur. Hər iki dövr operatorunun istifadə qaydasını daha əvvəlki dərslərimizdə nəzərdən keçirmişdik. Bu dərsimizdə isə Sizə proqramlaşdırmada bəzi hallarda istifadə olunan sonsuz dövrlərdən bəhs edəcəyik.

   Proqramlaşdırmada sonsuz dövr əmrlər ardıcıllığının sonsuz sayda icrası deməkdir. Bu o zaman baş verir ki, dövrün icra şərti hər zaman doğru olur. Belə olan halda dövrün icrası yalnız kənar müdaxiləylə  dayandırılır. Python dilində sonsuz dövrləri qurmaq üçün bir qayda olaraq şərtli dövr (while) operatorundan istifadə olunur. Sonsuz dövrlər qeyri-ixtiyari (bilmədən) və ixtiyari (məqsədli) şəkildə alınır. Birinci hal proqramçının diqqətsizliyi və səhvi (məntiqi xəta) nəticəsində baş verir, kompüterin yaddaş resursu və hesablama gücünün israfına, proqramın “donmasına” gətirib çıxarır.

   Aşağıdakı nümunəyə nəzər yetirək:

i = 1
while i < 10:
    print(i)

   Bu proqramda proqramçı dövrün gövdəsində i dəyişəninin qiymətini artırmağı (i = i + 1) unutduğu üçün dövrün şərti hər zaman ödənilir və nəticədə sonsuz dövr alınır.

Aşağıdakı digər nümunədə isə məqsədsiz şəkildə sonsuz sayda “Python” sətri ekrana çıxarılır:

while True:
    print("Python")

Sonsuz dövrləri ixtiyari olaraq (məqsədli şəkildə) tərtib etmək faydalı (bəzi hallarda isə zəruri) ola bilər. Bunun üçün çıxış şərtləri düzgün verilməli, məhsuldarlığın aşağı düşməsinə imkan verilməməli və dövrün məqsədsiz şəkildə sonsuz davam etməsinin qarşısı alınmalıdır. Sonsuz dövrlər oyunlarda, server proseslərində, hadisə əsaslı proqramlarda və s. geniş tətbiq edilir.

Aşağıdakı nümunədə sonsuz dövr alqoritmi məqsədyönlü və faydalı şəkildə istifadə olunur:

MAX_ATTEMPTS = 3

correct_password = "secret123"
attempts = 0

while True:
    password = input("Parolu daxil edin: ")
    attempts += 1

    if password == correct_password:
        print("Giriş uğurlu oldu!")
        break

    if attempts >= MAX_ATTEMPTS:
        print("Çoxlu uğursuz cəhd.")
        break
    else:
        print(f"Yanlış parol. {MAX_ATTEMPTS - attempts} cəhdiniz qaldı.")

Bu proqramda sonsuz dövr qurulur. Dövr daxilində istifadəçidən parolu daxil etməsi istənilir. Parol düzgün daxil edildikdə break operatoru vasitəsilə dövr dayandırılır. Parol 3 dəfə yanlış daxil edildikdə də dövrdən yenə break operatoru vasitəsilə çıxılır.