Iniţiere în gîndirea algoritmică - tex.tuiasi.ro. dr. mat. Valeria... · unei structuri...

14
PRELEGEREA III PROGRAMAREA CALCULATOARELOR ŞI LIMBAJE DE PROGRAMARE Iniţiere în gîndirea algoritmică I. Clasificarea schemelor logice - continuare c) După gradul de complexitate, schemele logice se clasifică în: c1) scheme logice fără proceduri; c2) scheme logice cu proceduri. c1) Schemele logice fără proceduri sînt scheme logice de program care nu conţin structuri de tip procedură. Acestea se referă la probleme simple sau sînt întocmite de programatori cu o experienţă redusă în acest domeniu. Exemplu 5. Fie u şi v doi vectori cu aceeaşi dimensiune. Să se determine: a) produsul scalar al celor doi vectori; b) norma vectorului u ; c) norma vectorului v . Deocamdată pentru problemă se reprezintă două rezolvări, urmînd ca, ulterior, să se indice şi altele. Fie notaţiile PS, NU şi NV pentru produsul scalar şi respectiv normele celor doi vectori. Cu I se notează variabila care va marca poziţia unei componente, fie în vectorul u , fie în vectorul v . Deci, I va lua pe rînd valorile 1, 2, …, n. Se ştie că: PS = = n I I I v u 1 ; NU = = n I I u 1 2 ; NV = = n I I v 1 2 . Componenţa formulelor implică, într-o tratare pe puncte a problemei, construirea a trei structuri repetitive cu un număr cunoscut de paşi sau într-o tratare cumulată a punctelor a) - c) a uneia singure. Citeşte PS= 0 NU = 0 NV = 0 I = 1 PS=PS+u I v I 2

Transcript of Iniţiere în gîndirea algoritmică - tex.tuiasi.ro. dr. mat. Valeria... · unei structuri...

PRELEGEREA III

PROGRAMAREA CALCULATOARELOR ŞI LIMBAJE DE PROGRAMARE

Iniţiere în gîndirea algoritmică

I. Clasificarea schemelor logice - continuarec) După gradul de complexitate, schemele logice se clasifică în:

c1) scheme logice fără proceduri;c2) scheme logice cu proceduri.

c1) Schemele logice fără proceduri sînt scheme logice de program care nu conţin structuri de tip procedură. Acestea se referă la probleme simple sau sînt întocmite de programatori cu o experienţă redusă în acest domeniu.Exemplu 5. Fie u şi v doi vectori cu aceeaşi dimensiune. Să se determine: a) produsul scalar al celor doi vectori; b) norma vectorului u ; c) norma vectorului v .Deocamdată pentru problemă se reprezintă două rezolvări, urmînd ca, ulterior, să se indice şi altele.Fie notaţiile PS, NU şi NV pentru produsul scalar şi respectiv normele celor doi vectori. Cu I se notează variabila care va marca poziţia unei componente, fie în vectorul u , fie în vectorul v . Deci, I va lua pe rînd valorile 1, 2, …, n.

Se ştie că: PS = ∑=

n

III vu

1

; NU = ∑=

n

IIu

1

2 ; NV = ∑=

n

IIv

1

2 .

Componenţa formulelor implică, într-o tratare pe puncte a problemei, construirea a trei structuri repetitive cu un număr cunoscut de paşi sau într-o tratare cumulată a punctelor a) - c) a uneia singure.

Citeşte

PS= 0

NU = 0

NV = 0

I = 1

PS=PS+uI vI

2

Figura 3.1.1

