DAGS LOIDS: Labi,parunāsim par cilpām.
Tieši tāpēc cilpas ir lieliskas, ka tās ļauj programmai izpildīt koda
rindas atkal un atkal un atkal.
Atkārtoti, bez nepieciešamības tās kopēt un ielīmēt vai citādi
atkārtot.
Ir trīs galvenie cilpu veidi.
Jums, iespējams, būs iespēja izmantot katru no tiem, pārejot uz CS50.
Dažas no šīm cilpām jums ir diezgan pazīstamas no Scratch valodas,
tāpēc, tāpat kā mēs to darījām ar nosacījumiem, mēs tās novietosim
blakus, ja ir kāda analoģija, kurai varam sekot.
Pirmā ir forever from Scratch, kas ir salīdzināms ar while (true).
To mēs saucam par bezgalīgu cilpu.
Koda rindas starp figūriekavām, kas ietilpst forever bloka C
iekšpusē, līdzīgi kā puzles gabaliņi, tiks izpildītas atkārtoti no
augšas uz leju, atkal un atkal un atkal, mūžīgi.
Galu galā, ja atceraties mūsu diskusiju par Būla izteiksmēm: patiess
vienmēr ir patiess.
Tātad, ja mēs darām kaut ko tik ilgi, kamēr patiess ir patiess — tas
šķiet nedaudz muļķīgi, jo patiess vienmēr ir patiess, tāpēc tas
vienmēr darbosies.
Tas darbosies mūžīgi mūžos, līdz mēs atradīsim veidu, kā izkļūt no
tā, izmantojot pārtraukuma priekšrakstu, ko atkal redzējām pirms
neilga laika, kad runājām par slēdžiem.
Vai pretējā gadījumā vienkārši nogaliniet mūsu programmu, kas starp
citu, ja kādreiz nonākat situācijā ar bezgalīgu cilpu un nezināt, kā
apturēt programmas darbību.
Vienkārši nospiediet Control un C, un tas iznīcinās jūsu programmu
jūsu vietā.
Bet atkal, to sauc par bezgalīgu cilpu.
Tā ir cilpa, kas darbosies mūžīgi.
Tagad, lai gan cilpas ne vienmēr ir bezgalīgas, jo arī mēs varam
aizstāt Būla izteiksmi ar kaut ko nedaudz noderīgāku, nekā tikai
vērtība patiess.
Tātad, šeit ir vēl viens piemērs.
While un dažas Būla izteiksmes, un tad figūriekavas.
Tas ir diezgan līdzīgi, lai to atkārtotu no nulles.
Lai gan pēc brīža es paskaidrošu atšķirību.
Tātad C valodā, ja Būla izteiksme while cilpā tiek novērtēta kā
patiesa, koda rindas starp figūriekavām tiks izpildītas atkārtoti
atkal un atkal, līdz Būla izteiksme tiek novērtēta kā nepatiesa.
Piemēram, jums varētu būt sava veida skaitītājs.
Tāpēc, piemēram, šīs cilpas sākumā jūs sakāt, ka int x ir vienāds ar
nulli.
Kamēr x ir mazāks par 100, veiciet dažas darbības figūriekavās, pēc
tam cilpas beigās sakot x plus plus, jūs palielināsiet x.
Galu galā x sasniegs 100, un jūs apstāsieties, jo nosacījums x ir
mazāks par 100 vairs nebūs patiess, kamēr x ir vienāds ar 100.
100 nav mazāks par 100.
Tagad nedaudz maldinoši: Scratch bloka darbība ir pretēja.
Tāpēc esiet ļoti uzmanīgi, ja šis ir jūsu pirmais mēģinājums izmantot
cilpas.
Būtībā Scratch valodā atkārtošana līdz blokam notiks atkal un atkal,
un atkal, līdz izteiksme, Būla izteiksme sešstūrī ir patiesa.
Tāpēc tas turpinās to darīt, līdz tā būs patiesa.
Tikmēr while cilpa turpinās to darīt, līdz tā būs nepatiesa.
Tātad tās ir diezgan līdzīgas, taču ir šī mazā atšķirība, no kuras
jāuzmanās, jo īpaši, veicot pirmo mēģinājumu pāriet uz Scratch C
valodā.
Nākamā veida cilpa patiesībā ir diezgan līdzīga.
To sauc par do while cilpu.
Šī cilpa vispirms izpildīs visas koda rindas figūriekavās un pēc tam
pārbaudīs Būla izteiksmi.
Ja Būla izteiksmes vērtība ir patiesa, tā atgriezīsies un atkārtos šo
procesu atkal un atkal, līdz Būla izteiksme tiks novērtēta kā
nepatiesa.
Tātad šī cilpa, atšķirībā no while cilpas, strādās vismaz vienu reizi.
Tas var būt diezgan noderīgi.
Visbeidzot, mums ir for cilpa.
For cilpas ir sintaktiski nepievilcīgas, un šeit notiek daudz, tāpēc
Vk esiet ar mani, kad mēģinām sadalīt šos gabalus.
Parasti for cilpas lietojums ir tāds - jūs vēlaties kaut ko atkārtot
noteiktu reižu skaitu.
Šajā piemērā man ir atkārtots Scratch bloks, kas ir analogs for
cilpai C valodā, atkārtojot kaut ko 10 reizes.
Kreisajā pusē ir for cilpa, kas ir 4 cilpa, kas darītu to pašu.
Tas notiks 10 reizes.
Skaitot no nulles, mēs palielinām katru cilpas gājienu.
Un mēs turpinām to darīt, līdz i ir mazāks par 10.
Tātad, kas notiek?
Tur ir ļoti daudz koda.
Apskatīsim, kas notiek soli pa solim, kamēr mēs urbjamies cauri for
cilpai.
Pirmā lieta, kas notika, ir - skaitītāja mainīgais centrs.
Tiek izpildīts viss, kas atrodas pa kreisi no pirmā semikola iekavās.
Šajā gadījumā mēs sakām, ka int i ir vienāds ar 0.
Jauna mainīgā ar nosaukumu i deklarēšana, tie mainīgie ir tipa vesels
skaitlis, un mēs sakām, ka šī mainīgā vērtība būs nulle.
Otra lieta, ko mēs darām, ir - nekavējoties novērtēt Būla izteiksmi.
Būla izteiksme atrodas divu semikolu vidū.
I ir mazāk par 10.
Šeit tā ir patiesa, vai ne?
Mēs tikko pateicām, ka i ir vienāds ar nulli, tāpēc 0 ir mazāks par
10, un tāpēc šis nosacījums ir patiess, un tagad mēs turpināsim
izpildīt cilpas pamattekstu.
Ja tas bija nepatiess.
Ja, piemēram, i ir vienāds ar 0 vietā, es teicu, ka i ir vienāds ar
15, int i ir vienāds ar 15.
Nu, 15 nav mazāks par 10, tāpēc mēs nekad neienāktu cilpas
pamattekstā, jo Būla izteiksme tur būtu novērtēta kā nepatiesa.
Pēc tam, kad mēs ejam cauri no augšas uz leju un saskaramies ar
fugūriekavu aizvēršanu, notiek trešā lieta.
Skaitītāja mainīgais tiek palielināts, vai drīzāk, - tiek izpildītas
priekšraksta koda rindas pēc otrā semikola for cilpas iekavās.
Tāpēc mēs sākam, sakot, ka int i ir vienāds ar 0.
Pēc tam mēs pārbaudām, vai Būla izteiksme ir patiesa.
0 ir mazāks par, 10, tāpēc tā ir patiesa.
Tātad, mēs turpināsim iedziļināties cilpas pamattekstā.
Cilpā notiks pārmaiņas, un, kad mēs saskaramies ar šo figūriekavu
aizvēršanu, nākamais, ko darām, ir - sakām i plus, plus.
I bija nulle, tagad i ir viens.
Pēc tam pa vidu mēs vēlreiz pārbaudām Būla izteiksmes vērtību.
Viens ir mazāks par 10.
Tad mēs veiksim šo procesu atkal un atkal.
Mēs atkal nonāksim pie figūriekavu aizvēršanas.
Mēs palielināsim i no 1 līdz 2 un no 2 līdz 3.
Un tā tālāk, un tā tālāk, un tā tālāk, līdz beidzot i vērtība kļūst
par 10.
Vai 10 ir mazāks par 10?
Nē.
Skaitot no 0, mēs esam izgājuši cauri 10 cilpas iterācijām.
Mēs esam atkārtojuši 10 reizes, tāpat kā Scratch blokā.
Un tas būtībā ir četru cilpu process.
Tagad noņemiet faktisko kodu un ievietojiet to tikai dažos vispārīgos
priekšrakstos.
Lūk, kas notiek.
Vispirms tiek izpildīti visi sākumā esošie priekšraksti.
Jums var būt vairāk nekā viens.
Pēc tam tiek pārbaudīta Būla izteiksme.
Ja izteiksmes vērtība ir patiesa, tad vienu reizi izpildiet cilpas
pamattekstu.
Ja izteiksme tiek novērtēta kā nepatiesa, tad mēs esam pabeiguši.
Mēs vispār neizpildām cilpas pamattekstu.
Pēc tam, kad vienu reizi esam izpildījuši cilpas pamattekstu, tad mēs
darām to, kas tur ir pieauguma daļā.
Kas parasti ir kaut kas līdzīgs i plus, plus vai kaut kam
tamlīdzīgam, kas modificē skaitītāja mainīgo.
Pēc tam, kad esam palielinājuši, mēs vēlreiz pārbaudām izteiksmi un
atkārtojam šīs darbības atkal un atkal, līdz izteiksme vairs nav
patiesa.
Tātad, kuros gadījumos tiek lietotas cilpas?
Izmantojiet while cilpu, ja vēlaties, lai cilpa atkārtojas nezināmu
reižu skaitu, taču, iespējams, tā nevarēs palaist visas.
Ļoti izplatīts piemērs, kad tiek izmantota while cilpa, ir palaist
spēles vadības plūsmu.
Jūs, iespējams, nezināt, cik ilgi lietotājs spēlēs, taču vēlaties
turpināt darīt to pašu.
Dažādu spraitu pozīciju atjaunināšana uz plates.
Jūs vēlaties, lai lietas vienmēr kustētos, taču jūs nezināt, kad
lietotājs beigs spēlēt vai, kad viņam beigsies dzīvības.
Tātad, while cilpa ir patiešām laba kaut kam tādam.
Tas ir labs lietošanas gadījums.
Ar do while cilpu ir diezgan līdzīgi.
Jūs vēlaties, lai cilpa atkārtojas nezināmu reižu skaitu, bet vismaz
vienu reizi.
Jūs varat to izmantot arī spēlē, taču ļoti izplatīts lietošanas
gadījums ir – mudināt lietotāju ievadīt datus.
Parasti jūs varētu teikt kaut ko līdzīgu: Dodiet man pozitīvu veselu
skaitli, un jūs varētu to ievietot do while cilpā.
Tāpēc tas vienmēr prasīs viņiem, vismaz vienu reizi, pozitīvu veselu
skaitli.
Ja tie sniedz pozitīvu veselu skaitli, jūs varētu izkļūt no cilpas.
Jūs varētu būt pabeidzis.
Būla izteiksme do while cilpā var būt nepatiesa.
Un jūs viņiem vairs nejautāsiet.
Ja viņi dod jums negatīvu skaitli, ierakstot vārdu vai kaut ko tādu,
kas jums nav īsti noderīgs, varat izmantot cilpu do while, lai
atgrieztos un atkārtotu to atkal un atkal.
Vienreiz jūs noteikti vēlaties palūgt, lai viņi jums iedotu skaitli,
bet jūs nezināt, cik reizes pēc tam tie varētu būt kaitēkļi.
Un tāpēc, do while - tas ir lielisks lietošanas gadījums, lai
mudinātu lietotāju ievadīt datus.
Un for loops lietošanas gadījums parasti ir tad, kad vēlaties
atkārtot cilpu noteiktu reižu skaitu, lai gan brīdī, kad programma ir
kompilēta, jūs, iespējams, nezināt, cik reizes.
Piemēram, varbūt jums ir programma, kurā lietotājam tiek prasīts
ievadīt skaitli.
Un viņi ievada 100.
Un tad jūsu for cilpa šajā gadījumā darbosies 100 reizes.
Vai varbūt viņi jūsu programmā ievada 1000 un pēc tam izpilda cilpu
1000 reižu.
Tas ir noteikts reižu skaits.
Viņi ne vienmēr zina, kāds bija šis skaitlis programmas sastādīšanas
brīdī.
Tas nav kā while cilpa, kurā tas varētu būt bezgalīgs.
Tas drīzāk ir skaitlis, kuru jūs vienkārši nezināt.
Tagad, lai gan esmu aprakstījis visus šos lietošanas gadījumus, jums
jāzina, ka gandrīz visos gadījumos varat savstarpēji mainīt visas
trīs šīs cilpas.
Varat izmantot for cilpu tur, kur citādi izmantotu while cilpu.
For cilpu varat izmantot visur, kur izmantotu do while cilpu un tā
tālāk.
Dažreiz tas var būt nedaudz sarežģīti, tāpēc parasti labi būtu
ievērot tipiskus lietošanas gadījumus.
Izmantojiet do while cilpu, ja kaut ko gribējāt vismaz vienu reizi.
Izmantojiet for cilpu, ja vēlaties kaut ko darīt noteiktu reižu
skaitu.
Galu galā, tāpēc ir trīs dažādu veidu cilpas.
Tāpēc tās var izmantot pareizajā kontekstā.
Bet jūs varat tās savstarpēji apmainīt, ja vēlaties.
Ja jūtaties ērti ar while cilpām un vienmēr vēlaties izmantot while
cilpas.
Tas ir kaut kas, ko varat darīt, lai gan tas varētu būt nedaudz
sintaktiski sarežģīti, te for cilpa būtu daudz vienkāršāka.
Mani sauc Dags Loids, un šis ir CS50.