Zəncirli cib saatı

   Ələsgərin babasından yadigar zəncirli cib saatı var. Bu saat hər saatın tamamında saatın göstəricisinə uyğun olaraq zəng çalır. Məsələn, saat 5-də beş dəfə, saat 10-da on dəfə zəng çalır. Hər saatın yarısında isə 1 dəfə zəng çalır.

zencirli_cib_saati

   Bir təqvim günü içində başlanğıc və son vaxtı bilməklə bu zaman aralığında ümumi zənglərin sayını hesablayan proqram tərtib edin.

Giriş verilənlərinin formatı

  Tək sətirdə başlanğıc və son vaxt verilir. Vaxtlar boşluqla ayrılmış saat (h) və dəqiqə (m) (0H23, 0M59) formatında verilir.

Çıxış verilənlərinin formatı

   Zənglərin sayını tək sətirdə vermək lazımdır.

Nümunə
Giriş verilənləri Çıxış verilənləri

13 30 15 10

7

   Proqramı özünüz tərtib etməyə çalışın. Əgər alınmasa, aşağıdakı həll ilə tanış olun.

pocket_watch

Cəbiş müəllimin sabunları

   Uzunuzadı dilətutmalardan sonra xanımı Cəbiş müəllimi sabun bişirməyə razı sala bildi. Amma Cəbiş müəllim ortaya belə bir şərt qoydu. Sabunlar üç cür qablaşdırmada satılacaq. İçində 100 sabun olan paketin qiyməti 100 manat, 20 sabun olanın qiyməti 30 manat və 1 sabun isə manatdan satılacaq.

soap

   Sizcə n ədəd belə sabun almaq üçün ən azı nə qədər pul sərf etmək lazımdır?

Giriş verilənlərinin formatı

  Tək sətirdə sabunların sayı olan n ədədi ədədi verilir.

Çıxış verilənlərinin formatı

   Tələb olunan ən az məbləği tək sətirdə vermək lazımdır.

Nümunələr
Giriş verilənləri Çıxış verilənləri

25
123
77

40
136
100

   Proqramı özünüz tərtib etməyə çalışın. Əgər alınmasa, aşağıdakı həll ilə tanış olun.

cebis_muellim

Dəniz quldurları

   Bildiyiniz kimi orta əsrlərdə dəniz quldurları okean və dənizlərdə at oynadırdılar. Qarşılarına çıxan hər ticarət gəmisi içindəkilərlə bir yerdə onların qurbanlarına çevrilirdi. Amma törətdikləri cinayətlərinə rəğmən onlar öz aralarında çox ədalətli idilər. Eləcə də bir-birlərinə qarşı böyük-kiçik yeri bilirdilər.

pirates

   Gəlin dəniz quldurlarını daha yaxından tanımaq üçün onlara aid bir məsələni həll edək. Günlərin bir günü dəniz quldurları böyük bir xəzinə tapırlar. Qərara gəlirlər ki, zinət əşyalarını satıb gəminin ehtiyaclarını ödəsinlər, qızıl sikkələri isə öz aralarında bölüşdürsünlər.

   Gəmidə n sayda dəniz qulduru var, tapdıqları xəzinədə də m sayda qızıl sikkə var. Dəniz quldurları qızıl sikkələrin bölgüsünü öz quldur ranqlarına görə aparırlar. Belə ki, onlar dərəcələrinə uyğun olaraq sıraya düzülür və hərə öz payını alır. Bu zaman ən kiçik quldur a sikkə, hər sonrakı quldur özündən əvvəlki yoldaşından bir sikkə artıq götürür. Sonda isə kapitan öz payını götürür və ondan sonra sikkə qalmır. Kapitana hər zaman planlaşdırıldığından iki dəfə artıq sikkə çatır. Buna heç kim etiraz etmir, çünki qaydalara görə kapitanın belə bir imtiyazı vardır.

   Əgər am məlumdursa, kapitanla birlikdə gəmidə neçə quldur olduğunu tapmalısınız. Komandasız kapitan adi quldurdur, ona görə n > 1 olacaq.

Giriş verilənlərinin formatı

  Tək sətirdə iki natural am (1 ≤ a ≤ 100, m < 15150) ədədləri verilir. Bütün giriş verilənlərinin düzgünlüyünə zəmanət verilir.

Çıxış verilənlərinin formatı

   Quldurların sayı olan n ədədini tək sətirdə vermək lazımdır.

Nümunə
Giriş verilənləri Çıxış verilənləri

2 25

3

   Proqramı özünüz tərtib etməyə çalışın. Əgər alınmasa, aşağıdakı həll ilə tanış olun.

pirates_code

Mənbə: https://www.e-olymp.com

 

İç-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 kodlarını 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ı ilə bağlı Python ilə Proqramlaşdırma kitabına (səh. 76-89) müraciət edə bilərsiniz. 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övrlər o dövrlərdir ki, onlardan çıxmaq üçün verilmiş şərt heç zaman ödənmir. Python dilində sonsuz dövrləri qurmaq üçün bir qayda olaraq şərtli dövr (while) konstruksiyasından istifadə olunur. Bu zaman dövrün şərti heç vaxt False olmayacaq şəkildə təyin olunur. Bununla belə dövrün gövdəsində tələb olunan anda onun işini dayandırmaq məqsədilə break operatorundan da istifadə olunur.

while True:
    print("Python ilə proqramlaşdırmaq çox əyləncəlidir")
    print("Davam etmək üçün 1, proqramdan çıxmaq üçün 0 düyməsini basın")
    k=input()
    if k=="0":
        break
    elif k=="1":
        print("Siz daha yolun başlanğıcındasınız...")
    else:
        print("Siz seçiminizi etməmisiniz!")

   Yuxarıdakı proqramda şərtli dövr operatorundan istifadə edilmişdir. Burada dövrün şərti kimi True verildiyinə görə bu şərt hər zaman ödəniləcək. Dolayısıyla dövrümüz sonsuz alınacaq. Lakin buna rəğmən tələb olunan anda break operatorunu tətbiq etməklə dövrün işini dayandıra bilirik.

   Əgər proqramda istifadə olunan sonsuz dövrün gövdəsində onun icrasını dayandıracaq heç bir instruksiya verilmirsə, bu zaman dövr sonsuz sayda icra olunacaq. Məsələn aşağıdakı proqramda olduğu kimi:

i = 1
while True:
    print(i)
    i+=1

   Belə olan halda sonsuz dövrün icrasını dayandırmaq üçün Ctrl+C düymələrinə basmaq lazımdır.