c2) Schemele logice cu proceduri sînt schemele logice care conţin, pe lîngă structurile de bază discutate pînă în prezent, una sau mai multe structuri de tip procedură şi operaţii de intrare/ieşire. Cu toate că întocmirea lor cere din partea programatorului experienţă, totuşi ele se recomandă chiar şi în rezolvarea unor probleme simple sau în cazul programatorilor începători. Cu atît mai mult, acestea se impun în cazul problemelor dificile pentru că, pe de o parte evidenţiază componentele mari ce intervin în analiza acestora şi fixează părţile complexe ale lor prin apeluri de procedură iar, pe de alta facilitează lucru în echipă. Schema logică cu proceduri se defineşte printr-un ansamblu format dintr-o schemă logică de program şi una sau mai multe structuri de tip procedură. Schema logică care apelează una sau mai multe proceduri se numeşte schema logică principală sau apelantă, iar structura de tip procedură apare sub denumirea de schemă logică apelată. Cu alte cuvinte, schema logică cu proceduri se defineşte printr-un ansamblu format dintr-o schemă logică apelantă şi una sau mai multe scheme logice apelate. Deci, tratarea unei proceduri se realizează din două unghiuri:- la nivel funcţional, ca o componentă a unei scheme logice principale, prin care se descrie un apel de procedură, apel simbolizat grafic printr-un bloc de tipul 7 (vezi, secţiunea 1.2).- la nivel structural, ca o structură de bază de tip procedură (descrisă în secţiunea 1.4.3).La apelul unei proceduri se realizează următoarele operatii:- parametri actuali vor înlocui parametri formali;- procedura preia datele furnizate de schema logică apelantă. Nu toţi parametrilor actuali sînt furnizori de date pentru procedură;- se execută procedura în totalitate. Datelor de intrare primite din schema logică principală li se adaugă şi cele declarate în procedura activată, atunci cînd este cazul;- se dezactivează procedura;- se revine în schema logică principală, la blocul care urmează imediat apelul de procedură. Rezultatele caculate de procedură se transmit prin intermediul variabililor, din lista parametrilor

2

NU = NU + uI2

NV = NV + vI2

I = I + 1 I ≤ n 2

NUNU =NVNV =

Scrie PS,Nu,NV

Stop

actuali, pregătite în acest scop. Între cele două categorii de parametri trebuie să existe o corespondenţă de număr, tip, loc şi dimensiune. Orice tip de neconcordanţă declanşează eroare în execuţia programului corespunzător, indiferent de limbajul de programare utilizat în codificarea acestuia. Datele furnizate de procedură pot deveni, în continuare, date de ieşire, date intermediare sau chiar date de intrare pentru aceeaşi procedură sau nu.Grafic, legătura dintre schema logică apelantă şi o procedură se prezintă în figura 3.1.2. În prima apelare a procedurii P intervin parametri actuali PA1, PA2, …, PAn, iar în a doua PB1, PB2, …, PBn. Parametrii formali sînt desemnaţi prin PF1, PF2, …, PFn. Linia punctată marchează “legătura” subînţeleasă între cele două tipuri de schemă logică.

Figura 3.1.2

Observaţie. În descrierea unei proceduri se poate face apel la alte proceduri. Numele procedurii face legătura între o schemă logică apelantă şi una apelată sau între două scheme logice apelate. Acesta este fixat de către programator, după regulile furnizate de limbajul de programare utilizat în codificarea variabililor (vezi, secţiunea 1.1). Contextul în care se impune utilizarea procedurilor în rezolvarea unei probleme precum şi o serie de reguli strict necesare în utilizarea procedurilor au fost făcute deja în secţiunea 1.2, punctul 7).Exemplu 6. Fie u şi v doi vectori cu aceeaşi dimensiune n. Construind o procedură care determină produsul scalar pentru doi vectori formali x şi y de dimensiune m, să se determine: a) produsul scalar al celor doi vectori; b) norma vectorului u ; c) norma vectorului v .

Procedura cerută în problemă se desemnează simbolic cu numele PRODS şi are ca parametri formali următoarele entităţi: dimensiunea vectorilor x şi y , vectorul x , vectorul y şi produsul scalar al celor doi vectori, cu notaţia PS. În procedura PRODS apare succesiunea logică a operaţiilor de aflare a produsului scalar pentru vectorii fictivi x şi y , a căror componente sînt stocate într-o zonă specială din memoria calculatorului, desemnată prin stivă. Cum problema se rezolvă în această fază doar formal, din procedură lipsesc blocurile de intrare /ieşire, fapt care poate fi evidenţiat în majoritatea procedurilor.

Pentru aflarea valorii lui PS avem : PS = ∑=

m

III yx

1

.

3

