Cuvânt înainte.....

După o vară lungă şi frumoasă iată că ne apropiem de primele zile de şcoală. Pentru a vă uşura reacomodarea cu programarea, sau pur şi simplu pentru a vă delecta in compania problemelor de informatică am creat acest blog.

Instructiuni de control

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).
Exemple:
int a; 
for (;;) {…}
Instructiunea expresie
 Sintaxa:    expresie; 
Exemple:
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
IMPLEMENTAREA STRUCTURII DE DECIZIE (ALTERNATIVE, DE SELECTIE)
Instructiunea if:
Sintaxa:
if (expresie)
    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.
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:
 if (a*b!=0)
       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:
 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.
 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; ]
}
    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

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");
}

Salturi

Există trei instrucțiuni de salt în limbajul C: break, continue și goto. Tot la această categorie putem vorbi și despre instrucțiunea return, care marchează încheierea prelucrărilor dintr-o funcție și revenirea în programul apelant.

Instrucțiunea break

Această instrucțiune poate să apară numai în corpul instrucțiunilor while, do-while, for și switch; având ca efect terminarea imediată a acestor instrucțiuni. Programul continuă cu instrucțiunea imediat următoare celei întrerupte. În cazul unor bucle imbricate, o instrucțiunea break aflată într-o buclă interioară nu le afectează pe cele exterioare. Aceași situație apare în cazul instrucțiunilor switch imbricate, sau care conțin bucle.