Laboratorul 6 Structuri de decizie (alternative, de selecţie)
6. Structuri de decizie (alternative, de selecţie)
6.1 Structura de decizie: instrucţiunea if
Aceasta corespunde cazurilor când în algoritmul problemei intervine o decizie.
Este instrucţiunea principală în C care descrie structura alternativă. Pentru un pseudocod
de forma:
dacă (<condiţie>) atunci <instrucţiune>
instrucţiunea if este:
if (<condiţie>) <instrucţiune>;
iar pentru un pseudocod de forma:
dacă (<condiţie>) atunci <instr1> altfel <instr2>
instrucţiunea if este:
if (<condiţie>) <instr1>; else <instr2> ;
OBSERVAŢIE: Dacă una din instrucţiunile de pe ramura "if" sau "else" este o instrucţiune
compusă, atunci ea se încadrează între acolade:
{ <instr1>; <instr2>; ... }
şi nu se mai termină cu punct-virgulă. În caz contrar programul va executa numai prima
instrucţiune de pe ramură.
6.2 Structura de selecţie cu ramuri multiple:
instrucţiunea switch
În unele cazuri este necesară o decizie multiplă specială.
Instrucţiunea switch permite acest lucru. test expr
DACĂ expresie=expr_const_1
instrucţiune1;
[ieşire;] instrucţiune1
ALTFEL DACĂ expresie=expr_const_2
break
instrucţiune2;
[ieşire;]
… instrucţiune2
ALTFEL DACĂ expresie=expr_const_n-1
instrucţiune_n-1; break
[ieşire;]
ALTFEL instrucţiune_n;
Se testează dacă valoarea pentru expresie este una instrucţiune_n
dintre constantele specificate (expr_const_1,
expr_const_2, etc.) şi se execută instrucţiunea de pe
ramura corespunzătoare. În schema logică test_expresie este una din condiţiile:
expresie=expr_const_1, expresie=expr_const_2, etc.
Sintaxa:
27
Laboratorul 6 Structuri de decizie (alternative, de selecţie)
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; ]
}
6.3 Exemple if, switch
6.3.1 Maximul a trei numere
[Link] Pseudocodul: void main()
{
[Link]şte a,b,c int cod=1; float x,y,z; char op;
[Link]ă a>b atunci max=a altfel max=b while(cod)
[Link]ă c>max atunci max=c {
[Link] max printf("\nIntroduceti expresia
Start (valoare operator valoare): ");
scanf("%f %c %f",&x,&op,&y);
switch(op)
Citeşte
a, b, c
{
case '+':z=x+y;break;
case '-':z=x-y;break;
Nu Dacă Da
case '*':z=x*y;break;
a>b
case '/':z=x/y;break;
max=b max=a default: printf("\nOperator
eronat"); cod=0; z=0;
}
Da printf("%.2f %c %.2f=
Dacă %.2f",x,op,y,z);
c>max max=c }
}
Scrie “Max =” , max Să se scrie un program care citeşte o cifră
din intervalul [1,7] şi afişează denumirea
Stop
zilei din săptămînă corespunzătoare cifrei
respective (1-luni, 2-marţi etc).
[Link] Programul: //PROGRAMUL BIV25
#include<iostream.h> #include <stdio.h>
main() #include <stdlib.h>
{ void main( )
int a,b,c,max; /* citestc o cifra din intervalul
cout<<"Dati a b c"; cin>>a>>b>>c; [1,7] si afiseaza denumirea zilei
if(a>b) max=a; din saptamina corespunzatoare
else max=b; cifrei respective */
if(c>max) max=c; {
cout<<"maximul="<<max; int i;
} scanf("%d", &i);
switch(i)
{
6.3.2 Calculator de buzunar case 1: puts("luni");break;
//Instruc de selectie switch case 2: puts("marti");break;
#include<stdio.h> case 3: puts("miercuri"); break;
28
Laboratorul 6 Structuri de decizie (alternative, de selecţie)
case 4: puts("joi"); break; default: puts("Valoare gresita
case 5: puts("vineri"); break; !");exit(1);
case 6: puts("simbata"); break; }
case 7: puts("duminica"); break; }
6.4 Probleme propuse
Să se alcătuiască programe care să rezolve următoarele probleme:
6.4.1 Calculul volumului unui corp geometric
Să se scrie un program care afişează un mesaj de tip meniu şi în funcţie de un caracter citit
de la tastatură (1 pentru paralelipiped, 2 - Cilindru, 3 - Con, 4 - Sferă, 0 - terminare program)
citeşte dimensiunile necesare şi calculează şi afişează în cadrul unui mesaj volumul corpului
respectiv (Vp = H·B·L; Vcil = π·R2·H; Vcon = π·R2·H/3; Vsf = π·D3/6).
Start
Citeşte
a, b, c
Nu Da
Dacă
a=0
Δ = b2 – 4ac
Da
Nu
Dacă
Da
i<iter
Scrie “Ec
are rad x
x0=x
Nu Dacă Da
Δ>0 b=0
Scrie “Ec e de
gradul unu
x1 = -c/b
Nu Dacă Da Nu Daca Da
Δ<0 c=0
-b
-b± Δ -b re = 2a
x1,2 = x1,2 = 2a
2a
-Δ
im = 2a
Scrie “Ec are Scrie “Ec are Scrie “Ec are Scrie “Ec nu Scrie “Ec are
doua rad dif” rad dubla” rad compl” are nici o o infinit ate de
x1 şi x2 x1 = x2 x1,2 = re±i⋅im solutie” solutii”
Stop
[Link] scrie "[Link] o infinitate de
6.4.2 Ecuaţia de gradul 2 (vezi şi schema sol."
logică) [Link] altfel scrie "[Link] are sol"
[Link]şte a,b,c 2.1.2 altfel scrie "[Link] [Link]ă x=",-c/b
[Link]ă a=0 atunci altfel
[Link]ă b=0 atunci 2.2 d=b*b-4*a*c
[Link]ă c=0 atunci 2.2.1 dacă d>0 atunci
[Link].x1=(-b- d )/(2*a)
29
Laboratorul 6 Structuri de decizie (alternative, de selecţie)
x2=(-b+ d )/(2*a) 3.1.2 altfel arg = -pi/2
scrie "x1=",x1,"x2=",x2 3.2 altfel
[Link] altfel dacă re>0 atunci
dacă d=0 atunci 3.2.1 arg=arctg(im/re)
[Link].1 scrie "[Link] 3.2.2 altfel arg=-arctg(im/re)
[Link] x=",-b/(2*a) [Link] re,im
altfel
[Link].2 re = -b/(2*a) 6.4.4 Rezolvarea unui sistem de două
ecuaţii cu două necunoscute x,y
im = -d /(2*a)
scrie "[Link] [Link]şte a11,a12,a21,a22,b1,b2
[Link] re = ", re," im = ",im [Link] = a11*a22-a21*a12
[Link] = b1*a22-b2*a12
6.4.3 Modulul şi argumentul unui număr [Link] = a11*b2-a21*b1
complex 5.x = detx/det; y = dety/det
[Link]şte re,im
6.4.5 Sa se calculeze şi sa se afişeze
[Link] = re*re+im*im valoarea funcţiei f pentru un x dat:
[Link]ă re=0 atunci
3.1 4x3 + 5x2 - 2x + 1, x<0
dacă im>=0 atunci f(x)= 100, x=0
x
3.1.1 arg=pi/2 e - ln x, x>0
Start
Citeşt
e
modul= re ⋅ re + im ⋅ im
N Dacă
D
re=0
N Dacă D D Dacă N
re>0 im>=0
arg=- arg=arct(im/r arg=pi/2 arg=-pi/2
scrie re,im
Stop
30