Algoritmul proiectat pentru rezolvarea unei anumite probleme trebuie implementat într-un limbaj de programare; prelucrarea datelor se realizează cu ajutorul instrucțiunilor. Instrucțiunea descrie un proces de prelucrare pe care un calculator îl poate executa. O instrucțiune este o construcție validă (care respectă sintaxa limbajului) urmata de ; (punct si virgulă). Ordinea în care se execută instrucțiunile unui program definește așa-numita structură de control a programului.
Limbajele moderne sunt alcătuite pe principiile programării structurate. Conform lui C. Bohm și G. Jacopini, orice algoritm poate fi realizat prin combinarea a trei structuri fundamentale:
· structura secvențială
· structura alternativă (de decizie, de selecție)
· structura repetitivă (ciclică)
IMPLEMENTAREA STRUCTURII SECVENȚIALE
Structura secvențială este o înșiruire de secvențe de prelucrare (instrucțiuni), plasate una după alta, în ordinea în care se dorește execuția acestora.
Instructiunea vidă
Sintaxa: ;
Instructiunea vida nu are nici un efect. Se utilizeaza in constructii in care se cere prezenta unei instructiuni, dar nu se executa nimic (de obicei, in instructiunile repetitive).
Sintaxa: ;
Instructiunea vida nu are nici un efect. Se utilizeaza in constructii in care se cere prezenta unei instructiuni, dar nu se executa nimic (de obicei, in instructiunile repetitive).
Exemple:
int a;
for (;;) {…}
int a;
for (;;) {…}
Instructiunea expresie
Sintaxa: expresie;
Exemple:
int b, a=9;
double c;
b=a+9;
cout<<a;
int b, a=9;
double c;
b=a+9;
cout<<a;
Instructiunea compusa (instructiunea bloc)
Sintaxa: { declaratii de variabile;
instr1;
instr2;
. . . . }
Intr-un bloc se pot declara si variabile care pot fi accesate doar in corpul blocului. Instructiunea bloc este utilizata in locurile in care este necesara prezenta unei singure instructiuni, insa procesul de calcul este mai complex, deci trebuie descris in mai multe secvente.
instr1;
instr2;
. . . . }
Intr-un bloc se pot declara si variabile care pot fi accesate doar in corpul blocului. Instructiunea bloc este utilizata in locurile in care este necesara prezenta unei singure instructiuni, insa procesul de calcul este mai complex, deci trebuie descris in mai multe secvente.
IMPLEMENTAREA STRUCTURII DE DECIZIE (ALTERNATIVE, DE SELECTIE)
Instructiunea if:
Sintaxa:
if (expresie)
instructiune1
[ else
instructiune2 ]
instructiune1
[ else
instructiune2 ]
Ramura else este optionala.
La intalnirea instructiunii if, se evalueaza expresie (care reprezinta o conditie) din paranteze. Daca valoarea expresiei este 1, sau diferita de 0 (conditia este indeplinita) se executa instructiune1; daca valoarea expresiei este 0 (conditia nu este indeplinita), se executa instructiune2. Deci, la un moment dat, se executa doar una dintre cele doua instructiuni: fie instructiune1, fie instructiune2. Dupa executia instructiunii if se trece la executia instructiunii care urmeaza acesteia.
La intalnirea instructiunii if, se evalueaza expresie (care reprezinta o conditie) din paranteze. Daca valoarea expresiei este 1, sau diferita de 0 (conditia este indeplinita) se executa instructiune1; daca valoarea expresiei este 0 (conditia nu este indeplinita), se executa instructiune2. Deci, la un moment dat, se executa doar una dintre cele doua instructiuni: fie instructiune1, fie instructiune2. Dupa executia instructiunii if se trece la executia instructiunii care urmeaza acesteia.
Observatii:
1. Instructiune1 si instructiune2 pot fi instructiuni compuse (blocuri), sau chiar alte instructiuni if (if-uri imbricate).
2. Deoarece instructiunea if testeaza valoarea numerica a expresiei (conditiei), este posibila prescurtarea: if (expresie), in loc de if (expresie != 0).
3. Deoarece ramura else a instructiunii if este optionala, in cazul in care aceasta este omisa din secventele if-else imbricate, se produce o ambiguitate. De obicei, ramura else se asociaza ultimei instructiuni if.
Exemplu:
1. Instructiune1 si instructiune2 pot fi instructiuni compuse (blocuri), sau chiar alte instructiuni if (if-uri imbricate).
2. Deoarece instructiunea if testeaza valoarea numerica a expresiei (conditiei), este posibila prescurtarea: if (expresie), in loc de if (expresie != 0).
3. Deoarece ramura else a instructiunii if este optionala, in cazul in care aceasta este omisa din secventele if-else imbricate, se produce o ambiguitate. De obicei, ramura else se asociaza ultimei instructiuni if.
Exemplu:
if (a*b!=0)
if (a>b)
z=a;
else z=b;
if (a>b)
z=a;
else z=b;
4. Pentru claritatea programelor sursa se recomanda alinierea instructiunilor prin utilizarea tabulatorului orizontal.
5. Deseori, apare constructia:
5. Deseori, apare constructia:
if (expresie1)
instructiune1;
else
if (expresie2)
instructiune2;
else
if (expresie3)
instructiune3;
. . . . . . . . .
else
instructiune_n;
Expresiile sunt evaluate in ordine; daca una dintre expresii are valoarea nenula, se executa instructiunea corespunzatoare si se termina intreaga inlantuire. Instructiunea n se executa in situatia in care nici una dintre expresiile 1,2,. . ., n-1 nu are valoarea nenula.
instructiune1;
else
if (expresie2)
instructiune2;
else
if (expresie3)
instructiune3;
. . . . . . . . .
else
instructiune_n;
Expresiile sunt evaluate in ordine; daca una dintre expresii are valoarea nenula, se executa instructiunea corespunzatoare si se termina intreaga inlantuire. Instructiunea n se executa in situatia in care nici una dintre expresiile 1,2,. . ., n-1 nu are valoarea nenula.
Instructiunea switch
In unele cazuri este necesara o decizie multipla speciala. Instructiunea switch permite acest lucru.
Sintaxa:
switch (expresie)
{
case expresie_const_1: instructiune_1;
[break;]
case expresie_const_2: instructiune_2;
[break;]
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
case expresie_const_n-1: instructiune_n-1;
[break;]
[ default: instructiune_n; ]
}
{
case expresie_const_1: instructiune_1;
[break;]
case expresie_const_2: instructiune_2;
[break;]
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
case expresie_const_n-1: instructiune_n-1;
[break;]
[ default: instructiune_n; ]
}
Este evaluata expresie (expresie aritmetica), iar valoarea ei este comparata cu valoarea expresiilor constante 1, 2, etc. (expresii constante=expresii care nu contin variabile). In situatia in care valoarea expresie este egala cu valoarea expr_const_k, se executa instructiunea corespunzatoare acelei ramuri (instructiune_k). Daca se intalneste instructiunea break, parcurgerea este intrerupta, deci se va trece la executia primei instructiuni de dupa switch. Daca nu este intalnita instructiunea break, parcurgerea continua. Break-ul cauzeaza deci, iesirea imediata din switch.
In cazul in care valoarea expresiei nu este gasita printre valorile expresiilor constante, se executa cazul marcat cu eticheta default (cand acesta exista). Expresiile expresie, expresie_const_1, expresie_const_2,etc., trebuie sa fie intregi.
În limbajul C există trei instrucțiuni repetitive, dintre care două cu test la început (while și for) și una cu test la sfârșit (do while). Instrucțiunile repetitive cu test la început plasează testul înaintea corpului, astfel corpul este parcurs numai dacă testul este trecut de la început. În cazul celor cu test la sfârșit, corpul este executat cel puțin o dată în orice condiții.
Instrucțiunile repetitive se mai numesc și cicluri sau bucle.
Exemplul următor citește numere de la tastatură, până când numărul tastat este mai mic sau egal cu 10.
Sintaxa instrucțiunii for:
- expresie_init constituie inițializarea buclei și se evaluează o singură dată.
- expresie_cond trebuie să fie de tip scalar și este evaluată înaintea fiecărei iterații. Valoarea acestei expresii este interpretată ca și condiție de rămânere în buclă.
- În interiorul buclei se realizează, la fiecare parcurgere, două operațiuni: se execută prelucrările specificate prin instrucțiune, după care se evaluează expresie_act.
Oricare dintre expresiile instrucțiunii for (sau chiar toate) pot să lipsească, dar delimitatorul ';' asociat trebuie să fie prezent.
Dacă lipsește expresie_cond, se consideră implicit că aceasta este tot timpul adevărată și deci bucla nu se va încheia niciodată. O astfel de buclă poate fi însă încheiată cu instrucțiunea break.
Prelucrările efectuate cu instrucțiunea for, pot fi descrise și cu ajutorul unei bucle while, care se aseamănă cu for prin faptul că este tot cu test la început. Secțiunea următoare este echivalentă cu instrucțiunea for a cărei sintaxă a fost prezentată mai sus:
In cazul in care valoarea expresiei nu este gasita printre valorile expresiilor constante, se executa cazul marcat cu eticheta default (cand acesta exista). Expresiile expresie, expresie_const_1, expresie_const_2,etc., trebuie sa fie intregi.
Iterații
Execuția repetată a unei prelucrări este folosită foarte frecvent în rezolvarea problemelor de cele mai diverse tipuri. Instrucțiunile repetitive care descriu astfel de prelucrări sunt alcătuite din două componente: Corpul instrucțiunii (care este alcătuit din instrucțiuni care se repetă) și Testul (pe baza căruia se stabilește dacă este sau nu necesară reluarea execuției corpului).În limbajul C există trei instrucțiuni repetitive, dintre care două cu test la început (while și for) și una cu test la sfârșit (do while). Instrucțiunile repetitive cu test la început plasează testul înaintea corpului, astfel corpul este parcurs numai dacă testul este trecut de la început. În cazul celor cu test la sfârșit, corpul este executat cel puțin o dată în orice condiții.
Instrucțiunile repetitive se mai numesc și cicluri sau bucle.
Instrucțiunea while
Această instrucțiune are următoarea sintaxă:while(expresie)
instrucțiune
Expresia poate fi de orice tip scalar. Instrucțiunea specifică prelucrările ce se efectuează în corpul buclei și se repetă atâta timp cât expresia este adevărată, mai exact diferită de zero.Instrucțiunea do - while
Această instrucțiune are următoarea sintaxădo
instrucțiune
while(expresie);
Ea are rolul de a repeta instrucțiunea până când expresia este adevărată. Diferența față de instrucțiunea while constă în faptul că testul este plasat la sfârșitul buclei, deci instrucțiunea se execută cu siguranță cel puțin o dată, indiferent de valoarea expresiei.Exemplul următor citește numere de la tastatură, până când numărul tastat este mai mic sau egal cu 10.
#include <stdio.h>
int main()
{
char n;
do{
printf("\nTastați un număr < 10 ");
scanf("%d", &n);
}while(n>10);
}
Instrucțiunea for
Această instrucțiune are o formă generală care-i extinde mult domeniul de aplicare față de instrucțiunile de același tip existente în alte limbaje de programare. Este cea utilizată instrucțiune repetitivă, deoarece în afară de testul de rămânere în buclă, oferă două elemente necesare în majoritatea situațiilor: inițializare și actualizare.Sintaxa instrucțiunii for:
for(expresie_intopt;expresie_condopt;expresie_actopt)
instrucțiune
- expresie_init constituie inițializarea buclei și se evaluează o singură dată.
- expresie_cond trebuie să fie de tip scalar și este evaluată înaintea fiecărei iterații. Valoarea acestei expresii este interpretată ca și condiție de rămânere în buclă.
- În interiorul buclei se realizează, la fiecare parcurgere, două operațiuni: se execută prelucrările specificate prin instrucțiune, după care se evaluează expresie_act.
Oricare dintre expresiile instrucțiunii for (sau chiar toate) pot să lipsească, dar delimitatorul ';' asociat trebuie să fie prezent.
Dacă lipsește expresie_cond, se consideră implicit că aceasta este tot timpul adevărată și deci bucla nu se va încheia niciodată. O astfel de buclă poate fi însă încheiată cu instrucțiunea break.
Prelucrările efectuate cu instrucțiunea for, pot fi descrise și cu ajutorul unei bucle while, care se aseamănă cu for prin faptul că este tot cu test la început. Secțiunea următoare este echivalentă cu instrucțiunea for a cărei sintaxă a fost prezentată mai sus:
expresie_init
while(expresie_cond){
instrucțiune
expresie_act
}
Exemplul următor prezintă o buclă care va rula la infinit:#include <stdio.h>
int main()
{
for( ; ; )
printf("Buclă infinită\n");
}