Sunteți pe pagina 1din 38

Scopul cursului

CAP.3. Programarea structurată în limbajul C


3.1. Structuri de control
3.2. Structura de selecție if/else
3.3. Structura de selecție multiplă -Instrucţiunea switch
3.3. Structura repetitivă while
3.4. Formularea algoritmilor. Studiu de caz
3.5. Formularea algoritmilor de sus – în jos pas cu pas.
Studiu de caz.
3.6. Operatorii de încrementare și decrementare

Programarea calculatoarelor I -
Gyorodi Cornelia 1
Structuri de control
 Executia secvențială
 Instrucțiuni executate una după cealaltă, în ordinea în care ele
sunt scrise
 Transferul controlului
 Când următoarea secvență este executată, ea nu este
următoarea în cadrul secvenței
 Folosirea exagerata a instructiunilor goto poate sa ducă la multe

probleme
 Bohm si Jacopini demonstrază că:
 Toate programele pot fi scrise pe baza a 3 structuri de control:

 Structuri secventiale: Integrate in C. Programele executate

secvential in mod implicit


 Structuri de selecție: C are 3 tipuri: if, if/else, si switch

 Structuri repetitive: C are 3 tipuri: while, do/while si for

Programarea calculatoarelor I -
Gyorodi Cornelia 2
Structuri de control

 Schema logică
 Reprezentarea vizuală a unui algoritm

 Desenată folosind simboluri speciale, conectate prin sageți

 Dreptunghi (actiunea executata):

 Indica orice tip de acțiune

 Oval:

 Indica începutul sau sfârșitul unui program sau al unei

secțiuni de cod
 Structuri de control cu o singură intrare/singură ieșire
 Conecteaza iesirea unei structuri de control cu intrarea

urmatoarei structuri (control-structure stacking)


 Face programele usor de dezvoltat

Programarea calculatoarelor I -
Gyorodi Cornelia 3
Structura de selectie if

 Structura de selecție:
 Folosită pentru a alege dintre mai multe acțiuni alternative

 Pseudocod:

Daca nota unui student este mai mare sau egala cu 5,


tipareste“Admis”
 Dacă condiția este evaluată la true
 Setul de acțiuni corespondente este executat și programul
merge la urmatoarea instrucțiune
 Daca false, setul de acțiuni e ignorat și programul merge la
următoarea instrucțiune
 Indentarea face programele mai ușor de citit
 C ignora caracterele goale (blank)

Programarea calculatoarelor I -
Gyorodi Cornelia 4
Structura de selecție if
 Instrucțiune pseudocod în C:
if ( grade >= 5 )
printf( "Passed\n" );
 Codul C corespunde indeaproape cu
pseudocodul
 Diamantul (simbolul de decizie)
 Indica faptul ca trebuie luata o decizie
 Conține o expresie care trebuie să fie true
sau false
 Testeaza conditia, merge pe latura aleasa
Programarea calculatoarelor I -
Gyorodi Cornelia 5
Structura de selecție if

 Structura if este o structură cu o singură


intrare și o singură ieșire

O decizie poate fi luata


pentru fiecare expresie.
zero - false
true nonzero - true
grade >= 5 print “Passed”
Exemplu:
3 - 4 este true

false

Programarea calculatoarelor I -
Gyorodi Cornelia 6
Structura de selecție if/else
 if
 Realizează o acțiune doar dacă condiția este true
 if/else
 Specifică o acțiune care să fie executată atât când
condiția este true cât și când este false

 Psuedocod:
Daca nota unui student este mai mare sau egala cu
5, tipareste“Admis”
altfel
tipareste “Respins”
Programarea calculatoarelor I -
Gyorodi Cornelia 7
Structura de selectie if/else
 Cod C:
if ( grade >= 5 )
printf( "Passed\n");
else
printf( "Failed\n");
 Operatorul conditional (?:)
 Ia 3 argumente (condiție, valoare cand true, valoare cand

false)
 Pseudocodul nostru ar putea fi scris:
printf( "%s\n", grade >= 5 ? "Passed" :
"Failed" );
 Sau putea fi scris:
grade >= 5 ? printf( “Passed\n” ) : printf(
“Failed\n” );
Programarea calculatoarelor I -
Gyorodi Cornelia 8
Structura de selecție if/else

 Schema logică a structurii de selecție if/else

false true
grade >= 5

print “Failed” print “Passed”

Programarea calculatoarelor I -
Gyorodi Cornelia 9
Instrucţiuni de selecție (decizie)
if (expresie)
{
instr 1;
if (expresie) instr 2;
...
instrucţiune1;
}
else
instrucţiune 2; else {
instr 1;
instr 2;
instr N;
}
OBSERVAŢIE: În C o expresie este true dacă ea este evaluată ca diferită de zero şi false
dacă ea este evaluată la zero. În general, expresia din interiorul lui if compară o valoare
cu alta folosind un operator relaţional
Programarea calculatoarelor I -
Gyorodi Cornelia 10
Stucturi if/else imbricate

 Stucturi if/else imbricate


 Testeaza cazuri multiple plasand structuri de
