Sunteți pe pagina 1din 6

Laboratorul 8 Structura ciclică cu test final

8. Structura ciclică cu test final

8.1 Instrucţiunea do - while

Pentru un pseudocod de forma:


<instrucţiune 1>
cât timp (<condiţie>) execută <instrucţiune 1>
instrucţiunile C++ sunt:
<instrucţiune 1>; while (<condiţie>) <instrucţiune 1>;
Dar aceste instrucţiuni se pot înlocui cu o singură instrucţiune do-while astfel:
do <instrucţiune 1> while (<condiţie>);
Aceasta nu reprezintă decât structura iterativă cu test final, "repetă instrucţiune cât timp
condiţie"

8.2 Exemple - do - while

#include<iostream.h>
8.2.1 Calculul sumei unor numere citite void main()
de la tastatură până la introducerea {
numărului zero. float s,x; s=0;
cout<<"Dati numerele de adunat
Pseudocodul:
(0-oprire)";
1.s=0 do
2.repetă { cin>>x; s+=x;}
2.1.citeşte x while (x!=0);
2.2.s=s+x cout<<s;
cât timp (x!=0) }

Programul:

8.2.2 Problema 1:
Să se alcătuiască un program în care să fie implementate o funcţie pentru ridicarea lui 2 la o
putere întreagă şi una pentru calculul radicalului de ordinul doi pe baza şirului lui Newton.
Strategia de rezolvare: Funcţia care va calcula puterea întreagă a lui 2 se bazează pe efectul
de deplasare a biţilor din reprezentarea binară a unui număr. Astfel, o deplasare la stânga a
lui a de b ori (a<<b) presupune o înmulţire a lui a cu 2 de b ori: a<<b este echivalentă cu a⋅2b.
La fel, o deplasare la dreapta la nivel de bit, a lui a cu b poziţii (a>>b) presupune o împărţire
a lui a cu 2 de b ori (a⋅2-b).
Construcţia funcţiei ce calculează rădăcina pătrată a unui număr x are la bază şirul lui
⎛ x⎞
Newton, dat prin relaţia de recurenţă an+1 = 0.5⎜an + a ⎟ , unde primul element a1 = 1, iar n>2.
⎝ n⎠
Funcţia calculează termenii succesivi ai şirului până când diferenţa, în valoare absolută,
dintre doi termeni succesivi este mai mică decât eroarea acceptată pentru calcul.

