Vous êtes sur la page 1sur 6

Algoritmi si structuri de date (27.10.

2011) Informatic, Matematic, anul 1

ASD_C04

Algoritmi iterativi (continuare) R1. (calculul sumelor) Enunul problemei: Pentru un ntreg n1 dat, s se calculeze valoarea sumei S = 1+2+3+...+n, fr a folosi formula de calcul direct S = n(n+1)/2. Metoda de rezolvare: Suma se poate scrie restrns S = i .
i =1 n

Algoritmul general pentru determinarea unei sume scris restrns S =

i = vi

f (i) este urmtorul:

vf

1. se iniializeaz variabila S cu 0. 2. pentru i = vi, vi+1,.., vf se face S S + f(i) (adic la vechea valoare a sumei se adaug valoarea curent din suma scris restrns). Descrierea algoritmului n pseudocod:
citete n S 0 pentru i=1,n repeta S S + i scrie S Descrierea algoritmului n C++: *orice suma se initializeaza cu 0 *la suma anterioara se aduna val. curenta

#include <conio.h> #include <iostream.h> int n,i,S; //orice var globala se initializeaza cu 0 void main(){ cout<<endl<<"Dati valoarea lui n (n>=1): "; cin>>n; /*S = 0;*/ for (i=1;i<=n;i++) S = S + i; //sau S += i; cout<<"S = "<<S; getch(); }

Dac variabila S se declar global, iniializarea variabilei S cu valoarea 0 nu mai este necesar pentru c orice variabil global declarat ntr-un program C/C++ se iniializeaz automat cu 0. Acest lucru nu mai este valabil ns dac variabila S este declarat local n funcia main sau n alte funcii. Variabila S se poate declara de tip ntreg: - dac se declar n C/C++ de tip int, pentru n = 256 se depete valoarea maxim a domeniului int care este 32767; - dac se declar de tip unsigned int, pentru n = 362 se depete valoarea maxim a domeniului unsigned int care este 65535; - dac se declar de tip long, se depete valoarea maxim a domeniului long care este 2147483647 pentru n = 65535, ns cum n este declarat de tip int acest caz nu este posibil. R2. Enunul problemei: Pentru un n2 ntreg dat, s se calculeze sumei S = 2 + 4 + 6 + ... + n. Metoda de rezolvare: Comparativ cu suma de la programul anterior, de data aceasta for-ul de la algoritmul de calcul al sumei are pasul 2. Descrierea algoritmului n pseudocod:
citete n S 0 pentru i=2,n,2 repeta S S + i scrie S

Algoritmi si structuri de date (27.10.2011) Informatic, Matematic, anul 1

ASD_C04

Descrierea algoritmului n pseudocod n C++:


#include <conio.h> #include <iostream.h> int n,i,S; void main(){ cout<<end<<"Dati valoarea lui n (n>=2): "; //S = 0; for (i=2;i<=n;i+=2) S += i; cout<<"S = "<<S; getch(); }

cin>>n;

R3. (determinarea valorii unui produs) Enunul problemei: Pentru un n0 ntreg dat, s se calculeze n!. Metoda de rezolvare: Cum n! = 123n, putem scrie restrns n! =
vf

i .
i =1

Algoritmul general pentru determinarea unui produs scris restrns P = f (i ) este urmtorul:
i = vi

1. se iniializeaz variabila P cu 1 2. pentru i = vi, vi+1,.., vf se face P P f(i). n cazul nostru, pentru c iniializarea se face cu 1 i aceast valoare reprezint chiar 1! i 0!, for-ul de la pasul 2 poate ncepe de la 2. Descrierea algoritmului n pseudocod:
citete n *n trebuie sa fie mai mare sau egal ca 0 P 1 *orice produs se initializeaza cu 1 pentru i = 2,n repeta P P*i *produsul anterior se inmult. cu val. curenta i scrie P

