„De îndată ce am început să programăm, am constatat, spre surprinderea noastră, că nu era atât de ușor să obținem programele corect pe cât ne-am gândit. Depanarea a trebuit să fie descoperită. Îmi amintesc exact momentul în care mi-am dat seama că o mare parte din viața mea de atunci urma să fie consumată pentru a găsi greșeli în propriile mele programe”. — Maurice Wilkes descoperind depanarea, 1949
Până acum, dacă te-ai încurcat cu programele, probabil ai descoperit că uneori programul face ceva ce nu ai vrut să facă. Acest lucru este destul de comun. Depanarea este procesul de a afla ce face computerul și apoi de a-l face să facă ceea ce dorești să facă. Acest lucru poate fi dificil. Odată am petrecut aproape o săptămână urmărind și reparând o eroare cauzată de cineva care a pus un x
acolo unde ar fi trebuit să fie un y
.
Acest capitol va fi mai abstract decât capitolele precedente.
Ce ar trebui să facă programul?
Primul lucru de făcut (sună evident) este să vă dați seama ce ar trebui să facă programul dacă rulează corect. Vino cu niște cazuri de testare și vezi ce se întâmplă. De exemplu, să presupunem că am un program pentru a calcula perimetrul unui dreptunghi (suma lungimii tuturor laturilor). Am următoarele cazuri de testare:
înălțimea | lățimea | perimetrul |
---|---|---|
3 | 4 | 14 |
2 | 3 | 10 |
4 | 4 | 16 |
2 | 2 | 8 |
5 | 1 | 12 |
Acum îmi rulez programul pe toate cazurile de testare și văd dacă programul face ceea ce mă aștept să facă. Dacă nu, atunci trebuie să aflu ce face computerul.
Mai frecvent, unele dintre cazurile de testare vor funcționa și altele nu. Dacă acesta este cazul, ar trebui să încercați și să vă dați seama ce au în comun cele care funcționează. De exemplu, aici este rezultatul unui program de perimetru (puteți vedea codul într-un minut):
Height: 3 Width: 4 perimeter = 15
Height: 2 Width: 3 perimeter = 11
Height: 4 Width: 4 perimeter = 16
Height: 2 Width: 2 perimeter = 8
Height: 5 Width: 1 perimeter = 8
Observați că nu a funcționat pentru primele două intrări, a funcționat pentru următoarele două și nu a funcționat pe ultima. Încercați să vă dați seama ce este în comun cu cele care funcționează. Odată ce aveți o idee despre care este problema, este mai ușor să găsiți cauza. Cu propriile programe, ar trebui să încercați mai multe cazuri de testare dacă aveți nevoie de ele.
Ce face programul?
Următorul lucru de făcut este să te uiți la codul sursă. Unul dintre cele mai importante lucruri de făcut în timpul programării este citirea codului sursă. Principala modalitate de a face acest lucru sunt explicațiile de cod.
O verificare a codului începe la prima linie și continuă până când programul este terminat. Buclele while
și instrucțiunile if
înseamnă că unele linii nu pot fi executate niciodată, iar unele linii sunt rulate de mai multe ori. La fiecare linie vă dați seama ce a făcut Python.
Să începem cu programul de perimetru simplu. Nu-l introduceți, îl veți citi, nu îl veți rula. Codul sursă este:
height = int(input("Height: "))
width = int(input("Width: "))
print("perimeter =", width + height + width + width)
Întrebare: Care este prima linie pe care o rulează Python?
- Răspuns: Prima linie este întotdeauna rulată prima. În acest caz este:
height = int(input("Height: "))
Ce face acea linie?
- Imprimă
Height:
, așteaptă ca utilizatorul să introducă un șir de caractere și apoi îl convertește într-o înălțime variabilă întreagă.
Care este următoarea linie care rulează?
- În general, următoarea linie de jos este:
width =
int(input("Width: "))
Ce face acea linie?
- Imprimă
Width:
, așteaptă ca utilizatorul să introducă un număr și pune ceea ce introduce utilizatorul în lățimea variabilă.
Care este următoarea linie care rulează?
- Când următoarea linie nu este indentată mai mult sau mai puțin decât linia curentă, este linia imediat după aceea, deci este:
print("perimeter = ", width
(De asemenea, poate rula o funcție în linia actuală, dar acesta este un capitol viitor.)
+ height + width + width)
Ce face acea linie?
- Mai întâi imprimă
perimeter =
, apoi imprimă suma valorilor conținute în variabile,width
șiheight
, dinwidth + height + width + width
.
width + height + width + width
calculează corect perimetrul?
- Să vedem, perimetrul unui dreptunghi este partea de jos (lățimea) plus partea stângă (înălțimea) plus partea de sus (lățimea) plus partea dreaptă (nu?). Ultimul item ar trebui să fie lungimea părții drepte sau înălțimea.
Înțelegi de ce perimetrul a fost calculat „corect” uneori ?
- A fost calculat corect când lățimea și înălțimea erau egale.
Următorul program pentru care vom face o prezentare a codului este un program care ar trebui să imprime 5 puncte pe ecran. Totuși, aceasta este ceea ce scoate programul:
. . . .
Și iată programul:
number = 5
while number > 1:
print(".",end=" ")
number = number - 1
print()
Acest program va fi mai complex de parcurs, deoarece are acum porțiuni indentate (sau structuri de control). Să începem.
Care este prima linie care urmează să fie rulată?
- Prima linie a fișierului:
number = 5
Ce face?
- Pune numărul 5 în numărul variabil.
Care este următoarea linie?
- Următoarea linie este:
while number > 1:
Ce face?
- Ei bine, declarațiile
while
în general se uită la expresiile lor și, dacă sunt adevărate, ele fac următorul bloc de cod indentat, altfel omit următorul bloc de cod indentat.
Deci ce face acum?
- Dacă
number > 1
este adevărat, vor fi rulate următoarele două linii.
Deci este number > 1
?
- Ultima valoare pusă în
number
a fost
și
5
, deci da.
5 > 1
Deci, care este următoarea linie?
- Deoarece
while
era adevărată, următoarea linie este:
print(".",end=" ")
Ce face acea linie?
- Imprimă un punct și, deoarece există argumentul suplimentar
end=" "
, următorul text tipărit nu va fi pe o altă linie de ecran.
Care este următoarea linie?
number = number - 1
, deoarece aceasta este următoarea linie și nu există modificări de indentare.
Ce face?
- Aceasta calculează
number - 1
, care este valoarea curentă a luinumber
(sau 5) scade 1 din el și face noua valoare a numărului. Deci, practic, schimbă valoarea luinumber
de la 5 la 4.
Care este următoarea linie?
- Ei bine, nivelul indentării scade, așa că trebuie să ne uităm la ce tip de structură de control este. Este o buclă
while
, așa că trebuie să ne întoarcem la clauzawhile
care estewhile number > 1:
Ce face?
- Se uită la valoarea numărului, care este 4, și o compară cu 1 și, deoarece
4 > 1
, buclawhile
continuă.
Care este următoarea linie?
- Deoarece bucla
while
a fost adevărată, următoarea linie este:print(".",end="
")
Ce face?
- Tipărește un al doilea punct pe linie, care se termină cu un spațiu.
Care este următoarea linie?
- Nicio modificare a indentării, așa că este:
number = number - 1
Și ce face?
- Ia valoarea curentă a numărului (4), scade 1 din ea, rezultând 3 și apoi face din 3 noua valoare a numărului.
Care este următoarea linie?
- Deoarece există o modificare a indentului cauzată de sfârșitul buclei
, următoarea linie este:
whilewhile number > 1:
Ce face?
- Compară valoarea curentă a numărului (3) cu 1.
3 > 1
, astfel încât buclawhile
continuă.
Care este următoarea linie?
- Deoarece condiția buclei
while
a fost adevărată, următoarea linie este:
print(".",end=" ")
Și ce face?
- Un al treilea punct este imprimat pe linie.
Care este următoarea linie?
- Este:
number = number - 1
Ce face?
- Ia valoarea curentă a numărului (3) scade din ea 1 și face din 2 noua valoare a numărului.
Care este următoarea linie?
- Înapoi la începutul buclei while:
while number > 1:
Ce face?
- Compară valoarea curentă a numărului (2) cu 1. Deoarece
2 > 1
, buclawhile
continuă.
Care este următoarea linie?
- Deoarece bucla
while
continuă:print(".",end=" ")
Ce face?
- Descoperă sensul vieții, universul și totul. Glumesc. (Trebuia să mă asigur că ești treaz.) Linia imprimă un al patrulea punct pe ecran.
Care este următoarea linie?
- Este:
number = number - 1
Ce face?
- Ia valoarea curentă a numărului (2) scade 1 și face din 1 noua valoare a numărului.
Care este următoarea linie?
- Înapoi la bucla while:
while number > 1:
Ce face linia?
- Compară valoarea curentă a numărului (1) cu 1. Deoarece
1 > 1
este fals (unul nu este mai mare decât unu), buclawhile
iese.
Care este următoarea linie?
- Deoarece condiția buclei
while
a fost falsă, următoarea linie este linia de după ieșirea bucleiwhile
sau:print()
Ce face acea linie?
- Face ecranul să treacă la următoarea linie.
De ce programul nu tipărește 5 puncte?
- Bucla scoate 1 punct prea devreme.
Cum putem remedia asta?
- Faceți ca bucla bucla să scoată 1 punct mai târziu.
Și cum facem asta?
Există mai multe moduri. O modalitate ar fi să schimbi bucla while
la: while number > 0:
O altă modalitate ar fi să schimbi condiționalul la: number >= 1
Mai sunt câteva.
Cum îmi repar programul?
Trebuie să îți dai seama ce face programul. Trebuie să îți dai seama ce ar trebui să facă programul. Află care este diferența dintre cele două. Depanarea este o abilitate care trebuie exersată pentru a fi învățată. Dacă nu îți poți da seama după o oră, ia o pauză, discută cu cineva despre problemă sau contemplă scamele din buric. Revino peste un timp și probabil vei avea idei noi despre problemă. Baftă!
Include texte din Wikibooks traduse și adaptate de Nicolae Sfetcu
Lasă un răspuns