Programare C ++ 13. - Cicluri

În cazul programării, în multe cazuri este necesar să repetați o activitate (instrucțiune) de mai multe ori. Acestea sunt, de asemenea, frecvente în viața reală.

cele două

  • Introduceți 5 rânduri goale în tabel.
  • Faceți 3 sandvișuri
  • Aruncă 3 zaruri (aruncăm o dată, dar tragem 3 numere)
  • Notează-l de 100 de ori pentru a nu-mi uita temele

Aceste activități repetate sunt aceleași în a cunoaște în prealabil de câte ori trebuie făcute. Desigur, se întâmplă, de asemenea, să faci ceva cât mai mult timp.

  • Curățați 2 kg de mere
  • Spală-l
  • Faceți cât mai multe sandvișuri până când rămâneți fără mezeluri

Aceste activități trebuie, de asemenea, repetate de mai multe ori, dar nu știu de câte ori. Pot exista mere mai mici, dintre care mai multe trebuie decojite, dar dacă sunt mai mari, 2 kg vor ieși din mai puține bucăți. Spăl vasele atâta timp cât există o oală. Fac sandvișurile atâta timp cât am ceva de pus.

Aceste principii se aplică și programării. În conformitate cu acestea, se pot distinge 3 tipuri diferite de cicluri:

Conform principiului de funcționare, primul este diferit de celelalte. În acest caz, știm în prealabil de câte ori dorim să ne repetăm ​​sarcinile, în timp ce în ultimele două cazuri numărul de repetări este condiționat. Acest lucru face ca imaginea să fie un pic mai nuanțată, deoarece Java este foarte flexibil cu buclele sale, dar principiile acestora.

Ciclul incremental

Să începem cu primul ciclu incremental. Acest tip de ciclu arată astfel:

Cuvântul cheie for introduce bucla. Apoi vine capul ciclului în care pot fi setate 3 lucruri:

  1. valoarea inițială a variabilei de ciclu care trebuie utilizată
  2. starea de alergare, adică când se începe o altă „tură”
  3. crește variabila ciclului

Lucrul frumos (sau pur și simplu urât, dar este o chestiune de punct de vedere) este că niciunul dintre aceste 3 lucruri nu este obligatoriu. Orice, sau chiar toate, pot fi omise, singura restricție fiind că cele 3 părți se separă; toate semnele trebuie păstrate:

Este adevărat, acest lucru inversează puțin sarcina și include o instrucțiune necunoscută până acum, dar vedem că este posibilă.

Ei bine, bucla for este, în mod implicit, utilizată pentru a incrementa o variabilă una câte una pentru a efectua o activitate atât timp cât condiția pe care o specificăm o permite. Acest lucru va fi mai ușor de înțeles prin exemple:

Numărați de la 1 la 50 și scrieți numerele pe ecran:

Dacă ne uităm la capul ciclului, putem vedea următoarele:

  1. variabila ciclului este pornită de la 1
  2. mergem până ajungem la 50
  3. variabila ciclului este incrementată unul câte unul

Desigur, aș fi putut scrie așa:

Trec de la 0 la 49, dar scriu întotdeauna un număr mai mare.

Desenați 10 numere aleatorii din intervalul [1; 50] și scrieți-le:

Capul de ciclu de mai sus este o sarcină de tip foarte puternică și puteți vedea o regulă de bază în acesta: Porniți i de la 0 și mergeți până când este mai mic decât numărul pe care doriți să îl rulați:

Scrieți 20 de numere pare începând de la 2:

Folosesc atât de multe trucuri aici încât număr de la 1 la 20 (de câte numere am nevoie), dar înmulțind acestea cu 2 obțin întotdeauna un număr par. Desigur, dacă mă uit la regulă când încep bucla de la 0 și mă opresc la limita-1, aș putea scrie în același mod:

Și dacă începeți de la 1 aveți nevoie de 20 de impari?

Scăderea 1 din perechi dă cele impare. Sau începând de la 0:

Dar doar pentru a vedea cât de flexibil este bucla for, să analizăm o altă soluție pentru cupluri:

