marți, 11 mai 2010

Aplicaţii în fizică şi geometrie

Etapele rezolvării unei probleme cu ajutorul calculatorului:

  • Definirea problemei: este etapa când se urmăreşte înţelegerea problemei şi stabilirea datelor care se cunosc şi care se cer, ipoteza şi concluzia.
  • Elaborarea programului în Pascal: se indentifică variabilele, li se dă un nume fiecăreia, se specifică tipul lor şi se stabilesc care sunt variabilele de intrare şi variabilele de ieşire. Se elaborează programul, care constă dintr-o succesiune de instrucţiuni şi operaţii finite care să conducă la aflarea datelor care nu se cunosc şi se cer aflate, succesiune numită şi algoritm.
  • Compilarea şi rularea programului: etapă în care se corectează eventualele erori (de sintaxă sau logice) apărute, iar la final se obţine rezultatul corect al problemei.






Întotdeuna se porneşte de la rezolvarea matematică sau fizică a problemei. De la geometrie ştim că în orice triunghi măsura unhiurilor este egală cu 1800, adică scris matematic: A + B + C = 1800.

Observăm că în toate din cele trei exemple datele noaste de intrare sunt măsurile unghiurilor A şi B care se cunosc iniţial, iar concluzia reprezintă măsura unghiului C, care trebuie aflată.

Formula de calcul a unghiului C valabilă pentru orice triunghi este deci:

C = 1800 - A - B.

Putem trece la elaborarea programului Pascal:

Vom defini trei variabile, câte una pentru fiecare unghi şi denumite la fel ca şi unghiurile triunghiului, dar notate cu litere mici, pentru nu se confunda unghiul A cu variabila a, corespunzătoare lui. Variabile sunt de tipul integer (presupunând că măsurile unghiurilor sunt valori întregi, fără zecimale). Numărul 180 este o constantă, el nu trebuie nici definit, nici citit de la tastatură, el face parte din formulă şi atât.

program unghiuri;
VAR a, b, c: integer;
begin
write(‘Introduceti masura primului unghi=’);
readln(a); {prima variabila isi primeste valoarea}
write(‘Introduceti masura celui de al doilea unghi=’);
readln(b); {a 2-a variabila isi primeste valoarea}
c:=180–a–b; {a 3-a variabila isi primeste valoarea}
writeln(‘Masura unghiului cerut este= ‘,c);
end.

Conţinutul a doua din aceste variabile (a şi b) se cunoaşte dinainte, deci va fi introdus de la tastatură prin operaţia de citire readln, ele se numesc variabile de intrare. În schimb conţinutul variabilei c nu se cunoaşte, el fiind cel care reprezintă defapt soluţia problemei şi se numeşte variabilă de ieşire.

Dar variabilei c i se poate atribui o valoare aflată prin calcul, pe baza formulei cunoscută din geometrie. Deci în rândul c:= 180 – a – b; avem o operaţie de atribuire şi anume variabilei c i se va atribui o valoare rezultată din efectuarea calculului aritmetic pe baza fomulei descrisă. Mai precis din 180 se scad valorile conţinute de variabilele a şi b în momentul respectiv.

Cu riscul de a vă plictisi, vreau să rezum cele spuse de mai sus în următorul tabel:


Mărimi matematice

Variabile corespunzătoare în program

Se cunosc, se dă:

A şi B

a respectiv b

Se cere:

C

c

Pentru a rezolva toate cele trei triunghiuri, programul va trebui rulat tot de trei ori, de fiecare dată pentru câte un triunghi. Observăm că programul nu se modifică cu nimic, variabilele rămân aceleaşi (numele lor adică), numărul şi tipul lor la fel, ceea ce se schimbă la fiecare execuţie a programului este doar valoarea conţinută de variabilele programului.

Dacă luăm ca exemplu primul triunghi, vom avea a=60 şi b=60 de unde va rezulta prin calcul c=60, în al 2-lea triunghi vom avea a=80 şi b=70 iar valoare lui c va rezulta 30.

Şi aşa mai departe, dacă se cunosc măsurile a două unghiuri dintr-un triunghi, programul poate calcula măsura celui de al treilea unghi pe baza formulei cunoscută din geometrie, lucru valabil pentru orice triunghi existent, adică pentru o infinitate de triunghiuri.

Elevii sunt invitaţi să rezolve cu ajutorul acestui program şi alte probleme din manuaul de matematică de clasa a VI-a, sau culegeri.

Acesta este avantajul informaticii şi anume că se scrie programul o singură dată, pentru o clasă de probleme, urmând ca după aceea cu ajutorul acelui program, să se poată rezolva toate problemele de acel gen.



Problema 2: Să se calculeze aria unui triunghi, când se cunosc baza şi înălţimea sa.

problema2

În toate cele trei triunghiuri se cunosc lungimea bazei BC şi înălţimea AA1. Acestea reprezintă datele ce se dau, ipoteza şi sunt notate la fel în toate cele trei triunghiuri doar valoarea lor diferă de la un triunghi la altul. Concluzia o reprezintă aria fiecărui triunghi notată cu A (de mână), notată deasemenea la fel în toate cele trei triunghiuri, doar valoarea ei va diferi de la un triunghi la altul.

În etapa scrierii programului observăm că pentru a scrie programul Pascal avem nevoie să definim trei variabile, tot atâtea câte mărimi sunt prezente în formula de mai sus şi notate la fel ca şi datele problemei noastre: BC, AA1 şi A.

De ce tip vor fi aceste variabile? Ne uităm la unităţiile de măsură exprimate în acest caz în centimetrii. În problema anterioară era vorba de grade. Lăsând la o parte unităţiile de măsură, observăm că datele noastre reprezintă defapt nişte numere şi atât. Deci variabilele noastre vor fi de tip numeric, mai precis integer sau real. Asta pentru că dacă luăm ca exemplu o adunare 40 + 60 va da întodeuna ca şi rezultat 100, indiferent ca aceştia reprezintă grade, centimetri, litri, metri, sau orice altceva, iar limbajul Pascal nu ţine cont de unităţiile de măsură.

Vom avea deci variabila BC ce va reprezenta baza triunghiurilor noastre, ea va conţine valorile bazelor triunghiurilor, iar dacă vom lua ca exemplu datele din primul triunghi, variabila BC va primi valoarea de 25. Faptul că aceştia sunt centimetrii nu mai interesează programului nostru, programul îi va considera un simplu număr. Analog şi pentru celelalte două variabile AA1 şi A, valorile ce le vor conţine vor fi privite ca simple numere.

Observăm deci că:


Mărimi matematice

Variabile corespunzătoare în program

Se cunosc, se dă:

BC şi AA1

BC respectiv AA1

Se cere:

A

A

Programul poate arata în felul următor:

program arii; {program pt calculul ariei
oricarui triunghi}
VAR BC, AA1, A: real;
begin
write (‘Introduceti baza triunghiului=’);
readln (BC);
write (‘Introduceti inaltimea triunghiului=’);
readln (AA1);
A:=(BC+AA1)/2;
writeln (‘Aria triunghiului este=‘,A:6:2);
end.

Aşa cum formula din geometrie este valabilă pentru calculul ariei oricărui triunghi (o infinitate) şi programul nostru poate calcula aria oricărui triunghi, dacă se cunosc şi se introduc valorile corespunzătoare bazei triunghiului şi a înălţimii acestuia.

Folosind manualul de matematică sau culegeri, se pot da mai multe exemple de triunghiuri în care se cunoaşte lungimea bazei şi a înălţimii pentru a exersa calculul ariei, utilizând programul arii.

