Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
STRUCTURI DE CONTROL
Structura liniara
Instructiunea de atribuire
Fiind poate cea mai importanta instructiune a oricarui limbaj de determinare cel mai mic element dintr-un sir de numere reale.
Pentru a determina minimul a n numere procedam astfel: consideram primul numar minim si pana la proba contrarie, el ramane minimul. Daca, insa gasim un alt numar mai mic, atunci acesta e considerat minimul. Facem asa pana la ultimul numar. Deci, avand n numere h1, h2, . , hn, algoritmul se poate scrie in pseudocod astfel:
detrminare_minim (n, h [ 1 . n] ) inseamna
inceput
i : 1;
minim := h [ i ] ;
atat timp cat i < n executa
inceput
daca h [ i ] < minim atunci
minim := h [ i ]
astfel i := i +1
sfarsit
sfarsit
Pentru a vedea cum functioneaza atribuirea pe un caz concret, sa consideram o ecuatie de gradul I, scrisa sub forma ax+b=c. Solutia ei este x= (c-b)/a, cu conditia ca sa fie nenul:
program RezolvareEcuatie;
var a, b, c, x: Real;
begin
Write ('Dati a, b, c : ') ReadLn (a, b, c);
x : = (c - b) / a
WriteLn ('Solutia este : x=', x:7:3);
ReadLn
end.
Iata ca formula x=(c-b) / a devine (in program) instructiune de atribuire x:=(c - b) / a (apare : = in loc de =).
Exemplu:
Begin
ReadLn (z);
x : =2; y : =3;
WriteLn ('Suma este : ', x+y+z)
end
Instructiunile compuse se folosesc mai ales in cadrul unor instructiuni de control structurate precum IF, WHILE etc.
Dupa cum am aratat in capitolul precedent, chiar si partea operativa a unui program in Pascal este o instructiune compusa, daca se termina cu . (punct).
Instructiunea de decizie IF
Necesitate
Sa consideram problema determinarii perimetrului unui triunghi cu lungimile laturilor a, b si c. Calculul perimetrului este simplu, dar se pune intrebarea: intotdeauna trei numere reale pot fi lungimile laturilor unui triunghi? Desigur ca nu; in primul rand ele trebuie sa fie strict pozitive, in al doilea rand trebuie ca fiecare din ele sa fie strict mai mic decat suma celorlalte doua. Acest lucru nu poate fi evidentiat cu simpla instructiune de atribuire. De aceea e necesara instructiunea if. Ea este reprezentarea fireasca a structurii decizionale, in limbajul Pascal.
Sintaxa
Instructiunea if are doua forme. In prima forma, instructiunea are doua ramuri:
if cond then
instr1
else
instr2
Cea de a doua forma este fara ramura: else instr2:
if cond then
instr1
In cele de mai sus, cond este o conditie (expresie booleana), adica:
fie o variabila booleana, care poate avea una din valorile True sau False;
fie o expresie booleana, de exemplu (e1 and (not e2)) or e3, unde e1, e2, e3 sunt variabile sau constante booleene;
fie o expresie booleana relationala, de genul x<y, x>=y, unde x si y sunt variabile de acelasi tip;
fie o expresie booleana mixta, de exemplu (x<y) and (e1 or (z=t) and True).
Diagrama de sintaxa este:
expresie booleana
instructiunea
IF
Semantica
Semantica instructiunii IF este urmatoarea: se determin ce valoare de adevar are expresia booleana con. Daca ea este True, atunci se executa instructiunea instr1, dupa care se trece la instructiunea ce ar urma dupa intreaga structura if-then-else. Cand cond este, insa, False, atunci se executa, in cazul in care exista, instructiunea instr2, apoi se trece dupa structura if-then-else. Asadar, se executa fie instr1, fie, daca exista, instr2, in nici un caz ambele . Deci instr2 nu exista, iar cond=true, atunci nu se executa nimic, iar programul continua cu instructiunea de dupa ansamblu if-then-else.
Erori frecvente
Printre cele mai intalnite erori legate de instructiunea if sunt:
Se pune : = in loc de =, ca in if a : =0 then WriteLn ('Ec nu e de gr 2'). Niciodata nu vom avea : = intr-o conditie dintr-un if, deoarece acest grup de simboluri reprezinta instructiunea de atribuire!
Se pune ; inainte de else, ca mai jos:
if x = y then WriteLn ('Egalitate !') ;
else WriteLn ('Diferenta !')
Este mare greseala, deoarece simbolul ; separa doua instructiuni, dar cuvantul else o parte componenta a instructiunii if-then-else.
Se pune, gresit, punct si virgula dupa then, ceea ce este interpretat ca fiind o instructiune vida, pentru if, urmata de o alta instructiune: if cond then ; instr.
Se pune o conditie suplimentara, inutila, ca mai jos:
if x then
instr1
else x = y
instr2
Evident, daca x nu mai mic decat y, va fi mai mare sau egal, deci nu trebuie precizat si, de fapt, nici nu este corect sintactic!
Se foloseste cuvantul do in loc de then, ca in: if cond do instr1
Instructiunea de selectie multipla CASE
O familie de tineri casatoriti doreste sa-i cumpere noului nascut ceva de imbracat, pentru atunci cnd copilul va fi ceva mai maricel. El zice:"daca e fata ii luam o fustita, iar daca e baiat o pereche de pantalonasi."Aceasta problema se poate solutiona cu ajutorul instructiunii de decizie if-then-else. Dar ea intreaba:"daca sunt doua fetite gemene sau doi baieti gemeni sau chiar o fetita si un baietel gemeni?". Ei bine, problema se complica, asa incat trebuie prevazute mai mult de doua cazuri. Sotii s-ar putea folosi de o descriere de genul:
In caz ca noul nascut este
o fata: cumparam o fustita;
un baiat: cumparam o pereche de pantalonasi;
doua fete: cumparam doua fustite;
doi baieti: cumparam doua perechi de pantalonasi;
o fata si un baiat: cumparam o fustita si o pereche de pantalonasi;
gata;
Dar e posibil sa apara pe lume trei gemeni sau patru, doua fete si doi baieti, asa incat cei doi vor cumpara scutece, in orice alt caz:
In caz ca noul nascut este
o fata: cumparam o fustita;
un baiat: cumparam o pereche de pantalonasi;
doua fete: cumparam doua fustite;
doi baieti: cumparam doua perechi de pantalonasi;
o fata si un baiat: cumparam o fustita si o pereche de pantalonasi;
altfel cumparam scutece
gata;
Aceasta problema si altele asemanatoare sunt solutionate de instructiunea de selectie multipla: CASE.
Schema logica:
instr caz Expresie
ordinala
instructiunea
CASE
Semantica
Se determina valoarea expresiei selector si se executa instructiunea sau setul de instructiuni corespunzatoare valorii; in cazul in care nu-i corespunde nici o instructiune, atunci se executa, daca exista, instructiunea de pe ramura else.
Instructiunea repetitiva WHILE
Necesitate
Repetitia unei secvente este de multe ori necesara in programare. Acest lucru s-ar putea realiza cu o instructiune de salt.Instructiunea de salt este marele dusman al programarii structurate, motiv pentru care avem nevoie de instructiuni repetitive. O astfel de instructiune este instructiunea WHILE.
Sintaxa
Aceasta instructiune are forma urmatoare:
instr
While conditie do
Instructiunea repetitiva cu contor FOR
Necesitate
Cand vrem sa calculam o suma, de pilda: s=1+3+5+7+..+2n-1, scriem astfel:
s:=0; i:=1;
while i do begin s:=s+2*i-1; i:=i+1 end.
Sintaxa
Instructiunea FOR are doua forme:
Cu contorul in crestere:
instr
For v:=e1 to e2 do
Cu contorul in descrestere:
For v:=e1 downto e2 do instr
Diagrama de sintaxa este:
identificator
instructiunea
FOR
Schema logica asociata instructiunii FOR:
DA NU
Instructiunea repetitiva cu test final REPEAT
Necesitate
De multe ori este necesar ce intr-un ciclu sa se testeze conditia de iesire dupa executarea instructiunilor ce compun ciclul. De pilda, daca vrem sa deplasam pe ecram o bila (utilizand patru taste), pana la actionarea tastei 's', vom scrie ceva de genul:
Repeta
Misca bila cu tastele corespunzatoare celor patru sensuri
Pana cand tasta apasata este 's'.
Sintaxa
Instructiunea repetitiva are urmatoarea forma:
repeat
instr1;
instr2;
.
instrn
until cond.
Semantica
Sensul acestei instructiuni este: repeta instructiunile instr1,, instrn, pana cand este indeplinita conditia cond. Instructiunile se executa cel putin o data.
Procedurile Break si Continue
1.Break
Termina o instructiune for while ori repeat. Determina iesirea imediata din cel mai apropiat ciclu in care se afla. Este similara unui salt catre prima instructiune de dupa ciclu.
var x:integer;
begin
while true do
begin
readln(x);
if x=0 then break;
writeln(x);
end
end.
2.Continue
Aceasta procedura continua o instructiune for while ori repeat. Cauzeaza trecerea imediata la o noua iteratie in cadrul celei mai apropiate instructiuni for while sau repeat
var c:char;
begin
for c:='a' to 'z' do
if (c='a') or (c='e') or (c='i') or (c='o') or (c='u') or (c='y')
then continue
else write(c);
end.
Instructiunea de salt neconditionat GoTo
Sintaxa acestei instructiuni este: GoTo eticheta.
Efectul instructiunii GoTo este continuarea imediata si neconditionata a programului cu instructiunea etichetata. Sintaxa unei instructiuni etichetate este: eticheta: instructiune.
Declararea etichetelor este descrisa de diagrama urmatoare:
Eticheta
declaratie
eticheta
for i:=1 to 10 do
begin
if i=5 then goto 10;
else write(i);
end;
10: write('-', i*i).
Aceasta secventa afiseaza: 1234-25.
Copyright © 2024 - Toate drepturile rezervate