P(PA1,...,P

P(PB1,...,P

P(PF1, ...,

Stop

Simbolizarea grafică a acestei formule se face printr-o structură repetitivă cu m paşi.Procedura PRODS este chemată în schema logică principală de 3 ori, cu următoarele liste

de parametri actuali:- n, u , v , PS pentru aflarea produsului scalar al vectorilor u şi v ;- n, u ,u , NU pentru aflarea normei vectorului u ;- n, v , v , NV pentru aflarea normei vectorului v .Notaţiile PS, NU şi NV au aceeaşi semnificaţie ca în exemplul de mai sus.Indifernt de conţinutul listei parametrilor actuali, un apel al procedurii PRODS determină

realizarea unui număr fix de tipuri de operaţii, iar valorile parametrilor actuali concretizează operaţiile de executat. Deci, în cadrul unui apel al procedurii PRODS se execută următoarele operaţii:

- parametrii actuali iau locul parametrilor formali;- cu datele primite se execută în totalitate procedura şi se determină o valoare adecvată

pentru produsul scalar;- dezactivarea procedurii la atingerea lui Stop; - revenirea în schema logică principală imediat după blocul care a generat apelul, cu

returnarea rezultatului calculat în procedură. Schema logică principală şi procedura PRODS se prezintă mai jos:

4

PRODUS(m,

P

,,PS)

PS = 0

I = 1

PS=PS+xI .yI

Start

Citeşte(n,,)

PRODUS(n,,PS)

PRODUS(n,,,NU)

Figura 3.1.3

Figura 3.1.4

5

I=I+1

Im

Stop

NU=NU

PRODUS(n,,

NV= NV

ScriePS,NU,N

Stop

Utilizarea procedurilor în rezolvarea problemelor oferă multe facilităţi în programare şi, în mod special, la lucru în echipă. În cele ce urmează, se enumeră cîteva dintre acestea :

- descrierea unei proceduri se face o singură dată, iar apelarea ei, în aceeaşi schemă logică sau în scheme logice diferite, poate să apară, ori de cîte ori este nevoie, cu valori diferite pentru parametri actuali;

- procedurile se elaborează independent de schemele logice care le apelează, iar elaborarea lor poate fi făcută de către diverşi programatori;

- utilizarea procedurilor constituie un mijloc de liniarizare şi de simplificare a schemei logice apelante, fapt care pe de o parte, uşurează citirea schemei logice apelante, iar pe de alta, marchează părţile dificile şi punctele cheie în rezolvarea unei probleme;

- codificarea procedurilor poate fi făcută în acelaşi limbaj de programare sau sau în limbaje de programare diferite.Observaţie. Majoritatea limbajelor de programare permit organizarea a două tipuri de subprograme pentru codificarea unei structuri de tip procedură:

- subprograme de tip procedură (procedure), utilizate în orice situaţie (indiferent de numărul valorilor returnate programului principal);

- subprograme de tip funcţie (function), care pot întoarce programului apelant cel mult o valoare. Vom vedea în capitolul următor că funcţia este singurul tip de subprogram utilizat în construcţia programelor C++ .

II. Procedee specifice schemelor logiceActivitatea de întocmire a unei scheme logice sau a unei simbolizări în limbajul pseudocod este partea cea mai dificilă în metodologia de realizare a unui program şi calificativul de bun programator este atribuit nu celui care are însuşite mai multe limbaje de programare, ci celui care are atît pregătirea de a indica pentru o problemă metoda de rezolvare adecvată, cît şi capacitatea de a analiza şi descompune algoritmul respectiv în acele operaţii care, executate de calculator, să conducă, după un număr finit de paşi, la obţinerea rezultatului scontat.În general, scrierea programului în orice limbaj de programare devine o muncă de rutină.Pe lîngă regulile menţionate pînă în prezent, activitatea de elaborare a unei scheme logice sau a unei simbolizări în limbajul pseudocod beneficiază de trei procedee specifice de a căror mînuire depinde corectitudinea acestora, şi anume:

- utilizarea contorului;- iniţializarea variabililor;- folosirea basculelor sau a comutatoarelor.

Deja, primele două procedee specifice au fost utilizate în explicarea şi exemplificarea noţiunei de structură repetitivă. 1. Contorul se găseşte în literatura de specialitate sub multe denumiri, cum ar fi: variabilă de control, variabilă de ciclare, numărător de paşi sau numărător de operaţii.Acesta face parte din lista variabililor intermediare şi este unul din elemntele necesare întocmirii unei structuri repetitive cu un număr cunoscut de paşi. Rolul unui contor este de a număra de cîte ori se trece printr-un grup de blocuri sau de cîte ori se execută un grup de operaţii. Valoarea contorului, la un moment dat, este un indicator cu care se stabileşte de cîte ori a fost executat un anumit grup de operaţii sau de cîte ori urmează să se execute, cu valori diverse pentru variabilile cu care se lucrează.De regulă, valorile pe care le primeşte contorul sînt crescătoare sau descrescătoare şi foarte rare sînt situaţiile cînd acestea alternează. Elementele definitorii ale contorului (valoare iniţială,

valoare finală, raţia sau valoarea pasului de variaţie) se stabilesc în funcţie de contextul de rezolvare al problemei şi determină complet lista de valori parcursă de contor.Utilizarea corectă a unui contor depinde de modul cum se răspunde la următoarele întrebări:

- care este numele contorului?- care sînt valoare iniţială, valoare finală şi raţia de variaţie?- ce rol are în schema logică sau în simbolizarea cu formulări standard?- care este grupul de operaţii sau de blocuri prin care se trece de un număr cunoscut de ori,

cu valori diferite pentru variabilele care se lucrează?Primele trei întrebări au răspunsuri simple şi care nu diferă prea mult de la o problemă la alta. De obicei pentru numele simbolic al contorului se foloseşte o notaţie de genul: i, j, k, l, i1, j1, etc.

La ultima întrebare, răspunsul depinde de metoda de rezolvare a problemei. În situaţia cînd se manevrează mai mulţi contori, numele de indentificare a acestora poate

fi sau nu acelaşi. De asemenea, pot fi coincidenţe şi pentru listele de valori corespunzătoare, însă, gestiuneaa elementelor definitorii ale unui contor trebuie făcută cu multă grijă, deoarece există cazuri cînd calculele se fac eronat sau cînd calculatorul este pus în situaţii nedeterminate. Grupul de operaţii, care se repetă de mai multe ori, trebuie să fie format, doar, din operaţii elementare şi anume, din cele specificate în paragraful 1.2. Adesea, pentru a ajunge la astfel de operaţii, programatorul trebuie să recurgă la diferite artificii de calcul, la soluţii întilnite în rezolvarea unor probleme de către alţi programatori şi, nu în ultimul rînd la proceduri rezolvate cu alte ocazii. În concluzie, răspunsurile la ultimile trei întrebări sînt esenţiale în mînuirea corectă a unui contor. Corectitudinea şi siguranţa utilizării unui contor fac posibilă elaborarea unei scheme logice sau a unei simbolizări în limbajul pseudocod, cu structuri repetitive cu un număr fix de paşi, fac posibilă reluarea de un număr cunoscut de ori a unei secvenţe de operaţii elementare, cu diverse valori pentru variabilele componente.2) Iniţializarea variabilelor este un alt procedeu specific activităţii de întocmire a schemelor logice şi este obligatoriu atunci cînd se operează, în cadrul unor structuri repetitive, cu formule prin care se evaluează expresii matematice, unde variabila din stânga semnului egal devine operand în dreapta semnului egal.Deci, acest procedeu este indispensabil în situaţiile în care se încearcă folosirea unei variabile în repetiţie, în interaţie, în dinamica sau în sensul de evoluţie. Iniţializarea variabililor se simbolizează prin blocuri de calcul al căror conţinut fixează valoarea iniţială a acestora.

De exemplu, dacă într-o structură repetitivă s-ar opera cu S = S + x2 sau P = P . x, fără să se cunoască valorile iniţiale ale lui S sau P din membrul al doilea, pentru un x dat, calculatorul ar fi pus într-o situaţie nedeterminată şi ar furniza rezultate imposibil de verificat. Deci, anterior structurii repetitive se impun blocuri de iniţializare de genul S=0 sau P=1. Acum la fiecare execuţie a celor două expresii din membrul al doilea se obţin valori concrete, valori care se atribuie variabililor din stînga semnului egal, adică lui S şi P. După cum se observă, noile valori se păstrează în locaţiile afectate operaţiilor de iniţializare, pierzîndu-se valorile memorate anterior.

Semnul = (atribuie, asignează) utilizat în contextul schemelor logice, are o interpretare mai largă decît cea dată semnului = (egal) în matematică. Această interpretare este legată de principiile de funcţionare ale unui computer, în sensul că semnificaţiei dată semnului egal în matematică i se adaugă aceea de a depozita valoarea obţinută, în locaţia de memorie afectată variabilei din stînga semnului egal. Notaţiile pentru semnul de atribuire diferă de la un limbaj de

2

programare la altul. De exemplu, în limbajul Pascal atribuirea se notează cu :=, iar egalitatea cu =, pe cînd în limbajele de tip C atribuirea se notează cu =, iar egalitatea cu ==.Pentru variabila x există mai multe alternative de a i se afecta o valoare, şi anume: prin operaţia de citire sau operaţia de iniţializare, prin execuţia unui procedură sau prin evaluarea unei expresii matematice.De asemenea, prin procedeul de iniţializare se fixează prima valoare a oricărui contor. Partea de început a unei structuri repetitive cu un număr cunoscut de paşi se rezumă la un bloc de iniţializare, unde contorului i se atribuie valoarea iniţială.3) Ultimul procedeu nu este specificat în literatura de specialitate şi foarte puţini programatori reuşesc să-l stăpînească şi să-l folosească corect în activitatea de rezolvare a unei probleme cu ajutorul calculatorului electonic. Un interes deosebit se acordă acestui procedeu în activitatea de programare structurată. Comutatorul sau bascula este o variabilă de lucru care poate primi două sau mai multe valori şi are rolul de a comuta sau de a bascula pe o valoare dinainte fixată atunci când se parcurge o anumită secvenţă de schemă logică sau de formulări în limbajul pseudocod.

În funcţie de numărul valorilor primite, comutatorii se clasifică în două categorii:- comutatori simpli sau bivalenţi;- comutatori multipli sau multivalenţi.

Unui comutator simplu i se atribuie numai două valori care reprezintă o logică bivalentă în rezolvarea unei probleme. Poziţionarea lui pe o valoare marchează parcurgerea de mai multe ori a unei anumite secvenţă de schemă logică sau de formulări în limbajul pseudocod. Poziţionarea este acceptată doar la început şi întrebarea “comutatorul are valoarea dată anterior?” pare în plus pînă când în anumite condiţii acesta comută pe altă valoare. Această comutare barează trecerea spre secvenţa de schemă logică sau de formulări în limbajul pseudocod executată anterior şi deschide o nouă trecere spre altă parte din reprezentarea respectivă. Un comutator multiplu are acelaşi efect ca un comutator simplu, numai că acesta poate comuta pe mai multe valori anterior precizate. Sigur că, fiecare comutare este precedată de întrebarea specificată între ghilimele în descrierea comutatorului simplu. În orice moment trebuie să existe un control riguros asupra valorilor afectate comutatorilor, în caz contrar utizarea lor constituie o sursă importantă de erori în rezolvarea unei probleme. Exemplu 7. Fie trei numere naturale N1, N2 şi N3. Să se specifice pentru fiecare număr calificativul de “admis” sau de “respins”, după cum numărul este sau nu un număr prim. Fie K variabila care contorizează numărul de divizori a unui număr natural oarecare N, care va fi înlocuit pe rând cu numerele N1, N2 sau N3 după cum bascula multiplă T va comuta pe 1, 2 sau 3. Cînd K are valoarea 2, numărul se consideră prim şi se afişează “admis “, în caz contrar se afişează “respins”.

3

Figura 3.2.1

4

III. Analiza corectitudinii schemelor logiceConstrucţiile făcute cu simboluri sau cu formulări standard în limbajul pseudocod nu oferă întodeauna certitudinea că o problemă este rezolvată corect.Pentru analiza corectitudinii unei scheme logice, ultimele cercetări evidenţiază instrumente matematice adecvate de formalizare, pentru care se poate utiliza calculatorul în aplicarea lor.De fapt, se poate discuta numai de o corectitudine parţială a rezolvării problemei, deoarece analiza corectitudinii unei scheme logice se referă doar la situaţia cînd acestea îşi încetează activitatea.Metoda utilizată în analiza corectitudinii unei scheme logice este una intuitivă şi constă în completarea unui tabel care conţine atît variabilile cu care se lucrează în problemă, precum şi istoricul valorilor fiecărei variabile.Completarea tabelului se realizează pentru un caz paricular al problemei care include toate posibilitaţile şi pentru care se ştie soluţia corectă. Prin parcurgerea sistematică a schemei logice de la început spre sfîrşit, urmînd săgeţile de la sursa către ţintă, în tabel se înscriu valorile ce se atribuie variabilelor cu care se lucrează. În finalul tabelului trebuie să apară soluţia cunoscută a problemei.În cazul cînd soluţia nu este corectă, rezultă că logica de rezolvare a problemei este eronată şi se impune refacerea schemei logice. În mod similar se procedează atunci cînd algoritmul de rezolvare al problemei se reprezintă prin formulări standard în limbajul pseudocod.Forma şi structura unui astfel de tabel se prezintă în figura 3.3.1.

Număr pas execuţie

V1 V2 ... Vn

Tabelul 3.3.1 Cel de al doilea procedeu are ca obiectiv nu verificarea corectitudinii schemei logice, ci cea a programului scris într-un anumit limbaj după această schemă logică. Însă, acest procedeu nu se recomandă începătorilor deoarece, în situaţia în care logica programului este greşită, traseul de reparare al erorii este mai lung, în sensul că trebuie să se refacă atît schema logică cît şi programul.Abordarea altor metode pentru analiza corectitudinii schemelor logice, care au la bază un suport matematic solid, nu poate fi făcută decât într-un cadru teoretic adecvat. Din acelaşi motiv, nici abordarea problemei corectitudinii totale nu este posibilă

Exemplu 8. Fie succesiunea de k numere reale: Z =( z1, z2, ..., zk). Să se afle valoarea şi poziţia elementului maxim. Elementul maxim se notează cu Max, iar poziţia acestuia cu p.

5

Figura 3.3.2

Tabelul este completat cu date ce se referă la şirul de numere: (-4, 0, 5, 7, 2). Soluţia corectă a problemei este: Max = 7 şi p = 4.

Număr pas execuţie

k z1 z2 z3 z4 z5 Max p i

0 5 -4 0 5 7 2 -4 1 2 1 5 -4 0 5 7 2 0 2 3 2 5 -4 0 5 7 2 5 3 4 3 5 -4 0 5 7 2 7 4 5 4 5 -4 0 5 7 2 7 4 6

Tabelul 3.3.2Ultimile valori înscrise pentru Max şi p în tabel sînt chiar 7 şi respectiv 4. Deci, problema

este rezolvată corect.

Citeşte k, Z

Max=z1

p=1

i=2

Max<zz

iMax=zi

p=i

i=i+1

ik1

1

Scrie Max,

Stop

6

IV. Reprezentarea algoritmilor în limbajul pseudocod

Formulări de bază în limbajul pseudocodUrmărirea unei scheme logice, precum şi delimitarea structurilor de bază dintr-o schemă logică, nu se face destul de uşor pentru o schema logică vastă care se întinde pe mai multe pagini de hârtie.Programatorii cu experienţă au renunţat la maniera grafică de realizare a unei scheme logice, înlocuind structurile de bază, prezentate în paragraful anterior, în construcţii sintactice standard sau, pe scurt, formulări standard.Scheletul formulărilor standard este concentrat pe cîteva cuvinte din limba engleză care, în această lucrare, au fost înlocuite prin texte adecvate din limba română.Formatul general de reprezentare a algoritmului de rezolvare al unei probleme în limbajul pseudocod este următorul:

(1) Start F1; F2; …; Fn stop., unde cu formulările standard Fi, i = 1, ... , n, se descriu operaţiile de intare/ieşire, apelurile de procedură şi structurile de bază prezentate anterior.Unei structuri liniare formată dintr-un bloc de calcul i se asociază o formulare standard de tipul: (2) variabila = expresie_matematică;.Dacă structura liniară conţine n blocuri de calcul, atunci formularea standard are următorul conţinut : (3) variabila_1 = expresie_ matematică_1; ...................................................................

variabila_n = expresie_matematică_n;Pentru cele două forme ale unei structuri alternative se utilizează formulările standard:

(4) dacă expresie_logică atunci F1 altfel F2; şi respectiv (5) dacă expresie_logică atunci F1; unde F1 şi F2 sînt formulări de bază de tipul (2) – (5).În general, o structură alternativă completă imbricată se reprezintă astfel:

(6) dacă expresie_logică_1 atunci F1 altfel dacă expresie_logică_2 atunci F2 altfel …altfel dacă expresie_logică_n atunci Fn altfel Fn+1; unde F1, F2, …, Fn+1

sînt formulări de bază de tipul (2) sau (3).Structura repetitivă cu un număr fix de paşi se codifică prin: (7) pentru c := vi cu pasul vr pînă_la vf repetă F;unde c, vi, vr şi vf reprezintă notaţiile pentru contor şi elementele specifice contorului: valoare iniţială, raţia şi respectiv valoarea finală, iar F este o formulare de tipul celor descrise anterior. Dacă raţia de variaţie a contorului este 1, atunci pasul se poate omite.

Formatul general al unei structuri repetitive cu precondiţie este următorul: (8) în_timp_ce expresie_logică repetă F; unde F are aceeaşi semnificaţie ca în

(7). F se reia în contexte de rezolvare diferite atîta timp cît expresia logică este adevărată. În situaţia cînd expresia logică este falsă se continuă cu formularea standard imediat următoare.

Structura repetitivă cu postcondiţie se poate înlocui prin: (9) repetă F pînă_cînd expresie_logică; unde F are aceaşi semnificaţie ca în (7). Acum, repetarea formulării de bază F se produce pînă cînd valoarea expresiei logice devine adevărată. Cu alte cuvinte, falsitatea expresiei logice permite să se intre în repetare, în caz contrar se continuă cu succesoarea formulării de tipul (9).Structura repetitivă cu condiţie internă nu are echivalent în mulţimea formulărilor standard, urmînd ca aceasta să fie transformată într-una cu precondiţie sau cu postcondiţie.

7

(10) nume_ procedură(listă_parametri actuali); rezolvă un apel de procedură, iar (11) Citeşte (listă_variabile_intrare); şi

(12) Scrie(listă_variabile-ieşire); descriu operaţiile de intrare/ieşire.Se observă că descrierea operaţiilor dintr-un algoritm de rezolvare al unei probleme trece

de la lucru pe verticală, în cazul schemelor logice, la lucru pe orizontală, în cazul construcţiilor sintactice utilizate în limbajul pseudocod. Pe lîngă faptul că o construcţie sintactică cu formulări standard nu ocupă mult loc, aceasta oferă şi alte avantaje, şi anume:

- lucrează cu un numar de formulări standard dinainte fixat;- formulările standard pot fi cuprinse una în alta fără ca vreuna să-şi piardă indentitatea;- permite rezolvarea problemei pe etape;- sintaxa formulărilor standard este mult mai apropiată de cea a instrucţiunilor

componente limbajelor de programare evoluate (PASCAL, C, C++, etc.);erorile de programare apar mai rar.Exemplu 1. Fie expresiile: E1 = a2 + (b + c)i

E2 = (a + b + c3)5 – 5abcE3 = (E1 –E2)j - a2i + b/5.

Să se determine E1, E2 şi E3, ştiind că a, b, c, i şi j primesc ca valori numere reale.Modul de reprezentare al algoritmului de rezolvare a acestei probleme este următorul:

Start Citeşte(a, b, c, i, j);E1 = a2 + (b + c)i; Scrie(E1);E2 = (a + b + c3)5 – 5abc; Scrie( E2);E3 = (E1 –E2)j - a2i + b/5; Scrie(E3);

Stop.Spre deosebire de schema logică prezentată în cursul anterior, aici se adaugă după

evaluarea unei expresii aritmetice comanda de scriere a valorii obţinute.Exemplu 2. Să se determine:

F =

≤+≤>+++

>>++−

.0,7

;00)/()5(

;00),/()5(

3

3

3

yxdacăxy

yşiyxdacăyxyx

yşiyxdacăyxyx

Etapele care se parcurg în aflarea valorii lui F sînt:- citirea valorilor variabililor x şi y;- determinarea lui F în funcţie de condiţiile impuse în enunţul problemei;- scrierea valorii lui F.Algoritmului de rezolvare a acestei probleme se reprezintî astfel:Start

Citeşte(x, y);Dacă x + y > 0 atunci

Dacă y > 0 atunci F = (x3 – 5y)/(x + y) altfel F = (x3 + 5y)/(x + y)

altfel F = 7xy3;Scrie(F);

Stop.

8

Pentru indentificarea corectă a celor două condiţii se recomandă ca scrierea lor să se facă pe mai multe rînduri, astfel ca alinierea cuvintelor “atunci” şi “altfel” să se producă din aceeaşi coloană după principiul de grupare “ultimul atunci - cu primul altfel”. O remarcă similară a fost făcută la sfîrşitul exemplului anterior pentru perechea de paranteze Start - Stop.

9