IMPLEMENTAREA
STRUCTURILOR REPETITIVE (CICLICE)
Există două
categorii de instrucţiuni ciclice: cu test iniţial şi cu test
final.
Structura ciclică cu test
iniţial este implementată prin instrucţiunile while şi for.
q
Instrucţiunea while
Sintaxa:
while (expresie)
instructiune;
La întâlnirea
acestei instrucţiuni, se evaluează expresie. Dacă aceasta
are valoarea 1 - sau diferită de 0 - (condiţie
îndeplinită), se execută instrucţiune. Se revine apoi în
punctul în care se evaluează din nou valoarea expresiei. Dacă ea este
tot 1 (sau diferit de 0), se repetă instrucţiune, ş.a.m.d.
Astfel, instrucţiunea (corpul ciclului) se repetă atât timp
cât expresie are valoarea diferita de 0. În momentul în care expresie ia valoarea 0 (condiţie
neîndeplinită), se iese din ciclu şi se trece la următoarea
instrucţiune de după while.
Observaţii:
1.
În cazul în care la prima evaluare a expresiei,
aceasta are valoarea zero, corpul instrucţiunii while nu va fi executat niciodată.
2.
Instrucţiune din corpul
ciclului while poate fi compusă (un bloc), sau o altă
instrucţiune ciclică.
3.
Este de dorit ca instrucţiunea din corpul
ciclului while să modifice valoarea expresiei. Dacă nu se
realizează acest lucru, corpul instrucţiunii while se repetă de
un număr infinit de ori.
Exemplu:
int a=7;
while (a==7)
cout<<”Buna ziua!\n”; // ciclu infinit; se
repetă la infinit afişarea mesajului
Exemple:
1. Afisarea cifrelor unui
numar incepand de la unitati
#include <iostream.h>
#include <conio.h>
void main()
{clrscr();
long n;
cout<<"un
numar marisor daca se poate ";
cin>>n;
while(n!=0)
{cout<<n%10<<"-";
n=n/10;
}
getch();
}
2.Cel mai mare divizor
comun si cel mai mic multiplu comun a doua numere intregi.
#include
<iostream.h>
#include
<conio.h>
void main()
{clrscr();
int a,b,a1,b1;
cout<<"a=
";
cin>>a;
cout<<"b=
";
cin>>b;
a1=a;
b1=b;
int cd;
while(a!=b)
if(a>b)
a=a-b;
else
b=b-a;
cd=a;
cout<<"cel mai mare
divizor comun este "<<cd;
int cm;
cm=a1*b1/cd;
cout<<"cel mai mic
multiplu comun este "<<cm;
getch();
}
3.Un
numar natural este palindrom daca parcurs de la unitati este identic cu numarul
initial. Ex: 1221. Sa se determine daca un numar este palindom
long a, aux, inva;
cout<<"a=";
cin>>a;
aux=a;
inva=0;
while(a!=0)
{
inva=inva*10+a%10;
a=a/10;
}
cout<<"inversul este :"<<inva<<endl;
if(inva==aux)
cout<<"numarul
este palindrom";
else cout<<"nu este
palindrom";
q
Instrucţiunea for
În majoritatea
limbajelor de programare de nivel înalt, instrucţiunea for implementează structura ciclică cu număr cunoscut de
paşi . În limbajul C instrucţiunea for poate fi utilizată într-un mod mult mai flexibil.
Sintaxa:
for (expresie1; expresie2;
expresie3)
instructiune;
Nu este obligatorie
prezenţa expresiilor, ci doar a instrucţiunilor vide.
for ( ; expresie2; ) sau: for ( ; ; ) instructiune; instructiune; instructiune;
Exemplu:
In cel de
al doilea caz instructiunea subordonata (instructiune) va cicla la infinit!!!!
Observatii:
Fara a avea
un caracter obligatoriu de cele mai multe ori:
·
Expresia1
este o expresie de initializare a unei variabile contor
Exemple:
Sa se
afiseze literele mari ale alfabetului:
for (char
LitMare='A'; LitMare<='Z'; LitMare++)
cout<<"Litera
"<<LitMare<<" cu codul ASCII”<<(int)LitMare<<'\n';
Cel mai mare
divizor comun a doua numere se poate determina si cu instructiunea for:
int a,b;
cout<<"a=";
cin>>a;
cout<<"b=";
cin>>b;
for(;a!=b;)
if(a>b)
a=a-b;
else
b=b-a;
cout<<endl<<a;
int ok=1;
for( i=2;i<=x/2;i++)
if(x%i==0)
ok=0;
cout<<endl;
if(ok==1)
cout<<"numarul
este prim";
else
cout<<"numarul nu este prim";
q Instrucţiunea do-while
Sintaxa:
do
instructiune;
while(expresie);
Se execută instrucţiune. Se evaluează apoi expresie. Dacă aceasta
are valoarea 1, se execută instrucţiune. Se testează
din nou valoarea expresiei. Se repetă instrucţiune cât timp
valoarea expresiei este 1 (condiţia este îndeplinită). În cazul
instrucţiunii do-while, corpul ciclului se execută cel puţin o
dată.
Exemplu: Se citeşte câte un caracter,
până la întâlnirea caracterului @. Sa se determine cate cifre s-au citit.
Char c;
Int n=0;
do
{//corp do-while
cout<<"Aştept
caract.:";
cin>>c;
if(c>=’0’&&c<=’9’)
n++;
}
while (c!='@');
cout<<"Aţi
introdus "<<n<<” cifre”;
Chestiuni teoretice
1. Care sunt
instrucţiunile care implementează în limbajul C structura
secvenţială?
2. Care sunt
instrucţiunile care implementează în limbajul C structura
repetitivă cu test iniţial?
3. Care sunt
instrucţiunile care implementează în limbajul C structura
repetitivă cu test final?
4. Ce deosebiri sunt
între instrucţiunea while şi instrucţiunea do-while?
5. Pornind de la
sintaxa instrucţiunii for, stabiliţi echivalenţa între aceasta
şi instrucţiunile while şi do-while.
Probleme propuse:
De exemplu:
547:8=68 rest
3;
68:8=8 rest 4;
8:8=1 rest 0;
1:8=0 rest 1
547= 1043
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.
(1 + 2!) / (2 + 3!) - (2+3!) /
(3+4!) + (3+4!) / (4+5!) - .....
12. Suma, produsul,
media aritmetică a primelor n numere naturale.
13. Inversarea unui
număr. Verificarea dacă un număr este palindrom.
14. Suma cifrelor unui
număr.
15. Sa se genereze primele n
numere prime
16. Verificarea dacă un
număr este superprim ( si prefixele lui sunt prime) Ex 2339 este superprim
pentru ca 2339, 233, 23 si 2 sunt numere prime. Observatie: 1 si 0 nu sunt
numere prime.)
17. Să se
afişeze şi să se contorizeze toate numerele prime din intervalul
[a,b].
18. Determinarea
divizorilor unui număr. Suma divizorilor.
19. Să se
determine numerele perfecte până la n (egale cu suma divizorilor lor).
20. Ridicarea la o putere
întreagă a unui număr (fara a utiliza functia pow( ))
21. Descompunerea unui
număr în factori ireductibili.
22. Determinarea cmmdc
şi cmmmc a 2 numere.
23. Determinarea cmmdc
şi cmmmc a n numere.
24. Suma a două
fracţii cu afişarea rezultatului sub formă de fracţie
ireductibilă.
25. Conjectura lui Goldbach:
orice număr par mai mare decât 4 se poate scrie ca sumă de două
numere prime. Să se descompună un număr par ł4 ca sumă de
două nr. prime.
26. Să se determine
perechile de numere gemene până la n citit (numere prime impare
consecutive).
27. Să se
determine un număr până la n citit care să aibă un
număr maxim de divizori.
28. Se citeşte un
număr cu n cifre (nŁ9). Să se determine
numărul obţinut prin eliminarea cifrei / cifrelor din mijloc.
29. Cifra de control a
unui număr. (Cifra
de control a lui 156 se obtine: 1+5+6=12, pt 12 1+2=3 deci 156 are cifra de
control 3)
30. Să se
afişeze numerele de la 1 la n care sunt egale cu suma factorialelor
cifrelor sale. (Ex: 145=1!+4!+5!)
31. Să se genereze toate
cuburile perfecte până la n citit.
32. Să se
afişeze toate numerele până la n care sunt egale cu suma cuburilor
cifrelor sale.
33. Să se genereze
toate numerele pitagorice până la n
citit.