Variabile - date generale

Să ne gândim că vindem un program unui client care nu ştie deloc Pascal, ce s-ar întâmpla de fiecare dată când el ar dori modificarea rezultatului programului? Ar trebui să ne cheme pe noi ca să intervenim în structura programului. Din această cauză în orice program sunt folosite variabilele. Ele pot stoca datele noastre de intrare şi ieşire, fără a fi necesară modificarea programului de către programator. Astfel toate programele fiind scrise nu pentru a rezolva o situaţie particulară sau o singură problemă, ci o familie de probleme care se bazează pe aceeaşi metodă sau formulă de rezolvare.

Variabilele - mărimi care îşi pot schimba conţinutul o dată sau de mai multe ori pe parcursul execuţiei unui program. Avem în principal patru tipuri de variabile:

integer, real - numerice;

char, string - pentru caractere;

Variabilele integer - sunt folosite pentru memorarea numerelor întregi.

Exemple de nr întregi: 0; 1; 20; -5; 100; -186;

Atentie Se pot memora numere cuprinse doar în intervalul [-32768; 32767]. Dacă vom avea nevoie să lucrăm cu numere mai mari, va trebui să folosim variabile de tip real.

Variabilele real - sunt folosite pentru memorarea numerelor reale.

Exemple de nr reale: 1.55; 2.8; -15.82; 3.14; 289.7435;

Atentie În Pascal, ca de altfel în notaţia americană, numerele zecimale nu se scriu cu virgulă ci cu punct. 1,55 = 1.55

Variabilele char - sunt folosite pentru memorarea unui singur caracter. Ca şi caractere avem toate caracterele (literele) alfabetului, cele 10 cifre, precum şi semnele de punctuaţie. Spaţiul dintre cuvinte este şi el considerat caracter. Acest tip de variabile memorează întotdeauna doar unul din aceste caractere şi le veţi folosi foarte des în programe mai complexe, dar care depăşesc programa clasei a VI-a.

Caracterele: A, B, C, … Z, a, b, c, … z, 0, 1, 2, 3 , … 9 ; , . :

Atentie Pascalul fiind conceput de americani, lipsesc cu desăvârşire literele româneşti: ă, â, î, ş, ţ.

Variabilele string - sunt folosite pentru memorarea şirurilor de caractere, sau propoziţiilor.

Exemple de string: “Tata este inginer”, “Eu merg la scoala”, “How are you!”, “bla bla bla”.

Erori ce pot apărea într-un program

Programarea este unul din domeniile ce solicită la maxim capacitatea de concentrare şi atenţia programatorului. Deoarece calculatorul nu poate ghici ceea ce doream noi să execute, el poate doar executa ceea ce i-am spus noi să facă, intrucţiunile pe care i le dăm trebuie să fie scrise într-un limbaj folosit la modul cel mai corect. Bineîţeles situaţia este valabilă nu doar pentru programele scrise în Pascal, ci pentru toate programele scrise în orice limbaj.

Şi pentru că a greşi este totuşi omeneşte, să vedem ce erori pot apare în timpul scrierii unui program şi unde trebuie să fiţi mai atenţi.

În principal avem două tipuri de erori:


Erori de sintaxă: apar datorită neatenţiei şi sunt erorile cauzate de scrierea incorectă sau incompletă a unor porţiuni de program. Ca şi exemple am putea aminti:

scrierea greşită a denumirilor de instrucţiuni, sau de variabile (în cel de al doilea caz folosiţi defapt nume de variabile nedeclarate).

scrierea greşită a semnelor de punctuaţie (două puncte în loc de punct şi virgulă sau invers, etc).

alegerea incorectă a tipului unor variabile.

Toate aceste erori sunt detectate de către compilator în timpul operaţiei de compilare, ele nu permit compilarea programului, compilatorul afişând în schimb diverse mesaje de eroare.


Erori logice: sunt datorate alegerii incorecte a metodei sau formulei de rezolvare a problemei pe care vrem s-o rezolvăm cu ajutorul calculatorului. Ceea ce face şi mai dificilă depistarea şi corectarea acestor erori, este că compilatorul nu le detectează.

Ca să luăm un exemplu simplu, să presupunem că în programul ce calculează media a două numere reale, în formula de calcul a mediei nu folosim parantezele ci scriem media:=a+b/2;

Aici compilatorul nu are de unde ghici ce vrem noi defapt să calculăm şi dacă restul programului este scris corect, compilarea este posibilă, deci şi execuţia programului.

Dar oare rezultatul afişat va fi cel corect?


O metodă de verificare (deşi nu perfectă) a acestor erori logice, este compararea rezultatelor. Adică în primul rând se rezolvă problema manual pe hârtie, luând doua-trei exemple (cu cât mai multe cu atât mai bine), iar apoi se rezolvă problema şi cu ajutorul programului.

Ca să rămânem tot la exemplul nostru cu programul medie, luaţi mai întâi o hârtie şi calculaţi media a două sau trei perechi de numera oarecare (puteţi să vă folosiţi şi de un calculator de buzunar). Sau puteţi să vă folosiţi şi de exemple rezolvate din manuale sau culegeri, dacă există. După aceasta calculaţi media aceloraşi perechi de numere prin intermediul programului scris de voi. Dacă rezultatele sunt identice, aveţi şanse ca programul să fie corect, dacă rezultatele nu coincid trebuie revăzut programul şi depistate erorile.


Desigur că în cazul unor programe simple cum este cel pentru calculul mediei aritmetice, nu este greu ca acestea să fie scrise corect. Dar mai târziu când veţi ajunge să scrieţi programe mai lungi, mai complexe, ce conţin calcule matematice complicate, posibilitatea apariţiei unor astfel de erori este foarte mare.


sâmbătă, 8 mai 2010

Programarea

Acum că aveţi stabilită configuraţia ferestrelor şi salvată, se poate vedea mai clar elementele componente ale interfeţei TP 7:


Ferestre TP 7


Principalele etape ce trebuiesc urmate în conceperea şi utilizarea unui program scris în limbajul Pascal, folosindu-vă de mediul de programare Turbo Pascal 7.0 sunt:

  1. Scrierea programului
  2. Compilarea lui
  3. Lansarea programului în execuţie
  4. Salvarea programului (opţional)

1. Scrierea programului:

Scrierea unui program folosindu-vă de editorul de texte inclus în TP 7 nu este deloc dificilă. Dacă aţi mai lucrat cu un editor de texte cum este Microsoft Word nu veţi avea probleme.

Atenţie la meniul Edit care conţine în principal funcţiile Copy şi Paste şi pe care la puteţi folosi atunci cînd într-un program mai mare aveţi una sau mai multe linii de program identice, care se repetă.

2. Compilarea programului:

După scrierea programului puteţi trece la compilarea lui. Aşa cum este evident, compilarea se face accesând operaţia Compile din meniul cu acelaş nume din bara de meniuri, sau folosindu-vă de combinaţia de taste Alt+F9. Dacă din neatenţie aţi comis erori de sintaxă şi deci programul nu este scris corect, operaţia de compilare nu este posibilă, compilatorul afisând în schimb diverse mesaje de eroare, din care voi va trebui să deduceţi despre ce fel de erori este vorba şi unde (vezi şi capitolul despre erori din curs).

Dacă programul nu are erori sau toate erorile au fost corectate, compilarea va fi încununată de succes, lucru evidenţiat printr-o fereastră de forma:


Compiling


Mesajul cel mai important, îmbucurător şi care ne interesează, este conţinut în ultima linie, iar Press any key înseamnă că pentru a trece la pasul următor puteţi apăsa orice tastă.

