Sunteți pe pagina 1din 10

2.

INSTRUCIUNILE IF I SWITCH

2.1 SCOPUL LUCRRII


Lucrarea are ca scop familiarizarea studentului cu instruciunea condiional (de
decizie, de ramificaie), n formele IF-THEH i IF-THEN-ELSE.
Se exerseaz i versiunea SWITCH.

2.2 BREVIAR TEORETIC


Instruciunile condiionale determin programele s testeze diferite condiii i, n funcie de
acestea, s decid execuia anumitor comenzi.
Avem la dispoziie instruciunile condiionale:
if( ) - execut comenzile dorite atunci cnd o condiie (scris ntre paranteze) este
adevarat.
if( ) ... else - execut anumite comenzi cnd o conditie (scris ntre paranteze) este
adevarat i alte comenzi cnd aceast condiie este fals.
switch - selecteaz care comand va fi executat.

A. Instructiunea "if"

"if( )" (dac) este cea mai simpl instruciune condiional.


Forma general a acestei instruciuni este:
if (condiie) {
// Codul care va fi executat dac este Adevarat condiia
}
unde 'condiie' poate fi orice expresie alcatuit cu operatori raionali, de egalitate i logici.

Dac rezultatul evalurii condiiei este TRUE, se execut codul dintre acolade, n caz contrar,
cnd condiia returneaz FALSE, se trece peste acest cod.

B. Instruciunea "if ... else"

Folosind instruciunea "if() ... else" (dac ... altfel), putem stabili comenzi care s fie
executate i cnd condiia instruciunii "if( )" este FALSE.
Forma generala a instructiuni "if() ... else" este:

if (condiie) {
// codul care va fi executat dac este Adevarat condiia
}
else {

1
// codul ce va fi executat daca condiia este fals
}

unde 'condiie' poate fi orice expresie logic.

Dac rezultatul condiiei este TRUE, se execut codul dintre primele acolade, care
aparin de "if()", n caz contrar, cnd condiia returneaz FALSE, sunt executate comenzile
din acoladele de la "else".

Formula "else if( )"

Cu "if() ... else" sunt posibile execuiile a doar dou opiuni, cea de la "if( )" sau de la
"else". Dar sunt situaii n care avem mai multe opiuni, caz n care se folosete formula "else
if( )" (altfel dac).
Cu aceasta se pot crea i alte opiuni (suplimentare) ntre cele dou
Sintaxa general este:

if (condiie 1) {
// codul care va fi executat dac este Adevarat condiia 1
}
else if (condiie 2) {
// codul ce va fi executat daca prima condiie este Fals i este Adevarat condiia
2
}
else if (condiie 3) {
// codul care va fi executat daca primele dou condiii sunt False i este Adevarat
condiia 3
}
// ...
else {
// codul executat dac toate condiiile sunt False
}

Pot fi adaugate oricate optiuni "else if".

B. Instruciunea switch

Aceast instruciune e folosit pentru a compara o valoare cu altele dintr-o list i, n


funcie de acea valoare, se execut codul asociat ei n lista "switch".

Sintaxa generala a instructiuni "switch" este:

switch (expresie) {
case valoare1:
cod executat dac expresie = valoare1
break;

2
case valoare2:
cod executat dac expresie = valoare2
break;
case valoare3:
cod executat pt. expresie = valoare3
break;
default :
cod executat dac expresie e diferit de valoare1, valoare2 sau valoare3
}

Prima dat este evaluat expresia scris ntre paranteze rotunde, la "switch( )", apoi
valoarea expresiei este comparat pe rnd cu fiecare valoare determinat de "case".
Dac se gsete o identitate, se execut codul asociat acelui "case", apoi se iese din
instruciunea "switch".
Dac, parcurgand fiecare "case", nu se gsete o egalitate, se execut codul de la
"default".
Prin folosirea lui "break" se oprete parcurgerea corpului instruciunii atunci cnd s-a
gsit o valoare egal cu 'expresie' i se iese din "switch".
Instructiunea "switch" poate inlocui un ir de condiii cu "else if".

C. Operatori logici i instruciunile condiionale

Operatorii logici sunt "&&" si "||".


Rolul lor este asemntor cu cel al operatorilor relaionali i de egalitate, n sensul c i
acetia compar valoarea a doi operanzi.
Operatorii logici compar operatii, expresii de cod, iar rezultatul lor este unul din valorile
TRUE (Adevrat) sau FALSE (Fals).
exp1 && exp2 - Returneaz True dac i "exp1" i "exp2" sunt Adevrate; altfel,
returneaza False.
exp1 || exp2 - Returneaza True dac oricare dintre "exp1" sau "exp2" e Adevarat;
altfel, dac amndou sunt false, returneaz False.
exp1 && exp2 || exp3 - Returneaz True dac expresia (exp1 && exp2) sau "exp2"
e Adevarat; altfel, returneaz False.
Datorita rezultatului True sau False pe care-l dau aceti operatori logici, ei sunt folosii n
instruciunile condiionale, contribuind la efectuarea unor condiii mai complexe n
parantezele instructiunii "if()" si "else if()".