Descrierea algoritmului n C++: Implementarea acestui algoritm n C/C++ trebuie s in cont de tipurile de date pe care le descriem mai jos. Tipurile ntregi din C/C++ sunt: Dimensiunea Tip Descriere zonei de memorie Domeniul de valori ocupat char, caracter reprezentat n cod 8 bii [128, 127] signed char ASCII caracter reprezentat n cod 8 bii [0, 255] unsigned char ASCII int, ntreg binar cu semn 16 bii [32768, 32767] reprezentat prin complement signed int, short int, fa de 2 signed short int unsigned int, ntreg binar fr semn 16 bii [0, 65535] unsigned short int long, ntreg cu semn n dubl 32 bii [231, 2311] signed long precizie (231 = 2147483648) ntreg fr semn 32 bii [0, 2321] unsigned long (2321 = 4294967295)

Algoritmi si structuri de date (27.10.2011) Informatic, Matematic, anul 1

ASD_C04

Tipurile reale din C/C++ sunt: Dim.zonei Domeniul de valori de memorie ocupat 32 bii valorile absolute ale acestora (exceptnd numr real reprezentat n float valoarea 0) sunt n intervalul virgul flotant n simpl [3.4*10-38, 3.4*1038] precizie 64 bii valorile absolute ale acestora (exceptnd double numr real reprezentat n valoarea 0) sunt n intervalul virgul flotant n dubl [1.7*10-308, 1.7*10308] precizie 80 bii valorile absolute ale acestora (exceptnd numr real reprezentat n long valoarea 0) sunt n intervalul double virgul flotant n dubl [3.4*10-4932, 1.1*104932] precizie Cum valoarea factorialului crete foarte repede, trebuie acordat mare atenie declarrii variabilei care se folosete pentru determinarea factorialului: - dac se declar de tip int, pentru n = 8 se depete valoarea maxim a domeniului int care este 32767; - dac se declar de tip unsigned int, pentru n = 9 se depete valoarea maxim a domeniului unsigned int care este 65535; - dac se declar de tip long sau unsigned long, se depete valoarea maxim a domeniului care este 2147483647 respectiv 4294967295 pentru n = 13. - atunci se poate declara de tip real, de exemplu float, afiarea fcndu-se cu 0 zecimale. Tip Descriere
#include<conio.h> #include<iostream.h> int n,i; float P; void main(){ cout<< end<<"Dati valoarea lui n (n>=0): "; cin>>n; P = 1; for (i=2;i<=n;i++) P = P*i; //sau P*=i; cout<<"n! = "<<P; getch(); }

R4*. Enunul problemei: S se afieze 1!, 2!, , n!, pentru n1 ntreg citit de la tastatur. Descrierea algoritmului n pseudocod:
citete n *n trebuie sa fie mai mare sau egal ca 1 pentru k = 1,n,1 repeta *pentru k=1,2,...,n calculam k! k_fact 1 pentru i = 2,k,1 repeta k_fact k_fact*i scrie k_fact *pe rand nou

Pentru implementarea algoritmului n C/C++, cum numrul de rnduri ale unui ecran text este 25 (sau 43 sau 50 n cazul n care setarea implicit acestuia este schimbat), dac valoarea lui n este mai mare trebuie fcut derulare pagin cu pagin, n caz contrar se poate vizualiza doar ultima pagin de ecran. X 1 80 1 25 Y 3

Algoritmi si structuri de date (27.10.2011) Informatic, Matematic, anul 1

ASD_C04

Pentru aceasta se poate folosi funcia wherey() care returneaz valoarea liniei pe care se afl cursorul n ecranul de rulare la un moment dat i poate avea valori ntre 1 i 25. Dac s-a ajuns la rndul 25 atunci cerem utilizatorului s apese o tast, apoi se terge ecranul, cursorul revenind pe linia nti i se continu afiarea.
Descrierea algoritmului n C++:
#include<iostream.h> #include<conio.h> int n,i,k; float k_fact; void main(){ cout<< end<<"Dati valoarea lui n (n>=1): "; cin>>n; for (k=1;k<=n;k++) { k_fact = 1; for (i=2;i<=k;i++) k_fact *= i; if (wherey()>=25) /*afisare cate o pg de 25 linii*/ //inainte de a afisa ma uit pe ce rand este cursorul { getch(); clrscr(); } cout<<endl<<k<<"! = "<<k_fact; } getch(); }

R5. Enunul problemei: S se calculeze Pn, Ank i Cnk, pentru n, k 0, n k ntregi, citite de la tastatur. Metoda de rezolvare: Reamintim c: Pn = 1 2 n = n! =
k An = k Cn = n