3. Execuţia programului:

După operaţia de compilare efecutată cu succes, ceea ce vă mai rămâne de făcut este lansarea în execuţie a programului. Aceasta se face accesând meniul Run de unde alegeţi comanda Run, sau după cum se vede, puteţi rula un program şi apelând la combinaţia de taste Ctrl+F9. Rezultatele execuţiei programului, vor fi afişate în fereastra neagră Output.

Execuţia pas-cu-pas a programului:

Nu este o etapă obligatorie, dar este recomandată. Rularea unui program pas-cu-pas presupune apăsarea repetată a tastei F8 sau meniul Run spre Step over, de atîtea ori cîte instrucţiuni conţine programul. Veţi vedea astfel mai bine ce face şi care este rolul fiecărei instrucţiuni din program. Desigur trebuie să ţineţi cont şi de indicaţiile din program, adică de exemplu, în cazul când execuţia programului se opreşte şi aşteaptă introducerea unei valori de la tastatură, va trebui să faceţi acel lucru.

Puteţi şti în orice moment care este instrucţiunea ce urmează a fi executată, prin faptul că aceasta va fi evidenţiată printr-o bară orizontală de culoare gri.

4. Salvarea programului:

Dacă un program este scris corect şi sunteţi mulţumiţi de execuţia lui, atunci merită salvat. Asta dacă nu cumva doriţi ca data următoare cînd veţi mai avea nevoie de el, să-l rescrieţi din nou. Opţiunea de salvare a unui program se găseşte în meniul File spre Save, sau puteţi apela la tasta F2. În momentul următor se va deschide o fereastră ca cea de mai jos:


Save File


Numele pe care doriţi să-l daţi fişierului trebuie să îl introduceţi în câmpul Save file as, urmând ca după aceea să apăsaţi OK (în exemplul de mai sus am dat fişierului nostru numele de primul). Desigur dacă nu doriţi să salvaţi nimic apăsaţi Cancel.

După salvare veţi mai observa că automat, numele ferestrei de editare care până atunci era NONAME00.PAS va fi înlocuit cu numele dat fişiereului.

Atentie Deoarece Turbo Pascal 7.0 este un program creat pe vremea vechiului sistem de operare MS-DOS, nu este recomandat să daţi nume de fişiere şi directoare mai lungi de 8 cifre, altfel ele vor fi trunchiate cu (~). De exemplu numele folderului (directorului) Program Files este văzut PROGRA~1.

Fişierele sursă Pascal poartă extensia .pas, aceasta fiind adăugată automat de către TP 7 numelui dat de voi. Situat mai jos, în câmpul Files, se pot vedea în figura noastră, trei fişiere existente deja (salvate anterior). Observaţi la fiecare dintre ele numele şi extensia pas.

Dacă aveţi Turbo Pascal 7.0 descărcat de la adresa menţionată mai sus în capitolul Instalarea, programul vă va salva toate fişierele în folderul Work, ce are deci path-ul C:\Program Files\TP\WORK. În schimb dacă aveţi Turbo Pascal 7.0 provenit din alte surse sau lucraţi cu Borland Pascal, e foarte probabil ca acestea să fie setate să salveze toate fişierele într-un alt folder.

Mai puteţi observa în imaginea de mai sus, tot în câmpul Files, că pe lângă celelalte fişiere pot exista şi alte subfoldere ale folderului Work. Le recunoaştem prin faptul că numele acestor directoare este urmat de semnul back slash (\). Astfel deci, în exemplul nostru se pot vedea folderele GESTIUNE\ şi TESTE\.

Dând dublu click pe oricare din aceste foldere le deschidem şi intrăm în ele.

Deasemenea puteţi observa semnul ..\ care simbolizată ieşirea spre folderul imediat superior (în cazul nostru TP, cel care îl cuprinde pe folderul Work). Dacă daţi dublu click pe semnul respectiv ieşiţi deci din folderul în care vă găsiţi la acel moment şi intraţi în cel imediat superior. Astfel puteţi deci naviga prin structura de directoare existentă a hardiscului, în cazul în care doriţi să salvaţi un fişier într-un alt director decât Work (deşi nu recomand aceasta).

Mai jos unde vedeţi scris C:\PROGRA~1\TP\WORK\*.PAS această linie afişează întotdeauna folderul în care vă găsiţi la un moment dat, folderul curent.

Dacă doriţi să deschideţi un fişier salvat anterior, folosiţi binenţeles comanda Open, aflată deasemenea în meniul File. Fereastra Open arată aproape identic şi funcţionează identic cu fereastra Save. Desigur că şi fereastra Open se va deschide de fiecare dată tot în folderul Work.

Acestea sunt cunoştinţele minime necesare pentru a putea utiliza mediul de programare Turbo Pascal 7.0. Desigur puteţi învăţa mai multe citind un manual de specialitate, sau consultând Help-ul programului (cei care cunoaşteţi bine limba engleză).


Configurarea programului Turbo Pascal 7.0

Toate referirile de acum înainte se vor face la programul Turbo Pascal 7.0 (TP 7), dar ele sunt valabile şi pentru Borland Pascal.

Primul aspect ce se observă după pornirea TP 7, este un ecran gri-albăstrui şi neprietenos, ce mai conţine sus o bară de meniuri care cuprinde comenzile disponibile în TP 7, iar jos observăm o bară de stare unde de la caz la caz, ne sunt afişate o serie de informaţii.

Primul lucru care îl aveţi de făcut este deschiderea unei ferestre pentru editarea şi afişarea conţinutului programelor Pascal (fereastra albastră). Aceasta se face accesând meniul File apoi New (File spre New).

A doua fereastră de care mai aveţi nevoie este cea în care o să vedeţi rezultatul execuţiei programelor (fereastra neagră). Aceasta poate fi User screen (Alt+F5), dar mai simplu şi comod se lucrează cu fereastra Output. Aceasta se evidenţiază accesând meniul Debug spre Output.

Problema care apare acum este că fereastra Output (cea neagră) este acoperită de fereastra de editare (cea albastră) şi deci trebuie micşorată aceasta din urmă. Daţi deci click mouse oriunde în fereastra albastră pentru a o activa, poziţionaţi cursorul mouse-ului în colţul dreapta jos al ferestrei, ţineţi apăsat buton stânga şi împingeţi drept în sus până se vede complet fereastra Output (vezi animaţia):



Dacă ecranul monitorului vostru arată ca ultimul cadru din animaţia de mai sus,puteţi salva această configuraţie accesând meniul Options, de unde alegem Save TPX.TP. În acest fel de fiecare dată când veţi porni TP 7 poziţionarea ferestrelor se va păstra, în caz contrar va trebui să repetaţi procedurile descrise mai sus la fiecare pornire a programului.


Instalarea programului Turbo Pascal 7.0

Pentru a putea rula un program scris în limbajul Pascal trebuie să aveţi instalat pe calculatorul vostru unul din programele Turbo Pascal sau Borland Pascal.

Atentie Trebuie să facem distincţie între limbajul Pascal şi un program Turbo Pascal. Limbajul Pascal este o colecţie abstractă de instrucţiuni şi reguli de scriere, prin care noi scriem un program, program ce poate fi compilat şi apoi înţeles de către un calculator, în vederea executării de către calculator a uneia sau mai multe sarcini date.


Programul Turbo Pascal este un program, sau mai bine zis, un mediu de programare util în scrierea şi executarea programelor concepute în limbaj Pascal.

