7c: Kartojimai (ciklai)

Septinta pamoka yra suskirstyta į tris dalis: A, B ir C. Jas galite atlikte bet kokia tvarka.

Jau išmokome reikšmių priskyrimą/keitimą, nuskaitymą ir spausdinimą. Taip pat - sąlygos sąkinį („if“). Šioje pamokoje išmoksime, kaip naudoti kartojimo sakinius - ciklus (angliškai „loop“). Kartojimas, ko gero, yra pats naudingiausias programų elementas, nes leidžia greitai atlikti daug skaičiavimų - kas žmonėms užtruktų ir būtų laaabai nuobodu. Pavyzdžiui, apskaitos sistemose norint sužinoti pelną, reikia atlikti kartojimą, kuris susumuotų visus pardavimus. Arba, tikrinant teksto rašybą, reikia pakartoti tikrinimą kiekvienam teksto žodžiui. Šioje pamokoje išmoksime while ir for ciklus.
Panašiai, kaip metų cikle keičiasi pavasaris-vasara-ruduo-žiema (ir vėl pavasaris, ir t.t...), programos cikle nurodytiems veiksmams pasibaigus, jie vėl pradedami vykdyti iš naujo (bet jau su kitais duomenimis).

A. Ciklas „while

while“ sakinys kartoja veiksmus tol, kol sąlyga yra tenkinama (jos reikšmė yra True), pvz.:

while“ užrašymo detalės:

  • Pirmoje eilutėje yra antraštė while «sąlyga»: kur «sąlyga» gali būti įvertinta True arba False.
  • Toliau, atitrauktas veiksmų blokas, kurį mes norime kartoti.
  • Kaip ciklas veikia:
    • Jei sąlyga tenkinama, ciklo veiksmai vykdomi;
    • Kartojimo metu keičiasi kintamasis, pagal kurį tikrinama sąlyga;
    • Kai sąlyga tampa False, ciklas yra sustabdomas.

Taigi, aukščiau esančiame pavyzdyje, mes kartojame ciklo veiksmus kol timeLeft laikas buvo didesnis už 0.

Naudojant skaitliukus cikle yra svarbūs 3 dalykai:

  1. Startas (priskiriamas prieš pradedant ciklą) - pavyzdy buvo 5
  2. Finišas (nurodomas ciklo kartojimo sąlygoje) - pavyzdy buvo 0
  3. Žingsnis (daromas ciklo viduje - jei jį užmiršime, ciklas niekada nesibaigs!) - pavyzdy buvo -1

Programavimo pratimas: Didėjanti seka
Pakeiskite aukščiau esantį pavyzdį taip, kad vyktų skaičiavimas nuo 1 iki 10, o tada būtų atspausdinama Blastoff!
Žemiau galima įvesti duomenis programai (angl. "input")

Su ciklais lengva parašyti programą, kuri veiks be galo (naudotojui atrodys. kad kompiuteris pakibo).
Pavyzdys
Begalinis ciklas
Mes gauname klaidą "Time Limit Exceeded" (viršyta laiko riba), kadangi CS Circles serveris neleidžia programai tęstis ilgiau nei vieną sekundę. Po vienos sekundės programa yra sustabdoma. Paleidus programą namie, ji niekada nesustotų, nebent ją sustabdytumėte paspaudę Ctrl-C.



B. Ciklas „for

for“ ciklas yra skirtas duomenų sąrašo perrinkimui. Nuo „while“ jis skiriasi tuo, kad visada yra baigtinis - kartojama tiek, kiek sąraše yra elementų. Nurodytam kintamajam paeiliui priskiriamas kiekvienas sąrašo elementas.

Štai for ciklo pavyzdys.

Programavime dažnai reikia perrinkti skaičius iš eilės (kaip darėme „while“ cikle) - su for atrodytų taip:

Čia naudojama "range(..)" (angl. „intervalas“) funkcija, kuri generuoja skaičių seką pagal nurodytas ribas. Tik pabaigos riba naudojama neimtinai (paskutinis gautas skaičius buvo 14, o ne 15).

Bendra for ciklo su skaitliuku struktūra yra:

for «skaitliukas» in range(«pradžia», «pabaiga»):
   «cikle vykdomi veiksmai»
Pirmiausia skaitliukas gauna reikšmę pradžia. Po to, kartojama su reikšmėmis pradžia+1, pradžia+2, ir t.t. Kai galiausiai atliekami veiksmai su reikšme pabaiga-1, kartojimas sustoja.