Bine, am înșelat puțin. Știu că 40 va fi ultima, dar nu mă înmulțesc, dar acum măresc variabila ciclului cu 2 în loc de 1. Iată un exemplu bun al operatorului + =.
Într-un cuvânt ca o sută, ciclul for este un instrument flexibil și eficient dacă știi dinainte de câte ori vreau să fac ceva. Dar este deja clar de ce este atât de divers, pentru că pot oferi atâtea tipuri de soluții pentru aceeași problemă și fiecare rezolvă perfect sarcina. Există atât de multe nuanțe între ele, încât nu trebuie să le faceți deloc la nivel de liceu, ideea este: dați soluția corectă.

Ciclu de test frontal - în timp ce

Ciclul de testare front-end este de obicei utilizat atunci când nu știm în prealabil de câte ori trebuie efectuată activitatea repetitivă. Nu există nicio problemă dacă trebuie să trageți 10 numere dintr-un interval. Aceasta este o sarcină de tip corespunzătoare buclei for. Dar dacă sarcina este de a extrage 10 numere impare dintr-un interval dat? Apoi, dacă obțineți din greșeală un număr par, acesta ar trebui ignorat. Să vedem mai întâi forma generală a buclei while:

După cum puteți vedea, există și un antet de buclă aici care conține condiția de rulare. Din punct de vedere operațional, aceasta înseamnă că bucla rulează (execută nucleul buclei) atâta timp cât condiția este adevărată. Desigur, trebuie avut grijă să ne asigurăm că condiția este îndeplinită o dată sau să întrerupem cursa în nucleul buclei, astfel încât să nu intrăm într-o buclă infinită. Aceasta înseamnă că nu se poate opri niciodată, deoarece fie nu este oprită, fie starea de rulare nu poate fi niciodată falsă. Cel mai simplu ciclu aleatoriu:

Vedeți apoi exemplul anterior, trageți 10 numere impare dintr-un interval dat [1; 100]

Să aruncăm o privire la ceea ce face acest program:

  1. avem nevoie de o variabilă care să numere câte numere impare am extras pentru că nu ne ocupăm de duble
  2. Am declarat o variabilă numită numărul în care stocăm numărul extras în prezent
  3. condiția pentru rularea ciclului este de a desena până când există 10 numere impare
  4. în ciclu desenez un număr și îl păstrez
  5. după ce desenez, verific dacă este ciudat
  6. dacă este ciudat, tipăresc numărul loteriei și măresc contorul cu unul
  7. dacă nu este ciudat, atunci nimic din nucleul buclei nu este executat deoarece numărul este incorect și încearcă din nou o remiză

Iată un alt exemplu bun de ciclu de testare frontală. Calculați divizorul a două numere întregi. Nu, nu o rezolvăm prin descompunerea într-un factor prim, dar oferim o soluție bine programabilă care acoperă următorul algoritm, care există deja:
Cel mai mic dintre cele două numere trebuie scăzut din cel mai mare până când cele două numere sunt egale. Dacă cele două numere sunt egale, este cel mai mare divizor comun al numerelor originale. Este ușor de văzut cât de imprevizibil de câte ori trebuie efectuată respectiva scădere, deci nu putem folosi cu adevărat o buclă for. (ar putea fi, dar ar fi o soluție destul de înfășurată)

Acum, să vedem ce face acest program:

  1. declarăm 2 variabile pentru numerele examinate
  2. un ciclu cu condiția executării că scăderile trebuie repetate până când cele două numere sunt egale
  3. dacă numărul 1 este mai mare, scade numărul 2 din acesta
  4. invers, scade sam1 din sam2
  5. când bucla se termină, oricare dintre cele două numere (deoarece sunt egale) reprezintă cel mai mare divizor comun pe care îl scriem

Dacă observați, ciclul nu poate rula o singură dată. Ce se întâmplă dacă cele două numere sunt practic egale? Încă mai pot imprima oricare dintre ele, adică programul merge la linie după ciclu și tipărește unul dintre ele. Pentru ciclul de testare frontal, ciclul poate să nu funcționeze în niciun moment.

Ciclul de testare spate - faceți-vă

Bucla do-while este similară cu cea descrisă mai sus, deoarece acest tip de buclă este, de asemenea, utilizat atunci când nu știm în prealabil de câte ori ar trebui executată o secvență de instrucțiuni. Cu toate acestea, există o diferență importantă între cele două. Să vedem forma generală, va fi clar:

După cum sugerează și numele său, aici capul buclei este în partea din spate (împreună cu starea) și instrucțiunile din nucleul buclei sunt în față. Aceasta înseamnă că nucleul ciclului va funcționa oricum de 1 dată, deoarece acest ciclu se execută mai întâi, apoi verificați dacă este necesar de mai multe ori! Este de obicei folosit pentru sarcini în care odată ce trebuie să faci ceva, dar apoi trebuie să verifici dacă ceea ce ai primit este corect, pentru că dacă nu, fă-l din nou. Un exemplu este extragerea numerelor care este supusă unor condiții:

Desenați un număr par din intervalul [10; 50]. O rezolvăm pur și simplu prin tragere la sorți din intervalul dat, dar cu acea condiție suplimentară nu mai știm ce să facem ca să fie uniformă. Prin urmare, tragem pentru a obține un număr care îndeplinește condiția:

Să vedem programul în părți:

  • tragem un număr
  • dacă numărul împărțit la 2 nu dă restul 0 (impar), ciclul repornește, adică desenează unul din nou
  • ciclul se oprește când starea devine falsă (pare)

Bucla do-while este bună aici pentru că trebuie să desenez un număr pentru a vedea dacă trebuie să repet extragerea. Desigur, pot specifica și o condiție complexă. Să tragem un număr din intervalul dat care poate fi împărțit la 2 și 5:

Aici, ca condiție de rulare pentru buclă, puteți vedea o condiție complexă în rândul evidențiat, care poate să nu fie atât de clară pe cât apare prima dată. Ciclul funcționează dacă condiția este adevărată. Dar aici avem inițial două condiții parțiale, avem nevoie de un număr divizibil cu 2 și 5. Nu mai este bine să aveți sau să nu aveți ambele condiții false. Da, dar ca condiție de funcționare a ciclului, nu trebuie să ne dea numărul de care avem nevoie, ci exact opusul. Trebuie să specificați ce număr nu este bun pentru noi! Să o luăm pas cu pas:

  • editați condiția care ni se potrivește (care poate fi o condiție complexă)
  • negăm totul

Desigur, este adevărat și aici că, dacă dorim, putem simplifica starea complexă în modul în care am învățat deja:

Apoi ce ciclu să alegi?

Ce experiență alegem pentru a rezolva o sarcină pe termen lung ne va spune experiența noastră. Particularitatea programării, așa cum am menționat mai devreme, este că aceeași sarcină poate fi rezolvată corect în multe moduri diferite. Practic toate sarcinile pot fi rezolvate cu toate cele trei cicluri, uneori există diferențe cu adevărat nuanțate între ele. Totuși, punctul de bază este dat de:

  • Dacă știu de câte ori să rulez ciclul, este pentru ciclu.
  • Dacă nu știu de câte ori va rula bucla ȘI este posibil să nu fie nevoie să ruleze o dată, atunci bucla while.
  • Dacă nu știu de câte ori să rulez ciclul ȘI odată ce am absolut nevoie, atunci bucla do-while.

Să ne ținem de unul dintre exemplele anterioare în care căutam cel mai mare divizor comun. Dacă vă amintiți, scădeți cel mai mic din numărul mai mare până când cele două numere sunt egale. Ce ciclu trebuie utilizat pentru a rezolva?

  • Deoarece nu știm câte scăderi avem nevoie, așa că nu pentru cicluri.
  • Cele două numere pot fi la fel la început, nu trebuie să scădeți pe cel mai mare din cel mai mare, deci nu ar trebui să fie do-while (deoarece cel rulează necondiționat o dată).
  • Adică bucla while a rămas.

Dacă, să zicem, știu că un ciclu trebuie rulat de 10 ori pentru că trebuie extrase 10 numere, atunci renunțați la a fi un ciclu pentru, deoarece facilitează administrarea unui contor.

Din experiența mea, spun că poate bucla do-while este cea mai rară, iar bucla for este cea mai comună în programare. Bucla for este, de asemenea, utilizată mai des din cauza matricelor, veți vedea acest lucru într-o lecție ulterioară.

Următoarea lecție: Matrice

Parere, comentariu? Ieșiți din răspuns

Acest site folosește Akismet pentru a reduce spamul. Aflați cum să procesați datele de postare .