Sunteți pe pagina 1din 80

Lectia 1 Informatica - noiuni introductive

Definiie 1: Informatica este tiina care se ocup cu prelucrarea informaiilor cu ajutorul


calculatorului. Informaiile prelucrate pot avea diferite tipuri (valori numerice intregi sau reale,
iruri de caractere, imagini, sunete, filme, etc.).
n prezent, calculatorul este implicat din ce n ce mai mult n viaa noastr, fiind utilizat n
diferite aspecte dup cum urmeaz:
pentru gestionarea informaiilor: accesul rapid i exact la anumite informaii care ne
intereseaz la un anumit moment(de exemplu: bazele de date);
pentru rezolvarea unor probleme din domenii diferite cum ar fi matematica, fizica,
chimia, etc;
pentru comunicare: in prezent comunicarea rapida face parte din viata de zi cu zi,
utiliznd frecvent reteaua internet prin programele specifice (e-mail, chat, etc.);
pentru pstrarea amintirilor: realizarea de albume foto virtuale i arhive cu filme;
pentru relaxare: jocuri, filme, muzic.
n aceast carte vom nva s rezolvm probleme cu ajutorul calculatorului utiliznd
limbajul de programare C++. Orice program are la baz un algoritm de rezolvare.
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).
Date de intrare

Date de iesire

(Ce se d)

Program C++

(Ce se cere)

(scris pe baza unui algoritm de rezolvare)

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:
Corectitudinea - este proprietatea algoritmului de a furniza o soluie corect a problemei
date. n acest sens este de dorit ca algoritmii s se bazeze pe fapte i relaii matematice
demonstrabile.
Caracterul univoc sau deterministic - plecnd de la un set de date iniial anume,
rezultatul este unic, sau altfel spus, repetarea execuiei algoritmului duce ntotdeauna la
aceleai rezultate.
Generalitatea - este proprietatea unui algoritm de a rezolva o clas sau categorie de
probleme, i nu doar o singur problem particular. Spre exemplu, un algoritm care
rezolv doar ecuaia x2 + 5x 6 = 0 este mai puin general dect unul care rezolv ecuaia
de gradul II care are urmtoare form general ax2 + bx + c = 0, oricare ar fi valorile lui
a,b,c.

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.
Verificabilitatea - acea proprietate a algoritmilor care permite ca fiecare pas s poat fi
verificat ntr-un timp rezonabil de ctre om, folosind mijloace de validare de ncredere.
Optimalitatea - proprietatea unui algoritm de a se termina dup un numr minim de pai.
Spre exemplu, dac se cere s se calculeze suma primelor n numere naturale, putem
aplica formula de calcul, i astfel algoritmul se termin ntr-un singur pas, pe cnd dac
am aduna toate numerele de la 1 la n, el s-ar termina abia n n pai, i deci nu ar fi optim.
Finitudinea - este proprietatea algoritmului de a se termina ntr-un numr finit de pai.
Exist i algoritmi care nu se termin ntr-un numr mrginit de pai, dar acetia se
numesc "metode algoritmice".
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).

Etapele rezolvrii unei probleme cu ajutorul calculatorului


1. Analiza problemei: presupune:
citirea i analiza cu atenie a enunului problemei date pentru identificare datelor de
intrare (datele iniiale ale problemei). (Ce se cunoaste ? )
nelegerea i identificarea rezultatului ateptat (stabilirea datelor de iesire). (Ce se
cere?)
Alegerea strategiei de rezolvare a problemei (identifiarea algoritmului optim de
rezolvare a problemei) (Cum rezolv?) Pentru rezolvarea unei probleme date pot exista
mai multe metode. n acest moment trebuie identificat care este cel mai optim mod de
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.
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.
1

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.

Limbajul pseudocod i schema logic


Asa cum am precizat anterior pseudocodul este o forma de reprezentare a algoritmilor i
ca orice limbaj folosete un grup de cuvinte cheie (citete, scrie, dac, atunci, ct timp, pentru,
etc.), organizate n construcii sintactice care traduc structurile fundamentale 1, dar neavnd o
sintax rigid ca un limbaj de programare. Limbajul pseudocod las la libera alegere a
utilizatorului introducerea unor notaii care s permit o mai buna exprimare.
Schema logic este un mijloc de descriere a algoritmilor prin reprezentare grafic.
Fiecrui tip de operaie i este consacrat o figur geometric (un bloc tip) n interiorul creia se
va nscrie operaia din pasul respectiv, iar succesiunea operaiilor este indicat prin sgei.
Blocuri utilizate n realizarea schemelor logice:

START

STOP

Marcheaz nceputul / sfritul unui algoritm


reprezentat n schem logic

Se utilizeaz pentru implementarea operaiilor de


intrare / ieire

Se utilizeaz pentru scrierea condiiilor n cazul


structurilor alternativ sau repetitiv

Se utilizeaz pentru scrierea operatiilor de atribuire


(atunci cnd o variabil primeste o valoare)

Se utilizeaz pentru conectarea liniilor care leag


diferitele figuri geometrice i marcheaz un punct
de intersecie.
Legturile dintre blocurile schemei logice se
realizeaz numai prin intermediul sgetilor, pentru
a stabili sensul de parcurgere al algoritmului.

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

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

Lectia 2. Elemente de baz n reprezentarea algoritmilor


Una dintre principalele noiuni care intervin n programare este noiunea de dat.
Definiie 1: Data este o informaie care se prelucreaz cu ajutorul calculatorului. Datele se pot
clasifica:
a. Dup locul n care sunt prelucrate:
date de intrare - reprezint un set de informaii iniiale care sunt cunoscute i
care reprezint punctul de plecare n rezolvarea problemei.
date de manevr se utilizeaz n interiorul algoritmului pentru a memora la
un anumit moment valori intermediare necesare procesului de rezolvare al
problemei date
date de ieire - sunt rezultatele ateptate i care sunt obinute prin prelucrarea
datelor de intrare cu ajutorul algoritmului dat.
b. Dup tipul informaiilor memorate:
date numerice conin ca valori numere ntregi sau reale
date logice pot sa conin ca valoare doar: True sau False
date de tip caracter conin ca valoare un singur caracter din cele 256 din
codul Ascii 1
date structurate sunt acele date care se compun pe baza unor reguli precise
din datele simple(numere, caractere, logice)
c. Dup felul n care i schimb valoarea pe parcursul unui algoritm
1. variabile - valorile se modific pe masur ce algoritmul se execut
2. constante- valorile lor rmn constante pe toata durata de execuie a
programului
O variabil se caracterizeaz prin:
numele variabilei - este format din unul sau mai multe caractere (litere mari sau
mici ale alfabetului englez, numere si caracterul underline) cu condiia ca primul
caracter nu fie cifr.
tipul variabilei stabileste mulimea de valori posibil pentru variabila respectiv
precum si setul de operaii permise; un tip de dat poate fi elementar (reprezinta
date de tip numeric-ntreg sau real i nenumeric-caracter, logic), structurat ( sunt
obinute prin gruparea tipurilor elementare de date dup reguli bine precizate ) sau
referin (permit referirea la date alocate dinamic n timpul execuiei
programului)
valoarea variabilei reprezint valoarea efectiv pe care o are o variabil la un
moment dat n interiorul codului surs. ntr-un moment dat o variabil are
ntotdeauna o singur valoare, valoarea ei modificndu-se doar n urma unei
operaii de atribuire sau a unei operaii de citire de la tastatur sau din fiier text.
adresa variabilei reprezint locaia fizic din memoria calculatorului n care se
pstreaz valoarea unei variabile. n majoritatea situaiilor adresele variabilelor
sunt invizbile pentru utilizator.
Pentru memorarea informaiilor n memoria intern a calculatorului se foloseste sistemul
binar, care are doar dou valori 0 si 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. comutatorul K1 nchis,
echivalentul valorii 1
trece curent electric
de la punctul A la 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).

