Sunteți pe pagina 1din 9

Cum descriem algoritmii?

Capitolul
Cum scriem programe?
Variabile şi constante
Componentele schemelor logice
Limbajul pseudocod
Probleme propuse
Soluţiile problemelor propuse
2
2.1. Variabile şi constante
Concepem algoritmi cu scopul de a prelucra anumite date, a le transforma în alte date
(date de intrare în date de ieşire).
Din punct de vedere al modului în care este manevrată în cadrul algoritmului o
anumită dată, distingem două mari categorii de date:
• constante – a căror valoare nu poate fi modificată pe parcursul prelucrărilor;
• variabile – a căror valoare poate fi supusă oricărei modificări permise de natu-
ra valorii reţinute de către acestea.

În cadrul oricărui algoritm/program, o variabilă este caracterizată de un triplet de


proprietăţi (nume, tip, valoare).
• nume – este folosit pentru a „boteza” variabila, cu scopul de a o putea identifi-
ca în mulţimea datelor la care are acces algoritmul.
În limbajul de programare Pascal nu putem utiliza orice nume. Numele trebuie să
fie un identificator. Prin aceasta vom înţelege că poate conţine numai litere (mari sau
mici, Pascal nu face diferenţa), cifre şi liniuţa de subliniere, iar primul caracter este
obligatoriu o literă sau liniuţa de subliniere.
Iată câteva exemple de nume: a lung n1 cod Latura_Mare. Să vă
dăm şi câteva contraexemple: a&b (numele nu poate conţine caracterul &), 1elev
(numele nu poate să înceapă cu o cifră), elev premiat (numele nu poate să conţină
spaţii, în locul spaţiilor vă recomandăm să folosiţi liniuţa de subliniere).
• tip – precizează mulţimea valorilor care pot fi reţinute de către variabila având
tipul respectiv, precum şi operaţiile permise asupra acestei variabile. Tipul
unei variabile simple poate fi numeric (întreg sau real), logic (valoare de
adevăr) sau şir de caractere (atunci când variabila trebuie să reţină un text).
Aşa cum vom vedea puţin mai târziu, o variabilă de tip structurat poate reţine si-
multan mai multe valori (formând o structură) însă fiecare valoare are unul dintre tipu-
rile enumerate mai sus.
2. Cum descriem algoritmii? Cum scriem programe? 23

• valoare – reprezintă ceea ce reţine variabila la un moment dat. În orice mo-


ment, o variabilă simplă reţine o singură valoare, conform tipului său (o varia-
bilă de tip numeric va reţine un număr, o variabilă de tip şir de caractere va re-
ţine un anumit text etc.).

2.2. Componentele schemelor logice şi ale limbajului


pseudocod
Înainte de a începe să rezolvăm probleme, să facem un scurt rezumat al modului de
descriere a instrucţiunilor unui anumit algoritm într-o schemă logică sau în limbaj pse-
udocod precum şi al modului de „trecere” a instrucţiunii în limbajul Pascal.
Orice algoritm trebuie să aibă un început şi un sfârşit (am putea descrie mai mulţi
algoritmi pe o pagină şi trebuie să putem face diferenţa între instrucţiunile lor):

Algoritm nume: Program nume;


{ declaraţii }
{ instrucţiuni } { instrucţiuni } Begin
{ instrucţiuni }
sfârşit algoritm End.

În limbajul Pascal trebuie să fim mai riguroşi (calculatorul nu subînţelege nimic).


Între numele programului şi cuvântul cheie Begin există o zonă de declaraţii unde
vom preciza numele tuturor variabilelor care urmează să fie utilizate, împreună cu ti-
pul lor.
Trebuie să putem introduce în algoritm date de intrare (adică să le citim). Pentru
aceasta avem nevoie de instrucţiunea de citire:

citeşte variabile Read(variabile)


sau
ReadLn(variabile)
Dacă se citesc valorile mai multor variabile într-o singură instrucţiune, se precizea-
ză numele variabilelor, separate prin virgulă (o listă de variabile). Diferenţa dintre
Read şi ReadLn constă în faptul că în cazul lui ReadLn citirea se termină după
tastarea unui Enter. De asemenea, ReadLn poate fi folosit şi fără parametri, caz în care
pentru ca execuţia programului să continue, trebuie să apăsăm tasta Enter.
Trebuie să vedem care sunt rezultatele la care a ajuns algoritmul nostru (adică să le
afişăm). Pentru aceasta avem nevoie de instrucţiunea de scriere:
24 2. Cum descriem algoritmii? Cum scriem programe?

