Documente Academic
Documente Profesional
Documente Cultură
Carte Program Are C
Carte Program Are C
PROGRAMAREA CALCULATOARELOR
Florentina MOCRIENCO
2006
Daniela VLDOIU
TEHNOLOGIA INFORMAIEI
Programarea calculatoarelor
Florentina MOCRIENCO
2006
Dana VLDOIU
2006
ISBN 10 973-0-04555-0;
ISBN 13 978-973-0-04555-0.
Cuprins
CUPRINS
Unitatea de nvare Nr. 1 ................................................................................................. 1
DEFINIREA NOIUNILOR DE ALGORITM, PROGRAM I LIMBAJ DE PROGRAMARE
Obiectivele Unitii de nvare 1 ..................................................................................... 1
1.1 Noiunea de algoritm ................................................................................................... 1
1.2 Propietile algoritmilor .............................................................................................. 4
1.3 Programe i limbaje de programare........................................................................... 8
1.3.1 Evoluia limbajelor de programare ................................................................ 9
1.3.2 Etapele realizrii programelor ...................................................................... 16
Rspunsurile corecte la testele de autoevaluare.......................................................... 20
Bibliografie....................................................................................................................... 20
Lucrarea de verificare Nr. 1, notat de tutore ............................................................... 21
Unitatea de nvare Nr. 2 ............................................................................................... 22
PRINCIPIILE PROGRAMRII STRUCTURATE
Obiectivele Unitii de nvare 2 ................................................................................... 22
2.1 Reprezentarea algoritmilor ....................................................................................... 22
2.2 Elemente de programare structurat ....................................................................... 26
2.3 Structuri de control utilizate n programarea structurat ...................................... 29
2.3.1 Secvena sau structura liniar...................................................................... 29
2.3.2 Decizia sau structura alternativ .................................................................. 32
2.3.3 Ciclul sau structura repetitiv ....................................................................... 36
Rspunsuri corecte la testele de autoevaluare............................................................. 42
Bibliografie....................................................................................................................... 42
Lucrarea de verificare Nr. 2, notat de tutore ............................................................... 43
Unitatea de nvare Nr. 3 ............................................................................................... 44
STRUCTURA PROGRAMELOR N LIMBAJUL C. TIPURI DE DATE, OPERATORI I
EXPRESII
Obiectivele Unitii de nvare 3 ................................................................................... 44
3.1 Privire de ansamblu asupra limbajului C................................................................. 44
3.2 Structura programelor n limbajul C ........................................................................ 46
3.3 Variabile, tipuri de variabile i declarare ................................................................. 51
3.4 Constante ................................................................................................................... 54
3.5 Funcii aritmetice care opereaz cu valori de tip real i ntreg.............................. 57
3.6 Operatori n C............................................................................................................. 60
3.6.1 Operatorul de atribuire ................................................................................. 60
3.6.2 Operatori aritmetici....................................................................................... 61
3.6.3 Operatori relaionali i logici ......................................................................... 65
3.6.4 Operatori de atribuire compus.................................................................... 67
3.6.5 Operatorul de conversie explicit (cast) ....................................................... 68
3.6.6 Operatorul sizeof.......................................................................................... 68
3.6.7 Operatorul virgul (,) .................................................................................. 69
Proiectul pentru nvmntul Rural
Cuprins
ii
Cuprins
iii
Introducere
INTRODUCERE
Manualul de Programarea calculatoarelor este structurat astfel nct s
ofere cursanilor cunotinele necesare pentru a fi capabili s neleag i
s foloseasc un limbaj de programare n scopul rezolvrii unor probleme
cu ajutorul calculatorului. n elaborarea acestuia s-a urmrit abordarea ct
mai complet i mai adecvat a tematicii cuprinse n programele colare
ale disciplinelor de profil din nvmntul preuniversitar pentru a oferi
cursanilor posibilitatea de a preda aceste discipline la orice nivel.
Noiunile sunt prezentate gradat, punndu-se accent pe nelegerea i
aplicarea acestora n practic. Se recomand ca n procesul de predare nvare, activitatea s fie orientat pe probleme: analiza unor situaii
practice (generale sau specifice unui anumit domeniu), identificarea
fluxului informaional, elaborarea unui model algoritmic de rezolvare,
implementarea i testarea rezolvrii cu ajutorul limbajului de programare C
i C++. Datorit caracterului pregnant aplicativ al disciplinei, se
recomand desfurarea orelor ntr-o sal dotat cu un numr suficient de
sisteme de calcul, astfel nct pe un sistem de calcul s lucreze cel mult
doi cursani.
Evaluarea activitii cursanilor se va face att pe baza activitii practice
desfurate n timpul semestrului (sarcini de lucru, rezolvarea de
probleme n laborator i teme de cas), ct i prin susinerea unui examen
final.
Bibliografia de baz va cuprinde manuale, culegeri de probleme,
programe de specialitate elaborate de ctre Ministerul Educaiei i
Cercetrii pentru nvmntul preuniversitar, resurse WWW.
Obiectivele modulului
Dup studiul modulului Programarea calculatoarelor, vei reui s:
iv
Introducere
Stabilirea
unitilor de
nvare
TABLOURI
FUNCII
Construirea
competenelor
Construirea
coninuturilor
Introducere
Tem de reflecie
Identificai cu ajutorul cuprinsului unitile de nvare ale modulului, apoi
citii titlurile i obiectivele fiecrei uniti.
Folosete
spaiul alb
pentru
notie!
Spaiu
pentru
rspuns
vi
Introducere
Sarcin de lucru
Enumer minim 3 uniti de nvare cuprinse n acest curs.
Folosete spaiul liber de mai jos pentru rspuns.
vii
Introducere
Cum se face
evaluarea?
Atenie!
Notele obinute prin transformarea punctajelor n note de la 1 la 10, n
urma corectrii acestor lucrri de verificare, reprezint o parte important
a evalurii continue.
Tem de reflecie
Identificai cel puin trei lucrri de verificare - notate de tutore, pe care va
trebui s le rezolvai. Folosii spaiul liber de mai jos, pentru a nota
paginile la care se gsesc aceste lucrri.
Introducere
Atenie!
Pstreaz legtura cu tutorele pentru a obine alte indicaii sau precizri.
Mult succes!
ix
Cuprins
Pagina
1
1
4
8
9
16
20
20
21
1.1
Noiunea de algoritm
Algoritmul este o noiune matematic foarte veche. Cuvntul algoritm
este de origine arab. El deriv din numele matematicianului Abu Jafar
Mohammed bn Ms al Horezmi care a scris o carte celebr intitulat
Kitab al jabr wal - muquabala. Din titlul acestei cri provine cuvntul
algebr.
Termenul algorism era folosit n evul mediu cu nelesul de proces al
efecturii operaiilor aritmetice cu ajutorul cifrelor arabe. Se presupune c
din asocierea cuvntului algorism cu domeniul lui de referin, aritmetica,
a rezultat termenul algoritm. ncepnd cu anul 1950, n toate manualele
de specialitate, cuvntul algoritm era frecvent asociat cu procesul de
aflare a celui mai mare divizor comun a dou numere naturale, aa
Exemplul 1.1
a. Algoritmul mpririi ntregi a dou numere naturale
Se tie c mprirea ntreag a dou numere const din efectuarea unor
scderi succesive, pn cnd desczutul devine mai mic dect scztorul.
Pentru fiecare scdere care se efectueaz, desczutul este rezultatul
scderii precedente, iar scztorul este mpritorul. Rezultatul ultimei
scderi efectuate este tocmai restul mpririi celor dou numere, iar
numrul de scderi efectuate reprezint ctul mpririi.
Paii acestui algoritm sunt constituii de operaiile de scdere i de
operaiile de comparare a desczutului cu scztorul. Este evident c irul
acestor operaii este finit, deoarece desczutul se micoreaz cu fiecare
nou scdere, n timp ce scztorul rmne neschimbat.
Fie, de exemplu, numerele 23 i 7. Paii algoritmului care duc la aflarea
ctului i restului mpririi sunt prezentai n tabelul 1.1.
Operaia
scdere
comparare
scdere
comparare
scdere
comparare
Pasul
23-7 = 16
16<7 nu
16-7 = 9
9<7 nu
9-7 = 2
2<7 da
(desczutul este mai mic dect scztorul)
Numrul scderii
1
2
3
-
Tabelul 1.1
Numrul de scderi efectuate este 3, iar rezultatul ultimei scderi
efectuate este 2, deci ctul mpririi numrului 23 prin 7 este 3, iar restul
este 2.
Operaia
mprire
verificare
mprire
verificare
mprire
verificare
mprire
verificare
Tabelul 1.2
Algoritmul se ncheie n momentul obinerii restului zero: rezultatul n acest
caz este 6.
naturale, mai puin zero (N* x N*). Aceast propietate este cunoscut i
sub numele de universalitate.
3.
Exemplul 1.2
S considerm o problem banal, din coala primar:
Un dreptunghi are baza de 2,75 i nlimea de 1,4 uniti. Care sunt aria
i perimetrul dreptunghiului?
Enunul de mai sus furnizeaz persoanei care rezolv problema
urmtoarele informaii:
o
o
o
o
3. Dac b<=0
atunci Scrie "datele de intrare sunt greite"; Stop;
4. Calculeaz A= b*i;
5. Calculeaz d=b+i;
6. Calculeaz p=d*2;
7. Scrie "aria dreptunghiului este " A;
8. Scrie "perimetrul dreptunghiului este " p;
9. Stop.
Este evident c citirea se face de pe suportul de intrare i c datele citite
se nregistreaz n memorie. Prin simbolul '<=' s-a notat operaia de
comparaie "mai mic sau egal". Prin simbolul '=' s-a notat operaia de
atribuire, prin care variabilei din partea stnga i se atribuie (i se d)
valoarea din partea dreapta, iar prin simbolul '*' s-a notat operaia de
nmulire.
O observaie important este c algoritmul prezentat aici poate fi folosit
oricnd este necesar s se calculeze aria i perimetrul unui dreptunghi,
avnd ca date de intrare baza dreptunghiului i nlimea acestuia. Setul
de date de intrare este constituit, n acest caz, din dou numere reale
pozitive. Caracterul universal al algoritmului const n faptul c el poate fi
aplicat oricrui astfel de set de date.
1.3
cuvinte (rezervate);
punctuaie;
propoziii i fraze;
10
recursivitate;
11
Limbajul C
Acest limbaj de programare, cu cel mai scurt nume, a fost creat n 1971 de
ctre Dennis Ritchie i Brian Kernigham pentru dezvoltarea sistemului de
operare UNIX.
Principalele caracteristici ale limbajului sunt:
limbaj structurat de nivel nalt;
posed concepte de nivel sczut, ceea ce permite exploatarea
portabil a caracteristicilor intime unei maini;
rutine de conversie a datelor foarte evoluate;
tipuri de date definibile de ctre utilizator;
gestionarea elaborat a datelor de tip dinamic;
definirea de noi funcii;
adresri indirecte ale datelor, variabilelor (pointeri);
recursivitate;
set complet de funcii matematice;
funcii pentru realizarea de grafic elementar 2D;
funcii de apel servicii DOS;
posibilitatea definirii de overlay-uri pentru un program;
concizie deosebit a limbajului.
Pentru versiunile standard ale implementrilor limbajului C exist medii de
programare ce aparin firmelor: Microsoft produsul QUICK C i firmei
Borland produsele BORLAND C.
Limbajul ADA
A fost creat special pentru a gestiona totalitatea aplicaiilor dezvoltate i utilizate de N.A.S.A.
Noutatea limbajului (de tip structurat, algoritmic) o constitue concurena, deci posibilitatea lansrii
de procese paralele (sincronizate interactiv n finalul execuiei lor) . Saltul calitativ este evident i
deschide un nou domeniu n programare, dar nu pentru IBM-PC. Versiunile implementrilor
limbajului ADA pe IBM-PC nu posed tocmai acest parte de concuren, reducnd limbajul la un
simplu limbaj structurat de uz general. Deci, ADA este un limbaj ultramodern din punct de vedere
teoretic, dar ineficient din punct de vedere practic pentru IBM-PC-uri.
Limbaje orientate pe gestiunea bazelor de date
Necesitile actuale n practica utilizrii calculatoarelor se ndreapt cu precdere spre gestionarea
bazelor de date de mari dimensiuni. O explicaie a acestei orientri e dat de faptul c o baz de
date reprezint o informaie, iar cel ce deine informaii complete i rapide ntr-o anumit problem
este indiscutabil cu un pas naintea celorlali. Concurena din domeniul economic poate fi numit
pe bun dreptate o btlie informaional.
ntr-un sistem de gestionare a bazelor de date (S.G.B.D.) de tip clasic datele sunt gestionate prin
intermediul unei structuri, organizat ierarhic, la un nivel de organizare logic.
Tendina modern n exploatarea bazelor de date const n deplasarea interesului ctre bazele de
date relaionale. Diferena esenial const n definirea unui nivel logic suplimentar ntre datele
gestionate. Acestea nu mai sunt privite ca simple fie izolate ntre ele ci pot fi analizate pe baza
legturilor (relaiilor) ce exist ntre ele.
Spre deosebire de S.G.B.D. urile clasice, un mediu relaional presupune ca cerin minimal
posibilitatea manipulrii datelor prin intermediul conexiunilor logice stabilite. Pentru aceasta exist
12
definit (i impus ca standard unanim recunoscut) limbajul de interogare SQL (Structured Query
Language limbaj de cereri structurate).
S.G.B.D. uri clasice.
dBASE III
Cel mai rspndit sistem de gestiune a bazelor de date este dBASE, n diversele lui versiuni. El
poate fi considerat un BASIC al bazelor de date. La momentul apariiei a constituit o adevrat
revoluie n domeniul S.G.B.D.-urilor. Cele mai importante implementri ale sale sunt: dBASE III
Plus i dBASE IV.
COBOL
A fost creat n 1950 i reprezenta singura posibilitate de gestionare a unei baze de date.
Reprezint n primul rnd un limbaj de programare special conceput pentru informatica de
gestiune. Dac facem o comparaie, sugestiv, COBOL este echivalentul FORTRAN-ului pentru
sistemele de gestiune a bazelor de date (din punct de vedere istoric i al performanelor). Limbajul
este considerat greoi i inflexibil, iar pentru crearea unui program foarte simplu e nevoie de
scrierea unui adevrat eseu. Singurul avantaj real al COBOL-ului este portabilitatea sa ridicat.
FOXBASE
Sistemul dBASE a incintat firmele productoare de soft, datorit popularitii sale i pe de alt
parte a calitilor sczute ale implementrilor originale furnizate de firma Ashton-Tate. Au aprut
noi implementri ale limbajului care au ncercat s furnizeze unelte profesionale pe baza acestui
suport conceptual. Versiunile FOXBASE 2.10 i FOXBASE PRO se constitue n medii performante
att pentru programatori ct i pentru utilizatori.
S.G.B.D. uri relaionale
ORACLE
Se poate afirma fr teama de a grei c ORACLE reprezint cel mai performant S.G.B.D.
disponibil la momentul actual. Pe lng faptul c posed avantajele unui mediu de tip relaional,
ORACLE este gndit ca un sistem exhaustiv pentru rezolvarea problemelor de utilizare sau
programare.
Limbajul intern folosit este SQL Plus i este permis conectarea cu alte limbaje externe evoluate
(orientate ctre C) . Putem meniona:
limitri de lucru greu sau imposibil de atins (maxim 65535 caractere ntr-un
cmp, numr nelimitat de cmpuri, de nregistrri) ;
servicii i auxiliare;
13
14
15
Specificarea problemei
Codificarea algoritmului
17
18
3. n cadrul etapei de ............... sunt efectuate modificri ale programului, fie n scopul
corectrii unor erori identificate n cursul utilizrii sale, fie pentru implementarea unor
cerine noi.
19
pag 17
pag 17
pag 17
pag 17
pag 17
BIBLIOGRAFIE
1. Dorin Stoilescu, Manual de C/C++ - Cap.1 Introducere, Editura Radial, Galati, 1998.
2. Florin. Munteanu, Traian C. Ionescu, Daniela Saru, Gheorghe Musca, Sergiu
Mihai Dascalu, Programarea calculatoarelor - manual pentru liceele de informatic
Cap.2 Programe. Algoritmi. Elemente de programare structurat, Editura Didactic
i Pedagogic, Bucureti, 1995.
3. Valeriu Iorga si colectiv, Programare in C/C++. Culegere de probleme, Editura
Niculescu, Bucureti, 2003.
4. Programe de specialitate elaborate de ctre Ministerul Educaiei i Cercetrii pentru
nvmntul preuniversitar
20
21
Pagina
2.1
Reprezentarea algoritmilor
Limbajul natural nu permite o descriere suficient de riguroas a algoritmilor,
air, pe de alt pate, o dat ce complexitatea algoritmilor crete, crete i
complexitatea descrierilor n limbaj natural. De aceea, pentru reprezentarea
algoritmilor se folosesc diferite forme de reprezentare caracteristice, n fapt
limbajele specializate.
n general, notaia folosit pentru reprezentarea algoritmilor trebuie s
satisfac urmtoarele cerine:
1. S permit exprimarea ct mai natural a raionamentelor
umane, s fie uor de nvat i de folosit;
2. S reflecte caracteristicile limbajelor de programare de nivel
nalt pentru a uura codificarea algoritmilor.
22
limbajele pseudocod.
Principala calitate a acestora este posibilitatea de a evidenia cu claritate
fluxul controlului algoritmilor, adic succesiunile posibile ale aciunilor.
Astfel, schemele logice utilizeaz pentru aceasta sgei de legtur ntre
diversele forme geometrice care simbolizeaz diversele tipuri de aciuni, n
timp ce limbajele pseudocod folosesc cuvinte cheie, adic nite cuvinte
cu neles prestabilit ce identific operaia care se execut, i cteva reguli
simple de aliniere a textului scris.
n continuare sunt prezentate blocurile ce pot intra n componena unei
scheme logice.
Fig. 2.1
Fig. 2.2
Operaia de preluare a valorilor unor variabile din memoria intern i
afiarea lor pe ecranul calculatorului se numete operaie de scriere. De
aceea, aceast operaie se precizeaz n schemele logice prin cuvntul
SCRIE. n figura 2.2. apare o comand de scriere. Aceast comand cere
s se scrie valoarea variabilei x pe ecranul monitorului.
23
Fig. 2.3
Blocul de decizie are forma unui romb. n interiorul su se scrie o condiie
care determin ramificarea calculelor. Figura 1.4. conine un asemenea
bloc. Condiia din blocul de decizie se citete ca o propoziie interogativ.
Astfel, n cazul din figura 1.4. citim: Este y egal cu x ? Dac rspunsul la
aceast ntrebare este da, atunci se iese din blocul de decizie pe ramura
pe care este scris cuvntul DA. Dimpotriv, dac rspunsul la ntrebarea
de mai nainte este nu, atunci se iese din blocul de decizie pe ramura pe
care este scris cuvntul NU.
Fig. 2.4
Semnul = care apare n blocul de decizie are sens de comparaie. El nu se
va confunda cu semnul = din blocurile de calcul. Pentru scrierea condiiilor
se mai folosesc i celelalte semne de comparaie din matematic: <, , >,
i .
Blocul conector are form de cerc. El se folosete pentru a conecta diferite
secvene ale unei scheme logice.
24
Exemplul 2.1
n finalul acestei seciuni, prezentm o schem logic care conine toate
blocurile pe care le-am descris nainte. Este vorba de schema logic de
rezolvare a ecuaiei a.x+b=0 cu a i b numere reale. Evident, dac a=0 i
b=0, atunci ecuaia este satisfcut de orice x. Prin urmare, n acest caz
ecuaia are o infinitate de soluii. Dac a = 0 i b 0, atunci apare o
incompatibilitate. n fine, dac a 0, atunci ecuaia are o singur soluie:
x = -b/a, pentru orice b. Schema logic de rezolvare a problemei apare n
figura 2.5. Aa cum observm, blocurile schemei logice sunt conectate
ntre ele prin linii prevzute cu sgei. Aceste sgei indic ordinea de
parcurgere a blocurilor.
Fig. 2.5
Schema logic de rezolvare a ecuaiei a.x+b=0 conine o comand pentru
citirea datelor. Aceast comand cere s se citeasc valorile variabilelor a
i b. Pe baza acestei scheme putem alctui un program care s rezolve o
ecuaie de forma ax+b=0 pentru orice valori ale lui a i b.
n primul bloc de decizie din schema logic apare condiia a=0. Evident,
condiia a=0 poate fi adevrat sau fals. Dac condiia a=0 este
adevrat, atunci din blocul de decizie se iese pe ramura pe care este
scris cuvntul DA, iar dac condiia a=0 nu este adevrat, atunci din
blocul de decizie se iese pe ramura pe care este scris cuvntul NU.
Desigur, i condiia b=0 care apare n cellalt bloc de decizie al schemei
logice determin ramificarea calculelor ntr-un fel sau altul. n fine, s mai
observm c n blocul de calcul apare scris x = -b/a. Evident, x = -b/a nu
este o condiie. Acum se cere s se determine valoarea lui -b/a i s se
atribuie valoarea calculat lui x.
Schema logic pe care o analizm conine trei drumuri care pornesc de la
START i se ncheie la STOP. De aceea, pentru verificarea schemei
trebuie s considerm trei seturi de date care ne conduc pe drumurile
respective.
25
Facem nti verificarea schemei pentru a=2 i b=-8. Prin urmare, dorim s
rezolvm ecuaia 2x-8=0. Pe schema logic parcurgem paii urmtori:
START
CITESTE a, b
a=0 ?
x=-b/a
SCRIE x
STOP
a=2, b=-8
2=0 ?
NU
x=4
x=4
INCOMPATIBILITATE
26
Un program structurat este constituit din uniti funcionale bine conturate, ierarhizate conform
naturii intrinseci a problemei. Programarea structurat este o metod independent de limbajul
de programare, ea acionnd la nivelul stilului de lucru.
n ce const de fapt programarea structurat? Programarea structurat reprezint o maniere de
concepere a programelor potrivit unor reguli bine stabilite, utiliznd un anumit set, redus, de tipuri
de structuri de control.
O structur de control nseamn o combinaie de operaii utilizat n scrierea algoritmilor.
Scopul programrii structurate este elaborarea unor programe uor de scris, de depanat i de
modificat (actualizat) n caz de necesitate. Programele obinute sunt clare, ordonate, inteligibile,
fr salturi i reveniri. Programarea structurat permite ca programele s poat fi scrise n limbaj
pseudocod, limbaj independent de main, apropiat de cel natural, convertibil n orice limbaj de
programare.
Prin programarea n mod logic i clar a structurilor de control admise, programarea structurat
permite abordarea eficient a funciilor de orice grad de dificultate.
Programarea structurat are la baz o justificare matematic, furnizat de Boehm i Jacopini i
cunoscut ca teorema de structur care precizeaz c orice algoritm avnd o intrare i o ieire,
adic un singur punct de nceput i un singur punct de terminare a execuiei poate fi reprezentat ca
o combinaie de trei structuri de control:
1.
Secvena sau structura liniar succesiunea de dou sau mai multe operaii;
2.
Decizia sau structura alternativ alegerea unei operaii dintre dou alternative posibile;
3.
Ciclul sau structura repetitiv cu test iniial repetarea unei operaii atta timp ct o
anumit condiie este ndeplinit.
Programarea structurat admite i utilizarea altor structuri de control, cum sunt:
4.
Selecia permite o alegere ntre mai mult de dou alternative;
5.
Ciclul cu test final;
6.
Ciclul cu contor.
Ultimele dou structuri de control reprezint variante ale structurii referit n general ca structura
repetitiv.
27
28
A1
A2
An
Figura 2.5
Exemplul 2.2
Se citesc dou numere ntregi a i b. S se interschimbe coninutul celor
dou variabile i s se afieze noile lor valori.
La prima vedere am fi tentai s scriem secvena urmtoare:
intregi a,b
citete a, b
ab
ba
scrie a,b
Proiectul pentru nvmntul Rural
29
START
Citete a,b
aux=a
a=b
b=aux
Scrie a,b
STOP
Figura 2.6
30
2. Perimetrul unui ptrat este egal cu latura altui ptrat. tiind c suma perimetrelor este x,
s se calculeze ariile celor dou ptrate.
3. Fiind date trei numere ntregi a, b ,c, s se interschimbe valorile celor trei numere,
astfel:
b, c, d, a
d, a, b, c
5. S se calculeze aria unui triunghi, cunoscndu-se una din laturile sale i nlimea
corespunztoare.
31
True
Condiie
DA
True
False
DA
NU
Condiie
False
NU
Figura 2.7
n limbaj natural, pentru schema logic din partea stng, execuia poate fi
descris astfel:
se evalueaz condiia;
se evalueaz condiia;
Exemplul 2.3
Se citesc dou numere reale a i b. S se afieze cel mai mare dintre ele.
Rezolvarea acestei probleme este foarte simpl, i anume:
real a, b
32
citete a, b
dac a>b atunci
scrie a
altfel
scrie b
stop
Exemplul 2.4
Complicm puin problema. S se afieze valoarea maxim dintre trei
numere reale citite de la tastatur.
O posibilitate de rezolvare a problemei, reprezentat n pseudocod, este:
real a, b, c, max
citete a, b, c
dac a>b i a>c atunci
max=a
altfel
dac b>c atunci
max=b
altfel
max=c
scrie max
stop
Se observ folosirea a dou structuri alternative pentru rezolvarea
problemei, a doua dintre ele fiind inclus ntr-una din ramurile de decizie
ale structurii, i anume pe cea corespunztoare neverificrii condiiei
testate. Se folosesc trei variabile reale corespunztoare celor trei numere
citite (a, b i c) i o variabil pentru pstrarea valorii maxime, tot real,
max. Dac a este mai mare dect celelalte dou numere b i c, atunci
valoarea maxim va fi a, altfel ea trebuie cutat ntre celelalte dou
valori; dac b este mai mare dect c, atunci b este maxim, altfel maximul
va fi c.
Exemplul 2.5
S se realizeze schema logic pentru evaluarea expresiei:
A2 B,c < 0
E= A 2 B , c = 0
1 B,c > 0
A 2
Schema logic a acestei probleme se afl la capitolul de Anexe,
Laboratorul 1.
33
Exemplul 2.6
Un exemplu de problem la care se folosete cea de-a doua variant a
schemei logice pentru structura alternativ este: S se determine valoarea
absolut a numrului real x, citit de la tastatur.
Rezolvare:
real x
citete x
dac x<0 atunci
x=-x
scrie x
cx + dy = q
S se scrie algoritmul de rezolvare a sistemului de ecuaii.
2. S se scrie algoritmul de rezolvare a urmtoarei probleme: acum este ora h1, minutul
m1 i secunda s1. Ct va fi ceasul peste h2 ore, m2 minute i s2 secunde? Rezultatul va
fi reprezentat tot n ore, minute i secunde.
34
E ( x ) = x 3 2 x + 7 daca a b < 0
x 2 5 daca a b = 0
35
se evalueaz condiia;
Condiie
NU
DA
True
Figura 2.8
Observaie Figura 2.8 Atunci cnd condiia este fals de la nceput,
secvena A nu se execut niciodat; n acest caz numrul de iteraii este
zero (adic de cte ori a fost executat secvena A).
Exemplul 2.7
S se calculeze xn, unde x este un numr real, iar n un numr natural.
real x, putere
ntreg n, i
citete x, n
i=1
putere = 1
cat_timp i<=n execut
putere =putere * i
i = i+1
scrie putere
stop
Variabila putere este folosit pentru a pstra puterea i a lui x, i fiind o
variabil ntreag ce numr puterea la care este ridicat x, fiind denumit
variabil de tip contor.
36
se execut secvena A
se evalueaz condiia;
dac rezultatul este fals, se continu
cu primul pas;
n caz contrar, se ncheie execuia
ciclului.
Exprimarea n
structuri este:
pseudocod
acestei
repet
Condiie
False
NU
DA
True
secvena A
pn_cnd condiie
Aceast structur mai este cunoscut ca
structura de tip REPEAT UNTIL
Observaie
Deoarece testarea condiie se face la
sfrit, secvena se execut cel puin o
dat (numrul de iteraii este mai mare
dect zero)
Figura 2.9
Exemplul 2.8
S se calculeze n! (factorialul numrului n, adic n!=1*2*...*n).
Pentru a rezolva acaeast problem sunt necesare variabilele de tip ntreg
n, citit de la tastatur, i, variabil necesar contorizrii pailor efectuai n
calcularea produsului i variabila fact, care va memora valoarea
produsului calculat.
intregi n, i, fact
citete n
i=1
fact=1
repet
fact=fact*i
i=i+1
pn_cnd i>n
scrie fact
stop
37
Exemplul 2.9
S se calculeze suma primelor n numere naturale.
Pentru rezolvarea acestei probleme, sunt necesare variabilele intregi n, i,
s, primele dou variabile avnd aceeai semnificaie ca la problema
precedent, iar s este variabila necesar pstrrii valorii sumei numerelor
naturale de la 1 la n.
intregi n, i, s
citete n
i=1
s=0
repet
s=s+i
i=i+1
pn_cnd i>n
scrie s
stop
S probm funcionalitatea algoritmului pentru n=3:
i ia valoarea 1 iar s ia valoarea 0; (se iniializeaz cu aceste valori)
i se adaug la vechea valoare a lui s
s=0+1=1
i crete cu o unitate (se incrementeaz)
i=1+1=2
se compar i cu n; deoarece i este mai mic dect n, se trece la repetarea
celor doi pai;
i se adaug la vechea valoare a lui s
s=1+2=3
i crete cu o unitate (se incrementeaz)
i=2+1=3
se compar i cu n; deoarece i nu este mai mare dect n, se trece la
repetarea celor doi pai;
i se adaug la vechea valoare a lui s
s=3+3=6
i crete cu o unitate (se incrementeaz)
i=3+1=4
i este mai mare dect n, deci se oprete execuia ciclrii, se tiprete
valoarea sumei s i algoritmul se ncheie.
Observaie
Dac se compar aceast problem cu precedenta, se observ o
asemnare n rezolvarea lor, i anume o parte de iniializare a variabilelor
i o ciclare pentru calculul celor dou valori: factorial, respectiv suma.
Diferenele constau n valorile de iniializare a factorialului (1, deoarece se
calculeaz un produs), respectiv a sumei (s=0) i operaiile de calcul a
celor dou variabile; nmulire, respectiv adunare.
Exemplul 2.10
n primul capitol a fost prezentat, n limbaj natural, algoritmul de mprire
a dou numere naturale prin scderi repetate. Iat cum se poate scrie n
pseudocod acest algoritm:
intregi a, b, cat
38
citete a, b
cat=0
ct_timp a>=b execut
a=a-b
cat=cat+1
scrie cat=, cat, rest=,a
stop
Pentru rezolvarea acestei probleme a fost ales ciclul cu test iniial
deoarece el va da rezultatul corect i pentru cazul cnd a<b, caz n care
catul va fi zero, iar restul a.
Ciclul cu contor sau structura repetitiv cu numr cunoscut de pai
(iteraii)
Aceast structur repetitiv este folosit n cazurile n care este cunoscut
numrul de iteraii ale structurii i modul n care se modific o variabil ce
controleaz execuia acestuia, denumit contor.
Exprimarea n pseudocod a acestei structuri este:
pentru contor=vi, vf, pas execut
secvena A
vi, vf reprezint valorile iniiale, respectiv finale ale variabilei contor, iar
pas este valoarea cu care se modific contor la terminarea execuiei
secvenei A; dac nu este precizat nici o valoare pentru pas, aceasta
este implicit 1.
Aceast structur este echivalent cu:
contor=vi
ct_timp contor<=vf execut
secvena A
contor=contor+pas
Exemplul 2.11
S se calculeze suma primelor n numere naturale, folosind ciclul cu
contor.
Algoritmul a fost explicat n cadrul exemplului 2.8. Rezolvarea n acest caz
este:
...........
citete n
s=0
pentru i=1, n execut
s=s+i
scrie s
..........
Se observ n acest caz c, n cadrul structurii repetitive nu mai apare
operaia de incrementare a variabilei contor i, aceasta fiind inclus n
Proiectul pentru nvmntul Rural
39
execuia instruciunii.
Selecia: reprezint calculul unei expresii, i n funcie de rezultatul
acesteia, algoritmul va continua pe una din ramurile posibile. Expresia
trebuie sa fie definit ntr-un tip de date cu valori finite.
expresie
c1: secventa_1;
c2: secventa_2;
cn: secventa_n;
rest: secventa_rest;
endcase;
Modul de utilizare a seleciei va fi prezentat ulterior, n cadrul prezentrii
instruciunilor limbajului C.
Pseudocod:
case
40
41
BIBLIOGRAFIE
1. Dorin Stoilescu, Manual de C/C++ - Cap.1 Introducere, Editura Radial, Galati, 1998.
2. Florin. Munteanu, Traian C. Ionescu, Daniela Saru, Gheorghe Musca, Sergiu
Mihai Dascalu, Programarea calculatoarelor - manual pentru liceele de informatic
Cap.2 Programe. Algoritmi. Elemente de programare structurat, Editura Didactic
i Pedagogic, Bucureti, 1995.
3. Valeriu Iorga si colectiv, Programare in C/C++. Culegere de probleme, Editura
Niculescu, Bucureti, 2003.
4. Programe de specialitate elaborate de ctre Ministerul Educaiei i Cercetrii pentru
nvmntul preuniversitar
42
43
Pagina
3.1
Etapa iniiala de dezvoltare a limbajului de programare C a avut loc n cadrul laboratoarelor AT&T
Bell ntre anii 1969 i 1973. Dup spusele lui Dennis Ritchie, cea mai creativ perioad a avut loc
n 1972. A fost denumit C deoarece multe din caracteristicile sale au fost derivate din limbajul de
programare B.
44
Sunt multe legende despre originea limbajului C i legtura sa cu sistemul de operare Unix, cum ar
fi:
Dezvoltarea limbajului C a fost rezultatul dorinei programatorilor de a juca un joc de tipul
Asteroids. Acetia l jucau pe calculatorul principal al companiei, dar din lipsa de resurse i datorit
faptului c acesta trebuia s suporte mai mult de 100 de utilizatori, Thompson i Ritchie,
nemulumii de controlul pe care l aveau asupra navei n ncercarea de a evita asteroizii, au decis
s porteze jocul pe un PDP-7, nefolosit, din birou. Dar aceast main nu avea un sistem de
operare, aa c au hotrt s scrie unul. Au decis ca eventual s porteze acest sistem de operare
pe mainile PDP-11 pe care acetia le foloseau n birou, dar era o munc destul de dificil avnd
n vedere c totul era scris n limbaj de asamblare. Aa c au decis s foloseasc un limbaj
portabil de nivel nalt astfel nct sistemul de operare s poat fi portat cu uurin de pe un
computer pe altul. Au ncercat folosind limbajul de programare B, dar i lipseau unele din
funcionalitile care ar fi fcut facil folosirea unor caracteristici avansate a mainii PDP-11. Astfel,
a aprut un nou limbaj de programare, numit C.
Justificarea pentru obinerea primului computer care a fost utilizat pentru dezvoltarea
sistemului de operare Unix a fost acela de a crea un sistem pentru a automatiza completarea
autorizaiilor. Prima versiune a sistemului de operare Unix a fost scris n limbaj de asamblare. Mai
trziu, limbajul de programare C a fost folosit pentru a rescrie sitemul de operare.
ncepnd cu anul 1973, limbajul de programare C a devenit destul de robust, astfel nct mare
parte a kernelului Unix, scris iniial n limbaj de asamblare pentru PDP 11/20, a fost rescris n C.
Acesta a fost unul din primele kernele ale unui sistem de operare scris ntr-un limbaj de
programare, altul dect limbajul de asamblare. ncercri anterioare au fost pentru scrierea
sistemului Multics (scris n PL/I) i TRIPOS (scris n BCPL).
K&R C
n 1978, Dennis Rithie i Brian Kernighan au publicat prima ediie a crii Limbajul de programare
C (eng. The C Programming Language). Aceast carte, cunoscut n cercul programatorilor sub
numele K&R, a servit pentru muli ani ca un mijloc de informare asupra specificaiilor limbajului C.
Versiunea limbajului C descris este cunoscut sub numele K&R C.
K&R C este adesea considerat limbajul de baz pe care orice compilator C trebuie s-l suporte.
Pentru muli ani, chiar i dup introducerea standardului ANSI C, a fost considerat ca fiind cel mai
mic numitor comun pe care programatorii n C trebuie s-l respecte atunci cnd se vorbete de
portabiliitate maxim, deoarece nu toate compilatoarele sunt scrise nc s suporte standardul
ANSI C, iar o secven de cod scris n K&R C respect i ANSI C.
ANSI C i ISO C
La sfritul anilor 1970, C a nceput s nlocuiasc limbajul BASIC devenind cel mai utilizat limbaj
de programare. n anii 1980 a fost adptat si de calculatoarele IBM PC, popularitatea acestuia
ncepnd s creasc semnificativ. n acest timp, Bjarne Stroustrup mpreun cu ali colegi de la
Bell Labs au nceput s adauge limbajului C caracteristici ale programrii orientate pe obiecte.
Limbajul rezultat a fost denumit C++ i este cel mai popular limbaj de programare pe sistemele de
operare Microsoft Windows; totui C-ul rmne cel mai popular limbaj de programare n Unix. Alt
limbaj de programare dezvoltat n acea vreme se numete Objective-C care adaug de asemenea
C-ului caracteristici ale programrii orientate pe obiecte. Dei nu la fel de popular ca C++,
Obejective-C este folosit pentru dezvoltarea aplicaiilor pe ce folosesc interfaa Cocoa a sistemului
de operare Mac OS X.
45
n 1983, American National Standards Institute (ANSI) a format un comitet, X3J11, pentru a stabili
specificaiile unui limbaj C standard. Dup un proces ndelungat, standardul a fost terminat n 1989
i ratificat ca ANSI X3.159-1989 "Programming Language C". Aceast versiune a limbajului ne
este cunoscut sub numele ANSI C. n 1990, standardul ANSI C (cu mici modificri) a fost adoptat
de International Organization for Standardization (ISO) ca ISO/IEC 9899:1990.
Una din intele procesului de standardizare ANSI C a fost acela de a produce un superset al K&R
C, ncorpornd multe dintre caracteristicile neoficiale introduse secvenial. Totui, comitetul pentru
standardizare a introdus cteva caracteristici noi, cum ar fi prototipul funciilor (mprumutat din
C++) i un preprocesor mult mai capabil.
ANSI C este suportat de marea majoritate a compilatoarelor folosite astzi. Mare parte din codul C
scris acum este bazat pe ANSI C. Orice program scris exclusiv n standardul C este garantat s
funcioneze corect pe orice platform cu o implementare C conform. Totui, multe programe sunt
scrise astfel nct aceste vor putea fi compilate numai pe anumite platforme, sau folosind un
anumit compilator, deoarece (i) se folosesc biblioteci non-standard, de exemplu pentru interfaa
grafic, (ii) unele compilatoare ce nu respect standardul ANSI C, deci i urmaii lor n mod implicit
sau (iii) bazarea pe dimensiunea unui anumit tip de date pe anumite platforme.
Limbajul C est singurul limbaj de programare structurat care permite un control rigurosal hardwareuluii al perifericelor (facilitate oferit de limbajele de asamblare). Limbajul C a fost folosit iniial
pentru scrierea programelor de sistem (sisteme de operare, editare, compilatoare, etc), dar o dat
cu creterea popularitii lui, programatorii au nceput s-l foloseasc i la scrierea programelor de
aplicaii datorit n special eficienei i portabilitii crescute a unor astfel de programe.
Datorit calitilor sale incontestabile, limbajul C a devenit limbajul de baz i pentru programarea
aplicaiilor de tip real.
46
47
paranteze pentru
delimitarea corpului
48
Funcia printf() din acest exemplu este o funcie sistem, adic nu este
creat de programator, care permite afiarea la consol (display) a
constantelor, variabilelor i caracterelor.
S observm modul de folosire al acestei funcii i n alte exemple.
Considerm urmtorul program:
Exemplul 3.3
main()
{
printf(Acesta este numarul sapte: %d,7);
}
n urma lansrii n execuie a programului, la consol va aprea:
Acesta este numarul sapte: 7
n acest caz funcia printf() are dou argumente separate prin virgul, i
anume un ir de caractere ncadrat ntre ghilimele i valoarea ntreag 7.
Simbolul %d permite transferarea parametrului din dreapta virgulei
valoarea 7 n stnga virgulei, alturi de irul de caractere. Acesta
reprezint unul din formatele specifice utilizate de funcia printf(), i
anume acela pentru scrierea numerelor ntregi.
Pentru a nelege i mai bine modul de lucru al funciei printf(), s mai
considerm un exemplu:
Exemplul 3.4
main()
{
printf(%s este student in anul %d \n la facultatea ta., Mihai, 3);
}
n urma execuiei programului, se va afia:
Mihai este student in anul 3
la facultatea ta.
Aceasta nseamn c funcia printf() a nlocuit simbolul %s cu irul de
caractere Mihai i simbolul %d cu numrul ntreg 3. Simbolul \n
reprezint caracterul newline i are efect de carriage return and
linefeed rnd nou i de la capt. Acesta este motivul c textul a fost
afiat pe dou rnduri, dei el a fost scris n program ntr-un singur rnd.
El formeaz o aa-numit secven escape.
S considerm nc un exemplu de program:
49
Exemplul 3.5
main()
{
printf(Litera %c se gseste in cuvantul %s,h, Mihai);
printf(pe pozitia %d.,3);
}
Dup executarea programului, se va afia:
Litera h se gseste in cuvantul Mihai pe pozitia 3.
Se observ c scrierea textului se face pe un singur rnd, cu toate c n
program sunt dou linii de instruciuni. Aici heste caracter i se scrie cu
formatul %c. Caracterele se delimiteaz de simbolul apostrof, iar irurile
de caractere de ctre ghilimele.
Din punct de vedere sintactic, un program scris n limbajul C este o
secven de caractere ASCII. Este alctuit din elemente lexicale
separate prin spaii:
constante;
operatori.
50
51
Incorect
1num
suma n
a#2
Reprezentare
Rang
n bii
char
8
-128 127
unsigned char
8
0 255
signed char
8
-128 127
int
16
-32768 32767
unsigned int
16
0 65535
signed int
16
-32768 32767
short int
16
-32768 32767
unsigned short int
16
0 65535
signed short int
16
-32768 - 32767
long int
32
-2 147 483 648 2 147 483 647
unsigned long int
32
0 4 294 967 295
signed long int
32
-2 147 483 648 2 147 483 647
float
32
10-17 - 1017 (6 digii precizie)
double
64
10-308 - 10308 (10 digii precizie)
long double
80
15 digii precizie
Tabelul 3.1
Exemple de declaraii de variabile:
int i, j, n;
short int si;
unsigned int ui;
double balanta, profit;
float time;
S considerm un exemplu de program ce utilizeaz mai multe tipuri de
variabile.
53
Exemplul 3.7
main()
{
int n;
float v;
char ch;
v=2.53;
n=65;
ch=A;
printf(Caracterul %c are codul ASCII %d,ch, n);
printf( si o frecventa de aparitie de %f %.,v);
}
n urma execuiei acestui program se va afia:
Caracterul A are codul ASCII 65 si o frecventa de aparitie de 2.530000
%.
54
3.4 Constante
Exist mai multe tipuri de constante, dintre care acum se vor prezenta
numai cele corespunztoare tipurilor predefinite.
Constante ntregi
Aceste constante se clasific astfel:
pentru valori ntre 32768 i 2 147 483 647 tipul long int;
pentru valori ntre 2 147 483 648 i 4 294 967 295 tipul unsigned
long int;
55
bazele 8 sau 16: \141 sau \x61. Se observ c, atunci cnd este folosit
baza 16, codul este precedat de caracterul x.
Secvenele escape sunt utile pentru definirea caracterelor negrafice, cum
ar fi caracterul newline, care are codul ASCII 1010 i care poate fi declarat
sub forma \12 sau \xa. Pentru anumite caractere, exist notaii speciale
sub form de secven escape. caracterul newline, amintit mai devreme,
se poate scrie i \n.
Alte exemple utilizate pentru secvenele escape:
backslash:
\\, \134, \x5c;
apostrof:
\, \47, \x27;
bel:
\a, \7, \x7;
cr:
\r, \15, \xd.
Se admit i constante cu dou caractere, ca de exemplu AB. O astfel de
constant este memorat utiliznd tipul int, cu observaia c primul
caracter este memorat n al doilea octet, iar al doilea caracter n primul
octet..
Constante reale
Exemple de constante reale: -33.25, 2., 0.3, sau -3.75E-11(=-3.75*10-11).
Constantele reale sunt memorate implicit utiliznd tipul double. i n acest
caz se poate fora memorarea lor sub tipul float, dac se adaug sufixul f
sau F, sau sub tipul long double, dac se adaug sufixul l sau L.
187.5
se memoreaz sub forma double;
187.5f
se memoreaz sub forma float;
187.5L
se memoreaz sub forma long double.
Declararea constantelor
Forma general a declarrii unei constante este alctuit din cuvntul
const, urmat de tipul constantei (opional) tip, numele dat constantei
nume i valoarea atribuit acesteia:
const [tip] nume = valoare;
Dac tipul constantei tip lipsete, atunci aceasta este implicit de tip int.
Iat cteva exemple de declarare a constantelor:
const int numar=15; constant ntreag denumit numar cu
valoarea 15
const numar=15;
la fel ca mai sus
const float pi=3.14; constant de tip float, denumit pi i cu
valoarea 3.14
Dac, de exemplu, n ultimul exemplu ar lipsi cuvntul const, asta ar
nsemna c este o declarare de variabil de tip float, iniializat cu
valoarea 3.14. Prezena modificatorului const determin protecia la
modificare a variabilei pi. Cu alte cuvinte, pi este o variabil, are spaiu
rezervat de memorie, dar reine o valoare ce nu poate fi modificat.
Cuvntul cheie const este denumit modificator, pentru c are rolul de a
modifica un enun, care iniial avea alt sens.
56
numrul pi
M_PI i derivate ale acestuia: M_PI_2, M_PI_4,
M_1_PI, M_2_PI, M_1_SQRTPI, M_2_SQRTPI;
57
Exemplul 3.9
Este definit tipul logic ca tip enumerare (Limbajul C nu are implementat
acest tip de variabile, spre deosebire de alte limbaje de programare, ca de
exemplu limbajul Pascal).
enum boolean (false, true);
Pentru false se d valoarea zero, iar pentru true se d valoarea unu.
Exemplul 3.10
Un alt exemplu de definire a unei enumerri:
enum timp (ieri, azi=3, maine=5);
n acest caz ieri este iniializat cu valoarea zero, azi cu valoarea 3, iar
maine cu valoarea 5.
enum timp (ieri, azi=3, maine=azi);
Este posibil ca dou constante s fie iniializate cu aceeai valoare (3 n
acest caz).
58
sqrt()
pow()
exp()
funcia ex cu sintaxa:
double exp(double x);
log()
log10()
sin()
cos()
tan()
Exemplul 3.11
S se evalueze, pentru x=3, valoarea funciei:
f ( x ) = x 5 + ln (x )
Pentru rezolvarea acestui exerciiu se vor folosi dou variabile reale x i f;
se vor folosi de asemenea dou funcii din cadrul bibliotecii matematice
math.h. n figura 3.2 este artat programul scris n mediul BORLANDC
FOR WINDOWS, mpreun cu rezultatul afiat.
Figura 3.2
59
R 2 h
3
5. Adevrat / Fals: pentru variabilele de tip logic, ce pot lua valorile true sau false, limbajul
C are definit tipul de variabile boolean.
60
3.6 Operatori n C
Limbajul C este foarte dotat n materie de operatori, acordnd operatorilor
mai mult importan dect majoritatea limbajelor de programare. C
definete patruclase de operatori: aritmetici, relaionali, logici i pe bii.
n plus, C mai dispune de anumii operatori speciali pentru anumite
operaii.
se evalueaz expresia;
variabilei nume_variabila i se atribuie valoarea obinut, fcnduse conversia necesar, dac este cazul.
Atribuirea multipl
C permite atribuirea aceleiai valori mai multor variabile, folosind mai
multe atribuiri n cadrul aceleiai declaraii. De exemplu, urmtorul
fragment de program atribuie lui a, b i c valoarea zero:
a=b=c=0;
Forma general a unei atribuiri multiple este:
v1=v2= . =vn=expresie;
unde v1, v2, .,vn sunt variabile (lvalue) care se pot modifica.
Exemplul 3.12
S examinm cteva exemple de declaraii i atribuiri simple:
char c;
int n,k;
Proiectul pentru nvmntul Rural
61
float x;
c=a;
n=3;
k=d;
x=c+n;
Dup prima atribuire caracterul c devine egal cu a. n urma celei de-a
doua atribuiri n devine egal cu 3. La a treia atribuire k devine egal cu 100,
deoarece expresia din membrul drept d, de tip caracter este convertit la
un tip ntreg, avnd valoarea codului ASCII al caracterului respectiv. Dup
ultima atribuire x devine egal tot cu 100, deoarece rezultatul adunrii
dintre un operand de tip ntreg i unul de tip caracter se convertete n
ntreg. Variabila c, iniial egal cu a, convertit n ntreg devine egal cu
codul su ASCII, adic 97, care se adun cu 3, valoarea variabilei n.
Rezultatul este deci 100.
Din acest exemplu se poate observa c limbajul C permite operaii ntre
operanzi de tipuri diferite, fcnd conversia tipului mai mic ca dimensiune
n tipul corespunztor celeilalte variabile.
Exemplul 3.13
Un exemplu de atribuire multipl:
int x, y;
float z;
z=x=y=3;
Dup evaluare, y reine valoarea 3, x devine egal cu y, adic tot 3, iar z
reine valoarea 3.0, fcndu-se i conversia de la tipul ntreg la cel real.
Exemplul 3.14
Folosirea operatorilor aritmetici:
int i, j, n;
float x;
//
n=10*4-7;
i=9/2;
j=n%i;
x=n;
x=x%i;
n urma primei atribuiri, n devine egal cu 33. La a doua atribuire, i va fi
egal cu ctul mpririi ntregi a lui 9 la 2, adic 4. La a treia operaie, j
devine egal cu restul mpririi ntregi a lui n la i,adic 1. La ultima operaie
de atribuire se obine eroare, deoarece operatorul % este definit doar
pentru numere ntregi.
Exemplul 3.15
Un exemplu care arat obinerea unor rezultate diferite pentru aceleai
calcule, datorit tipului diferit de variabile crora li se atribuie expresia
respectiv:
int i;
float x;
i=9./2;
x=9./2;
Valoarea expresiei din dreapta este n ambele cazuri egal cu 4.5. n
cazul primei atribuiri ea este convertit la tipul ntreg, corespunztor
variabilei i. Prin urmare, i devine egal cu 4, prin trunchiere. La cea de-a
doua atribuire, x primete valoarea 4.5.
n concluzie, rezultatul este convertit la tipul variabilei din membrul
stng al atribuirii.
Exemplul 3.16
n operaiile cu constante conteaz dac ele sunt de tip ntreg sau real:
int i;
i=3/2+9/2;
i=3./2+9./2;
Dup prima atribuire, i devine egal cu 5 (3/2=1, 9/2=4, 1+4=5), iar dup
cea de+a doua atribuire i devine egal cu 6 (3./2=1.5, 9/2=4.5, 1.5+4.5=6).
63
x++;
x--;
iar
Att operatorul de incrementare, ct i cel de decrementare pot precede
prefixa sau urma postfixa operandul. De exemplu,
x=x+1; poate fi scris ca
x++;
sau
++x;
64
++ -- (minus unar)
*/%
+-
65
q
0
1
0
1
p&&q
0
0
0
1
Tabelul 3.2
p||q
0
1
1
1
!p
1
1
0
0
Operatori relaionali
Operator
>
>=
<
<=
==
!=
Aciune
Mai mare dect
Mai mare sau egal
Mai mic
Mai mic sau egal
Egal
Diferit
Operatori logici
Operator
&&
||
!
Aciune
I AND
SAU OR
negare NOT
Tabelul 3.3
!
> >= < <=
== !=
&&
||
Exemplul 3.19
Toate expresiile relaionale i logice dau un rezultat egal fie cu zero, fie cu
1 (fals sau adevrat).
main()
{
int n;
n=100;
Proiectul pentru nvmntul Rural
67
x=x+10;
x=x-102;
poate fi scris
poate fi scris
x + = 10;
x - = 102;
i<<=j;
Valoarea variabilei i devine 48.
c) Folosirea operatorului de deplasare la dreapta pe bii i apoi a
operatorului aritmetic de adunare:
int a=3, b=5,c;
a += b >>= c = 2;
Valoarea variabilei a se determin astfel: mai nti lui c i se atribuie
valoarea 2, dup care b devine 1 (5/2/2); a va primi n final valoarea 4
(3+1).
69
a devine 8 (c+2);
b primete valoarea 6.
Expresia (n ansamblul ei) este de tip int i produce valoarea 6,
corespunztoare ultimei atribuiri efectuate.
se evalueaz Exp1;
n ansamblu, expresia este de tipul lui Exp2 sau al lui Exp3, n funcie de
cea care se evalueaz i produce valoarea corespunztoare expresiei
evaluate.
Exemplul 3.29
Pentru un numr real x, citit de la tastatur, s se afieze valoarea
absolut a acestuia (modulul).
#include <stdio.h>
void main()
{
float x;
printf(x=); scanf(%f,&x);
printf(%f, x>=0? x: -x);
}
ntreaga expresie condiional a fost scris ca un parametru pentru
printf(). Se testeaz dac x este mai mare sau egal cu zero i n cazul n
care condiia este ndeplinit, se evalueaz x, a doua expresie; n cazul n
care x este negativ, se evalueaz x, a treia expresie; se va tipri
valoarea expresiei evaluate.
Exemplul 3.30
Fie declaraiile:
double x, y, aux;
Expresia:
x > y ? (aux=x: x=y, y=aux) : y;
are ca efect ordonarea variabilelor x i y n ordine cresctoare. Ca rezultat
se obine cea mai mare valoare dintre cele dou variabile.
71
de
preincrementare,
72
4) A
4F
5A
pag. 51
pag. 51
pag. 51
pag. 51
pag. 51
BIBLIOGRAFIE
1. Dorin Stoilescu, Manual de C/C++ - Cap.1 Introducere, Cap.2 Tipuri de date,
Editura Radial, Galati, 1998.
2. Florin. Munteanu, Traian C. Ionescu, Daniela Saru, Gheorghe Musca, Sergiu
Mihai Dascalu, Programarea calculatoarelor - manual pentru liceele de informatic
Cap.17 Structura programelor n limbajul C. Tipuri de date, operatori i expresii,
Editura Didactic i Pedagogic, Bucureti, 1995.
73
x+=y;
y=y*2+8;
x=y/2;
n final, x i y vor avea valorile:
Proiectul pentru nvmntul Rural
a)
x=12; y=14;
b)
x=9; y=7;
c)
x=7; y=14;
5. Care dintre urmtoarele atribuiri sunt corecte?
int a, b;
float d;
char c;
a)
c=5;
b)
d=a%b;
c)
a=d/3;
d)
a=(d<c);
e)
d=sqrt(a+b);
d)
e)
x=30; y=60;
x=14; y=28;
6. Care dintre expresiile urmtoare sunt incorecte, tiind c operanzii care intervin sunt de
tip ntreg?
a)
(a!=b) && (c<b)
b)
a+-3+b
c)
a-a/b (a-3)
d)
! (a<b)
e)
b+%a
7. Care din urmtoarele afirmaii sunt adevrate?
a) Un algoritm se execut de un numr finit de ori pentru orice set de date de
intrare.
b) Un algoritm prelucreaz numai datele de intrare, fr obinerea unor date
intermediare.
c) La analiza enunului unei probleme sunt identificate datele de intrare i cele de
ieire.
8. tiind c x este o variabil folosit pentru citirea mai multor numere ntregi, cum va fi
declarat aceasta?
a)
integer x;
b)
x=int;
c)
int x;
d)
char x;
9. tiind c variabila n va fi utilizat ntr-un program pentru a reine un numr ntreg cu
maxim 10 cifre, care va fi varianta corect pentru declararea sa?
a)
int n;
b)
unsigned long n;
c)
unsigned n;
d)
long n;
75
Pagina
4.1
Noiuni introductive
S definim, mai nti, o noiune foarte des ntlnit n limbajul C, i anume
cea de stream. Stream-ul reprezint un concept abstract ce definete
orice flux de date de la o surs la o destinaie. Atunci cnd sursa este
memoria intern, iar destinaia este un fiier oarecare, se spune c este
un stream de ieire (pe scurt, ieire sau scriere). Atunci cnd sursa este
un fiier oarecare, iar destinaia este memoria intern, se spune c este
un stream de intrare (pe scurt, intrare sau citire).
Un caz aparte de ieire este acela n care datele sunt scrise pe monitor,
situaie n care fiierul poart o denumire standard: stdout, dup cum un
caz aparte de intrare este acela n care datele se preiau de la tastatur
fiier standard numit stdin.
Cele dou fiiere (stdout i stdin) sunt atribuite automat oricrui program
scris n C. De asemenea, ele sunt deschise automat la lansarea n
execuie a programului i nchise atunci cnd execuia se termin. Din
acest motiv, operaiile de intrare/ieire efectuate cu ajutorul lor poart
denumirea de intrri/ieiri standard.
76
4.2
Format
caracter
ntreg zecimal cu semn
ntreg zecimal cu semn
numr real, notaie tiinific (e mic)
numr real, notaie tiinific (E mare)
numr real, notaie zecimal
numr real, cea mai scurt reprezentare dintre %f i %e
numr real, cea mai scurt reprezentare dintre %f i %E
numr octal, ntreg, fr semn
ir de caractere
ntreg zecimal fr semn
numr hexazecimal, ntreg, fr semn, litere mici
numr hexazecimal, ntreg, fr semn, litere mari
afieaz un pointer (adres)
afieaz simbolul %
Tabelul 4.1
l
cu d, i, u, o, x, X urmeaz s afieze o dat de tip long;
cu f, e, E, g urmeaz s afieze o dat de tip double;
Proiectul pentru nvmntul Rural
77
h
cu d, i, u, o, x, X urmeaz s afieze o dat de tip short;
L
cu f, e, E, g urmeaz s afieze o dat de tip long
double;
De exemplu, %ld va afia o dat de tip long int, iar %hu va afia o dat
de tip short unsignet int.
79
printf(%10f\n, val);
printf(%012f\n, val);
printf(%-10f\n, val);
printf(%-012f\n, val);
}
n urma executrii acestui program, rezultatele vor fi afiate astfel:
1 2
1 2 . 5
1 0 . 1 2 3
1 0 . 1 2
1 0 . 1 2
0 0 0 1 0 .
1 0 . 1 2 3
1 0 . 1 2 3
5 2 5
0 4 0
3
1
0
0
0
2
4
4
5 2 5 . 7
. 7
4 0
3 0 4 0
0
0 0 0 0
80
4.3
81
n acest program, pe lng funcia scanf(), mai apar dou alte elemente
noi:
- operatorul de multiplicare (*)
- operatorul adres (&).
Pentru moment trebuie reinut faptul foarte important c funcia scanf()
cere utilizarea simbolului adres - & - naintea numelui fiecrei variabile.
Specificare formatelor pentru funcia scanf() este similar, cu mici
excepii, cu cea pentru funcia printf(); de exemplu, nu sunt acceptate
formatele %i i %g. Funcia scanf() poate accepta, n acelai timp, mai
multe intrri de date de tipuri diferite.
Exemplul 4.5
main()
{
int ev;
float timp;
char poz;
printf(Introduceti poz, ev,timp: )
scanf(%c %d %f, &poz, &ev, &timp);
printf(Evenimentul %c are numarul %d,poz,ev);
printf( si a avut loc la %f timp.,timp);
}
Valori i spaii introduse de utilizator
12.30
poz
ev
timp
12.30
Figura 4.1
82
83
Atunci:
citete variabila a;
Proiectul pentru nvmntul Rural
4. Fie declaraia
caractere?
a.
b.
c.
d.
e.
f.
85
5. Fie declaraia:
int a, b, c;
Ce se ntmpl dac folosind pentru citire apelul:
scanf(%2d%3d%4d, &a, &b, &c);
se va introduce secvena de intrare 123456? Care va fi valoarea variabilelor dup aceast
introducere?
86
F
b
d
iostream.h
9, respectiv 5
Vezi Laboratorul 3
Vezi Laboratorul 3
Vezi Laboratorul 3
Vezi Laboratorul 3
Programul determin valoarea maxim dintre cele trei numere citite.
BIBLIOGRAFIE
1. Dorin Stoilescu, Manual de C/C++ - Cap.3 Intrri/Ieiri standard, Editura Radial,
Galati, 1998.
2. Florin. Munteanu, Traian C. Ionescu, Daniela Saru, Gheorghe Musca, Sergiu
Mihai Dascalu, Programarea calculatoarelor - manual pentru liceele de informatic
Cap.17 Structura programelor n limbajul C. Tipuri de date, operatori i expresii,
Editura Didactic i Pedagogic, Bucureti, 1995.
3. Valeriu Iorga si colectiv, Programare in C/C++. Culegere de probleme, Editura
Niculescu, Bucureti, 2003.
4. Programe de specialitate elaborate de ctre Ministerul Educaiei i Cercetrii pentru
nvmntul preuniversitar
5. Herbert Schildt, C manual complet Cap.8 Operaii de intrare/ieire pentru
consol, Editura Teora, 2000
6. http://www. cs.umd.edu/users/cml/style/ - ghid privind stilul de programare in limbajele
C si C++.
7. http://www.programmingtutorials.com tutoriale de programare pentru C, C++ precum
si pentru alte limbaje.
8. http://www.snippets.org exemple de programe scrise in limbajul C.
87
a. start()
b. system()
c. main()
d. program()
2. Ce semn de punctuaie este folosit pentru a semnaliza nceputul i sfritul unei
secvene de program?
a. { }
b. -> and <c. BEGIN and END
d. ( and )
3. Care este semnul de punctuaie cu care se termin cele mai multe linii de program
C/C++?
a. .
b. ;
c. :
d. '
4. Care din urmtoarele rnduri reprezint un comentariu corect?
a. */ Comentariu */
b. ** Comentariu **
c. /* Comentariu */
d. { Comentariu }
5. Care cuvnt din urmtoarele nu reprezint un tip corect de variabile?
a. float
b. real
c. int
d. double
6. Care din urmtoarele reprezint varianta corect a operatorului de comparare a
egalitii a dou variabile?
a. :=
b. =
c. equal
d. ==
7. Scriei un program care s citeasc de la tastatur valoarea temperaturii de afar (un
numr ntreg) i s afieze mesajul Este frig! dac este o temperatur negativ, Este
placut azi afar dac temperatura este mai mic dect 20o C, respectiv Este o zi torida!
dac temperatura depete ultima valoare. Se va folosi operatorul condiional.
8. Scriei un program care calculeaz i afieaz retribuia unui salariat n funcie de grupa
de vechime n care se afl. Exist 3 grupe de vechime (1, 2, i 3). Retribuia se calculeaz
cu relaia:
retribuie=salariu +spor
Sporul depinde de grupa de vechime i este egal respectiv cu 150, 250, 350. Grupa de
vechime i salariul se introduc de la tastatur. Programul va folosi operatorul condiional.
88
Cuprins
Pagina
5.1
Instruciunea expresie
Forma general:
expresie;
Efect:
Se evalueaz expresia.
Exemplul 5.1
i++;
// se incrementeaz postfixat valoarea variabilei i
a*=10; // se multiplic cu 10 valoarea variabilei a
getchar();
// se citete un caracter
89
Observaii:
expresie poate fi vid. Instruciunea devine instruciunea vid ;
orice instruciune n C / C++ se termin cu ;
este permis folosirea oricrei expresii sintactic corecte, chiar i
atunci cnd instruciunea nu genereaz nici un efect.
Exemplul 5.2
3*( 7-4);
5.2
Instruciunea compus
Forma general:
{
declaraii
instruciune1;
instruciune2;
...
instruciune n;
}
Efect:
Se execut n ordine instruciunile specificate.
Observaii:
Utilizarea instruciunilor compuse este necesar atunci cnd
sintaxa permite executara unei instruciuni ( if, for, do-while, while)
care efectueaz mai multe operaii.
Declaraiile care apar ntr-o instruciune compus sunt locale
instruciunii. Mai exact, ele sunt valabile numai n corpul instruciunii
compuse, din momentul declarrii lor pn la sfritul instruciunii.
5.3
Instruciunea if
Forma general:
if ( expresie) instruciune1
else instruciune2
Efect:
Se evalueaz expresia
Dac valoarea expresiei este diferit de 0, se execut instruciune1,
altfel se execut instruciune2.
90
Exemplul 5.3
if (x) cout<<x<< nu este zero ;
else cout<<x<<este zero;
Observaii:
expresie se ncadreaz ntre paranteze rotunde;
ramura else poate s lipseasc dac instruciune2 este vid.
Exemplul 5.4
S se calculeze maximul dintre a i b, unde a i b sunt dou variabile ntregi.
# include <iostream.h>
void main()
{
int a,b, max;
cout<< a= cin>>a;
cout<< b= cin>>b;
max=a;
if (max<b) max=b;
cout<< maximul este<<max;
}
Exemplul 5.5
Se citesc a,b,c coeficienii reali ai ecuaiei de gradul II ax2+ bx+c=0. Se cere s se
scrie un program care s rezolve ecuaia.
Varianta 1:
# include <iostream.h>
# include <math.h>
# include <conio.h>
main()
{ flota a,b,c,d;
cout<<a=; cin>>a;
cout<<b=; cin>>b;
cout<<c=; cin>>c;
if (a)
{ d=b*b-4*a*c;
if (d>=0) { cout<<x1=<<(-b+sqrt(d))/(2*a));
cout<<x2=<<(-b-sqrt(d))/(2*a));}
else cout <<x1 si x2 nu sunt reale;
}
else if (b) cout<<x=<<(-c/b);
else if(c==0) cout<<infinitate de soluii;
else cout<< ecuaia nu are soluii;
}
Proiectul pentru nvmntul Rural
91
Observaii:
1. funcia rdacin ptrat sqrt() are prototipul n math.h;
2. clrscr() are prototipul n conio.h i are funcia de tergere
3. varianta 2 a programului folosete operatorii condiionali ? :
O alt variant de rezolvare a acestei probleme este prezentat n
laboratorul corespunztor acestui capitol.
Test de autoevaluare 5.1
Alege, prin ncercuire, varianta corect de rspuns pentru urmtoarele teste. Rspunsul
pentru fiecare cerin valoreaz 25 de puncte. Punctaj minim: 75.
1. Care din urmtoarele secvene de instruciuni atribuie variabilei reale k cea mai
mare dintre valorile variabilelor a i b sau valoarea lor comun, dac acestea sunt
egale:
a) if (a<=b) k=a; else k=b;
b) if (a<=b) k=b; else k=a;
c) if ( a==b) k=a; else if (b>a) k=b;
d) k=a; if (k<b) k=b;
2. Se consider secvena de program:
x=1;
if ( ! (a<b) || !(a<=c) if (b>=c) cout <<(-x); else if (b<c) cout<<x;
Pentru care dintre tripletele de valori ale variabilelor a,b,c se va afia valoarea 1?
a)
b)
c)
d)
3. Dac a i b sunt variabile de tip int, iar x i z sunt variabile de tip float, stabilii care
dintre secvenele de instruciuni sunt corecte:
a) b=0; if (a>b) b=a/2;
b) a=8; b=10;
c) a:=5; b:=5; if (a==b) x=y;
4. Care dintre instruciunile urmtoare sunt incorecte sintactic, tiind c operanzii care
intervin sunt de tip ntreg?
a) if ( abs(3==3) cout<< ok;
b) if ( a%3=b) cout<< zz;
c) if ( (b+a)/2) cout<< yy;
d) if (!1) cout<<hm;
Variantele corecte de rspuns se afl la pag. 99.
92
5.4
Instruciunea switch
Forma general:
switch (expresie)
{
case constanta1: secvena instruciuni1
case constanta2: secvena instruciuni2
...
case constantan: secvena instruciunin
default:
secvena instruciunin+1
}
Efect:
Se evalueaz expresie;
Se compar succesiv valoarea ei cu valorile expresiilor constante
care eticheteaz alternativele case.
Dac se ntlnete o alternativ case etichetat cu valoarea
expresiei, atunci se execut secvena de instruciuni
corespunztoare i toate secvenele de dup aceasta, pn la
ntlnirea instruciunii break sau pn la sfritul instruciunii switch.
Dac nici una dintre valorile etichetelor alternative case nu coincide
cu valoarea expresiei, atunci se execut secvena de instruciuni de
pe ramura default.
Exemplul 5.6
switch (x)
{
case *: a*=b; break;
case /: a/=b; break;
case +: a+=b; break;
case -: a-=b; break;
default: cout << eroare!;
}
n funcie de valoarea variabilei char c (*, /, +, -) vom efectua operaia
corespunztoare ntre variabilele a i b. Dac variabila c are orice alt
valoare, vom da mesajul eroare!
Observaii:
93
5.5
Instruciunea break
Forma general:
break;
Efect:
Determin ieirea necondiionat din instruciunea switch, while, for
sau do-while n care apare.
5.6
Instruciunea while
Forma general:
while (expresie)
instruciune
Efect:
1. se evalueaz expresie;
2. dac valoarea expresiei este 0, se iese din instruciunea while,
altfel, dac valoarea este diferit de 0, se execut instruciune i
apoi se revine la pasul 1.
Exemplul 5.7
S calculm rsturnatul numrului natural n. Ex: rsturnatul lui 821 este
128.
1
2
x=0;
// n x obin rsturnatul lui n
while (n)
{
x=x*10+n%10; // adaug ultima cifr din n la x
n/=10;
// elimin ultima cifr din n
}
3
4
Linia
1
2
3
4
2
3
4
2
3
4
2
94
Efect
Se iniializeaz x cu 0
Se testeaz dac n este diferit de 0
Se adaug la x ultima cifr a lui n
Se elimin ultima cifr din n
Se testeaz dac n este diferit de 0
Se adaug la x ultima cifr a lui n
Se elimin ultima cifr din n
Se testeaz dac n este diferit de 0
Se adaug la x ultima cifr a lui n
Se elimin ultima cifr din n
Se testeaz dac n este diferit de 0; se iese
din while
n
821
821
821
82
82
82
8
8
8
0
0
x
0
0
1
1
1
12
12
12
128
128
128
Observaii:
instruciunea se execut repetat ct timp valoarea expresiei este
nenul.
Dac expresia are de la nceput valoarea 0, instruciune nu se
execut nici macar o dat.
Sintaxa permite executarea n while a unei singure instruciuni, prin
urmare, atunci cnd este necesar efectuarea mai multor operaii,
acestea se grupeaz ntr-o instruciune compus.
10 puncte
50 puncte
10 puncte
10 puncte
10 puncte
100 puncte
Indicaie:
x0=1
xn= x * x ** x=x*(x * x ** x)
de n ori
de n-1 ori
5.7
95
Exemplul 5.8
S numrm cifrele numrului natural memorat n variabila n. Ex: n=1663
are k=4 cifre.
k=0;
// n k obin numrul de cifre
do
{
n/=10; // elimin ultima cifr a lui n
k++;
// numr cifra
} while (n); // repet algoritmul ct timp n are cifre
Observaii:
instruciunea do-while execut instruciunea specificat cel puin o
dat, chiar dac de la nceput valoarea expresiei este 0, deoarece
evaluarea expresiei se face dup executarea instruciunii.
Sarcina de lucru 5.2
Se consider urmtorul program:
#include< iostream.h>
void main()
{
int a,b, nr=0, i;
cout<< a=;cin>>a;
cout<< b=;cin>>b;
i=a;
while (i<=b) { if (i%2==0) nr++; i++;
cout<<nr=<<nr;}
a) Ce va afia pe ecran pentru a=5 i b=8?
b) Scrie un program echivalent, care s utilizeze instruciunea do-while.
c) Care este efectul acestui program?
Barem:
a)
b)
c)
total
10 puncte
30 puncte
10 puncte
50 puncte
5.8
Instruciunea for
Forma general:
for ( expresie iniializare; expresie continuare; expresie reiniializare)
instruciune
96
Efect:
1.
se evalueaz expresia de iniializare;
2.
se evalueaz expresia de continuare;
3.
daca valoarea expresiei de continuare este 0, se iese din
instruciunea repetitiv for; dac valoarea expresiei de continuare
este diferit de 0, atunci se execut instruciune, se evalueaz
expresia de reiniializare i se revine la pasul 2.
Observaii:
instruciunea for este o instruciune repetitiv, ca i while i dowhile;
ea poate fi simulat cu ajutorul instruciunii while astfel:
expr1;
while (expr2)
{
instruciune;
expr3;
}
while ( expresie)
instruciune
for ( ; expresie ; )
instruciune
for ( ; ; )
instruciune
Exemplul 5.9
S se calculeze factorialul numrului natural n.
n!= 1 2 3 n
fact=1;
for(i=1;i<=n;i++) fact*=i;
pentru n=4
i
1
2
3
4
Proiectul pentru nvmntul Rural
fact
1*1=1
1*2=2
2*3=6
4*6=24
97
b) 16
c) 10
d) 8
e)9
d) 216
e)1
4.Pentru afiarea numerelor naturale 1,2,n , unde n este dat, propun urmtoarele
secvene de program:
a) for(i=1;i<=n;i++); cout<<i;
b) for(i=1;i<=n;i++) cout<<i;
Care din afirmaiile de mai jos este adevrat?
i)
nici una din secvene nu ndeplinete cerina problemei.
ii)
Ambele secvene ndeplinesc cerina problemei
iii)
Secvena a) conine erori de sintax
98
iv)
v)
Exemplul 5.11
irul Fibonacci
Fie irul 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ... . Fie n un numr natural citit de
la tastatur. S se scrie un program care afieaz cel de-al n-lea termen
din irul lui Fibonacci.
Observ c pentru a calcula un termen Fibonacci am nevoie de doi termeni
precedeni. Voi folosi variabilele f0, f1, f2; n f0 i f1 voi reine doi termeni
consecutivi din ir i n f2 voi calcula termenul urmtor f2=f1+f0. La iteraia
i a ciclului for voi calcula al i-lea termen Fibonacci.
#include<iostream.h>
void main()
{ int i, n, f0, f1, f2;
cin>>n;
f0=1; f1=1;
//iniializarea primilor doi termeni
for ( i=2;i<=n;i++)
{ f2=f1+f0;
// calculez termenul curent
f0=f1;
/* reiniializez variabilele care definesc doi termeni
f1=f2;
consecutivi n ir */
}
cout<< cel de-al<<n<< termen Fibonacci este<< f2;
}
99
Soluiile sarcinilor de lucru 5.1 i 5.2, ca i a problemelor propuse pentru laboratorul corespunztor
se gsesc n cadrul laboratorului 4.
Bibliografie
1. Cerchez, Emanuela, Informatic. Culegere de probleme pentru liceu,
Editura Polirom, Iai, 2002.
2. Cerchez, Emanuela, erban, Marinel, Programarea n limbajul C-C++
pentru liceu, Cap 2 Instruciunile limbajului C / C++, Editura Polirom,
Iai, 2005
3. Cormen, Thomas, Introduction in Algorithms, Cap 1 Fundamente
Matematice, The Massachussets Institute of Technology, 1990.
100
Aplicaia 1
Aplicaia 2
Aplicaia 3
Aplicaia 4
Aplicaia 5
Aplicaia 6
Aplicaia 7
Total
10 puncte
15puncte
15 puncte
15 puncte
5 puncte declaraii corecte
15 puncte 5 puncte cutarea secvenei 13 n numr
5 puncte afiarea rezultatului
5 puncte declaraii corecte
5 puncte verificarea respectrii regulilor de
15 puncte
construire a sirului
5 puncte afiarea rezultatului
5 puncte declaraii corecte
15 puncte 5 puncte determinarea divizorilor care sunt primi
5 puncte afiarea rezultatului
100 puncte
b)3
c)6
d)7
e)1
f)12
2. Dac a i b sunt variabile de tip int, stabilete care din urmtoarele structuri repetitive
sunt ciclri infinite:
c) a=0; b==10;
a) a=10; b=0;
while((a<=10)&&(b>=0))
do{
{ b++;a++;}
a--;b++;
}while (a!=b);
b) a=1; b=5;
d) a=0; b=10;
while ((a<=10)||(b>=0)
while(a+b<=10)
{b++;a++;}
{ a=a+2; b=b-2;}
101
3. Fie programul:
#include<iostream.h>
void main()
{ int a,b,u,aux;
cin>>a>>b;
if(a<b) {aux=a;a=b;b=aux;}
u=0;
while(a>=b) {u++;a-=b;}
cout <<u;
}
Pentru a=2572 i b=13 programul va afia:
a) 11 b)91
c)197 d)13
e)199
4. Alegei varianta corect dac n (natural) este par:
unsigned int n;
a) if(n>0) if(n%2) cout<<n par;
b) if(n>0) if(n/2==0) cout<<n par;
c) if(n>0) if(n/2) cout<<n par;
d) if(n>0) if(!(n%2)) cout<<n par;
5. Se d un numr natural n. S se scrie un program C/ C++ care s determine dac
numrul conine n scrierea lui secvena 13. Ex: numrul 171310 conine secvena 13, iar
numrul 171032 nu conine secvena 13.
102
Tablouri
Cuprins
Pagina
103
Tablouri
primul element al
tabloul_meu[99].
tabloului
va
fi
tabloul_meu[0],
iar
ultimul
Tablouri
scanf(%d, &n);
for (i=0; i<n; i++)
{printf(a[%d]=, i);
scanf(%d, &a[i]);
}
min=max=a[0];
for (i=1; i<n; i++)
if (a[i]>max)
max=a[i];
else
if (a[i]<min)
min=a[i];
printf(minim=%d\tmaxim=%d\n, min,max);}
se vor determina valorile minime i maxime dintr-un vector (tablou
unidimensional) cu n componente. Mai nti este citit valoarea lui n i
apoi sunt citite componentele vectorului cu ajutorul unei instruciuni for. Se
iniializeaz cele dou variabile min i max, corespunztoare celor dou
valori cerute, cu primul element al vectorului, a[0]. n continuare, fiecare
element al vectorului a[i] este comparat mai nti cu valoarea maxim
curent; dac este mai mare dect aceasta, variabila max i schimb
valoarea max=a[i]; - , n caz contrar acesta este comparat cu valoarea
minim curent; dac este mai mic dect aceasta, variabila min i
schimb valoarea min=a[i];
Exemplul 6.2
Se citete un ir de n numere naturale de la tastatur i un alt numr
natural x. Se afl acest numr printre componentele vectorului? n caz
afirmativ, de cte ori a fost gsit? S se afieze un mesaj corespunztor
fiecrei situaii.
main()
{unsigned int a[20], n, i, f, x;
printf(Introduceti dimensiunea tabloului:);
scanf(%ud, &n);
for (i=0; i<n; i++)
{printf(a[%ud]=, i);
scanf(%ud, &a[i]);
}
printf(x=);
scanf(%ud, &x);
f=0;
for (i=0; i<n; i++)
if (a[i]==x)
f++;
if (f==0)
printf(numarul %ud nu se afla in vector\n, x);
else
printf(numarul %ud se afla in vector, aparand de
%ud ori\n, x,f);}
Proiectul pentru nvmntul Rural
105
Tablouri
Tablouri
107
Tablouri
gata =1
i=0
este a[0]>a[1]? da, deci se interschimb cele dou valori
i gata devine zero; a devine: 2, 7, 9, 1, 3
i=1
este a[1]>a[2]? nu, deci nu se ntmpl nimic;
i=2
este a[2]>a[3]? da, deci se interschimb cele dou valori
i gata rmne zero; a devine: 2, 7, 1, 9, 3
i=3
este a[3]>a[4]? da, deci se interschimb cele dou valori
i gata rmne zero; a devine: 2, 7, 1, 3, 9
Se reia structura while, deoarece gata este zero:
gata =1
i=0
este a[0]>a[1]? nu, deci nu se ntmpl nimic;
i=1
este a[1]>a[2]? da, deci se interschimb cele dou valori
i gata devine zero; a devine: 2, 1, 7, 3, 9
i=2
este a[2]>a[3]? da, deci se interschimb cele dou valori
i gata rmne zero; a devine: 2, 1, 3, 7, 9,
i=3
este a[3]>a[4]? nu, deci nu se ntmpl nimic;
Se reia structura while, deoarece gata este zero:
gata =1
i=0
este a[0]>a[1]? da, deci se interschimb cele dou valori
i gata devine zero; a devine: 1, 2, 3, 7, 9
i=1
este a[1]>a[2]? nu, deci nu se ntmpl nimic;
i=2
este a[2]>a[3]? nu, deci nu se ntmpl nimic;
i=3
este a[3]>a[4]? nu, deci nu se ntmpl nimic;
Se reia structura while, deoarece gata este zero:
gata =1
Se mai parcurge o dat vectorul, dar nu se mai efectueaz nici o
intershimbare, cci acesta este ordonat cresctor. Condiia de meninere
n structura repetitiv nu mai este ndeplinit i algoritmul se ncheie.
Exemplul 6.4
Se consider un vector cu n componente numere ntregi, ordonate
cresctor i un numr ntreg x. S se determine dac acest numr se afl
printre componentele vectorului, iar n caz afirmativ, poziia sa n vector.
Pentru acest exemplu s-ar putea folosi ca metod de rezolvare algoritmul
prezentat n cazul exemplului 6.2, dar nu ar fi o metod eficient,
deoarece nu se ine cont de faptul c vectorul este deja ordonat cresctor;
prin urmare, cnd numrul x este comparat cu un element din vector a[i],
se pot lua mai multe decizii; dac numrul x este egal cu a[i], atunci se
poate spune c numrul se afl n vector pe poziia i; dac x este mai mic
dect a[i], se poate deduce c acesta se poate afla pe poziiile mai mici
dect i, respectiv pe poziiile mai mari dect i, n caz contrar.
n Laboratorul 5 este prezentat algoritmul cutrii binare, care rspunde
cerinelor acestei probleme.
108
Tablouri
v={3, 4, 9, 5, 2, 7}
109
Tablouri
110
Tablouri
6.2 Pointeri
Pointerii sunt variabile care conin (sunt capabile s conin) adresele
unor altor variabile sau obiecte, deci practic adrese de memorie.
Dimensiunil pointerilor (ci octei ocup) depind de main, de
implementarea limbajului, etc. n general, acest aspect trebuie luat n
consideraie doar din punct de vedere al portabilitii programelor; un
program bun nu trebuie s depind de dimensiunile concrete ale
pointerilor i, n general, s funcioneze corect pe orice implementare a
limbajului care respect standardul ANSI.
Un pointer este asociat unui tip de variabile: exist pointeri ctre char, int,
float etc. Dac T este un tip de date standard sau definit de utilizator, un
pointer ctre tipul T se declar prin:
T *p;
Iat cteva exemple de declaraii de pointeri:
int *pi;
float *pf;
char *pc;
ceea ce nseamn c pi este un pointer ctre ntreg, pf este un pointer
ctre float (real), iar pc unul ctre caracter. Se pot declara mai muli
pointeri pe acelai rnd, mpreun cu variabile de acelai tip, fiecare
variabil de tip pointer trebuind s fie precedat de simbolul *:
char *pc, c, *pa, a;
n aceast situaie, pc i pa sunt pointeri la char, iar a i c sunt variabile
de tip char.
Pentru variabilele de tip pointer exist doi operatori specifici, i anume:
111
Tablouri
Tablouri
Figura 6.1
Se poate observa c, utiliznd exclusiv coninutul variabilei adr2, se poate
adresa indirect, cu dou nivele de indirectare, coninutul variabilei a.
Indirectarea s-a fcut dup schema:
a
a
adresa a
adresa
adr1
adr1
adr2
113
Tablouri
Tablouri
Exemplul 6.8
Precizai relaia de ordine dintre dou cuvinte (iruri de caractere care nu
conin caractere albe), cuvinte citite de la tastatur.
#include <string.h>
#include <iostream.h>
void main()
{
char s1[100],s2[100];
int p;
cout<<Introduceti primul sir: ; cin>>s1;
cout<<Introduceti al doilea sir: ; cin>>s2;
p=strcmp(s1,s2);
if (p<0) cout<<s1<s2;
else
Proiectul pentru nvmntul Rural
115
Tablouri
if (p>0) cout<<s1>s2;
else cout<<s1=s2;
}
O alt funcie care compar dou iruri de caractere, dar numai pentru
primele n caractere, este:
int strncmp(char *s1, char *s2, int n);
116
Tablouri
Exemplul 6.10
Urmtorul program citete un ir de caractere afieaz lungimea lui:
#include <string.h>
#include <iostream.h>
void main()
{
char s[100];
cin.get(s,100);
cout<<sirul <<s<< are <<strlen(s)<< caractere<<endl;
}
Urmtoarele dou funcii sunt folosite pentru a concatena (a aduga la
sfritul primuui ir pe al doilea) dou iruri de caractere.
char *strcat(char *d, char *s);
117
Tablouri
Exemplul 6.12
Un exemplu de folosire a funciei de cutare a unui caracter ntr-un ir
este urmtorul:
#include <string.h>
#include <iostream.h>
void main()
{
char *p=;
p=strchr(Acesta este un test, );
cout<<p<<endl;
}
n urma execuiei acestui program, se va afia este un test.
Funcia strstr() are rolul de a cuta subirul s2 n irul s1 i are forma:
char *strstr(const char *s1, const char *s2);
Tablouri
3. Fie declaraiile:
char a[50];unsigned int i;
tiind c irul de caractere a se termin cu caracterul punct, care din secvenele de mai
jos este echivalent cu funcia strlen()?:
a) i=0;
while (a[i++]!=.) {}
cout<<i;
b) i=0;
while (a[i++]==.) {}
cout<<i;
c) i=0;
if (a[i]==.) cout<<i;
d) if (a[i]!=.) cout<<i;
119
Tablouri
5. Operaia de alipire a dou iruri de caractere poart numele de , iar funcia care
caut un caracter dat ntr-un ir de caractere se numete ....
120
Tablouri
BIBLIOGRAFIE
1. Dorin Stoilescu, Manual de C/C++ - Cap.7 Tablouri i pointeri, Editura Radial,
Galati, 1998.
2. Florin. Munteanu, Traian C. Ionescu, Daniela Saru, Gheorghe Musca, Sergiu
Mihai Dascalu, Programarea calculatoarelor - manual pentru liceele de informatic
- Cap.20 Tablouri i pointeri, Editura Didactic i Pedagogic, Bucureti, 1995.
3. Valeriu Iorga si colectiv, Programare in C/C++. Culegere de probleme, Editura
Niculescu, Bucureti, 2003.
4. Programe de specialitate elaborate de ctre Ministerul Educaiei i Cercetrii pentru
nvmntul preuniversitar
5. Herbert Schildt, C manual complet Cap.4 Tablouri i iruri, Cap.5 Pointeri,
Editura Teora, 2000
6. http://www. cs.umd.edu/users/cml/style/ - ghid privind stilul de programare in
limbajele C si C++.
7. http://www.programmingtutorials.com tutoriale de programare pentru C, C++
precum si pentru alte limbaje.
8. http://www.snippets.org exemple de programe scrise in limbajul C.
121
Tablouri
Aplicaia 6
Aplicaia 7
Total
10 puncte
15puncte
15 puncte
15 puncte
5 puncte declaraii i citiri corecte
5 puncte aflarea celui mai mare divizor comun a 2
15 puncte
numere
5 puncte afiarea rezultatului
5 puncte declaraii corecte
5 puncte determinarea numrului de vocale dintr15 puncte
un cuvnt
5 puncte afiarea rezultatului
5 puncte declaraii corecte
15 puncte 5 puncte eliminarea spaiilor n plus dintre cuvinte
5 puncte afiarea rezultatului
100 puncte
a)
b)
c)
d)
2113
1003
1002
3840
Tablouri
#include <iostream.h>
#include <string.h>
void main()
{ char s[20],t[20];
cout<<s=;cin.get(s,20);
cin.get();
cout<<t=;cin.get(t,20);
d) char *p=s;
while (*p!= ) p++;
strcpy(s,p+1);
123
Pagina
Exemplul 7.1
ifstream f1;
ofstream f2;
fstream h;
Observaii:
1. f1, f2, h sunt variabile de tip fiier ( obiecte de tip clas).
Observaie:
125
// am declarat un stream f3
//l-am asociat fiierului info.in
Observaie:
Deoarece tipul fstream nu are asociat un mod de deschidere implicit, f3 a
fost deschis cu modul ios::in, ca fiier de intrare (numai pentru operaii de
citire).
Exemplul 7.6
fstream f4( info.out, ios::out);
Observaie:
Modul de deschidere specificat este ios::out, ceea ce nseamn c fiierul
este a fost deschis pentru operaii de scriere.
Exemplul 7.7
fstream f5( info.ad, ios::app);
Observaie:
Modul de deschidere specificat este ios::app (append), ceea ce nseamn
c deschidem fiierul ca fiier de ieire, pentru adugare de informaii la
sfrit.
126
Exemplul 7.8
ifstream f1(aplicatie.in);
char c;
f1>>c;
// am citit primul caracter din fiierul f1.
Observaie:
Operatorul >> ignor caracterele albe ( spaiu, tab, enter).
Exemplul 7.9
ifstream f1(aplicatie.in);
char c;
f1.get(c);
/* am citit primul caracter din fiierul f1, indiferent
dac este sau nu character alb, folosind funcia get()*/
127
Barem:
declaraii corecte
citirea corect din fiier
Numrarea caracterelor din fiier
afiarea corect a rezultatului
total
10 puncte
10 puncte
20 puncte
10 puncte
50 puncte
128
187 abc 6 7 8 gg 5 90
187abc678 gg590
187abc678gg590
187 ab c67 8gg 5 90
c)
fstream f;
f.open(test.txt, ios::app);
f<<endl<<ultima linie;
f.close();
b)
fstream f;
f.open(test.txt, ios::app);
f<<ultima linie<<endl;
f.close();
d)
fstream f;
f.open(test.txt, ios::out);
f<<endl<<ultima linie;
f.close();
Exemplul 7.15
void main()
129
{
int x;
ifstream f("NUMERE.TXT");
ofstream g("PARE.TXT");
while(!f.eof())
{ f>>x;
if((x%2)==0) g<<x<<endl; }
f.close();
g.close();
}
Figura 7.2
130
Vezi U7.2, pag 124, U7.3, pag 125, U7.6, pag. 127
Vezi U7.2, pag 124, U7.3, pag 125, U7.6, pag. 127
Bibliografie
4. Cerchez, Emanuela, Informatic. Culegere de probleme pentru liceu,
Editura Polirom, Iai, 2002.
5. Cerchez, Emanuela, erban, Marinel, Programarea n limbajul C-C++
pentru liceu, Cap 3 Fiiere , Editura Polirom, Iai, 2005
25 puncte
Aplicaia 1
25 puncte
Aplicaia 2
25 puncte
Aplicaia 3
25 puncte
Aplicaia 4
Total
100 puncte
131
2. n fiierul lipsa.in exist dispuse pe fiecare linie cte un numr din irul primelor n
(n<100) numere naturale nenule. Excepie face un singur numr care a fost omis. Scrie un
program care determin numrul lips.
Ex: lipsa.in conine 4 1 3 5 si se va afia 2
3. n fiierul numar.in exist pe prima linie un ir cresctor de numere naturale. Citirea din
fiier a unui nou numr este condiionat de obinerea, ca sum de termeni distinci din
fiier, a unui ir de numere consecutive ncepnd cu 1. Determin care este numrul
maxim care se poate obine respectnd regula dat.
Ex: numar.in conine 1, 2, 4, 10, 13, 132, 562, 1200. Se va afia 7, deoarece citirea din
fiier se ncheie odat cu citirea numrului 10. Valoarea 8 nu se poate forma ca sum de
termeni preluai din fiier. Algoritmul verific valorile i valideaz 1, 2, 3(1+2), 4, 5(1+4),
6(2+4), 7(1+2+4).
4. Scrie un program care s testeze dac dou fiiere ale cror nume este cunoscut sunt
identice.
132
Funcii
Cuprins
Pagina
133
Funcii
Atenie!
ntr-un program C / C++ toate prelucrrile sunt organizate sub forma unei
ierarhii de apeluri de funcii, baza ierarhiei fiind funcia principal main().
Pentru a dezvolta i utiliza funcii proprii este necesar s cunoti cum se
definesc, cum se declar i cum se apeleaz funciile.
8.1.1 Definirea unei funcii
n definiia unei funcii ntlnim un antet care conine numele funciei,
tipul rezultatului returnat de funcie i lista parametrilor funciei i un bloc
de instruciuni, care descrie prelucrrile efectuate de funcie.
Forma general a definiiei unei funcii este:
tip nume(lista parametrilor formali)
{
declaratii variabile locale
instructiuni
funciei
}
// antetul funciei
//
blocul
unde:
tip este tipul rezultatului returnat de funcie;
nume este numele funciei;
lista parametrilor formali este alctuit din una sau mai multe declaraii
de parametri cu care funcia opereaz, separate prin virgul. Aceast list
poate fi vid. Parametrii formali se numesc astfel deoarece cu ajutorul lor
voi descrie n mod formal operaiile care se vor efectua cu datele
transmise de programul apelant.
Exemplul 8.1
void suma(int x, int y)
{
cout<<x+y=<<x+y;
}
Observaii:
1. funcia suma are tipul void, adic nu ntoarce un rezultat;
2. parametrii formali sunt de tip intreg.
3. funcia afieaz suma celor dou numere transmite ca parametri de
programul apelant.
134
Funcii
Exemplul 8.2
int suma(int x, int y)
{ int i,s;
s=x
for(i=1;i<=y; i++) s++;
return s;
}
Observaii:
1. funcia suma are tipul intreg i calculeaz suma a dou numere intregi,
transmite ca parametri de programul apelant;
2. variabilele i i s sunt declarate n blocul funciei i se numesc variabile
locale;
3. n blocul funciei intervine instruciunea return. Ea returneaz
programului apelant valoarea variabilei s.
8.1.2 Declararea funciilor
Compilatorul C / C++ va fi informat de existena funciei i a formatului
acesteia odat cu declaraia funciei.
Forma general a declaraiei funciei este:
tip nume( lista parametrilor);
Atenie!
Declaraia unei funcii este alctuit din antetul funciei urmat de caracterul
;, nu de blocul de instruciuni al funciei. De aceea, declaraia funciei se
mai numete i prototip.
Este necesar ca naintea oricrui apel de funcie s apar fie definiia
funciei, fie declaraia funciei.
Atenie!
Un program C / C++ poate conine pentru a funcie o singur definiie, dar
oricte declaraii.
Exemplul 8.3
double sqrt(double);
Observaii:
1. funcia sqrt() are tipul double i returneaz radicalul valorii primite ca
parametru;
2. are prototipul n math.h.
Proiectul pentru nvmntul Rural
135
Funcii
Exemplul 8.4
float calcul(int x, int v[10]);
Observaii:
1. funcia calcul() are tipul real, are doi parametri: unul de tip int i un
tablou de 10 valori de tip int;
2. n declaraia funciei calcul() este specificat numele parametrilor, nu
doar tipul acestora.
unde:
- nume este numele funciei;
136
Funcii
Exemplul 8.5
Fie declaraiile de variabile:
float ma;
int a,b;
Voi putea atribui variabilei ma valoarea mediei aritmetice a numerelor a i
b, apelnd funcia suma() calculat la exemplul 1.2, astfel:
ma= suma(a,b)/2;
Observaii:
1. valoarea parametrului actual a nlocuiete parametrul formal x, iar
valoarea parametrului actual b nlocuiete valoarea parametrului formal
y.
Ce se ntmpl cu parametrii actuali? Unde sunt memorate valorile
lor?
Funciile folosesc o zon de memorie numit stiv (snack) care
funcioneaz pe principiul ultimul intrat este primal ieit (last input, first
output) LIFO.
La apelarea unei funcii, se aloc spaiul de memorie pe stiv pentru
valorile parametrilor actuali. Se realizeaz astfel transferul prin valoare al
parametrilor. La terminarea execuiei funciei, zona de memorie alocat pe
stiv se elibereaz.
Atenie!
Deoarece zona de memorie alocat pentru parametri se elibereaz,
valorile modificate n funcie se pierd.
137
Funcii
Exemplul 8.6
Consider funcia care afieaz valorile a doi parametri intregi x i y:
void afisare(int x, inty)
{
cout<<x=<<x;
cout<< y=<<y<<endl;
x++;
y++;
}
Mai consider declaraiile de variabile:
int a=10, b=75;
Voi constata c secvena de instruciuni:
cout<<a=<<a;
cout<< b=<<b<<endl;
afisare(a,b);
cout<<a=<<a;
cout<< b=<<b<<endl;
afieaz pe ecran:
a=10 b=75
x=10 y=75
a=10 b=75
fr a se ine cont de modificrile valorilor parametrilor x i y n cadrul
funciei.
138
Funcii
139
Funcii
void f1(int a)
{a=20; cout<<a;}
void f2(int &a)
{a=30; cout<<a;}
void main()
{int a=10;
f1(a);cout<<a;
f2(a);cout<<a;
}
a)
b)
c)
d)
10 10 20 30
20 10 30 10
20 10 30 30
20 20 30 30
int f1(int y)
int f2(int x,y)
iostream f3
float f4(char c)
double f5(int x, float y)
3. Indicai care dintre funciile urmtoare returneaz media aritmetic dintre ctul i restul
la mprirea a dou numere ntregi:
a)
int medie(int x,y)
{ return (x/y+x%y)/2;}
b)
float medie(int x, int y)
{ float med;
med=x/y+x%y;
return med/2;}
c)
float medie(int x, int y)
{ return x/y+x%y;}
4. Fie funcia:
void interschimbare(char a, char & b)
{
char aux;
aux=a; a=b; b=aux;
}
Dac x i z sunt dou variabile de tip char ce memoreaz valorile 1 respectiv 2, ce
valori se vor afia dup executarea secvenei de instruciuni:
interschimbare(x,y);
cout<<x<< <<z;
140
Funcii
a) 1 2
b) 2 1
c) 2 2
d) 1 1
a)
b)
c)
d)
e)
1
2
3
4
nici una
Poziie
Clas de memorare
Durata de via
Domeniul de vizibilitate
Variabile locale
Sunt declarate n blocul unei
funcii
Variabile globale
Sunt declarate n exteriorul
oricrei funcii
Zon de memorie: n segmentul
de date al programului. Memoria
Zon de memorie: pe stiv
alocat fiind automat iniializat
cu 0.
Memoria rmne alocat Memoria rmne alocat pn la
pn la sfritul execuiei sfritul execuiei programului.
blocului n care a fost
declarat variabila.
Sunt vizibile din momentul
declarrii
pn
la sfritul
Sunt vizibile numai n blocul programului
n toate funciile
n care au fost declarate.
acestuia, chiar i n alte fiiere
surs, cu excepia cazurilor de
omonimie1.
Cazurile de omonimie i regula de omonimie nu sunt obiect de studiu n cadrul acestui manual. Omonimia
poate fi studiat din alte cri de specialiate npreun cu operatorul de rezoluie ::.
Proiectul pentru nvmntul Rural
141
Funcii
Exemplul 8.8
int n, x[50];
void citire (int n, int x[50])
{
int i;
for(i=1;i<=n;i++) cin>>x[i];}
{
if(s[i]!=s[j]) p=0;
i++;
j--;
}
return p;
}
Stabilete cu care dintre expresiile de mai jos trebuie nlocuite spaiile punctate astfel nct
funcia s ntoarc 1, dac irul s este palindrom, sau 0 dac irul s nu este palindrom.
142
Funcii
a)
b)
c)
d)
i<strlen(s)/2 -1
(i<=j)&&(p==1)
(i!=j)&&(p==1)
i<(strlen(s) -1)/2
a) 10 110
b) 220 110
c) 110 110
d) 220 210
4. Consider x o variabil ntreag a crei valoare este 2. Ce valoare va avea x dup apelul
f(x,x)?
void f(int x, int &y)
{ y+=x; x+=y;}
a) 2
b)6
c) 8
d)4
5. Care dintre urmtoarele funcii returneaz cel mai mare numr natural p cu proprietatea
c 2p<=n.
a)
int f(int n)
{int p=0; a=1;
while(e<=n) { p++;a*=2;}
return p;}
b)
int f(int n)
{int p=0; a=1;
while(e<=n) { p++;a*=2;}
return p-1;}
c)
int f(int n)
{
int p=0; a=1;
while(e<n) { p++;a*=2;}
return p;
}
143
Funcii
Considerm un vector cu n (n<101) componente numere naturale mai mici sau egale cu
30000. Scrie un program care calculeaz i afieaz suma componentelor prime.
Folosete pentru acesta o funcie pentru citirea vectorului i o funcie care verific dac un
numr e prim.
Ex:
Pentru n=5 i numerele 1 4 7 33 5 se afieaz 13.
Barem:
declaraii corecte de variabile
funciei pentru citirea vectorului
funciei pentru verificarea numerelor prime
calcularea sumei
afiarea corect a rezultatului
total
15 puncte
25 puncte
25 puncte
20 puncte
15 puncte
100 puncte
Funcii
145
Funcii
Barem:
5 puncte
25 puncte
25 puncte
25 puncte
10 puncte
10 puncte
100 puncte
8.2
Funcii recursive
O funcie este recursiv dac ea se autoapeleaz. Adic dac apelul su
apare cnd subprogramul este activ. Ea se poate apela fie direct, n
blocul propriu de instruciuni, fie indirect prin apelul n cadrul altor funcii.
Voi analiza nti recursivitatea direct.
Orice autoapelul genereaz o nou activare a aceleiai funcii, care
presupune execuia instruciunilor, ncepnd cu prima instruciune a
funciei i pn la autoapel, cnd se activeaz din nou funcia .a.m.d.
Se poate observa c exist posibilitatea ca partea de nceput a funciei s
se execute de o infinitate de ori. Pentru evitarea acestei situaii este
obligatoriu ca autoapelul s fie legat de ndeplinirea unei condiii. Cnd
condiia de autoapel nu se mai ndeplinete , irul activrilor funciei se
ntrerupe i se vor executa secvenele rmase de efectuat din funciile
activate anterior, n ordine invers.
Propun spre studiu un exemplu matematic simplu: produsul a dou
numere naturale. Dac doresc s construiesc o funcie care s se
autoapeleze, trebuie s-i gasesc un mod recursiv de definire a operaiei
de nmulire a dou numere.
b daca a=1
produs(a,b)=a*b=a+a+a++a=(a-1)*b+b=
b+produs(a-1,b),daca a>1
b ori
Cum pot scrie funcia recursiv care implementeaz acest algoritm?
Consider declaraiile de variabile:
int a,b;
long produs(int a, int b)
{
if(a==1) return b;
else return b+produs( a-1,b)
}
146
Funcii
Figura 8.1
Exemplul 8. 12
Voi scrie un program care citete de la tastatur un numr natural n i apeleaz o
funcie recursiv care returneaz valoarea produsului:
p(n)=1*3*5*(2n+1).
Dac n=0, se va afia p(0)=1, adic 2*0+1, iar dac n=3, se va afisa
p(3)=105, adic 1*3*5*7.
#include<iostream.h>
long p(long x)
{ if(x) return;
else return 1;
}
void main()
{ long n;
do{
cout<<n=;cin>>n;}while(n>=0);
cout<<p(n);
}
Proiectul pentru nvmntul Rural
147
Funcii
Observaii:
1. condiia de ieire din funcie este:x=0. Funcia returneaz valoarea 1
dac x=0.
2. definirea recursiv a funciei este dat de formula (2*x+1)*p(x-1), unde
p(x-1) autoapelul.
Atenie!
Activarea unei funcii recursive presupune, la fel ca n cazul uneia
iterative, alocarea pe stiv a variabilelor locale, a parametrilor i a adresei
de revenire.
Datorit acestui lucru, o soluie recursiv este eficient numai dac
adncimea recursivitii un este mare.
Funcii
definiia recursiv
calculul sumei cerute
corectitudine sintactic a funciei recursive
apelul corect al funciei
afiarea corect a rezultatului
total
40 puncte
15 puncte
15 puncte
15 puncte
15 puncte
100 puncte
149
Funcii
Exemplul 8. 14
Consider funcia recursiv urmtoare:
Int f(int a, int b)
{
if( a>=b) return f(a-b,b)+1;
else return 0;
}
mi propun s scriu o funcie iterativ echivalent cu cea recursiv.
Cum procedez?
Pas 1. Pun n eviden calculul matematic recursiv al funciei date.
0 daca ab
f(a,b)=
1+f(a-b,b) daca ab
Pas 2. pentru a=4 si b=2, avem f(4,2)=1+f(2,2)=1+1+f(0,2)= 1+1+0=2
Pas 3. Observ c algoritmul calculeaz ctul mpririi lui a la b.
Pas 4. Scriu funcia iterativ:
int ff(int a, int b)
{
return a/b;
}
Consider funcia iterativ urmtoare:
int fi(int &x)
{
int t=1;
while (x>0) { x/=2; t++;}
return t;
}
mi propun s scriu o funcie recursiv echivalent cu cea iterativ.
S vedem cum procedez.
Pas 1. pentru x=5, avem:
t
3
4
1
0
Funcii
Pas 3. Scriu funcia recursiv care contorizeaz mpririle ntregi ale lui x
transmis prin adres - la 2.
int f (int &x)
{
if(x)
{ x/=2;
return f(x)+1;
}
else return 1;}
Exemplul 8. 15
Recursivitatea indirect este ilustrat prin urmtorul exemplu (irurile lui Gauss):
Fie an=
an-1+bn-1
2
Figura 8.2
Pentru a, b i n numere naturale date, vreau s calculez termenul n al
irului a i termenul n al irului b.
#include<iostream.h>
// variabile globale
double a,b;
int n;
// declaratia functiei bb
double bb(int n);
// definirea functiei aa; calculeaz termenul n al irului a
double aa(int n)
Proiectul pentru nvmntul Rural
151
Funcii
{if(!n) return a;
else return (aa(n-1)+bb(n-1))/2;
}
Figura 8.3
// definirea functiei bb; calculeaz termenul n al irului b
double bb(int n)
{
if(!n) return b;
else return sqrt(aa(n-1)*bb(n-1));
}
void main()
{
cout<<a<<b<<n;
cout<< aa(n);
}
Observaii:
1. declaraia funciei bb() trebuie s precead apelul su;
2. funcia principal main() apeleaz numai funcia aa(), cu care se
pornete la efectuarea calculului termenilor irului.
152
Funcii
Atenie!
Avantaje i dezavantaje ale recursivitii:
- avantajul recursivitii este acela c reduce drastic lungimea textului
surs al programului. De aceea soluiile recursive sunt mai clare dect
cele iterative.
- recursivitatea este o soluie avantajoas n cazul problemelor complexe,
n acelea n care datele sunt definite recursiv, sau n probleme ale cror
soluii pot fi definite n termeni recursivi.
- utilizarea tehnicilor recursive nu conduce ntotdeauna la soluii optime.
Trebuie aleas varianta (interativ - recursiv) avantajoas pentru cazul
analizat.
- folosirea recursivitii, mai ales a celei indirecte, poate genera dificulti
deosebite n depanarea programelor.
else for(i=2;i<=sqrt(nr);i++)
if(nr%i==0) p=0;
return p;}
int n;
void citire (int n, int a[100])
{int i;
for(i=1;i<=n;i++) cin>>a[i];}
int prim(int nr)
{int i,p;
p=1;
if((nr==0)||(nr==1)) p=0;
void main()
{ int a[100],n;
long sum;
cin>>n;
citire(n,a);
sum=0;
for(int i=1;i<=n;i++)
if(prim(a[i]))sum+=a[i];
cout<<"suma este "<<sum;
}
153
Funcii
{int i,j,nc=0;
for(i=1;i<=na;i++)
for(j=1;j<=nb;j++)
if(a[i]==b[j]){nc++;break;}
return nc;
}
void main()
{ int na, nb, nc;
cout<<" cardinalul multimii A";cin>>na;
citire(na,a);
cout<<" cardinalul multimii B";cin>>nb;
citire(nb,b);
cout<<"cardinal
reuniune:"<<reuniune(na,a,nb,b);
cout<<"cardinal
intersectie:"<<intersectie(na,a,nb,b);
}
154
void main()
{
long n;
cout<<n=;cin>>n;
cout<<s(n);
}
Funcii
Bibliografie
1. Herbert Schildt, C manual complet, Cap - Funcii C, Editura Teora, 2000
2. http://www. cs.umd.edu/users/cml/style/ - ghid privind stilul de programare in limbajele
C si C++.
3. http://www.programmingtutorials.com tutoriale de programare pentru C, C++ precum
si pentru alte limbaje.
4. http://www.snippets.org exemple de programe scrise in limbajul C.
155
Funcii
Aplicaia 6
Aplicaia 7
Aplicaia 8
Total
5 puncte
5 puncte
5 puncte
5 puncte
25 puncte
Funcii
A
A
A
A
/
/
/
/
b)3
c)4
d)10
4. Consider funcia:
int expresie(long k)
{ if (k==0) return 1;
else if( k%10!=0) return expresie(k/10)*(k%10);
else expresie(k/10);
}
Care va fi valoarea expresiei: expresie(192)+expresie(2005) ?
a) 28
b)18
c)8
d)2
5. n fiierul numere.in se afl numere cu cel mult 10 cifre fiecare. Pe aceeai linie
numerele sunt separate prin cte un spaiu. Scrie un program care creaz un fiier
numere.out cu urmtorul coninut:
- pe prima linie numrul de numere din fiierul numere.in;
- pe a doua linie numrul de numere din fiierul numere.in care au exact 3 cifre;
- pe a treia linie cel mai mare numr din fiierul numere.in.
Ex:
Fiierul numere.in conine:
12 34 567
1223456 89 789 90 89
13
56 7890
Fiierul numere.out conine:
11
2
1223456
157
Funcii
158
Anexe Laboratorul 1
ANEXE
Laboratorul 1
n cadrul acestui laborator v vei familiariza cu calculatorul i cu mediul
de lucru al limbajului C/C++; de asemenea, va trebui s efectuai un
instructaj pentru protecia muncii n cadrul laboratorului.
n continuare v este prezentat un exemplu de aplicaie din cadrul
Capitolului 2, rezolvat prin reprezentarea algoritmului prin schem logic;
reprezentarea prin pseodocod v revine vou.
Avei posibilitatea s v verificai temele de autoevaluare 2, 3 i 4 din
Capitolul 2
Exemplul 2.5
S se realizeze schema logic pentru evaluarea expresiei:
A2 B,c < 0
E= A 2 B , c = 0
1 B,c > 0
A 2
Schema logic a acestei probleme se afl pe pagina urmtoare.
159
Anexe Laboratorul 1
START
CITESTE A,B,C
DA
NU
C<0
NU
DA
C=0
E=A2-B
NU
AFISEAZA
E
Afiseaza
Expesia nu
are sens
NU
E=
1
A2
A=0
DA
A2-B>=0
E= A2 B
AFISEAZA
E
AFISEAZA
E
Afiseaza
Expesia nu
are sens
STOP
160
Anexe Laboratorul 1
2. Perimetrul unui ptrat este egal cu latura altui ptrat. tiind c suma perimetrelor este x, s se
calculeze ariile celor dou ptrate.
Perimetrul P1=4 L1
P1=L2 i P2=4 L2 4 L1 = L2
P1 + P2 = x 4 L1 + 4 L2 = x 5 L2 =x L2=x/5 i L1= L2/4. adic L1=x/20
Deci A1 = L12 = (x/20)2 i A2 = L22 = (x/5)2
n acest caz, algoritmul poate fi scris astfel:
real x, L1, L2, A1, A2
citete x
L2=x/5
L1=L2/4
A1=L1*L1
A2=L2*L2
scrie A1, A2
sau aa:
real x, A1, A2
citete x
A1=(x/20)*(x/20)
A2=(x/5)*(x/5)
scrie A1, A2
161
Anexe Laboratorul 1
aux
b, c, d, a
d, a, b, c
Problema este asemntoare cu cea anterioar; iat o secven din rezolvarea celui de-al doilea
subpunct:
..........
aux=a
a=d
d=c
c=b
b=aux
ax + by = p
cx + dy = q
S se scrie algoritmul de rezolvare a sistemului de ecuaii.
Problema trebuie analizat i rezolvat din punct de vedere matematic:
x =
y =
162
pd bq
ad bc
aq cp
ad bc
daca ad bc 0
Anexe Laboratorul 1
n cazul n care numitorul fraciilor este egal cu zero, cele dou ecuaii reprezentate grafic vor fi
dou drepte paralele sau confundate; primul caz are loc dac pd-bq0 i n aceast situaie
sistemul nu are nici o soluie este incompatibil iar n caz contrar are o infinitate de soluii este
nedeterminat iar soluiile vor fi mulimea punctelor situate pe cele dou drepte confundate.
2. S se scrie algoritmul de rezolvare a urmtoarei probleme: acum este ora h1, minutul m1 i
secunda s1. Ct va fi ceasul peste h2 ore, m2 minute i s2 secunde? Rezultatul va fi reprezentat
tot n ore, minute i secunde.
Trebuie inut cont de faptul c 1min=60 secunde, 1h=60 min i o zi are 24 de ore. Astfel, dac
suma secundelor depete valoarea 60, atunci nseamn c 60 secunde vor da 1 minut. La fel se
ntmpl i n cazul minutelor, dac suma lor este mai mare dec 60, va fi o or n plus. De fiecare
dat va trebui s scdem cele 60 de uniti care au fost transformate ntr-o unitate de rang
superior.
Reprezentarea m pseudocod a acestei secvene de algoritm poate fi:
dac s1+s2>=60 atunci
s=s1+s2-60
m1=m1+1
altfel
s=s1+s2
dac m1+m2>=60 atunci
m=m1+m2-60
h1=h1+1
altfel
m=m1+m2
dac h1+h2>=24 atunci
h=h1+h2-24
altfel
h=h1+h2
163
Anexe Laboratorul 1
b=aux
dac b>c atunci
aux=b
b=c
c=aux
dac a>b atunci
aux=a
a=b
b=aux
2 x + 3 daca a b > 0
E ( x ) = x 3 2 x + 7 daca a b < 0
x 2 5 daca a b = 0
Indicaie: Dup citirea valorilor pentru a, b i x trebuie evaluat valoarea produaului a*b,
comparat cu zero i calculat valoarea lui E n funcie de semnul acestui produs;sunt suficiente
dou structuri alternative
5. Dndu-se a, b i c, coeficienii unei ecuaii de gradul doi, s se determine semnul rdcinilor
ecuaiei, dac exist, fr a se rezolva ecuaia (innd cont de valorile lui , P i S).
Indicaie: Dac a este diferit de zero i este pozitiv, atunci ecuaia admite dou soluii reale i se
poate trece la analiza semnelor rdcinilor ecuaiei. Pentru aceasta se determin semnul
produsului (P=c/a); dac acesta este pozitiv, soluiile vor avea caelai semn, ce va fi determinat de
semnul sumei lor (S=-b/a)
Testul de autoevaluare 2.4
1. S se scrie algoritmul pentru calcularea sumei primelor n numere naturale impare, unde n este
un numr natural strict pozitiv, dat.
Trebuie calculat suma: S = 1 + 3 + 5 + + (2n 1) =
(2k 1)
n N
k =1
Problema seamn foarte mult cu cea referitoare la calcularea sumei primelor n numere naturale,
cu deosebirea c pasul de incrementare al variabilei de tip contor este 2 (Ex. 2.8)
intregi n, k, s
citete n
k=1
s=0
repet
s=s+i
k=k+2
pn_cnd k>2n-1
scrie s
stop
164
Anexe Laboratorul 1
trebuie calculat mai nti suma acestora i, n acelai timp, numrndu-se cte valori au fost
introduse n sum. Media lor aritmetic va fi egal cu suma acestora mprit la numrul de valori
introduse n sum. Atenie! Dac aceast valoare este zero, nu avem voie s facem
mprirea!
Pentru calcularea sumei, respectiv produsuului, se va proceda ca n exemplele prezentate. Pentru
testarea paritii unui numr este folosit simbolul %, ce reprezint operatorul pentru determinarea
restului la mprirea a dou numere ntregi.
real medie
ntreg x, n, S, P
citete x
n=0
S=0
P=1
cat_timp x 0 execut
daca x%2=0 atunci
S=S+x
n=n+1
altfel
P =P * x
citete x
x este par
dac n 0 atunci
medie=S/n
scrie medie
altfel
scrie Nu au fost introduse numere pare
dac P 1 atunci
scrie P
altfel scrie Nu au fost introduse numere impare sau 1
stop
poziie par
dac n 0 atunci
scrie S, P
Proiectul pentru nvmntul Rural
165
Anexe Laboratorul 1
altfel
stop
1
1
1
+
++
n(n + 1)
1 2 2 3
2
4
2n
E2 =
+
++
(2n 1)(2n + 1)
1 3 3 5
E1 =
Trebuie analizat cu atenie fiecare expresie i determinat forma general a unui termen al
sumei, asemntor ca la prima problem. n cadrul primei expresii, termenul general este dat de:
1
k {1, n} ,
k (k + 1)
iar pentru cea de-a doua expresie este:
2k
k {1, n}
(2k 1)(2k + 1)
k =1
n
1
i E 2 =
k (k + 1)
k =1
2k
(2k 1)(2k + 1)
sau
E2=0
sau E2=E2+2*i/((2*i-1)*(2*i+1))
sau scie E2
Pentru determinarea lui S n este necesar cunoaterea valorilor sumelor de ordin n-1 , respectiv n2. Asta nseamn c la nceput trebuie cunoscute valorile lui S1 = b / a i S 2 = S12 2 * c / a , din
care se poate calcula valoarea lui S3, din sumele S2 i S3 se poate calcula S4 , i aa mai departe.
n implementarea acestui algoritm sunt necesare trei variabile pentru sume, i anume S1, S2 i S;
la un moment dat, din valorile lui S1 i S2, folosind relaia matematic de recuren pentru calculul
lui Sn, se obine o nou valoare pentru S, se incrementeaz contorul ce ine evidena numrului de
ordine al sumei calculate i se determin noile valori pentru S1 i S2: S1 preia valoarea lui S2, S2
pe a lui S, i se poate trece la un nou pas n determinarea sumei cerute
166
Anexe Laboratorul 1
real S1, S2, a, b, c
intreg n,i
citete a, b, c
citete n
S1=-b/a
S2 = S1*S1-*c/a
pentru i=3, n execut
S= -c/a*S1 b/a*S2
S1= S2
S2= S
scrie S
stop
167
Anexe Laboratorul 2
Laboratorul 2
3.6.4 Operatori logici pe bii
Posibilitatea utilizrii operatorilor pe bii ofer limbajului C faciliti
asemntoare cu cele ale limbajelor de asamblare.
Operatorii de prelucrare la nivel de bit sunt:
&
I
|
SAU
^
SAU exclusiv
~
NEGARE
>>
Deplasare dreapta
<<
Deplasare stnga
Cu excepia operatorului ~ care este un operator unar, ceilali operatori
sunt binari. Operanzii pot avea numai tipuri ntregi.
Operatorul & I pe bii are sintaxa:
expr1 & expr2
n urma folosirii acestui operator, biii pe poziii egale din cele dou
expresii care au valoarea 1 vor determina aceeai valoare 1 pe bitul
de pe aceeai poziie din rezultat; Pentru celelalte cazuri, biii rezultatului
vor lua valoarea 0.
Exemplul 3.20
Cel de-al optulea bit este n general bitul de paritate. Pentru ca acestuia
s i se dea valoarea zero, se face I logic pe bii ntre acest octet i unul
n care biii de la 1 la 7 sunt egali cu 1, iar al optulea este zero, adic
numrul 127. Expresia ch & 127 semnific aplicarea unui I biilor din ch
cu biii care alctuiesc numrul 127. Rezultatul este acela c al optulea bit
din ch este stabilit la zero. Presupunem c ch a primit ca valoare
caracterul A i avea stabilit bitul de paritate:
Bit de paritate
11000001
01111111
01000001
A fr paritate
&
Operatorul | SAU pe bii are sintaxa:
expr1 | expr2
n urma folosirii acestui operator, biii pe poziii egale din cele dou
expresii care au valoarea 0 vor determina aceeai valoare 0 pe bitul
de pe aceeai poziie din rezultat; Pentru celelalte cazuri, biii rezultatului
vor lua valoarea 1.
168
Anexe Laboratorul 3
Exemplul 3.21
Operatorul SAU logic pe bii poate fi folosit pentru a stabili valoarea unui
bit. Orice bit cu valoarea 1 dintr-unul din operanzi determin ca bitul
corespunztor din rezultat s fie setat la 1. De exemplu, iat operaia
128 | 3:
10000000
128 n binar
00000011
3 n binar
|
10000011
rezultatul lui SAU pe bii
Operatorul ^ SAU EXCLUSIV pe bii are sintaxa:
expr1 ^ expr2
n urma folosirii acestui operator, biii pe poziii egale din cele dou
expresii care au valoari diferite vor determina valoarea 1 pe bitul de pe
aceeai poziie din rezultat; Dac biii sunt egali, biii rezultatului vor lua
valoarea 0.
Exemplul 3.22
Operatorul SAU exclusiv, ntlnit i sub denumirea de XOR, acioneaz
asupra unui bit dac i numai dac biii respectivi sunt diferii. De exemplu,
127^120 este:
01111111
127 n binar
01111000
120 n binar
^
00000111
rezultatul lui XOR pe bii
Operatorul ~ NEGAIE pe bii are sintaxa:
~a
i face ca pe toate poziiile folosite la stocarea valorii expresiei a s aib
loc complementarea biilor fa de 1.
Exemplul 3.23
Fie numrul 120; s aplicm operatorul de negare pe bii pentru acest
numr:
01111000
120 n binar
~
10000111
rezultatul negrii pe bii 135
Se poate observa c suma dintre un numr i negatul su pe bii este
ntotdeauna 255=28-1=111111112.
Operatorii <<, respectiv >>, sunt numii operatori de deplasare la stnga,
respectiv la dreapta. Ei au sintaxa:
a<<n
a>>n
i sunt echivaleni nmulirii, respectiv mpririi ntregi cu 2n.
Proiectul pentru nvmntul Rural
169
Anexe Laboratorul 2
Fie biii b1 i b2. Conform celor spuse mai sus, rezultatele principalelor
operaii pe bii sunt:
Tabel
ul 3.4
Exemplul
3.24
b1
0
0
1
1
b2
0
1
0
1
b1&b2
0
0
0
1
b1^b2
0
1
1
0
b1|b2
0
1
1
1
~b1
1
1
0
0
170
Anexe Laboratorul 3
Laboratorul 3
4. 4 Funcii de citire/scriere caractere
Funcia getchar() are forma general
int getchar(void);
i are rolul de a citi din stdin un caracter, citirea terminndu-se la
apsarea tastei enter.
Cuvntul cheie void are semnificaia c lista parametrilor de apel este
vid.
Pentru scrierea unui caracter se folosete funcia putchar(). Sintaxa
acestei funcii este:
int putchar(int);
Dei sunt tratate caractere, se poate observa c parametrul de intrare al
acestei funcii este de tip int, avnd loc o conversie implicit a caracterului
n ntreg (valoarea codului ASCII al caracterului respectiv).
Exemplul 4.8
Se citete un caracter de la tastatur, care apoi se va tipri
char a;
a=getchar();
putchar(a);
Aceast secven este echivalent cu urmtoarea:
putchar(getchar());
Trecerea cursorului pe un rnd nou se poate face i astfel:
putchar(\n);
de fapt se afieaz secvena escape \ncorespunztoare pentru new line.
O alt funcie de intrare este getche() (get character with echo) care
permite preluarea caracterelor imediat ce au fost tastate, fr a mai apsa
tasta enter. Caracterul tastat este afiat pe ecran n ecou. O funcie
asemntoare este getch(), care nu mai afieaz caracterul tastat (fr
ecou). Aceste dou funcii aparin bibliotecii de funcii conio.h (console
input/output).
Exemplul 4.9
main()
{
char ch;
printf(Tasteaza un caracter: );
ch=getche();
Proiectul pentru nvmntul Rural
171
Anexe Laboratorul 3
Anexe Laboratorul 3
173
Anexe Laboratorul 3
Exemplul 4.12
a) S se citeasc un ir de maxim 5 caractere.
char s[10];
cin.get(s,6);
cout<<s;
De exemplu, dac se tasteaz cuvntul calculator i apoi se apas tasta
Enter, va fi afiat calcu.
b) S se citeasc un ir de maxim 10 caractere, cu oprirea citirii la
ntlnirea caracterului t,
char s[11];
cin.get(s,11,t);
cout<<s;
n acest caz, programul va afia cuvntul calcula.
Atenie! Dac se utilizeaz de mai multe ori funcia cin.get() cu trei
parametri, citirea nu se efectueaz corect datorit interpretrii caracterului
corespunztor tastei Enter, care rmne n memoria tampon a
calculatorului drept terminare de ir,i, prin urmare al doilea ir de
caractere nu mai este citit. Aceast problem se poate soluiona prin
folosirea unei funcii cin.get() fr parametri, dup una cu parametri,
pentru a se goli memoria tampon.
Exemplul 4.13
S se citeasc numele i prenumele unei persoane, folosindu-se pentru
fiecare din ele cte un ir de caractere.
#include <iostream.h>
#include <string.h>
main()
{
char nume[20], pren[30];
cout<<Dati numele: ;
cin.get(nume,20);
cin.get();
cout<<Dati prenumele: ;
cin.get(pren,30);
cout<<nume<< <<pren;
}
Pentru a v convinge de cele artate mai sus, executai programul de mai
sus i n situaia n care lipsete instruciunea de citire fr parametri i
comparai cele dou soluii.
174
Anexe Laboratorul 3
175
Anexe Laboratorul 4
Laboratorul 4
Exemplul 5.5
Se citesc a,b,c coeficienii reali ai ecuaiei de gradul II ax2+ bx+c=0. Se
cere s se scrie un program care s rezolve ecuaia.
Varianta 2:
# include<iostream.h>
# include<math.h>
void main()
{
float a,b,c,d;
cout<<"a=";cin>>a;
cout<<"b=";cin>>b;
cout<<"c=";cin>>c;
a?d=b*b-4*a*c,
d>=0?cout<<"x1="<<(-b+sqrt(d))/(2*a)<<"\n"<<"x2="<<(-b-sqrt(d))/(2*a):
cout<<" nu are solutii reale":
b?cout<<"x="<<(-c/b):
c?cout<<"ecuatia nu are solutii": cout<<"infinitate de solutii";
}
Observaii:
Pentru a rula programul implementat in mediul limbajului C / C++ se
tasteaz CTRL+F9. Dac sunt erori de sintax, apare un mesaj de eroare,
iar cursorul este poziionat n zona n care se presupune c exist
eroarea.
n acest caz, se efectueaz corecia necesar i se ncearc, din nou,
rularea programului (CTRL+F9).
n cazul n care nu avem erori se execut programul. Rezultatele apar
scrise in fereastra utilizator (user screen).
Dac se lucreaz sub DOS, pentru vizualizarea rezultatelor se tasteaz
ALT+F5. n acest caz, revenirea n fereastra textului surs se face prin
apasarea tastei Enter sau ALT+F5.
176
Anexe Laboratorul 4
177
Anexe Laboratorul 4
Exemplul 5.10
Problema Gard
Olimpiada Judeean de Informatic pentru Gimnaziu 2003, clasa a VI-a
178
Anexe Laboratorul 4
179
Anexe Laboratorul 4
180
2
Proiectul pentru nvmntul Rural
Anexe Laboratorul 4
b)
#include< iostream.h>
void main()
{
int a,b, nr=0, i;
cout<< a=;cin>>a;
cout<< b=;cin>>b;
i=a; nr=0;
if (i<=b) do{ if (i%2==0) nr++; i++; } while (i<=b);
cout<<nr=<<nr;
}
c) n variabila nr numrm valorile pare din intervalul [a,b].
Lucrare practic 5.1
1.
Soluie: algoritmul realizeaz numrarea apariiilor fiecrei cifre n ordine descresctoare de la 9 la
0 i afiarea succesiv a acestora.
# include <iostream.h>
main()
{ long nr, a, I, aparitie, j;
cin>>nr;
for(j=9;j>=0;j--)
{ a=nr;
aparitie=0;
do{
if(a%10==j aparitie++;
a/=10;
}while (a>0);
for (i=1;i<=aparitie;i++) cout<<j;
}
}
2.
Soluie: voi determina cel mai mare divizor comun dintre primul numr i al doilea, apoi cel mai
mare divizor dintre numrul obinut i al treilea, .a.m.d.
#include<iostream.h>
void main()
{long n,x,a,b,d,i;
cout<<n=; cin>>n;
cin>>x;
d=x;
for(i=2;i<=n;i++)
{ cin>>x;
a=d; b=x;
while(a!=b)
if(a>b) a-=b;
else b-=a;
d=a;
}
cout<<c.m.m.d.c=<<d;
}
181
Anexe Laboratorul 4
3.
Soluie: voi determina succesiv cifrele cele mai semnificative ale numerelor din ir, prin mprirea
la 10, pn cnd se ajunge la valori mai mici sau egale cu 9. Cu aceste cifre voi forma un numr
nou i apoi voi verifica dac este palindrom.
#include< iostream.h>
void main()
{
long a,b,c,n,x,i;
cin>>n; a=0;
for(i=1;i<=n;i++)
{ cin>>x;
while (x>9) x/=10;
a=a*10+x;
}
b=a; c=0;
while( b!=0)
{ c=c*10+b%10;
b/=10;
}
if(c==a) cout<<a<< este palindrom; else cout<<a<< nu este palindrom;
}
182
Anexe Laboratorul 5
Laboratorul 5
Exemplul 6.4
Se consider un vector cu n componente numere ntregi, ordonate
cresctor i un numr ntreg x. S se determine dac acest numr se afl
printre componentele vectorului, iar n caz afirmativ, poziia sa n vector.
Pentru acest exemplu s-ar putea folosi ca metod de rezolvare algoritmul
prezentat n cazul exemplului 6.2, dar nu ar fi o metod eficient,
deoarece nu se ine cont de faptul c vectorul este deja ordonat cresctor;
prin urmare, cnd numrul x este comparat cu un element din vector a[i],
se pot lua mai multe decizii; dac numrul x este egal cu a[i], atunci se
poate spune c numrul se afl n vector pe poziia i; dac x este mai mic
dect a[i], se poate deduce c acesta se poate afla pe poziiile mai mici
dect i, respectiv pe poziiile mai mari dect i, n caz contrar.
n continuare este prezentat algoritmul cutrii binare, care rspunde
cerinelor acestei probleme.
main()
{int a[20], n, i, x, gata=0, li, ls, m;
....................................
li=0; ls=n-1;
while (!gata && li<=ls)
{
m=(li+ls)/2;
if (x==a[m])
gata=1;
else
if(x<a[m])
ls=m-1];
else
li=m+1;
}
if (gata)
printf(%d se afla pe pozitia %d in vector.\n,x,m);
else
printf(%d nu se afla in vector.\n,x);
}
n rezolvarea acestei probleme au fost folosite urmtoarele variabile de
lucru: li i ls, reprezentnd limita inferioar, respectiv superioar ntre care
se efectueaz cutarea la un moment dat n vector; m reprezint mijlocul
intervalului de cutare, fiind egal cu media aritmetic a capetelor acestuia;
gata este o variabil necesar sesizrii momentului n care a fost gsit
valoarea cutat n vector i opririi acestei cutri.
Pentru nceput, valorile limitelor inferioare i superioare sunt iniializate cu
zero, respectiv n-1, capetele vectorului, iar gata este iniializat cu zero.
183
Anexe Laboratorul 5
2.
184
Anexe Laboratorul 5
3.
Aritmetica pointerilor
Operaiile aritmetice permise asupra pointerilor sunt: adunarea/scderea
unei constante, incrementarea/decrementarea i scderea a doi pointeri
de acelai tip. De asemenea, acestora li se pot aplica operatorii relaionali
(pot fi comparate adrese de variabile chiar de tip diferit).
Prin definiie, adunarea lui 1 la un pointer face ca el s indice urmtorul
obiect de acelai tip, aflat n memorie la adrese succesive. Scderea lui
1 dintr-un pointer face ca el s indice obiectul imediat anterior n spaiul de
memorie. Aceleai reguli se aplic la operatorii ++ i --.
De exemplu, avnd declaraiile:
int *pi; float *pf;
*(pi+1) este urmtorul ntreg de dup *pi, iar *(pf-1) este numrul real
aflat imediat naintea lui *pf. Similar *(pi+i) va reprezenta al i-lea ntreg
succesiv din memorie, de dup adresa pi. De remarcat c ceea ce se
adun efectiv este sizeof(int), respectiv sizeof(float).
Semnificaia pointerilor poate fi alterat prin conversia explicit de tip
(cast). Astfel, n exemplul de mai sus, expresiile:
*((char*)pf)
i
*(((char*)pf)+1)
vor furniza primul i, respectiv al doilea octet din reprezentarea unei
variabile de tip float. Tipul expresiei (char*)pf este char* i adunarea lui 1
la aceast expresie va avansa pe pf cu un octet.
Atribuirile de pointeri trebuie s se fac ntre pointeri (sau expresii) de
acelai tip. Se poate folosi conversia explicit de tip, n cazul unor pointeri
de tip diferit. Acest lucru trebuie evitat pentru a nu se realiza atribuiri
defectuoase.
Aritmetica unui pointer (adunri/scderi de constante) este garantat n
standardul ANSI C a funciona corect numai dac pointerul se menine
ntre limitele unui tablou declarat de variabile.
n ceea ce privete scderea a doi pointeri, standardul ANSI C permite
aceast operaie numai ntre pointeri de acelai tip, care s indice
elemente ale aceluiai tablou. Dac p i q sunt doi pointeri de tip T*,
respectnd aceste condiii i p indic un element al tabloului aflat n
memorie dup q (adic la o adres mai mare), atunci diferena p-q
reprezint numrul de obiecte de tip T aflate ntre p i q.
n aceleai condiii ca la scdere, se pot face comparaii cu operatorii: ==,
!=, <, <=, >, >=. Prin definiie, p>q este 1, dac se poate face diferena p-q
(conform restriciilor de mai sus) i aceast diferen este pozitiv. Este
Proiectul pentru nvmntul Rural
185
Anexe Laboratorul 5
Figura 6.2
Comparai bucla for din acest exerciiu cu bucla for obinuit de tiprire a
elementelor tabloului a, mpreun cu adresele acestor elemente:
long a[10]={10, 11, 12, 13, 14, 15, 16, 17, 18, 19};
long i;
for (i=0;i<10;i++)
printf("Adresa: %p Elementul: %ld\n",&a[i], a[i]);
Anexe Laboratorul 5
D. *pi= 1;
E. pi++;
2. Ce se tiprete n urma executrii secvenei de mai jos?
int a=5; *&a=7;
printf(%d,a);
B. 5
C. eroare de sintax
D. 7
3. Ce se tiprete n urma executrii secvenei de mai jos?
int a=0x120f;
printf(%d,*((char*)&a+1));
A. 18
B. 12
C. 15
4. Ce se tiprete n urma executrii secvenei de mai jos?
int a=0x120f;
printf(%d,*((char*)&a)+1);
A. 16
B. 0x
C. 19
5. Tiprii coninutul n hexazecimal al octetului cel mai semnificativ al unei variabile de tip
long int.
187
Anexe Laboratorul 5
188
Anexe Laboratorul 6
Laboratorul 6
Exemplul 7.13
S considerm urmtorul program:
#include<fstream.h>
#include<string.h>
void main()
{fstream f;
char s[15], t[15];
f.open("test.txt",ios::in);
// f este deschis pentru citire
while(f.getline(s,15))
//se citeste cte o linie din fisier si se retine in s
strcpy(t,s);
// sirul s se copiaza in t
cout<<t;
f.close();
}
tiind c lungimea maxim a unei linii din fiierului test.txt este 15, s
verificm ce afieaz programul de mai sus.
Figura 7.1
Observaii:
1. Fiierul surs nu este denumit! Fiierul test.txt a fost construit
naintea rulrii fiierului surs, prin deschiderea unei ferestre noi,
scrierea coninutului fiierului i salvarea acestuia n directorul curent,
cu extensia txt.
Proiectul pentru nvmntul Rural
189
Anexe Laboratorul 6
2. n figura 7.1 se observ c s-a afiat ultima linie din fiier. n realitate
programul afieaz caracterul de sfrit de fiier care, n aceast
situaie este dup cuvntul fiiere.
Exemplul 7.14
Se dau dou fiiere f1 i f2. S se concateneze cele dou fiiere date, iar
rezultatul s fie fiierul f3.
#include<fstream.h>
void main()
{
char c;
ifstream f1("fis1.txt");
ifstream f2("fis2.txt");
ofstream f3("fis3.txt");
while (!f1.eof())
{f1.get(c); f3<<c;}
//f1.open("fis1.txt",ios::in);
//f2.open("fis2.txt",ios::in);
//f3.open("fis3.txt",ios::out);
/* se citeste cte un
caracter din f1 si se scrie
in f3 */
f1.close();
while (!f2.eof())
{f2.get(c); f3<<c;}
/* se citeste un caracter
din f2 si se scrie in f3 */
190
Anexe Laboratorul 6
f2.close(); f3.close();
}
Observaii:
1. Programul este pur didactic. Sunt evideniate modurile de:
deschiderea fiierelor;
detectarea sfritului de fiier pentru fiecare fiier n parte;
citirea cte unui caracter dintr-un fiier i scrierea lui n alt fiier,
operaie repetat pn la ntlnirea caracterului de sfrit de fiier
pentru fiierul de intrare;
inchiderea fiierelor.
2. Programul se poate modifica cu uurin prin adaugarea coninutului
fiierului f2 la sfritul fiierului f1, dac dorim concatenarea lui f2 la f1,
sau invers.
3. n figura 1.2 se observ n fiierul fis3.txt existena unor caractere cu
rou, care reprezint sfritul fiierelor f1 i f2.
Figura 7.2
191
Anexe Laboratorul 6
2. Profesorul a dat celor n (n natural) elevi ai si s realizeze cte un fiier text care s
conin informaii despre modul de via al vieuitoarelor i le-a spus s salveze lucrrile
cu numele: capitolul1.txt, capitolul2.txt, ..., capitoluln.txt. Scrie o aplicaie care s
concateneze aceste fiiere n stream-ul ecosisteme.txt.
4. Se citete din fiierul elevi.in situaia la nvtur a fiecrui elev. Pe liniile impare se
gsesc numele i prenumele elevilor. Pe cele pare se gsesc numere separate prin spaii,
astfel: primul numr reprezint clasa (ex: 5 sau 8), apoi se regsesc mediile pe discipline.
S se calculeze i s se afieze media general a fiecrui elev; n cazul n care elevul este
corigent se va afia numrul disciplinelor cu corigent.
192
Anexe Laboratorul 7
Laboratorul 7
Exemplul 8.9
Consider un vector a cu n componente (a[1], a[2], a[3], , a[n]). mi
propun s calculez suma a[1]! + a[2]! + +a[n], folosind:
- o funie pentru citirea vectorului a;
- o funcie pentru calculul k! , unde k! = 1*2*3**K;
- o funcie pentru calculul sumei componentelor unui vector.
Ex:
Pentru n=4, vectorul: 4, 1, 3, 2, se va afisa 33.
Numerele a[1], a[2], a[n] i suma factorialelor nu depesc tipul long.
De aceea funciile corespunztoare factorial, respectiv suma vor fi de
acest tip.
#include <iostream.h>
int n;
/* n este o variabil global, recunoscut n toate funciile programului*/
void citire (int n, long a[100])
{
int i;
for(i=1;i<=n;i++) cin>>a[i];}
/* pentru calculul sumei componentelor vectorului, se parcurg elementele
pe rnd i se introduc n sum.*/
long suma (int n, long a[100])
{
int i; long s=0;
for(i=1;i<=n;i++) s+=a[i];
return s;
}
/* pentru calculul factorialului, voi iniializa variabila f cu valoarea 1
(elementul neutru la nmulire) i voi calcula n f produsul 1*2*3**k */
long factorial (int k)
{
int i; long f=1;
for(i=1;i<=k;i++) f*=i;
return i;
}
193
Anexe Laboratorul 7
Exemplul 8.10
Consider un numr natural nenul n (n<21). Vreau s construiesc o
matrice ptratic a=(aij)i,j=1,,n , unde aij este al i+j lea numr prim, apoi,
pentru un x cifr citit de la tastatur s afiez toate elementele matricei
care au k cifre distincte. Voi folosi:
- o funcie care verific dac un numr este prim;
- o funcie care returneaz al k-lea numr prim;
- o funcie care returneaz numrul de cifre distincte ale unui numr
natural.
Ex:
Pentru n=3 si k=2 se va afisa:
3 5 7
5 7 11
7 11 13
13
194
Anexe Laboratorul 7
#include<iostream.h>
#include<math.h>
int a[21] [21],n,x,k;
/* functia prim verifica daca parametru sau este prim
si returneaza 1 daca este prim, 0 altfel*/
int prim (int k)
{
int i;
for(i=2;i<=k/2;i++) if(k%i==0) return 0;
return 1;
}
/* functia n_prim returneaza a x-lea numar prim;
pentru aceasta apeleaza functia prim() */
int n_prim(int k)
{int p,nr;
p=2; nr=0;
while(nr<k){ if(prim(p))nr++;
p++;
}
return p-1;
}
Proiectul pentru nvmntul Rural
195
Anexe Laboratorul 7
196
Anexe Laboratorul 7
197
Anexe Laboratorul 7
198
Anexe Laboratorul 7
199
Anexe Laboratorul 7
{
int a[10][10],n,m;
cin>>n>>m;
citiremat(a,0,0,n,m);}
2. Soluie:
# include<iostream.h>
long x[10], z[10];
int i,n;
int citire(long x[10])
{
int i,d;
cin>>d;
for(i=1;i<=d;i++) cin>>x[i];
return d;
}
int pcifre(long a)
{
if(a<10) return a; else return pcifre(a/10);
}
long factorial(int n)
{
if(n==1) return 1;else return n*factorial(n-1);
}
long suma(long z[10], int n)
{
if( n==1) return z[1];else return suma(z,n-1)+z[n];
}
void main()
{
n=citire(x);
for(i=1;i<=n;i++) z[i]=factorial(pcifre(x[i]));
cout<<suma(z,n);
}
3. Soluie:
#include<iostream.h>
#include<math.h>
int n;
int prim(long a,long i)
{
if((a==0)||(a==1)) return 0;
else if(i<=sqrt(a)) if(a%i==0) return 0;
else return prim(a,i+1);
else return 1;
}
200
Bibliografie
BIBLIOGRAFIE
201