Reprezentarea datelor numerice n memoria calculatorului


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.
Reprezentarea numerelor naturale
Formatul de reprezentare ntreg fr semn nu presupune nimic n plus dect trecerea de la
baza 10 la baza 2. n aceasta reprezentare putem scrie spre exemplu:
numrul (188)10 = (10110110)2
(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.
Reprezentarea numerelor ntregi
Numerele ntregi se reprezint n memorie n complement fa de 2. Reprezentarea n
complement fata de 2 este folosit de majoritatea procesoarelor actuale. Ideea acestei
reprezentri se ntelege pe baza observaiei simple c numrul x adunat cu numrul -x trebuie s
dea ntotdeauna valoarea 0. ntrebarea ce se pune este cum se scrie -x, deoarece pentru numerele
ntregi pozitive se pstrez regula de la paragraful precedent. Cel mai simplu este s folosim un
bit pentru reprezentarea semnului (de ex., 0 nseamn plus i 1 nseamn minus) si ceilali (n-1)
bii pentru reprezentarea valorii absolute.
Numerele negative se reprezint astfel:
plecm de la reprezentarea n baza 2 a opusului (care este pozitiv),
inversm toate cifrele pn la ultimul 1 (exclusiv)
Exemple:
(22)10 = (00010110)2, numr pozitiv
( -22)10 = (11101010)2, numr negativ
Primul bit (cel scris cu culoare roie) se mai numeste bit de semn deoarece el indic
semnul numarului (este 0 dac i numai dac numrul este pozitiv). Avantajul acestei
reprezentri este urmatorul: algoritmii de adunare i de scadere a dou numere reprezentate n
cod complementar sunt identici cu algoritmii de adunare si de scadere pentru numere pozitive
reprezentate in baza 2.
Pe un octet se pot memora numere naturale cuprinse n intervalul [-128..+127]
Reprezentarea numerelor reale
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


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

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.
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
ASCII1. 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. .....................................
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)

Cuvinte cheie (keywords)


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

Structura general a unui program C++


Un program C++ este alctuit din funcii i variabile. Orice program C++ trebuie s
conin n mod obligatoriu o funcie special numit main. Aceast este special prin faptul c
execuia programului debuteaz ntotdeauna la nceputul acestei funcii.
Structura unui program C++ are urmtoarea structur:
// declaraii directive preprocesor fisiere antet (header)
#include<nume_directiva_preprocesor.h>
//definiii de tipuri de date i variabile globale
//definiii de funcii utilizator
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()
{ }

Prezentarea ecranului mediului de programare C++ 3.1


Lansarea n execuie a mediului de programare C++ se face lansnd n execuie fiierul
executabil bc.exe aflat n directorul BIN din pachetul Borland C++, obinut dup instalarea
acestuia. Dup acest aciune ecranul afiat va avea urmtoarea form:
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
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
de
dat

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
double
real
long double
void

Domeniu de valori

Mod de reprezentare n
memorie