scrie expresii Write(expresii)


sau
WriteLn(expresii)
Diferenţa dintre Write şi WriteLn constă în faptul că în cazul lui WriteLn scrie-
rea se termină cu saltul cursorului pe următoarea linie a ecranului.
Putem tipări conţinutul oricărei variabile simple, oricărei constante şi oricărei
expresii. Dacă doriţi, puteţi afişa şi texte dar să nu uitaţi că textul pe care trebuie să îl
afişeze instrucţiunea Write/WriteLn trebuie să fie delimitat între apostroafe, de
exemplu: 'Popescu Gigel'.
O altă instrucţiune extrem de frecvent utilizată este cea de atribuire, având ca scop
evaluarea unei expresii şi memorarea rezultatului într-o variabilă.

variabilă ← expresie variabilă := expresie

Această instrucţiune se execută astfel: mai întâi se evaluează expresie, apoi se me-
morează rezultatul evaluat în variabila variabilă.
Atunci când am analizat instrucţiunile de care avem neapărată nevoie pentru a de-
scrie algoritmi utili, am enumerat şi instrucţiunea de decizie. Iată cum precizăm într-
un algoritm că instrucţiunea de efectuat este o instrucţiune de decizie:

dacă condiţie atunci if condiţie then


instrucţiune instrucţiune
[altfel [else
instrucţiune] instrucţiune]
sfârşit dacă
Această instrucţiune se execută după cum urmează: se verifică dacă este îndeplinită
condiţia. Dacă DA, atunci în schema logică continuăm pe ramura DA, în pseudocod
executăm instrucţiunile precizate pe ramura atunci, iar în Pascal vom executa in-
strucţiunea precizată după cuvântul rezervat then. În cazul în care dorim să se execute
mai multe instrucţiuni, în Pascal le vom grupa între begin…end (instrucţiune compu-
să).
În cazul în care nu se îndeplineşte condiţia, vom merge pe traseul NU/altfel/
else. Este posibil ca, în cazul în care nu se îndeplineşte condiţia, să nu fie nevoie să
executăm nici o instrucţiune. În schema logică este obligatorie prezenţa ramurii NU a
unui bloc de decizie. În descrierea în pseudocod, ramura altfel poate să lipsească,
ca şi ramura else a unei instrucţiuni de decizie if în limbajul Pascal. Deci, prin utili-
zarea parantezelor drepte [ ] am precizat că în cadrul instrucţiunii, elementul respectiv
este opţional.
2. Cum descriem algoritmii? Cum scriem programe? 25

Pentru a vedea mai bine efectul diferitelor instrucţiuni, vom încerca să rezolvăm
probleme concrete, încercând să identificăm şi să descriem algoritmul pe care trebuie
să îl utilizăm în rezolvare. Apoi, vom vedea cum scriem, pe baza acestei descrieri,
textul sursă al programului Pascal.
Pentru fiecare problemă pe care ne vom propune să o rezolvăm vom avea un enunţ,
specificarea mai exactă a datelor de intrare şi a datelor de ieşire, câteva precizări su-
plimentare referitoare la problemă, precum şi eventuale restricţii pe care trebuie să le
impunem asupra rezolvării. În final, vom avea unul sau mai multe exemple de date de
intrare şi rezultate concrete, care trebuie să fie obţinute pe baza acestora într-o rezolva-
re corectă.
Exemplele date pentru fiecare problemă le vom utiliza atât pentru a înţelege mai
exact cerinţa problemei, cât şi pentru a testa corectitudinea programului pe care l-am
realizat.
În enunţurile problemelor de concurs, timpul de execuţie solicitat vă dă indicii des-
pre eficienţa minimă, exprimată ca viteză de lucru pe care trebuie să o aibă algoritmul
de rezolvare a problemei.

2.3. Probleme propuse


