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 calc ulatorului 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
(Ce se d)

Date de iesire Program C++


(scris pe baza unui algoritm de rezolvare)

(Ce se cere)

Definiie 3: Descrierea unui algoritm de rezolvare a unei probleme sau a unei situaii date ntr -un limbaj de programare se numeste program sau cod surs. Cele mai importante proprieti ale unui algoritm sunt urmtoarele: 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, folosi nd 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 i eire, 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 valoar ea 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 ramifica tii 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 ntr un 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 ncep nd 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, independen t 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, c t 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:
Marcheaz nceputul / sfritul unui algoritm reprezentat n schem logic

START

STOP

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 preciz eaz 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 funcion rii 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 prelucrea z 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 rm n 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 cara cterul 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-ntr eg 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 A B A

K1 0 B

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 c t va reprezenta cea mai semnificativ cifr a numrului n baza data. Tabelul urmtor prezinta pa ii 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 ntr egul 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), invers m 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 2

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.

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 r spuns 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 numru lui 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 int ervalul [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 est e 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 urmt oarele 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: repr ezint 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 u tilizat 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 func ii 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 opri m 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 limbajulu i 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 parante ze 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 scri e 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 5

Unde: 1. bara de titlu n care este trecut mediul de programare Borland C++ for DOS 2. butoane pentru minimzare/ maximizare i inchidere aplicaie 3. bara de meniu a mediului de programare care conine opiunile: File, Edit, Search, Compile, D ebug, Project, Options, Windows, H elp 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 num ele 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 char unsigned char int unsigned int long unsigned long float double real long double void Nr. octei ocupai 1 octet cu semn 1 octet fara semn 2 octeti cu semn 2 octeti far semn 4 octei cu semn 4 octei fara semn Domeniu de valori Mod de reprezentare n memorie

ntreg

-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) Operatori logici la nivel de bit:

1, daca a i b sunt numere consecutive 0, altfel

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 e fect 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 ope ratorul 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 du p 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 introdu cerea 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.
datele de ieire curg din interior(memoria calculatorului) spre exterior(ecran)

Stream (flux) de ieire

Memoria calculatorului

n fiierul antet iostream.h este definit acest stream de ieire a datelor de la tastatur, denumit cout (console output). Atunci cnd dorim s afim datelele le vom extrage din fluxul de ieire, folosind operatorul de ieire <<. Din acest punct de vedere forma general a operaiei de afiare este: cout<<expresie; Ca efect, se evaluez expresia, iar valoarea ei este convertit ntr -o succesiune de caractere care vor fi afiate fie pe ecran fie in fisier. i operatorul de ieire poate fi utilizat nlnuit atunci cand dorim sa afim mai multe date pe ecran: cout<<expresie_1<<expresie_2<<expresie_3<<<<expresie_n; Pentru ca afiarea unor date s se realizeze de la inceputul randului urmtor se va folosi manipulatorul numit endl (end line). De exemplu: 1.Se citesc de la tastatur dou numere ntregi a i b. Scriei un program care calculeaz i afieaz pe ecran suma lor. Algoritm Program C++ Rezultat afiat
#include<iostream.h> void main() { int a,b; cout<<"a="; cin>>a; cout<<"b="; cin>>b; cout<<"Suma "; cout<<<<a<<"+"<<b<<"="<<a+b; }

citeste a,b (numere ntregi) scrie 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++
#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); }

citeste a scrie abs(a)

Rezultat afiat 3. Scriei un program care s afiseze pe ecran:


* ** *** **** *****

Algoritm

Program C++
#include<iostream.h> #include<conio.h> void main() { clrscr(); cout<<"*"<<endl; cout<<"**"<<endl; cout<<"***"<<endl; cout<<"****"<<endl; cout<<"*****"<<endl; getch(); }

Rezultat afiat

scrie scrie scrie scrie scrie

* ** *** **** *****

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

citeste a separa ultima cifra separa cifra zecilor separa cifra sutelor scrie ultima cifra scrie cifra zecilor scrie cifra sutelor

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