-128...127
codul ASCII al
0...255
caracterului.
-32768...23767
complement fa de 2
0...65535
n baza 2
-231..231-1
complement fa de 2
0.. 232-1
n baza 2
-38
38
[3.410 ...3.410 ] 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]
-4932
4932
[3.410 ...3.410 ]
u
virgul mobil dubla
10 octei cu semn
[-3.410-4932...precizie
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; variabila p este de tip char fara semn
double d;
variabila d este un numar real dubl precizie

Operatori. Expresii. Evaluarea expresiilor


Operatori aritmetici
Operatorii aritmetici se mpart n dou categorii:

operatori unari: se aplic asupra unui singur operand.Singurul operator aritmetic unar
definit n C++ este caracterul - scris n fata unui numr ntreg sau real si care determin
semnul valorii respective.
operatori binari: se aplic asupra a doi operanzi. Operatorii binari definii n limbajul
C++ sunt:
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

Prioritatea operatorilor este prezentat n urmtorul tabel:


Operator
Operatorul unar Cel mai prioritar
Operatorii multiplicativi: *,/ ,%
Prioritate medie
Operatorii aditivi:+,Cel mai putin prioritar
Operatorii aritmetici se grupeaza de la stnga la dreapta Ordinea de evaluare este cea de
la matematic. Prioritatea operatoriloe se poate schimba daca in relaiile matematice intervin
caractere ( , ) folosite pentru gruparea termenilor expresiilor matematice.
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
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

Operatorii relaionali sunt operatori binari i desemneaz relaia de ordine n care se


gsesc cei doi operanzi. Rezultatul aplicrii unui operator relaional este 1 (adevrat) dac cei
doi operanzi sunt n relaia indicat de operator, i 0(fals), altfel. Tabelul cu operatorii
relaionali din limbajul C++ este:
Operator
Semnificaie
= =
este egal
<
mai mic
<=
mai mic sau egal
>
mai mare
>=
mai mare sau egal
!=
diferit
Exemple:
Expresie
Valoare obinut
relaional
Dac avem dou variabile a=20 i b=3 definite de tip int atunci:
a==b
20 este egal cu 3? rezultat 0 (fals)
a!=b
20 este diferit 3? rezultat 1 (adevarat)
a<b
20 mai mic decat 3? rezultat 0(fals)
a<=b
20 mai mic sau egal cu 3? rezultat 0 (fals)
a>b
20 mai mare decat 3? rezultat 1 (adevarat)
a>=b
20 mai mare sau egal cu 3? rezultat 1 (adevarat)
Operatori logici
Operatori logici globali:
Exist trei tipuri de operatori logici globali:
Operator
Denumire
Tip
Prioritate
!
Negaie logic
Operator unar
&&
Operator binar
Conjucie logic(i logic)
||
Operato binar
Disjuncie logic(sau logic)
Aa cum tii deja n limbajul C++, valoarea logic fals are asociata valoarea 0, iar orice
valoare diferit de 0 are semnificaia de adevrat. Prin urmare efectul operatorilor logici este
acelai ca n matematic i este prezentat n tabele urmtoare:
a !a
a b a && b
a b a || b
0
1
0 0
0
0
0
0
1
0
0 1
0
0
1
1
1 0
0
1
0
1
1 1
1
1
1
1
Exemple:
Expresie logic
Valoare obinut
1,daca x se divide la 3
x%3
0, daca x nu se divide la 3
1,daca x se divide par
!(x%2)
0, daca x impar
1, daca x apartine intervalului [a,b]
(x>=a)&&(x<=b)
0, daca x nu apartine intervalului [a,b]
1, daca x nu apartine intervalului [a,b]
(x<a)||(x>b)
0,daca x apartine intervalului [a,b]
Se va transforma in relaia
(x<a)||(x>b)i deci rezultatul va fi:
!((x>=a)&&(x<=b))
1, daca x nu apartine intervalului [a,b]
0,daca x apartine intervalului [a,b]

(a==b+1)||(b==a+1)

1, daca a i b sunt numere consecutive


0, altfel

Operatori logici la nivel de bit:


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:
Operator
Semnificaie
Tip
Prioritate Obs.
~
unar
complementaritate (negaie bit cu bit)
<<
a*2b
binar
deplasare spre stanga cu b poziii (a<<b)
>>
a/2b
binar
deplasare spre dreapta cu b pozitii (a>>b)
&
binar
conjuncie logic(i logic) bit cu bit
^
dijuncie logica exclusiv (sau exclusiv) bit cu bit binar
|
binar
disjunie logic(sau logic) bit cu bit
Operatorii de delasare au ca efect deplasarea reprezentrii binare a primului operand spre
stnga (<<) sau spre dreapta (>>) iar numrul de poziii care se deplaseaz este precizat de al
doilea operand. La deplasarea la stnga, poziiile rmase libere n dreapta se completeaz cu 0.
La deplasarea spre dreapta, poziiile rmase libere n stnga se completeaz cu 0 (daca operandul
stng este un ntreg pozitiv) sau cu 1 (dac operandul este negativ).
Efectul operaiilor la nivel de bit este prezentat mai jos:
a
~a
a
b
a&b
a
b a^b
a
b a|b
0
1
0
0
0
0
0
0
0
0
0
1
0
0
1
0
0
1
1
0
1
1
1
0
0
1
0
1
1
0
1
1
1
1
1
1
0
1
1
1
Exemplu: Fie dou numere ntregi a i b reprezentate pe 1 octet:
bit: 7
a=25 0

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:
1 1 1 0 0 1 1 0
~a
-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
a + = b;
a=a+b;
a - = b;
a=a-b;
a* = b;
a=a*b;
a / = b;
a=a/b;
a=b*=2
a=b*2;
a=b=a*b;
a=b=60;

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

Operatorul de incrementare i de decrementare


Operatorii de incrementare/ decrementare sunt operatori unari care au drept scop
cresterea/micorarea valorii unei variabile cu 1.
Operator
Denumire
++
incrementare
-decrementare
Forma generala de uitlizare a acestor operatori este:
Forma generala
Efect
variabila++;
este forma postfixata a operatorului de incrementare, se utilizeaza mai inti
valoarea variabilei si apoi se creste valoarea ei cu 1
variabila--;
este forma postfixata a operatorului de decrementare, se utilizeaza mai inti
valoarea variabilei si apoi se scade valoarea ei cu 1
++variabila;
este forma prefixata a operatorului de incrementare, se efectueaz mai nti
cresterea cu 1 a valorii variabilei i cu noua valoare se utilizeaz variabila
--variabila;
este forma prefixata a operatorului de decrementare, se efectueaz mai nti
scderea cu 1 valorii variabilei i cu noua valoare se utilizeaz variabila
Operatori condiionali
Operatorii condiional sunt ? i : i se utilizeaz numai mpreun. Sintaxa general a
unei expresii condiionale este:
expresie_1 ? expresie_2 : expresie_3
Efect:
se evalueaz expresie_1.
Dac expresie_1 are o valoare diferit de 0 atunci valoarea expresiei condiionale este
egal cu valoarea expresiei_2.
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.

Tabelul cu prioritatea tuturor operatorilor


Operatori
! ~ + - ++ -- (tip) sizeof &
* / %
+ << >>
<
> <=
>=
= =
!=
&
^
|
&&
||
? :
=

*=

/=
^=

%=
+=
- =
|= <<= >>=

&=

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
...................................................................................................................................
g. Trei numere a, b, c sunt n ordine strict cresctoare 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
c. Expresie
b. 1
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 3
b. a este egal cu b
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
nenul memorat n variabila x, de tip int, este divizibil cu 100?
a. x%10+x/10%10==0
c. x%10+x/10==0
b. x/100==0
d. x%10+x%10/10==0
(Examen de Bacalaureat, Matematic Informatic, 2009)

15. Care dintre urmtoarele expresii C++ are valoarea 1 dac i numai dac numrul natural
memorat de variabila x de tip int are exact dou cifre?
a. x/100==0
c. x/10!=0
b. x/100==0 && x%10==0
d. x/100==0 && x/10!=0
(Examen de Bacalaureat, Matematic Informatic, 2009)

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
b. a/100%100

c. a/1000+a%1000
d. a/100%10+a/1000%10
(Examen de Bacalaureat, Matematic Informatic, 2009)

17. Care dintre urmtoarele expresii C++ are ca valoare cel mai mare dintre numerele
naturale nenule, cu cel mult 4 cifre fiecare, memorate n variabilele ntregi a i b?
a. (a+b+abs(a-b))/2
c. (a+b-abs(a-b))/2
b. a+b+abs(a-b)/2
d. (a+b-abs(a+b))/2
(Examen de Bacalaureat, Matematic Informatic intensiv, 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))
b. (a%c!=0)&&!(b % c!=0)

c. (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++ are valoarea 1?
a. !(n%2)
c. n%2!=0
b. n%2==0
d. !((n+1)%2==0)
(Examen de Bacalaureat, Matematic Informatic intensiv, 2009)

Lectia 3. Structura liniar


Structura liniar este cea mai simpl structur de control din algoritmic. Structura liniar
sau secvenial execut instruciunile n ordinea in care apar, de la prima la ultima, fr salturi
peste instruciuni i fiecare nstructiune se execut doar o singura data. De exemplu daca avem n
instruciuni :
instructiunea 1;
instructiunea 2;
instructiunea 3;
Aceasta este ordinea de executie!
................
instruciunea n;
Din cadrul structurii liniare fac parte urmtoarele instruciuni:
a. instruciunea de citire;
b. instructiunea de afisare;
c. operatia de atribuire;
d. apelul de functie cu rezultat void;
e. orice combinaie liniar de cele 4.

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.h 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;
}