Un mediu de programare cum este şi Turbo Pascal, are în principal următoarele componente:

  • editor texte (pentru scrierea programelor)
  • compilator Pascal
  • o serie de aplicaţii, care la nevoie servesc pentru depanarea programelor, urmărirea evoluţiei unor parametrii din programe (pe timpul rulării acestora), etc

Pentru a instala programul Turbo Pascal 7.0 îl puteţi descărca de pe internet de la download Turbo Pascal 7.0. Daţi Save şi imediat va începe descărcarea kitului de instalare şi anume fişierul tp70.exetp70.exe După finalizarea download-ului (2,5 Mby), lansând în execuţie acest fişier, el va instala pe calculatorul vostru programul Turbo Pascal 7.0 în folderul C:\Program Files\TP.

O dată instalat, programul se porneşte din meniul Start ->Programs ->Turbo Pascal 7-> TpxTpx.

Şi pentru că eu sunt adeptul utilizării întotdeauna la maxim a spaţiului unui monitor, merită făcută o mică configurare şi anume asupra link-ului Tpx mai sus amintit, să apăsaţi nu buton stânga mouse (pt a-l porni) ci buton dreapta mouse, apoi mergeţi pe Properties. Se va deschide o fereastră de configurări unde ne interesează să alegem opţiunea Full-screen din paleta Screen (vezi figura):


Tpx Properties


Comentarii în programe Pascal

Pe lîngă textele explicative ce transmit diverse mesaje de ghidare utilizatorului, într-un program Pascal se mai pot introduce şi comentarii. Acestea sunt utile doar programatorului pentru a înscrie diverse informaţii despre ce face şi despre cum este conceput respectivul program. Comentariile reprezintă orice text încadrat între două acolade şi poate fi pe unul sau mai multe rânduri:

{acesta este un comentariu in Pascal}


şi au următoarele caracteristici:

  1. sunt ignorate de către compilator. Rezultă de aici că:
    • nu sunt executate de către calculator
    • textul cuprins între acolade nu va fi afişat niciunde cînd vom rula programul
    • comentariile nu modifică cu nimic execuţia programului şi nici rezultatele afişate

  2. comentariile pot fi introduse oriunde în program şi pot fi oricâte dorim.

Reluăm ca şi exemplu scrierea programului de mai sus, dar în care am introdus şi nişte comentarii (poate prea multe):


{program care citeste 2 numere   si apoi le afiseaza asa cum sunt}

program numere_comentat; {numele programului trebuie continut intr-un singur cuvant, fara spatii}
Var nr1: integer; nr2: real; {am definit o variabila ca si reala}
Begin {de aici incepe programul}
Write ('Introduceti numarul intreg=');
Readln (nr1); Write ('Introduceti numarul real=');
Readln (nr2); {programul citeste variabila reala}
Writeln ('Numarul intreg este=', nr1);
Writeln ('Numarul real este=', nr2); {programul afiseaza deci, cele doua numere exact asa cum au fost introduse, fara nici o modificare}
end.


Salvaţi şi executaţi pe rând cele două programe numere şi numere_comentat. Observaţi dacă în timpul rulării celor două programe exită vreo diferenţă.

Poate că acum la aceste programe simple şi scurte nu vedeţi utilitatea folosirii comentariilor. Dar în cazul unor programe mari, de zeci sau sute de instrucţiuni, liniile de comentariu introduse din loc în loc şi în punctele principale ale programului, vă vor ajuta foarte mult să vă daţi seama despre ce este vorba în program, fie că reluaţi lucrul la acel program după un timp mai îndelungat, fie că după voi va urma un alt programator care va trebui să facă unele modificări.



Utilizarea textelor explicative

În cadrul programelor complexe în care se folosesc mai multe variabile şi se cere introducerea de la tastatură a conţinutului unora dintre ele, precum şi afişarea conţinutului altora, pentru un utilizator care nu cunoaşte limbajul Pascal şi nici nu vede programul sursă, ar fi foarte greu să ştie în fiecare moment, conţinutul cărei variabile i se cere a introduce de la tastarură, precum şi conţinutul cărei variabile este afişat. De aceea într-un program se mai introduc şi linii de text explicativ, care uşurează utilizarea lui de către un client. Linile de text explicative sunt introduse tot cu ajutorul instrucţiunii Write sau Writeln şi ele nu influenţează cu nimic rezultatul programului.

Trasnscriem mai jos programul nostru adăugând şi explicaţiile necesare.

program text2; Var propoz: string; Begin  Write (‘Introduceti propozitia dorita: ‘);  Readln (propoz);  Write (‘Textul este: ‘);  Write (propoz); end.

Trebuie acordată o mare atenţie ca valoarile variabilelor introduse de către utlizator de la tastatură să fie compatibile cu tipul variabilelor, declarate în secţiunea de declaraţii. Astfel o variabilă de tip integer sau real nu poate conţine caractere (litere şi nici semne de punctuaţie), de asemenea o variabilă de tip string poate conţine şi cifre, dar asupra ei nu se pot aplica operaţiile aritmetice. Pentru a se evita deci, ca utilizatorul să introducă o valoare nepotrivită într-o variabilă se folosesc aceste texte explicative.


Operaţii posibile şi imposibile

Un program nu foloseşte variabile doar pentru a citi conţinutul lor de la tastatură şi apoi al afişa întocmai cum a fost introdus. De obicei în cursul unui program se efectuează diferite operaţii asupra unor variabile.

Cunoaştem deci cele patru tipuri de variabile:

integer, real > pentru valori numerice si string , char > pentru caractere.

Operaţii se pot face asupra tuturor tipurilor de variabile, dar în principal cele mai multe operaţii se efectuează asupra variabilelor numerice. În Pascal apar unele diferenţe fată de felul de notare cum sunteţi obişnuiţi de la matematică.

Forma generala a unei operaţii de atribuire este:









Deasemenea în operaţia de atribuire a unei variabile, pot intra şi numere fixe, numite constante, al căror conţinut nu se modifică în nici un fel, niciodată.

Cel mai simplu exemplu pentru aceasta este formula mediei aritmetice a două numere a şi b, în care avem constanta doi:

media := (a+b)/2;

Atentie Dacă la adunare şi scădere simbolurile operaţiilor rămân aceleaşi, la înmulţire şi împărţire simbolurile operaţiilor se schimbă faţă de cele cunoscute din matematică:


Operaţia

Simbol în matematică

Simbol în Pascal

Adunare

+

+

Scădere

Înmulţire

inmultit

*

Împărţire

/


Tastele corespunzătoare celor patru operaţii aritmetice le puteţi găsi dispuse şi lângă tastele numerice, în partea dreaptă a tastaturii.

Deasemenea regula folosirii parantezelor pentru a schimba ordinea operaţiilor este aceeaşi ca şi la matematică.

Operaţii posibile şi imposibile:

Totdeauna trebuie să fim foarte atenţi la tipul variabilei conţinută în operaţia de atribuire:










Dăm mai jos un exemplu de program care va citi de la tastatură două numere, apoi le va aduna şi în final va afişa rezultatul adunării.


Var nr1, nr2, sum: integer;

Begin

Write (‘Introduceti primul numar=‘);

Readln (nr1);

Write (‘Introduceti al doilea numar=‘);

Readln (nr2);

sum:= nr1 + nr2; {operatia de atribuire}

Writeln (‘Suma este= ‘, sum);

end.


Conţinutul celor două numere ce trebuiesc adunate va fi stocat în două variabile nr1 şi nr2 de tip integer. Rezultatul adunării va fi depus într-o variabilă numită sum, de asemenea de tip integer. La fiecare rulare a programului se pot introduce oricare alte două numere întregi, afişându-se apoi rezultatul adunării acestora.


