Documente Academic
Documente Profesional
Documente Cultură
Date de iesire
(Ce se d)
Program C++
(Ce se cere)
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.
Cele mai importante proprieti ale unui algoritm sunt urmtoarele:
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.
Operaiile care apar n cadrul unui algoritm sunt:
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).
rezolvare a problemi astfel nct n cel mai scurt timp i cu cele mai puine resurse s
obinem rezultatul dorit. Analiza timpului de lucru a unui program se numeste
complexitate1, dar pentru acest subiect vom discuta mai pe larg intr-un capitol separat.
2. Descrierea n limbaj natural a modului de rezolvare propus, stabilirea tipurilor de
informaii care trebuie prelucrate precum i a tipurilor de rezultate ateptate. Limbajul
natural descrie n termeni largi etapele propuse pentru rezolvarea problemei date.
3. Descrierea algoritmului n limbaj pseudocod: Limbajul pseudocod este un limbaj
intermediar ntre limbajul natural i limbajul de programare. n aceasta etap se stabilesc
paii de algoritm, tipurile datelor de intrare, de manevr i de ieire, se identific
condiiile care impun i se scriu n expresii matematice care sunt uor de interpretat de
calculator (calculatorul nu face presupuneri si nici nu ghicete ce doriti dumneavoastr ci
doar execut rapid comenzile pe care le-a primit). Un algoritm scris n limbaj pseudocod
nu este un program care poate fi rulat direct pe calculator, dar poate si transcris uor ntrun limbaj de programare innd cont de vocabularul, semantica si sintaxa limbajului de
programare. n aceast carte vom folosi un limbaj pseudocod scris n limba romn
(pentru a fi mai uor de inteles logica algoritmicii). Limbajul pseudocod se va baza
implementarea ideii de rezolvare ntr-un format apropiat de limbajul C++, dar care nu
pune accent pe sintaxa riguroas care trebuie respectat atunci cnd scrii ntr-un limbaj de
programare.
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.
6. Testarea programului: n aceast etap se verific corectitudinea rezolvrii problemei
prin analiza rezultatului obinut pentru diferite valori ale datelor de intrare. Tot aici se
identific si eventualele erori de gndire, care apar prin alegerea unui algoritm de
rezolvare greit. n aceast etap trebuie indentificate seturi de date de intrare numite i
cazuri limit pentru care programul s-ar putea bloca sau ar genera rezultate greite
datorit unei neglijene n etapa de analiz i implementare a programului.
1
Complexitatea unui algoritm este determinat innd cont de spaiul de memorie utilizat (complexitate spaiu) si de timpul de obinere a rezultatului (complexitate timp). Prin complexitate
spaiu nelegem dimensiunea spaiului de memorie utilizat de program. Un program necesit un spaiu de memorie constant, independent de datele de intrare, pentru memorarea codului su, a
constantelor, a variabilelor simple i a structurilor de date de dimensiune constant alocate static i un spaiu de memorie variabil, a crui dimensiune depinde adesea de datele de intrare de
cerinele problemei de rezolvat i din spaiul de memorie necesar apelurilor de proceduri i funcii. Prin complexitate timp nelegem timpul necesar execuiei programului. nainte de a evalua
timpul necesar execuiei programului ar trebui s avem informaii detaliate despre sistemul de calcul folosit.
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 inthight 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.
START
STOP
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. Un algoritm este un limbaj de programare?
a. Adevrat
b. Fals
2. Cu ajutorul unui calculator se pot prelucra urmtoarele tipuri de informaii:
a. Imagini
b. Documente
c. Numere
d. Cri
3. Descrierea unui algoritm se poate face prin:
a. Limbaj natural
b. Limbaj de programare
c. Limbaj pseudocod
d. Nici un rspuns nu e corect
4. Limbajul pseudocod este un limbaj de programare?
a. Fals
b. Adevrat
5. Datele de intrare sunt si date de ieire?
a. Adevrat
b. Fals
6. Complexitatea unui cod sursa a unui program este masurat prin numrul de linii de cod
scrise?
a. Adevrat
b. Fals
7. Corectarea erorilor de compilare implic automat si corectarea erorilor de gndire?
a. Adevrat
b. Fals
8. Datele de ieire reprezint acele valori obinute la terminarea unui algoritm?
a. Adevrat
b. Fals
9. Limbajul pseudocod este:
a. Un cod fals
b. Un limbaj intermediar de scriere a algoritmilor i care face trecerea de la limbajul
natural la cel de programare
c. Un limbaj nefolositor
d. Nici un rspuns nu e corect
10. Pentru a verifica corectitudinea funcionrii unui program acesta trebuie testat cu:
a. Valorile pentru care a fost gndit n etapa de analiz
b. Cu orice fel de valori
c. Cu valori speciale identificate pentru cazurile limit
d. Nici un rspuns nu e corect.
11. Enumerai proprietile unui algoritm:
1............................. 2................................ 3................................... 4................................
5............................. 6................................ 7...................................
12. Precizai care este diferena ntre scrierea algoritmului n limbaj pseudocod fa de
limbajul de programare. (Precizai avantajele i dezavantajele)
13. Care sunt deosebirile dintre erorile de compilare si erorile de gndire?
14. Definiti urmtorii termeni:
a. Complexitatea unui algoritm
b. Operaia de compilare
c. Limbaj de programare
d. Limbaj natural
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.
K10
a. comutatorul K1 nchis,
echivalentul valorii 1
trece curent electric
de la punctul A la B
B
b. comutatorul K1 deschis
echivalentul valorii 0
nu trece curent electric
de la punctul A la 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).
baz
a
25:2 25
(25)10=(11001)2
rest 1
12
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
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.102224E 3 n virgul
mobil.
Reprezentarea caracterelor (valorilor alfanumerice)
n cazul reprezentrii caracterelor, exist un standard internaional care definete
numerele, reprezentabile pe un octet, corespunztoare fiecrui caracter n parte, numit standardul
ASCII3. n acest mod sunt grupate un numr de 256 de caractere, fiecrui caracter fiindu-i asociat
cte un numr natural din intervalul [0,255], numr care poart denumirea de cod ASCII.
Astfel:
Caracter
Codul ASCII
literele mari A...Z
au coduri ntre 65...90
literele mici a...z
au coduli ntre 97...122
cifrele 0...9
au coduri ntre 48...57
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.
.....................................
1
b.
1 octet;
4 octeti;
d.
256 de octei.
15. Pentru orice informaie se aloc n memoria calculatorului un numr ntreg de octei?
a.
Adevarat;
b.
Fals.
c.
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)
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()
{ }
2
1
3
4
6
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
Tipul
Nr. octei
ocupai
ntreg
char
unsigned char
int
unsigned int
long
unsigned long
1 octet cu semn
1 octet fara semn
2 octeti cu semn
2 octeti far semn
4 octei cu semn
4 octei fara semn
float
real
double
long double
void
Domeniu de valori
Mod de reprezentare n
memorie
-128...127
codul ASCII al
caracterului.
0...255
-32768...23767
complement fa de 2
0...65535
n baza 2
-231..231-1
complement fa de 2
0.. 232-1
n baza 2
[3.410-38...3.41038 ] u
virgul mobil simpl
4 octei cu semn
[-3.410-38...-3.41038]
precizie
[1.710-308...1.710308] u
8 octei cu semn
virgul mobil dubl precizie
[-1.710-308...-1.710308]
[3.410-4932...3.4104932 ]
virgul mobil dubla
10 octei cu semn
u
precizie
[-3.410-4932...-3.4104932]
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;
double d;
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
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
Expresie matematic
Valoare obinut
Dac avem dou variabile a=2.0 i b=3.5 definite de tip float atunci:
a+b
2.0+3.5=5.5
a-b
2.0-3.5=-1.5
b-a
3.5-2.0= 1.5
a/b
2.0/3.5=0.5714
a%b
Operaie nepermis
b/a
3.5/2.0=1.75
(a+b)/(a-b)
(2.0+3.5)/(2.0-3.5)=5.5/-1.5=-3.66666
(a+b)/2
(2.0+3.5)/2=5.5/2=2.75
Operatori relaionali i de egalitate
Valoare obinut
Dac avem dou variabile a=20 i b=3 definite de tip int atunci:
a==b
a!=b
a<b
a<=b
a>b
a>=b
Valoare obinut
1,daca x se divide la 3
0, daca x nu se divide la 3
1,daca x se divide par
0, daca x impar
1, daca x apartine intervalului [a,b]
0, daca x nu apartine intervalului [a,b]
1, daca x nu apartine intervalului [a,b]
0,daca x apartine intervalului [a,b]
Se va transforma in relaia (x<a)||
(x>b)i deci rezultatul va fi:
1, daca x nu apartine intervalului [a,b]
0,daca x apartine intervalului [a,b]
1, daca a i b sunt numere consecutive
0, altfel
Semnificaie
Tip
Prioritate
Obs.
unar
<<
binar
a*2b
>>
binar
a/2b
&
binar
binar
~a
a&b
a^b
a|b
6
0
5
0
4
1
3
1
2
0
1
0
0
1
Valoare
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:
Efect
a are valoarea 32
a are valoarea 28
a are valoarea 60
a are valoarea 15
a are valoarea 4
a i b au valoarea 60
se evalueaz expresie_1.
Dac expresie_1 are o valoare egal cu 0 atunci valoarea expresiei condiionale este
egal cu valoarea expresiei_3.
Exemplu: expresia x<y ? x : y determin valoarea minim dintre x i y.
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 explicit
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
Operatorul de determinare a dimensiunii unei variabile sau expresii
Operatorul de determinare a dimensiunii n octei a unei variabile sau a unei expresii
necesare memorrii acesteia este sizeof. Forma general este:
sizeof(tip)
sau
sizeof(expresie)
Exemplu: Daca avem o variabil de tip int a=70, o variabil b de tip float i o variabila c
de tip char atunci:
Operator
Rezultat
sizeof(a)
2 octei
sizeof(double)
8 octei
sizeof(b)
4 octei
sizeof(c)
1 octet
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.
*=
/=
^=
%=
+=
- =
|= <<= >>=
&=
Asociativitate
Dreapta stanga
Prioritate
Prioritate maxima
stanga dreapta
Dreapta stanga
Dreapta stanga
Prioritate minima
Aplicaii practice
1. Completai spaiul punctat pentru x =129:
a. Numrul x are .......... cifre. Notm numrul de cifre cu nr.
b. Numerele formate din nr cifre aparin intervalului nchis ........................................
c. Suma cifrelor numrului x este .................................................................................
d. Media aritmetic a cifrelor numrului x este ............................................................
e. Ctul mpririi numrului x la 4 este .......................................................................
f. Restul mpririi numrului x la 4 este ......................................................................
g. Ctul mpririi numrului x la 130 este....................................................................
h. Restul mpririi numrului x la 130 este..................................................................
2. Completai spaiul punctat cu expresiile matematice corespunztoare.
a. Numrul real x aparine intervalului nchis [10, 20] dac i numai dac
...................................................................................................................................
b. Numrul real x aparine intervalului nchis [a,b] U [c,d] dac i numai dac
...................................................................................................................................
c. Numerele naturale x i y sunt numere consecutive dac i numai dac
...................................................................................................................................
d. Un numr natural x este impar dac i numai dac restul mpririi numrului la 2
este.............................................................................................................................
e. Dou numere naturale x i y sunt ambele nenule dac i numai dac
...................................................................................................................................
f. Un numr x este strict pozitiv dac i numai dac
...................................................................................................................................
...................................................................................................................................
h. Trei numere naturale a, b, c sunt pitagorice dac
...................................................................................................................................
i. Trei numere reale a, b, c pot fi laturile unui triunghi dac
...................................................................................................................................
3. Calculai rezultatul urmtoarelor expresii:
a. 15340:20+3215-139
c. 5075-(125-(75-(7+18)))
b. (((7x+34)%17+18)/5-12)*8
d. (((512/518)-25%2)3)2
4. Care este rezultatul urmtoarelor expresii?
a. (77+5)/3*2
c. 7+(7+(7+7%2))/3
b. (49+63)/7/4
d. 72/9+9%4
5. Fie urmatoare declaraie: int a;Care va fi rezultatul functiei sizeof(a)?
a. 1
b. 2
c. 4
d. 0
6. Fie urmtoarea declaratie de variabile: int a=2,b=3; Care va fi rezultatul expresiei
(a+b)/2?
a. 2.5
b. 3
c. 2
d. 5
7. Fie urmtoarea declaratie de variabile: int a=10,b=100; Care va fi rezultatul
expresiei (a+b+abs(a-b))/2?(observaie: abs(x) este o functie care calculeaz
valoarea absolut a parametrului dat x )
a. 10
b. 100
c. 1000
d. 50
8. Care este rezultatul urmtoarei expresii condiionale x%2==0 ? y=1: y=0 ?
a. 0
b. 1
c. Expresie
scris gresit
9. Daca avem urmtoarea declaraie de variabile int a=7, b=5, c=3; Care este
rezultatul urmtoarei expresii (float)(a+b+c)/2?
d. Eroare
a. 7.5
b. 7
c. 9
10. Fie urmtoarea declaraie de variabile long a=40, b=10; Calculai valorile expresiilor:
a. a+=b;
c. a*=b;
b. a-=b;
d. a=b*2;
11. Expresia a<<b este echivalent cu:
a. a/2b;
c. a+2b;
b. a*2b;
d. a-2b ;
12. Fie dou variabile a i b de tip int. Scriei in limbajul C++ expresii logice care sunt
adevrate dac i numai dac:
a. a este numr par i b este numr
c. a i b sunt numere consecutive
impar
d. a este numar par si divizibil cu
b. a este egal cu b
3
13. Variabila x este de tip real. Care dintre urmtoarele C++ are valoarea 1 dac i numai
dac numrul real memorat n variabila x aparine intervalului (5,8]?
a. (x<8) && (x>=5)
c. (x>8) || (x<=5)
b. (x<=8) || (x>5)
d. (x<=8) && (x>5)
(Examen de Bacalaureat, Matematic Informatic, 2009)
14. Care dintre urmtoarele expresii C++ are valoarea 1 dac i numai dac numrul natural
15. Care dintre urmtoarele expresii C++ are valoarea 1 dac i numai dac numrul natural
16. Se consider variabila a care memoreaz un numr cu exact 6 cifre. Care dintre expresiile
C++ de mai jos are ca valoare numrul format din cele dou cifre din mijloc ale valorii
memorate n a?
a. (a%100)/100
c. a/1000+a%1000
b. a/100%100
d. a/100%10+a/1000%10
(Examen de Bacalaureat, Matematic Informatic, 2009)
18. Variabilele a, b i c, de tip int, pot fi iniializate cu oricare numere naturale impare
distincte. tiind c c este divizor al lui a, iar b nu este multiplu al lui c, care dintre
urmtoarele expresii scrise n C++are valoare 1?
a. !((a%c!=0)||!(b%c!=0))
c. (a%c!=0)||!(b%c!=0)
b. (a%c!=0)&&!(b % c!=0)
d. !(c%a!=0)&&(c%b!=0)
(Examen de Bacalaureat, Matematic Informatic intensiv, 2009)
19. Care este instruciunea prin care variabilei x i se atribuie valoarea sumei cifrelor
numrului natural format din exact trei cifre, memorat de variabila ntreag y?
a. x=y/100+y/10%10+y%10;
c. x=y%10+y%10/10+y/100;
b. x=y+y/10+y/100;
d. x=y%10+y%100+y%1000;
(Examen de Bacalaureat, Matematic Informatic intensiv, 2009)
20. Variabila ntreag n memoreaz un numr natural impar. Care dintre urmtoarele expresii
c. n%2!=0
d. !((n+1)%2==0)
(Examen de Bacalaureat, Matematic Informatic intensiv, 2009)
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).
Stream (flux) de intrare
datele de intrare curg din exterior(tastatura) n
interior (memoria calculatorului)
Memoria
calculatorului
n fiierul antet iostream este definit acest stream de intrare a datelor de la tastatur,
denumit cin (console input). Atunci cnd dorim s citim datelele de la tastatur le vom
extrage din fluxul de intrare, folosind operatorul de extragere >>. Din acest punct de vedere
forma general a operaiei de citire este:
cin>>nume_variabil;
Dac dorim s citim succesiv mai multe variabile, atunci putem utiliza operatorul de
extragere nlnuit, adic:
cin>>nume_variabil_1>>nume_variabil_2>>>>nume_variabil_n;
De exemplu:
Scriei un program care citeste de la tastatur doua numere
intregi.
Program C++
Explicaii:
#include<iostream.h>
void main()
{ int a,b;
cin>>a;
cin>>b;
}
#include<iostream.h>
void main()
{ int a,b;
cin>>a>>b;
}
Observaii:
datele de intrare din orice program se vor citi fie de la tastatur fie din fisier text
la citire valorile numerice care se citesc trebuie introduse de la tastatura, separate
de caractere albe(spaiu, Tab, Enter).
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
Memoria
calculatorului
n fiierul antet iostream 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
citeste a,b
(numere ntregi)
scrie a+b
#include<iostream>
using namespace std;
int main()
{ int a,b;
cout<<"a=";
cin>>a;
cout<<"b=";
cin>>b;
cout<<"Suma ";
cout<<a<<"+"<<b<<"="<<a+b;
return 0;
}
citeste a
scrie abs(a)
cout<<"a=";
cin>>a;
cout<<"Valoarea absoluta a numarului "<<a<<" este"<<abs(a);
Rezultat afiat
3. Scriei un program care s afiseze pe ecran:
*
**
***
****
*****
Algoritm
scrie
scrie
scrie
scrie
scrie
*
**
***
****
*****
Program C++
Rezultat afiat
#include<iostream.h>
#include<conio.h>
void main()
{ clrscr();
cout<<"*"<<endl;
cout<<"**"<<endl;
cout<<"***"<<endl;
cout<<"****"<<endl;
cout<<"*****"<<endl;
getch();
}
citeste a
separa ultima cifra
separa cifra zecilor
separa cifra sutelor
scrie ultima cifra
scrie cifra zecilor
scrie cifra sutelor
#include<iostream.h>
#include<conio.h>
void main()
{ clrscr();
unsigned a, unitati,zeci,sute;
cout<<"a=";cin>>a;
unitati=a%10;
zeci=a/10%10;
sute=a/100;
cout<<"cifra unitatilor este "<<unitati<<endl;
cout<<"cifra zecilor este "<<zeci<<endl;
cout<<"cifra sutelor este "<<sute;
getch();
}
Rezultat afiat
5. Se citesc dou numere naturale care reprezint laturile
unui dreptunghi. Sa se calculeze i sa se afieze
perimetrul i aria dreptunghiului dat.
Algoritm
Program C++
citeste L
citeste l
calculeaza perimetrul
calculeaza aria
scrie perimetrul
#include<iostream.h>
#include<conio.h>
void main()
{ clrscr();
unsigned l, L, p, a;
cout<<"lungimea:";cin>>L;
cout<<"latimea:";cin>>l;
p=2*(l+L);
a=l*L;
cout<<"perimetrul este "<<p<<endl;
scrie aria
}
Rezultat afiat
c=a;
C
a=b;
b=c;
Algoritm
citeste A
citeste B
scrie A,B (initial)
C=A
A=B
B=C
scrie A,B(final)
b. Starea final
Program C++
#include<iostream.h>
#include<conio.h>
void main()
{ clrscr();
int A,B,C;
cout<<"A=";cin>>A;
cout<<"B=";cin>>B;
cout<<"Initial: A="<<A<<" si B="<<B<<endl;
C=A;
A=B;
B=C;
cout<<"Final:
A="<<A<<" si B="<<B<<endl;
getch();
}
Rezultat afiat
citeste A
citeste B
scrie A,B (initial)
A=A+B;
B=A-B;
A=A-B;
scrie A,B(final)
Program C++
#include<iostream.h>
#include<conio.h>
void main()
{ clrscr();
int A,B;
cout<<"A=";cin>>A;
cout<<"B=";cin>>B;
cout<<"Initial: A="<<A<<" si B="<<B<<endl;
A=A+B;
B=A-B;
A=A-B;
cout<<"Final:
A="<<A<<" si B="<<B<<endl;
getch();
}
Rezultat afiat
Program C++
#include<iostream.h>
#include<conio.h>
void main()
{ clrscr();
int A,B;
cout<<"A=";cin>>A;
cout<<"B=";cin>>B;
cout<<"Initial: A="<<A<<" si B="<<B<<endl;
A=A*B;
B=A/B;
A=A/B;
cout<<"Final:
A="<<A<<" si B="<<B<<endl;
getch();
}
citeste A
citeste B
scrie A,B (initial)
A=A+B;
B=A-B;
A=A-B;
scrie A,B(final)
Rezultat afiat
Probleme rezolvate
1. Se citesc de la tastatur dou numere ntregi. Scriei un
program care s determine care este cel mai mare numr.
Relaiile matematice care determin maximul i minimul dintre cele dou numere sunt:
max(a, b)
(a b a b )
2
min(a, b)
(a b a b )
2
citeste a
citeste b
scrie max(a,b)
#include<iostream.h>
#include<conio.h>
#include<math.h>
void main()
{ clrscr();
int a,b;
cout<<"a=";cin>>a;
cout<<"=";cin>>b;
cout<<"Valoarea maxima este:"<<(a+b+abs(a-b))/2;
getch();
}
Rezultat afiat
sau
ab
,
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++
citeste a
citeste b
scrie
ma
ab
2
#include<iostream.h>
#include<conio.h>
void main()
{ clrscr();
int a,b;
cout<<"a=";cin>>a;
cout<<"b=";cin>>b;
cout<<"ma"<<(float)(a+b)/2<<endl;
getch();
}
Rezultat afiat
citeste a
scrie
a
#include<iostream.h>
#include<conio.h>
#include<math.h>
void main()
{ clrscr();
int a,b;
cout<<"a=";cin>>a;
cout<<"radical din "<<a<<" este"<<sqrt(a);
getch();
}
Rezultat afiat
4. Se citete de la tastatur baza b i nlimii h a unui
triunghi. Se cere s se calculeze aria triunghiului.
De la matematic tim ca aria unui triunghi atunci cand sunt cunoscute inaltimea si baza se
face cu ajutorul relaiei: aria
Algoritm
Citeste b
citeste h
scrie
bh
2
bh
, iar rezultatul acestei expresii este de tip real. Atunci:
2
Program C++
#include<iostream.h>
#include<conio.h>
void main()
{ clrscr();
int b,h;
cout<<"baza triunghiului :";cin>>b;
cout<<"inaltimea triunghiului :";cin>>h;
cout<<"Aria triunghiului este "<<(float)(b*h)/2;
getch();
}
Rezultat afiat
yb
x a xb 2 y a y b 2
xa
citeste xa,xb
citeste ya,yb
scrie
x a xb 2 y a y b 2
A
(-1,
Program C++ -1.5)
x
xb
ya
#include<iostream.h>
#include<conio.h>
#include<math.h>
void main()
{clrscr();
float xa,ya,xb,yb;
cout<<"dati coordonatele punctului A:"<<endl;
cout<<"xa=";cin>>xa;
cout<<"ya=";cin>>ya;
cout<<endl;
cout<<"Dati coordonatele punctului B:"<<endl;
cout<<"xb=";cin>>xb;
cout<<"yb=";cin>>yb;
cout<<endl;
cout<<"Lunginmea segmentului AB este "<<endl;
cout<<sqrt(pow(xa-xb,2)+pow(ya-yb,2));
getch();
}
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.
8. Fie a un numr format din cinci cifre a1a2a3a4a5. S se afieze pe ecran un triunghi
format din cifrele numrului dat astfel:
a1a2a3a4a5
a2a3a4
a3
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, a4, a5.Scriei un program
care s foloseasc o singur variabil auxiliar pentru a permuta circular valorile celor 5
variabile astfel:
a1 a2 a3 a4 a5
a2 a3 a4 a5 a1
a3 a4 a5 a1 a2
a4 a5 a1 a2 a3
a5 a1 a2 a3 a4
a1 a2 a3 a4 a5
Exemplu: dac a1=5, a2=6, a3=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.
14. Folosind caracterul * i spaierea deseneaz pe ecran urmtoarele figuri geometrice:
*
*
***
*
*****
*********
*******
*******
**********
*****
*
***
*
*
15. Care este efectul urmtorului program?
**************
*
*
*
*
*
C++
*
*
*
*
*
**************
#include<iostream.h>
#include<conio.h>
void main()
{clrscr();
int a,b;
cout<<"a=";cin>>a;
b=(a>=0) ? 1:-1;
cout<<b;
getch();
}
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
Sintetiznd cu notaiile de mai sus structura alternativ se poate reprezenta astfel:
Schema logic
Pseudocod
Instructiune C++
Nu
B2
Da
B1
dac c atunci
B1
altfel
B2
if(expresie logica)
instructiune1;
else
instructiune2;
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++
Nu
Da
B1
dac c atunci
B1
if(expresie logica)
instructiune1;
!C
Da
Instructiune C++
if(!expresie logica)
instructiune2;
B2
De exemplu dac valoarea variabilei x este 100 putem utiliza instructiunea if astfel:
1
2
if( x= =100)
cout<< valoare a lui x este 100;
Dac dorim s executm mai mult de o instruciune acestea trebuie grupate intre { , } astfel:
1
2
3
4
if( x= =100)
{ cout<< valoare a lui x;
cout<<x;
};
Daca apar si intruciuni care trebuie executate atunci cnd conditia este fals putem scrie asa:
1
2
3
4
5
6
if( x= =100)
{ cout<< valoare a lui x;
cout<<x;
};
else
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.
intregi a,b
citeste a
citeste b
daca a>b atunci
| max=a
|altfel
| max=b
|_
scrie max
#include<iostream.h>
#include<conio.h>
void main()
{clrscr();
int a,b,max;
cout<<"a="; cin>>a;
cout<<"b="; cin>>b>>b;
if(a>b)
max=a;
else
max=b;
cout<<"Valoarea maxima este "<<max;
getch();
}
Rezultat afiat
2.
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.
intregi a,b
citeste a
citeste b
Citeste c
daca a>b atunci
| daca c>a atunci
| | max=c
| |altfel
| | max=a
| |_
|altfel
| daca c>b atunci
| | max=b
| |altfel
| | max=a
| |_
|_
scrie max
#include<iostream.h>
#include<conio.h>
void main()
{clrscr();
int a,b,c,max;
cout<<"a="; cin>>a;
cout<<"b="; cin>>b;
cout<<"c="; cin>>c;
if(a>b)
if(c>a)
max=c;
else
max=a;
else
if(c>b)
max=c;
else
max=b;
cout<<"Valoarea maxima este "<<max;
getch();
}
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++
intregi a,b
citeste a
citeste b
citeste c
daca a>b atunci
| aux=a
| a=b
| b=aux
|_
daca b>c atunci
| aux=b
| b=c
| c=aux
|_
#include<iostream.h>
#include<conio.h>
void main()
{clrscr();
int a,b,c,aux;
cout<<"a="; cin>>a;
cout<<"b="; cin>>b;
cout<<"c="; cin>>c;
if(a>b)
{ aux=a;
a=b;
b=aux;
};
if(b>c)
{aux=b;
b=c;
c=aux;}
cout<<"Valoarea maxima este "<<c;
getch();
scrie max
Rezultat afiat
3.
reale a,b
citeste a
citeste b
daca a=0 atunci
| daca b=0 atunci
| | scrie Infinitate sol
| |altfel
| | scrie Imposibil
| |_
|altfel
| x=-b/a
| scrie x
|_
#include<iostream.h>
#include<conio.h>
void main()
{ float a,b,x;
cout<<"a="; cin>>a;
cout<<"b="; cin>>b;
if(a==0)
if(b==0)
cout<<"Exista o infinitate de solutii!";
else
cout<<"Ecuatie imposibila!";
else
{ x=-b/a;
cout<<"Solutia ecuatiei este "<<x;
}
getch();
}
Rezultat afiat
4.
reale a,b
citeste a
citeste b
daca a=0 atunci
| daca b=0 atunci
| | daca c=0 atunci
Program C++
#include<iostream.h>
#include<conio.h>
#include<math.h>
void main()
{ float a,b,c,x, delta,x1,x2;
clrscr();
cout<<"a="; cin>>a;
cout<<"b="; cin>>b;
cout<<"c="; cin>>c;
if(a==0)
if(b==0)
if(c==0)
cout<<"Exista o infinitate de
solutii!";
else
cout<<"Ecuatie imposibila!";
else
{ cout<<"Ecuatie de gr I cu solutia ";
x=-c/b;
cout<<x;
}
else
{ delta=pow(b,2)-4*a*c;
if(delta<0)
cout<<"Ecuatia nu are solutii reale!";
else
if(delta==0)
{ cout<<"Ecuatia are solutii egale!;
cout<<x1=x2="<< -b/(2*a);}
else
{ x1=(-b+sqrt(delta))/2*a;
x2=(-b-sqrt(delta))/2*a;
cout<<"Ecuatia are solutii
reale!"<<endl;
cout<<"x1="<<x1<<endl;
cout<<"x2="<<x2 <<endl;
}
}
getch();
}
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:
C++
corespunzator |altfel
fx/2
|
daca x=0 atunci
|
|
f 10
|
|altfel
|
|
fx*x
|
|_
|_
scrie f
real f,x
citeste x
daca x<-1 atunci
|
f x*x
|altfel
|
f 1/x
|_
scrie f
4. Care dintre urmtoarele instruciuni C++sunt corecte sintactic dac xi ysunt dou
variabile de tip ntreg?
a. if (x < 2) && (x > - 5)
{x=x+1; y=y-1;}
c. if x < 2 && x >-5
{ x=x+1; y=y-1;}
b. if -5 < x < 2
{ x=x+1; y=y-1;}
d. if (x < 2 && x > -5)
{x=x+1; y=y-1;}
(Examen de Bacalaureat, Matematic Informatic intensiv, 2008)
5. Care dintre urmtoarele instruciuni C++ atribuie variabilei ntregi t valoarea -1 dac i
b. if ((a>0)&&(b<0)) t=-1;
d. if (a*b>0) t=-1;
(Examen de Bacalaureat, Matematic Informatic intensiv, 2008)
6.
y=1;
if(k>0)
if(i!=j)
y=0;
elsey=2;
7.
n secvena alturat de instruciuni, variabilele i, j, k, x
i y sunt de tip ntreg. Pentru care dintre urmtoarele
seturi de valori ale variabilelor i, ji kvariabilele xi y
vor primi valori diferite ntre ele n urma executrii acestei
secvene?
if(k>0)
if(i!=j)x=0;
elsex=1;
elsex=2;
if(i!=j)
if(k>0)y=0;
elsey=2;
elsey=1;
a. x i y primesc aceeai valoare indifferent
de valorile variabilelor i,j i k
c. k=10; i=5; j=5
afiat:
a.
intreg x,y
x=13 y=0
daca x%2=0 atunci
| y=y+1
|altfel
| y=y-1
|_
scrie y
c.
intreg x,y
x=25 y=2
daca y%2=0 atunci
| x=x-y*y
|altfel
| x=x+y*y
|_
scrie x
b.
intreg x,y
x=122 y=0
daca x%10=x/10%10 atunci
|
y=y+1
|altfel
| y=y-1
|_
scrie y
d.
intreg x,y
x=10 y=100
daca x<y atunci
| x=x-y
| y=x+y
| x-y-x
|_
scrie x,y
Realizai apoi schema logic i programul C++ pentru fiecare din cele patru secvene de
algoritm.
9. tiind c variabila ntreac nr memoreaz valoarea 5, stabilii ce va afia urmtoarea
seven de instruciuni:
if(nr<6)
if(nr>3)
cout<<Bine;
else
cout<<Foarte bine;
else
cout<<Rau;
12. Scrieti un program care sa afiseze valoarea absoluta a unui numar intreg x citit de la
tastatura.
13. 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.
14. Se d un numr x, natural de trei cifre. S se verifice dac conine cifra 0.
15. Se dau doua numere intregi a si b. Afisati doar numarul mai mare.
16. Se dau trei numere intregi a, b, si c. Afisati doar numarul mai mic.
17. Se dau trei numere naturale a,b si c. Afisati in ordine crescatoare cele 3 numere.(ca tema
acasa reluati algoritmul pentru 4 numere)
18. Vom considera zilele saptamanii numerotate cu cifre de la 1 la 7.(Luni 1, Marti 2,...,
Duminica 7). Sa se scrie un algoritm care citeste de la tastatura un numar natural si
afisaza denumirea zilei din saptamana. In cazul in care numarul citit nu apartine
intervalului [1,7] se va afisa mesajul Date de intrare gresite!
19. Se da un numar a de trei cifre. Folosind criteriile de divizibilitate sa se precizeze daca
numarul este divizibil la 2, 3 sau 5.
20. Se citeste un numar natural de 3 cifre. Scrieti un program care afiseaza toate numerele
care pot obtine cu cifrele numarului dat.
21. Se citeste un numar natural de 3 cifre. Scrie un program care calculeaza suma si produsul
cifrelor sale.
22. Scriei un program care citete n variabila n nota unui elev obinut la examenul de
bacalaureat i afieaz situaia acestuia astfel:
a. PROMOVAT dac n 6, 10
b. RESPINS, dac n 1, 5
c. NEPREZENTAT, dac n=0
d. DATE ERONATE, altfel
23. Date dou numere, afiai-l pe cel mai mic. Exemplu : Date de intrare : 44 32 Date de
ieire : 32.
24. Se introduc vstele a doi copii. Afiai care copil este mai mare i diferena de vst
dintre cei doi. Exemplu: Date de intrare : 6 13 date de ieire : al doilea copil este mai
mare cu 7 ani.
25. Se introduc punctajele a doi sportivi. Afiai-le n ordine descresctoare. Exemplu: Date
de intrare 100 134 Date de ieire: 134 puncte 100 puncte.
26. Dintr-o cutie cu trei numere se extrag dou numere. Cunoscd suma celor dou numere
extrase, s se afieze numrul rmas n cutie. Exemplu : date de intrare : numere existente
in cutie 5 12 8 suma numerelor extrase 13 date de ieire : 12.
27. Se dau dou numere. S se nmuleasc cel mai mare cu doi i cel mai mic cu trei i s se
afieze rezultatele. Exemplu : date de intrare : 3 7 date de ieire : 9 14
28. Se introduc dou numere ntregi. S se testeze dac primul numr este predecesorul
(succesorul) celui de-al doilea i s se afieze un mesaj corespunztor. Exemple : date de
intrare : 2 4 date de ieire : Nu ; date de intrare : 5 6 date de ieire : Da.
BI
sau:
Da
BI
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.
Pseudocod
execut
BI
ct timp C(adev)
BI
Nu
C
Da
Instructiune C++
do
instruciune;
while (expresie logic);
sau:
do
{ instruciune1;
instruciune2;
......................
instruciunen;
}
while (expresie logic);
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;
Schema logic
Pseudocod
pentru contor=expr1; expr2; pas
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
1;
pas
numr de repetri=
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.
(structur repetitiv
cu numr fix de pai)
(structur repetitiv
cu test iniial)
DO-WHILE
(structur repetitiv
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:
Fie urmtoarea secven de algoritm:
s=0;
pentru i=1, 10, +1
|
s=s+i
|_
scrie s
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
Aplicaii rezolvate:
1. Care este valoarea variabilei i la sfritul execuiei urmtorului program:
Surs C++
#include<iostream.h>
int i;
void main()
{ while (i<=5)
i++;
cout<<i;
}
Explicaii
variabila i definita global => i=0
valoarea lui va creste cu 1 pn
cnd condiia i<=5 va deveni fals
va fi afisata valoarea 6
Explicaii
variabila i definit global => i=0
valoarea lui va creste cu 1 pn
cnd condiia i<=5 va deveni fals
vor fi afiate urmtoarele valori:
1 2 3 4 5
Transformarea
citeste n
daca n<=10 atunci
|
executa
|
| 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
4. S se realizeze schema logic pentru urmtorul algoritm:
B1
dac C1 atunci
| B2
|_
ct timp C2 execut
|
dac C3 atunci
|
|
B3
|
|altfel
|
|
B4
|
|_
|
B5
|_
B6
while
citete n
s=0
pentru i=1,n,+1
|
s=s+i;
|_
scrie s
citete n
s=0
i=1;
ct timp i<=n execut
|
s=s+i;
|
i=i+1;
|_
scrie s
do-while
citete n
s=0
dac n>=1 atunci
| i=1;
| execut
| |
s=s+i;
| |
i=i+1;
| |ct timp i<=n;
| |_
|_
scrie s
6. Dac valoarea citit pentru n este 8291, care va fi valoarea variabilei r, dup execuia
urmtoarei secvene de algoritm:
citete n
r=0
execut
|
r = (r*10+n%10)*10
|
n=n/100
|ct timp n>=10
scrie r
1.
2.
3.
4.
5.
6.
7.
8.
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
executata
condiia n>=0
8291
8291
8291
(0*10+1)*10=10
82
10
Adevarata
82
(10*10+2)*10=1020
1020
Falsa
|ct timp C2
B6
unde:
Rosu
scrie i
Se cere:
i=0
execut
|
i=i+1
|
scrie i
|ct timp i<=3
scrie i
pentru i=0,3,+1
| scrie i
scrie i
Afieaz: 1 2 3 4 4
4 ori
Afieaz:1 2 3 4 4
4 ori
Afieaz: 0 1 2 3 4
4 ori
#include<iostream.h>
#include<conio.h>
int i;
void main()
{clrscr();
while(i<=3)
{i++;
cout<<i<<" ";
}
cout<<i;
getch();
}
#include<iostream.h>
#include<conio.h>
int i;
void main()
{clrscr();
do
{i++;
cout<<i<<" ";
}while(i<=3);
cout<<i;
getch();
}
#include<iostream.h>
#include<conio.h>
int i;
void main()
{clrscr();
for(i=0;i<=3;i++)
cout<<i<<" ";
cout<<i;
getch();
}
Aplicaii practice
21. Scriei algoritmul n pseudocod pentru urmtoarele scheme logice i identificai structurile de
control care le alctuiesc:
dac C1 atunci
|
dac C2 atunci
|
|
B1
|
|altfel
|
|
B2
|
|
ct timp C3 execut
|
|
B3
|
|
dac C4 atunci
|
|
|
B4
|
|
a.
ct timp C1 execut
|
daca C2 atunci
|
|
executa
|
|
|
B1
|
|
|cat timp C3;
|
|
|
|altfel
|
|
cat timp C4 executa
|
|
|
B2
|
|
|
B3
|
pentru i=vi,vf,+1
|
|
B4
|
execut
| B1
| pentru i=v1,vf,+1
| |
B2
|
| dac C1 atunci
| | ct timp C2 execut
| | |
B3
| |
| |altfel
| | B4
|
|ct timp C3
|
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
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
b++;
a=a*b;
cout<<a<<" "<<b;
getch();
a. 10 10
b. 11
11
c. 9
d. 10
10
a. 32
b.34
c. 16
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;
a. de dou ori
b. niciodat
c. o singur dat
d. de opt ori
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
c. 0
b. 2
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:
S=0;n=9;
for(int i=1;i<=n;i++)
s=s+i;
cout<<s=<<s;
for(int i=1;i<=n;i++)
{ for(int j=1;j<=n;j++)
cout<<*;
cout<<endl;
}
13. Rescriei urmtoarele secvene de program C++, astfel nct buclele repetitive s fie nlocuite
cu instruciunea care implementez structura repetitiv cu test final:
int i=2;
int ok=1;
while(i<n/2 && ok)
if(n%i==0)
ok=0;
else
i++;
int s=0;
while(n!=0)
{ s=s+n%10;
n=n/10;
};
for(int i=100;i>=1;i--)
if(i%2==0)
cout<<i<< ;
for(char i='a';i<='f';i++)
cout<<i<<" ";
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:
int p=1, i=1;
while(i<n)
{ p=p*i;
i++;
};
char ch=a;
while (ch<=z)
{cout<<ch<< ;
ch++;
};
int i=1;
do{
int j=1;
do{
cout<<*;
j++;
}while(j<=n);
cout<<endl;
i++;
}while(i<=n);
int i=1;
while(i<=n)
{ int j=1;
do{
cout<<*;
j++;
}while(j<=n);
cout<<endl;
i++;
}
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.
i=1,
ct
|
|
s=0(numere ntregi)
timp (i<=5) execut
s=s+i
i=i+1
b. de 5 ori i i=6
d. de 5 ori si i=5
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.
i=0 (numar intreg)
ct timp i<1 execut
|
i=i+1
b.4
c.3
d.1
nr=0
ct timp c>b execut
a=a-b
nr=nr+1
scrie nr, ,a
scrie n
Se cere:
a. Scriei valoarea ce se va afia dac se citesc, n aceast ordine, numerele 12, 7,
354, 9, 1630, 0.
b. Scriei programul C/C++ corespunztor algoritmului dat;
c. Desenai schema logic corespunztoare algoritmului scris n pseudocod.
22. Fie urmtoarea secven de algoritm:
citete a,b,c (numere naturale nenule)
dac a>b atunci
t=a; a=b; b=t
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:
citeste n,m (numere naturale)
ct timp nm execut
n=n+1
m=m-1
scrie n
Se cere:
a. Scriei valoarea care se afieaz dac se citesc numerele n=6 i m=12;
b. Scriei programul C/C++ corespunztor algoritmului dat;
c. Desenai schema logic corespunztoare algoritmului scris n pseudocod;
d. Scriei dou perechi distincte de numere ce pot fi introduce pentru n i m astfel
nct s se afieze valoarea 10, n urma executrii algoritmului, pentru fiecare
dintre perechi.
24. Fie urmtoarea secven de algoritm:
citeste n (numr natural)
m=0
p=1
ct timp n>0 execut
c=n%10
dac c>0 atunci
c=c-1
m=m+c*p
p=p*10
n=n/10
scrie m
Se cere:
a. Scriei valoarea care se afieaz dac se citesc numerele n=5172;
b. Scriei programul C/C++ corespunztor algoritmului dat;
c. Desenai schema logic corespunztoare algoritmului scris n pseudocod;
25. Fie urmtoarea secven de algoritm:
citete x (numr natural)
s=0
f=2
ct timp x>1 execut
p=0
ct timp x%f=0 execut
x=x/f
p=p+1
dac p0 atunci
s=s+p
f=f+1
Se cere:
a. Scriei valoarea care se afieaz dac se citesc numerele x=140;
b. Scriei programul C/C++ corespunztor algoritmului dat;
c. Desenai schema logic corespunztoare algoritmului scris n pseudocod;
26. Fie urmtoarea secven de algoritm:
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:
citete n,k (numere naturale, k9)
i = k
ct timp i > 0 execut
n = n/10
i = i-1
z = n%10
scrie z
Se cere:
a. Scriei valoarea care se afieaz dac se citesc numerele n=32506 i k=3;
b. Scriei programul C/C++ corespunztor algoritmului dat;
c. Desenai schema logic corespunztoare algoritmului scris n pseudocod;
28. Fie urmtoarea secven de algoritm:
x = y
Se cere:
a. Scriei valoarea care se afieaz dac se citesc, n ordine, numerele 17 22 13 101
2 7 5 0;
b. Scriei programul C/C++ corespunztor algoritmului dat;
c. Desenai schema logic corespunztoare algoritmului scris n pseudocod;
29. Fie urmtoarea secven de algoritm:
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:
a. Scriei valoarea care se afieaz dac se citesc n=7 si k=2
b. Scriei programul C/C++ corespunztor algoritmului dat;
c. Desenai schema logic corespunztoare algoritmului scris n pseudocod;
Algoritmi care prelucreaz cifrele unui numr natural
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:
citete numrul de prelucrat
iniializarea variabilelor de manevr
ct timp numrul dat mai are cifre neprelucrate execut
- extrage ultima cifr din numr
- prelucraz aceast cifr conform enunului din problem
- elimin din numrul de prelucrat ultima lui cifr
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:
citete n numr natural i reprezint numrul de prelucrat
s=0
va conine, la final, suma cifrelor numrului n, iniial va avea
valoarea zero
ct timp n>0 execut
c = n%10
extrag ultima cifr din numarul n
s = s+c
adun cifra separat la suma cifrelor numrului n
n = n/10
elimin din numrul n ultima lui cifr
Program C++
#include<iostream.h>
#include<conio.h>
int n,s,c;
void main()
{clrscr();
cout<<"n="; cin>>n;
while(n>0)
{ c=n%10;
s=s+c;
n=n/10;
}
cout<<"suma cifrelor este "<<s;
getch();
}
nr = nr+1
numr c am separat o cifr din numrului n
n = n/10
elimin din numarul n ultima lui cifra
Program C++
#include<iostream.h>
#include<conio.h>
int n,nr;
void main()
{clrscr();
cout<<"n="; cin>>n;
while(n>0)
{ nr++;
n=n/10;
}
cout<<"numrul cifrelor este "<<nr;
getch();
}
3. Se d un numr natural n. Se
cifrelor pare din numarul dat.
cere
se
calculeze
suma
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
s = s+c
// adun cifra separat la sum
n = n/10
//elimin din numarul n ultima lui cifr
Program C++
#include<iostream.h>
#include<conio.h>
int n,s,c;
void main()
{clrscr(); cout<<"n="; cin>>n;
while(n>0)
{ c=n%10;
if (c%2==0)
s=s+c;
n=n/10;}
cout<<"suma cifrelor pare este "<<s;
getch();
}
c = n%10
// extrag ultima cifr din numrul n
scrie
cif_max = c
n = n/10
Program C++
#include<iostream.h>
#include<conio.h>
int n,c,cif_max;
void main()
{clrscr();
cout<<"n=";cin>>n;
while (n>0)
{c = n%10;
if( c>cif_max)
cif_max = c;
n = n/10;
}
cout<<"cifra maxima este ";
cout<<cif_max;
getch();
}
c = n%10
// extrag ultima cifr din numarul n
m = m*10+c
// adun cifra separat la numrului m modificnd i
n = n/10
// elimin din numrul n ultima lui cifr
Program C++
#include<iostream.h>
#include<conio.h>
int n,c,m;
void main()
{clrscr();
cout<<"n=";cin>>n;
while (n>0)
{ c=n%10;
m=m*10+c;
n=n/10;
}
cout<<"numarul cu cifrele inversate
este "<<m;
getch();
}
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:
citete n // numr natural i reprezint numrul de prelucrat
ok = 1
// presupun c toate cifrele numrului sunt pare, iniial variabila
ok va avea valoarea unu
ct timp n>0 i ok = 1 execut // numrul mai are cifre i preupunerea
c = n%10
// extrag ultima cifr din numrul n
ok = 0
// presupunerea fcut nu este adevarat!
n = n/10
// elimin din numrul n ultima lui cifr
daca ok = 1 atunci
Program C++
#include<iostream.h>
#include<conio.h>
int n,c,0ok;
void main()
{clrscr();
cout<<"n=";cin>>n;
ok=1;
while (n>0 && ok)
{ c=n%10;
if (c%2==1)
ok=0;
n=n/10;
}
if (ok==1)
cout<<"Toate cifrele numarului dat
sunt pare ";
else
cout<<"NU toate cifrele numarului
dat sunt pare ";
getch();
}
sau:
cel puin o cifr par, atunci vom ajunge la concluzia ca n cifrele numrului dat exist cel puin
o cifr par.
Algoritmul este:
citete n // numr natural i reprezint numrul de prelucrat
ok = 0
// presupun c toate cifrele numrului sunt impare, iniial
variabila ok va avea valoarea zero, nici o cifr nu ndeplinete
condiia cerut
ct timp n>0 i ok = 0 execut // numrul mai are cifre i preupunerea
c = n%10
// extrag ultima cifr din numrul n
ok = 1
// presupunerea fcut nu este adevarat!
n = n/10
// elimin din numrul n ultima lui cifr
dac ok = 1 atunci
Program C++
#include<iostream.h>
#include<conio.h>
int n,c,ok;
void main()
{clrscr();
cout<<"n=";cin>>n;
while (n>0 && !ok)
{ c=n%10;
if (c%2==0)
ok=1;
n=n/10;}
if (ok==1)
cout<<"Exista cel putin o cifra para!";
else
cout<<"NU exista cifre pare, toate
cifrele sunt impare ";
getch();
}
sau:
Aplicaii practice
1. Se citete de la tastatur un numr natural n de cel mult 9 cifre. Se cere s se calculeze suma
cifrelor impare.
Exemplu: dac n=2345 atunci suma cifrelor impare este s=5+3=8
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
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.
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
3
732
67324
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
care coboar
scrie d l divide pe n
altfel
scrie d nu l divide pe n
Dac vom nota cu Dn 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 :
citete n (numr natural)
nr=0
pentru d=1,n,+1
dac n%d=0 atunci
nr=nr+1
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:
citete n (numr natural)
ok=1
// presupun numrul dat ca fiind un numr prim
d=2
ct timp d<= n i ok = 1 execut
dac n%d=0 atunci
// am gsit un divizor propriu n [2,
ok=0
// atunci n nu este prim
altfel
d=d+1
dac ok = 1 atunci
Observaie:
n]
2420022*52
2422
12111
1111
11
Deci 24200= 23*52*112
s=0
//numr de cte ori factorul d l divide pe n
s=s+1
n=n/d
dac s 0 atunci
scrie d, la puterea , s
d=d+1
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=2 2*3*5*7 i dac b = 504
atunci descompunerea n factori primi este 504=23*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 Euclid1:
Varianta 1: Folosind operaia de mprire
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
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.
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).
Algoritmul n pseudocod este:
citete a,b
// dou numere naturale pentru care calculez cmmdc
dac a<b atunci //interschimb valoarea lui acu valoarea lui b
aux=a
a=b
b=aux
r=a%b
// determin restul impartirii lui a la b
ct timp r 0 execut
a=b
b=r
r=a%b
//egale din cel mai mare numar il scad pe cel mai mic
a = a-b
altfel
b = b-a
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:
cmmmc( a, b)
a *b
cmmdc( a, b)
a = a-b
altfel
b = b-a
scrie c/a
//a=b dup incheierea algoritmului de determinare a cmmdc si
//reprezinta chiar valoarea determinat
Aplicaii rezolvate
1. Se citete de la tastatur un numr natural n. Se cere s se
calculeze suma divizorilor si.
Exemplu: dac n=8 divizorii si sunt {1, 2, 4, 8} deci va trebui s afim valoarea 15= 1+2+4+8
Algoritmul n pseudocod este:
citete n
//numr natural
s=0
// iniializez suma divizorilor lui n cu zero
pentru d=1,n,+1 // caut posibilii divizori a lui n n intervalul [1,n]
dac n%d = 0 atunci //dac d este divizor a lui n atunci
s=s+d
//il adaug la suma
Program C++
#include<iostream.h>
#include<conio.h>
int n,s;
void main()
{ clrscr();
cout<<"n="; cin>>n;
for(int d=1;d<=n;d++)
if(n%d==0)
s=s+d;
cout<<"Suma divizorilor lui"<<n;
cout<<" este "<<s;
getch();
}
Program C++
#include<iostream.h>
#include<conio.h>
int n,nr;
void main()
{ clrscr();
cout<<"n="; cin>>n;
for(int d=1;d<=n;d++)
if(n%d==0)
nr++
cout<<"Numarul divizorilor lui"<<n;
cout<<" este "<<nr;
getch();
}
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();
}
sau
Exemplu: dac n=24200, atunci descompunerea n factrori primi a lui este 24200=2 3*52*112, se
observ c factorul 2 apare la cea mai mare putere n descompunere, deci pe ecran trebuie afiat
valoarea 2.
Algoritmul n pseudocod este:
citete n // numr natural
f_max=0
// factorul maxim initial este 0
p_max=0
// puterea acestui factor este initial tot 0
d=2
// primul posibil factor din descompunere este 2
ct timp n>=1 execut
s=0
//numr de cte ori factorul d l divide pe n
s=s+1
n=n/d
dac s 0 atunci//daca d a fost factor vad daca are cea mai mare putere
p_max=s;
//actualizez puterea maxima
f_max=d;
//pastrez factorul la putrea maxima
d=d+1
Program C++
#include<iostream.h>
#include<conio.h>
int n,s,d,p_max,f_max;
void main()
{ clrscr();
cout<<"n="; cin>>n;
d=2;
while(n>1)
{ s=0;
while(n%d==0)
{s++;
n=n/d;
}
if(s>p_max)
{ p_max=s;
f_max=d;
}
d++;
}
cout<<"factorul la puterea maxima este ;
cout<<f_max;
getch();
}
//egale din cel mai mare numar il scad pe cel mai mic
a = a-b
altfel
b = b-a
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
Program C++
#include<iostream.h>
#include<conio.h>
int n,a,b;
void main()
{clrscr();
cout<<"n="; cin>>n;
cout<<"dati un numar:"; cin>>a;
cout<<"dati un numar:"; cin>>b;
while(a!=b)
if(a>b)
a=a-b;
else
b=b-a;
for(int i=3;i<=n;i++)
{
cout<<"dati un numar:"; cin>>b;
while(a!=b)
if(a>b)
a=a-b;
else
b=b-a;
}
cout<<"cmmdc dintre numerele date este ",a;
getch();
}
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 22*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.
3. Se citete un numr natural n,(n<=10000) care nu este numr
prim. Se cere s se determine care este cel mai mare numr
prim, dar mai mic dect n i care este cel mai mic numr prim
dar mai mare cu n.
Exemplu: dac n este 100, cel mai mare numar prim mai mic dect 100 este 97, iar cel mai mic
numr prim mai mare dect 100 estr 101.
4. S se determine toate numerele perechile de numere prime
gemene mai mici dect un numr natural n, citit de la
tastatur (n<=10000). Dou numere formeaz o pereche de numere
prime gemenene.
Exemple: dac n=20 atunci se vor afia perechile (3, 5), (5, 7), (11, 13), (17, 19).
5. Se citete de la tastaur un numr natural n(n<=10000). Se
cere s se afieze primele n numere prime.
Exemplu: dac n=10 atunci primele 10 numere prime sunt 2,3,5,7,11,13,17,19, 23,29.
6. Se citete de la tastaur un numr natural n, (n<=10000). Se
cere s calculeze suma numerelor divizibile la 3 mai mici sau
egale cu n.
Exemplu: dac n=16 atunci se va afia 45, s= 3+6+9+12+15=45.
7. Determinai i afiai pe ecran toate numere naturale care
mprite la 24, 30,18 dau restul 7.
Exemplu: dac n=2000 se vor afia numerele 367, 727, 1087, 1447, 1807.
8. Se dau dou numere naturale a i b. S
divizorii comuni celor dou numere.
Exemplu: dac a=180 i b=84 atunci se vor afisa 1, 2, 3, 4, 6, 12.
se
afieze
toi
a
.
b
Scriei un program
1
.
10
i m
bi ,
baz
25:2=
25
rest
12
(25)10=(11001)2
Observaie:
1
0
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:
//conversia din baza 10 n baza b din [2,10]
citete n,b
// numere naturale, n-numrul de transformat, b-baza
m=0
// va conine rezultatul conversiei
p=1
// puterile lui 10 iniial 100=1
ct timp n0 execut
r=n%b
// calculez restul mpririi numrului la baz
m=m+r*p
// formez valoarea noului numr
p=p*10
// cresc puterea lui 10
n=n/b
scrie m
c=n%10
// extrag cate o cifra din numarul dat
m=m+c*p
// formez numarul adunnd cifrele extrase din n cu puteri ale
// bazei
p=p*b
// cresc puterea bazei
n=n/10
// elimin ultima cifra din n
scrie m
// valoarea numrului n baza 10
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
1. Se d un numr natural n, scris n baza 10. Sa se verifice
dac numrul de cifre de zero este egal cu numrul de cifre de
1 n reprezentarea numrului n baza doi.
Exemplu: dac n=(49)10 =(110001)2 are trei cifre de 1 i trei cifre de zero, deci pe ecran trebuie
afiat Da, numar egal de cifre de 0 i 1;
dac n=(54)10 =(110110)2 are patru cifre de 1 i dou cifre de zero, deci pe ecran trebuie afiat
Nu, numar diferit de cifre de 0 i 1.
Algoritmul n pseudocod este:
citete n
//numr natural care trebuie transformat n baza 2
m=0
//conine rezultatul conversiei numrului n n baza 2
nr0=0, nr1=0 //nr0-numr de cifre de 0 i nr1-numr de cifre de 1 din m
p=1
//100=1
ct timp n0 execut
r = n%2
// determin restul mparirii lui n la 2, poate fi 0 sau 1
dac r = 0 atunci
nr0=nr0+1
//numr ca am gasit o cifra de 0
altfel
nr1=nr1+1
//numr ca am gasit o cifr de 1
m=m+r*p
// formez numrul n baza 2
p=p*10
// cresc puterea lui 10
n=n/2
// mpart n la baza 2
scrie m
// afiez valoarea lui n n baza 2
// afiez rezultatul
dac nr0 = nr1 atunci
Program C++
#include< iostream.h>
#include<conio.h>
long n,m,nr0,nr1,r,p;
void main()
{ clrscr();
cout<<"n="; cin>>n;
p=1;
while(n!=0)
{r=r%2;
if(r==0)
nr0++;
else
nr1++;
m=m+r*p;
p=p*10;
n=n/2;
}
cout<<"numarul in baza 2 este "<<m;
cout<<endl;
if(nr0==nr1)
cout<<"Da are un numar egal de
cifre de 0 si 1";
else
cout<<"Nu, are numar diferit
de cifre de 0 si 1";
getch();
}
sau:
p = p*10
n = n/b2
Program C++
#include<iostream.h>
#include<conio.h>
long n,m,r,p,b1,b2;
void main()
{ clrscr();
cout<<"Numarul de transformat n=";
cin>>n;
cout<<"Baza in care este scris numarul b1=";
cin>>b1;
cout<<"Baza in care fac conversia b2=";
cin>>b2;
//conversia lui n din b1 in baza 10
p=1;
while(n!=0)
{r=n%10;
m=m+r*p;
p=p*b1;
n=n/10;
}
cout<<"numarul in baza 10 este "<<m<<endl;
//conversia lui m din baza 10 in b2
p=1;
while(n!=0)
{r=m%b2;
n=n+r*p;
p=p*10;
m=m/b2;
}
cout<<"numarul in baza "<<b2<<" este "<<n;
getch();
}
Aplicaii propuse
1. Se d un numr natural n. S se determine dac este palindrom
n baza doi. n caz negativ s se precizeze cte cifre are
numrul iniial n baza opt.
Exemplu: Un numr natural este palindrom dac i numai dac el este egal cu numrul obinut
prin inversarea cifrelor sale. Atunci dac n=(51)10=(110011)2 atunci el este palindrom n baza 2,
iar dac numrul iniial este n=(54)10=(110110)2=(66)8 se observ c el nu este palindrom n baza
doi i conine dou cifre n baza 8.
2. Se citete de la tastatur un numr natural scris n baza 2.
S se verifice dac n baza 10 reprezint un numr prim.
Exemplu: dac numrul iniial este n=(10011)2=(19)10 atunci n baza 10 el este un numr prim,
iar dac iniial citim numrul n=(1001110)2=(78)10 atunci observm uor c el nu este numr
prim n baza 10.
afieaz rezultatul