Daca presupunem ca tastam secvena de caractere


10 100 <ENTER>
atunci n variabila a vom avea valoarea 10 si in variabila
b vom avea valoarea 100.
Acelai lucru se va obtine daca tastm secventa
10 <ENTER>
100 <ENTER>
Citirea variabilelor se face liniar.
Este un program echivalent cu cel de sus, citirea
variabilelor se face succesiv.

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

datele de ieire curg din interior(memoria


calculatorului) spre exterior(ecran)

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

citeste a,b
(numere ntregi)
scrie a+b

#include<iostream.h>
void main()
{ int a,b;
cout<<"a=";
cin>>a;
cout<<"b=";
cin>>b;
cout<<"Suma ";
cout<<<<a<<"+"<<b<<"="<<a+b;
}

2. Se citeste de la tastatur un numr ntreg. Sa se calculeze


folosind functia abs, valoarea absoluta a numarului si sa
se afiseze pe ecran.
Algoritm
Program C++

citeste a
scrie abs(a)

#include<iostream.h>
#include<conio.h>
#include<math.h>
void main()
{ clrscr();
int 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();
}

4. Scriei un program care citeste de la tastatura un numar


natural de trei cifre. Se cere sa se afieze pe ecran cifra
unitilor, cifra zecilor i cifra sutelor.
Algoritm
Program C++

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();
unsigneg 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
scrie aria

#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;
cout<<"aria este "<<a<<endl;
getch();
}

Rezultat afiat

Operaia de interschimbare a valorilor a dou variabile


Avem la dispoziie dou variabile a i b. Se cere sa se interschimbe valorile variabilelor a
i b, apoi sa se afiseze.
Exista mai multe metode de a realiza acest lucru si anume:
regula celor trei pahare(folosind o variabila auxiliara)
prin adunari i scaderi
prin inmuliri i impariri
Interschimbarea valorilor variabilelor a i b folosind regula celor trei pahare
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. continutul paharului A se toarn in paharul C

b. continutul paharului B se toarn in paharul A

c=a;

a=b;

c. continutul paharului C se toarn in paharul B

b=c;

A
b. Starea final

Algoritm

citeste A
citeste B
scrie A,B (initial)
C=A
A=B
B=C
scrie A,B(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

Interschimbarea valorilor variabilelor folosind adunri i scderi


Interschimbarea valorilor a doua variabile, notate A i B se poate face si fara a utiliza o
variabil auxiliar, cum am vazut la regula celor trei pahare. Folosind doar operaii de adunare si
scadere putem realiza acelai lucru dac executm n ordine urmtoarele operatii de atribuire:
Valoarea lui A
Valoarea lui B
Operatie
10
35
Valori iniiale
A=A+B
45
35
B=A-B
45
10
A=A-B
35
10
35
10
Valori finale
Algoritm

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

Interschimbarea valorilor variabilelor folosind nmuliri i mpariri


Interschimbarea valorilor a doua variabile ntregi, notate A i B se poate face si fara a
utiliza o variabil auxiliar, cum am vazut la regula celor trei pahare. Folosind doar operaii de

adunare si scadere putem realiza acelai lucru dac executm n ordine urmtoarele operatii de
atribuire:
Valoarea lui A
Valoarea lui B
Operatie
10
35
Valori iniiale
A=A*B
350
35
B=A/B
350
10
A=A/B
35
10
35
10
Valori finale
Algoritm

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

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:
(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++

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

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++

citeste a
citeste b
scrie ma

a b
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

3. Se citete un numr real a, pozitiv. S se afieze a .


Calculul valorii a se va face cu ajutorul funciei sqrt(a), definit n fiierul header math.h
Algoritm
Program C++

citeste a
scrie

#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
b h
face cu ajutorul relaiei: aria
, iar rezultatul acestei expresii este de tip real. Atunci:
2
Algoritm
Program C++

Citeste b
citeste h
scrie

b h
2

#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

5. Fie A i B dou puncte n plan memorate prin coordonatele


lor carteziene (xa,ya) i (xb,yb). Scriei un program care
sa calculeze i s afieze pe ecran lungimea segmentului
AB.
y
Lungimea segmentului AB se calculeaz cu ajutorul
B(3.5, 2)
yb
urmtoarei relaii matematice:

AB

xa

xb

ya

yb

xa

x
xb

Toate variabilele folosite n program vor fi de tip real.

ya

(-1, -1.5)

Algoritm

Program C++

citeste xa,xb

citeste ya,yb
scrie

xa

xb

ya

yb

#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.
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.
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();
}

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
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;

Cazul 2. Daca lipseste B1 atunci structura se reprezinta astfel:


Schema logic
Pseudocod
Nu

!C

Da

dac not c atunci


B2

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

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. S se determine valoarea maxima dintre trei numere memorate n


variabilele a, b i c.
Tinnd cont de exemplul anterior o modalitate simpla de rezolvare ar consta in compararea a
doua cte doua valorile variabilelor a, b, i c. Se compar, spre exemplu, prima dat valoarea
variabilei a cu valoarea variabilei b i presupunem c a>b. Dac meninem adevarat aceast
presupunere, atunci valoarea maxim obinut pn acum este a. Mai rmne s comparam
valoarea variabilei c fa de valoarea a. n aceast situaie exist dou cazuri i anume:
Cazul 1: reprezentat n urmtorul desen:

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

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

Program C++
#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
|_
scrie max

#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();
}

Rezultat afiat

3. S se scrie un program care s rezolve ecuaia de gradul I:


ax+b=0, valorile lui a i b se citesc de la tastatur i sunt
valori reale. Se vor lua n discuie toate cazurile.
Algoritm
Program C++

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. S se scrie un program care s rezolve ecuaia de gradul II:


ax2+bx+c=0, valorile lui a, b, c se citesc de la tastatur i
sunt valori reale. Se vor lua n discuie toate cazurile.
Algoritm

reale a,b
citeste a
citeste b
daca a=0 atunci
| daca b=0 atunci
| | daca c=0 atunci
| | scrie Infinitate sol
| |altfel
| | scrie Imposibil
| |_
| altfel

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:
a. Care este rezultatul urmatorului algoritm daca real f,x
citeste x
x are valoarea 0 si 3?
b. Scrieti programul
algoritmului dat.

C++

corespunzator

c. Pentru ce valori ale variabilei x se va executa


operatia de atribuire fx/2?

daca x<0 atunci