D. Operatorul condiional "? :"

O alta metod de a executa un cod n funcie de faptul dac o expresie este Adevarat sau
Fals e operatorul "? :"
Acest operator condiional, dei la prima vedere arat diferit de ceilali, este o form
prescurtat a instruciunii "if( ) else". Sintaxa general de folosire a lui este:
expresie-condiionala ? dac -TRUE : dac -FALSE;

3
Operatorul condiional evalueaz expresia condiional. Dac expresia are valoarea
TRUE, operatorul condiional returneaz valoarea de la "daca-TRUE"; n caz contrar,
returneaz valoarea de la "daca-FALSE".
Pe lng atribuirea unei valori n funcie de rezultatul unei expresii, acest operator
condiional poate fi utilizat n aceeai forma i la determinarea apelrii unei anumite funcii,
dup rezultatul unei expresii logice.

(expresie-logic) ? dacTrue( ) : dacFalse( );


unde "dacTrue( )" i "dacFalse( )" pot fi considerate doua funcii.

2.2 EXEMPLE

A. Sistemul de dou ecuaii de gradul I (varianta C)

#include <conio.h>
#include <stdio.h>

void main(){

/* Rezolvarea sistemului liniar de doua ecuatii cu doua necunoscute

ax+by=c
dx+ey=f */

double a,b,c,d,e,f,x,y,det,det1,det2;
printf("\n\nIntroduceti coeficientii a,b,c,d,e,f\n");

/* Coeficientii se introduc pe aceeasi linie, separati de blancuri */

if (scanf("%lf %lf %lf %lf %lf %lf",&a, &b, &c, &d, &e, &f) != 6)
printf("Coeficienti eronati\n");
else
if ((det=a*e-b*d) == 0)
printf("Sistemul are determinantul nul\n");
else
{
det1=c*e-b*f;
det2=a*f-c*d;
x=det1/det;
y=det2/det;
printf("x=%g\ty=%g\n",x,y);
}
getch();
}

4
B. Sistemul de dou ecuaii de gradul I (varianta C++)

#include <conio.h>
#include <fstream.h>

void main(){
clrscr();
float a, b, c, d, e, f, dd, dx, dy, x, y;

cout<<"a=";cin>>a;
cout<<"b=";cin>>b;
cout<<"c=";cin>>c;
cout<<"d=";cin>>d;
cout<<"e=";cin>>e;
cout<<"f=";cin>>f;

dd=a*e - b*d;

if(a*e - b*d == 0) cout<<"date improprii";


else{

dx=c*e - b*f;
dy=a*f - c*d;

x=dx/dd;
y=dy/dd;

cout<<endl;
cout<<"x="<<x<<endl;
cout<<"y="<<y<<endl;

getch();
}

5
C. Ecuaia de gradul II

S se rezolve ecuaia de gradul II ax 2 bx c 0 , coeficienii a, b i c fiind citii de la


tastatur.

Identificnd toate situaiile care pot s apar, obiem organigrama

n care semnificaia mesajelor este urmtoarea:

m1 : Aceasta nici macar nu e o ecuatie!


m2 : Imposibil!
m3 : Este, de fapt, o ecuatie de gradul I
m4 : Asta da! Este o ecuatie de gradul II
m5 : Radacini reale distincte
m6 : Radacini reale confundate
m7 : Radacini complexe

Prin identificarea modului n care instruciunile IF-THEN, respectiv IF-THEN-ELSE se


include unele pe altele i a instruciunilor simple i compuse, se obine organigrama mai
explicit:

6
Codul corespunztor este:

#include <conio.h>
#include <iostream.h>
#include <math.h>

void main(){
float a, b, c, d, x, x1, x2, re, im;
clrscr();
cout<<"a=";cin>>a;
cout<<"b=";cin>>b;
cout<<"c=";cin>>c;
if(a==0) if(b==0) if(c==0) cout<<"Aceasta nici macar nu e
o ecuatie!";
else cout<<"Imposibil!";
else{
cout<<"Este, de fapt, o ecuatie de gradul I"<<endl;
x=-c/b;
cout<<"Radacina este x="<<x;
}
else{
cout<<"Asta da! Este o ecuatie de gradul II"<<endl;
d=b*b-4*a*c;
if(d>0) {
cout<<"Radacini reale distincte"<<endl;
x1=(-b-sqrt(d))/2/a;
x2=(-b+sqrt(d))/2/a;

7
cout<<"x1="<<x1<<endl;
cout<<"x2="<<x2;
}
else if(d==0){
cout<<"Radacini reale confundate"<<endl;
x=-b/2/a;
cout<<"x1=x2="<<x;
}
else{
cout<<"Radacini complexe"<<endl;
re=-b/2/a;
im=-sqrt(-d)/2/a;
if(im<0)im=-im;
cout<<"x1="<<re<<" - "<<im<<" i"<<endl;
cout<<"x2="<<re<<" + "<<im<<" i";
}
}
getch();
}

D. Realizarea unui meniu

S se realizeze scheletul unui meniu pentru lucrul ulterior cu listele nlnuite;


programul va permite selectarea dintr-un meniu a unor aciuni i va afia aciunea viitoare, pe
care programul o va efectua n momentul n care vor fi implementate funciile respective.
Meniul va oferi ca principale opiuni crearea listei, listarea de la stanga la dreapta, listarea
de la dreapta la stanga, inserarea unui nod in interiorul listei, inserarea unui nod pe prima
poziie, inserarea unui nod pe ultima poziie, tergerea unui nod din interiorul listei, tergerea
primului nod, tergerea ultimului nod i salvarea listei.

Codul corespunztor este:

#include <iostream.h>
#include <conio.h>
#include <stdlib.h>

void main(){
int rasp;
clrscr();
cout<<"OPERATII CU LISTE :"<<endl<<endl;
cout<<
" 1: creare"<<endl<<
" 2: listare de la stanga la dreapta"<<endl<<
" 3: listare de la dreapta la stanga"<<endl<<
" 4: inserare nod in interiorul listei"<<endl<<
" 5: inserare nod pe prima pozitie"<<endl<<
" 6: inserare nod pe ultima pozitie"<<endl<<

8
" 7: stergerea unui nod din interiorul listei"<<endl<<
" 8: stergerea primului nod"<<endl<<
" 9: stergerea ultimului nod"<<endl<<
"10: salvez lista"<<endl;
cin>>rasp;
switch (rasp){
case 1: cout<<"voi crea o lista";break;
case 2: cout<<"voi lista de la stanga la dreapta";break;
case 3: cout<<"voi lista de la dreapta la stanga";break;
case 4: cout<<" voi insera un nod in interiorul listei";break;
case 5: cout<<" voi insera un nod inaintea primului nod";break;
case 6: cout<<" voi insera un nod dupa ultimul nod";break;
case 7: cout<<" voi sterge un nod din interiorul listei";break;
case 8: cout<<" voi sterge primul nod";break;
case 9: cout<<" voi sterge ultimul nod";break;
case 10: cout<<" voi salva lista";break;
default: exit(1);
}
getch();

2.4 TEME DE LABORATOR

1. Se citesc de la tastatur patru numere ntregi a, b, c i d, toate diferite. S se afieze


cea mai mare valoare citit.

2. Se citesc de la tastatur patru numere ntregi a, b, c i d, toate diferite. S se afieze


cea mai mic valoare citit.

3. Se citesc de la tastatur trei numere ntregi a, b i c, nu neaparat diferite. S se afieze


numele varibilei care are cea mai mare valoare. Daca mai multe variabie au aceast
valoare, se vor tipri numele tuturor variabilelor care au aceast valoare, pe linii
diferite ale monitorului.

4. Se citete de la tastatur un numr natural n. S se afieze mesajul numrul este par,


sau mesajul numrul este impar, n funcie de paritatea numrului n.

5. Se citesc de la tastatur dou numere naturale n i k. S se afieze mesajul numrul n


este divizibil la numrul k, sau mesajul numrul n NU este divizibil la numrul k,
n funcie de valorile introduse.

9
6. Se citete de la tastatur un numr natural n, mai mare ca 100. S se afieze, n
ordine, pe aceeai linie, cifra sutelor, cifra zecilor i cifra unitilor numrului n,
separate de cte un spaiu.

7. S se rezolve ecuaia de ordinul I ax+b=0, cu verificarea consistenei valorilor


introduse de la tastatur pentru parametrii a i b.

8. S se rezolve ecuaia de gradul al II-lea, lund n considerare toate posibilitile pentru


valorile introduse de la tastatur pentru paramtrii a, b i c.

BONUS

9. Se citete de la tastatur un numr natural n, mai mare dect 100 i mai mic dect
65000. S se elimine din numr cifra (cifrele) din mijloc i s se afieze numrul
obinut. *

*
Dac numrul n are un numr impar de cifre, se elimin o singur cifr, iar dac numrul n
are un numr par de cifre, se elimin dou cifre.

10

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