2.3.1. Calculator
Trebuie să îl ajutaţi pe frăţiorul vostru mai mic, în clasa a II-a, să îşi verifice tema de
la matematică. Tema lui constă din mai multe exerciţii de calcul aritmetic. La fiecare
exerciţiu se dau două numere întregi a şi b şi se cere să calculaţi suma, produsul,
diferenţa, câtul şi restul operaţiei de împărţire pe mulţimea numerelor întregi.

Date de intrare
Se dau două valori a şi b, ambele numere întregi care se introduc de la tastatură.

Date de ieşire
Se vor afişa 5 valori, reprezentând rezultatele celor cinci operaţii, în ordinea enumeră-
rii în enunţul problemei.

Restricţii şi precizări
• –100 ≤ a, b ≤ 100
• Datele de intrare sunt întotdeauna corecte
26 2. Cum descriem algoritmii? Cum scriem programe?

Exemple
Intrare Ieşire Explicaţie
a=7 10 21 4 2 1 Suma celor două valori este 10, produsul este 21,
b=3 diferenţa este 4, câtul împărţirii primei valori la cea
de a doua este 2, iar restul este 1.

2.3.2. Interschimbarea
Se dau două valori întregi reţinute în două variabile a şi b. Scrieţi un program care in-
terschimbă conţinuturile celor două variabile, apoi afişează rezultatul operaţiei de in-
terschimbare.

Date de intrare
Se dau două valori întregi, a şi b.

Date de ieşire
Se vor afişa valorile celor două variabile după interschimbare.

Restricţii şi precizări
• –100 ≤ a, b ≤ 100

Exemple
Intrare Ieşire Explicaţie
a=2 5 2 După interschimbare, variabila a va conţine
b=5 valoarea 5, iar variabila b valoarea 2.

2.3.3. Rezolvarea ecuaţiilor de gradul I


În matematică, rezolvarea multor probleme se reduce la rezolvarea unei ecuaţii de gra-
dul I. O asemenea ecuaţie are forma generală: a*x + b = 0, unde x este necunoscuta, a
este coeficientul necunoscutei, iar b este termenul liber. a, b, x sunt valori reale.
Scrieţi un program care determină valoarea necunoscutei sau afişează mesaje co-
respunzătoare în cazul în care ecuaţia nu poate fi rezolvată pentru valorile particulare
date.

Date de intrare
De la tastatură se vor citi a şi b, două valori reale.

Date de ieşire
• Dacă ecuaţia are soluţie, se va afişa valoarea necunoscutei x.
• Dacă ecuaţia admite o infinitate de soluţii, se va afişa mesajul 'Nedeterminare'.
• Dacă ecuaţia nu are nici o soluţie se va afişa mesajul 'Incompatibilitate'.
2. Cum descriem algoritmii? Cum scriem programe? 27

Restricţii şi precizări
• –100 ≤ a, b ≤ 100

Exemple
Intrare Ieşire Explicaţie
a=1 -1 Ecuaţia 1*x + 1 = 0 are soluţia x = –1.
b=1
Ecuaţia 0*x + 0 = 0 are o infinitate de
a=0 Nedeterminare
b=0 soluţii.

a=0 Incompatibilitate Ecuaţia 0*x + 1 = 0 nu are soluţii.


b=1

2.4. Soluţiile problemelor propuse

2.4.1. Calculator
Ştiind că datele de intrare sunt corecte, programul va prelua aceste date, apoi va calcu-
la pe baza lor rezultatele celor cinci operaţii şi, în final, va afişa rezultatele solicitate.

Schema logică pe baza căreia vom rezolva problema:


28 2. Cum descriem algoritmii? Cum scriem programe?

Descrierea în pseudocod a algoritmului de rezolvare a problemei:

Algoritm Socotitoare:
citeşte a,b
suma ← a + b { calculăm rezultatelor celor cinci operaţii }
produs ← a * b
diferenţa ← a – b
cât ← [a\b] { câtul împărţirii întregi }
rest ← rest[a\b] { restul împărţirii întregi }
{ afişăm rezultatelor solicitate in enunţ }
scrie suma,produs,diferenţa,cât,rest
sfârşit algoritm

Programul Pascal este următorul:

Program Socotitoare;
var a,b:Integer; { cele două valori de intrare }
suma:Integer; { suma celor două valori }
produs:Integer; { produsul celor două valori }
diferenta:Integer; { diferenţa dintre cele două valori }
cat:Integer; { câtul împărţirii întregi a celor două valori }
rest:Integer; { restul împărţirii întregi }
Begin
Write('Prima valoare: '); ReadLn(a); { citim datele de intrare }
Write('A doua valoare: '); ReadLn(b);
suma:=a+b; { calculăm rezultatele operaţiilor }
produs:=a*b;
diferenta:=a-b;
cat:=a div b;
rest:=a mod b;
{ afişăm rezultatele }
Write(suma,' ',produs,' ',diferenta,' ',cat,' ',rest)
End.

2.4.2. Interschimbarea
În contextul acestei probleme este potrivit să discutăm despre modul de funcţionare a
instrucţiunii de atribuire: atunci când în partea dreaptă a operatorului de atribuire apare
o variabilă (şi nu o expresie), rolul atribuirii este de a realiza o copiere a conţinutului
variabilei din membrul drept în variabila din membrul stâng. Vechiul conţinut al
variabilei din membrul stâng se va suprascrie („se pierde”). Deci, nu putem utiliza
secvenţa de instrucţiuni a ← b; b ← a deoarece astfel am pierde conţinutul variabilei a
la prima atribuire. A doua atribuire va suprascrie conţinutul variabilei b cu cel reţinut
2. Cum descriem algoritmii? Cum scriem programe? 29

în variabila a (care este tot conţinutul lui b). Deci, procedând astfel vom obţine două
valori identice.
Soluţia este de a utiliza o variabilă auxiliară aux şi de a interschimba conţinuturile
celor două variabile prin intermediul ei.

Această metodă de interschimbare a două variabile este utilă în multe probleme.


Aplicarea ei este posibilă cu o singură restricţie: toate cele trei variabile din algoritm
trebuie să fie de acelaşi tip (nu neapărat tip numeric).

Să „desenăm” acum Algoritm Interschimbare:


algoritmul descris anterior: citeşte a,b { citim datele de intrare }
{ conţinuturile iniţiale ale celor două variabile: }
scrie a,b
{ mutăm conţinutul variabilei a în variabila aux }
aux ← a
{ suprascriem conţinutul variabilei a }
a ← b { cu cel al variabilei b }
{ apoi conţinutul variabilei temporare (de fapt }
b ← aux { al lui a) trece în variabila b }
{ afişăm din nou conţinuturile celor două }
scrie a,b { variabile, în aceeaşi ordine }
sfârşit algoritm

2.4.3. Rezolvarea ecuaţiilor de gradul I


Pentru rezolvarea ecuaţiei de gradul I trecem prin următoarele etape:
1. Ajungem la forma a*x + b = 0.
2. Rescriem ecuaţia sub forma: a*x = –b.
3. Impărţim la a şi obţinem valoarea necunoscutei: x ← –b/a

Apare însă o problemă: nu avem voie să executăm o împărţire la zero şi s-ar putea
ca valoarea variabilei a să fie 0. În programare, dacă intenţionăm o împărţire cu 0,
mediul de programare ne avertizează cu un mesaj de eroare: Division by zero
care trebuie evitată, deoarece este considerată o eroare fatală în execuţia programului
şi programul se închide de la sine.
Să „desenăm” şi acest algoritm pentru o mai bună vizualizare a ordinii în care se
execută instrucţiunile.
30 2. Cum descriem algoritmii? Cum scriem programe?

Algoritmul descris în pseudocod este următorul:

Algoritm Ecuaţia_de_gradul_întâi;
citeşte a,b { citim datele de intrare }
dacă a = 0 atunci { dacă nu avem soluţie unică }
{ determinăm dacă avem o infinitate de soluţii sau nu avem deloc soluţie }
dacă b ≠ 0 atunci
scrie 'Nedeterminare'
altfel
scrie 'Incompatibilitate'
sfârşit dacă
altfel { dacă avem o soluţie unică }
x ← -b/a
scrie 'Solutia este ',x
sfârşit dacă
sfârşit algoritm

S-ar putea să vă placă și