|
fx/2
|altfel
|
daca x=0 atunci
|
|
f 10
|
|altfel
|
|
fx*x
|
|_
|_
scrie f

3. Precizai ce greeli sunt n algoritmii urmtori:


real f,x
citeste x
daca x<0 atunci
|
f -x
|altfel
|
daca x>=0 atunci
|
|
f x*10
|
|_
|_
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 x i y sunt 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
numai dac variabilele ntregi a i b sunt nenule i au semne diferite?
a. if ((a>0)||(b<0)) t=-1;
c. if (a*b<0) t=-1;

b. if ((a>0)&&(b<0)) t=-1;
d. if (a*b>0) t=-1;
(Examen de Bacalaureat, Matematic Informatic intensiv, 2008)

6.
n secvena alturat de instruciuni, variabilele i,j,k i y sunt y=1;
de tip ntreg. Pentru care dintre urmtoarele seturi de valori ale if (k>0)
if (i!=j)
variabilelor i,j i k variabila y va avea valoarea 1 n urma
y=0;
executrii secvenei?
else y=2;
a. k=0; i=5; j=5
c. k=10; i=5; j=5

b. k=10; i=5; j=6


d. y nu va avea valoarea 1 indiferent
de valorile variabilelor i,j i k
(Examen de Bacalaureat, Matematic Informatic intensiv, 2008)

7.
n secvena alturat de instruciuni, variabilele i, j, k, x if (k>0)
if (i!=j) x=0;
i y sunt de tip ntreg. Pentru care dintre urmtoarele
else x=1;
seturi de valori ale variabilelor i, j i k variabilele x i y else x=2;
vor primi valori diferite ntre ele n urma executrii acestei if (i!=j)
secvene?
if (k>0) y=0;
else y=2;
else y=1;
a. x i y primesc aceeai valoare indifferent
de valorile variabilelor i,j i k
c. k=10; i=5; j=5

b. k=0; i=5; j=6


d. k=0; i=5; j=5

(Examen de Bacalaureat, Matematic Informatic intensiv, 2008)

8. Precizati pentru fiecare dintre urmtoarele secvene de algoritm care va fi valoarea


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;

10. Se d urmtorul set de instruciuni C++


int x=4,a=2,b=4,c=8;
if(x= = b)x=a;
else x=b;
if(x!=b) c=c+b;
else c=c+a;
cout<<c=<<c;

Care va fi valoarea afiata?


11. Fie urmtoarea secven de algoritm:
intreg v
daca v>35 atunci
| f=20
|altfel
| daca v>50 atunci
| | f=40
| |altfel
| | daca v>75 atunci
| | | f=70
| | |_
| |_
|_
scrie f

a. ce se afia dac valoarea iniiala a variabilei


v este 75;
b. Stabilii o valoare pentru variabila v astfel
inct valoarea variabilei f sa fie 20;
c. n ce situaii se va afia 70?
d.Desenai
schema
logic
echivalent
algoritmului dat.

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.

Lecia 5. Structuri repetitive


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

Structura repetitiv cu test iniial


Numele acestei structuri repetitive ine de faptul c naintea executrii blocului de
instruciuni se verific ndeplinirea unei condiii. n limbajul C++ este cunoscut sub denumirea
de structura while. Reprezentarea acestei structuri este:
Schema logic
Pseudocod
Instructiune C++
ct timp C(adev)execut
Nu

BI

sau:
Da

BI

while (expresie logic)


instruciune;

while (expresie logic)


{ instruciune1;
instruciune2;
......................
instruciunen;
};

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:
Schema logic

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;

Structura repetitiv cu numr fix de pai


Spre deosebire de structurile repetitive prezentate anterior, structura repetitiv cu numr
fix de pai se folosete atunci cnd se cunoate n mod exact, de la nceput, de cte ori trebuie
repetat o aciune. Se mai numete i structur repetitiv cu contor, iar n funcie de valoarea
pasului (mai mare dect 0/ mai mic dect 0) apare n dou forme:
cu pas pozitiv
cu pas negativ

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
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)

Structuri repetitive cu numr nedeterminat de pai


WHILE

DO-WHILE

(structur repetitiv
cu test iniial)

(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

// i=1 iniializare; i<=10 condiia de oprire; i=i+1 pas

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

iar dac facem nlocuirea cu o structur repetitiv cu test final obinem:


s=0
i=1
execut
|
s=s+i
|
i=i+1
|ct timp i<=10
|_
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

2. Ce afisez urmtoarea secven de program?


Surs C++
#include<iostream.h>
int i;
void main()
{ while (i<=5)
{ i++;
cout<<i<< ;
}
}

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

3. nlocuiete structura ct timp cu o structur repetitiv cu test final n urmtorul algoritm


asfel nct s se obin un algoritm echivalent.
Algoritm
citeste n
ct timp n<=10 executa
| afiseaza n
| n=n+2
|

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

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).
for

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:
1.
2.
3.
4.
5.
6.
7.
8.

citete n
r=0
execut
|
r = (r*10+n%10)*10
|
n=n/100
|ct timp n>=10

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
executata
1
2
4
5
4
5
8

n
8291
8291
8291
82
82
0

condiia n>=0

0
(0*10+1)*10=10
10
Adevarata
(10*10+2)*10=1020
1020
Falsa
Afieaz valoarea 1020

9. Identificai structurile de control i scrieti algoritmul n pseudocod echivalent cu urmtoarea


schem logic:

B1
execut
|
B2
|
dac C1 atunci
|
| B2
|
|altfel
|
| B3
|

|ct timp C2

B4
unde:
Rosu

- structura repetitiv cu test


final
Albastru-structura alternativ
Negru
structuri liniare sau blocuri
de instruciuni

10. Fie urmtoarele secvente de program:


i=0
ct timp i<=3
| i=i+1
| scrie i

scrie i

i=0
execut
|
i=i+1
|
scrie i
|ct timp i<=3

scrie i

pentru i=0,3,+1
| scrie i

scrie i

Se cere:
s se determine ce afieaz urmtoarele secvene de algoritmi
s se precizeze de cte ori se execut blocul de instruciuni ataat structurii repetitive
Scriei cte un program C++ pentru fiecare din cele trei secvene date.
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:

22. Fie urmtorii algoritmi scri n limbaj pseudocod:


Se cere:
a. Realizai schema logic pentru fiecare algoritm;
b. Care sunt structurile repetitive ntalnite n fiecare
algoritm?
c. Cte structuri alternative identificai n fiecare
algoritm dat?

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

3. Care este rezultatul afiat dup execuia urmtorului algoritm?


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

5. Care este efectul urmtorului program?

#include<iostream.h>
#include<conio.h>
int i,n;
void main()
{clrscr();
n=10;
for(i=1;i<=n;i++)
{ cout<<i<<" ";
n--;
}
getch();
}