citeste L citeste l calculeaza perimetrul calculeaza aria scrie perimetrul scrie aria

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;

A
b. Starea final

c. continutul paharului C se toarn in paharul B

b=c;

Algoritm

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

citeste A citeste B scrie A,B (initial) C=A A=B B=C scrie A,B(final)

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 Program C++
#include<iostream.h> #include<conio.h> void main() { clrscr(); int A,B; cout<<"A=";cin>>A; cout<<"B=";cin>>B; cout<<"Initial: A="<<A<<" si B="<<B<<endl; A=A+B; B=A-B; A=A-B; cout<<"Final: A="<<A<<" si B="<<B<<endl; getch(); }

citeste A citeste B scrie A,B (initial) A=A+B; B=A-B; A=A-B; scrie A,B(final)

Rezul tat 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 Program C++
#include<iostream.h> #include<conio.h> void main() { clrscr(); int A,B; cout<<"A=";cin>>A; cout<<"B=";cin>>B; cout<<"Initial: A="<<A<<" si B="<<B<<endl; A=A*B; B=A/B; A=A/B; cout<<"Final: A="<<A<<" si B="<<B<<endl; getch(); }

citeste A citeste B scrie A,B (initial) A=A+B; B=A-B; A=A-B; scrie A,B(final)

Rezultat afiat

Probleme rezolvate 1. Se citesc de la tastatur dou numere ntregi. Scriei un program care s determine care este cel mai mare numr. Relaiile matematice care determin maximul i minimul dintre cele dou numere sunt: (a b a b ) (a b a b ) max( a, b) min( a, b) 2 2 Tinnd cont de aceste informaii putem scrie urmtorul program: Algoritm Program C++
#include<iostream.h> #include<conio.h> #include<math.h> void main() { clrscr(); int a,b; cout<<"a=";cin>>a; cout<<"=";cin>>b; cout<<"Valoarea maxima este:"<<(a+b+abs(a-b))/2; getch(); }

citeste a citeste b scrie max(a,b)

Rezultat afiat sau

2. Se citesc dou numere ntregi a i b. Scriei un program care afieaz media aritmetic a numerelor date. Relaia matematic de calcul a mediei aritmetice dintre doua numere a i b este: a b , ma 2 Asa cum tim operatorul / aplicat intre doua numere intregi conduce la obinerea unui rezultat intreg care reprezint ctul mpririi dintre cele dou numere. Cum nu ntotdeauna suma celor dou numere este un numr par, atunci rezultatul asteptat este un numr real. Programul care realizeaz acest lucru este: Algoritm Program C++
#include<iostream.h> #include<conio.h> void main() { clrscr(); int a,b; cout<<"a=";cin>>a; cout<<"b=";cin>>b; cout<<"ma"<<(float)(a+b)/2<<endl; getch(); }

citeste a citeste b scrie ma


a b 2

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

citeste a scrie

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

Citeste b citeste h scrie

b h 2

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

0
xb

x
ya

Toate variabilele folosite n program vor fi de tip real.

A
(-1, -1.5)

Algoritm

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

citeste xa,xb

citeste ya,yb scrie

xa

xb

ya

yb

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 pr ogram 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 cifr elor 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?
#include<iostream.h> #include<conio.h> void main() {clrscr(); int a,b; cout<<"a=";cin>>a; b=(a>=0) ? 1:-1; cout<<b; getch(); }

************** * * * * * C++ * * * * * **************

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 unu l 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 alternati v 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 tr ei 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 Da

B2

B1

dac c atunci B1 altfel B2

if(expresie logica) instructiune1; else instructiune2;

Pot exista i cazuri particulare de utilizare a acestei structuri, a tunci 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

dac c atunci B1

if(expresie logica) instructiune1;

B1

Cazul 2. Daca lipseste B1 atunci structura se reprezinta astfel: Schema logic Pseudocod
Nu Da