Observăm că variabilele rămân tot aceleaşi (nr1, nr2 şi sum) numele şi tipul lor nu se mai modifică, doar conţinutul lor poate fi altul la fiecare rulare a programului. Binenţeles acelaş lucru este valabil şi la programele anterioare: text, text2 şi numere şi în oricare program Pascal scris corect.


Trebuie acordată mare atenţie numelui variabilelor. Acesta trebuie să fie acelaşi peste tot în program, identic cu numele atribuit în secţiunea de declaraţii. Ca exemplu dacă în secţiunea de declaraţii am declarat cele trei variabile cu numele nr1, nr2 şi sum, exact aceste nume şi numai acestea trebuiesc folosite peste tot mai departe în cuprinsul programului. Dacă am denumit deci o variabilă de intrare nr1, nu putem după aceea să-i introducem valoarea de la tastatură folosind instrucţiunea readln şi scriind readln (n1), sau readln (numar1), deoarece limbajul Pascal nu va recunoaşte cine este acest n1 sau numar1, sau orice alt nume diferit de nr1 şi prin urmare va afişa un mesaj de eroare în timpul compilării. Deasemenea numele programului scris în prima linie din program nu poate fi identic cu numele vreunei variabile din program.


Dăm mai jos un exemplu de program care va citi de la tastatură două numere întregi, apoi le va împărţi şi în final va afişa rezultatul împărţirii.


Var nr1, nr2: integer;

C: real;

Begin

Write ('Introduceti primul numar=');

Readln (nr1);

Write ('Introduceti al doilea numar=');

Readln (nr2);

C:= nr1/nr2;

Writeln ('Rezultatul este=', C);

end.


Conţinutul celor două numere ce trebuiesc împărţite unul la celălalt va fi stocat în două variabile nr1 şi nr2 de tip integer. Rezultatul împărţirii va fi depus într-o variabilă numită C (de la cât) şi care este de tipul real.


La tipul variabilelor! Pentru a stabili corect tipul fiecărei variabile ne uităm la conţinutul pe care va trebui să-l stocheze variabila, în orice situaţie posibilă matematic.

Deşi cele două numere ce se împart sunt de tipul integer, rezultatul împărţirii lor poate fi un număr întreg sau real (cu zecimale). Ca exemplu gândiţi-vă doar la rezultatul împărţirii a 9 la 2, sau a lui 25 la 3. Deci pentru ca programul să poată funcţiona în orice situaţie, adică pentru oricare două perechi de numere întregi, rezultatul împărţirii lor trebuie conţinut într-o variabilă de tip real. De aceea am declarat variabila C de tipul real.


De reţinut: De obicei când în calculul valorii unei variabile intervin operaţii de împărţire sau extragere de radical, trebuie ca variabila să fie declarată de tip real, deoarece cu siguranţă vor fi situaţii când valoarea ei va fi un număr real.


Exerciţiu: Cunoscând cele de până acum încercaţi să scrieţi un program care calculează media aritmetică a oricaror 2 numere reale. Afişaţi rezultatul cu 3 zecimale.


Structura repetitivă

Este o structură de calcul care permite, în funcţie de anumite condiţii, executarea unei anumite instructiuni sau secventa de instructiuni de N ori (unde N poate fi 0, 1 sau mai mult). Programul de mai jos citeste doua numere de la tastatura si va aduna primul numar cu el insusi de atatea ori cat e valoarea celui de-al doilea :

Cod:

var a, b, suma : integer; begin   write('Dati a: '); readln(a);   write('Dati b: '); readln(b);   suma := 0;   For b := 1 To b Do     suma := suma + a;   write('Suma este ', suma);   readln; end.

Este simplu, doar adunam valoarea din A de B ori, altfel spus inmultim A cu B. Totusi, scopul acestui program nu e de a face inmultirea, ci de a explica structura repetitiva :)


Aceste trei structuri de calcul s-au dovedit de-a lungul timpul a fi, intr-adevar, singurele strict necesare crearii unui program, motiv pentru care nici nu o sa explic in aceste tutoriale cum se folosesc, in Pascal, salturile neconditionate (desi exista aceasta posibilitate).


Instructiuni conditionale


Avem la dispozitie doua tipuri de instructiuni conditionale in Pascal: If ... Then ... Else si Case.


Sa incepem cu inceputul.


Structura If ... Then ... Else


Are doua sintaxe, putin diferite. Cea mai obisnuita este mai jos:

Cod:

If conditie Then instructiune1             Else instructiune2;

Conditie este o comparatie sau orice altceva care returneaza o valoarea logica (True sau False), cum ar fi valoare = 5.


Instructiune1 si instructiune2 pot fi orice fel de instructiuni, inclusiv instructiunea compusa.


Atentie: In cazul folosirii acestei sintaxe, semnul " ; " (punct si virgula) nu numai ca nu este necesar dupa instructiune1, ci este interzis sa fie pus acolo.


A doua varianta a acestei structuri conditionale este cea in care nu avem ramura de else :

Cod:

If conditie Then instructiune1;

Atentie: In cazul folosirii acestei sintaxe, semnul " ; " (punct si virgula) este strict necesar dupa instructiune1.


Sa exemplificam aceste structuri prin programul de mai jos:

Cod:

var varsta : integer;      sex : char; begin   write('Ce varsta aveti ? '); readln(varsta);   write('Sunteti baiat sau fata ? (M / F) : '); readln(sex);   If (sex = 'f') or (sex = 'F') Then WriteLn ('Sex feminin')                                 Else WriteLn ('Sex masculin');   If varsta > 17 Then WriteLn('Persoana majora');   ReadLn; End.

Pentru a intelege programul, sa-l luam pas cu pas. Am definit doua variabila, una de tip integer (valoare numerica) denumita varsta si una de tip Char (un singur caracter) denumita sex.

Dupa citirea de la tastatura a valorilor pentru aceste doua variabile, verificam daca variabila sex e cumva litera F. De remarcat ca am folosit operatorul logic OR pentru a verifica daca variabila are valoarea f sau F, ambele insemnand faptul ca sexul este feminin, caz in care afisam acest lucru. Pe ramura de Else, stiind ca sexul nu este feminin, am pus direct afisare ca sexul este masculin, ceea ce nu este tocmai corect. Trebuia facuta o verificare si daca valoarea variabilei sex este m sau M, pentru a asigura acuratetea programului. In programul de mai sus, daca pentru variabila sex introducem litera c, progamul va afisa tot "Sex masculin", dar momentan scopul meu nu e de a crea programe fool-proof, ci doar de a va explica modul de functionare a structurilor conditionale.

Pentru varsta facem o singura verificare, anume daca varsta este strict mai mare decat 17 (adica minim 18), caz in care afisam "Persoana majora" (pretty self-explaining, nu ? :) )


Sa refacem programul pentru a lua in calcul si alte cazuri (cum ar fi verificarea pentru sexul masculin, varste negative sau peste 150 de ani :D)

Cod:

var varsta : integer;      sex : char; begin   write('Ce varsta aveti ? '); readln(varsta);   write('Sunteti baiat sau fata ? (M / F) : '); readln(sex);   If (sex = 'f') or (sex = 'F') Then WriteLn ('Sex feminin')     Else       If (sex = 'm') or (sex = 'M') Then WriteLn ('Sex masculin')         Else WriteLn ('Sex necunoscut, probabil neutru');    If (varsta < 0) Then WriteLn ('Persoana care este inca in planuri de viitor')     Else       If (varsta < 18) Then WriteLn ('Persoana minora')         Else           If (varsta < 60) Then WriteLn ('Persoana majora')             Else               If (varsta < 150) Then WriteLn ('Persoana in varsta')                 Else WriteLn ('Personaj biblic');    ReadLn; End.