a. 1 2 3 4 5 6 7 8 9 10
c. 10 9 8 7 6 5 4 3 2 1

b. 1 2 3 4 5
d. 5 4 3 2 1

6. Fie urmtoarea secven de program:


#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
c. a f a f a f

b. i i i i i i
d. a b c d e f

7. Fie urmtoarea secven de program:


#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
c. 9 10

b. 11
d. 10

11
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
c. 16

b.34
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;

a. de dou ori
c. o singur dat

b. niciodat
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=10;i>= -2;i--)


cout<<i=<<i<<endl;

for(int i=1;i<=n;i++)
{ for(int j=1;j<=n;j++)
cout<<*;
cout<<endl;
}

for(int i=5; i<=10;i++)


cout<<i<< ;
cout<<end;

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

a. se obine o bucl infinit


c. de 6 ori si i=6

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

a. o singur dat i i=1


c. nu se execut niciodat i i=0

b. de dou ori i i=1


d. se obine o bucl infinit

17. Specificai de cte ori se vor repeta instruciunile din bucla repetitiv i care vor fi valoarile
variabilelor s i c la sfritul urmtoarei secvene de algoritm. Scriei programul C++
corespunztor algoritmului dat.
c=100, s=0 (numere ntregi)
execut
|
s=s+c
|
c=s-10
|ct timp s<=c

a. o singur dat i s=90, c=100


c. o singur dat i s=90, c=90

b. o singur dat i s=100, c=90


d. se obine o bucl infinit

18. Fie urmtoarea secven scris n limbaj pseudocod:


citete n
i=1
ct timp i<=n execut
| scrie # #
| i=i+1;

Care trebuie s fie valoarea variabilei n astfel nct s se afieze pe ecran # # # # # # ?


a. 2
c.3

b.4
d.1

19. Fie urmtoarea secven de algoritm:


citete a,b
pentru i=a,b,+1
| dac i%2 == 0 atunci
| | scrie i,
|

a. Ce va afia dac pentru variabilele a i b se vor citi valorile 10 respectiv 20?


b. Dai un set de valori de intrare pentru care algoritmul nu afiseaz nimic
c. Scriei un program C++ corespunzator algoritmului dat.
20. Fie urmtoarea secven de algoritm:
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

a. Ce se va afia dec valorile iniile ale variabileor a i b sunt 54 si 10.


b. Dai un set de date de intrare pentru care se va afia 3 i 0.
c. Scriei programul C++ corespunztor algoritmului dat.

21. Fie urmtoarea secven de algoritm:


citete x (numr natural)
n=0
ct timp x0 execut
y=x; c=0
ct timp y>0 execut
dac y%10>c atunci
c=y%10

y=y/10

n=n*10+c
citete x

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

ct timp m<n execut


m=m+1
n=n-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:
citete x (numr natural nenul)
ct timp x>0 execut
citete y (numr natural)
dac x>y atunci
scrie x%10
altfel
scrie y%10

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

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:
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

scrie suma cifrelor este , s

Program C++

Rezultat afiat pe ecran

#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();
}

2. Se d un numr natural n. S se precizeze din cte cifre este


alctuit.

Algoritmul de rezolvare urmrete ablonul prezentat, doar c n acest situaie problema


se simplific. Nu mai avem nevoie de cifra s o pstrm n variabila c, doar vom numra de
cte ori putem mpri numrul la 10, obinnd astfel numrul de cifre
Algoritmul este:
citete n numr natural i reprezint numrul de prelucrat
nr=0
va conine numrul cifrelor numrului n, iniial va avea
valoarea zero
ct timp n>0 execut

nr = nr+1
numr c am separat o cifr din numrului n

n = n/10
elimin din numarul n ultima lui cifra

scrie suma cifrelor este , s

Program C++

Rezultat afiat pe ecran

#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

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

scrie suma cifrelor este , s

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();
}

Rezultat afiat pe ecran

4. Se d un numr natural n. Se cere s se determine cifra maxim


din numarul dat.
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
cif_max=0

numr natural i reprezint numrul de prelucrat


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

scrie cifra maxima este , cif_max

Program C++

Rezultat afiat pe ecran

#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();
}

5. Se d un numr natural n. Se cere s se determine numrul


obinut din n, dar care are cifrele n ordinea invers.
Algoritmul este:
citete n // numr natural i reprezint numrul de prelucrat
m=0
// va conine, la final, cifrelor numrului n n ordine invers,
iniial va avea valoarea zero
ct timp n>0 execut

c = n%10
// extrag ultima cifr din numarul n

m = m*10+c
// adun cifra separat la numrului m modificnd i

semnificaia cifrelor(cifra unitilor va deveni cifra

zecilor, cifra zecilor va deveni cifra sutelor, etc.)

n = n/10
// elimin din numrul n ultima lui cifr

scrie numrul cu cifrele inversate este , m

Program C++

Rezultat afiat pe ecran

#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();
}

6. Se d un numr natural n. Se cere s se verifice dac are


toate cifrele pare.
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

fcut rmne valabil

c = n%10
// extrag ultima cifr din numrul n

dac c%2 = 1 atunci


// dac ultima cifra extras este impar atunci

ok = 0
// presupunerea fcut nu este adevarat!

// rezult c nu toate cifrele lui n sunt pare

n = n/10
// elimin din numrul n ultima lui cifr

daca ok = 1 atunci

scrie Toate cifrele numarului dat sunt pare!


altfel

scrie NU toate cifrele numarului dat sunt pare!

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;
}

Rezultat afiat pe ecran

sau:

if (ok==1)
cout<<"Toate cifrele numarului dat
sunt pare ";
else
cout<<"NU toate cifrele numarului
dat sunt pare ";
getch();
}

7. Se d un numr natural n. Se cere s se verifice dac numrul


dat conine cel putin o cifr par.
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:
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

fcut rmne valabil

c = n%10
// extrag ultima cifr din numrul n

dac c%2 = 0 atunci


// dac ultima cifra extras este par atunci

ok = 1
// presupunerea fcut nu este adevarat!

// rezult c nu toate cifrele lui n sunt impare

n = n/10
// elimin din numrul n ultima lui cifr

dac ok = 1 atunci

scrie Exista cel putin o cifra par!


altfel

scrie NU exist cifre pare, toate cifrele sunt impare!

Program C++

Rezultat afiat pe ecran

#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)

3. Se citete de la tastatur un numr natural n de cel mult 9 cifre. Se cere s se calculeze


produsul cifrelor pare.
Exemplu: dac n=6542 atunci produsul cifrelor pare este 2*4*6=48

4. Se citete de la tastatur un numr natural n de cel mult 9 cifre. Se cere s se calculeze