selectie if/else in interiorul altor structuri
if/else
 De indata ce conditia este indeplinităa, restul
instrucțiunilor sunt ignorate
 Imbricarea pe foarte multe nivele nu este
recomandată

Programarea calculatoarelor I -
Gyorodi Cornelia 11
Stucturi if/else imbricate
 Pseudocodul pentru o structură imbricată if/else
Daca nota studentului este mai mare sau egala cu 90
Afiseaza “A”
altfel
Daca nota studentului este mai mare sau egala cu 80
Afiseaza “B”
altfel
Daca nota studentului este mai mare sau egala cu 70
Afiseaza “C”
altfel
Daca nota studentului este mai mare sau egala cu 60
Afiseaza “D”
altfel
Afiseaza “F”

Programarea calculatoarelor I -
Gyorodi Cornelia 12
Instrucțiune compusă

 Instrucțiune compusă:
 Set de instrucțiuni, încadrate între acolade
 Exemplu:
if ( grade >= 5 )
printf( “Admis.\n" );
else {
printf( “Respins.\n" );
printf( “Trebuie sa refaci acest curs din
nou.\n" );
}
 Fără acolade, instrucțiunea
printf( “Trebuie sa refaci acest curs din
nou.\n" );
ar fi executată automat

Programarea calculatoarelor I -
Gyorodi Cornelia 13
Exemplu
Exemplu 1.2: Se citește un număr de la tastatură și se afișează dacă este
pozitiv sau negativ.
#include <stdio.h>
main( )
{
int num;

printf("Introduceti un numar: ");


scanf("%d", &num);
if (num < 0)
printf("Numarul este negativ");
else
printf("Numarul este pozitiv");
}
Programarea calculatoarelor I -
Gyorodi Cornelia 14
Instrucţiunea switch
 Instrucţiunea switch este folosită în cazul selecţiei multiple.
 Forma generală a instrucţiunii este:
switch(variabila)
{
case c1: instructiuni;
break;
case c2: instructiuni;
break;
…..
default: instructiuni;
}

Programarea calculatoarelor I -
Gyorodi Cornelia 15
 Exemplu: Program care recunoaşte numerele 1, 2 sau 3 şi afişează numele cifrei introduse.
# include <stdio.h>
main ()
{
int i;
printf("Introduceti un intreg intre 1 si 3");
scanf("%d", &i);
switch(i)
{
case 1: printf("unu");
break;
case 2: printf("doi");
break;
case 3: printf("trei");
break;
default:
printf("Numar necunoscut");
}
}

Programarea calculatoarelor I -
Gyorodi Cornelia 16
Structura repetitiva while

 Structura repetitivă
 Programatorul specifică o acțiune care să fie
repetată cât timp o condiție rămâne true
 Pseudocod:
Cat timp mai am lucruri pe lista de cumparaturi
Cumpara urmatorul lucru si taie-l de pe lista
 bucla while se execută până când condiția
devine false

Programarea calculatoarelor I -
Gyorodi Cornelia 17
Structura repetitiva while

 Exemplu:
int product = 2;
while ( product <= 1000 )
product = 2 * product;

true
product <= 1000 product = 2 * product

false

Programarea calculatoarelor I - Gyorodi Cornelia 18


Scrierea algoritmilor (bucla controlată de
contor)
 Bucla controlată de contor
 Bucla repetată până când contorul atinge o valoare

 Repetiție definită: numarul de repetiții este știut

 Exemplu: O clasa de 10 studenti iau parte la un test. Notele


(de la 0 la 100) sunt disponibile. Determinati media clasei la
acest test.
 Pseudocod:

Seteaza totalul la zero


Seteaza contorul de note la unu
Cat timp contor note este mai mic sau egal cu 10
Introdu urmatoarea nota
Adauga nota la total
Adauga unu la contor note
Seteaza media clasei la total impartit la zece
Tipareste media clasei
Programarea calculatoarelor I -
Gyorodi Cornelia 19
2 Class average program with
3 counter-controlled repetition */
4 #include <stdio.h>
5
6 int main()
7 {
8 int counter, grade, total, average;
9
10 /* initialization phase */
11 total = 0; 1. Initializeaza
12 counter = 1; Variabile
13
14 /* processing phase */
15 while ( counter <= 10 ) {
16 printf( "Enter grade: " );
17 scanf( "%d", &grade ); 2. Executa
18 total = total + grade; Bucla
19 counter = counter + 1;
20 }
21
22 /* termination phase */
23 average = total / 10; 3. Tipareste
24 printf( "Class average is %d\n", average ); rezultate
25
26 return 0; /* indicate program ended
Programarea calculatoarelor I -
27}
successfully */ Gyorodi Cornelia 20
 Enter grade: 98
 Enter grade: 76
 Enter grade: 71 Rezultatul
 Enter grade: 87 programului
 Enter grade: 83
 Enter grade: 90
 Enter grade: 57
 Enter grade: 79
 Enter grade: 82
 Enter grade: 94
 Class average is 81

Programarea calculatoarelor I -
Gyorodi Cornelia 21
Scrierea algoritmilor folosind abordarea
de tip Top-Down, Stepwise
 Problema devine:
Dezvolați un program pentru calcularea mediei clasei
care va procesa un număr arbitrar de note de fiecare
dată cand programul este executat.
 Numar necunoscut de studenți
 Cum va ști programul când să se termine?

 Utilizați valoarea santinelă


 Numită și valoare semnal, valoare redundantă sau valoare de

tip flag
 Indică “sfârșitul introducerii datelor.”

 Bucla se termina când utilizatorul introduce valoarea santinelă

 Valoarea aleasă pentru santinelă nu poate fi confundată cu o

valoare obișnuită (cum ar fi -1 în acest caz)

Programarea calculatoarelor I -
Gyorodi Cornelia 22
Scrierea algoritmilor folosind abordarea
de tip Top-Down, Stepwise
 Abordarea de tip Top-down, stepwise
 Incepeti cu un pseudocod reprezentand top:

Determinarea mediei clasei la test


 Divizarea top in seturi de actiuni mici si ordonarea lor:
Initializarea variabilelor
Citire, suma si numararea notelor
Calcularea si afisarea mediei
 Multe programe au 3 faze:
 Initializare: initializeaza variabilele programului

 Procesare: citeste date si ajusteaza variabilele in mod

corespunzator
 Terminare: calculeaza si tipareste rezultatele finale

Programarea calculatoarelor I -
Gyorodi Cornelia 23
Scrierea algoritmilor folosind abordarea
de tip Top-Down, Stepwise

 Rafinarea fazei de inițializare de la


Inițializare variabile la:
Initializeaza total la zero
Initializeaza contor la zero
 Refinarea Citire, suma și numărare note la
Introdu prima nota (posibil santinela)
Cât timp utilizatorul nu a introdus santinela
Adaugă nota la total
Adaugă unu la contor
Citește următoarea notă (posibil santinela)
Programarea calculatoarelor I -
Gyorodi Cornelia 24
Scrierea algoritmilor folosind abordarea
de tip Top-Down, Stepwise

 Rafinarea Calculează și tipărește media la


Daca contorul este diferit de zero
Seteaza media la total impartit la contor
Afiseaza media
altfel
Afiseaza “Nu au fost introduse note”

Programarea calculatoarelor I -
Gyorodi Cornelia 25
1 /* Fig. 3.8: fig03_08.c
2 Class average program with
3 sentinel-controlled repetition */
4 #include <stdio.h>
5
6 int main()
7 {
8 float average; /* new
9
data int
typecounter,
*/ grade, total;
10
11 /* initialization phase */
1. Initializeaza
12 total = 0; Variabile
13 counter = 0;
14
15 /* processing phase */
16 printf( "Enter grade, -1 to end: " 2. Citeste date
17
); scanf( "%d", &grade );
18
19 while ( grade != -1 ) {
20 total = total + grade;
21 counter = counter + 1; 2.1 Executa
22 printf( "Enter grade " ); bucla
23 scanf( "%d", &grade );
Programarea calculatoarelor I -
24 } Gyorodi Cornelia 26
25

26 /* termination phase */ 3. Calculeaza


27 if ( counter != 0 ) { Media

28 average = ( float ) total / counter;
3.1 Afiseaza
29 printf( "Class average is %.2f", average ); rezultatele
30 }

31 else

32 printf( "No grades were entered\n" );

33

34 return 0; /* indicate program ended successfully


*/  Iesirea
35 } programului

Programarea calculatoarelor I -
Gyorodi Cornelia 27
Structuri de control imbricate
 Problema
 Un colegiu are o lista de rezultate la teste (1 = admis, 2 =

respins) pentru 10 studenți


 Scrieți un program care analizează rezultatele

 Daca trec mai mult de 8 studenți, afișează un text

 Remarcați că
 Programul trebuie să proceseze 10 rezultate

 Bucla controlată de contor va fi folosită

 Două contoare vor fi folosite

 Unul pentru numărul de admiși, altul pentru respinși

 Fiecare rezultat este un numar : 1 sau 2

 Dacă numărul nu este 1, presupunem că este 2

Programarea calculatoarelor I -
Gyorodi Cornelia 28
Structuri de control imbricate
 Nivelul superior
Analizează rezultatele și decide dacă taxa trebuie să fie marită
 Prima rafinare
Inițializează variabilele
Introdu cele 10 note și numără admișii și respinșii
Afisează un sumar al rezultatelor și decide dacă taxa să fie
mărită
 Rafinează Inițializare variabile la
Initializeaza admisii la zero
Initializeaza respinsii la zero
Initializează contor la unu

Programarea calculatoarelor I -
Gyorodi Cornelia 29
Structuri de control imbricate
 Rafinează Citește cele 10 note și numară admișii și
respinșii la
Cat timp contorul este mai mic sau egal cu zece
Citeste urmatorul rezultat
Daca studentul a trecut
Aduna unu la admisi
altfel
Aduna unu la respinsi
Aduna unu la contor studenti
 Rafinează Afișează un sumar și decide dacă taxa să fie
marită la
Afișează numarul de admisi
Afișează numarul de respinsi
Dacă mai mult de opt au trecut
Afișează “Creste taxa”
Programarea calculatoarelor I - Gyorodi Cornelia 30
/* Fig. 3.10: fig03_10.c
Analysis of examination results */
#include <stdio.h>

int main()
{ 1. Initializeaza
/* initializing variables in declarations */
int passes = 0, failures = 0, student = 1, result;
variabile

/* process 10 students; counter-controlled loop */


while ( student <= 10 ) { 2. Citeste datele si
printf( "Enter result ( 1=pass,2=fail ): " ); numara admisii
scanf( "%d", &result );
si respinsii
if ( result == 1 ) /* if/else nested in while
passes = passes + 1;
else
failures = failures + 1;

student = student + 1;
}

printf( "Passed %d\n", passes );


printf( "Failed %d\n", failures ); 3. Afiseaza
if ( passes > 8 ) rezultatele
printf( “Creste taxa\n" );

return 0; /* successful termination */


}
Programarea calculatoarelor I -
Gyorodi Cornelia 31
Operatorii de atribuire

 Operatorii de atribuire abreviaza expresiile


de atribuire
c = c + 3;
poate fi abreviat la c += 3; folosind
operatorul de atribuire adunare
 Instructiunile de forma
variable = variable operator expression;
pot fi rescrise ca si
variable operator= expression;

Programarea calculatoarelor I -
Gyorodi Cornelia 32
Operatorii de atribuire

 Alte exemple:
d -= 4 (d = d - 4)
e *= 5 (e = e * 5)
f /= 3 (f = f / 3)
g %= 9 (g = g % 9)

Programarea calculatoarelor I -
Gyorodi Cornelia 33
Operatorii de incrementare și
decrementare

 Operator de incrementare (++)


 Poate fi folosit in loc de c+=1
 Operator de decrementare (--)
 Poate fi folosit in loc de c-=1
 Preincrementare
 Operatorul e folosit inaintea variabilei (++c
sau --c)
 Variabila e schimbată înainte ca expresia să
fie evaluată
Programarea calculatoarelor I -
Gyorodi Cornelia 34
Operatorii de incrementare și
decrementare
 Postincrementare
 Operatorul e folosit dupa variabila
(c++ sau c--)
 Expresia e evaluată înainte ca variabila să fie
schimbată
 Operatorii de incrementare sau decrementare nu trebuie neapărat să
urmeze variabila ei o pot şi precede: ++i sau --i.
 Când operatorii increment sau decrement urmează variabila,
operaţia de incrementare sau decrementare este executată după ce
valoarea variabilei a fost folosită în expresie.

Programarea calculatoarelor I - Gyorodi Cornelia 35


Operatorii de incrementare si
decrementare

 Daca c este 5, atunci


printf( "%d", ++c );
 Afiseaza 6
printf( "%d", c++ );
 Afiseaza 5
 In orice caz, c are acum valoarea 6

Programarea calculatoarelor I -
Gyorodi Cornelia 36
Operatorii de incrementare si
decrementare

 Cand variabila nu este o expresie


 Preincrementare si postincrementarea au
acelasi efect
++c;
printf( “%d”, c );
 Are acelasi efect cu
c++;
printf( “%d”, c );

Programarea calculatoarelor I -
Gyorodi Cornelia 37
Operatorii de incrementare și
decrementare

max = 1;
i = 10 * max++; /* i ia valoarea 10 şi apoi se
incrementează max prin 1 */

max = 1;
i = 10 * ++max; /*se incrementează max, adică
max este 2 și i ia valoarea 20 */

Programarea calculatoarelor I -
Gyorodi Cornelia 38

S-ar putea să vă placă și