Instructiune C++ if(!expresie logica) instructiune2;

!C

dac not c atunci B2

B2

De exemplu dac valoarea variabilei x este 100 putem utiliza instructiunea if astfel:
1 2 1 2 3 4 1 2 3 4 5 6 if( x= =100) cout<< valoare a lui x este 100; if( x= =100) { cout<< valoare a lui x; cout<<x; }; if( x= =100) { cout<< valoare a lui x; cout<<x; }; else cout<<valoarea lui x nu este 100

Dac dorim s executm mai mult de o instruciune acestea trebuie grupate intre { , } astfel:

Daca apar si intruciuni care trebuie executate atunci cnd conditia este fals putem scrie asa:

Pot exista i situaii n care structurile alternative sunt in cluse unele in altele. In acest caz spunem ca instruciunilie if sunt imbricate. Exista o regula de asociere a cuvntului else de if : n situatia instructiunilor if imbricate, si atunci cand pentru gruparea instruciunilor nu se folosesc acolade cuvantul else se asociaz primului cuvant if aflat la stanga lui.(asemanator cu asocierea inchiderii corecte a grupurilor de paranteze din matematica). n exemplul urmator este sugerat cum sunt imbricate 3 instructiuni if. Pentru a le putea identifica usor ele sunt scrise cu aceiasi culoare (negru, albastru si portocaliu). if(c1) if(c2) se executa cand c2 adevarata if(c3) instructiunea1; else instructiunea2; se executa cand c1 adevarata else instructiunea 3 else instructiunea 4; Daca n aceasta schem grupm instruciunile cu acolade se poate schimba fundamental structura programului: if(c1) if(c2) se executa cand c2 adevarata { if(c3) instructiunea1; } else instructiunea2; se executa cand c1 adevarata else instructiunea 3

Se observ ca primul cuvant else este asociat cu cel de-al doilea if, acest lucru fiind determinat de gruparea intre acolade a instructiunii if (c3), reprezentate pe desen cu portocaliu.

Aplicaii rezolvate
1. Se citesc dou numere ntregi a i b. S se determine valoarea maxim dintre ele. Se citesc valorile celor doua numere si valoare cea mai mare dintre ele va fi memorata n variabila max. La sfarsit valoarea variabilei max va fi afisata pe ecran Algoritm Program C++
#include<iostream.h> #include<conio.h> void main() {clrscr(); 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(); }

intregi a,b citeste a citeste b daca a>b atunci | max=a |altfel | max=b |_ scrie max

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

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

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

Rezultat afiat Dar, acest mod de determinare a valorii maxime este greu de aplicat atunci cnd num rul variabilelor crete la mai mult de trei. Pentru a obine un algoritm simplu de aplicat pentru determinarea valorii maxime dintre oricate variabile se va proceda astfel: Pas 1 : Compar prima dat valoarea variabilei a cu valoarea variabilei b, i dac valoarea lui a este mai mare dect valoarea lui b interschimb valorile celor dou variabile, obinnd n acest fel valoarea maxim dintre primele dou variabile n variabila b. Pas 2: Compar de aceasta data valoarea variabilei b cu valoarea variabilei c, i dac valoarea variabilei b este mai mare decat valoare lui c interschimb valorile celor dou variabile, obinnd astfel valoarea maxim dintre cele trei variabile n variabila c. Pas 3: afiez valoarea variabilei c ca fiind valoarea maxima dintre a,b si c. Algoritm Program C++
#include<iostream.h> #include<conio.h> void main() {clrscr(); 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(); }

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

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

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

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

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

| |_

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

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

real f,x citeste x daca x<-1 atunci | f x*x |altfel | f 1/x |_ scrie f

4. Care dintre urmtoarele instruciuni C++ sunt corecte sintactic dac 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 c are 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 v stele a doi copii. Afiai care copil este mai mare i diferena de v st 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

while (expresie logic) instruciune; sau:

BI

Da