i
i =1

n n! = (n k + 1) (n k + 2) n = i (n k )! i = n k +1

Ak n! (n k + 1)(n k + 2) ... n = = n k!(n k )! 1 2 ... k k!

Descrierea algoritmului n pseudocod:


citete n,k *n,k0, nk perm 1 pentru i = 2,n,1 repeta perm perm*i aranj 1 pentru i = n-k+1,n,1 repeta aranj aranj*i k_fact 1 pentru i = 2,k,1 repeta k_fact k_fact*i comb aranj/k_fact scrie perm,aranj,comb

Descrierea algoritmului n C+:


#include <iostream.h> #include <conio.h> int n,i,k; float perm,aranj,comb,k_fact;

Algoritmi si structuri de date (27.10.2011) Informatic, Matematic, anul 1

ASD_C04

void main(){ cout<< end<<"Dati valoarea lui n (n>=0): "; cin>>n; cout<< end<<"Dati valoarea lui k (k>=0 si k<=n): "; cin>>k; perm = aranj = k_fact = 1; //atribuire multipla se exec de la dr for (i=2;i<=n;i++) perm *= i; cout<<endl<<"Permutari de "<<n<<": "<<perm; for (i=n-k+1;i<=n;i++) aranj *= i; cout<<endl<<"Aranjamente de "<<n<<" luate cate "<<k<<": "<<aranj; for (i=2;i<=k;i++) k_fact *= i; comb = aranj/k_fact; cout<<endl<<"Combinari de "<<n<<" luate cate "<<k<<": "<<comb; getch(); }

R6. Enunul problemei: S se determine dac un numr natural n este perfect (suma divizorilor proprii pozitivi + 1 este egal cu valoarea numrului). De exemplu, n = 6 este numr perfect deoarece 1 + 2 + 3 = 6. Metoda de rezolvare: Avem de calculat o sum, deci se poate considera variabila S care se iniializeaz cu 0. Apoi, se parcurge mulimea divizorilor posibili i dac se gsete un divizor se adaug la suma anterioar. La final, dac S + 1 = n, atunci n este numr pefect, altfel nu este numr perfect. Descrierea algoritmului n pseudocod:
citete n *n1 S 0 *suma adiv proprii pentru i = 2,[n/2],1 repeta* posibilii divizori proprii daca n%i = 0 atunci * i chiar este divizor al lui n S S + i * il adun la S daca S+1 = n atunci scrie Este numar perfect altfel scrie Nu este numar perfect

Descrierea algoritmului n C++:


# include <iostream.h> # include <conio.h> void main(){ cout<<"n = "; cin>>n; int i,s=0; for (i=2;i<=n/2;i++) if (n%i == 0) s+=i; if (s+1==n) cout<<"Este numr perfect"; else cout<<"Nu este numr perfect"; getch(); }

Algoritmi si structuri de date (27.10.2011) Informatic, Matematic, anul 1

ASD_C04

Tema 04 termen maxim 2 sptmni (se va transmite prin e-mail ntr-un fiier electronic sau personal pe foaie scris de mn sau listat cel trziu 11.11.2011): 1) Scriei n pseudocod (eventual i n C/C++) algoritmul pentru calculul sumei S = 13 + 24++n(n+2), pentru n1. 2) Scriei n pseudocod (eventual i n C/C++) algoritmul pentru calculul sumei S=

k!, pentru n1.


k =1

3) Scriei n pseudocod (eventual i n C/C++) algoritmul pentru a stabili dac un numr ntreg n1 dat este deficient (suma divizorilor proprii+1 < n) sau abundent (suma divizorilor proprii+1 > n). De exemplu, n=12 este abundent deoarece 1+2+3+4+6=16>12, iar n=14 este deficient deoarece 1+2+7<14. 4) Scriei n pseudocod (eventual i n C/C++) algoritmul pentru a stabili dac dou numere ntregi sunt prietene (1+suma divizorilor proprii ai unuia = cellalt). De exemplu 220 i 284 sunt prietene, deoarece sd(220) = 1 + (2 + 4 + 5 + 10 + 11 + 20 + 22 + 44 + 55 + 110) = 284 si sd(284) = 1 + (2 + 4 + 71 + 142) = 220.

Vous aimerez peut-être aussi