For ciklą su skaitliuku atitiktų toks "while" ciklas:

«skaitliukas» = «pradžia»
while «skaitliukas» < «pabaiga»:      
   «cikle vykdomi veiksmai»
   «skaitliukas» = «skaitliukas» + 1     # skaitliukas padidinamas, atlikus veiksmus
Ar pamenate įdėtinį sąlygos sakinį - t.y., kai viename sąlygos sakiny yra dar vienas. Analogiškai gali būti ir su ciklais. Ciklas cikle (angl. „nested loop“) yra gan dažnai naudojamas rimtesnėse programose, pavyzdžiui, kai reikia perrinkti visus galimus kelius tarp keliolikos miestų. Štai for ciklo esančio kitame for cikle pavyzdys.

Pavyzdys: Ciklas cikle
Šis kodas atspausdina 5 x 5 lentelę, kurioe visi elementai yra “1”.
Svarbu: kai dauginame skaičių X iš dešimt ir pridedame vienetą, mes tiesiog pridedame 1 prie X pabaigos. Pavyzdžiui, (1867*10)+1=18671.

Kad geriau suprastumėte, kaip tai veikia, galite išbandyti "Veiksmų sekimą". Keičiant išorinio bei vidinio ciklo skaitliukų intervalus, galima gauti skirtingos formos "piešinį". Paeksperimentuokite, nes perprasti ciklą cikle būna nelengva.

Programavimo pratimas: Vienas trikampis
Pakeiskite programą, kad

    1. vietoje kvadrato gautųsi trikampis: ◤ - reikia, kad vidinio ciklo intervalas vis mažėtų (užuomina).
    2. vietoje 5 eilučių, programa turėtų piešti tiek, kiek įvesta (su input()) (užuomina). Tarkime, jei bus įvesta 3, turėtų gautis
      111
      11
      1

Žemiau galima įvesti duomenis programai (angl. "input")



C. break ir continue komandos

break reiškia veiksmų nutraukimą (analogiškai naudojamas ir bokse). Jį priėjusi, programa nutraukia ciklo vykdymą ir peršoka į komandą, esančią po ciklo. Šai break naudojimo pavyzdys: ši programa skaito įvesties eilutes kol randa parašyta "END".

Pavyzdys
Įvedamų eilučių perrinkimas iki spec. ženklo

Vienas ciklo veiksmų įvykdymo kartas dar vadinamas iteracija. continue komanda praleidžia likusius iteracijos veiksmus ir pradeda kitą iteraciją. continue prasmė angliškai būtų - „continue from next iteration“.

Pavyzdys

Štai pavyzdys, kuriame naudojamas ir break, ir continue. Ar galite nuspėti išvestį?

Pratimai

Programavimo pratimas: "Kvadratiniai" skaičiai
"Kvadratiniais" skaičiais vadinsime tokius, iš kurių galima ištraukti šaknį, pvz 9 yra "kvadratinis", nes 3 x 3 = 9. Parašykite programą, kuri iš įvesties perskaito skaičių n ir atspausdina visus teigiamus kvadratinius skaičius mažesnius nei n. Spausdinti reika po vieną į eilutę didėjimo tvarka. Pavyzdžiui, kai įvedama 15, turėtų gautis:

1
4
9
Užuomina
Žemiau galima įvesti duomenis programai (angl. "input")

Programavimo pratimas: Praleidžiame eilutes
Papildykite "Eilučių perrinkimo" pavyzdį (jį perkopijavome), taip, kad kiekviena eilutė, kuri yra lygi "SKIP", nebūtų spausdinama. Taip pat, ši eilutė turėtų nepadidinti skaitliuko (counter). Užuomina
Žemiau galima įvesti duomenis programai (angl. "input")

Programavimo pratimas: Skaidymas dauginamaisiais
Jei a × b = n, tai a ir b vadiname n dauginamaisiais. Šiame uždavinyje parašykite programą, kuri nuskaitys teigiamą skaičių n (int tipo) ir išves visas jo dauginamųjų poras; Rezultatų formatą žr. pavyzdyje:

1 times 10 equals 10
2 times 5 equals 10
5 times 2 equals 10
10 times 1 equals 10
Užuomina
Žemiau galima įvesti duomenis programai (angl. "input")