BI

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 BI ct timp C(adev) Instructiune C++ do instruciune; while (expresie logic) ; sau: do { instruciune1; instruciune2; ...................... instruciunen; } while (expresie logic) ;

Nu

C
Da

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 deosebir e 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


(structur repetitiv cu test iniial)

DO-WHILE
(structur repetitiv cu test final)

Instruciunea for poate fi nlocuit ntotdeauna de una dintre structurile repetitive while sau do-while, dar nu ntotdeauna o structur while sau do -while poate fi nlocuit cu o instruciune for. Atunci cnd realizai o conversie din instruciunea while n do -while trebuie sa avei grij ca secvena de cod obinut dup conversie sa fie echivalent cu secvena iniial (s se obin acelai rezultat). De exemplu: Fie urmtoarea secven de algoritm:
s=0; pentru i=1, 10, +1 | s=s+i |_ scrie s // 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 urmt orul 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
citete n s=0 pentru i=1,n,+1 | s=s+i; |_ scrie s

while
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 valoril e variabilelor ntr-un tabel cu urmtoarea structur: Linia executata 1 2 4 5 4 5 8 n 8291 8291 8291 82 82 0 r 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
#include<iostream.h> #include<conio.h> int i; void main() {clrscr(); while(i<=3) {i++; cout<<i<<" "; } cout<<i; getch(); }

Afieaz:1 2 3 4 4 4 ori
#include<iostream.h> #include<conio.h> int i; void main() {clrscr(); do {i++; cout<<i<<" "; }while(i<=3); cout<<i; getch(); }

Afieaz: 0 1 2 3 4 4 ori
#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?
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

dac C1 atunci | dac C2 atunci | | B1 | |altfel | | B2 | | ct timp C3 execut | | B3 | | dac C4 atunci | | | B4 | | |

3. Care este rezultatul afiat dup execuia urmtoru lui 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 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(); }

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

Pe ecran se va afia: a. A B C D E F c. a f a f a 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(); }

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

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 prog ram 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=1;i<=n;i++) { for(int j=1;j<=n;j++) cout<<*; cout<<endl; } for(int i=10;i>= -2;i--) cout<<i=<<i<<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++; }; int i=1; do{ int j=1; do{ cout<<*; j++; }while(j<=n); cout<<endl; i++; }while(i<=n); char ch=a; while (ch<=z) {cout<<ch<< ; ch++; }; 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 a stfel nct s se afieze pe ecran # # # # # # ? a. 2 c.3 19. Fie urmtoarea secven de algoritm:
citete a,b pentru i=a,b,+1 | dac i%2 == 0 atunci | | scrie i, |

b.4 d.1

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 scri s 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 scri s 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 algoritmu lui 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 probleme lor 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 s e 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 num rului n n = n/10 elimin din numrul 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; s=s+c; n=n/10; } cout<<"suma cifrelor este "<<s; getch(); }

Rezultat afiat pe ecran

2. Se d un numr natural n. S se precizeze din cte cif re 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++
#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(); }

Rezultat afiat pe ecran

3. Se d un numr natural n. Se cifrelor pare din numarul dat. Algoritmul este:

cere

se

calculeze

suma

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

Rezultat afiat pe ecran

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

Rezultat afiat pe ecran

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

Rezultat afiat pe ecran

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 impar e 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 toa te 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 poat e 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 pr imi 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 4 20=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 co mun 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 diviz or 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 Algoritmu lui 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++
#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(); }

Rezultat afiat pe ecran

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

Rezultat afiat pe ecran

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

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

Rezultat afiat pe ecran

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. 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 e cran 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 Se citesc dou numere naturale a

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: 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 =
i n 1

xi b i ,
m

unde x i [0,b -1]. Exemplu: dac b=10 atunci numrul 123,45=1*10 2+2*101+3*100+4*10-1+5*10-2 . 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 c tul 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 conve rsii 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 t ransformat 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++
#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(); }

Rezultat afiat pe ecran

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 s cris 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 num rul 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.

S-ar putea să vă placă și