Dupa cum vedeti, in noul program am luat in calcul ca variabila sex poate reprezenta sex feminin, sex masculin sau un caracter care nu reprezinta nici unul din acestea doua cazuri. Pentru aceasta, am folosit instructiuni conditionale imbricate (adica una in interiorul alteia). Arata urat, nu ? In plus, e si destul de greu de inteles.

Cu toate astea, pentru variabila varsta am facut chiar si mai multe verificari, folosind multiple instructiuni conditionale imbricate. E deja mai urat si chiar si mai greu de inteles. Nu am de facut decat sa va recomand multa atentie cand creati sau recititi programul ... si sa va prezint instructiunea conditionala multipla, ca o alternativa la instructiunea If ... Then ... Else


Structura Case


Instructiunea Case, denumita si instructiune alternativa multipla, ofera posibilitatea verificarii unei variabile pe un set mai intins de valori, fara a da dureri de cap la crearea sau recitirea programului.


Sintaxa generala:

Cod:

Case variabila_simpla Of   val_posibile1 : instructiune1;   val_posibile2 : instructiune2;   ...   val_posibileX : instructiuneX;   Else instructiuneY; End;

Sa incercam sa intelegem aceasta sintaxa, care pare a fi ceva mai complicata decat sintaxa instructiunii dinainte.

Variabila_simpla desemneaza orice variabila de un tip simplu de date (vedeti tutorialul anterior). Nu poate fi folosit aici, de exemplu, tipul String, el nefiind un tip simplu de date.

Val_posibile1, Val_posibile2 si Val_posibileX tin locul unei (sau a mai multor) valori posibile pentru variabila_simpla. Daca valoarea variabilei variabila_simpla e egala (sau inclusa) cu vreuna din valorile posibile, atunci va fi executat setul corespunzator de instructiuni.

Instructiune1, instructiune2 si instructiuneX pot fi orice fel de instructiuni, inclusiv cele compuse.

Pe ramura de Else avem acelasi lucru ca si la instructiunea If ... Then ... Else, adica o anumita instructiune care se executa in cazul in care valoarea variabilei variabila_simpla nu se regaseste in optiunile de mai sus (Val_posibile1, Val_posibile2, Val_posibileX). Aceasta ramura, ca si la If ... Then ... Else, poate ramane nefolosita.


Sa refacem programul de mai sus, folosind aceasta noua instructiune.

Cod:

var varsta : integer;      sex : char; begin   write('Ce varsta aveti ? '); readln(varsta);   write('Sunteti baiat sau fata ? (M / F) : '); readln(sex);      Case sex Of     'f','F' : WriteLn ('Sex feminin');     'm','M' : WriteLn ('Sex masculin');     Else Writeln ('Sex necunoscut, probabil neutru');   End;        Case varsta Of     0 .. 17       : WriteLn ('Persoana minora');     18 .. 60      : WriteLn ('Persoana majora');     61 .. 150     : WriteLn ('Persoana in varsta');     151 .. maxint : WriteLn ('Personaj biblic');     -maxint .. -1 : WriteLn ('Persoana care este inca in planuri de viitor');   End;        ReadLn; End.

Dupa cum vedeti, e mult mai usor de folosit si este mult mai clara. Singurul lucru care cred ca mai e necesar sa vi-l explic este ce inseamna, 'f','F' si 18 .. 60. Structura Case, dupa cum am explicat anterior, permite ca, pentru o anumita instructiune, sa verificam mai multe valori posibile. Aceste valori pot fi scrise una cate una si despartite prin virgula (cum a fost in cazul variabilei sex) sau pot fi scrise ca un sir de valori, in care se ofera valoarea minima si apoi valoarea maxima, aceste doua valori fiind despartite prin " .. " (doua puncte unul dupa celalalt).


Cam asta ar fi toata partea de instructiuni conditionale in Pascal. Sa trecem la ...


Bucle (instructiuni repetitive)


Buclele (instructiuni de ciclare) sunt niste instructiuni care asigura repetarea pe un anumit numar de pasi a unor anumite instructiuni.


Sa ne imaginam ca vrem sa facem un program care sa afiseze crescator, de la 1 la 20, toate numerele. E destul de simplu sa le afisam cu o instructiune Write (sau mai multe). Dar sa presupunem ca vrem sa facem acelasi lucru pana la 1.000 ... sau pana la 1.000.000 ... cred ca sunteti de acord ca ar fi "cam" mult de lucru.


Aici apare nevoia de bucla, pentru a repeta afisarea unui numar (de fiecare data cu o unitate mai mare).


In Pascal, sunt trei tipuri de instructiuni de ciclare: While, Repeat si For.


Bucla While


Sintaxa generala a acestei instructiuni este:

Cod:

While conditie Do instructiune;

Conditie poate fi orice comparatie sau orice altceva ce are ca rezultat True sau False. Se poate apela si

Cod:

While True Do instructiune;

, caz in care nu se poate iesi din bucla din cauza conditiei. Daca nu exista in interiorul acestei bucle o instructiune de iesire (cum ar fi Break), atunci bucla va fi infinita (nu va mai iesi din ea, programul se va bloca si va trebui terminat cu Ctrl + Break, sau si mai rau, din Task Manager sau reboot).

In general, conditia va face referire la o conditie care va deveni adevarata, pe masura bucla lucreaza sau este o simpla verificare a unui contor, caz in care putem calcula dinainte exact cate ciclari va face bucla (de cate ori va repeta instructiunile aflate in interior).


De remarcat ca iesirea din bucla se va face doar cand conditia va returna valoarea False. E si destul de usor de inteles asta : While conditie Do instructiune care in limbaj natural ar suna Cat timp conditia_mea_e_adevarata Fa ceva.


Instructiune poate fi orice fel de instructiune, inclusiv instructiunea compusa.


Sa vedem cum am putea face in Pascal, folosind bucla While, programul de mai sus care afiseaza pana la 20.

Cod:

var cnt : integer; begin   cnt := 1;   While cnt <= 20 Do   Begin     WriteLn(cnt);     cnt := cnt + 1;   End;   ReadLn; end.

Sa analizam programul. Prima oara am declarat o variabila de tip integer (care poate lua valori intre -32768 si 32767), care va fi ceea ce denumim contorul buclei. Initializam contorul cu 1, aceasta fiind prima valoare ce va trebui afisata, apoi afisam contorul, care apoi va fi marit cu o unitate.

Pe masura ce avansam, ajungem cu Cnt = 20. Ce se va intampla atunci : va fi afisat (20), contorul va fi crescut la 21 si programul va reveni la conditia de la inceputul buclei : este Cnt mai mic sau egal cu 20 ? Evident, nu mai este cazul, motiv pentru care se trece la executarea urmatoarei instructiuni din program, anume ReadLn.


Sa vedem cum am putea face programul daca am initializa Cnt cu valoarea 0.

Cod:

var cnt : integer; begin   cnt := 0;   While cnt < 20 Do   Begin     cnt := cnt + 1;     WriteLn(cnt);   End;   ReadLn; end.

Ok, ar trebui sa fie evident. Tot ce am facut a fost

* sa schimb conditia de iesire din bucla, din <= in simplul <

* sa inversez instructiunea de crestere a contorului cu cea de afisare

