Structurile de control fundamentale

Aceste structuri se referă la modalitățile în care se pot înlănțui instrucțiunile dintr-un program, deci în care se transmite "controlul" de la o instrucțiune la alta în timpul executării programului. Conform "teoremei de structură", sunt suficiente trei astfel de "structuri de control":
 

1. Structura secvențială

În mod "natural", se consideră că instrucțiunile se execută în ordinea în care acestea figurează în program. Înlănțuirea instrucțiunilor (transmiterea "controlului" de la o instrucțiune la alta) se face, în acest caz, conform schemei logice din figura 1.
 



În pseudocod, aceeași secvență de program se scrie astfel:

<instrucțiunea_1>
<instrucțiunea_2>
....
<instrucțiunea_n>

Există, deci, un număr oarecare (n) de instrucțiuni, care se execută una dupa alta, în ordinea în care sunt scrise în program.

Toate exemplele de programe date în capitolele și secțiunile anterioare au structura secvențială.
 

2. Structura alternativă (condițională, de decizie)

Un fragment de program are structura alternativă (numită și structură condițională sau de decizie), atunci când se alege una din două căi posibile, în funcție de modul în care este satisfăcută sau nu o anumită condiție. Schema logică a structurii de control alternative este dată în figura 2.

În această schemă logică, Condiție este o expresie booleană. Executarea acestui fragment de program decurge astfel: se verifică mai întâi dacă este satisfăcută condiția. Dacă ea este satisfăcută, deci expresia Condiție are valoarea true, se execută Instrucțiunea 1, iar în caz contrar se execută Instrucțiunea 2.

In pseudocod, acest fragment de program se scrie astfel:

     Dacă <condiție>
      atunci <instrucțiunea_1>
      altfel <instrucțiunea_2>
    Sfarșit_dacă

În unele convenții de pseudocod, în loc de Instrucțiunea_1 și Instructiunea_2 pot fi puse secvențe de instrucțiuni.

Se observă că există o asemănare între instrucțiunea alternativă și expresia condițională. În ambele cazuri se verifică dacă este satisfacută o condiție și - în funcție de rezultatul obtinut - se alege una din două variante posibile. Deosebirea este următoarea:
    - în cazul expresiei condiționale se alege una din cele două expresii conținute în aceasta, iar rezultatul obținut este valoarea  expresiei astfel alese;
    - în cazul structurii de control alternative se alege una din cele doua instrucțiuni conținute în această structură; instrucțiunea astfel aleasă este executată, iar rezultatul obținut este efectul (lateral) produs de executarea acestei instrucțiuni.

3. Structura repetitivă (ciclu, buclă)

În cazul structurii de control repetitive, o instrucțiune sau o secvență de instrucțiuni se repetă cât timp este satisfacută o anumită condiție. Structura repetitivă fundamentală, acceptată în teoria programării structurate, este cea de ciclu cu test inițial. Schema logică a acestei structuri de control este dată în figura 3.

Executarea acestei structuri are loc astfel:
    1. se evaluează expresia booleană care reprezintă Condiția;
    2. dacă valoarea acestei expresii este true, deci condiția este satisfacută, se merge pe ramura DA și se executaă instrucțiunea din corpul ciclului, după care se trece la punctul 1;
    3. altfel (deci dacă condiția nu este satisfacută) se merge pe ramura NU și se iese din ciclu.

Se observă, deci, că se va executa instrucțiunea în mod repetat, cât timp este satisfăcută condiția. În pseudocod, această structură de control se programează astfel:

    cât_timp <condiție> execută
       <instrucțiune>
    sfârșit_ciclu

În unele versiuni de pseudocod, în loc de o singură <instrucțiune> se poate pune o secvență de instrucțiuni.

Deși, din punct de vedere al teoriei programării structurate, ciclul cu test inițial este suficient ca structură repetitivă, în multe limbaje de programare (inclusiv Java), din motive de comoditate a programării se admite și o a doua formă de astfel de structură, numită ciclu cu test final. Schema logică a acestui ciclu este dată în figura 4.

Se observă că, în această schemă logică, executarea instrucțiunii se repetă, ca și în cazul ciclului precedent, cât timp este satisfacută condiția.

Deosebirea dintre cele două forme de cicluri este că, în ciclul cu test inițial, condiția este evaluată înainte de a se executa instrucțiunea din corpul ciclului, în timp ce în ciclul cu test final evaluarea condiției se face după ce instrucțiunea a fost deja executată. Aceasta este o deosebire importantă, deoarece, în cazul ciclului cu test initial, este posibil ca instrucțiunea să nu se execute niciodată (dacă chiar de la prima evaluare condiția nu este satisfacută), în timp ce la ciclul cu test final instrucțiunea din corpul ciclului va fi executată cel puțin o dată. Așa dar, ciclul cu test final poate fi înlocuit prin unul echivalent cu test inițial, dar nu și invers. Iată dece, în teoria programării structurate, ciclul cu test inițial este considerat ca structură de control fundamentală, în timp ce cel cu test final este o structură de control admisă, dar nu fundamentală.

În pseudocod, ciclul cu test final reprezentat prin schema logică din figura 4 se scrie sub forma generală:

    execută
        <instrucțiune>
    cât_timp <condiție>

În unele limbaje (de exemplu în Pascal) pentru ciclul cu test final se adoptă o schemă logică în care singura deosebire față de cea din figura 4 este doar prin faptul că cele două ramuri DA și NU iși schimbă locurile între ele, ceeace în pseudocod se scrie sub forma:

    execută
       <instrucțiune>
    până_când <condiție>

În acest caz, instrucțiunea din corpul ciclului se va repeta cât timp NU este satisfacuta condiția, deci până când se va constata pentru prima oară că ea este satisfăcută.

În ambele cazuri, în unele variante de pseudocod instrucțiunea din corpul ciclului poate fi înlocuită printr-o secvența de instrucțiuni. Dacă se are în vedere utilizarea limbajului Java, utilizarea unei secvențe nu este necesară, deoarece ea se poate înlocui printr-o singură instrucțiune compusă, așa cum se va arăta ulterior.

Din examinarea structurilor de control prezentate în acest capitol, putem constata o proprietate importantă: schemele logice ale tuturor structurilor de control admise de metoda progrămarii structurate au fiecare un singur punct de intrare și un singur punct de ieșire. Datorită acestei proprietăți, ele pot fi folosite la elaborarea unor programe complexe prin tehnica rafinărilor succesive, așa cum se va arăta în secțiunea următoare.



© Copyright 2000 - Severin BUMBARU, Universitatea "Dunărea de Jos" din Galați