produsul cifrelor impare.
Exemplu: dac n=6543 atunci produsul cifrelor impare este 3*5=15

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
3
732
67324

Exemplu 2: dac n=673124 se va afia:


31
7312
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
care coboar

VALE!, cifrele numrului coboar pn


la 1, dup care urc

Algoritmi care determin divizorii unui numr. Numere prime.


Descompunere n factori primi.
Determinarea cmmdc i a cmmmc dintre dou numere
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.
Algoritmul pentru determinarea divizorilor unui numr n dat de la tastatur este:
citete n (numr natural)
scrie Divizorii numrului , n, sunt:
pentru d=1, n, +1
dac n%d=0 atunci

scrie d,

Algoritmul pentru determinarea divizorilor proprii a unui numr n, dat de la tastatur


este:
citete n (numr natural)
scrie Divizorii proprii a numrului , n, sunt:
pentru d=2, n/2, +1
dac n%d=0 atunci

scrie d,

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

dac nr=2 atunci

scrie n, este numr prim


altfel

scrie n, nu este numr prim

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, 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

Algoritmul care determin descompunerea n factori primi a numrului natural n are


urmtoarea form:
citete n (numr natural) // numrul care se va descompune n factori primi
scrie Numrul , n, descompus n factori primi este egal cu:
d = 2
// primul factor la care incercm sa mprim pe n
ct timp n>=1 execut

s=0
//numr de cte ori factorul d l divide pe n

ct timp n%d=0 execut

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=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:
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
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

scrie cmmdc dinte , a, si , b, este ,b //ultimul rest diferit de zero

Varianta 2: Folosind operaia de scdere


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.

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:


citete a,b
//dou numere naturale pentru care calculez cmmdc
ct timp a b execut //dac numerele sunt diferite atunci pn cnd ajung

//egale din cel mai mare numar il scad pe cel mai mic

dac a > b atunci

a = a-b

altfel

b = b-a

scrie cmmdc dinte ,a, si ,b, este ,a //valoarea comuna dintre a si b

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:
este multiplu al lui a i al lui b;
se divide cu orice multiplu al numerelor a i b.
Cel mai mic multiplu comun dintre dou numere naturale a i b, notat cmmmc(a,b) se
calculeaz cu relaia:

cmmdc (a, b)

a *b
cmmdc (a, b)

deci algoritmul de determinare a cmmmc(a,b) este:


citete a,b
// numere naturale
// determin cmmdc(a,b) cu una din variantele Algoritmului lui Euclid
scrie cmmdc dintre, a, si , b, este:
c=a*b
//deoarece valorile iniiale ale variabilelor a i b se altereaz dup
//rularea algoritmului lui Euclid voi calcula produsul lor inainte de a le
//strica valoarea
ct timp a b execut

dac a > b atunci

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

scrie suma divizorilor lui ,n, este ,s

Program C++

Rezultat afiat pe ecran

#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();
}

2. Se citete de la tastatur un numr natural n. Se cere s se


calculeze numrul divizorilor si.
Exemplu: dac n=8 divizorii si sunt {1, 2, 4, 8} deci va trebui s afim valoarea 4
Algoritmul n pseudocod este:
citete n
//numr natural
nr=0
// iniializez numrul 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

nr=nr+1
//numr ca am gasit un divizor

scrie numrul divizorilor lui ,n, este ,nr

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();
}

Rezultat afiat pe ecran

3. Se citete de la tastatur un numr natural n. Se cere s se


afieze pe ecran numerele prime mai mici sau egale cu n.
Exemplu: dac n = 20 atunci trebuie afiate valorile 2 3 5 7 11 13 17 19
Algoritmul n pseudocod este:
citete n //numr natural
dac n<=1 atunci
scrie Nu exista numere prime mai mici sau egale cu 1
altfel
scrie Numerele prime mai mici sau egale cu , n, sunt:
pentru x=2,n,+1 // consider fiecare numar x din intervalul [2,n]
// verific daca numarul x este prim
ok=1, d=2
ct timp d<=radical din x i ok = 1 execut
dac x%d=0 atunci
ok=0
// atunci x nu este prim
altfel
d=d+1


dac ok = 1 atunci
// dac x este prim atunci l afiez

scrie x,

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

4. Se d un numr natural n. Se cere s se determine factorul la


puterea cea mai mare care apare n descompunerea n factroi
primi a numrului dat.

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

ct timp n%d=0 execut

s=s+1

n=n/d

dac s 0 atunci//daca d a fost factor vad daca are cea mai mare putere

dac s > p_max atunci

p_max=s;
//actualizez puterea maxima

f_max=d;
//pastrez factorul la putrea maxima

d=d+1

scrie Factorul care apare la puterea maxima in descompunerea in foactori


primi este , f_max

Program C++

Rezultat afiat pe ecran

#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();
}

5. Se citesc de la tastatur n numere naturale. Se cere s se


determine cel mai mare divizor comun dintre cele n numere.
Exemplu: dac n=4 i numerele citite sunt 12, 48, 96 i 192 atunci cel mai mare divizor comun
al lor este 12.
Pentru a determina acest lucru vom proceda astfel:
Citim iniial n ca s stim cte numere vom prelucra
Citim primele dou numere
Determinam cmmdc dintre primele doua numere citite
Pentru celelalte n-2 numelre procedm astfel
o Citim un numr
o Determinm cmmdc dintre numarul citit si cmmdc determinat anterior

Algoritmul n pseudocod este:


citete n // numr natural care precizeaz cte numere vom prelucra
//citete primele dou numere i determin cmmdc dintre ele
citeste a,b
ct timp a b execut //dac numerele sunt diferite atunci pn cnd ajung

//egale din cel mai mare numar il scad pe cel mai mic

dac a > b atunci

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

scrie cmmdc-ul numerelor citite este , a

Rezultat afiat pe ecran

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

9. Se citesc dou numere naturale a i b. Se cere s se determine


dac sunt numere prime ntre ele.
Exemplu: Dac a= 84 i b=180, nu sunt numere prime ntre ele, cmmdc(84,180)=12 iar dac
a=85 i b=87, sunt prime ntre ele.
10. Se citete de la tastatur un numr natural n, S se
determine cel mai mic numr natural are are
are exact n
divizori.
Exemplu: dac n=4 atunci se va afia 6 care are 4 divizori 1, 2, 3, 6.
11. Un numr natural este perfect dac el este egal cu suma
divizorilor si mai mici dect el. Scriei un program care
verific dac un numr este perfect sau nu.
Exemplu: daca n este 6 atunci el este numar perfect 6=1+2+3, daca n este 8 atunci el nu este
numr perfect 1+2+4=7.
12. Se citete un numr natural n (n<=1000). Se cere s se
afieze mulimea numerelor naturale care sunt prime cu n.
Exemplu: dac n=20 atunci mulimea numerelor prime cu 20 este {3, 7, 9, 11, 13, 17, 19}

