Curs 6
-
Upload
ovidyu-nicu -
Category
Documents
-
view
1 -
download
0
description
Transcript of Curs 6
-
7. Instruciuni repetitive
Instruciunea while
Forma general a instruciunii while este:
while(expresie)
instruciune;
n cazul n care instruciune reprezint o secven de instruciuni, atunci acestea trebuie s fie incluse
ntre acolade. Semnificaia lui while este aceea c se execut corpul lui atta timp ct expresia este
adevrat. Atunci cnd valoarea de adevr a expresiei devine fals, ciclul while i ncheie execuia. Aa
cum reiese din forma general, instruciunea while este o instruciune repetitiv cu test iniial, ceea ce
nseamn c este posibil ca instruciunile din corp s nu se execute niciodat: este cazul n care expresie
are valoare fals nc de la prima parcurgere.
La ntlnirea acestei instruciuni, se evalueaz iniial expresia din paranteze. Dac ea are valoarea
adevrat atunci se execut instruciune. Apoi se revine la punctul n care se evalueaz din nou valoarea
expresiei din paranteze, n felul acesta, corpul ciclului se execut att timp ct expresia din antetul ei este
diferit de zero. n momentul n care expresie are valoarea zero (fals), se trece la instruciunea urmtoare
instruciunii while.
Corpul instruciunii while poate s nu se execute niciodat; dac expresie are valoarea zero de la
nceput, atunci se trece la instruciunea urmtoare instruciunii while fr a se executa niciodat corpul
instruciunii respective.
Corpul instruciunii while este o singur instruciune, care poate fi compus. n felul acesta, avem
posibilitatea s executm repetat mai multe instruciuni grupate ntr-o instruciune compus. De asemenea,
corpul instruciunii while poate fi o alt instruciune while sau s fie o instruciune compus care s conin
instruciuni while. n acest caz se spune c instruciunile while respective sunt imbricate.
O situaie n care se folosete des aceast instruciune repetitiv este aceea n care utilizatorul
dorete executarea corpului de instruciuni att timp ct caracterul instrodus de la tastatur difer de cel
care permite ieirea din program.
Diferena major dintre instruciunile for i while este aceea c instruciunile care formeaz corpul
lui for se execut de un numr cunoscut de ori, n timp ce instruciunile care formeaz corpul lui while
se execut de un numr de ori necunoscut: se execut att timp ct expresia are valoarea true.
Exemplu: S se realizeze un program care permite citirea i afiarea unui ntreg par (ntregul este introdus
de utilizator). Dac utilizatorul introduce un numr impar, se va iei din program.
#include
main()
-
{
int i;
printf("i=");
scanf("%d",&i);
while(i%2==0)
{
printf("i introdus este: %d",i);
printf("\ni=");
scanf("%d",&i);
}
printf("\n\nAti introdus un intreg impar!!!");
getch();
}
Exemplu: S se scrie un program care citete un ir de ntregi separai prin caractere albe i afieaz suma
lor. Dup ultimul numr, se va tasta un caracter alb urmat de un caracter nenumeric, dup care se va
aciona tasta Enter.
#include
main()
{
int nr,suma=0;
while(scanf("%d",&nr)==1)
suma=suma+nr;
printf("suma=%d\n",suma);
getch();
}
Tem: S se scrie un program care calculeaz i afieaz valoarea polinomului:
p(x)=3*x*x-7*x-10
pentru x=1,2,...,10. Dac utilizatorul introduce un x>10, se iese i nu se mai calculeaz!
Instruciunea do-while
Aceast instruciune are urmtoarea form general:
do{
-
instruciuni;
}while (expresie);
do-while este o instruciune repetitiv cu test final, ceea ce nseamn c secvena de instruciuni
se va executa cel puin odat. De asemenea, instruciunile care formeaz corpul lui do-while se vor se
vor repeta pn cnd expresia devine fals.
Exemplu: S se realizeze un program care permite citirea i afiarea de ntregi de la tastatur pn cnd
utilizatorul tasteaz caracterul N sau n pentru ieirea din program.
#include
main()
{
char c;
int i;
do
{
printf("i=");
scanf("%d",&i);
printf("i=%d",i);
printf("\n\nContinuati? (D/N)?");
c=getche();
printf("\n\n");
} while (c!='N' && c!='n');
}
Instruciunea break i instruciunea continue
Instruciunea break permite ieirea dintr-un ciclu, din oricare punct din interiorul su. Atunci cnd
se folosete break, se abandoneaz ciclul respectiv, controlul fiind transferat instruciunii imediat
urmtoare celei repetitive.
Exemplu: S se realizeze un program care s afieze doar numerele de la 0 la 20.
#include
main()
{
-
int i;
for(i=0;i
-
Conversii n C
n cadrul unei instruciuni de atribuire (asignare) n care tipul variabilei din stnga semnului egal
difer de tipul din dreapta, atunci tipul din dreapta este convertit la tipul variabilei din stnga.
n cazul n care tipul din stnga este mai puin cuprinztor dect tipul din dreapta, atunci se va realiza
conversia cu pierdere de informaie;
dac tipul din stnga este mai cuprinztor dect tipul din dreapta, conversia se va realiza fr pierdere
de informaie.
Ex. 4.3. Exemplu conversii:
#include
main()
{
int i=100;
float f=100.11;
i=f;
printf("i=%d\n\n",i);
}
n acest exemplu, s-au declarat dou variabile: o variabil de tip int care este iniializat cu valoarea 100
i o variabil de tip float care este la rndu-i iniializat cu valoarea 100,11. Cnd se realizeaz atribuirea
i=f, deoarece tipul lui i este mai puin cuprinztor dect tipul lui f, conversia se va realiza prin
transformarea valorii lui f n valoare de tipul lui i. n cazul nostru, pe ecran va apare i=100.
Dac f ar fi avut o valoare mai mare de 232-1, atunci conversia s-ar fi fcut cu pierdere de informaie,
deoarece valoarea maxim pe care o poate lua i este 232-1.
Dac se realiza atribuirea f=i, rezultatul ar fi fost: f=100.000000. n acest caz, practic se realizeaz
doar o modificare a formei de reprezentare a numerelor, fr s se realizeze pierdere de informaie.
Acelai lucru se ntmpl i dac se realizeaz conversia din tipul float n tipul double.
Ex. 4.5. Exemplu conversie cu pierdere de informaie
#include
main()
{
int i=128;
char ch;
ch=i;
printf("ch=%d\n\n",ch);
}
-
n acest caz, conversia de la tipul int la tipul char se realizeaz cu pierdere de informaie, deoarece
tipul char are domeniul de valori cuprins n intervalul [-128,127] (tipul char se reprezint pe un octet
8 bii). Astfel, dup compilarea acestui program, pe ecran va apare ch=-127. Pierderea de informaie n
acest caz se produce deoarece doar cei opt bii inferiori ai lui i sunt copiai n ch.
De ce se obine ch= - 127? Aminteam anterior c tipul int este reprezentat intern pe 4 octei.
Aceasta nseamn c numrul 128 va fi reprezentat binar astfel:
00000000 00000000 00000000 10000000
n ceea ce privete tipul char, acesta se reprezint n memoria intern pe un singur octet. n momentul n
care se atribui lui ch valoarea variabilei de tip int, i, se realizeaz conversia de la tipul int la tipul char,
lundu-se n calcul doar cei mai nesemnificativi 8 bii n cazul nostru, ch primete valoarea 10000000,
n care primul bit reprezint bitul de semn, iar ceilali bii reprezint valoarea reprezentat. n cazul
nostru, bitul de semn este 1, ceea ce nseamn c valoarea obinut este una negativ, iar restul de 7 bii
semnific faptul c numrul este 127. Deci, ch=-127.
Operatorul cast
Operatorul cast se folosete atunci cnd se dorete modificarea tipului unei variabile. Acest
operator are forma general:
(tip_nou) variabila
unde tip_nou este tipul de date ctre care se realizeaz trecerea variabilei variabila.
Ex. 4.4. Exemplu de folosire a operatorului cast
#include
main()
{
float f=12.12;
printf("Aplicarea operatorului cast pentru f produce rezultatul: %d\n\n",(int)f);
}
n acest caz, pe ecran va apare: Aplicarea operatorului cast pentru f produce rezultatul:12
Ex. 4.5. S se citeasc un ntreg a i s se calculeze expresia a / (a+1), folosind 3 zecimale.
main()
{
int a;
scanf("%d",&a);
printf("a=%d\ta/(a+1)=%.3f",a,(float)a/(a+1));
getch();
}
-
n exemplul anterior, pentru a obine ctul mpririi cu 3 zecimale este necesar s se realizeze
mprirea. n acest scop, s-a convertit operandul a spre tipul float. n felul acesta, conform regulii
conversiei implicite, se convertete spre float i cel de-al doilea operand i apoi se face mprirea celor
doi operanzi flotani.