De ce am facut asta ? In primul rand, trebuia sa inversam instructiunile, fiindca altfel ar fi inceput afisarea cu 0, nu cu 1, cum se cerea. Cealalta modificare se refera la faptul ca in momentul care am afisat 20, trebuie iesit din bucla. Inca un ciclu (determinat de o conditie cnt <= 20 ar rezulta in afisarea lui 21, lucru pe care iar nu-l vrem.


Cred ca acum ati inteles cum sta treaba cu While, so ... next one :)


Bucla Repeat


Sintaxa general a instructiunii Repeat este:

Cod:

Repeat   instructiune; until conditie;

Spre deosebire de While, iesirea din aceasta bucla se face atunci cand valoarea conditiei este True. Pentru o bucla infinita se va folosi:

Cod:

Repeat   instructiune; until False;

De remarcat ca instructiune nu e necesar sa fie instructiune compusa. Cu alte cuvinte, nu este necesar sa puneti Begin ... End pentru a delimita bucla, acest lucru fiind facut de Repeat ... Until.


Sa rescriem programul initial folosind aceasta instructiune.

Cod:

var cnt : integer; begin   cnt := 1;   Repeat     WriteLn(cnt);     cnt := cnt + 1;   Until cnt > 20;   ReadLn; end.

De remarcat conditia de iesire din bucla, care este exact opusul celei folosite in cazul buclei While (desi e destul de simplu de inteles, avand in vedere motivele terminarii fiecarei bucle).


Singurul lucru care il am de adaugat (fiindca e destul de usor de inteles, avand in vedere explicatiile anterioare) e faptul ca dupa ce cnt are valoarea 20 si este afisat, va fi crescut cu 1 (devenind 21), caz in care conditia devine adevarata (cnt > 20), motiv pentru care se iese din bucla.

Daca am initializa contorul cu 0, programul ar fi asa:

Cod:

var cnt : integer; begin   cnt := 0;   Repeat     cnt := cnt + 1;     WriteLn(cnt);   Until cnt >= 20;   ReadLn; End.

Din nou, avem conditia de la While, dar inversata. Cam asta ar fi si Repeat-ul ... easy, nu ?


Atentie: Inversa conditiei > este <=, iar a conditiei < este >=.


Bucla For


Sintaxa generala la For cunoaste 2 cazuri (crescator sau descrescator):


Cazul crescator:

Cod:

For contor = val_initiala To val_finala Do instructiune;

Cazul descrescator:

Cod:

For contor = val_initiala DownTo val_finala Do instructiune;

Motivul pentru care avem aceasta distinctie e faptul ca nu mai avem direct controlul asupra contorului buclei, acesta fiind crescut / scazut de bucla, scapandu-ne astfel de o grija. Din pacate, in felul acesta nu putem decat sa mergem cu pasi de cate o unitate (crescator sau descrescator). In cazurile While sau Repeat, puteam creste contorul cu cat vroiam noi (am ales sa-l cresc cu 1 doar pentru exemplificare).


Dupa cum ati observat, aici nu mai avem nici o conditie de iesire din bucla. Iesirea din aceasta bucla se face in momentul in care val_initiala devine mai mare / mai mica cu o unitate decat val_finala. De asemenea, daca se folosesc sintaxa cu To se sare peste bucla in cazul in care val_initiala este mai mare decat va_finala si invers.


De remarcat e faptul ca nu mai trebuie sa initializam contorul inaintea buclei (il initializam de fapt direct in bucla).


Programul de mai sus, scris cu o bucla For ar arata in felul urmator:

Cod:

var cnt : integer; begin   For cnt := 1 To 20 Do     WriteLn(cnt);   ReadLn;   End.

Dupa cum vedeti, contorul nu prea mai e in grija noastra (iar unele compilatoare chiar dau eroare daca veti incerca sa-i modificati valoarea in interiorul buclei).


Sa incercam acum sa lucram cu varianta descrescatoare pentru a face acelasi program ;;)

Cod:

var cnt : integer; begin   For cnt := 20 DownTo 1 Do     WriteLn(20 - cnt + 1);   ReadLn;   End.

Structura alternativă


Este o structură de calcul care permite, în funcţie de anumite condiţii, executarea (sau neexecutarea) unei anumite instrucţiuni sau secvenţă de instrucţiuni. Programul de mai jos vrea să facă suma a doua numere, în afară de cazul în care primul număr este 0 (zero), caz în care adună al doilea număr cu el însuşi :

Cod:

var a, b : integer; begin   write('Dati a: '); readln(a);   write('Dati b: '); readln(b);   If a <> 0 Then write('Suma celor doua numere este ', a+b)             Else write('Suma celor doua numere este ', b+b);   readln; end.
Deci, am pus o condiţie şi în funcţie de ea executăm o parte sau alta a codului. Parcă suntem în viaţă. Ne oferă cineva ceva, dar noi nu acceptăm decît daca preţul e mai mic sau egal cu o anumită sumă, pentru că altfel ni se pare prea mare preţul.

Structura secvenţială

Este cea mai usoară structură întîlnită într-un program. În programul de mai jos (care face suma a doua numere citite de la tastatură) :

Cod:

var a, b : integer;
begin
write('Dati a: '); readln(a);
write('Dati b: '); readln(b);
write('Suma celor doua numere este ', a+b);
readln;
end.
, nu intalnim altă structură de calcul decît cea secvenţială. Cu asta vreau  sa spun că toate instrucţiunile vor fi folosite, pe rînd, în ordine, fără ca  vreuna din instrucţiuni să se repete. Sună ca o reţetă uşoară de mîncare, nu?  Exact asta şi este.

Cele două roluri ale instrucţiunilor Write şi Writeln în program

Observăm acum că instrucţiunile Write (sau Writeln) pot fi folosite în două scopuri:

  1. Afişarea unui text explicativ, caz în care textul este încadrat între două apostroafe:
  2.  Write (‘Textul este: ‘);
  3. Afişarea conţinutului unei variabile, caz în care între paranteze este introdusă chiar numele variabilei respective, fără apostroafe:
  4.  Write (propoz);

Aceste două situaţii pot fi conţinute şi într-un singur rând, adică de o singură instrucţiune Write (sau Writeln), dacă sunt separate prin virgulă. Astfel ultimele două instrucţiuni din exemplul dat anterior se pot echivala cu un singur rând în felul următor:








Când rularea programului va ajunge la instrucţiunea Write, ea va produce deci afişarea:


Output


În continuare dăm exemplu un program în care sunt citite de la tastatură şi apoi afişate două numere. Vom avea pentru aceasta două variabile numite nr1 şi nr2, una de tipul integer iar alta real, care ştim că pot stoca numere.

Putem da variabilelor orice nume dorim (cu excepţia celor rezervate) dar de obicei se recomandă a se da nişte nume sugestive. Celor două variabile le puteam da de exemplu şi nume ca coco şi miaumiau, dar pentru că în cazul nostru este vorba de nişte variabile ce vor conţine numere, am considerat mai potrivit să le denumim nr1 şi nr2.

program numere; Var nr1: integer;  nr2: real; Begin  Write ('Introduceti numarul intreg=');  Readln (nr1);  Write ('Introduceti numarul real=');  Readln (nr2);  Writeln ('Numarul intreg este=', nr1);  Writeln ('Numarul real este=', nr2); end.

Atentie Cînd introduceţi de la tastarură numere reale, acestea se introduc cu punct nu cu virgulă. Spre exemplu numărul 1,55 se introduce 1.55 Deci la fiecare rulare a programului utilizatorul poate introduce oricare alte două numere dorite, acestea fiind apoi afişate întocmai.


Modul de lucru cu variabilele

Pentru a folosi o variabilă trebuiesc urmăriţi următorii paşi:

  1. declararea variabilelor
  2. citirea lor, introducem o valoare de la tastatură ce va reprezenta conţinutul acelei variabile
  3. (opţional deocamdată) operaţii asupra variabilelor
  4. afişarea variabilelor
  1. Declararea variabilelor - declararea unei variabile se face la începutul unui program, înainte de începerea execuţiei programului. Se stabilesc astfel numărul de variabile ce vor fi folosite în program, numele variabilelor şi tipul lor.

    VAR - comandă folosită la declararea variabilelor, şi reprezintă aşa numita secţiune de declaraţii. Nume variabilă - poate fi orice nume dorit de noi : a, b, suma, coco, olala
    Atentie Sunt totuşi o serie de cuvinte care nu se pot atribui numelor unei variabile, aşa numitele cuvinte rezervate şi care sunt reţinute de către limbajul Pascal deoarece înseamnă altceva. Exemple: Write, begin, end, help, program, etc.
    Dacă avem de definit mai multe variabile de acelaşi tip, numele lor va fi separat prin virgulă. Precizare: Peste tot în program unde vedem că este vorba de o variabilă, avem de a face de fapt cu numele acelei variabile. Despre conţinutul unei variabile vorbim doar în timpul rulării programului şi numai atunci. Când un program nu este rulat, nici o variabilă scrisă în el nu are nici un conţinut. Tip variabilă - se alege oricare din cele 4 tipuri cunoscute, în funcţie de tipul datelor ce vor fi conţinute de către variabila respectivă pe timpul execuţiei programului.
  2. Citirea variabilelor: se face introducând o valoare de la tastatură şi se realizează folosind instrucţiunea READLN (nume variabilă).

    Exemple:    READLN (a);  READLN (suma);

    În momentul când programul ajunge la execuţia unei instrucţiuni READLN, execuţia programului se opreşte, pe ecran apărând o linie verticală ce clipeşte intermitent, numită prompter. Aceasta însemnă că în momentul şi la locul respectiv programul aşteaptă introducerea de la tastatură de către utilizator a valorii ce va fi conţinută în variabila resprectivă.

  3. Operaţii asupra variabilelor - (vom vorbi mai târziu)
  4. Afişarea variabilelor: pentru a vedea pe monitor conţinutul unei variabile, se foloseşte instrucţiunea WRITE (nume variabilă) sau WRITELN (nume variabilă).

    Exemple:    WRITE (a);  WRITELN (suma);

Reluăm acum primul nostru program, dar făcut mult mai flexibil prin folosirea variabilelor:

program text; Var propoz: string; begin  Readln (propoz);  Write (propoz); end.

Primul rând al programului îl reprezintă numele programului şi are doar rolul de a ne ajuta să identificăm mai uşor un program, atunci când avem mai multe. El poate fi acelaş sau diferit de numele fişierului în care am salvat programul, dar nu poate fi identic cu numele nici unei alte variabile din program.

Programul de mai sus conţine o variabilă căreia i-am dat numele propoz şi care este de tipul string, ea putând stoca deci orice şir de caractere dorit. De fiecare dată cînd programul este lansat în execuţie el poate citi de la tastatură orice şir de caractere (propoziţie) prin intermediul instrucţiunii Readln, urmând ca după aceea propoziţia respectivă să fie afişată pe monitor, prin execuţia instrucţiunii Write. Programul afişează deci, automat orice propoziţie introdusă anterior de la tastatură, fără a se mai face nici o modificare în programul Pascal. Observăm deci că la fiecare rulare a programului, dacă clientul introduce altă propoziţie, conţinutul variabilei noastre se schimbă. De aceea se numeşte şi variabilă.

Este posibil ca în unele programe mai complexe conţinutul unor variabile să se poată schimba şi de mai multe ori pe parcursul execuţiei programului.

Să vedem acum ce se întâmplă în interiorul calculatorului în timpul rulării programului şi ce rol au principalele componente ale calculatorului. Cu 1, 2, 3, 4 am notat ordinea circulaţiei datelor conţinute de variabila noastră.



program_text


În momentul declarării variabilelor (deci înainte de begin şi de execuţia oricărei instrucţiuni) programul comandă automat microprocesorului să rezerve un loc în memoria internăpentru depozitarea ulterioară a conţinutului variabilei (în exemplul nostru variabila propoz).

Ca o precizare putem spune că locaţiile de memorie rezervate pot ocupa o celulă de memorie (adică 1 octet) sau mai multe, depinde de tipul fiecărei variabile, dar nu intrăm în amănunte.

Mai departe când execuţia programului ajunge la instrucţiunea Readln programul aşteaptă ca utilizatorul să introducă de la tastatură şirul de caractere (propoziţia) dorită (în cazul exemplului nostru, să zicem Clasa a 6-a). Aceasta va constitui de acum înainte conţinutul variabilei propoz (adică şirul de caractere Clasa a 6-a) şi care va fi depozitat în memoria internă, în locul rezervat pentru aceasta.

După aceea în momentul executării instrucţiunii Write, se cere în program afişarea conţinutului variabilei propoz. Pentru a afla acest conţinut microprocesorul comandă citirea locaţiei de memorie rezervat variabilei respective şi afişarea lui.

Mai observăm că instrucţiunile se execută în ordinea succesivă în care sunt scrise în program, începând cu prima instrucţiune ce urmează după cuvântul rezervat begin iar în cele din urmă programul terminându-se cu cuvântul rezervat end. Pentru o mai bună înţelegere a funcţionării programului, puteţi eventual încerca şi execuţia pas-cu-pas a programului.


Instrucţiunea WRITELN

Instrucţiunea WRITELN face ca rîndul următor ce urmează după ea, să fie scris pe un rând nou şi de la capătul rândului. Instrucţiunea WRITE nu presupune acest lucru.

Introduceţi şi rulaţi următorul program:

begin
        writeln (‘clasa a 6-a’);
        writeln (‘din scoala generala’);
end. 

Observaţi în fereastra Output textul scris pe două rânduri separat:

<!--[if !vml]-->

<!--[endif]-->


<!--[if !vml]-->

<!--[endif]-->

<!--[if !vml]-->

<!--[endif]-->

<!--[if !vml]-->

<!--[endif]-->

<!--[if !vml]-->

<!--[endif]-->

<!--[if !vml]-->

<!--[endif]-->

<!--[if !vml]-->

<!--[endif]-->

<!--[if !vml]-->

<!--[endif]-->


Deci printr-o analogie cu programul Word, am putea spune că


WRITELN = WRITE + Enter


Deasemenea în Pascal nu contează dacă instrucţiunile sunt scrise cu litere mari sau mici.


Se introduce următorul exemplu de program:

 begin
        write (‘eu ‘);
        write (‘merg ‘);
        write (‘la ‘);
        write (‘scoala.’);
end.

<!--[if !vml]--><!--[endif]-->

<!--[if !vml]-->

<!--[endif]-->

<!--[if !vml]-->

<!--[endif]-->

<!--[if !vml]-->

<!--[endif]-->

<!--[if !vml]-->

<!--[endif]-->

<!--[if !vml]-->

<!--[endif]-->

<!--[if !vml]-->

<!--[endif]-->

<!--[if !vml]-->

<!--[endif]-->

Veţi observa că deşi textul este scris pe mai multe linii, deoarece am folosit numai instrucţiunea WRITE, în momentul rulării programului tot textul va fi afişat doar pe un rând.

Ca exerciţiu înlocuiţi una sau mai multe numai instrucţiuni WRITE, cu WRITELN. Rulaţi programul de fiecare dată. Observaţi ce se întâmplă.