Documente Academic
Documente Profesional
Documente Cultură
Definiie 2: Algoritmul1 este alctuit dintr-o succesiune de etape, numite pai, care trebuie
parcurse ntr-o anumit ordine astfel nct plecnd de la datele iniiale ale problemei, ntr-un timp
finit sa ajungem la rezultatul dorit.
Algoritmul este noiunea fundamental a informaticii. Totul este construit n jurul
algoritmilor (i al structurilor de date, cum ar fi listele sau grafurile).
Definiie 3: Descrierea unui algoritm de rezolvare a unei probleme sau a unei situaii date ntr-un
limbaj de programare se numeste program sau cod surs.
1
Cuvntul are la origine numele matematicianului persan Al-Khwarizmi
Claritatea - proprietatea algoritmului de a descrie cu exactitate i fr ambiguiti paii
care trebuiesc parcuri n rezolvarea problemei.
Eficiena - este proprietatea unui algoritm de a se termina nu numai ntr-un numr finit, ci
i "rezonabil" de pai, chiar dac acesta nu este cel mai mic posibil (nu este optim).
Algorimul este ineficient i dac rezultatul se obine ntr-un timp mai lung dect cel dorit
sau permis.
Existena unei intrri (datele de prelucrat). ntruct operatorii se aplic unui operand (sau
i mai multor operanzi deodat), este de neconceput un algoritm fr niciun operand.
Intrrile permise formeaz mpreun un set (mulime) specific de obiecte sau valori, care
se numete "domeniul" algoritmului.
Existena unei ieiri (rezultatele). Este de neconceput un algoritm care nu are nicio ieire,
deoarece n acest caz intr n discuie nsi utilitatea sa.
Operaii de intrare ieire: datele de intrare se vor citi de la tastatr sau din fiiere text i
ele reprezint valorile iniiale cu care se incepe rezovarea unei probleme. Datele de ieire
reprezint rezultatul problemei dup parcurgerea algoritmului i aceste fie vor fi afiate
pe ecran, fie vor fi scrise n fiiere text.
Operaia de atribuire: reprezint operaia n urma creia valoarea unei expresii
(matematice, logice sau relaionale) este memorat ntr-o variabil
Operaia de decizie: determin valoarea de adevr a unei expresii logice i n funcie de
rezultatul obinut se continu execuia programului pe una din cele doua ramificatii
posibile(adevrat sau fals).
4. Scrierea codului surs: Aceasta este etapa n care algoritmul scris n limbaj pseudocod
este transcris n limbaj de programare, innd cont de regulile impuse de acesta i
repectnd semnificaia construciilor sintactice corecte impuse de limbajul de
programare.
5. Corectarea erorilor sintactice: Corectarea unui cod surs din punct de vedere sintactic se
numeste compilare2. n aceasta etap programul este verificat, iar eventualele greeli sau
omisiuni ale respectrii regulilor sintactice sau semantice sunt semnalate de compilator
print-o list de erori. Cel care a scris programul are obligaia s corecteze aceste erori
folosindu-se de masajele de eroare afiate precum i de cunotinele sale. Mesajul de
eroare afiat, care semnaleaz o eroare de compilare, nu indic ntotdeauna corect
modalitatea de corectare (el este mai mult informativ). Erorile de eroare vor fi cutate
ncepnd de la poziia semnalat de compilator sau de la poziia semnalat spre nceputul
programului. O serie de greeli frecvent ntlnite la nceptori sunt generate de definirea
eronat a tipurilor de date care vor contine rezultatele. Dac rezultatul ateptat depete
ca valoare domeniul de definiie stabilit atunci aceasta greeala nu va fi identificat de
ctre compilator, deci nu va fi corectat in acest etap. La execuia programului vom
avea ns surpriza unor rezultate neateptate, chiar daca soluia de rezolvare gsit este
corect si programul scris nu are greseli de compilare.
2
Un compilator este un program (sau set de programe) care traduce textul scris ntr-un limbaj de programare (limbajul surs low level) ntr-un alt limbaj de calculator (numit limbaj int-
hight level). Sursa original se numete de obicei cod surs iar rezultatul cod obiect. n general codul surs este compilat pentru a crea un program executabil.
Limbajul pseudocod i schema logic
Pentru ntocmirea unei scheme logice corecte sunt necesare respectarea unor anumite
reguli dup cum urmeaz:
Orice schem logic se ntocmete de sus n jos;
Legtura intre blocurile schemei se face numai prin sgei, pentru a stabili sensul de
parcurgere;
n cazul ntlnirii unui bloc de decizie se precizeaz deasupra liniilor de legtur cnd
expresia
1
Structurile fundamentale din programarea structurat sunt structura liniara, structura alternativa i structurile repetitive.
Aplicaii practice
1
ASCII este acronimul pentru American Standard Code for Information Interchange, ceea ce nseamn "Codul Standard
American pentru Schimbul de Informaii". ASCII reprezint un sistem de codificare a caracterelor bazat pe alfabetul englez.
Codurile ASCII reprezint caractere text pentru calculatoare, echipamente de comunicaie i echipamente care lucreaz cu text.
Setul de caractere ASCII conine 128 de caractere: litere mari i mici, numere, elemente de punctuaie i coduri de control.
Definiie 2: Unitatea elementar de memorare a informaiilor n memoria intern a calculatorului
este bit-ul, care poate avea doar valoarea 0 sau valoarea 1( modelarea fizic a sistemului binar
este comutatorul.0 nu trece curent electric, 1- trece curent electric).
K1 1 K1 0
A B A B
Definiie 3: Un octet(byte) este alctuit dintr-un grup de 8 bii i orice informaie poate fi
memorat utiliznd ntotdeauna un numr ntreg de octei, msurndu-se n multipli de
octei(1024 octei= 1Kb, 1024 Kb=1Mb, etc).
n funcie de valoarea pe care o au datele numerice ele pot reprezenta numere naturale,
numere ntregi sau numere reale, iar pentru fiecare astfel de numr se vor aloca n memorie un
numr diferit de octei.
(1102+8101+8100)10 = (020+121+122+023+124+125+026+127)2
O reprezentare a unui numr ntro baz de numeraie notata B foloseste doar cifre din
inteervalul [0, B-1]. Trecerea unui numar de la o baz la alta presupune aflarea unei secvente
unice de resturi conform algoritmului urmtor:
numrul se imparte la baza si se retine restul obtinut. Acesta constituie ultima
cifra din reprezentare in acea baza.
ctul obtinut in urma acestei prime impartiri este din nou imparti la baza si se
retine iarasi restul. Acest rest constituie a doua cifra, in ordinea de la dreapta la
stanga, a reprezentarii in baza aleasa.
algoritmul continu pn cnd cul obinut este mai mic dect baza. Acest ct va
reprezenta cea mai semnificativ cifr a numrului n baza data.
Tabelul urmtor prezinta paii acestui algoritm pentru trecerea numarului 25 n baza 2:
Nr. baz
a
25:2 25 2 (25)10=(11001)2
rest 1 12 2
0 6 2
0 3 2
1 1 2
1 0
Reprezentarea n baza 2 a numrului 25 se obine lund n ordine invers resturile
mparirii la 2.
Pentru a putea memora un numr natural n memoria intern a claculatorului se pot aloca
1,2 sau 4 octei. Pe un octet se pot memora numere naturale cuprinse n intervalul [0..255]
bit: 7 6 5 4 3 2 1 0
cea mai mic valoare natural reprezentat pe un octet este 0: 0 0 0 0 0 0 0 0
adic numrul natural 0=020+021+022+023+024+025+026+027.
bit: 7 6 5 4 3 2 1 0
cea mai mare valoare natural reprezentat pe un octet este 0: 1 1 1 1 1 1 1 1
adic numrul natural 255=12 0+121+122+123+124+125+126+127= 1+2+4+8+16+32+64+128
Propun ca exerciiu de calcul reprezentarea intervalului de numere naturale care pot fi
memorate pe 2 octei.
De exemplu, numerele ntregi reprezentate pe 32 bits(4 octei) pot lua valori cuprinse n
intervalul [-2147483648, 2147483647]. Adunarea, scderea i nmulirea acestor numere
returneaz rezultate exacte atta vreme ct nu se depesc limitele precizate. n cazul n care
apare o depasire (overflow) rezultatul este imprevizibil. Rezultatul mpairii numerelor ntregi
reprezentate este tot un numr ntreg obinut prin rotunjirea rezultatului corect la ntregul imediat
mai mic.
Modul n care numerele reale sunt reprezentate n memorie este reglementat de IEEE1
Floating Point Standard2, un set de reguli care ne ajut n prezicerea gradului de inexactitate a
rezultatelor calculelor aritmetice. Una dintre sursele de erori n calculul tiinific este eroarea de
1
Institute of Electric and Electronic Egineering
2
IEEE Floating Point Standard standardul IEEE de reprezentare a numerelor n virgul mobil este un set de convenii de
reprezentare i de operare a numerelor reale n memoria calculatorului i care are cteva obiective:
Creterea preciziei operaiilor cu numere reale.
Standardizarea operaiilor cu numere reale pe toate platformele de calcul.
Stabilirea felului n care sunt tratate erorile.
rotunjire datorat calculelor aritmetice inexacte efectuate de calculator. Eroarea de rotunjire face
parte din categoria erorilor inevitabile dar consecinele sale difer de la o problema la alta, de la
o strategie de rezolvare la alta. O singura operaie aritmetic efectuat de calculator cu numere
reale va da de cele mai multe ori un rspuns cu un grad relativ mare de precizie.
Pentru reprezentarea numerelor n calculator se folosesc dou formate de reprezentare:
formatul cu virgul fix:
partea ntreag. partea zecimal de exemplu:12.351 sau -54.789
formatul cu virgul mobil: s-a impus datorit necesitii de a reprezenta n sistemele de
calcul numere foarte mari sau foarte mici cu un grad de precizie ridicat. La baza acestui
mod de reprezentare se situeaz reprezentarea numerelor reale cu ajutorul mantisei(indic
ordinul de mrime al numrului printr-o putere a bazei) i exponentului exponentul
(mrimea numrului n cadrul ordinului respective):
mantisEexponent.
Mantisa n reprezentarea normalizat este un numr subunitar, E reprezint valoarea
bazei 10, iar exponentul este un numr ntreg care stabilete valoarea numrului real. De
exemplu: numrul real -102.224 scris n virgul fix va fi egal cu 0.102224E3 n virgul
mobil.
Aplicaii practice
1. Datele de intrare reprezint:
a. Rezultatele ateptate i obinute prin prelucrarea unor valori cu ajutorul unui
algoritm de calcul
b. Valori constante pe toat durata de execuie a algoritmului
c. Un set de valori iniiale , cunoscute i care reprezint punctul de plecare n
rezolvarea unei probleme
d. Nici un rspuns nu este corect
2. O variabil se caracterizeaz prin:
a. .....................................
b. .....................................
c. .....................................
d. .....................................
3. Valoarea unei variabile este:
a. Format din unul sau mai multe caractere cu condiia ca primul caracter s nu fie
cifr
b. O mulimea de valori posibile
c. O locaie din memoria calculatorului
d. Valoarea efectiv pe care o are la un moment dan interiorul codului surs.
4. Un bit este alctuit din 8 octei?
a. Adevarat;
1
ASCII este acronimul pentru American Standard Code for Information Interchange, ceea ce nseamn "Codul Standard
American pentru Schimbul de Informaii". ASCII reprezint un sistem de codificare a caracterelor bazat pe alfabetul englez.
b. Fals
5. Determinati urmtoarele valori echivalente:
a. 1024 byte reprezint ......................Mb;
b. 1024 Mb reprezint...............Gb;
c. 1Gb este egal cu ...................octei;
d. 1 octet este format din..............biti.
6. Reprezentai pe un octet urmtoarele numere naturale:
a. 85
b. 200
c. 15
d. 255
7. Care sunt valorile naturale reprezentate n urmtorii octei:
a. 10011100
b. 11000011
c. 10010000
d. 11110000
8. Reprezentai urmtoarele numere ntregi pe un octet:
a. -15
b. 24
c. -12
d. 30
9. Pentru reprezentarea numerelor ntregi n memoria calculatorului se utilizeaz primul bit
din reprezentare(cel mai din stnga) ca bit de semn. Astfel, daca acesta are valoarea 1
atunci numrul respectiv va fi negativ?
a. Adevarat;
b. Fals.
10. Transformai urmtoarele numere reale din formatul n virgul fix, n formatul n virgul
mobil:
a. 12.21
b. -56.98
c. 0.34
d. 3456.089
11. Transformai urmtoarele numere reale scrise n virgul mobil n formatul virgul fix:
a. 0.76E-2
b. 0.543265644E5
c. 0.8700077E2
d. -0.347611E-6
12. Care este codul ASCII pentru urmtoarele caractere:
a. A are codul ................., D are codul..................,V are codul......................;
b. 0 are codul..................., 7 are codul..................,9 are codul .......................;
c. b are codul.................., f are codul..................., x are codul........................
13. Numrul de caractere din codul ASCII extins este de 256?
a. Adevarat
b. Fals
14. Un caracter ocup n memorie
a. 2 octei;
b. 1 octet;
c. 4 octeti;
d. 256 de octei.
15. Pentru orice informaie se aloc n memoria calculatorului un numr ntreg de octei?
a. Adevarat;
b. Fals.
Lecia 3 Elemente de baz ale limbajului C++
Pentru a putea utiliza cu uurin un limbaj de programare trebuie s cunoatem
urmtoarele doua aspecte:
1. sintaxa limbajului: reprezint totalitatea regulilor de scriere n limbajul respectiv
2. semantica limbajului: reprezint cunoaterea construciilor sintactice corecte i
semnificaia acestora
Aceste aspecte se studiaz spre exemplu i atunci cnd nvei o limb strin. Dac nvei
doar cuvintele i nu nvei i regulile gramaticale nu vei reui s te exprimi ntr-un mod coerent.
Spre deosebire ns de un limbaj natural, n cazul nostru studiul unei limbi strine, dac ntr-o
exprimare folosim n mod gresit o expresie ntr-un context avem anse destul de mari ca
interlocutorul s ne neleag, atunci cnd comunicm cu un calculator, trebuie s repectm cu
exctitate regulile de comunicare. Calculatorul nu face presupuneri, nu ghicete ceea ce ai fi dorit
s-i spunei. Dac nu v exprimai corect ntr-un limbaj de programre nu veti obine dect un ir
considerabil de mesaje de eroare.
Setul de caractere
n limbajul C++ setul de caractere utilizat pentru scrierea programelor este setul de
caractere al codului ASCII:
litere mari i mici ale alfabetului englez
cifrele sistemului zecimal
semnele matematice i de punctuaie i separatori: +,-,*,/,%,<,>,=,#,!,&,|,?,^,(,),[,],{,},;
Separatori i comentarii
Separatorii au rolul de a delimita unitile lexicale dintr-un program. Iat lista separatorilor
admii n limbajul C++:
(,) parantezele rotunde ncadreaz lista de parametrii a unei funcii, sau precizeaz
ordinea de efectuare a operaiilor pentru evaluarea unei expresii.
{ } acoladele ncadreaz instruciunile compuse, care se mai numesc i blocuri.
[ ] parantezele drepte ncadreaz dimensiunile tablourilor
" " ghilimelele ncadreaz irurile de caractere
' ' apostrofii ncadreaz un singur caracter
; fiecare instruciune se ncheie cu caracterul ;
/* */ comentariile sunt ncadrate de caracterele /* i */ sau dac dorim ca un singur rnd
din codul surs sa fie comentat, sau n dreptul unei instruciuni s apara un comentariu
folosim caracterele //.Comentariile sunt texte care vor fi ignorate n momentul execuiei
programelor, dar au rolul de a clarifica si a face un cod surs mai clar pentru cel care
citete acel cod.
Identificatori
Definiie1: Identificatorii sunt acele constructii care au rolul de a denumi elemente ale
programului si reprezint nume de: constante, variabile, funcii, etc.
Din punct de vedere sintactic un identificator este constituit dintr-o succesiune de litere
mari sau mici ale alfabetului englez, cifrele sistemului zecimal si caracterul _, cu condiia ca
primul caracter s nu fie o cifr.
Spre exemplu:
Identificatori corect scrii Identificatori greit scrii
max_1 nume prenume
citire_vector 1max
_unu a+b
Observaii:
1. un identificator poate avea orice lungime, dar sunt luate n considerare doar primele 31 de
caractere
2. n limbajul C++ se face diferenta dintre literele mari i literele mici, din acest punct de
vedere spunem c limbajul este case-sensitive (identificatorii max_1 i Max_1 sunt
diferii).
3. este recomandat ca identificatorii folosii s fie sugestivi, pentru a nu apela la comentarii
pentru a ntelege scopul n care este folosit un identificator. Este util s construim
identificatori prin compunerea mai multor cuvinte, i recomandat este ca iniiala fiecrui
cuvnt s fie majuscul (Citire_Vector, Afisare_Matrice)
Cuvintele cheie sunt identificatori speciali, rezervai limbajului C++, cu neles predefinit
i care pot fi utilizai numai n construciile sintactice n care sunt definii. n limbajul C++ toate
cuvintele cheie se scriu doar cu litere mici, iar n programele din aceast carte cuvintele rezervate
vor fi scrise ngroat. Tabelul care cuprinde toate cele 32 de cuvinte cheie ale limbajului C++
este :
auto double int struct
break else long switch
case enum register typedef
char extern return union
const float short unsigned
continue for signed void
default goto sizeof volatile
do if static while
void main()
{ //declaratii locale n functia main
// instructiuni c++
}
Unde:
Directivele preprocesor sunt fiiere librrii memorate separat si care au extensia .h.
Astfel:
iostream.h este un fisier antet (header) care este utilizat pentru gestionarea intrrile i
ieirile implicite de date (datele de intrare se vor prelua mplicit de la tastatura, si
datele de ieire vor fi afiate n mod implicit pe monitorul). Librria iostream.h face
parte din biblioteca implicit a limbajului C++.
n funcie de alte obiuni ale utilizatorului se vor insera n codul surs si alte fiiere antet cum ar
fi:
conio.h - este un vechi fiier antet, folosit de vechile compilatoare C pentru a realiza
interfata utilizatorului(cele mai folosite funcii definite n biblioteca conio.h sunt
clrscr()-sterge ecranul cu toate datele afiate n urma execuiei unui program,
getch() citeste de la tastaur un caracter, dar caracterul citit nu este afisat pe ecran,
se utilizeaz n situaia n care dorim sa oprim n anumite puncte un program n
execuie pentru a putea vedea i analiza informaiile afisate; dup apasarea oricrei
taste programul i continu execuia cu urmtoarea instruciune)
math.h este un fiier care face din biblioteca standard a limbajului C, unde sunt
definite funciile matematice (cum ar fi radical din x sqrt(x), ridicare la putere
pow(a,b), modulul unui numr abs(a),funciile trigonometrice, etc.
fstream.h-este un fiier n care sunt definite funciile de baz pentru lucru cu fiiere
text. Stream-urile implicite tastaura i monitorul se vor schimba n fiiere text de
intrare sau de iesire.
Dup includerea n program a fiierelor header urmeaz o seciune rezervat definirii de
tipuri de date i variabile globale.
Definiie 2: Definirile globale de variabile se fac la nceputul programului si acestea vor fi
cunoscute n toate funciile din program.
Definiie 3: Definirile locale de variabile se fac n cadrul unei fucii i ele sunt cunoscute doar n
funcia n care au fost definite.
n cazul programelor simple, care conin doar funcia main() nu este necesar definirea
globala a variabilelor.
Funciile utilizator :
definirea oricrei funcii este constuit din antetul funciei si corpul funciei
antetul funciei conine numele funciei, tipul rezultatului pe care funcia l calculeaz i o
list de parametri prin care funcia comunic cu exteriorul ei, ncadrat ntre paranteze
rotunde:
tip_rezultat nume_functie(lista de parametri)
nu fac obiectul materiei de clasa a IX-a, ele vor fi nvate pe larg n clasa a X-a
Funcia main() este o fucie special, mai este numit i funcia principal sau programul
principal, prezena ei este obligatorie n orice program C++ deoarece execuia oricrui program
ncepe cu aceasta. Pentru nceput vom scrie doar programe constituite doar din funcia main().
Cel mai simplu program C++, care desigur nu are nici un efect este:
void main()
{ }
4
6
5
Unde:
1. bara de titlu n care este trecut mediul de programare Borland C++ for DOS
2. butoane pentru minimzare/ maximizare i inchidere aplicaie
3. bara de meniu a mediului de programare care conine opiunile: File, Edit, Search,
Compile, Debug, Project, Options, Windows, Help
4. zona de lucru n care veti scrie programele C++
5. meniul Help care conine semnificaia principalelor taste funcionale pentru operaiile de
baz:
F1- lanseaz help-ul limbajului C++ pentru a ne ajuta n cazul semnificaiei, modului
de execuie al unei comenzi, sintax, definire
F2- tast utilizat pentru a memora pe hard fiierul curent deschis i care conine
codul surs al programului scris in C++
F3-deschide o nou fereastr in care se va scrie un cod surs. Dup apasarea tastei F3
trebuie precizat numele noului fisier in forma nume.cpp
ALT+F9 realizeaz operaia de compilare a programului, adic o verificare din punct
de vedere sintactic a programului scris, si care va afia toate erorile din program.
F10 permite cursorul sa ajung n partea de meniu principal al limbajului C++
6. 1:1 precizeaz poziia curent a cursorului n zona de lucru, n cazul nostru linia 1,
coloana 1.
Pentru a afia aceast fereast pe intreg ecranul monitorului apasai ALT+ENTER.
Meniul File conine urmtoarele obiuni:
New - Deschide un nou fisier surs cu numele implicit
Noname00.cpp, sau ....001.cpp
Open... - deschide un fisier cpp existent pe disk
Save salveaz fisierul curent
Save as - realizeaz un lat fiier cu continut identic cu cel
curent, dar cu nume schimbat
Save all - salveaya continutul tuturor fisierelor deschise
Change dir...-permite schimbarea directorului curent in care
va fi memorat fisierul curent
Print tipareste la imprimanta continutul sursei programului
curent
Quit - inchide aplicaia Borland C++.
Etape n scrierea si execuia unui program C++:
1. se deschide aplicaia Borland C++
2. se stabileste directorul curent n care vom salva sursa programului folosind File
Change dir... selecie director dorit si la final se apasa butonul OK
3. Se deschide un fisier nou : File New sau direct apasnd tasta F3, caz n care trebuie sa
stabilim un nume pentru noul fiier
4. se scrie n zona de lucru codul surs al programului
5. se salveaz pe parcursul editrii programului si la terminarea acestei operaii continutul
programului utiliznd File Save sau tasta F2
6. Se verifica respectarea regulilor sintactice compilnd programul folosind combinaiile de
taste ALT+F9 sau din meniul superior alegnd Compile Compile
7. dup ce au fost corectate toate erorile de compilare, se mai salveaz o dat programul
scris dup care se lanseaz n execuie prin combinaia CTRL+F9 sau din meniul
superior RunRun
8. n aceast etap se verific corectitudinea funcionrii programului scris verificnd i
analiznd rezultatele afiate.
Tipuri de date standard
Noiunea de dat a fost prezentat pe larg n lecia trecut. Orice limbaj de programare dispune
de un set de date predefinite numite i tipuri de date standard. Tipurile de date standard sunt
prezentate n urmtorul tabel:
Grupa
Nr. octei Mod de reprezentare n
de Tipul Domeniu de valori
ocupai memorie
dat
char 1 octet cu semn -128...127 codul ASCII al
unsigned char 1 octet fara semn 0...255 caracterului.
int 2 octeti cu semn -32768...23767 complement fa de 2
ntreg
unsigned int 2 octeti far semn 0...65535 n baza 2
long 4 octei cu semn -231..231-1 complement fa de 2
unsigned long 4 octei fara semn 0.. 232-1 n baza 2
-38
[3.410 ...3.410 ] u38
virgul mobil simpl
float 4 octei cu semn
[-3.410-38...-3.41038] precizie
[1.710-308...1.710308] u
double 8 octei cu semn virgul mobil dubl precizie
[-1.710-308...-1.710308]
real -4932 4932
[3.410 ...3.410 ]
u virgul mobil dubla
long double 10 octei cu semn
[-3.410-4932...- precizie
3.4104932]
void Tip de dat special pentru care mulimea valorilor este vid
Observaii:
n cazul tipului de dat char, dei a fost introdus pentru stocarea datelor de tip
alfanumeric, el poate fi folosit n calcule numerice i logice n intervalul de valori pe care
le poate stoca.
n cazul datelor de tip char, int se pot folosi modificatorii de tip:
o unsigned pentru a obine doar numere naturale,
o long pentru a modifica dimensiunea reprezentrii
n limbajul C++ nu exist un tip de date special pentru valorile logice. Valoarea 0 este
asociat valorii de adevr fals, orice valoare diferit de 0 fiind asociat valorii de
adevr adevrat.
Pentru a declara o variabil n limbajul de programare C++ se folosete urmtoarea costrucie
sintactic:
denumire_tip_standard variabil;
Dac dorim s declarm mai multe variabile de acelai tip este suficient s le separm cu
aracterul virgula. Exemplu:
Declarare variabile Efect
int a,b,c; am definit trei variabile numite a,b, c de tip intreg
float x; x variabil reala simpl precizie
char ch; ch variabil de tip caracter
unsigned n; variabila n este de tip int fr semn
unsigned long m; variabila m este de tip long fr semn
unsigned char p; variabila p este de tip char fara semn
double d; variabila d este un numar real dubl precizie
Operatori aritmetici
Operator Semnificaie
+ adunare
- scadere
* nmulire
/ a/b
daca a i b sunt dou valori ntregi
determin ctul mpartirii
dac a i b sunt doua valori reale
determina rezultatul mpririi
% determin restul mparirii a dou numere
nu se aplica valorilor float sau double
Exemple:
Expresie matematic Valoare obinut
Dac avem dou variabile a=20 i b=3 definite de tip int atunci:
a+b 20+3=23
a-b 20-3=17
b-a 3-20= -17
a/b 20/3=6
a%b 20%3=2
b/a 3/20=0
b%20 3%20=3
(a+b)/(a-b) (20+3) / (20-3)=23/17=1
(a+b)%(a-b) (20+3) % (20-3)=23%17=6
(a+b)/2 (20+3)/2=23/2=11
Operatori logici
Aceti operatori se aplic doar datelor de tip ntreg i au ca efect aplicarea operaiilor
logice cunoscute(negaie, conjuncie, disjuncie i disjuncie exclusiv) bit cu bit. Acetia
sunt prezentai n urmtorul tabel:
bit: 7 6 5 4 3 2 1 0 Valoare
a=25 0 0 0 1 1 0 0 1 25
b=2 0 0 0 0 0 0 1 0 2
Atunci rezultatul urmatoarelor operatii va fi:
~a 1 1 1 0 0 1 1 0 -26
a&b 0 0 0 0 0 0 0 0 0
a|b 0 0 0 1 1 0 1 1 27
a^b 0 0 0 1 1 0 1 1 27
A<<b 0 1 1 0 0 1 0 0 25*22=100
a>>b 0 0 0 0 0 1 1 0 25/22=6
Operatori de atribuire
Operatorii de atribuire sunt operatori binari care permit modificarea valorii unei variabile.
Limbajul C++ are un singur operator de atribuire simplu (=) i 10 operatori de atribuire compui
cu ajutorul operatorului de atribuire simplu.
Operaia de atribuire simpl are urmtoarea sintax:
variabil = expresie;
Efect:
se calculeaz valoarea expresiei i se obine un rezultat;
rezultatul se memoreaz la adresa variabilei.
Efectul acestei operaii este ntotdeauna de la dreapta la stnga
Atenie!
A nu se confunda operaia de atribuire cu operaia matematic desemnat prin acelai
simbol =. De exemplu daca avem declaraia int a=10, operaia a=a+1; n informatic
este perfect corect si are ca semnificaie schimbarea valorii variabilei a la valoarea 11. Din
punct de vedere matematic relaia a=a+1 este o relaie gresit.
Operaia de atribuire compus are urmtoarea sintax:
variabil operator = expresie;
unde operatorul aparine mulimii {*, /, %, +, -, <<, >>, &, |, ^}.
Expresia din partea dreapt a semnului = poate fi la rndul ei tot o operaie de atribuire,
cu alte cuvinte se pot scrie operaii de atribuire nlnuite respectnd urmtoarea sintax:
variabil_1=variabila_2=...=variabila_n=expresie;
Exemplu:
Fie dou variabile a=30 i b=2 de tip ntreg int atunci:
Operatie de atribuire compus Operaie echivalent Efect
a + = b; a=a+b; a are valoarea 32
a - = b; a=a-b; a are valoarea 28
a* = b; a=a*b; a are valoarea 60
a / = b; a=a/b; a are valoarea 15
a=b*=2 a=b*2; a are valoarea 4
a=b=a*b; a=b=60; a i b au valoarea 60
Operatori condiionali
Operatorul de adres(referin)
Este un operator unar care permite determinarea adresei zonei de memorie n care este
stocat o variabil. Acest operator este & si se utilizeaz dup urmtoarea sintax general:
&variabil
Operatorul de conversie implicit este un operator unar care permite conversia fortat
a tipului unei expresii la un tip specificat. Forma general este:
(tip nou)expresie
Exemplu:
1. Dac considerm dou variabile de tip ntreg int a=20 si b=15 si dorim s calculm
media aritmetic dintre cele dou variabile scriem:
(float) (a+b)/2 rezultatul expresiei fiind 17.5
n lipsa conversiei rezultatului operatorul / va calcula ctul mpartirii sumei (a+b) la doi
iar rezultatul obtinut va avea valoarea 14.
2. Daca considerm variabila de tip int a=70 si dorim s calculm valoarea expresiei
a*1000 rezultatul obinut va depi limita superioar admis tipului int, adica 32767 si
rezultatul afiat va eronat i va avea valoarea 4464. Pentru a obine rezultatul corect
atunci rezultatul expresiei date trebuie fortate la tipul long si astfel expresia dat i va
modifica forma astfel : (long)a*1000
Evaluarea expresiilor
Evaluarea unei expresii presupune determinarea valorii acelei expresii, prin nlocuirea n
expresie a fiecrei variabile cu valoarea ei i a fiecrei funcii cu valoarea returnat de funcia
respectiv i efectuarea operaiilor precizate de operatori. n evaluarea unei expresii se ine cont
de :
Existena parantezelor
Asociativitate
Prioritatea operatorilor
Etape n evaluarea unei expresii:
Se vor calcula n primul rnd expresiile din interiorul parantezelor, ncepnd cu cele mai
interioare
n situaia n care avem o expresie fr paranteze atunci ordinea de evaluare este dat de
prioritatea operatorilor folosii
n cazul n care avem mai multi operatori de aceiai prioritate , se va ine cont de
asociativitatea operatorilor.
n limbajul C++ operatorii se vor asocia de la stnga la dreapta, excepie fcnd operatorul de
atribuire, operatorii unari i condiionali care se asociaz de la dreapta la stnga. n situaia n
care operanii nu au acelai tip, atunci pe parcursul evalurii expresiei se vor realiza n mod
automat o serie de conversii implicite de tip dup urmatoarea regul: operandul care are un
domeniu de valori mai mic va trece n urma conversiei implicite la tipul operandului care are cel
mai mare domeniu de valori.
Aplicaii practice
Operaia de citire
Definiie 1: Citirea datelor reprezint operaia prin care una sau mai multe variabile
primesc valori prin introducerea lor de la tastatur sau prin extragerea lor de pe un suport
extern(adic dintr-un fiier text, acest lucru ns va fi studiat mai trziu n lecia despre fiiere).
Operaia de afiare
Definiie 2: Prin afiarea sau scrierea datelor vom ntelege operaia prin care
rezultatele obinute prin prelucrarea datelor de intrare vor fi afiate pe ecranul monitorului, fie
vor fi memorate ntr-un fiier text pe un suport extern de memorare.
Stream (flux) de ieire
datele de ieire curg din interior(memoria
Memoria calculatorului) spre exterior(ecran)
calculatorului
n fiierul antet iostream.h este definit acest stream de ieire a datelor de la tastatur,
denumit cout (console output). Atunci cnd dorim s afim datelele le vom extrage din
fluxul de ieire, folosind operatorul de ieire <<. Din acest punct de vedere forma general a
operaiei de afiare este:
cout<<expresie;
Ca efect, se evaluez expresia, iar valoarea ei este convertit ntr-o succesiune de
caractere care vor fi afiate fie pe ecran fie in fisier. i operatorul de ieire poate fi utilizat
nlnuit atunci cand dorim sa afim mai multe date pe ecran:
cout<<expresie_1<<expresie_2<<expresie_3<<<<expresie_n;
Pentru ca afiarea unor date s se realizeze de la inceputul randului urmtor se va folosi
manipulatorul numit endl(end line).
De exemplu:
1.Se citesc de la tastatur dou numere ntregi a i b.
Scriei un program care calculeaz i afieaz pe ecran suma
lor.
Algoritm Program C++ Rezultat afiat
#include<iostream.h>
void main()
{ int a,b;
citeste a,b cout<<"a=";
(numere ntregi) cin>>a;
cout<<"b=";
cin>>b;
scrie a+b cout<<"Suma ";
cout<<<<a<<"+"<<b<<"="<<a+b;
}
Rezultat afiat
Aceast metod este denumit sugestiv regula celor trei pahare, desi practic varsarea
continutului unui pahar n alt pahar nu este identic cu operatia de atribuire, cand variabilele au
aceaiasi valoare.
Avem iniial A,B,C trei pahare care au aceiai capacitate. n primul pahar A se gasete o
bautur de culoare roie, n al doilea pahar B se gaseste o bautur de culoare verde iar al treilea
pahar C este gol. Se cere s se schimbe continutul paharului A cu coninutul paharului B fr a
amesteca buturile.
Iniial:
A B C A B C
A B C A B C
Rezultat afiat
Rezultat afiat
Rezultat afiat
Probleme rezolvate
Relaiile matematice care determin maximul i minimul dintre cele dou numere sunt:
(a b a b ) (a b a b )
max( a, b) min( a, b)
2 2
Tinnd cont de aceste informaii putem scrie urmtorul program:
Algoritm Program C++
#include<iostream.h>
#include<conio.h>
#include<math.h>
void main()
{ clrscr();
int a,b;
citeste a cout<<"a=";cin>>a;
citeste b cout<<"=";cin>>b;
scrie max(a,b) cout<<"Valoarea maxima este:"<<(a+b+abs(a-b))/2;
getch();
}
Rezultat afiat
sau
2. Se citesc dou numere ntregi a i b. Scriei un program
care afieaz media aritmetic a numerelor date.
Relaia matematic de calcul a mediei aritmetice dintre doua numere a i b este:
a b
ma ,
2
Asa cum tim operatorul / aplicat intre doua numere intregi conduce la obinerea unui
rezultat intreg care reprezint ctul mpririi dintre cele dou numere. Cum nu ntotdeauna
suma celor dou numere este un numr par, atunci rezultatul asteptat este un numr real.
Programul care realizeaz acest lucru este:
Algoritm Program C++
#include<iostream.h>
#include<conio.h>
void main()
{ clrscr();
int a,b;
citeste a cout<<"a=";cin>>a;
citeste b cout<<"b=";cin>>b;
a b cout<<"ma"<<(float)(a+b)/2<<endl;
scrie ma 2 getch();
}
Rezultat afiat
Rezultat afiat
De la matematic tim ca aria unui triunghi atunci cand sunt cunoscute inaltimea si baza se
b h
face cu ajutorul relaiei: aria , iar rezultatul acestei expresii este de tip real. Atunci:
2
Algoritm Program C++
#include<iostream.h>
#include<conio.h>
void main()
{ clrscr();
Citeste b int b,h;
citeste h cout<<"baza triunghiului :";cin>>b;
b h cout<<"inaltimea triunghiului :";cin>>h;
scrie cout<<"Aria triunghiului este "<<(float)(b*h)/2;
2 getch();
}
Rezultat afiat
Rezultat afiat
Aplicaii practice
1. Se citesc de la tastatur dou numere ntregi. Scriei un program care s determine care
este cel mai mic numar numr citit.
Exemplu: dac a=40 i b=12 se va afia 12
2. Sa se determine ultima cifra a sumei a+b, unde a i b sunt dou numere de trei cifre
fiecare, date de la tastatur.
Exemplu: dac a=143 i b=125 suma lor este 268 i se va afia 8
3. Se citeste de la tastaur un numar a format din trei cifre. Scriei un program care
calculeaz i afieaz pe ecran suma cifrelor numrului dat.
Exemplu: daca a=468 suma cifrelor este 8+6+4=18 i se va afia 18
4. Se citeste de la tastaur un numar a format din trei cifre. Scriei un program care
calculeaz i afieaz pe ecran cea mai mare cifr din numrului dat.
Exemplu: daca a=731 se va calcula cu formulele matematice de mai sus
max(a,b,c)=max(7,3,1)=7 i se va afia pe ecran 7
5. Se citeste de la tastaur un numar a format din trei cifre. Scriei un program care
calculeaz i afieaz pe ecran numrul obinut prin inversarea cifrelor numarului dat.
Exemplu: daca a=592 se va afia 295
6. Se citeste de la tastaur un numar a format din trei cifre. Scriei un program care
calculeaz i afieaz pe ecran numrul obinut prin eliminarea cifrei din mijlocul
numarului dat.
Exemplu: daca a=371 se va afia 37
7. Fie a un numr format din cinci cifre a1a2a 3a4a5. S se afieze pe ecran un triunghi
format din cifrele numrului dat astfel:
a3
a2a3 a4
a1a2a3a4a5
Exemplu: daca a=37156 se va afia un triunghi astfel:
3
715
37156
8. Fie a un numr format din cinci cifre a1a2a 3a4a5. S se afieze pe ecran un triunghi
format din cifrele numrului dat astfel:
a1a2a3a4a5
a2a3 a4
a3
Exemplu: daca a=37156 se va afia un triunghi astfel:
37156
715
3
9. S se calculeze aria unui triunghi cunoscnd laturile a,b,c ale triunghiului. Indicaie:
pentru calculul ariei triunghiului se va utiliza formula lui Heron pentru calculul ariei:
aria=p(p-a)(p-b)(p+c), unde p este semiperimetrul triunghiului.
Exemplu: dac a=3, b=4 si c=5 atunci se va afia 6.
10. Perimetrul unui ptrat ete egal cu latura altui ptrat. tiind c suma perimetrelor este x s
se calculeze ariile celor dou ptrate
Exemplu: Pentru x=20 se va afia aria1=1 aria2 = 16
11. Se dau dou numere maturale a i b cu trei cifre fiecare. S se afieze numrul care are
suma cifrelor mai mare.
Exemplu: daca a=487 i b=912, atunci suma cifrelor numarului a este 19, iar suma cifrelor
numarului b este 12, deci pe ecran se va afisa 487.
12. Se citesc de la tastatur cinci numere naturale a1, a2, a3, a 4, a 5.Scriei un program
care s foloseasc o singur variabil auxiliar pentru a permuta circular valorile celor 5
variabile astfel:
a1 a2 a 3 a4 a5
a2 a3 a 4 a5 a1
a3 a4 a 5 a1 a2
a4 a5 a1 a2 a 3
a5 a1 a 2 a3 a4
a1 a2 a 3 a4 a5
Exemplu: dac a1=5, a2=6, a 3=7, a4=8, a5=9 atunci pe ecran se va afia:
56789
67895
78956
89567
85678
56789
13. Se dau de la tastatur dou numere naturale a i b, de cte patru cifre fiecare. Se cere s
se afieze numrul care are suma cifrelor mai mic.
Exemplu:dac a=5213 i b=3748, atunci suma cifrelor numrului a este
2+1+5+3=11, iar suma cifrelor numrului b este 8+7+4+3=22, atunci se va afia pe
ecran 5213.
* * **************
*** * * *
***** ********* * *
******* ******* * C++ *
********** ***** * *
* *** * *
* * **************
15. Care este efectul urmtorului program?
#include<iostream.h>
#include<conio.h>
void main()
{clrscr();
int a,b;
cout<<"a=";cin>>a;
b=(a>=0) ? 1:-1;
cout<<b;
getch();
}
16. Care va fi valoarea variabilei b la sfritul urmtorului program? Determinai ce operaie
se execut.
#include<iostream.h>
#include<conio.h>
void main()
{clrscr();
int a,b;
cout<<"a=";cin>>a;
b=1<<a;
cout<<b;
getch();
}
Lecia 4. Structura alternativ
Structura alternativ apare n practic n dou variante i anume:
Structura alternativ: n acest caz se va executa doar unul din dou
blocuri de instruciuni n funcie de valoarea de adevr a unei expresii logice
Structura alternativ multipl: n aceast situaie se va executa un
bloc de instruciuni din mai multe variante posibile.
Structura alternativ
Structura alternativ este implementat n limbajul C++ de instruciunea IF. n continuare
vom prezenta modul de reprezentare a acestei structuri n limbaj pseudocod, n schem logic i
n limbajul de programare C++. Modul de execuie este identic pentru oricare din cele trei
reprezentri.
Auzim n viata de zi cu zi afirmaii de genul:
DAC am promovat la toate materiile, ATUNCI
ma voi duce in tabara,
ALTFEL
stau sa invat.
Se remarc aici trei cuvinte ce au un rol deosebit: DACA, ATUNCI, ALTFEL. Propozitia
are trei componente i anume:
o conditie, transcris prin am promovat la toate materiile, conditie pe
care o vom nota cu C;
o aciune transcris prin mesajul m voi duce n tabr, notata cu B1,
aciune asociata cu cuvntul ATUNCI, adic se execut dac i numai dac am
promovat la toate materiile;
o aciune transcris prin mesajul stau s nv, notat cu B2, aciune asociat
cu cuvntul ALTFEL, adic se execut dac i numai dac NU am promovat
la toate materiile
Pot exista i cazuri particulare de utilizare a acestei structuri, atunci cand unul dintre cele
doua blocuri de instruciuni lipseste.
Cazul 1. Daca lipseste B2 atunci structura se reprezinta astfel:
Schema logic Pseudocod Instructiune C++
B1
Cazul 2. Daca lipseste B1 atunci structura se reprezinta astfel:
Schema logic Pseudocod Instructiune C++
B2
De exemplu dac valoarea variabilei x este 100 putem utiliza instructiunea if astfel:
1 if( x= =100)
2 cout<< valoare a lui x este 100;
Dac dorim s executm mai mult de o instruciune acestea trebuie grupate intre { , } astfel:
1 if( x= =100)
2 { cout<< valoare a lui x;
3 cout<<x;
4 };
Daca apar si intruciuni care trebuie executate atunci cnd conditia este fals putem scrie asa:
1 if( x= =100)
2 { cout<< valoare a lui x;
3 cout<<x;
4 };
5 else
6 cout<<valoarea lui x nu este 100
Pot exista i situaii n care structurile alternative sunt incluse unele in altele. In acest caz spunem
ca instruciunilie if sunt imbricate. Exista o regula de asociere a cuvntului else de if:
n situatia instructiunilor if imbricate, si atunci cand pentru
gruparea instruciunilor nu se folosesc acolade cuvantul else se
asociaz primului cuvant if aflat la stanga lui.(asemanator cu
asocierea inchiderii corecte a grupurilor de paranteze din
matematica).
n exemplul urmator este sugerat cum sunt imbricate 3 instructiuni if. Pentru a le putea identifica
usor ele sunt scrise cu aceiasi culoare (negru, albastru si portocaliu).
if(c1)
if(c2) se executa cand c2 adevarata
if(c3)
instructiunea1;
else
instructiunea2; se executa cand c1 adevarata
else
instructiunea 3
else
instructiunea 4;
Daca n aceasta schem grupm instruciunile cu acolade se poate schimba fundamental structura
programului:
if(c1)
if(c2) se executa cand c2 adevarata
{ if(c3)
instructiunea1; }
else
instructiunea2; se executa cand c1 adevarata
else
instructiunea 3
Se observ ca primul cuvant else este asociat cu cel de-al doilea if, acest lucru fiind
determinat de gruparea intre acolade a instructiunii if (c3), reprezentate pe desen cu portocaliu.
Aplicaii rezolvate
1. Se citesc dou numere ntregi a i b. S se determine valoarea
maxim dintre ele.
Se citesc valorile celor doua numere si valoare cea mai mare dintre ele va fi memorata n
variabila max. La sfarsit valoarea variabilei max va fi afisata pe ecran
Algoritm Program C++
#include<iostream.h>
#include<conio.h>
void main()
{clrscr();
intregi a,b int a,b,max;
citeste a cout<<"a="; cin>>a;
citeste b cout<<"b="; cin>>b>>b;
daca a>b atunci if(a>b)
| max=a max=a;
|altfel else
| max=b max=b;
|_ cout<<"Valoarea maxima este "<<max;
scrie max getch();
}
Rezultat afiat
cnd valoarea variabilei c este mai mare dect valoarea variabilei a, deci rezult c valoarea
maxim dintre cele trei numere este valoarea lui c;
Cazul 2: reprezentat n urmtorul desen:
cnd valoarea variabilei c este mai mic dect valoarea variabilei a (nu conteaz n acest
moment raportul dintre variabilele b i c), deci rezult c valoarea maxim dintre cele trei
numere este valoarea lui a.
Un raionament asemntor se realizeaz plecnd de la presupunerea c valoarea
variabilei a este mai mica decat valoarea variabilei b. Acest algoritm complet este sris mai jos:
Algoritm Program C++
#include<iostream.h>
#include<conio.h>
void main()
intregi a,b {clrscr();
citeste a int a,b,c,max;
citeste b cout<<"a="; cin>>a;
Citeste c cout<<"b="; cin>>b;
daca a>b atunci cout<<"c="; cin>>c;
| daca c>a atunci if(a>b)
| | max=c if(c>a)
| |altfel max=c;
| | max=a else
| |_ max=a;
|altfel else
| daca c>b atunci if(c>b)
| | max=b max=c;
| |altfel else
| | max=a max=b;
| |_ cout<<"Valoarea maxima este "<<max;
|_ getch();
scrie max }
Rezultat afiat
Dar, acest mod de determinare a valorii maxime este greu de aplicat atunci cnd numrul
variabilelor crete la mai mult de trei. Pentru a obine un algoritm simplu de aplicat pentru
determinarea valorii maxime dintre oricate variabile se va proceda astfel:
Pas 1 : Compar prima dat valoarea variabilei a cu valoarea variabilei b, i dac
valoarea lui a este mai mare dect valoarea lui b interschimb valorile celor dou
variabile, obinnd n acest fel valoarea maxim dintre primele dou variabile n
variabila b.
Pas 2: Compar de aceasta data valoarea variabilei b cu valoarea variabilei c, i dac
valoarea variabilei b este mai mare decat valoare lui c interschimb valorile celor
dou variabile, obinnd astfel valoarea maxim dintre cele trei variabile n variabila
c.
Pas 3: afiez valoarea variabilei c ca fiind valoarea maxima dintre a,b si c.
Algoritm Program C++
#include<iostream.h>
#include<conio.h>
void main()
{clrscr();
intregi a,b int a,b,c,aux;
citeste a cout<<"a="; cin>>a;
citeste b cout<<"b="; cin>>b;
citeste c cout<<"c="; cin>>c;
daca a>b atunci if(a>b)
| aux=a { aux=a;
| a=b a=b;
| b=aux b=aux;
|_ };
daca b>c atunci if(b>c)
| aux=b {aux=b;
| b=c b=c;
| c=aux c=aux;}
|_ cout<<"Valoarea maxima este "<<c;
getch();
scrie max }
Rezultat afiat
Rezultat afiat
Rezultat afiat
Aplicaii practice
1. Care este efectul urmatorului program:
#include<iostream.h>
#include<conio.h>
void main()
{clrscr();
int a=3,b;
b=++a;
if(a==b)
cout<<"sunt egale !";
else
cout<<"sunt diferite!";
getch();
}
2. Fie algoritmul:
a. Care este rezultatul urmatorului algoritm daca real f,x
x are valoarea 0 si 3? citeste x
daca x<0 atunci
| fx/2
b. Scrieti programul C++ corespunzator |altfel
algoritmului dat. | daca x=0 atunci
| | f 10
| |altfel
| | fx*x
c. Pentru ce valori ale variabilei x se va executa | |_
operatia de atribuire fx/2? |_
scrie f
Atunci cnd se dorete repetarea unei aciuni de un anumit numr de ori este necesar
utilizarea unei structuri repetitive. n funcie de numrul repetrilor acestea se clasific n:
Structuri repetitive cu numr nedeterminat de pai
o Cu test iniial
o Cu test final
Structuri repetitive cu numr fix de pai
Mod de execuie:
Pas 1 :Se determin valoarea de adevr a condiiei notat C;
Pas 2: Dac este adevrat atunci se execut blocul de instruciuni notat BI i se revine la
pas1
Pas 3: Dac este fals atunci se prsete structura repetitiv.
Observaii:
Dac la prima evaluare a condiiei C valaorea de adevar este Fals, atunci blocul de
instruciuni BI nu va fi executat nici macar o singur dat ci se va prsi structura
repetitiv cu test iniial;
Evaluarea condiiei C se face la fiecare reluare a structurii si este recomandat ca forma ei
s fie ct mai simpl;
Utilizarea acestei structuri este recomandat atunci cnd nu se cunoate numrul de
repetri ale buclei i atunci cnd condiia poate avea valoarea fals nc de la intrarea n
structur;
Blocul de instruciuni notat BI poate conine orice fel de structur de control, deci i o
alt structur repetitiv cu test iniial(while-uri imbricate);
Buclele infinite nu vor fi sesizate ca erori de compilare;
Utilizatorul este obligat s fie atent n evitarea formrii de bucle infinite, i s verifice ca
dup un anumit numr de repetri s existe premizele transformrii n Fals a valorii
condiiei C.
Structura repetitiv cu test final
n acest caz blocul de instruciuni este executat iniial fr nici o verificare a unei
condiii, aceasta finnd verificat la final. n limbajul C++ este cunoscut sub denumirea de
structura do-while. Reprezentarea acestei structuri este:
Mod de execuie:
Pas 1 :Se execut blocul de instruciuni notat BI;
Pas 2: Se calculeaz valoarea de adevr a condiiei notate C;
Pas 3: Daca este adevrat atunci se revine la pas1
Pas 3: Dac este fals atunci se prsete structura repetitiv.
Observaii:
BI va fi executat cel puin o singur dat, atunci cnd la prima evaluare a condiiei C
rezultatul este Fals;
spre deosebire de structura repetitiv cu test iniial, n acest caz blocul de instruciuni BI
se execut cel puin o singur dat;
este recomandat utilizarea ei n situaiile n care nu se cunoate numrul de repetri ale
buclei i exist certitudinea executrii cel puin o singur dat a blocului de instruciuni;
utilizatorul este obligat s fie atent n evitarea formrii de bucle infinite i s verifice ca
dup un anumit numr de repetri s existe premizele transformrii n fals a valorii
condiiei C i deci se prseasc structura repetitiv;
BI
Limbajul C++
for(iniializare; condiie oprire; pas)
instruciune;
sau:
for(iniializare; condiie oprire; pas)
{ instruciune1;
instruciune2;
.............
instruciunen;
};
unde:
expr1- reprezint valoarea iniial a variabilei de tip contor
C - condiia de oprire, sau valoarea final la care trebuie s ajung valoarea variabilei
contor
Pas - reprezint o valoare constant care are scopul de a modifica n progresie aritmetic
cresctoare/descresctoare valoarea variabilei contor
Mod de execuie
pas1 - se iniializez variabila contor cu valoarea expresiei expr1. Aceast operaie se
execut o singur dat;
pas 2 - se verific indeplinirea condiiei de oprire;
pas 3 - dac nu este ndeplinit condiia de oprire atunci se execut blocul de instruciuni
notat BI;
pas 4 - se adaug valoarea pasului la valoarea variabilei contor i se revine la pasul 2;
pas 5 dac condiia de oprire este ndeplinit atunci se ncheie execuia acestei structuri.
Observaii
dac pasul este pozitiv, n momentul n care valoarea variabilei contor devine mai
mare dect valoarea final atunci se va ncheia execuia structurii repetitive cu numr
fix de pai;
numrul de repetri ale blocului de instruciuni BI se calculeaz cu relaia:
valoare finala valoare initiala
numr de repetri= 1;
pas
dac valoarea iniial este egal cu valoarea final atunci Bi se va executa o singur
dat, indiferent de valoarea i semnul pasului;
dac valoarea iniial este mai mare dect valoarea final i pasul este pozitiv atunci
BI nu se va executa nici mcar o singur dat.
Linia contor=contorpas nu apare nici n limbajul pseudocod i nici n forma
instruciunii for, ea se subntelege i execut automat la fiecare nou repetare a
structurii.
Blocul de instruciuni poate fi alctuit din orice fel de instruciune a limbajului C++,
iar n condiia n care se dorete executarea mai multor instruciuni n cadrul
instruciunii for, atunci acestea trebuie grupate ntre acolade.
Conversii ntre structurile repetitive
ntre cele trei tipui de structure sunt premise urmtoarele operaii de conversie :
FOR
(structur repetitiv
cu numr fix de pai)
WHILE DO-WHILE
(structur repetitiv (structur repetitiv
cu test iniial) cu test final)
Instruciunea for poate fi nlocuit ntotdeauna de una dintre structurile repetitive while
sau do-while, dar nu ntotdeauna o structur while sau do-while poate fi nlocuit cu o
instruciune for. Atunci cnd realizai o conversie din instruciunea while n do-while trebuie sa
avei grij ca secvena de cod obinut dup conversie sa fie echivalent cu secvena iniial (s
se obin acelai rezultat).
De exemplu:
Dac nlocuim structura repetitiv cu numr fix de pai cu o structur repetitiv cu test iniial
atunci obinem urmtorul algoritm:
s=0
i=1
ct timp i<=10 execut
| s=s+i
| i=i+1
|_
scrie s
Algoritm Transformarea
citeste n citeste n
ct timp n<=10 executa daca n<=10 atunci
| afiseaza n | executa
| n=n+2 | | afiseza n
| | | n=n+2;
| |cat timp n<=10;
| |
|
Explicaii:
Dac valoarea citit de la tastatur n cazul algoritmului dat este mai mare
dect 10 atunci programul nu afiseaz nimic
Dac valoarea citit de la tastatur este mai mica sau egal cu 10 atunci
programul afiseaz numerele de la n pn la 10 din doi n doi.
Daca n transformarea structurii ct timp n execut ct timp nu ineam cont
de modul de execuie diferit al acestora i nu foloseam structura dac,
pentru valori mai mari dect 10 algoritmii nu erau echivaleni
B1
dac C1 atunci
| B2
|_
ct timp C2 execut
| dac C3 atunci
| | B3
| |altfel
| | B4
| |_
| B5
|_
B6
Dac ne uitm cu atenie pe algoritmul dat vom identifica dou structuri
alternative(marcate cu albastru) i o structur repetitiv cu test iniial (marcat cu rou). Se
observ uor c una din tructurile alternative este naintea structurii repetitive, iar cea de-a doua
structur alternativ este inclus n structura repetitiv.
5. Fie urmtorul algoritm care conine o structur repetitiv cu numr fix de pai(for). Se cere:
S se nlocuiasc cu o structur repetitiv cu test iniial(while)
S se nlocuiasc cu o structur repetitiv cu test final(do-while).
6. Dac valoarea citit pentru n este 8291, care va fi valoarea variabilei r, dup execuia
urmtoarei secvene de algoritm:
1. citete n
2. r=0
3. execut
4. | r = (r*10+n%10)*10
5. | n=n/100
6. |ct timp n>=10
7.
8. scrie r
Pentru a determina valoarea variabilei r trebuie s executm programul pas cu pas, iar cel
mai simplu mod este de a urmri valorile variabilelor ntr-un tabel cu urmtoarea structur:
Linia
n r condiia n>=0
executata
1 8291 - -
2 8291 0 -
4 8291 (0*10+1)*10=10 -
5 82 10 Adevarata
4 82 (10*10+2)*10=1020 -
5 0 1020 Falsa
8 Afieaz valoarea 1020
unde:
21. Scriei algoritmul n pseudocod pentru urmtoarele scheme logice i identificai structurile de
control care le alctuiesc:
22. Fie urmtorii algoritmi scri n limbaj pseudocod:
Se cere: a.
ct timp C1 execut
| daca C2 atunci
a. Realizai schema logic pentru fiecare algoritm; | | executa
b. Care sunt structurile repetitive ntalnite n fiecare | | | B1
algoritm? | | |cat timp C3;
c. Cte structuri alternative identificai n fiecare | |
| |altfel
algoritm dat? | | cat timp C4 executa
| | | B2
| |
|
| B3
| pentru i=vi,vf,+1
| | B4
|
i=1
ct timp i<=5 execut
| j=1
| ct timp j<=i execut
| | scrie *
| | j=j+1
|
| i=i+1
| salt la rnd nou
4. Scriei programul C++ si precizai care este efectul urmtorului algoritm scris n limbaj
pseudocod, dac valoarea citit pentru variabila n este 7:
citete n
s=0
i=1
ct timp i<=n execut
| s=s+i
| i=i+1
scrie s
a. 1 2 3 4 5 6 7 8 9 10 b. 1 2 3 4 5
c. 10 9 8 7 6 5 4 3 2 1 d. 5 4 3 2 1
#include<iostream.h>
#include<conio.h>
void main()
{clrscr();
for(char i='a';i<='f';i++)
cout<<i<<" ";
getch();
}
Pe ecran se va afia:
a. A B C D E F b. i i i i i i
c. a f a f a f d. a b c d e f
#include<iostream.h>
#include<conio.h>
void main()
{clrscr();
for(int i=5;i<=5;i++)
cout<<i<<" ";
getch();
}
Dup execuia programului pe ecran se va afia:
a. 5;
b. 6;
c. Nimic, exista erori de compilare;
d. Nici un rspuns nu este corect.
8. Care vor fi valorile afiate ale variabilelor a i b dup executarea urmtorului program C++:
#include<iostream.h>
#include<conio.h>
void main()
{clrscr();
int a=1,b=2;
while(b<10)
b++;
a=a*b;
cout<<a<<" "<<b;
getch();
}
a. 10 10 b. 11 11
c. 9 10 d. 10 9
9. Care va fi valoarea afiat a variabilei a dup execuia urmtorului program C++:
#include<iostream.h>
#include<conio.h>
void main()
{clrscr();
int a=1,b=8;
while(b>1)
{a=a+b;
b=b-3;
};
cout<<a<<" "<<b;
getch();
}
a. 32 b.34
c. 16 d. nici un rspuns nu este corect
10. De cte ori se execut instruciunile cuprinse ntre cuvintele execut-ct timp din
umtorul algoritm:
m=1
x=1
execut
| m=m*x
| x=x+8
|ct timp m>=x;
11. Precizai care este valoarea variabilei a, dup execuia urmtoarei secvene de algoritm:
m=5
a=20
execut
| a=a-m
| m=m+1
|ct timp m<=a;
a. 15 b. 2
c. 0 d. 9
12. Rescriei urmtoarele secvene de program C++, astfel nct buclele repetitive s fie nlocuite
cu instruciunea care implementez structura repetitiv cu test iniial:
14. Rescriei urmtoarele secvene de program C++, astfel nct buclele repetitive s fie nlocuite
cu instruciunea care implementez structura repetitiv cu numr fix de pai:
15. Specificai de cte ori se vor repeta instruciunile din bucla repetitiv i care va fi valoarea
variabilei i la sfritul urmtoarei secvene de algoritm. Scriei programul C++
corespunztor algoritmului dat.
16. Specificai de cte ori se vor repeta instruciunile din bucla repetitiv i care va fi valoarea
variabilei i la sfritul urmtoarei secvene de algoritm. Scriei programul C++
corespunztor algoritmului dat.
citete n
i=1
ct timp i<=n execut
| scrie # #
| i=i+1;
a. 2 b.4
c.3 d.1
citete a,b
pentru i=a,b,+1
| dac i%2 == 0 atunci
| | scrie i,
|
execut
citete a,b
ct timp (a<b sau b=0)
nr=0
ct timp c>b execut
a=a-b
nr=nr+1
scrie nr, ,a
scrie n
Se cere:
ct timp ab execut
dac c%a=0 atunci
scrie a
a=a+1
Se cere:
a. Scriei care sunt valorile ce se vor afia pentru a=10, b=20 i c=6;
b. Scriei programul C/C++ corespunztor algoritmului dat;
c. Desenai schema logic corespunztoare algoritmului scris n pseudocod.
23. Fie urmtoarea secven de algoritm:
scrie n
Se cere:
scrie m
Se cere:
dac p0 atunci
s=s+p
f=f+1
Se cere:
s=0
citete v (valoare natural)
ct timp v 0 execut
a = v%10
b = [v/10]%10
s = s + a*10 + b
citete v
scrie s
Se cere:
a. Scriei valoarea care se afieaz dac se citesc, n ordine, numerele 114, 123, 517,
3312, 14, 412, 22, 0;
b. Scriei programul C/C++ corespunztor algoritmului dat;
c. Desenai schema logic corespunztoare algoritmului scris n pseudocod;
27. Fie urmtoarea secven de algoritm:
z = n%10
scrie z
Se cere:
x = y
Se cere:
citeste n,k
(numere naturale nenule)
t=0
ct timp n1 execut
dac n>k atunci
t=t+1
n=n-t
scrie t
Se cere:
Exist nenumrate aplicaii n practic, cnd ni se solicit informaii despre cifrele din
care este construi un numr, despre natura sau numrul lor. n acest caz cifrele numrului vor fi
separate, una cte una, de la ultima cifr(cifra unitilor) spre prima cifr. Dup fiecare
prelucrare din numrul iniial vom elimina ultima cifr, algoritmul coninund n acelai mod, n
funcie de numrul de cifre din numrul dat.
ablonul de rezolvare al problemelor care prelucreaz cifrele unui numr natural are
urmtoarea form:
afieaz rezultatul
Aplicaii rezolvate
1. Se d un numr natural n. Se cere s se scrie un algoritm care
calculeaz suma cifrelor numrului dat.
Rezolvarea acestei probleme va urmri ablonul de rezolvare prezentat mai sus, tinnd
cont de faptul c atunci cnd avem de calculat o sum de termeni, variabila care va conine
rezultatul se va iniializa cu valoarea zero.
Algoritmul este:
Algoritmul este:
Algoritmul este:
citete n numr natural i reprezint numrul de prelucrat
s=0 va conine, la final, suma cifrelor pare din numrului n, iniial
va avea valoarea zero
ct timp n>0 execut
c = n%10 // extrag ultima cifr din numrul n
dac c%2 == 0 atunci // dac ultima cifr este par
s = s+c // adun cifra separat la sum
n = n/10 //elimin din numarul n ultima lui cifr
Atunci cnd avem de determinat valoarea maxim dintre un ir de numere, vom iniializa
variabila care va conine maximul cu cea mai mic valoare posibil. n cazul nostru trebuie s
determinm cifra maxim dintre cifrele unui numr dat, i vom iniializa cifra maxim cu
valoarea zero, apoi vom extrage cte o cifr din numr i o vom compara cu valoarea cifrei
maxime. n situaia n care am gsit o valoare mai mare vom actualiza informaia din cifra
maxim, cu ultima cifr extras din numr. Algoritmul continu n acelai mod pn cnd au fost
prelucrate toate cifrele numrului dat.
Algoritmul este:
citete n numr natural i reprezint numrul de prelucrat
cif_max=0 va conine, la final, cifra maxim din numrului n, iniial
va avea valoarea zero
ct timp n>0 execut
c = n%10 // extrag ultima cifr din numrul n
dac c >= cif_max atunci // dac ultima cifr este mai mare dect
cif_max = c // cifra maxim, atunci pstrez valoarea ei
n = n/10 //elimin din numarul n ultima lui cifr
Algoritmul este:
Atunci cnd avem de a verifica ndeplinrea unei condiii de ctre toate elementele unui ir
vom proceda astfel:
vom presupune c toate elementele irului ndeplinesc condiia cerut;
vom verifica dac exist cel mult un numr din ir care nu verific condiia dat.
n situaia nostr vom presupune iniial c toate cifrele numrului dat sunt pare i vom separa
apoi cte o cifr din numr i i vom verifica paritatea. Dac n numrul iniial exist cel mult o
cifr par, atunci vom ajunge la concluzia ca nu toate cifrele numrului dat sunt pare.
Algoritmul este:
daca ok = 1 atunci
scrie Toate cifrele numarului dat sunt pare!
altfel
scrie NU toate cifrele numarului dat sunt pare!
Atunci cnd trebuie s verificam ndeplinrea unei condiii de ctre cel puin un element din
ir vom proceda astfel:
vom presupune c niciunul din elementele irului nu ndeplinesc condiia cerut;
vom verifica dac exist cel puin un numr din ir care verific condiia dat.
n situaia nostr vom presupune iniial c nici una din cifrele numrului dat nu este par i
vom separa apoi cte o cifr din numr i i vom verifica paritatea. Dac n numrul iniial exist
cel puin o cifr par, atunci vom ajunge la concluzia ca n cifrele numrului dat exist cel puin
o cifr par.
Algoritmul este:
dac ok = 1 atunci
scrie Exista cel putin o cifra par!
altfel
scrie NU exist cifre pare, toate cifrele sunt impare!
2. Se citete de la tastatur un numr natural n de cel mult 9 cifre. Se cere s se determine cte
cifre impare conine numrul dat.
Exemplu: numrul n=3445 are dou cifre impare (3 i 5)
5. Se citete de la tastatur un numr natural n de cel mult 9 cifre. Se cere s se determine cifra
minim.
Exemplu: dac n=6143 atunci cifra minim este 1
6. Se citete de la tastatur un numr natural n de cel mult 9 cifre. Se cere s se verifice dac
numrul de cifre pare este egal cu numrul de cifre impare.
Exemplu: dac n=61432, atunci el are 3 cifre pare(2, 4, 6) i 2 cifre impare
(3, 1), de unde rezult c numrul de cifre pare nu este egal cu numrul de
cifre impare.
7. Se citete de la tastatur un numr natural n de cel mult 9 cifre. Se cere s se verifice dac
numrul conine cel puin o cifr de zero.
Exemplu: dac n=61432, atunci el nu conine nici o cifr egal cu zero, dar
dac valoarea iniial a numrului n este n=12003 atunci se va afia numrul
conine cifre de zero.
8. Se citete de la tastatur un numr natural n de cel mult 9 cifre. Se cere s se verifice dac
cifrele numrului sunt n ordine cresctoare.
Exemplu: dac n= 344567 atunci el are cifrele n ordine cresctoare, iar dac
n=12432 atunci el nu are cifrele n ordine cresctoare.
9. Se citete de la tastatur un numr natural n de cel mult 9 cifre. Se cere s se verifice dac
cifrele numrului sunt n ordine descresctoare.
Exemplu: dac n= 988754 atunci el are cifrele n ordine descresctoare, iar
dac n=55243 atunci el nu are cifrele n ordine descresctoare.
10. Se citete de la tastatur un numr natural n de cel mult 9 cifre. Se cere s se verifice dac
numrul este palindrom (numrul iniial este egal cu numrul cu cifre inversate).
Exemplu: dac n=98789 este palindrom, iar numrul 123 nu este palindrom,
123321
11. Se citete de la tastatur un numr natural n de cel mult 9 cifre. Se cere s se determine dac
toate cifrele sale sunt egale.
Exemplu: dac n=22222 are toate cifrele egale, iar numrul n=11121 nu are
toate cifrele egale.
12. Se citete de la tastatur un numr natural n de cel mult 9 cifre. Se cere s se determine dac
numrul n are toate cifrele egale cu x, citit de la tastatur.
Exemplu: dac n=22222 i x=2 atunci n are toate cifrele egale cu x, iar
numrul n=22222 i x=5 atunci nu are toate cifrele egale cu x.
13. Se citete de la tastatur un numr natural n de cel mult 9 cifre. Se cere s se afieze pe
ecran histograma cifrelor. (pentru fiecare cifr care apare n numr se va afia un numr de *
egal cu frecvena de apariie a cifrei respective n numrul iniial)
Exemplu: dac n=223158555 atunci se va afia pe ecran urmtoarea histogram :
0:
1:*
2:**
3:*
4:
5:****
6:
7:
8:*
9:
14. Se citete de la tastatur un numr natural n de cel mult 9 cifre. Se cere s se determine care
este cea mai mic baz n care poate fi scris numrul dat.
Exemplu: dac n=22315555, atunci cifra maxim este 5 i rezult c cea mai
mic baz n care este scris numrul este 6. De la matematic cunoatem c un
numr scris n baza b poate s conin cifre din intervalul [0,b-1].
15. Se citete de la tastatur un numr natural n de cel mult 9 cifre. Se cere s se s se determine
cel mai mare numr care se poate obine prin eliminarea unei cifre din numr(nu se va
modifica poziia cifrelor n numr).
Exemplu: dac n=67324, prin eleiminarea unei cifre din acest numa se vor
obine numerele: 6732, 6734, 6724, 6324 i 7324, iar pe ecran se va afia
7324.
16. Se citete de la tastatur un numr natural n de cel mult 9 cifre. Se cere s se afieze cifra de
rang k, dat de la tastatur(rangul unei cifre este numrul su de ordine, numerotnd cifrele de
la dreapta la stnga ncepnd cu zero.
Exemplu: dac n=67324 i k=2 atunci pe ecran se va afia cifra 3, ea este
cifra de rang doi din numrul n, dat iniial.
17. S se scrie un program care calculeaz cifra de control a unui numr ntreg efectund
repetat suma cifrelor sale, pn se obine un numr format dintr-o singur cifr.
Exemplu: dac n=67324 cifra lui de control este 4 (67324 are suma cifrelor
4+2+3+7+6=22, numarul 22 are suma cifrelor 2+2=4)
18. Se citete de la tastatur un numr natural n de cel mult 9 cifre. Se cere s se determine toate
numerele care se pot obine adugnd prima cifr la sfritul numrului.
Exemplu: dac n=67324 se obine urmtorul ir de numere: 73246, 32467, 24673,
46732, i 67324.
19. Se citete de la tastatur un numr natural n de cel mult 9 cifre. Se cere s se afieze o
piramid format din cifrele numrului dat.
Exemplu 1: dac n=67324 se va afia Exemplu 2: dac n=673124 se va afia:
3 31
732 7312
67324 673124
20. Se citete de la tastatur un numr natural n de cel mult 9 cifre. Se cere s se determine dac
numrul are aspect de deal sau de vale,
Exemplu 1: dac n=12321 se va afia Exemplu 2: dac n=32123 se va afia:
DEAL!, cifrele urc pn la 3, dup VALE!, cifrele numrului coboar pn
care coboar la 1, dup care urc
Algoritmi care determin divizorii unui numr. Numere prime.
De la matematic putem spune c un numr natural d este divizorul lui n, dac i numai
dac, restul mpririi lui n la d este egal cu zero:
dac n % d = 0 atunci
scrie d l divide pe n
altfel
scrie d nu l divide pe n
Dac vom nota cu D n mulimea divizorilor numrului n atunci dac n=12 putem scrie:
D12={1, 2, 3, 4, 6, 12}, unde 1 i 12 se numesc divizori improprii ai lui 12, iar 2, 3, 4, 6 sunt
divizorii proprii ai lui 12.
Un numr natural care are exact doi divizori se numete numr prim, iar numerele
naturale care nu sunt numere prime se numesc numere compuse. Plecnd de la aceast definiie,
algoritmul care verific dac numrul natural n, dat de la tastatur este prim are urmtoarea
form :
Matematic s-a demonstrat c, dac numrul n nu are nici un divizor propriu mai mic sau
egal cu n , atunci numrul este prim. Folosind aceast operaie se micoreaz numrul de pai
n a verifica dac n este prim sau nu. Algoritmul n acest caz se poate scrie i aa:
d=2
ct timp d<= n i ok = 1 execut
dac n%d=0 atunci // am gsit un divizor propriu n [2, n ]
ok=0 // atunci n nu este prim
altfel
d=d+1
dac ok = 1 atunci
scrie n, este numr prim
altfel
scrie n, nu este numr prim
Observaie:
a. numrul 1 nu este numr prim, dar nu este nici numr compus;
b. numrul 2 este singurul numr prim i par.
Orice numr natural nenul, care nu este numr prim poate fi scris ca un produs de numere
naturale prime. Scrierea unui numr natural ca un produs de numere naturale prime se numete
descompunere n factori primi a numrului natural respectiv. Exemple:
2420022*52
2422
12111
1111
11
Deci 24200= 23*52*112
Din punct de vedere matematic, cel mai mare divizor comun a dou numere naturale
a i b este un numr natural d, care:
divide i pe a i pe b:
este divizibil cu orice divizor a lui a i b.
Pentru a afla cel mai mare divizor comun al dou sau mai multor numere naturale mai
mari dect 1 se procedeaz astfel:
se descompun numerele n factori primi
se iau toi factorii primi comuni, o singur dat, la puterea cea mai mic i se
nmulesc ntre ei.
Exemplu:
Dac a = 420 atunci descompunerea n factori primi este 420=22*3*5*7 i dac b = 504
atunci descompunerea n factori primi este 504=2 3*32 *7, de unde rezult c cel mai mare
divizor comun dintre cele dou numere, notat cmmdc(420, 504)= 22*3*7=84
Pentru a scrie un algoritm care determin valoarea celui mai mare divizor comun dintre
dou numere dup modelul matematic de determinare este destul de complicat. Exist algoritmi
mai simpli pentru realizrea acestui lucru:
Algoritmul lui Euclid 1:
Se citesc cele dou numere naturale a i b, iar n situaia n care a nu este mai mare dect
b se interschimb valorile celor dou variabile. Se mparte a la b pn la obinerea unui rest egal
cu zero. Dac restul obinut n urma mpririi lui a la b nu este zero atunci valoarea lui b va fi
transferat n variabila a, valoarea restului va fi transferat n b si se va relua algoritmul prin
calcularea restului mpririi lui a la b, dar cu noile valori ale variabilelor a i b. Valoarea celui
mai mare divizor comun dintre a i b, notat cmmdc(a,b), va fi egal cu ultimul rest diferit de
zero(care va fi pstrat n variabila b).
Se citesc cele dou numere naturale a i b pentru care se dorete s se calculeze valoarea
celui mai mare divizor comun. Algoritmul n acest caz este mai simplu i presupunerea scderii
variabilei de valoare mai mic din variabila de valoare mai mare, pstrnd rezultatul obinut n
variabila din care am sczut. Aceast operaie de scdere repetat va continua n acealai mod ct
timp valorile variabilelor a i b sunt diferite. Valoarea comun la care se ajunge este chiar
valoarea celui mai mare divizor comun dintre numerele date iniial.
1
Algoritmul lui Euclid este strbunicul tuturor algoritmilor, deoarece este cel mai vechi algoritm netrivial care a
supravieuit pn n ziua de azi. Donald Knuth, The Art of Computer Programming, Vol. 2: Seminumerical
Algorithms, 2nd edition (1981), p. 318.
Algoritmul n pseudocod este:
Dou sau mai multe numere naturale care au cel mai mare divizor comun al lor egal cu 1
se numesc numere prime ntre ele.
Matematic, cel mai mic multiplu comun a dou numere naturale a i b este un numr
natural m, care:
Cel mai mic multiplu comun dintre dou numere naturale a i b, notat cmmmc(a,b) se
calculeaz cu relaia:
a *b
cmmdc (a, b)
cmmdc (a, b)
Program C++
#include<iostream.h>
#include<conio.h>
#include<math.h>
int n,s;
void main()
{ clrscr(); cout<<"n="; cin>>n;
if (n<=1)cout<<"Nu exista numere prime mai mici sau egale cu 1!";
else
{cout<<"Numere prime mai mici sau egale cu "<<n<<" sunt :"<<endl;
for(int x=2;x<=n;x++)
{ int d=2,ok=1;
while (d<=sqrt(x) && ok)
if (x%d==0)
ok=0;
else
d++;
if(ok)cout<<x<<" ";
}
}
getch();
}
Rezultat afiat pe ecran
sau
pentru i=3,n,+1
citeste b //citeste urmtorul numr
ct timp a b execut
dac a > b atunci
a = a-b
altfel
b = b-a
Aplicaii practice
1. Se dau dou numere naturale a i b. Dac cele dou numere sunt
prime ntre ele, atunci s se calculeze suma cifrelor celor
dou numere, altfel s se descompun n factori primi numrul
mai mare.
Exemplu: Dac a= 84 i b=180, nu sunt numere prime ntre ele, cmmdc(84,180)=12 i pe ecran
se va afia descompunerea n factori primi al numrului mai mare 2 2 *32 *5.
Dac a=85 i b=87, sunt prime ntre ele i pe ecran va fi afiat 28=8+5+8+7
2. Afiai toate numere prime din intervalul [a, b], unde a i b
sunt dou numere naturale mai mici de 10000, i a<=b.
Exemplu: dac a a=10 i b=20 numerele prime din intervalul [10,20] sunt 11, 13, 17 i 19.
17. Orice numr par mai mare dect 4 se poate scrie ca sum de
numere prime. Scriei un program care citete de la tastatur
un numr natural, par n i l descompune ca sum de numere
prime.
Exemplu: dac n=292 atunci el se formeaz din 283+7+2.
Toate calculele pe care le efectum n ziua de azi sunt efectuate n sistemul de numerae
zecimal, sau altfel spus n baza 10 de numeraie. n continuare vom prezenta un algoritm simplu,
didactic, care realizeaz conversii de numere n una din bazele de numeraie b 2,10 . n general
un numr scris n baza b are urmtoarea form general:
n 1
x n-1x n-2 ...x1x 0, x -1x -2...x -m= x*b n-1+x*b n-2+ ...x*b 1+x*b 0+x*b -1+x*b -2+...x*b -m = xi b i ,
i m
unde x i [0,b-1].
Exemplu: dac b=10 atunci numrul 123,45=1*10 2+2*101+3*100+4*10-1+5*10-2 .
Trecerea unui numr de la o baz la alta presupune aflarea unei secvene unice de resturi
conform algoritmului urmtor:
numrul se mparte la baz i se reine restul obinut. Acesta constituie ultima
cifr din reprezentarea n acea baz;
ctul obinut n urma acestei prime mpriri este din nou mprit la baz i se
reine iarai restul. Acest rest constituie a doua cifr, n ordinea de la dreapta la
stnga, a reprezentrii n baza aleas.
algoritmul continu pn cnd ctul obinut este zero. Ultimul rest al mpririi la
baz va reprezenta cea mai semnificativ cifr a numrului n baza n care s-a
facut conversia.
Tabelul urmtor prezinta paii acestui algoritm pentru trecerea numarului 25 n baza 2:
Nr. baz
25:2= 25 2 (25)10=(11001)2
rest 1 12 2
0 6 2 Observaie:
0 3 2 pe fond galben sunt notate
1 1 2 cturile obinute la fiecare
1 0 mprire la baz
Pentru ascrie un algoritm care s realizeze aceast conversie vom proceda astfel:
o citim numrul de transformat
o citim baza n care dorim s facem conversia
o ncepem s mprim numrul dat la baz, iar cu resturile obinute formm un nou
numr(care de fapt va fi scris dup regula sistemului zecimal)
Algoritm n pseudocod:
(110011)2=1*20+1*21+0*22+0*23+1*24+1*25=1+2+16+32=(51)10
Operaia de trecere a unui numr scris n baza b la baza 10 se realizeaz dup urmtorul
algoritm n pseudocod:
Pentru a realiza conversia unui numr din baza b1 n baza b2 vom proceda astfel:
o transformm numrul din baza b1 n baza 10;
o transformam numrul obinut anterior din baza 10 n baza b2.
Aplicaii rezolvate
Aplicaii propuse