13. Se citete un numr natural n (n<=1000). Se cere s se


afieze mulimea divizorilor si i numrul de divizori
proprii.
Exemplu: dac n=12 atunci mulimea divizorilor este {1, 2, 3, 4, 6, 12} i el are 4 divizori
proprii.
14.

Se

citesc

dou

numere

naturale

i b, care reprezint
a
numrtorul i numitorul unei fracii
. Scriei un program
b
care are drept scop aducerea la forma ireductibil a fraciei
date.
1
Exemplu: dac a=10 i b=100. cmmdc(10,100)= 10 rezult fracia
.
10
15. Se citesc n numere naturale de la tastatur. S se
determine cu cte zerouri se sfrete produsul acestora, fr
a efectua produsul lor.
Exemplu: dac n=5 i numerele citite sunt n ordine 23, 48, 15, 25, 34 atunci produsul lor se
termin n 3 zerouri.
16. Dou numere ntregi x i y sunt prietene, dac i numai
dac suma divizorilor numrului x este egal cu suma
divizorilor numrului y. Scriei un program care afieaz
toate numerele prietene din intervalul [a,b].
Exemplu: dac a=10 i b=25 numerele prietene sunt (10, 17), (14, 15), (14,23), (15, 23), (16,25).
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.
18. Se citesc de la tastatur dou numere naturale notate n i
k. Se cere s se afieze toate numerele mai mic sau egale cu n
care au exact k divizori.
Exemplu: dac n=10 i k=2 se vor afisa 2, 3, 5, 7.
19. Se citesc de la tastatur n numere naturale. Se cere s se
determine cte dintre numere citite sunt numere prime i s se
calculeze suma numerlor care nu sunt prime.
Exemplu: dac n=7 i se vor citi numerele 2, 4, 5, 6, 11, 15 atunci se va afia pe ecran mesajul
sunt 3 numere prime, iar suma numerelor care nu sunt prime este 25.
20. Se consider trei numere naturale n,a i b (a b n). S se
creeze un program care permite afiarea factorilor primi ce
aparin intervalului [a, b] i a puterilor la care acetia
apar n descompunerea lui n.
Exemplu: dac n=36 a=1 i b=10 se vor afisa: 2 2 i 32

Conversii ntre baze de numeraie


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

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 .
Conversia din baza 10 n baza b
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
Observaie:
0
6
2
0
3
2
pe fond galben sunt notate
cturile obinute la fiecare
1
1
2
mprire la baz
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 10 0=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
// calculez ctul mpririi numrului la baz

scrie m
// valoarea numrului n baza b

Aceast variant de algoritm este una didactic i se utilizeaz pentru conversii de


numere naturale relativ mici, valoarea variabilei p crete exponenial i nu poate depi 10 cifre.
Pentru numere mai mari se vor utiliza ali algoritmi i alte tipuri de date pe care vei studia mai
trziu.

Conversia din baza 10 n baza b


De exemplu dac baza de numeraie este 2 i valoarea numrului n=(110011) 2 atunci
transformarea lui n baza 10 se face astfel:
(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:
//conversia unui numr n scris baza b, n baza 10
citete n,b
// n numrul de transformat, b baza n care este scris n
p=1
// b0=1
m=0
// va contine numarul n baza 10
ct timp n0 execut

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

scrie Da, are numr egal de cifre de 0 i 1!


altfel

scrie Nu, numarul de cifre de 0 i 1 este diferit

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();
}

Rezultat afiat pe ecran

sau:

2. Se citete un numr natural n scris n baza b1. Seciei un


program care s transforme numrul n baza b2 (b1, b2 numere
naturale din [2,10]) .
Exemplu: dac n=2301, b1= 4, iar b2= 9 atunci rezultatul va fi: (216)9 adic:
(2301)4=(177)10=(216)9
Algoritmul n pseudocod este:
citete n,b1,b2
// transformm numrul n din baza b1 n baza 10
p=1
m=0 // contine rezultatul conversiei lui n din baza b1 n baza 10
ct timp n0 execut
r = n%10
m = m+r*p
p = p*b1
n = n/10

// transformm numrul m din baza 10 n baza b2


p=1
n=0 // contine rezultatul conversiei lui m din baza 10 n baza b2
ct timp m0 execut
r = n%b2
m = m+r*p
p = p*10
n = n/b2

scrie n // afiez rezultatul

Program C++

Rezultat afiat pe ecran

#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.
3. Se d un numr natural n (n125) citit de la tastatur. S se
afieze toate numerele mai mici dect n, care n baza doi
conin patru cifre de unu. S se precizeze la sfrit cte
numere au ndeplinit condiia cerut.
Exemplu: dac n=35 se vor afia numerele: 15, 23, 27, 29, 30 sunt 5 numere care ndeplinesc
condiia cerut
4. Se citesc dou numere naturale n 1 scris n baza b 1 i n2 scris
n baza b2,unde b1,b2<10. S se determine care numr este mai
mare.

Exemplu: (245)6<(131)9
5. Se citete un numr natural n i o baz b. S se verifice dac
numrul poate fi scris n baza b.
Exemplu: dac n=216 i b=9 atunci rezultatul este Da, iar dac n=216 i b=5 atunci rezultatul
este Nu
6. Se citete un numr natural scris n baza 2, deci format numai
din cifre de 0 i 1 (n11111). S se afieze valoarea lui n
toate bazele b [3,10].
Exemplu: (1111)2=(120)3=(33)4=(30)5=(23)6=(21)7=(17)8=(16)9=(15)10
7. Se citete de la tastaur un numr natural n i o baz b. S
se verifice dac numrul n poate fi scris n baza b, iar n
caz afirmativ realizai conversia numrului n din baza b n
baza 10.
Exemplu: dac n=5411 i b=8 atunci se observ c cea mai mare cifr din n este 5, ndeplineste
condiia 5b, deci poate fi scris n baza b. prin calcul se obine apoi valoarea (2825)10. Dac
n=5411 i b=3 atunci numrul n nu poate fi scris n baza b.
8. Se citete un numr natural n, scris n baza 10. S se
precizeze n ce baze b (b10) numrul n nu conine cifra 0.
Exemplu: dac n=15 atunci bazele n care n nu conine cifra 0 sunt [2,10]-{3}. Vezi exemplu de
la problema 6.
9. Se citesc dou numere naturale n scris n baza b1 i m scris
n baza b2 (b1,b2 [2,9] ). Scriei un program care determin
dac cele dou numere au aceiai valoare n baza 10.
Exemplu: dac n=30, b1=5, m=120, b2=3 n baza 10 ele reprezint aceiai valoare i anume 15.