» Utilizator
Salut, vizitatorule!

SkullBox este o comunitate formata din programatori si administratori de sisteme sau retele care iti sta la dispozitie cand ai o problema legata de calculatoare. Daca esti un utilizator existent, autentifica-te.

Daca nu te-ai inregistrat inca pe forum, alatura-te noua astfel marind comunitatea si ajutandu-i pe cei care au nevoie de informatii.

Daca te-ai inregistrat dar inca nu ai primit codul de activare, il poti cere aici.




Autentifica-te cu numele de utilizator si parola pentru a putea posta pe forum sau pentru a accesa ariile disponibile doar utilizatorilor inregistrati.
 » Concurs
GameDev
 » Statistici
  • 46957 de mesaje.
  • 5871 de topicuri.
  • 825 de utilizatori.
  •  
  • cdoryn74 e ultimul utilizator inregistrat.
[Detalii]

 » Parteneri » Sponsori

 » Recomandăm
HostVision

» Avem un concurs pentru bloggeri si forumisti. Participi? «
Pagini: [1]
Print
[Curs] C - Lectia 04 - Instructiuni de control [1370 afisari]
Agkelos
*


Mesaje: 6024
OfflineOffline

WWW

In C exista doua tipuri de instructiuni de control a fluxului de rulare si ar putea fi
etichetate ca "structuri alternative" si "structuri repetitive".

Ce fac acestea ? Instructiuni alternative verifica o conditie si in functie de aceasta
ruleaza un bloc de instructiuni sau altul. Instructiunile repetitive, dupa cum le spune
si numele, ruleaza un bloc de instructiuni pana cand apare conditia de oprire a repetarii.

Ca si in cazul functiilor, mai multe instructiuni pot forma un bloc folosind acoladele.

1. Instructiunea IF

Aceasta instructiune permite ramificarea programului in functie de valoarea conditiei.
sintaxa acesteia este:

Code:
if( Conditie )
   executa cod1;
else
   executa cod2;
Cum functioneaza ? Blocul "Conditie" este evaluat si daca acesta ia valoarea True este
executat codul 1. In caz contrar (Conditia ia valoarea False) este executat codul 2.
De mentionat 2 idei:
a. else nu e obligatoriu sa apara;
b. se pot executa mai multe instructiuni pentru fiecare din cazuri cu conditia ca acestea
sa fie tinute in interiorul unui bloc determinat de { si }.

Sa vedem si un exemplu concret:

Code:
if( 1 == 1 )
   printf("Adevarat");
else
   printf("Fals");
In exemplul de mai sus se evalueaza expresia 1 == 1 care intotdeauna va returna True, deci
blocul dat ca exemplu intotdeauna va afisa "Adevarat". Daca am inlocui 1 == 1 cu 1 == 0
conditia va deveni Falsa la fiecare rulare, deci de fiecare data blocul respectiv
va afisa "Fals".
Pentru a putea fi folosita in practica, instructiunea if permite utilizarea variabilelor.
Adica, putem avea int a = 1; si int b = 2; care apoi sa le evaluam. Daca expresia dintre
paranteze va fi de forma if( a == b ) rezultatul va fi "False" pentru ca a = 1 si b = 2
ceea ce e fals. In schimb daca expresia ar fi de forma if( a != b ) rezultatul va fi "True".
De ce ? Pentru ca a nu este egal cu b iar expresia va returna "True" daca a nu este egal
cu b ( operatorul != ).
Trebuie mentionat ca functia if poate fi folosita doar in cazul numerelor. In cazul sirurilor
se folosesc functii specializate despre care voi vorbi intr-o lectie care urmeaza.

Pentru a complica putin treburile, e bine de stiut ca instructiunea if permite si expresii
compuse, adica 2 sau mai multe expresii legate intre ele prin operatorii logici && (si)
respectiv || (sau). Cum putem folosi asta ? Simplu, dau un exemplu mai jos care va ajuta
sa intelegeti:

Code:
int a,b,c;

a = 1;
b = 2;
c = 3;

if( a == 1 && b b && b < c ){
   printf("Am facut un SI logic intre rezultatele expresiilor a > b si b < c\n.");
   printf("Prima returneaza False.\n");
   printf("A doua returneaza True.\n");
   printf("Rezultatul e False pentru ca SI logic aplicat pe True si False e False.\n");
   printf("Adica textul de aici nu va fi afisat niciodata ;-) .\n");

}
Instructiunea IF accepta de asemenea si "inlantuiri". Adica, aplicam un IF iar in cazul in care
conditia rezultata este False, punem un else care foloseste mai departe un alt IF. Cel mai bine
se intelege printr-un exemplu:

Code:
if( conditie )
   puts("Conditia ia valoarea True");
else if( conditie2 )
         puts("Conditia 1 a luat valoarea False, iar conditie2 True");
     else
         puts("Conditia 1 si Conditia 2 au luat valoarea False");
Simplu, nu ? Dar ganditi-va ce ar iesi daca am avea de verificat 10 conditii. Pentru cazuri
mai complexe, s-a creat instructiunea switch.

2. Instructiunea switch functioneaza identic cu instructiunea IF cu diferenta ca
aceasta permite mai multe alternative. IF permite doar 2 alternative (True sau False).
Switch ne permite sa declaram mai multe alternative si sa asociem cate o actiune
pentru fiecare. Sintaxa este de felul urmator:

Code:
switch( expresie ){
  case constanta1: instructiune1;break;
  case constanta2: instructiune2;break;
      ...
  case constantaN: instructiuneN;break;
  default: instructiuneDefault;
}
Ce inseamna asta ? Se verifica expresia data ca parametru instructiunii switch iar apoi
rezultatul este comparat pe rand cu fiecare caz specificat. Daca expresia are valoarea
constantei nr. 1, se executa instructiune1 iar apoi se iasa din structura de control
(instructiunea break obliga iesirea). Daca expresia nu se valideaza se trece la
urmatorul caz si asa mai departe pana cand se termina cazurile. Daca expresia nu corespunde
nici unui caz specificat se executa instructiunea data la cazul "default". Acesta poate
lipsi dar nu este recomandat. Dupa ce instructiunea switch si-a facut treaba programul
este executat mai departe.

3. Instructiunea repetitiva WHILE
Foarte des veti avea nevoie sa folositi acelasi bloc de cod de mai multe ori cu mici
diferente. In loc sa scrieti acelasi cod de 100 de ori, puteti folosi o instructiune
repetitiva (bucla) while.
Instructiunea are urmatoarea forma:

Code:
while( expresie ){
   codul care trebuie executat
}
Adica, la intrarea in bucla while este evaluata expresia. Daca aceasta are valoarea True,
se executa codul. In caz contrar se trece la instructiunea urmatoare.
Bun, sa facem un mic cod care va afisa toate numerele de la 1 la 100 cu ajutorul buclei
while:

Code:
int i = 0; // Aici declaram variabila i de tip int si o initializam cu valoarea 0;
while( i < 100 ){
   printf("Valoarea lui i este %d\n",i);
   i++;
}
Ce am facut mai sus ? Am declarat o variabila i si am initializat-o cu valoarea 0. Apoi
am folosit-o in expresia din cadrul instructiunii while sub forma i<100 (adica valoarea
variabilei i este mai mica decat 100). Odata inceputa bucla while, i va avea valoarea 0.
La prima evaluarea a expresiei i va fi inlocuit cu 0 (valoarea actuala a lui i). 0<100
va returna True, deci codul va fi executat. La urmatoarea evaluare i va avea valoarea 1
pentru ca la iesirea din codul while se incrementeaza valoarea lui i. Deci, expresia
se va transforma din 0<100 in 1<100 care este, din nou, True. Codul va fi executat pana
cand i va lua valoarea 100, adica de 100 de ori si de cate ori va fi executat codul
noi vom vedea pe ecram "Valoarea lui i este %d" unde %d este valoarea actuala.
Cand i va lua valoarea 100, expresia va deveni 100<100 care este fals iar bucla se va
opri si va fi executata urmatoarea instructiune.

Pentru cei carora le place sa se complice putin, bucla de mai sus poate fi scrisa si sub
forma:

Code:
int i=0;
while( i++ < 100 )
   printf("Valoarea lui i este %d\n",i);
4. Instructiunea FOR
O instructiune repetitiva mai simpla este FOR. Aceasta se aseamana foarte mult
cu instructiunea WHILE, cu diferenta ca initializarea, expresia validata si modificarea
variabilei de control sunt facute intr-o singura linie. Se utilizeaza in felul urmator:

Code:
for( expresie1 ; expresie2 ; expresie3 ){
  cod care trebuie executat
}
Asta s-ar traduce in felul urmator:
expresie1 este evaluata la initializarea functiei;
expresie2 verifica conditia de rularea a codului;
expresie3 modifica valorile verificate de expresie2.

Un exemplu concret si foarte utilizat ar fi urmatorul:

Code:
for( i=0 ; i<100 ; i++ )
  printf("Valoarea lui i este %d\n",i);
In cazul de fata, i este initializat cu valoarea 0 (expresie1), cat timp valoarea lui i
este mai mica decat 100 este rulat blocul corespunzator instructiunii (expresie2) si la
fiecare rulare i este incrementat (expresie3).

5. Instructiunea DO-WHILE
Aceasta instructiune este foarte asemanatoare cu instructiunea WHILE cu diferenta ca
blocul corespunzator instructiunii este executat cel putin o data. Este folosita in felul
urmator:

Code:
do{
cod care trebuie executat
} while (expresie)
Adica, codul va fi rulat si abia apoi va fi evaluata expresia si se va decide daca se
va rula din nou codul sau nu.

Cam asta ar fi lectia despre instructiunile de control. Sper ca ati inteles. In caz contrar
va astept cu intrebari.
Ar mai fi de mentionat urmatoarele:

1. In fiecare caz, puteti da frau liber imaginatiei si fiecare expresie care este
evaluata poate fi rezultatul utilizarii operatorilor logici && (SI) respectiv || (SAU).
2. In cazul instructiunilor repetitive (bucle) aveti grija ca intotdeauna sa existe o
cale de iesire. In caz contrar va veti alege cu o bucla infinita care va bloca
aplicatia sau intreg sistemul.
3. Have fun ! Si asta-i cea mai importanta Big grin
Logged

Blog | Twitter

De nu va zice omul intru inima sa "Eu singur si Dumnezeu suntem in lume" nu va avea odihna. - Avva Alonie
15-10-2006, 20:29 
 
Sad_Dreamer
*


Mesaje: 273
OfflineOffline

WWW

nu l-am terminat de citit...inteleg mai greu ceva..nu ar fi mai usor sa ne explici semnele? de exemplu:
Code:

!= este <= (mai mic sau egal) ar fi mult mai usor de inteles
Logged

17-10-2006, 16:46 
 
Agkelos
*


Mesaje: 6024
OfflineOffline

WWW

Ai dreptate Big grin

Code:

< - mai mic
> - mai mare
== - egal
>= - mai mare sau egal
<= - mai mic sau egal
!= - NU este egal


 :!: Atentie: in C, ' = ' este operator de atribuire nu de comparatie. Nu il folositi pentru comparatie pentru ca fie va da eroare fie returneaza True.
Logged

Blog | Twitter

De nu va zice omul intru inima sa "Eu singur si Dumnezeu suntem in lume" nu va avea odihna. - Avva Alonie
17-10-2006, 16:51 
 
MoroJr



Mesaje: 5
OfflineOffline


foarte bun tutorialul ! Insa un lucru nu stiu

ce inseamna un singur & ?

 Confused
Logged
20-01-2009, 13:40 
 
emi
*


Mesaje: 1257
OfflineOffline


^ vezi discutia de aici
Logged
20-01-2009, 14:06 
 
AnaKonD
*


Mesaje: 461
OfflineOffline


^^ in functie de context, operatorul "&" poate fi:

1. operator logic pe biti :

Code:

int a, b,c;

a=14;  //reprezentare binara : 1110
b=11;  //reprezentare binara : 1011

c= a & b;  //se citeste "a si b"; adica c=10, reprezentare binara : 1010




2. referinta (pointer la o variabila)

Code:

int a,b,c;

a=14;
b=11;

void suma(int a, int b, int &c)
{
  c=a+b;
}

int main()
{
   suma(a,b,c);         //c=25

  return 0;
}

Logged

"Sa nu te opresti niciodata din a-ti pune intrebari, curiozitatea sta la baza existentei."(Albert Einstein)
cross the line
20-01-2009, 17:07 
 
Flama
*


Mesaje: 131
OfflineOffline



1. operator logic pe biti :
Nu pe biti ci
Code:
SI pe biti
Logged

Daca pare usor e greu, daca pare greu e absolut imposibil.
20-01-2009, 17:17 
 
AnaKonD
*


Mesaje: 461
OfflineOffline


Mia culpa D'oh .
Logged

"Sa nu te opresti niciodata din a-ti pune intrebari, curiozitatea sta la baza existentei."(Albert Einstein)
cross the line
20-01-2009, 19:08 
Pages: [1]
Print
SkullBox Forum  |  Development  |  Java / C / C++ / C# (Moderators: AnaKonD, astan)  |  Topic: [Curs] C - Lectia 04 - Instructiuni de control
Jump to: