Curs 6

7
7. Instrucţiuni repetitive Instrucţiunea while Forma generală a instrucţiunii while este: while(expresie) instrucţiune; În cazul în care instrucţiune reprezintă o secvenţă de instrucţiuni, atunci acestea trebuie să fie incluse între acolade. Semnificaţia lui while este aceea că se execută corpul lui atâta timp cât expresia este adevărată. Atunci când valoarea de adevăr a expresiei devine fals, ciclul while îşi încheie execuţia. Aşa cum reiese din forma generală, instrucţiunea while este o instrucţiune repetitivă cu test iniţial, ceea ce înseamnă că este posibil ca instrucţiunile din corp să nu se execute niciodată: este cazul în care expresie are valoare fals încă de la prima parcurgere. La întâlnirea acestei instrucţiuni, se evaluează iniţial expresia din paranteze. Dacă ea are valoarea adevărat atunci se execută instrucţiune. Apoi se revine la punctul în care se evaluează din nou valoarea expresiei din paranteze, în felul acesta, corpul ciclului se execută atât timp cât expresia din antetul ei este diferită de zero. În momentul în care expresie are valoarea zero (fals), se trece la instrucţiunea următoare instrucţiunii while. Corpul instrucţiunii while poate să nu se execute niciodată; dacă expresie are valoarea zero de la început, atunci se trece la instrucţiunea următoare instrucţiunii while fără a se executa niciodată corpul instrucţiunii respective. Corpul instrucţiunii while este o singură instrucţiune, care poate fi compusă. În felul acesta, avem posibilitatea să executăm repetat mai multe instrucţiuni grupate într-o instrucţiune compusă. De asemenea, corpul instrucţiunii while poate fi o altă instrucţiune while sau să fie o instrucţiune compusă care să conţină instrucţiuni while. În acest caz se spune că instrucţiunile while respective sunt imbricate. O situaţie în care se foloseşte des această instrucţiune repetitivă este aceea în care utilizatorul doreşte executarea corpului de instrucţiuni atât timp cât caracterul instrodus de la tastatură diferă de cel care permite ieşirea din program. Diferenţa majoră dintre instrucţiunile for şi while este aceea că instrucţiunile care formează corpul lui for se execută de un număr cunoscut de ori, în timp ce instrucţiunile care formează corpul lui while se execută de un număr de ori necunoscut: se execută atât timp cât expresia are valoarea true. Exemplu: Să se realizeze un program care permite citirea şi afişarea unui întreg par (întregul este introdus de utilizator). Dacă utilizatorul introduce un număr impar, se va ieşi din program. #include<stdio.h> main()

description

bb

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.