/*Program 8.

35
Laboratorul 8 Structura ciclică cu test final

Calculul ridicarii lui 2 la o return q;


putere intreaga si }
calculul radacinii patrate fara
utilizarea functiei sqrt*/ void main()
{
#include<iostream.h> int a; char Exit;
#include<conio.h> do
#include<math.h> {
clrscr();
int pow2(int x) cout<<"Dati un numar A =";
{//Functia calculeaza 2^n. cin>>a;
int y=1; cout<<"2^"<<a<<" =
return (y<<x); "<<pow2(a)<<endl;
} cout<<"Radical
(2^"<<a<<")="<<rad2(pow2(a))<<endl;
float rad2(float x) cout<<"Pentru iesire apasati->
{//Functia calculeaza radacina e..";
patrata a lui x. Exit=getch();
}
float p=1, q=(1+p)/2, err=1e-6;
do while(Exit!='e');
{p=q; q=(p+x/p)/2;} }
while(fabs(q-p)>err);
printf("\nIntroduceti val x: ");
8.2.3 Calculul unei sume cu o precizie scanf("%f",&x);
impusă T=S=1; k=1;
do
Să se calculeze suma S =
∑ (-1)k·xk
k! până
{
printf("\nk= %d\tT= %12.4f\tS=
k=1 %14.10f\t|T/S|=
când |T/S| < ε. %14.10f",k,T,S,fabs(T/S));
Obs: T[k] = -T[k-1]·x/k, iar S[k] = S[k-1] + T=-T*x/k; S+=T; k++;
T[k] }
while(fabs(T/S)>=eps);
getch();
8.2.3.1 Pseudocod: }
1. Citeşte x, eps,
2. T = S = k = 1, Secvenţele următoare descriu strict
3. Repetă metoda prezentată şi nu întreg
3.1. T = -T·x/k, programul !
3.2. S = S + T,
Programele următoare se bazează pe
3.3. k = k + 1
următoarele instrucţiuni:
cât timp |T/S| ≥ ε
1. împărţire întreagă (modulo) a unui
4. Scrie S
număr întreg la 10 prin care se obţine
cifra unităţilor numărului. Ex: 1234%10
8.2.3.2 Programul →4
2. împărţire propriu-zisă a unui număr
//Calculul unei sume
întreg la 10 prin care se obţine tot un
#include<conio.h>
#include<math.h> întreg. Ex: 1234/10 → 123 şi NU 123.4
#include<stdio.h>
8.2.4 Suma cifrelor unui număr "n"
void main() s=0;nl=n;
{ do
float x,T; double S,eps=1e-05; int {
k; s+=nl%10;//se obtine pe rind
//clrscr(); nl/=10; //fiecare cifra incepind

36
Laboratorul 8 Structura ciclică cu test final

//cu cea a unitatilor 8.2.8 Apariţia unei cifre "a" într-un


} număr "n"
while(nl); nr=0;nl=n;
cout<<"\nSuma cifrelor nr. "<<n<<" do
= "<<s; {
if(nl%10==a)
8.2.5 Ştergerea unei cifre "a" dintr-un nr++;
număr "n" nl/=10;
}
nl=0;
while(nl);
do
cout<<"\nCifra "<<a<<" apare de
{
if (n%10!=a) nl=nl*10+n%10; "<<nr<<" ori";
n/=10;
} 8.2.9 Inserarea unei cifre "a" pe o poziţie
while(n); "k" a unui număr "n"
do nl=0;i=0;//poz.se numără de la
{ sfârsit
n=n*10+nl%10; while(i++<k)
nl/=10; {
} nl=nl*10+n%10;
while(nl); n/=10;
cout<<"\nNoul numar: "<<n; }
nl=nl*10+a;
8.2.6 Oglindirea unui număr "n" do
n_o=0;nl=n; {
do n=n*lD+nl%10; nl/=10;
{ }
n_o=n_o*10+nl%10; while(nl);
nl/=10; cout<<"\nNoul numar este: "<<n;
}
while(nl); 8.2.10 Cifra maximă "cmax" a unui
cout<<"\nOglinditul lui "<<n<<" număr "n"
este "<<n_o; cmax=0;nl=n;
do
8.2.7 Trecerea unui număr "n" din baza {
10 în baza b∈[2..9] if(cmax<n%10)
aux=n_b=0; cmax=nl%10;
do nl/=10;
{ }
aux=aux*10+n%b; while (nl) ;
n/=10; cout<<"\ncmax="<<cmax;
}
while(n); 8.2.11 Trecerea unui număr "n" din baza
do b∈[2..9] în baza 10
{ n_10=0;p=l;
n_b=n_b*10+aux%10; do
aux/=10; {
} n_10=n_10+n%10*p;
while(aux); n/=10;
cout<<"\nNumarul in baza "<<b<<" p*=b;
este "<<n_b; }
while(n);
cout<<n_10;

37
Laboratorul 8 Structura ciclică cu test final

8.3 Exerciţii

Să se alcătuiască programe care să rezolve următoarele probleme:


4.1.e=0 //exponentul la care apare
8.3.1 Descompunerea unui număr în factorul în descompunere
factori primi 4.2.cât timp (n%f==0) //n se divide la f
4.2.1.n=n/f
8.3.1.1 Pseudocodul: 4.2.2.e=e+1
1.citeşte n 4.3.dacă (e<>0) scrie f," la ",e
2.n=abs(n) 4.4.dacă (f==2) f=f+1 altfel f=f+2
3.f=2 //factorul prim de testat
4.cât timp (f<=n)

8.4 Facilităţi de întrerupere a unei secvenţe

8.4.1 Instrucţiunea break


Utilizată în cadrul instrucţiunilor ciclice, instrucţiunea break "forţează" ieşirea din acestea.
Fără a se mai testa valoarea expresiei (condiţia) care determină repetarea corpului
instrucţiunii ciclice, se continuă execuţia cu instrucţiunea care urmează instructiunii ciclice.
Astfel, se întrerupe repetarea corpului instrucţiunii ciclice, indiferent de valoarea condiţiei de
test.
Utilizarea în cadrul instrucţiunii switch: În situaţia în care s-a ajuns la o valoare a unei
expresiei constante egală cu cea a expresiei aritmetice, se execută instrucţiunea
corespunzătoare acelei ramuri. Dacă se întâlneşte instrucţiunea break, parcurgerea este
întreruptă (nu se mai compară valoarea expresiei aritmetice cu următoarele constante), deci
se va trece la execuţia primei instrucţiuni de după switch. Dacă nu este întâlnit break,
parcurgerea continuă. Instrucţiunea break cauzează deci, ieşirea imediată din switch.

8.4.2 Instrucţiunea continue


Întâlnirea instrucţiunii continue determină ignorarea instrucţiunilor care o urmează în corpul
instrucţiunii ciclice şi reluarea execuţiei cu testarea valorii expresiei care determină repetarea
sau nu a corpului ciclului.

8.4.3 Modul de utilizare a instrucţiunilor break şi continue


do while(expresie1) for(expr1; expr2;
{ instructiune1; expr3)
{ instructiune1;
instructiune2; { instructiune1;
if (expresie2) instructiune2; instructiune2;
break; if (expresie2) if (expresie2)
else break; break;
continue; else else
instructiune3; continue; continue;
} instructiune3; instructiune3;
while (expresie1); } }

38
Laboratorul 8 Structura ciclică cu test final

printf("\nIntroduceti
expresia (valoare operator
valoare): ");
8.5 Exemple break, continue scanf("%f %c %f",&x,&op,&y);
switch(op)
{
8.5.1 Calculator de buzunar case '+':z=x+y;break;
case '-':z=x-y;break;
//Instruc de selectie switch case '*':z=x*y;break;
#include<stdio.h> case '/':z=x/y;break;
default: printf("\nOperator
void main() eronat"); cod=0; z=0;
{ }
int cod=1; float x,y,z; char op; printf("%.2f %c %.2f=
while(cod) %.2f",x,op,y,z);
{ }
}

8.6 ÎNTREBĂRI ŞI EXERCIŢII

8.6.1 Chestiuni teoretice


1. Care sunt instrucţiunile care implementează în limbajul C structura condiţională ?
2. Care sunt instrucţiunile care implementează în limbajul C structura secvenţială ?
3. Care sunt instrucţiunile care implementează în limbajul C structura repetitivă cu test iniţial ?
4. Care sunt instrucţiunile care implementează în limbajul C structura repetitivă cu test final ?
5. Ce deosebiri sunt între instrucţiunea while şi instrucţiunea do-while ?
6. Pornind de la sintaxa instrucţiunii for, stabiliţi echivalenţa între aceasta şi instrucţiunile while şi
do-while.

8.6.2 Chestiuni practice


1. Să se calculeze aria unui triunghi, cunoscându-se mărimea laturilor sale. Numerele care
reprezintă mărimile laturilor vor fi introduse de utilizator. Se va testa mai întâi dacă cele 3
numere reprezentând mărimea laturilor pot forma un triunghi ( a <= b+c, b <= c+d, c <= a+b).
2. Să se rescrie următoarea secvenţă, folosind o singură instrucţiune if.
if (n<0)
if (n>=90)
if (x!=0)
int b= n/x;
xy = (x+y)2
3. Să se găsească toate numerele de două cifre care satisfac relaţia: __
4. Să se citească un şir de numere reale, până la întâlnirea numarului 800 şi să se afişeze
valoarea minimă introdusă, suma şi produsul elementelor şirului.
5. Scrieţi un program care să verifice inegalitatea 1/(n+1) < ln[(n+1)/n] < 1/n, unde n este un
număr natural pozitiv, introdus de la tastatură.
6. Fie funcţia
ex-3 , x ∈ [0, 1)
Să se calculeze f(x), x citit de la tastatură.
f(x)= sinx+cosx , x ∈ [1, 2)
0,9ln(x+3) , x ∈ [2, 100]
7. Să se scrie un program care calculează şi afişează maximul a 3 numere reale (a, b şi c) citite
de la tastatură.
8. Să se scrie un program care calculează şi afişează minimul a 3 numere reale (a, b şi c) citite
de la tastatură.

39
Laboratorul 8 Structura ciclică cu test final

9. Să se citească 2 caractere care reprezintă 2 litere mari. Să se afişeze caracterele citite în


ordine alfabetică.
10. Să se citească 3 caractere care reprezintă 3 litere mici. Să se afişeze caracterele citite în
ordine alfabetică.
11. Să se scrie un program care citeşte o cifră. În funcţie de valoarea ei, să se facă următorul
calcul: dacă cifra este 3, 5 sau 7 să se afişeze pătratul valorii numerice a cifrei; dacă cifra este
2, 4 sau 6 să se afişeze cubul valorii numerice a cifrei; dacă cifra este 0 sau 1 să se afişeze
mesajul "Valori mici"; altfel., să se afişeze mesajul "Caz ignorat!".
12. Fie şirul lui Fibonacci, definit astfel:
f(0)=0, f(1)=1, f(n)=f(n-1)+f(n-2) în cazul în care n>1.
Să se scrie un program care implementează algoritmul de calcul al şirului Fibonacci.
13. Să se calculeze valoarea polinomului Cebîşev de ordin n într-un punct x dat, cunoscând
relaţia:
T0(x)=1, T1(x)=x şi Tk+1 (x) - 2xTk (x) + Tk -1(x) = 0
14. Să se citească câte 2 numere întregi, până la întâlnirea perechii (0, 0). Pentru fiecare pereche
de numere, să se calculeze şi să se afişeze cel mai mare divizor comun.
15. Se citesc câte 3 numere reale, până la întâlnirea numerelor 9, 9, 9. Pentru fiecare triplet de
numere citit, să se afişeze maximul.
16. Se citeşte câte un caracter până la întâlnirea caracterului @. Să se afişeze numărul literelor
mari, numarul literelor mici şi numărul cifrelor citite; care este cea mai mare (lexicografic) literă
mare, literă mică şi cifră introdusă.
17. Se citesc câte 2 numere întregi, până la întâlnirea perechii de numere 9, 9. Pentru fiecare
pereche de numere citite, să se afişeze cel mai mare divizor comun al acestora.
18. Să se calculeze suma seriei
1 + x3/3 - x5/5 + x7/7 - …
cu o eroare mai mică decât epsilon (epsilon citit de la tastatură). Să se afişeze şi numărul de
termeni ai sumei.
19. Să se citească un număr întreg format din 4 cifre (abcd). Să se calculeze şi să se afişeze
valoarea expresiei reale: 4*a + b/20 -c + 1/d.
20. Să se scrie un program care afişează literele mari ale alfabetului în ordine crescătoare, iar
literele mici - în ordine descrescătoare.
21. Să se scrie un program care generează toate numerele perfecte până la o limită dată, LIM. Un
număr perfect este egal cu suma divizorilor lui, inclusiv 1 (exemplu: 6=1+2+3).
22. Să se calculeze valoarea sumei urmatoare, cu o eroare EPS mai mică de 0.0001:
S=1+(x+1)/ 2! + (x+2)/ 3! + (x+3)/ 3! + ... , unde 0<=x<=1, x citit de la tastatură.
23. Să se genereze toate numerele naturale de 3 cifre pentru care cifra sutelor este egală cu
suma cifrelor zecilor şi unităţilor.
24. Să se citească câte un număr întreg, până la întâlnirea numărului 90. Pentru fiecare numar să
se afişeze un mesaj care indică dacă numărul este pozitiv sau negativ. Să se afişeze cel mai
mic număr din şir.
25. Să se genereze toate numerele naturale de 3 cifre pentru care cifra zecilor este egală cu
diferenţa cifrelor sutelor şi unităţilor.
26. Să se calculeze suma:
(1 + 2!) / (2 + 3!) - (2+3!) / (3+4!) + (3+4!) / (4+5!) - .....

40

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