IMPLEMENTAREA STRUCTURILOR REPETITIVE (CICLICE)

 

Există două categorii de instrucţiuni ciclice: cu test iniţial şi cu test final.

 

Implementarea structurilor ciclice cu test iniţial

 

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;

 

Sa se determine daca un numar este prim

 

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:

 

  1. Să se calculeze suma şi produsul primelor n numere naturale, n fiind introdus de la tastatură. Se vor exemplifica modalităţile de implementare cu ajutorul instrucţiunilor do-while, while, şi for.
  2. Să se citească un şir de numere reale, până la întâlnirea numărului 100. Să se afişeze maximul numerelor citite.
  3. Un numar se numeste autopomorfic daca este sufixul patratului sau (ex, 52=25, 62=36, 252=625). Sa se afle toate numerele autopomorfice mai mici sau egale cu n dat.
  4. Să se scrie un program care realizează conversia numărului N întreg, din baza 10 într-o altă bază de numeraţie, b<10 (N şi b citite de la tastatură). Conversia unui număr întreg din baza 10 în baza b se realizează prin împărţiri succesive la b şi memorarea resturilor, în ordine inversă.

 

De exemplu:

547:8=68 rest 3;

68:8=8 rest 4;

 8:8=1 rest 0;

1:8=0 rest 1

 

547= 1043

 

 

  1. 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.

  1. 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.
  2. 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.
  3. Să se scrie un program care afişează literele mari ale alfabetului în ordine crescătoare, iar literele mici - în ordine descrescătoare.
  4. 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).
  5. Să se genereze toate numerele naturale de 3 cifre pentru care cifra sutelor este egală cu suma cifrelor zecilor şi unităţilor.
  6. Să se calculeze suma:

(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.

 

Alte aplicatii