0% au considerat acest document util (0 voturi)
12 vizualizări244 pagini

C

C++
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
12 vizualizări244 pagini

C

C++
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd

ADRIAN RUNCEANU MIHAELA RUNCEANU

NO
PROGRAMARE ÎN
LIMBAJUL C++

ISBN 978-973-144-550-2
ADRIAN RUNCEANU MIHAELA RUNCEANU

Descrie

RUNCEANU, ADRIAN

/ Adrian Runceanu, Mihaela


Runceanu Târgu-

Bibliogr.

ISBN 978-973-144-550-2 NO
ÎN LIMBAJUL C++

Coperta i design:

Silviu Runceanu

[Link]
Conf. univ. dr. ing. Florin Grofu, Universitatea Constantin Brân -Jiu, Facultatea :
de Inginerie, Departamentul de Automatic

dr. ing. Marian Popescu -Jiu, ilor no tri, (Georgeta i Vasile Runceanu, Cornelia i
Facultatea de Inginerie, Departamentul de Automatic
Vasile Irod) care ne- .

Copiilor no tri, Alexandra i Mihai, cu foarte mult dragoste.


Cuvânt înainte
Cuprins
Cartea n limbajul C++
i elevilor care dores Introducere 9
- ioneze tehnica Capitolul 1 31
dez rii rii programelor. 1.1. Tipuri de date. Variabile. Constante 31
Cartea este st capitole, în care primele 8 capitole fiind concepute
1.1.1. Cuvinte cheie 31
într- fie accesibil i celor care
1.1.2. Tipuri de date 32
i cu elementele de programare. Ultimul capitol cuprinde teste de
verifica Fiecare capitol
1.1.3. Constante 35
con , i probleme propuse spre 1.1.4. Variabile 37
rezolvare. 1.2. Operatorii limbajului C++ 40
Am ales limbajul de programare C++ deoarece este implementat pe 1.3. Instruc iunile limbajului C++ 51
majoritatea platfor
1.4. Probleme rezolvate 67
programare pentru scrierea de software de sistem. , sintaxa limbajului C++ a
1.4.1. Enun uri 67
foarte populare azi: Java, JavaScript, C#.
Cartea pune la di ia cititorului o parte ine un foarte 1.4.2. Solu ii propuse 69
scurt istoric al calculatoarelor, elemente despre arhitectura ionarea 1.5. Probleme propuse spre rezolvare 78
unui sistem . 1.6. T 95
În el ale
1.7. 117
limbajului C++, i bidimensionale, irurile de caractere,
Capitolul 2 Tablouri unidimensionale i bidimensionale 119
i uniunile, subprogramele, pointerii, i
119
iile din bibliotecile standard. Toate exemplele pre
2.1.1. Tablouri unidimensionale 119
Consider în limbajul C++ este 2.1.2. Tablouri bidimensionale 122
turi din partea 2.1.3. Tablouri multidimensionale 125
2.2. Probleme rezolvate 127
adrian_r@[Link], mihaela@[Link].
2.2.1. Enun uri 127

Octombrie 2012 Autorii 2.2.2. Solu ii propuse 129


2.3. Probleme propuse spre rezolvare 139
2.4. 147

No 2 No 3
2.5. 160 4.1.6. Variabile statice i dinamice 218
Capitolul 3 iruri de c 161 4.1.7. Func ii matematice 220
3.1. iruri de caractere 161 4.1.8. Apelul prin valoare 225
3.2. Probleme rezolvate 161 4.1.9. Apelul prin referin 228
3.2.1. Enun uri 167 ii 232
3.2.2. Solu ii propuse 167 4.1.11. Argumentele lin 234
3.3. Probleme propuse spre rezolvare 171 3.1. Probleme rezolvate 236
3.4. Structuri i uniuni 178 3.1.1. Enun uri 236
3.4.1. Definirea structurilor 178 3.1.2. Solu ii propuse 237
3.4.2. Declararea variabilelor de tip stru 180 3.2. Probleme propuse spre rezolvare 248
3.4.3. Accesarea elementelor unei structuri 180 3.3. 260
3.4.4. Tablouri de structuri 181 3.4. 276
3.4.5. Pointeri la structuri 181 Capitolul 5 Pointeri 277
3.4.6. Tipuri utilizator 182 5.1. Declarare 277
3.4.7. Uniuni 182 5.2. Opera ii specifice pointerilor 279
3.5. Probleme rezolvate 183 5.3. Artimetica pointerilor 280
3.5.1. Enun uri 183 5.3.1. Pointeri i tablouri 281
3.5.2. Solu ii propuse 184 5.3.2. Echivalen e de scriere 283
3.6. Probleme propuse spre rezolvare 191 5.3.3. Folosirea pointerilor de tip void 285
3.7. T 199 5.3.4. Expresii compacte cu pointeri 285
3.8. 209 5.3.5. Tablouri cu pointeri 287
Capitolul 4 Func ii 211 5.4. Probleme rezolvate 290
4.1. Declarare. Apel. Prototip 211 5.4.1. Enun uri 290
4.1.1. Declararea func iei 211 5.4.2. Solu ii propuse 292
4.1.2. Apelul unei func ii 212 5.5. Probleme propuse spre rezolvare 298
4.1.3. Prototipul func iei 212 5.6. 307
4.1.4. Parametri formali si actuali 214 5.7. 313
4.1.5. Variabile locale i variabile globale 215 Capitolul 6 Fi iere 315

No 4 No 5
6.1. Tipuri de fi 315 422
6.1.1. Opera iere 315 8.7. Programe demonstrative 425
6.1.2. Prelucrarea fi ierelor la nivel inferior 316 Capitolul 9 Teste recapitulative 429
6.1.3. Prelucrarea fi ierelor la nivel superior 319 430
6.2. Probleme rezolvate 355 rul 2 432
6.2.1. Enun uri 355 rul 3 434
6.2.2. Solu ii propuse 355 rul 4 436
6.3. Probleme propuse spre rezolvare 360 438
6.4. 371 Testul 440
6.5. 378 442
Capitolul 7 Sistemul de intrare/ie ire 379 444
7.1. Testarea 385 446
7.2. Formatarea datelor din fluxurile de intrare/ie ire 387 448
7.2.1. Formatarea prin manipulatori 389 450
[Link]. 390 453
[Link]. Manipulatori cu parametri 391 456
7.2.2. Formatarea prin metode 393 459
7.3. Metodele clasei istream 395 462
7.4. Metodele clasei ostream 397 464
7.5. Manipulatori create de utilizator 399 Tes 466
7.6. Fluxuri de date pentru fi iere 400 468
7.7. Fi iere binare 407 470
Capitolul 8 Func ii din biblioteca standard 411 472
411 474
8.2. Sortare 412 476
8.3. Func ii de clasificare 414 478
8.4. Opera ii cu blocuri de memorie 416 480
8.5. Opera ii cu 418 Bibliografie 482

No 6 No 7
Introducere

al

- Pascal 641 -
- Leibnitz 1674 -
- Babbage 1840 -
aparate primitive unele din componentele
unui arhitecturi moderne - de exemplu un registru temporar de memorie care

sub denumirea de registru acumulator. Calculatoarele electronice au fost

pe la mijlocul anului 1930.

u
Acest lucru a fost posibil deoarece se dorea calcularea traiectoriilor de

Germania

mult subevaluate. Este

640 Ko RAM.

No 8 No 9
rapide. Acest lucru tegoriilor .d sunt
reprezentative.
Perioada 1970-
main-frame la
.
dezvoltar

calcul teleworking) a individului cu societatea.

- diverse domenii:
microcontrolere, CAM (Computer
Sistemul de operare MS-DOS a fost realizat prin adaptarea la noile Aided Manufactory)
microkernel de UNIX la care s- Economie: gestiune, transferul banilor, "banii electronici"
ivele
calculatoarelor personale.

, iar aria lor de


folosire s- holografie, neurale, procesoare analogice

controalele prin zone active ale ecranului. Aceste controale care sunt activate procesoare analogice, s
din mouse sunt caracteristice sistemului de operare WINDOWS. Proiectare : programele de tip CAD (Computer Aided Design)
- Se mai pot da
microcalculatoarelor acestea fiind mu
- -
-
- mai
Prin programare
asupra unui set de da -
softului.
:

-un limbaj de programare

-un cod direct executabil

No 10 No 11
specializate numite compilatoare (e
Rolul p este ca fiind
, .
de intrare (cele
prelucrate), lor s scris corect este executat gre

rdware. Oricum ar fi, aceste

, fiind de obicei rare.


intermediare , dar de care utilizatorul nu
.

de i -zis, formulare de genul: 2*2=... .

Arhitectura unui sistem de calcul operanzii (datele

Ca
a * au fost preluate de pe un suport extern si anume cel scris, rezultatul
returnat (trimis
de la el ca vreo -a pus cineva, un programator prin
intermediul unui program

altele,
descompunerea unei probleme
transpunem -un limbaj de programare. arhitectura
de altfel este extrem
bloc

programatori GIGO (Garbage In Garbage Out) -


introduci gunoi ob i

No 12 No 13
-o memorie ROM (Read Only

omul la asemenea

unei formule de genul 2*2=... .


a
- sistemul
de operare

Fig. 1.1 Arhitectura unui sistem de calcul


licite de lansare a
programului ,
.1 -
e
la nivelul procesorului poate fi descris ca:
cazul nostru. Acest dispozitiv este materializat prin Hard Disk (HDD)
ash Drive
anterioare (tot din
RAM)(*)

rolul memoriei umane

A mai

ogie cu omul, partea de reflexe

No 14 No 15
-
ilor - adresa

na din componentele de

riorul unui calculator este baza


ori

cifre , etape:

1 , iar lui "0" lipsei acestei

specificarea datelor de intrare


duce
V. De
aici a rezultat posibilitatea folosirii unui condensator ca element de memorare. :
1. Ce date vor fi primite la intrare
2. Care este formatul (forma lor de reprezentare) a datelor de intrare
nec se face 3. Care sunt valorile permise sau nepermise pentru datele de intrare
4. 3) privind valorile de intrare
5.
ilor de scriere/citire. s-au terminat de introdus datele de intrare
Aici mai a
datele utile de calcul (bit =
sau a unei tensiuni la intrarea unui dispozitiv digital) i 1.
un moment dat de un procesor.

2.

te fi scris -o
memorie. O ru a ne putea referi la 3. Sunt

No 16 No 17
1. Metoda schemei logice
4.

distincte care figura 1.2, pentru descrierea

al II-lea aX2 + bX + c = 0,
, dar modul de procesare a valorilor lor nu. Start

Stop
1.
2. -
3. -
Bloc citire Bloc scriere
variabile variabile
INDEPENDENT DE TIPUL DE LIMBAJ

Nu Da
Bloc de atribuire conditie

nu

Fig. 1.2 Simbolurile utilizate in pseudocod

Reprezentarea algoritmilor

suplimentar pierdut de utilizator cu executarea simbolurilor grafice.


efectuate asupra unui flux de date, prelucrare care are loc cu un scop bine
determinat. Ca de -

a-l face independent de un limbaj de programare astfel


metode clasice:
1. metoda schemei logice
2. metoda pseudocodului

No 18 No 19
Start
de descriere pseudocodul.

Citire nota1, nota2, nota3


2. Metoda pseudocodului

Media <-(nota1+nota2+nota3)/3 ,

Scriere media

Stop

Fig. 1.3 Exemplu de algoritm scris cu ajutorul pseudocod-ului


l
3 se descriu efectiv pas cu pas toate
ile care trebuie efectuate.
n figura 1.3 s-a tat.

3.
variabile: med_a,n1,n2,n3
{
n2, n3
la generare med_a = (n1 + n2 + n3) / 3

utilizatorului.

No 20 No 21
Limbajul C
-
Limbajele de programare de nivel mediu au fost serios dezvoltate pe la
la adaptarea compilatorului pentru sistemul de operare MS-DOS. De

X,-

PC-uri, limbajul -
difere
Limbajul FORTRAN (FORmula TRANslator) a fost unul dintre primele
a creat un subcomitet pentru limbajul C,

mari de calcule matematice


OP (Object Oriented Programming) C++
complexe.
-au

e a fost
Un limbaj de niv

crea cod executabil simultan pe mai multe sisteme de calcul. Avantajele


nivel inalt sunt:
-
-
e
-
proiectare, la nivel logic, a
- sunt portabile
sub DOS
-
De obicei sistemele de operare erau dezvoltate in limbaj de ansamblare
pentru a fi mai rapide. Limbajul C, dezvoltat in 1972 este Dennis [Link] la
a -l
Laboratoarele AT&T Bell, este primul limbaj pentru crearea sisteme de
ope
este faptul la C++ sau Java.
n scrierea codului, el
despre acest limbaj a fost "The C Programm ie
naintea ei exista doar "The C Reference Manual",

No 22 No 23
1.
2. Realizarea mo
3. Verificarea modelului matematic cu un set de date reale sau calculate
Apeluri ale directivelor speciale de compilare; punctelor
anterioare ,
-line;
4. Identificarea datelor de intrare, a dat
variabilelor intermediare.
Corpul programului principal
{ 5.
respectivelor date.
apeluri de
} 6.
Corp

7. Generarea schemei logice sau a pseudocodului ce descrie algoritmul


propus pentru rezolvarea problemei.
8. Verificarea modelului creat la punctul 7 cu un set date reale sau calculate
1.
erificarea punctelor anterioare
2.
nu, .
deplasate
9. -un limbaj de programare
oarecare).
10.
, vom lua un exemplu extrem de
e gradul
al II-lea"

Pasul 1

ax2 +bx+c=0.
Pasul 2
programele bune si cele care merg.
- Fie , atunci:
ului au
Daca atunci:

No 24 No 25
1,2
Daca atunci:

intrare.
Daca atunci:
Pasul 6
Pasul 3
n acest caz poate fi evitat modelul matematic este prea simplu.
Pasul 4

II este clar Pasul 7

X1,2

m un
simbol suplimentar -4*a*c;

{
Pasul 5 x1=(-b+sqrt(delta))/(2*a);
x2=(-b-sqrt(delta))/(2*a);
1,x2

}
ales: altfel
{
modelul matematic delta=-delta;
delta=sqrt(delta)/(2 *a)
1 de forma re+i*im
2 de forma re-i*im
}
c

a,b,c vor fi de tipul float. adunare nu

float.

No 26 No 27
Codul ar fi fost mai clar, Pasul 10

prin
Pasul 11

al calculului brut nu ne trebuie, dar din punct de ve


nt rezultatul unu scanf
rezultatul, iar a nu este declarat poi
Pasul 8
Va fi evitat pentru acest exemplu deoarece este prea simplu.
Pasul 9
Co or erori se poate continua testarea programului.

#include <stdio.h>

interpretor /*
void main(void)
{ ------ autor:
float a,b,c,delta,x1,x2; ------
clrscr()
------ copyright
coefi */
printf("\na=");
** scanf("%f",a); //
interpretor
printf("\nb=");
scanf("%f",&b);
printf("\nb=");
scanf("%f",&b);
*** delta=b*b+4*a*c; //aici eroare de calcul
if( delta >=0 )
{
xi=(-b+sqrt(delta))/(2 *a);
x2=(-b-sqrt(delta))/(2 *a);
printf("\nxl=%f",xl)
printf("\nx2=%f",x2)
{
delta=-delta; delta=sqrt(delta)/(2 *a)
printf( "xl = %/+ i *%/", -b/(2 *a), delta);
printf( "x2 = %f-i*%f", -b/(2 *a), delta);
}

No 28 No 29
CAPITOLUL

Elemente de baz ale limbajului C++

1.1. Tipuri de date. Variabile. Constante

1.1.1. Cuvinte cheie

L cuvinte
cheie:

aceste denumiri.

auto break case char const continue


double else enum extern float for
int long register return short signed
struct switch typedef union unsigned void
default do
goto if
sizeof static
volatile while

Limbajul C++ adau cuvinte cheie la cele existente ale limbajului C.

asm bool catch class delete friend inline


namescpace new operator private public protected plate
using virtual

No 30 No 31
1.1.2. Tipuri de date Tipul de date int

Un tip de date
le poa int <definitie_de_data>;

NUMELE CARACTERISTICI
TIPULUI
char
int retine numere intregi cu semn;
Ex: 23,-45,0, etc. unsigned
float retine numere reale in format cu virgula mobila, in
la 0 la 65535.
simpla precizie;
Ex: 7.8965, -4.123, 7.0, etc.
retine numere reale in format cu virgula mobila, in Exemplu: int a = 9;
double
dubla precizie; int b = 4567;
Ex: 7.8965, -4.123, 7.0, etc.(se utilizeaza cand se int c = -31456;
prellucreaza numere foarte mari sau foarte mici)
void tip de date special care nu specifica un anumit set de
valori initial, dar care poate fi specificat ulterior
declararii.
Tipul de date float

Tipul de date char


float <definitie_de_data>;

char <definitie_de_data>;

p -

torii pot atribui valori de tip Exemplu:


float x = 9.789;
float y = -6754.123;
float z = -3124567;

apost
unsigned Tipul de date double

Exemplu: char litera_mica; double <definitie_de_data>;


litera_mica = 90;
sau litera_mica =

No 32 No 33
Modificatorul de tip unsigned
Exemplu: - ru a reprezenta valori mai
double numar_foarte_mare=12345678912345.123456789123456789;
double numar_foarte_mic=-123456789123456789.12345678912345; mari.
double numar_mare=-123456789;
Astfel: unsigned int
intervalul [0,65535]; unsigned char
variabilelor din intervalul [0,255], etc.
Tipul de date void Modificatorul de tip long

[void ] <definitie_de_functie([void]) -2147483648, 2147483647].


sau
unsigned long se poate indica astfel
void <definitie_de_pointer>;
compilatorulu
Este tipul de da [0,4292967265].
Modificatorul de tip register
-

Exemplu:
void salut(void) la fiecare repetare a unei bucle.
{
AM PROGRAMATORII IN LIMBAJUL C++!!!\n
}

Modificatorii de tip 1.1.3. Constante

un set de modificatori de tip : unsigned long (lung), signed (cu


semn) , register short (scurt). tipuri:
Un modificator de tip

1.

2. constante zecimale
Exemplu:
unsigned int numar; 3. constante octale
register int i;
long int numar_foarte_mare;
4. constate hexazecimale (s
baza 16

No 34 No 35
7.

5. (care \
exponent (care poate fi el vid) linia 2 : nu

exponent 65 98 98 65 0
A b b A
Exemplu: 3.45e-17 3,45-17

1.1.4. Variabile
6.
rului
respectiv.

din caractere
Numim o denumire (identificator) pe care compilatorul o
\

tipul de
CARACTER SEMNIFICATIE date asociat.
\a caracter ASCII de
atentionare (sunet) Exemplu:
\b backspace int variabila_de tip_intreg;
\f avans hartie // am declarat o variabila de tip intreg careia i-am dat denumirea
\n linie noua variabila_de_tip_intreg
\r retur de car float variabila_de_tip_real;
// am declarat o variabila de tip real careia i-am dat denumirea
\t tabulator orizontal variabila_de_tip_real
\v tabulator vertical char variabila_de_tip_caracter;
\\ backslash // am declarat o variabila de tip caracter careia i-am dat denumirea
variabila_de_tip_caracter
\ apostrof
\ ghilimele
\? semnul intrebarii

No 36 No 37
Exemplu: variabila1 este corect
1variabila - nu este corect
case sensitive
tip nume_tablou[][];

Exemplu:
Exemplu: int var_intreaga;
int v[5];
int VAR_INTREAGA; float x[25];
double a[3][2];

Variabilele pot fi:


1. simple
2. compuse: tablou
etc. 0. Elementele lui int v[5] vor fi : v[0],v[1],v[2],v[3],v[4];
tablouri
: char t[20];
1) Variabilele simple

3)
nia de declarare a variabilelor:
tip nume_variabila;
Exemplu:
int i = 5;
float x = 7.8;
int v[5] = {1,2,7,10,-5};
Exemplu: float y[3] = {-9.034,89,2};
int i; char c =
int j,k,l;
double a,b;
float x,y;
char m,n,t;
\

2) Variabilele tablou
4)
-se cu ajutorul indicilor. Numim comentarii
/* comentariu */ e vorba despre
// comentariu.

No 38 No 39
1. Operatori aritmetici

OPERATOR
+ adunare
-
*
1.2. Operatorii limbajului C++
/
%
+
Expresii -
ii matematice cum ar fi

operatori.
Exemplu:
int i=9, j=2;
atunci i / j are ca rezultat 4
Operatori i%j are ca rezultat 1

matematici:
a un singur operand),
#include <iostream.h>
int main(void)
{
int secunde_pe_ora;
float media;
OP E R A TOR I secunde_pe_ora= 60 * 60;
media = (5 + 10 + 15 + 20) / 4;
1 aritmetici e intr-o ora este
2
3 de egalitate
4 logici 12 * 60<<endl;
5 }
6 de atribuire
7 de increme
8
9 de lungime (sizeof)
Numarul de secunde intr-o ora este 3600
10
11 Media numerelor 5, 10, 15 si 20 este 12.000000
Numarul de secunde in 48 de minute este 2880

No 40 No 41
4. Operatori logici

OPERATOR OPERATOR
< mai mic ! negare
<= mai mic sau egal &&
> mai mare || sau logic
>= mai mare sau egal

de aceea valoarea de fals zero ( 0 ), iar valoarea de


0 adev rat 0 ).
1
! are prioritatea cea mai
Exemplu: int i=3, j=8;
&& ||.
Atunci pentru expresia i < j avem valoarea 1
Iar pentru expresia i >= j avem valoarea 0
!0 1
!1 0

3. Operatori de egalitate
&& 0 0
0 0 0
OPERATOR 0 0 1

== egal
!= diferit || 0 0
0 0 1
0 1 1

Exemplu: expresia !0 are valoarea 1


0 expresia !5 are valoarea 0
1 ex
respectiv b.

Exemplu: int i=2, j=5, k=2;


Atunci pentru expresia i!=j avem valoarea 1
Pentru expresia i==j avem valoarea 0
Iar pentru expresia i==k avem valoarea 0

No 42 No 43
-i reduce consumul de memorie
0
-o
Expresie Valoare
expresie
i && j 0
~
!i && j 1
-a efectuat negarea.
i || j 1
Exemplu :
i ||!j 0
~0 are valoarea 1 010 = 00000000 2
!(i && j) 1 prin negare bit cu bit se trans ~010 = 111111112
!i || !j 1
!i && j || !j && i 1 &
i <= j || j <= k 0 sau 1

Exemplu:
expresie valoare
!i && k || !j && i, evaluarea se face
1&2 0
prin scurtcircuitare, 1&3 1

110 = 000000012 110 = 000000012


i cu j ( 210 = 000000102 310 = 000000112
-------------------- --------------------
010 = 000000002 110 = 000000012

Exemplu:
expresie valoare
1|2 3
1|3 3
OPERATOR
~
& 110 = 000000012 110 = 000000012
| sau pe 210 = 000000102 310 = 000000112
^
-------------------- --------------------
<<
>> 310 = 000000112 310 = 000000112

No 44 No 45
^
^ 0 1 /C++, se poate scrie
0 0 0 prescurtat:
1 1 0
var operator = expresie.
unde operator poat
Exemplu: Exemplu: int i, j;
expresie valoare i = i + 2; se poate scrie i + = 2;
1^2 3
j = j | 1; se poate scrie j | = 1;
1^3 2

110 = 000000012 110 = 000000012


210 = 000000102 310 = 000000112 -- )
-------------------- ---------------------
310 = 000000112 210 = 000000102 OPERATOR

++i
<< se --i
i i++
i--

Exemplu: 2 << 2 210 = 000000102 De fapt:


------------------- ++i i = i +1 -
810 = 000010002 care apare ++.
a << n a*2n. i++ i = i +1 -
apare ++.
>> --i i=i-1 -
care apare --.
a >> n a/2n i-- i=i-1 -
cu 2n apare --.

pre

var = expresie

No 46 No 47
int valoare = 1;
un scurt program:

valoare=1;

Utilizarea formei postfixate 1


Valoarea dupa incrementare 2
Utilizarea formei prefixate 2
Valoarea dupa incrementare 2
pot e
8. Operatorul de conversi rezultate:

(tip) operand

unde operand tip este un operator unar.

Exemplu: int i=5, j=2;


float a;

if.

9. Operatorul de lungime (sizeof) expresie1 ? expresie2 : expresie3

sau

var = expresie1 ? expresie2 : expresie3


sizeof (expresie) sizeof (tip)

No 48 No 49
unde expresie1 este o expresie logic 12.
2

resie3. -au
Exemplu: stabilit anumite .
modul = x < 0 ? x : x;
max = a < b ? b : a;
min = a < b ? a : b;
NIVEL DE OPERATOR ASOCIATIVITATE
PRIORITATE
1 () [] . -> stânga -> dreapta
2 - (unar) + (unar) & (unar) ! ~ dreapta -> stânga
*(unar) (cast) (sizeof) ++ --
3 * (binar) / % stânga -> dreapta
4 + (binar) - (binar) stânga -> dreapta
5 << >> stânga -> dreapta
6 < <= > >= dreapta -> stânga
7 == != stânga -> dreapta
8 & stânga -> dreapta
expresie1, expresie2, expresie3, . . . expresien 9 ^ stânga -> dreapta
10 | stânga -> dreapta
11 && stânga -> dreapta
12 || stânga -> dreapta
sau 13 ?: stânga -> dreapta
14 = dreapta -> stânga
expresie = expresie1, expresie2, expresie3, . . . expresien 15 , stânga -> dreapta

-se

1.3. Instruc iunile limbajului C++

Limbajul C
construi programe. Acestea sunt:

{....}

No 50 No 51
{ }. (instr

:
atunc -
if(expresie) instructiune;
a)
simple .
O
a printf). THEN.
O

b)
if(expresie)
expresie; instructiune1;
e: else
instructiune2;
Are 3 forme:
a) : if imbricate if uri
cuprinse
variabila = expresie;
sau
variabila operator = expresie;

b) inst :

nume_functie(pa1, pa2, . . . , pan);

unde pa1, pa2, . . ., pan while(expresie) instructiune;

variabila ++;
++ variabila;
variabila --;
-- variabila;

No 52 No 53
Exemplu:

naturale, cu n<=10: valori diferite de 0.


while (1)
int main(void)
CTRL+C.
{
int i,n,s=0;

cin>>n;
i=1;
while(i<=n)
{
s+=i;
i++;
} e.
naturale este
for(expresie1 ; expresie2 ; expresie3) instructiune;
}

Astfel:
Dati numarul n = 5 expresie1
Suma primelor 5 numere naturale este 15 expresie2
expresie3
- corpul ciclului
-
for
int main(void) while, drept pentru care se poate scrie echivalent astfel:
{
int i=1,n,s=0;
cin>>n; expresie1;
while(i<=n) s+=i++; while(expresie2)
naturale este
{
} instructiune;
expresie3;
}
La executia acestui program se poate obtine urmatorul rezultat:
Dati numarul n = 5 :
Suma primelor 5 numere naturale este 15 while (expresie) instructiune; for( ; expresie ;) instructiune;
for are loc astfel
expresia1

No 54 No 55
expresia2
expresia3 expresiei2 .m.d..
do
instructiune;
expresia1, expresia2, expresia3
while(expresie);
.

for(;;) while(1)
area
Exemplu: naturale
for, v while:

int main(void) instructiune;


{ while(expresie)
int i,n,s=0; instructiune;
cin>>n;
for(i=1;i<=n;i++) s+=i; for:
naturale este
for( instructiune; expresie ; ) instructiune;
}

Suma primelor 5 numere naturale este 15 suma lor pe parcurs.

int main(void)
{
int main(void) int numar=0, total=0;
{ do{
int i,n,s; total+=numar;

cin>>n;
for(i=1, s=0; i<=n; s+=i, i++) ; }while(numar<10);
naturale este }

: numar=0 total=0
numar=1 total=1
Suma primelor 5 numere naturale este 15 numar=2 total=3

No 56 No 57
numar=3 total=6
numar=4 total=10
switch (expresie)
numar=5 total=15
{ case c1 : sir_instructiuni_1;
numar=6 total=21 break;
numar=7 total=28 case c2 : sir_instructiuni_2;
break;
numar=8 total=36 ........
numar=9 total=45 case cn : sir_instructiuni_ n;
break;
default : sir_instructiuni;
Instru }
break;

switch
while, do while, for 1, c2, . . ., cn
switch -un ciclu repetitv sau din switch. c1
Exemplu: switch. Acela i lucru
for(;;) 2 ,sau cu c3 , sau cu cn.
{
..... switch
break; if :
}
Exemplu: un program, if (expresie==c1)
sir_instructiuni_1;
break
else if (expresie==c2)
break face ca sir_instructiuni_2;
........
else if (expresie==cn)
sir_instructiuni_ n;
int main(void){
else sir_instructiuni;
int numar;
for(numar = 1; numar<=100; numar++)
{
if(numar == 50) break; Exemplu:

}
cout -
for(numar = 100; numar>=1; numar--)
{
if(numar == 50) break;

}
}

No 58 No 59
k=1k+2k k, unde
#include<iostream.h>
void main(void)
{
int n=0;
int main(void)
char a;
{
switch(a==getche())
int numar;
{
\n Numerele pare dintre 1 si 100 sunt: \
{
for (numar = 1; numar <= 100; numar++)
\
{
n++;
if(numar % 2) continue;
} break;
}
-ti apasat i \
}
}
numar=0;
while(numar <= 100)
{
numar++;
if( ! numar % 2) continue;
Exemplu:
}
consoanele din alfabet. De obs case se }

default:

int main(void)
{
char litera;
int nr_vocale = 0, nr_consoane = 0; Se refe : for, while do while
ei ciclurile while do while
switch (litera) {
for
reevaluarea ciclului.

break; Exemplu:
default: nr_consoane++;
} continue -un ciclu for -un ciclu while

nr_consoane<<endl;
}

No 60 No 61
Exemplu:
#include <iostream.h> goto
#include <conio.h>
int main(void) int main(void)
{ {
int n,k;
char raspuns; int numar=1;
do
{
cout<<endl<<" introduceti n - maxim: "; if (numar <= 100) goto eticheta;
cin>>n; }
cout<<" Introduceti puterea ( 1,2,3,4) : ";
cin>>k;
switch(k)
{
case 1 : cout<<endl<<" S_i**1 = "<<n*(n+1)/2;break;
case 2 : cout<<endl<<" S_i**2 = 1. return;
"<<n*(n+1)*(2*n+1)/6; break; 2. return expresie;
case 3 : cout<<endl<<" S_i**3 = 3. return (expresie);
"<<n*n*(n+1)*(n+1)/4; break;
case 4 : cout<<" S_i**4 = "<<n * (n+1) *
(6*n*n*n+9*n*n+n-1)/30); break;
default : cout<<endl<<" putere in afara intervalului -
!"; break;
} forma 1.
cout<<endl<<endl<<" Doriti sa continuati ? ( d / n )";
raspuns=getchar();
}while(raspuns=='d' || raspuns=='D'); Preprocesare
cout<<endl<<" iesire din program";
getch();
} Schemat

preprocesare
program sursa initial(.C) program sursa(.C)
compilare editarea de legaturi (linkeditare)
program obiect(.OBJ)

program executabil(.EXE)
goto eticheta;

rte
:
a)
b) definire constante simbolice

No 62 No 63
c) definire macrouri
d)

a)
limbajului header-e (au extensia
le constante:
(scanf / #define TRUE 1
printf) putul unui program C++: #define FALSE 0
#include <stdio.h> - #define PI 3.1415
Runceanu Adrian

c)

b) Definire constante simbolice

constante.
#define nume(param_form1, param_form2, . . . ,
O param_formn) text
#define.
Apelul macroului se face astfel:
#define nume_constanta text
nume(param_actual1, param_actual2, . . . ,param_actualn)

numelui nume_constanta textul denumit text care se poate


Unde nume param_form1, param_form2, .
#undef nume. . ., param_formn parametrii formali ai macroului, iar text
Exemplu: param_actual1, param_actual2, . . . ,param_actualn sunt
#define NRLINII 30
#define NRCOLOANE 20
#define DIMENSIUNE NRLINII*NRCOLOANE
int t[NRLINII][NRCOLOANE]; apelul macroului.
double a[DIMENSIUNE]; Exemplu:
#define MAX(a,b) ( (a) < (b) ? (b) : (a) )
int t[30][20]; #define MIN(a,b) ( (a) > (b) ? (b) : (a) )
#define SGN(x) ( (x) > 0 ? 1 : ( (x) == 0 ? 0 : (-1) ) )
double a[30*20];

No 64 No 65
1.4. Probleme rezolvate
maximul, respectiv minimul
signatura

1.4.1.
int main(void)
{ 1. c.m.m.d.c
r 10.0 si 25.0 este
%f\ multiplu comun (c.m.m.m.c
\
}
algoritmul lui Euclid

cmmdc(a-
executa acest program, preprocesorul va avea ca

cmmdc(a,b ) = cmmdc(a,b-
\
(10.0) : (25.0)));
a,
\
(3.1)));
2.

3. prim

4. perfect

5.

6.

No 66 No 67
palindrom x+b=0, valorile

exemplu : n = 25652). toate cazurile.

al II-lea:
ax2+bx+c=0, unde a, b, c
-

1.4.2. propuse

Problema 1:
c.m.m.d.c
multiplu comun (c.m.m.m.c
-se coordonatele acestora: A(x1, y1) si B(x2, y2).

algoritmul lui Euclid


fo
cmmdc(a-

cmmdc(a,b ) = cmmdc(a,b-

a,
abc
acb #include <iostream.h>
int main(void)
cab {
cba int a, b, x, y, r, cmmdc1, cmmdc2, cmmmc;
cout<<"Dati primul numar "; cin>>a;
bac cout<<"Dati al doilea numar "; cin>>b;
bca // calculam c.m.m.d.c. folosind algoritmul lui Euclid
x = a; y = b;
r = a % b;
while( r != 0)
{
a = b;
b = r;
r = a % b;
}
cmmdc1 = b;
cout<<"Cmmdc este "<<cmmdc1<<endl;

No 68 No 69
// calculam c.m.m.d.c. folosind relatia data
while( a != b) Problema 4:
if( a > b ) perfect sau
a=a-b;
else
if( a < b )
b=b-a;
cmmdc2 = a;
cout<<"Cmmdc este "<<cmmdc2<<endl;
cmmmc = ( x * y ) / cmmdc1; #include <iostream.h>
cout<<"Cmmmc este "<<cmmmc<<endl; int main(void)
} {
int n, i, s = 0;
cout<<"Dati numarul "; cin>>n;
for(i=1; i<=n/2; i++)
Problema 2: if( n % i == 0 ) s+=i;
if( n == s )
cout<<"Numarul "<<n<<" este numar
PERFECT";
#include <iostream.h> else
int main(void) cout<<"Numarul "<<n<<" NU este numar
{ PERFECT";
int n, i; }
cout<<"Dati numarul "; cin>>n;
cout<<"Divizorii numarului "<<n<<" sunt: ";
for(i=1; i<=n; i++)
if( n % i == 0)
cout<<" "<<i; Problema 5:
}

#include <iostream.h>
Problema 3: int main(void)
prim sau nu. Spunem {
int n, i, max, min, x;
numai valorile 1 min = 32367;
max = -32368;
cout<<"Dati numarul "; cin>>n;
#include <iostream.h> for(i=1; i<=n; i++)
int main(void) {
{ cout<<"dati numarul "<<i<<" ";
int n,i,prim; cin>>x;
cout<<"Dati numarul "; cin>>n; if( max < x ) max=x;
prim=1; if( min > x ) min=x;
for(i=2;i<=n/2;i++) }
if(n%i==0) prim=0; cout<<"Maximul este "<<max<<endl;
if(prim==1) cout<<"Minimul este "<<min;
cout<<"Numarul "<<n<<" este numar PRIM"; }
else
cout<<"Numarul "<<n<<" NU este numar PRIM";
}

No 70 No 71
Problema 6: Problema 8:

#include <iostream.h>
int main(void) -
{
int n, i, suma=0, r;
cout<<"Dati numarul "; cin>>n;
while( n != 0 ) #include<iostream.h>
{ int main(void)
r = n % 10; {
suma+= r; int a, b, suma, media;
n = n / 10; a = 5; b = 7;
} suma = a + b;
cout<<"Suma este "<<suma<<endl; media = suma / 2;
} cout<<"media este ="<<media;
}

Problema 7:
palindrom Problema 9:
rul
exemplu: n =
25652).
#include<iostream.h>
#include <iostream.h> int main(void)
int main(void) {
{ int a, b, suma, media;
int n, r, m = 0, x; cout<<"dati primul numar a=";
cout<<"Dati numarul "; cin>>n; cin>>a;
x = n; cout<<"dati al doilea numar b=";
while( n != 0 ) cin>>b;
{ suma = a + b;
r = n % 10; media = suma / 2;
m+= r; cout<<"media este ="<<media;
n = n / 10; }
}
if( x == m )
cout<<"Numarul "<<x<<" este PALINDROM"<<endl;
else
cout<<"Numarul "<<x<<" NU este PALINDROM"<<endl; Problema 10:
}

-se coordonatele acestora: A(x1, y1) si B(x2, y2).

No 72 No 73
#include<iostream.h> #include<iostream.h>
#include<math.h> int main(void)
int main(void) {
{ int a, b, c;
int x1, y1, x2, y2; cout<<"Dati primul numar = "; cin>>a;
float d; cout<<"Dati al doilea numar = "; cin>>b;
cout<<"dati x1= "; cin>>x1; cout<<"Dati al treilea numar = "; cin>>c;
cout<<"dati y1= "; cin>>y1; if ( a < b )
cout<<"dati x2= "; cin>>x2; if( b < c ) cout<<a<<","<<b<<","<<c;
cout<<"dati y2= "; cin>>y2; else if( a < c ) cout<<a<<","<<c<<","<<b;
d = sqrt( (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) ); else cout<<c<<","<<a<<","<<b;
cout<<"Distanta intre "<<x1<<","<<y1<<" si else if( a < c ) cout<<b<<","<<a<<","<<c;
"<<x2<<","<<y2<<" este = "<<d; else if(b < c )
} cout<<b<<","<<c<<","<<a;
else
cout<<c<<","<<b<<","<<a;
}
Problema 11:

Problema 13:

#include<iostream.h>
int main(void)
{
int u; #include<iostream.h>
float r; int main(void)
cout<<"dati unghiul u = "; cin>>u; {
r = (float)u / 180; int a, b, c, temp;
cout<<"unghiul in radiani este = pi*"<<r; cout<<"Dati primul numar = "; cin>>a;
} cout<<"Dati al doilea numar = "; cin>>b;
cout<<"Dati al treilea numar = "; cin>>c;
if( a > b )
{
temp = a; a = b; b = temp;
Problema 12: }
if( b > c )
{
temp = b; b = c; c = temp;
}
if( a > b )
abc {
acb temp = a; a = b; b = temp;
}
cab cout<<"Numerele in ordine crescatoare sunt
cba
}
bac
bca

No 74 No 75
else
Problema 14:
{
+b=0, delta=b*b-4*a*c;
if(delta >= 0)
{
cout<<"Radacini reale: ";
x1=(-b+sqrt(delta))/(2*a);
x2=(-b-sqrt(delta))/(2*a);
cout<<"x1 = "<<x1<<" x2 = "<<x2;
#include<iostream.h> }
int main(void) else
{ {
float a,b,x; cout<<"Radacini complexe :";
cout<<"Dati valoarea lui a = "; delta=-delta;
cin>>a; preal=-b/(2*a);
cout<<"Dati valoarea lui b = "; pimag=sqrt(delta)/(2*a);
cin>>b; cout<<"x1 = "<<preal<<" +
if( a == 0 ) i*"<<pimag<<"\n";
if( b == 0 ) cout<<"infinitate de solutii"; cout<<"x2 = "<<preal<<" - i*"<<pimag;
else cout<<"ecuatie imposibila";
else }
{ }
x = -b / a; }
cout<<"solutia este x= "<<x;
}
}

Problema 15:
2+bx+c=0,

unde a, b, c ate cazurile.

#include<iostream.h>
#include<math.h>
int main(void)
{
int a,b,c;
float x1,x2,delta,preal,pimag;
cout<<"Dati valoarea lui a = ";
cin>>a;
cout<<"Dati valoarea lui b = ";
cin>>b;
cout<<"Dati valoarea lui c = ";
cin>>c;
if(a==0)
cout<<"Ecuatie de gradul I"<<"\n";

No 76 No 77
1.5. Probleme propuse spre rezolvare 6.
2 3 4.

7.
,p
1.
-al doilea

8.
2.

9.
conjectura lui GOLDBACH).
3.
10.

general, multipli de 4, dar


nu

11. , definit astfel:

4.

A = *** B = *** C = *** MEDIA = ***.**


(S-
mai mici sau egali cu termenul al n-lea.
reprezentarea valorii numerice respective)
Exemplu : 13

5. - raza unui cerc, LungCerc - -


12.

Raza cercului : ****.***


13.
Lungimea cercului : ****.***
nsecutive.
Aria cercului : *****.****
Exemplu: Pentru n = 10 1+2+3+4
n = 15 1+2+3+4+5=4+5+6=7+8

No 78 No 79
14. 18.
de pe secunde.
Exemplu: 300 - 100 0

2 = A ,B, C 3 = D, E, F 4 = G, H, I
5 = J, K , L 6 = M, N, O 7 = P , R, S 19. e
8 = T, U ,V 9 = W, X, Y

15. Exemplu:

- este di
sau 20.
- este divizibil cu 400
Exemplu: Exemplu:
1890
2004: doua mii patru
16. 3000: trei mii
2=b2+c2, b2=a2+c2, c2=a2+b2).
Exemplu: numerele 3, 4, 5 sunt pitagorice.
21. b ere naturale
17.
Exemplu: 59

1. Inch (in) 2. Foot (ft) 3. Pound(lb) 4. Ounce(oz) 5. Gallon(gal)


respectiv 22.
1. Centimetru(cm) 2. Metru 3. Kilogram (kg) 4. Gram (g) 5. 24, 30, 18 dau restul 7.
Litru(l) Exemplu:
1447 : 24 = 60 rest 7;
1447 : 30 = 48 rest 7;
1 in = 2,54 cm 1 lb = 0,45359 kg 1 gal = 3,78541 l 1447 : 18 = 80 rest 7.
1 ft = 0,3048 m 1 oz = 28,3495 g
23.
Exemplu: 13 in = 33.02 cm = 0.3302 m k divizori.
Exemplu:

No 80 No 81
24. e divizori 31.
Exemplu: cifre.
Exemplu:
32.
de cifre distincte din care se compune.
25. ram Exemplu:

33.
valo
= suma divizorilor lui n Exemplu:
Exemplu: Divizorii lui n = 20 sunt 1, 2, 4, 5, 10, 20, suma lor este 42, iar
34.
frelor lor.
26. Exemplu:
20, 21, 24

Exemplu: 6 perechi (5,5), (5,10), (5,15), (5,20), 35. palindrom


(10,15), (15,20) care au cel mai mare divizor comun egal cu 5
Exemplu:
27.
36.
Exemplu: (923 = 778688). restul i
Exemplu:
28. transforme din baza n baza 10.
Exemplu: 3528=23410. 37. "bine

29. n baza q, unde p , q <10. d


Exemplu: 3528=14145. natu
core
30. cu cifra Exemplu:
ordonat

Exemplu: Pentru numarul 10758 se obtine numarul 85701.

No 82 No 83
38. Exemplu: -5, 47, 0, 32, 12, -6,
este 14, 0, - -45480960.
Exemplu: 10=1B2B116)

45. se calculeze raportul dintre suma


39. Se introduc elementelor
Exemplu: -2, 7, 4, -
0.01322751.
Exemplu: 25, 653, 2965, 211, 154, 1256, 0 se va
46. 2 + b 3 , cu

40. n este deosebit m Exemplu: 2+43).

n = m + S (m), unde S (m) este suma cifrelor lui m. un program


verifice d este deosebit. 47.
Exemplu: 1235 este deosebit (1235=1225+10). de la

41. Exemplu: B = { (1,1), (1,2), (2,1), (2,2), (3,1),


suma factorialelor cifrelor componente. (3,1)}
Exemplu:
48. cu
42. Se c - = a 3 + b3 + c 3
Exemplu: 3 + 73 + 13 ).
"vale".
Exemplu: 49. n
n. De exemplu,

43.
repetate.
Exemplu: 3*9=27 (3+3+3+3+3+3+3+3+3 sau 9+9+9). 50.

44.
impar ( 51. n
de zero.

No 84 No 85
52. Citindu- ul natural n 60. x
n. eps sin(x)
eps
53.
ma zi- -an cu x

61.
54. conversie este: F=32+9/5
ambele valori ale temperaturii cu mesajele

55. 1
n , Cn2, ... Cnp n p sunt
62.

switch.

63.
56. Pentru n fn, termenul de rangul n din a) 2+ n = y2 .
b) a)*(2b + 1).
f0 = 1 ; f1 = 1 ; fp = fp-1 + fp-2 pentru orice valoare p >= 2.
64.
57. - n x format din n fiecare p
- c a)
x;
c)
x.

58. eps 65.


a formate cu cifrele sale.

59. Pentru n : 66. -


-

No 86 No 87
67. - 74.
nume -
a)
68. - b) , aliniat la dreapta;

75.
69. - func ie de anumite ponderi pentru fiecare criteriu stabilit de profesor.
- Astfel, se vor citi date
- n procente
laborator, ponderea notei de la
cadrul notei finale a notei de la oral, de asemenea,
70. - un program care suma ponderilor
-o apoi pentru 100%, i
scrierea unei alte macro-
(pondere_scris*nota_scris+pondere_oral*nota_oral+pondere_laborator*nota_
- laborator)/100
n care suma ponderilor

71. -
- VALOARE_ABSOLUT~ 76. lui Collatz
(x + delta) natural:

72.
memorat - tip char. valorile -
i 128. a)
numere naturale n,
73. E = ( f o f o . .. o f ) (n)
i 'o' de k ori
maxim b) un program natural

<ore>H:<minute>M:<secunde>S valoarea 1.
Exemplu: pentru un interval de 8358 secunde avem: 2H:19M:18S.

No 88 No 89
77. Seria Farey de ordinul n 80. De pe mediul standard de intrare se introduc trei numerele naturale
reduse, sau egal
cu n. (X1, Y1); (X2, Y2); ... ; (Xk,
Yk); ... Termenii Xk
seria Farey de ordinul n, pentru n citit de formatul: ZZ/MM/AA , MM luna pe
pe mediul standard conform AA

Exemplu:
Exemplu: Seria Farey
0/1, 1/7, 1/6, 1/5, 1/4, 2/7, 1/3, 2/5, 3/7, 1/2, 4/7, 3/5, 2/3, 5/7, 3/4, 4/5, 5/6, 6/7 81.
Reprezentarea acestei serii
(0,1); (1,7); (1,6); (1,5); (1,4); (2,7); (1,3); (2,5); (3,7); (1,2); (4,7); (3,5); (2,3); c
(5,7); (3,4); (4,5); (5,6); (6,7); (1,1).

=1, difer
X1 Exemplu: Un interval de timp rezultat de forma 26H, 90M, 70S nu este
: 27H, 31M, 10S.
Farey: Xk+2 = (Yk+n /Yk+1) * Xk+1 - Xk.
Yk+2 = (Yk+n / Yk+1) * Yk+1 - Yk. 82. ntervale de timp

78.
oate numerele naturale formate cu cifrele sale distincte.

Exemplu: 83. Se c
2 3 8 23 32 28 82 38 83 238 283 328 382 823 832

79.
ozitivul standard de iesire "multiple" 84.
un pr
caz contrar.
85.
Exemplu: a = 32 b=9 nemultiple , supraunitare,
a=40 b=8 multiple

No 90 No 91
86. caracter citit de pe
91. r ate numerele naturale
-un interval de numere dat (a, b) care sunt divizibile cu k.
Format Format octal Format Format binar Caracterul
zecimal hexazecimal
Exemplu:
032 040 020 00100000 SPATIU 92. ere naturale (a,b), a<=b,
125 175 07d 01111101 }

87.
93.
de trei cifre.

94.
cel mai mic numar natural cu n divizori.
88. Exemplu:

95.
re.
Exemplu:
89. deficiente, perfecte abundente prim.

96.
k {2, 3, . . . , n-1} care sunt prime cu n.
Exemplu: n = 12 este abundent deoarece Exemplu: pentru n=8, avem numerele
Sd(12)=1+2+3 + 4+6=16>12,
n = 6 este perfect deoarece Sd(6)= 1 + 2 + 3 = 6 97.
iar n = 14 este deficient deoarece Sd(14)=1+2+7=9<14.
zecimale.
90. Exemplu: x=12345678.377259 102 - 219 = -117

98. conjunctura lui Goldbach.

No 92 No 93
1.6

Exemplu:
1.6.1.
700 = 683 + 17
corect ?
702 = 691 + 11
a) 123 b) -17 c) +843 d) 0154 e) --67
704 = 701 + 3
............
1.6.2. Care dintre construc constante
800 = 793 + 7
caracter?
1)" " 2)'\' 3)'a' 4) ' " ' 5)'\\' 6)'\13' 7)"a" 8)' '
99. calcu u maxim 4000 de
a) i 8) b) toate c) in
Exemplu: 35552=12638025 d) 2), 3), e) 3),

100. realizeaz 1.6.3. A),


se înlocuiesc caracterele * cu cifre de la 0 la 9: din coloana B)
Coloana A) Coloana B)
*** A1) 5.0
** A2) 5
---
**** A4) 05
****
----- A6) 0x5
*****
Observa ie: ial, din rezultatul final, a a) A1 B2, A2 B1, A3 B5, A4 B1, A5 B6, A6 B3
b) A1 B2, A2 B1, A3 B5, A4 B4, A5 B5, A6 B3
c) A1 B2, A2 B1, A3 B5, A4 B4, A5 B6, A6 B3
d) A1 B2, A2 B1, A3 B5, A4 B4, A5 B6, A6
e) A1 B2, A2 B1, A3 B5, A4 B1, A5 B6, A6

1.6.4.

a) float x; b) double x; c) unsigned float x; d) x:float; e) x:double;

No 94 No 95
1.6.5. c) d)
#include<iostream.h> #include<iostream.h>
int main() int main()
{ {
a) int x==2; b) x:int=2; c) int x=2; d) int x 2; e) x=2 : int; \
\ \
} }
1.6.6. e) nici unul dintre programele anterioare

1.6.9. Ce valoare afiseaz


int a=3,b,c;
#include <iostream.h>
float x=-11.23; a) -7 #include <math.h>
int main()
char d; b) -8
{
b=x; d='A'; cs'M'-'N'; c) -9 int x=4, y=-9, z=(x+y)/2, u;
z--;
d) 4
u=(sqrt(x)) + sqrt(abs(y)) / (x+y);
a) variabila x b) variabila c c) variabila d d) variabila a. e) variabila b e) 5 z-=u%2-x-y;
\
}
1.6.7. PI cu valoarea 3.14, folosind
directiva-preprocesor "#def ine".
1.6.10. Fie variabilele ntregi a=1, b=2, c=3, d=4. Care dintre
a) #define 3.14 PI; b) #define PI 3.14; expresii scrise corect, cu valoarea 0?
c) #define float PI 3.14; d) #define PI=3.14;
e) #define float PI=3.14; a) !d b) a+d<d c) a*b+c d) a=b<c
e) (a<b) != (b<c)

1.6.8. 1.6.11.
"Program" si "simplu" unul sub altul (fiecare pe
a) Operatorul de atribuire este "=".
"SAU logic"
c) " !=" este un operator logic.
a) b) a la b.
#include<iostream.h> #include<iostream.h> -
int main() ; main()
{ {
\ 1.6.12. Pentru care dintre seturile de valori ale variabilelor x, y, z
\
} } de mai jos expresia (x<y) < (z!=x) < ( (z-y)<x are valoarea 1?

No 96 No 97
a) x=3; y=5; z=4 b) x=4; y=3; z=4 c) x=3; y=4; z=3 1.6.17. de variabile:
d) x=5; y=4; z=3 e) x=5; y=5; z=5 int a,b,e; float c,d;
Care dintre ncorecte?
1.6.13. Fie variabilele intregi a. si b. Expresia se scrie in C++
astfel: a) a=a*b; b) e=a<c; c) -b=a+a/b;
d) cout << (d=(a+b)/2); e) c*d=a-b;

1.6.18. Fie variabilele a, b, m toate de tipul float. Care dintre


de mai media a
a) ((a*b)+(a-b)/2)/((a-2)/(b-2)-(a/b)) b) (a*b+(a-b)/2)/((a-2)/(b-2)-a/b) numerelor
c) (a*b+(a-b)/2)/a-2/b-2-(a/b) d) ((a*b+(a-b)/2)/a-2/b-2)-a/b
e) (a*b+(a-b)/2)/(a-2/b-2-a/b) a) printf("%f",(a+b+c)/3); b) printf("%f",a+b+c/3);
c) printf("%d",a/3+b/3+c/3); d) printf("%f",((a+b)/2+c)/2);
1.6.14. Fiind cum se scrie corect e) printf("%f",m=(a+b+c)/3);
"a ?
1.6.19. Fie variabilele i u de tipul int.
a) (a<b) && (b<c) b) (a<b) &(b<c) abilei u
c) a<b && b<c d) (a<b) || (b<c) lui x la y?
e) a<b | b<c
a) u+-x%y; b) u=x%y+u; c) u=x/y;
1.6.15. Care dintre urm i d) u+=x/y; e) u=x/y+u;
numai
1.6.20. Fie variabilele a, b, c de tipul int. Care dintre u
a) x-y==2 b) x*y%4==0 expresii se
c) (x+y)%2==0 d) y%x==2 consid echivalente produc n
e) (x%2==0) || (y%2==0)
a) Expresia ! (
1.6.16. Care dintre sunt cu a=b<c
numai
consecutive? d) Expresia (a>c) && (b>c) este echivalen
a) x-y==1 b) (x==1) && (y==2) e) Expresia ! (a>=b | | a>=c)
c) (x-y==1) && (y-x==1) d) y==x 1
e) (x-y==1) || (y-x==1)

No 98 No 99
1.6.21. Fie variabilele x, y, z de tipul int, fiind cunoscute valorile cu ecou, iar getch()
x=3,
getchar() getche() i getch()

a) z=2*x+3*y--; b) z=2*x+3*--y; c) z=2*x +3*y; getchar() i getch() preiau tastei


d) z=2* x+3*y; e) z=2*x+3*y; ENTER
getchar() i getche() preiau fost tastat,
1.6.22. mai ENTER
mai jos sunt e header-ul conio.h
#include <stdio.h>
int main ()
1.6.24. Fie trei variabile
{
int a,b; x [a , b] atunci x ia valoarea
float c;
contrar x ia valoarea lui b".
scanf("%d %d", &a, &b);
printf("%d\n",!a); // (1)
printf ("%d\n",b%2=0 && b>0) ; // (2)
a) x=((x<a) ||(x>b))?a:b; b) x= <x<a||x>b) ? a:b;
printf("%-8.2f\n",float(2*b+a)); // (3)
printf("a=%3d$b=%-3d\n",a,b); // (4) c) x- ((x<a) && (x>b)) ?a :b; d) x= (x<a) | | (x>b) ? b: a ;
}
e) ((x<a)||(x>b))?(x=a):(x=b);

valoarea 0
1.6.25.
b)
codurile succesive ('A' 65, 'B' 66, 'C' 67,
valoarea 0
(3) actere
ecimale, cu aliniere la dreapta
a) 1 #include<stdio.h>
int main()
b) 3 {
respectiv,
c) 69 int x,y,z,p;
a=2 $b= 6 char n,m;
d ) 67
(prin " " am simbolizat caracterul
e) 0 x=m; y=2*m-n; z=3;
e) p=x<y ? (y<z ? z : y) : (z<x ? x : z);
\
scanf }

1.6.23. getchar(), getch() getche() citesc de la


caracter.

No 100 No 101
1.6.26. Presupunem ca sub o versiune 1.6.29.
a limbajului de tipul nu vor produce erori la

valoarea 2? #include<iostream.h> #include <stdio.h>


#include<stdio.h> int main()
int main() ' {
a) nici o dat {
int x; char c;
b) o \
c)
d) de trei ori -2);
e) de patru ori x=sizeof(int); }
x=++x/2;
cout<< (x==2);
} a)
b) Toate trei
c)
1.6.27. Ce valori ? d)
e) Nici una
a) 10 18 16 #include<stdio.h>
int main()
b) 11 18 18 1.6.30. Fie variabilele a, b, c, d, toate de tipul int, cu valorile a=1,
{
c) 10 18 18 int x=10, y=6, m,n,p; nile de mai jos poate fi
n=(m=x++, y++, p=x+y);
d) 11 18 17
\
e) 10 18 17 }

a) a = b = c = d; b) a = (b = c) = d; c) (a = (b = c)) = d;
1.6.28. Ce valoare putem introduce la citirea variabilei y, astfel d) a = ((b = c) = d); e) (a = b = c) = d;
t programul de mai j 1?

#include<iostream.h> 1.6.31. lui n,


#include<iostream.h>
a) 2 int main() n int main()
{
b) 3 programului: {
int x=2, y, z;
char c; int
c) 4 cin >> y; a) n=97;
z=y+3*x++;
d) b) 97 n=c=n;
\ 1 : 0);
}
e) orice valoare } c) 99
d) 79
e) NULL

No 102 No 103
1.6.32. Precizati valoarea pe care o va avea variabila c n urma
executiei programului de mai jos: a) #include<iostream.h>
int main()
b) o
#include<iostream.h> {
int main() c) de doua ori int a, b, x;
cin>>a>>b>>x;
{ d) de trei ori if (!((x<-a) && (x>=b) cout<<1<<"\n";
if (!(x<=a I| x>=b)) cout <<1<<"\n";
int n=99; e) de patru ori if (!(x<=a) && !(x>=b)) oout<<1<<"\n";
c=n+1=c-1; if (!(x<=a) || !(x>=b)) cout <<1<<"\n";
d) NULL }
}
e)

1.6.36. de mai jos:


1.6.33. Fie variabilele a, b, c, de tipul int, cu valorile a=11, b=5,
#include <iostream.h>
c=7. Care dintre expresiile de mai jos are valoarea 1? int main ()
{
int a,b,c;
a) (a | ~b) & 1 b) (~a & b) | 1 a = c = 1; b = 0;
c) (a & ~b) | 1 d) (a & b) |~1 e) (~a | b) & 1 if (a || b)
if (b && !c) cout<<"unu";
else cout << "doi";
}
1.6.34.

a) Nu
b) Textul unu
a) if (a=b) x=b; b) x=a; c) Textul doi
else if (x>b) d) Instru
if (b>a) x=a; x=b; e) Nici un
c) if (b>=a) x=a; d) if (a<=b) x=b;
else x=b; else x=a, 1.6.37.
e)
va afisa x=5?
1.6.35. se va n timpul a) a=- -1
if (a>0)
b) if (b>0) x=8;
variabilele primesc valorile a=3, i x=5. c) -1 else x=5 ;
else x=6;
d) -1 cout << x;
e)

No 104 No 105
1.6.38. primi 1.6.40. de
prin citire 232213, care x valoarea n2, cu n
valorile variabilelor f1, f i f3? variabila auxiliar
#include<iostream.h>
int main() a) x=1;
{ for(i=1;i<3;i++) x*=n ;
long n;
b) x=1;
unsigned int f1,f2,f3,c;
cin >> n; for(i=1;i<=n;i++) x*=2;
f1=f2=f3=0;
a) f1=1, f2=1, f3=1 do{ c) x=1; i=0;
b) f1=1, f2=2, f3=2 c=n%10; while (i<2) x*=n; i++;
n=n/10;
c) f1=1, f2=3, f3=2 switch(c) d) x=1; i=0;
d) f1=2, f2=1, f3=3 { do { i++; x*=n;
case 1: {f1++; break;}
e) f1=3, f2=2, f3=1 case 2: {f2++; break;} } while (i<2);
case 3: {f3++; break;} e) x = x*n;
}
}while(n!=0);
cout << f1 << f2 << f3;
} 1.6.41. de instruc iuni
atribuie v n, cu n atural,
variabila

a) x=10; b) x=1;
1.6.39. Pentru n=7, care program de mai jos
for (i=1; i<=n; i++) for (i=n; i>0; i--)
x*=i; x*=10;
P fie 48?
c) x=1; i=1; d) x=1; i=0;
do { x*=10; while (i<=n) {
i++; i++;
a) b) c) d)
} while (i<n); x*=i;
P=1 ; i=2 ; P=1; i=1; P=1; i=1; P=1; i= 0;
}
while (i<=n) while (i<n/2) while (i<=n/2) while (i<n)
e) Nici una dintre variantele anterioare.
{ { { {
P*=i ; i+=2 ; i++; P=P* (2*i); i+=2;
} P=P* (2*i+1) ; i++; P*=i ;
1.6.42.
} } }
x citite
e) Nici una dintre s
de l n ordine 3,2,4,3,5,10,20,0.

No 106 No 107
a) 0 cin >> x;
b) 1 nr = 0; // Secventa S1 // Secventa S2 // Secventa S3
do{ p=1; s=0; p=1; s=0; p=1; s=0;
c) 2 y=x; for(i=1;i<=n;i++) for(i=1;i<=n;i++) for(i=1;i<=n;i++)
cin >> x; { { {
d) 3
if(x==2*y) p=p*i; s=s+i; p=p*s;
e) 4 nr++; s=s+p; p=p*s; s=s+i;
} while(x!=0); } } }
cout << nr;
a) numai S1 b) numai S2 c) numai S3 d) toate e) nici una
1.6.43. Care va fi valoarea variabilei c afi
1.6.45. Care de
#include<iostream.h> variabilei u valoarea primei cifre a natural reprezentat de
int main() variabila x?
a) 8 {
b) 32 long a,b,c,z,i;
; a) u=x; b) while (u>=10) u=u%1O;
c) 27 cin>>a>>b ;
for(i=1 ; i<=a ; i++) while (u>=10) u=u%10; u=x;
d) 13
{ c) u=x/10; d) u=x%10;
e) 1 c+=z ; e) Nici una dintre variantele anterioare
z*=b ;
}
cout<< ; 1.6.46. Care dintre atribuie
}
prezentat de
variabila x?

1.6.44. Care S1, S2, S3, date mai


a) while (x>=10) x=x/10; b) u=x;

produc a ie) u=x; while (u>=10) u=u%10;

Toate v c) u=x% 10; d) u=x/10;


e) Toate variantele anterioare.

p=1;
for (i=1; i<=n;i++) 1.6.47. Fie n care ok este o
{ int, iar x este un num r natural.
s=0;
for (j=1; j<=i;j++) s=s+j;
ok=0;
p=p*s;
for(i=2; i<x; i++)
if(x % i == 0) ok == 1;
cout<<ok;

Secven

No 108 No 109
nu are nici un divizor propriu 1.6.50.
c) Toate numerele naturale mai mici dec sunt divizori proprii s=0;
ai lui x for(i=3; i<=n; i+=3)
s+=i;
l mult un divizor propriu
e) Nici una dintre variantele de mai sus
Se dau mai jos cinci triplete de numere, fiecare astfel de triplet
reprezent nd un set de valori pentru variabila de intrare n. Care dintre aceste
1.6.48.

12233344444

a) (3, 5, 6) b) (6, 7, 8) c) (10, 11, 12) d) (6, 9, 12) e) (15, 16, 17)
a) b) c)
for ( i=1 ; i<=n ; i++) for (i=1;i<=n;i++) for ( i=1 ; i<=n ; i++)
for for (j=1;j<=i;j++) for
(j=1;j<=n;j++) printf ("%2d",i) ; (j=1;j<=n;j++) 1.6.51.
printf ("%2d",i); printf ("%2d",j) ;

d) e)
for (i=1;i<=n;i++) for (j=1;j<=n;j++) for s=0; t=0; x=3; i=1; y=1; z=1;
for (j=1;j<=i;j++) (i=1;i<=n;i++) a) 1 do{
printf ("%2d",j) ; printf ("%2d",i) ; if(x>0)
b) 5 if(y>1)
c) 6 if(z>2) t=x;
1.6.49. Pentru af else t=x+y;
d) 51 else t=x+y+z;
e) 63 s+=i+t;
i++;
}while(i>7);
S1) S2) cout<<s;
for(i=1;i<=n;i++) for(i=1;i<=n;i++) ;
printf ("%2d",i) ; printf("%2d",i);

1.6.52. Pentru ce valoare a variabilei


int n=10, M;
M, do {
while (n>0) n--;
} while (n!=M) ;
a) 10
S2)
b) orice valoare diferit de 10
S1)
c) 0
S2)

e)

No 110 No 111
1.6.53.
// Programul P3 //Programul P4
(cea a #include <stdio.h> #include <stdio.h>
int main() void main()
{
int c; long d,x,y; {
valoarea 4. int c; long d,x,y;
scanf("%ld",fix);
#include <iostream.h> d=x; y=0; scanf("%ld",&x);
int main() while (d) d=x; y=0;
a) 1, 2, 3, 4 {
{ do
b) 2, 3, 4 c=d % 10;
int n=1, a, b; y=y*10+c; {
c) 1, 3, 4 cin >> a; d=d/10; c=d% 10;
do { } y=y*10+c;
d) 1, 2, 4 printf("%ld",y); d=d/10;
cin >> b;
e) 4, 4,4 n++; } } while (d);
} while(b!=a); printf("%ld",y);
cout << n; }
}
a) P1 i P2
b)

1.6.54. Definim oglinditul unui l x i P4

la dreapta la d)

Exemplu: este 4351. Care dintre programele

1.6.55.
//Programul P1 //Programul P2 :
#include <stdio.h> #include <stdio.h>
int main() int main()
{ { #include<iostream.h>
a) 0,0,0 int main()
int c; long d,x,y; int c; long d,x,y;
scanf("%ld",&x); scanf("%ld",&x); {
b) 0,0,1
d=x; y=0; d=x; y=0; int x,y,m,n,a,b=5;
while (d) do
c) 0,1,1 x=(m=b=n=3,b+4);
{ { y=a=((b=5) ? b-- : --b);
d) 1,1,1
c=d % 10; c=d% 10; if( (!y==a) && (m==n) ) cout <<1; else cout << 0;
y=y+c*10; y=y+c*10; e) 1,0,1 if( !a && b && !m ) cout << 1; else cout << 0;
d=d/10; d=d/10; if( (n=(a+b--)) == (m-x)) cout <<1; else cout <<0;
} } while'(d); }
printf("%ld",y); printf("%ld",y);
} }
1.6.56. n variantele de
trebuie

No 112 No 113
#include <stdio.h>
a) 2,7,3,8,0,0 int main () i=<v1>; x=0; j=<v2>; y=0;
{ while (i<=10) do
b) 2,5,4,4,0,0
int x,y; { {
c) 1,3,6,2,0,0 while (scanf ("%d",&x)=1 && scanf ("%d",&y)=1 && (x | | y)) x+=10; i++; j++; y+=10;
do { } } while (j < <v3>);
d) 2,4,5,8,0,0 printf("*%d *%d",x,y);
} while(x!=y);
e) 0,0 }

a) <v1> 0, <v2> 0, <v3> 11


1.6.57. care: b) <v1> 1, <v2> 0, <v3> 11
c) <v1> 1, <v2> 0, <v3> 10
var d) <v1> 0, <v2> 0,<v3> 12
<v1>, <v2>, <v3> ntregi e) <v1> 1, <v2> 1, <v3> 13
<cond> es
<v1>, <v2>, <v3>, 1.6.59. Ce valoare va afi a programul
<cond>, a .. .+9. #include <iostream.h>
n=<v1>; i=<v2>; S=<v3>; int main ()
{
while ( <cond> )
int i,n,s ;
S=S+i++; a) 0 cin >> n ;
printf("%d",S) ; for(s=0, i=2; i<n/2; !(n%i) ? s=+i++ : i++) ;
b) 9
cout<< s;
c) 12 }
a) <v1> 10, <v2> i, <v3> 0 d) 78
b) <v1> 10, <v2> 1, <v3> 0 e) programul con ine erori
c) <v1> 10, <v2> 0, <v3> 0
d) <v1> 9, <v2> 1, <v3>
e) <v1> 9, <v2> 2, <v3> "i<=n"; 1.6.60.

1.6.58. Se conside n
#include <iostream.h>
care: int main()
toate variabilele ntreg {
int S,x;
<v1>, <v2>, <v3> ntregi for(S=0, x=1; 0; S+=x, cin >> x)
if (!x) break;
cout << S;
Determina i valorile <v1>, <v2>, <v3> }
dintre valorile ix -x=10).

No 114 No 115
5, atunci

1.6.1. a), b), c), d)


1.6.2. e)
1.6.3. c)
1.6.4.
1.6.5. c)
va executa la infinit.
1.6.
1.6.7. b)
1.6.61. la n ordine, numerele 2, 7,
1.6.8.
3, 8, 5, 5, ce valoare va
1.6.9. a)
1.6.10.
a) 0
int a,b, nr=0; 1.6.11. d)
b) 1 do { 1.6.12.
c) 2 cin >> a >> b;
} while ((b!=a) ? ++nr : 0 ); 1.6.13.
d) 3 cout << nr; 1.6.14.
e) 4
1.6.15. e)
1.6.16. e)
1.6.62. Care irul
1.6.17.
cifrelor zecimale
1.6.18.
1.6.19. )
a) b) c) 1.6.20. b), d)
for(i=9; i>=1; i--) for(i=0; i<=9; i++) for(i=9; i-->=1;)
cout << i--; cout << 9-i--; cout << i,i--; 1.6.21.
1.6.22. a)
1.6.23. b)
d) e)
i=10; i=1; 1.6.24.
while (i--) do { 1.6.25. c)
cout << --i; cout << 10 i++;
} while ( i<=9 ? i++ : 0 ); 1.6.26. c)
1.6.27. c)
1.6.28.
1.6.29. e)
1.6.30.
1.6.31. b)

No în limbajul C++ 117


No 116
1.6.32. e)
CAPITOLUL
1.6.33.
1.6.34.
1.6.35. c)
1.6.36. c)
1.6.37. e)
1.6.38. c)
1.6.39.
1.6.40. Tablouri unidimensionale i
1.6.41. b)
1.6.42. d) bidimensionale
1.6.43. d)
1.6.44. b)
1.6.45. b)
1.6.46.
2.1.
1.6.47. a)
1.6.48. b)
1.6.49. d) umim tablou

1.6.50. ordonate, iar accesul la fiecare element are loc prin indice.

1.6.51. c)
1.6.52. d)
1.6.53. b), c) 1. Tablouri unidimensionale (cu un singur indice)

1.6.54. e) 2. Tablouri bidimensionale (cu doi indici)

1.6.55. b) 3.

1.6.56.
1.6.57. 2.1.1. Tablouri unidimensionale
1.6.58.
1.6.59. b)
1.6.60. b)
tip nume_tablou[dimensiune_maxim ];
1.6.61. c)
1.6.62.

No în limbajul C++ 118 No în limbajul C++ 119


Problema 1:

unidimensional.
#include<stdio.h>
int main(void)
unidimensionale: {
int i,n;
float x[50],min,max;
Exemplu: printf("Dati numarul de elemente ale tabloului ");
int a[25]; // declararea unui tablou unidimensional cu maxim 25 scanf("%d",&n);
for(i=1;i<=n;i++)
de elemente, fiecare de tip întreg;
{
float x[30]; // declararea unui tablou unidimensional cu maxim 30 de printf("x[%d]= ",i);
scanf("%f",&x[i]);
char s[40]; // declararea unui tablou unidimensional cu maxim 40 de }
elemente, fiecare de tip caracter; min=x[1];max=x[1];
for(i=2;i<=n;i++)
if(min>x[i]) min=x[i];
else if(max<x[i]) max=x[i];
printf("\nMinimul este %6.2f",min);
printf("\nMaximul este %6.2f",max);
}

Problema 2:
valoarea 0. sunt sa

#include<stdio.h>
int main(void)
anterior: {
int i,n,verif=1;
int x[50];
printf("Dati numarul de elemente ale tabloului X ");
Exemplu: scanf("%d",&n);
a[0] for(i=1;i<=n;i++)
a[24] - {
x[i] - printf("x[%d]= ",i);
scanf("%d",&x[i]);
}
for(i=1;i<=n-1;i++)
if( x[i]>x[i+1] ) verif=0;
if(verif==1) printf("\nNumerele din tablou sunt in ordine
declararea lor: CRESCATOARE");
else printf("\nNumerele din tablou NU sunt in ordine
int b[5]={1,2,3,4,5}; CRESCATOARE");
}
Astfel, elementul b[0] are valoarea 1, elementul b[1] are valoarea 2,
elementul b[2] are valoarea 3, elementul b[3] are valoarea 4, elementul b[4]
are valoarea 5.

No în limbajul C++ 120 No în limbajul C++ 121


2.1.2. Tablouri bidimensionale
declararea lor:
int b[2][3]={ {1, 2, 3}, {4, 5, 6} };

astfel: Astfel, elementul b[0][0] are valoarea 1, elementul b[0][1] are valoarea
2, elementul b[0][2] are valoarea 3, elementul b[1][0] are valoarea 4,
tip nume_tablou[dimensiune_linie][dimensiune_coloan ]; elementul b[1][1] are valoarea 5, elementul b[1][2] are valoarea 6.

Problema 1: cu
(dimensiune (dimensiune_coloana). n m, respectiv m
C=A*B.

bidimensionale: #include<stdio.h>
int main(void)
{
Exemplu: int a[10][10],b[10][10],c[10][10];
int n,m,i,j,k,p;
int a[10][10]; // declararea unui tablou bidimensional cu
printf("Dati dimensiunile matricei A \n");
maxim 100 de elemente (10*10), fiecare de tip întreg;
printf("Dati numarul de linii n = ");
float x[5][5]; // declararea unui tablou bidimensional cu
scanf("%d",&n);
printf("Dati numarul de coloane m = ");
char s[20][10]; // declararea unui tablou bidimensional cu scanf("%d",&m);
maxim 200 de elemente(20*10), fiecare de tip caracter; for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
ii {
printf("a[%d,%d] = ",i,j);
scanf("%d",&a[i][j]);
}
printf("Elementele matricei A sunt : \n");
tabloulu for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++) printf("%d ",a[i][j]);
printf("\n");
}
ale declarate anterior:

Exemplu:
a[0][0] oloana 0
a[9][9] -
x[i][j] -

No în limbajul C++ 122 No în limbajul C++ 123


printf("Dati dimensiunile matricei B \n"); #include<stdio.h>
printf("Dati numarul de linii m = ");scanf("%d",&m); int main(void)
printf("Dati numarul de coloane p = ");scanf("%d",&p); {
for(i=1;i<=m;i++) int a[10][10],b[10][10];
for(j=1;j<=p;j++) int n,m,i,j,min,max;
{ printf("Dati dimensiunile matricei A \n");
printf("b[%d,%d] = ",i,j); printf("Dati numarul de linii n = ");
scanf("%d",&b[i][j]); scanf("%d",&n);
} printf("Dati numarul de coloane m = ");
printf("Elementele matricei B sunt : \n"); scanf("%d",&m);
for(i=1;i<=m;i++) for(i=1;i<=n;i++)
{ for(j=1;j<=m;j++)
for(j=1;j<=p;j++) printf("%d ",b[i][j]); {
printf("\n"); printf("a[%d,%d] = ",i,j);
} scanf("%d",&a[i][j]);
for(i=1;i<=n;i++) }
for(j=1;j<=p;j++) printf("Elementele matricei A sunt : \n");
{ for(i=1;i<=n;i++)
c[i][j]=0; {
for(k=1;k<=m;k++) for(j=1;j<=m;j++) printf("%d ",a[i][j]);
c[i][j]=c[i][j] + a[i][k] * b[k][j]; printf("\n");
} }
printf("Elementele matricei produs sunt : \n"); for(i=1;i<=n;i++)
for(i=1;i<=n;i++) for(j=1;j<=m;j++)
{ b[j][i]=a[i][j];
for(j=1;j<=p;j++) printf("%d ",c[i][j]); printf("Elementele matricei transpuse sunt \n");
printf("\n"); for(i=1;i<=m;i++)
} {
} for(j=1;j<=n;j++) printf("%d ",b[i][j]);
printf("\n");
}
}

Problema 2:
.
2.1.3. Tablouri multidimensionale

Tablorile multidimensionale se pot declara astfel:

tip nume_tablou[dimensiune1][dimensiune2
[dimensiunen];

determinat
.
, dimn) cu

No în limbajul C++ 124 No în limbajul C++ 125


Problema: 3 cuburi mai mici (toate de
bidimensionale:

Exemplu:
int a[10][10][10]; // declararea unui tablou 4 diagonale ale cubului mare.
tridimensional cu maxim 1000 de elemente (10*10*10), fiecare
de tip întreg;
float x[5][5][5]; // declararea unui tablou tridimensional cu #include<stdio.h>
maxim 125 de elemente(5*5*5), fiecare de tip real sim int main(void)
precizie; {
char s[20][10][30]; // declararea unui tablou tridimensional int a[10][10][10];
cu maxim 6000 de elemente(20*10*30), fiecare de tip caracter; int n,i,j,k,suma=0;
printf("Dati dimensiunile matricei A \n");
printf("Dati numarul n = ");scanf("%d",&n);
Exemplu: for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
for(k=1;k<=n;k++)
sizeof: {
printf("a[%d,%d,%d] = ",i,j,k);
scanf("%d",&a[i][j][k]);
#include <stdio.h>
}
int main(void)
for(i=1;i<=n;i++)
{
suma+=a[i][i][i]+a[i][n-i+1][n-i+1]+a[i][n-
int a[20];
i+1][i]+a[i][i][n-i+1];
float x[3][4];
printf("suma=%d",suma);
char t[20][30][40];
}
u tabloul unidimensional
int a[20] este %d\

float x[3][4] este %d\

char t[20][30][40] este %d\


} 2.2. Probleme rezolvate

2.2.1. Enun uri:

1.
a[20] este 40
tabloul bidimensional float x[3][4] este 48
2.
48000

No în limbajul C++ 126 No în limbajul C++ 127


3. 2.2.2. propuse:

4. Problema 1:
se calculeze cel mai mare divizor comun al elementelor tabloului.
5.

6.

#include<iostream.h>
int main(void)
tablouri date, ) {
7. int a,b,i,n,suma=0;
float x[50],media;
bidimensionale) An*m, Bm*p. cout<<"Dati numarul de elemente ale tabloului "; cin>>n;
8. -o matrice for(i=1;i<=n;i++)
{
cu n li n*m) (1 n,m 30).
9. n*m
cin>>x[i];
}
(1 n,m 30). cout<<"Dati numarul a = ";cin>>a;
10. n*n
cout<<"Dati numarul b = ";cin>>b;
for(i=1;i<=n;i++)
a. if( (a<=x[i]) && (x[i]<=b) ) suma+=x[i];
b. produsul ele media=suma/n;
cout<<"Media aritmetica a elementelor din tablou, aflate
c. minimele din elementele aflate deasupra, respectiv sub diagonala
}

d. maximele din elemenetle aflate deasupra, respectiv sub diagonala

11. n*m (1 n,m


se determine linia (liniile) din matri
elemente nenule. Problema 2:

No în limbajul C++ 128 No în limbajul C++ 129


#include<iostream.h> Problema 4:
int main(void)
{ ntregi. Se cere
int i,n,j,a;
float x[50],y[50];
cout<<"Dati numarul de elemente ale tabloului "; cin>>n;
for(i=1;i<=n;i++)
{ #include<iostream.h>
int main(void)
cin>>x[i]; {
} int i,n,cmmdc,r,d;
cout<<"Dati numarul a = ";cin>>a; int x[50];
j=0; cout<<"Dati numarul de elemente ale tabloului ";
for(i=1;i<=n;i++) cin>>n;
if (a<=x[i]) { j++; y[j]=x[i]; } for(i=1;i<=n;i++)
{
"<<a<<endl;
cout<<"Elementele sunt: "<<endl; cin>>x[i];
for(i=1;i<=j;i++) cout }
} r=x[1]/x[2];
while(r!=0)
{
Problema 3: x[1]=x[2];
x[2]=r;
r=x[1]/x[2];
}
d=x[1];
for(i=3;i<=n;i++)
{
#include<iostream.h> r=d/x[i];
int main(void) while(r!=0)
{ {
int i,n,j; d=x[i];
float x[50],y[50]; x[i]=r;
cout<<"Dati numarul de elemente ale tabloului ";cin>>n; r=d/x[i];
for(i=1;i<=n;i++) }
{ d=x[i];
}
cin>>x[i]; cmmdc=d;
} cout<<endl<<" C.m.m.d.c este "<<cmmdc;
i=1; j=1; }
while(i<=n)
{
y[j]=x[i];
y[j+1]=(x[i]+x[i+1])/2;
i=i+1; j=j+2;
}
cout<<"Elementele sunt: "<<endl;

No în limbajul C++ 130 No în limbajul C++ 131


cout<<"Dati numarul de elemente ale tabloului Y ";
Problema 5: cin>>m;
for(j=1;i<=m;j++)
{
(minimul si
cin>>y[j];
maximul) }
i=1;j=1;k=0;
#include<iostream.h> while( (i<=n) && (j<=m) )
int main(void) if(x[i]<y[j]){k++;z[k]=x[i];i++;}
{ else {k++;z[k]=y[j];j++;}
int i,n; if(i<=n) for(j=i;j<=n;j++) {k++;z[k]=x[j];}
float x[50],min,max; else for(i=j;i<=m;i++) {k++;z[k]=y[i];}
cout<<"Dati numarul de elemente ale tabloului "; cout<<"\nVectorul Z cu elementele interclasate este ";
cin>>n; for(i=1;i<=k;i++) cout<<" "<<z[i];
for(i=1;i<=n;i++) }
{

cin>>x[i];
} Problema 7:

min=x[1];max=x[1];
for(i=1;i<=n;i++) (tablouri bidimensionale) An*m, Bm*p.
if(min>x[i]) min=x[i];
else if(max<x[i]) max=x[i];
cout<<endl<<"Minimul este "<<min<<endl;
cout<<"Maximul este "<<max; #include <iostream.h>
} int main(void)
{
int n,m,p,i,j,k,a[10][10],b[10][10],c[10][10];
Problema 6: cout<<"Dati dimensiunile matricei "<<endl;
cout<<"Dati numarul de linii n = "; cin>>n;
cout<<"Dati numarul de coloane m = "; cin>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
Prob ) cout<<"a["<<i<<","<<j<<"]= ";
cin>>a[i][j];
#include<iostream.h> }
int main(void) cout<<"Elementele matricei A sunt: "<<endl;
{ for(i=1;i<=n;i++)
int i,n,j,m,k; {
float x[50],y[50],z[100]; for(j=1;j<=m;j++)
cout<<"Dati numarul de elemente ale tabloului X "; cout<<a[i][j]<<" ";
cin>>n; cout<<endl;
for(i=1;i<=n;i++) }
{

cin>>x[i];
}

No în limbajul C++ 132 No în limbajul C++ 133


cout<<"Dati numarul de linii m = "; cin>>m;
cout<<"Dati numarul de coloane p = "; cin>>p; for(i=1;i<=n;i++)
for(i=1;i<=m;i++) for(j=1;j<=m;j++)
for(j=1;j<=p;j++) {
{ cout<<"a["<<i<<","<<j<<"]= ";
cout<<"b["<<i<<","<<j<<"]= "; cin>>a[i][j];
cin>>b[i][j]; }
} cout<<"Elementele matricei A sunt: "<<endl;
cout<<"Elementele matricei B sunt: "<<endl; for(i=1;i<=n;i++)
for(i=1;i<=m;i++) {
{ for(j=1;j<=m;j++)
for(j=1;j<=p;j++) cout<<a[i][j]<<" ";
cout<<b[i][j]<<" "; cout<<endl;
cout<<endl; }
} min = a[1][1]; max = a[1][1];
for(j=1;i<=m;i++)
for(i=1;i<=n;i++) {
for(j=1;j<=p;j++) if( a[1][j] < min ) min = a[1][j];
for(k=1;k<=m;k++) if( a[1][j] > max ) max = a[1][j];
c[i][j]+=a[i][k]*b[k][j]; }
cout<<"Elementele matricei produs "<<endl; for(i=2;i<=n;i++)
for(i=1;i<=n;i++) for(j=1;j<=m;j++)
{ {
for(j=1;j<=p;j++) if( a[i][j] < min ) min = a[i][j];
cout<<c[i][j]<<" "; if( a[i][j] > max ) max = a[i][j];
cout<<endl; }
} cout<<"Elementul minim din matrice este
} "<<min<<endl;
cout<<"Elementul maxim din matrice este
"<<max<<endl;
}

Problema 8:
-o
Problema 9:
n*m) (1 n,m 30).
n*m (1
#include <iostream.h> n, m 30).
int main(void)
{ #include <iostream.h>
int n, m, min, i, j, max, a[30][30]; int main(void)
cout<<"Dati dimensiunile matricei "<<endl; {
cout<<"Dati numarul de linii n = "; cin>>n; int n,m,i,j,a[30][30],b[30][30];
cout<<"Dati numarul de coloane m = "; cin>>m; cout<<"Dati dimensiunile matricei "<<endl;
cout<<"Dati numarul de linii n = "; cin>>n;
cout<<"Dati numarul de coloane m = "; cin>>m;

No în limbajul C++ 134 No în limbajul C++ 135


for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
for(i=1;i<=n;i++)
{ cout<<"a["<<i<<","<<j<<"]= ";
for(j=1;j<=m;j++)
cin>>a[i][j]; }
{
cout<<"Elementele matricei A sunt: "<<endl;
cout<<"a["<<i<<","<<j<<"]= ";
for(i=1;i<=n;i++)
cin>>a[i][j];
{ for(j=1;j<=n;j++)
}
cout<<a[i][j]<<" ";
cout<<"Elementele matricei A sunt: "<<endl;
cout<<endl; }
for(i=1;i<=n;i++)
// ===== suma elementelor de pe diagonala principala ======
{
suma=0;
for(j=1;j<=m;j++)
for(i=1;i<=n;i++)
cout<<a[i][j]<<" ";
for(j=1;i<=n;i++)
cout<<endl;
if(i==j) suma+=a[i][j];
}
cout<<"Suma elementelor de pe diagonala pricipala este
for(i=1;i<=n;i++)
"<<suma<<endl;
for(j=1;i<=m;i++)
// ==== produsul elementelor de pe diagonala secundara ======
b[j][i]=a[i][j];
produs=1;
cout<<"Matricea transpusa este "<<endl;
for(i=1;i<=n;i++)
for(i=1;i<=n;i++)
for(j=1;i<=n;i++) if(i+j==n+1) produs*=a[i][j];
{
cout<<"Produsul elementelor de pe diagonala secundara este
for(j=1;j<=m;j++)
"<<produs<<endl;
cout<<b[i][j]<<" ";
// ==== minimul elementelor de deasupra diagonalei principale ==
cout<<endl;
min1=32768;
}
for(i=1;i<=n;i++)
}
for(j=1;j<=m;j++) if(i<j)
if(min1>a[i][j]) min1=a[i][j];
cout<<"Minimul de deasupra diag. pricipale este "<<min1;
// ===== minimul elementelor de sub diagonala principale ====
min2=32768;
Problema 10: for(i=1;i<=n;i++)
n*n for(j=1;j<=m;j++) if(i>j)
if(min2>a[i][j]) min2=a[i][j];
a. cout<<"Minimul de sub diag. pricipala este "<<min2;
b. produsul ele // == maximul elementelor de deasupra diagonalei principale ====
max1=-32768;
c. minimele din elementele aflate deasupra, respectiv sub diagonala for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(max1<a[i][j]) max1=a[i][j];
d. maximele din elemenetle aflate deasupra, respectiv sub diagonala cout<<"Maximul de deasupra diag. pricipale este "<<max1;
// ==== maximul elementelor de sub diagonala principala ====
max2=-32768;
#include <iostream.h> for(i=1;i<=n;i++)
int main(void) for(j=1;j<=m;j++)
{ if(max2<a[i][j]) max2=a[i][j];
int n,m,i,j,a[30][30],min1,min2,max1,max2,suma,produs; cout<<"Minimul de sub diag. principala este "<<max2;
cout<<"Dati dimensiunile matricei "<<endl; }
cout<<"Dati numarul de linii si de coloane n = ";
cin>>n;

No în limbajul C++ 136 No în limbajul C++ 137


Problema 11: 2.3. Probleme propuse spre rezolvare
n*m (1 n,m

elemente nenule.

1.
#include<iostream.h>
int main(void) tablou a
{
int a[30][30], n, m, i, j, max, nr;
cout<<"Dati numarul de linii n = "; cin>>n; 2. aT * b, unde a
cout<<"Dati numarul de coloane m = "; cin>>m; b sunt doi vec
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{ 3. v, de dimensiune
cout<<"a["<<i<<","<<j<<"]= ";
cin>>a[i][j]; n
} r.
cout<<endl<<"Matricea A are elementele:"<<endl;
for(i=1;i<=n;i++) 4.
{
for(j=1;j<=m;j++) cout<<a[i][j]<<" "; numerice, a b s ce
cout<<endl; a b.
}

max=0; 5. v n p componente
for(i=1;i<=n;i++)
{
nr=0;
for(j=1;j<=m;j++)
if(a[i][j]!=0) nr++; 6. m de dimensiune n*n
if(max<nr) max=nr;
}
-m
for(i=1;i<=n;i++)
- m asupra
{
nr=0; diagonalei principale sunt nule.
for(j=1;j<=m;j++)
if(a[i][j]!=0) nr++;
if(max==nr) cout<<"Linia "<<i<<" are 7. n m coloane (1< n, m < 10)
"<<max<<" elemente nenule"<<endl;
} k elemente nule (0 < k
} k
elemente nule.

No în limbajul C++ 138 No în limbajul C++ 139


8. a cu ma ma b cu xk = y1
mb mb b xk+1 = y2
este o submatrice a lui a k, l t : ak+i-1, l+j-1 = bi, j cu ...
k l. xk+ny-1 = yny
k.
9. x n
v v 16. a, are p q
v. n caz b din matricea a

b.
10. - s cu n
17. x y ordonate strict cre m n
n (n <= 100). z
11. Dintr- a cu l c x y

18. x, cu n elemente
ordonate stri
12. un valori alfa
alfa < x1, x1
x.

13. x cu n componente, ordonat 19. a


y x astfel

14. -se o valoare x a cu n


20. ablou unidimensional cu n (1 n 100) componente numere
x
x. componentele

15. x cu nx y cu ny 21. n 100) componente numere


y x naturale.
k

No în limbajul C++ 140 No în limbajul C++ 141


22. n 100) componente numere 29. ealizeze inversarea unui vector:

-un alt vector


Exemplu: te x = {1, 2, 3, 4 }, atunci cel inversat va fi
23. {4, 3, 2, 1}

30.

al.
24. Exemplu :

celu 31. : negativ,


Exemplu: negativ, pozitiv, negativ, negativ, pozitiv, etc.
Exemplu : Vectorul {-1,-2,3,-5,-6,2,- ;
vectorul { -1,2,-3,-

25. n*m (1 n,m 32. divizor comun a n numere - cmmdc (x1, x2, .
uma componentelor de pe marginea . . ,xn).
matricei. Exemplu : cmmdc(2940,882,70,182) = 14.

26. n*m (1 n,m 33. -

Exemplu :
27. 2 (1 n 30)
problemei

28. 34. -un vector de

Exemplu :
Exemplu: x= {10,3,5,8}

No în limbajul C++ 142 No în limbajul C++ 143


35. 41.
- -un vector.
Exemplu :
Exemplu :
vectorul rezultat va fi {4,6,3,5}.
42.
36. -
majoritar Exemplu :

Exemplu : . 43.

37. Exemplu :
.

44. Se dau doi vectori { a1, a2 n } i { b1, b2 n }. Dac


Exemplu :
: 12, 65, 29.5, 65.55, 67. ial.
Exemplu: Pentru vectorii a = {5, 2, 8, 1, 3} i b = {1, 3, 5, 2, 8}, se va ob ine
38. vectorul a = {5, 2, 5, 8, 3, 8, 1, 3}
consecutive din vectorul x de numere reale.
Exemplu : Pentru 45. x = { x1, x2
xn } ce con ine primii n termeni consecutivi ai irului:
1, 1, 2, 1, 2, 3,
39. Ob inut din
prim a cu secven a 1, 2, ..., a i a fiec rui num r natural neprim b prin
.
Exemplu :
(361,2), (1156,4), (4,0). 46. trei numere natural ite la acela
natural n dau resturile 7, 9, respectiv 11.
40. a) determina i cel mai mare num r care ndepline te condi iile de mai sus;
, 3, . . ., n}. b) determina te condi iile de mai sus;
Exemplu : Exemplu: Fie numerele 247, 297 i 347.
{1,2,3,4,5,6}. a)

No în limbajul C++ 144 No în limbajul C++ 145


b) 49. Fie m ir de n numere reale, iar y
Indica ie: un ir de m numere reale. S de formeze matr i n
a) Se aplic irii cu rest: :
247 : n c i restul 7 n * c1 = 240 max{xi j, yi j}, dac
297 : n c i restul 9 n * c2 = 288 a[i][j] =
347 : n c i restul 11 n * c3 = 336 min{xj i, yj i

axim = cmmdc (240, 288, 336) 50. Se dau m a A,


de dimensiuni m*n, din elementele irului:
b) 1, 1, 2, 4, 3, 9, 27, 1, 4, 16, 5,
( itorul mai mare dec t restul irul este ob inut din
i num a (1, a, a2), i nlocuirea fiec rui num r impar b cu
pentru care (x-7), (y-9) i (z-11) se divid la el. secven a (b, b2, b3).

47. :
0, dac 2 + j2
a[i][j] =

matricei. 0 0 1 0
Exemplu: Pentru n = 4, matricea corespunz : 0 1 0 1
1 0 1 0
0 1 0 1

Cel mai mare num

48. Se dau valorile m e formeze matricea A


cu m linii i n coloane cu elementele irului:

No în limbajul C++ 146 No în limbajul C++ 147


2.4. d) e)
p=1; p=0;
for(i=0;i<n;i++) for(i=0;i<n;i++)
if(v[i] % 10 == 0) if(v[i] / 10 == 0)
p=p*v[i]; p=p*v[i];
2.4.1. Care dintre program de mai jos cout << p; cout << p;
elementele v[0] , v[1] , v[2], . . . , v[n-1] ale unui vector de

2.4.3. Care dintre pentru


e?
a) b)
i=0; i=0; p=0;
while(i<n) while(i<n) for(k=1; k<6; k++)
{ { if(v[k]>v[p])
cout<<v[i]; i++; p=k;
i++; cout<<v[i]; cout << p;
} }

b) Ciclul for
c) d)
i=0; i=0; c) (v[0] ,vfi],... ,v[5]) sunt 5,4,-11,9,-12,1
do do valoarea 4.
{ {
i++; cout<<v[i]; d) elementele vectorului (v[0] ,v[i],... ,v[5]) sunt 3,-2,8,6,11,4,
cout<<v[i]; i++; 4.
}while(i<n); }while(i<n);
e)
e) nici una; valoarea 0.

2.4.4.

2.4.2.
produsul elementelor pare ale unui vector v = {v[1], v[2], . . ., v[n]} int i=0, v[5]={1,1,1,1,1};
while( i<5 && v[i] && !v[i])
? {
v[i]=0;
i++;
a) b) c) }
p=1; p=1; p=0;
for(i=1;i<=n;i++) for(i=0;i<n;i++) for(i=0;i<n;i++) a) Expresi
if(v[i] % 2 == 0) if(v[i] / 2 == 0) if(v[i] % 2 != 0)
b)
p=p*v[i]; p=p*v[i]; p=p*v[i];
cout << p; cout << p; cout << p; c)
d)
e) u infinit.

No în limbajul C++ 148 No în limbajul C++ 149


2.4.5.
-1] } este un vector cu n elemente

x = v[n-1]; int i,j;


for(k=n-1; k>0; k--) int v[7] = {0,2,7,3,4,8,5};
v[k] = v[k-1]; a) 2,4,8 int a[7] = {0,0,0,0,0,0,0};
v[0] = x; for (i=0; i<7; i++)
b) 7,5
if(( v[i] % 2 == 0 ) && ( i % 2 != 0 ))
c) 2,8 {
d) 2,3,8 a[j] = v[i];
b) j++;
e) 7,3,5 }
c) terge un
d) circular vectorul cu
e) Nici una dintre variantele anterioare.

2.4.6. n care v este un vector p = -n;


for(i=0; i<n;i++)
c p if(v[i] == x)
p=x;
for(p=1, k=1; k<0; k++) for(i=p+1; i<n; i++)
if( v[k] == v[k-1] ) v[i-1]=v[i];
p = 0; for(i=0; i<n-1; i++)
cout << p;

a) Pentru i v=(5,6,2,7,1),
b) Toate elementele sunt egale.
nemodificate ale vectorului: 5 6 2 7
c)
b) Pentru n=5, i v=(2,i,3,i,4), 314
d) egale.
c) de
e) Nici una dintre variantele de mai sus.
d) din vector elementul cu valoarea x, prin mutarea cu o

#include<iostream.h> mai lui


int main() e) din vector elementul cu valoarea x, prin mutarea cu o
{
int v[]={0,1,2,0,4,5,6}; a elementelor aflate dupa el
int i=0, nr=0;
a) 0 do{
if(i==v[i]) nr++; 2.4.10.
b) 1
}while( i<6 && v[i++]);
c) 3 cout << nr;
}
d) 5
a) int a[15][10]; b) int a[15,10]; c) a[15][10] int;
e) -un ciclu infinit
d) int a[10][15]; e) int a[10,15];

No în limbajul C++ 150 No în limbajul C++ 151


2.4.11. Care 2.4.13. Fie o matrice a cu m linii *
de mai jos? dintre de mai jos
vectorul b= (b[0] ,b[1],... ,b [m-1]) elementeie maxime de pe liniile
a) matricei? ...
,m-i)

n = 3;
b) for(i=0; i<n; i++) a) b)
a[i][i] = 0; for(i=0;i<m;i++) for(i=0;i<m;i++)
for(i=0; i<n; i++) { {
for(j=i+1; j<n; j++) x=a[i][0]; x=a[i][n-1];
c)
{ for(j=1;j<n;j++) for(j=1;j<n-1;j++)
a[i][j] = 1; if(a[i][j]>x) if(a[i][j]>x)
a[j][i] = -1; x=a[i][j]; x=a[i][j];
} b[i]=x; b[i]=x;
} }
d)

c) d)
e)
for(i=0;i<m;i++) for(i=0;i<m;i++)
{ {
x=a[i][n-1]; x=-MAXINT;
for(j=n-2;j>=0;j--) for(j=0;j<n;j++)
if(a[i][j]>x) if(a[i][j]>x)
x=a[i][j]; x=a[i][j];
2.4.12. n s=3; nr=0; b[i]=x; b[i]=x;
matrice cu m linii for(i=0;i<m;i++) } }
for(j=0;j<n;j++)
i n coloane cu if( . . . . . . . . . . . . . . )
ar m este { e) anterioare
s+=a[i][j];
de tipul float. nr++;
}
m=(float) s / nr;
2.4.14. Se a
este o cu m linii * n coloane, iar x este o
if lui elementele matricei se
presupun cunoscute (citite anterior).
a) (a[i][j]>0) && (i%2==0) && (j%2!=0) // Secventa S1 // Secventa S2
for(j=x+1; j<=n-1; j++) for(j=n-1; j>=x+1; j--)
b) (a[i][j]>0) && ((i+j) %2!=0)
for(i=0; i<=m-1; i++) for(i=m-1; i>=0; i--)
c) (a[i][j]>0) && (i/2==0) && (j%2!=0) a[i][j-1]=a[i][j]; a[i][j-1]=a[i][j];
d) (a[i][j]>0) && (i/2 !=0) && (j%2==0)
e) Nic :

No în limbajul C++ 152 No în limbajul C++ 153


a) 2.4.16. Se cu m, respectiv, n elemente de

mai jos sunt


b)

k=0;
tricea va fi for(i=0,i<m;i++)
for(j=0,j<n;j++)
if(u[i]==v[i])
w[k++]=u[i];

c) c) Pentru vectorii u = (2, - -3, 4, 2, 5) cu n=4


elemente, se va -3)
d) Pentru vectorii u = (3, 7, 3) cu m=3 v = (2, 7, 2 ,3) cu n=4
n urma (3, 7)
e) Pentru vectorii u = (1, -2, 6) cu m = 3 v = (3, 4, 8 ,9) cu n=4
d) t eronate din punct de vedere sintactic. elemente, la finele date vectorul w nu va avea nici un
e) Nici un element
f) dintre vectorii u, v nu nici
2.4.15. Fie s un element, atunci nu va nici un
element

int i=0, v[6]={ . . . . . }, s;


for(s=5, i=1; i<6; s-=v[i]-v[i-1], i++);
cout << s; 2.4.17. :

int main()
{
a) Primul element al vectorului este 5, iar celelalte elemente sunt nule a) I int *a[10], (*b)[10];
int x, y[10];
b) Ultimul element al vectorului este 5, iar celelalte elemente sunt nule b) II
a[0]=&x; // (I)
c) c) III b=&y; // (II)
a[4]=y; // (III)
elementul d) IV
b=&y[4]; // (IV)
d) e) nici una }

e) Toate elementele vectorului au valoarea 5

No 154 No 155
#include<iostream.h>
2.4.18. int main()
{
int m[20], i, n=10, s;
jos: #include<stdio.h> m[0]=m[1]=1 ;
int main() for(i=2; i<n;i++)
{ m[i]=m[i-1] + i%3;
a) int **a[10], *b[10], c[10]; for(s=*m;, i=1; i<n; i++)
b[3]=&c[5]; s=( *(m+i) != *(m+i-1) ) ? s+*(m+i) : s;
b) a[4]=&b[3]; cout << s;
c) III c[5]=3; }
\ ); // (I)
d) i IV \ // (II) a)
e) nici una \ // (III)
pri \ // (IV)
} b)
c) din a
d) m prin intermediul
2.4.19. pointerilor

#include<stdio.h> e) Nici un
int main()
a) Adresa lui b {
int x=12; 2.4.22.
b) Adresa lui a[2] int *a[10], *&b=a[2]; #include<iostream.h>
c) 12 b=&x; int main()
\ a) nici o
d) NULL {
} b) o int *a[5], i=0, v[5], x=30;
e) while(i+<5) v[i]=x/i;
c)
for(i=1; i<5;i++)
d) de trei ori *(a+i)=&v[i];
2.4.20. : a[0]=&x;
e) Programul
for(i=0; i<5; i++)
eroarea "Divide error" din \
}
pointer ptr ?

a) int *(ptr[4])=&y; b) int (ptr*) [4]=&y; c) int (*ptr) [4]=&y;


d) int ptr* [ 4 ] =&y; e) int *ptr [ 4 ] = &y;
2.4.23.

2.4.21.
timpul

No 156 No 157
#include<iostream.h> 2.4.25.
int main()
{
int a[20][20], i, j, n=4;
for(i=0; i<n; i++)
for(j=0; j<n;j++) #include<iostream.h>
*(*(a+i)+j) = ( i>j ) ? ( j-i ) : ( j+i ); int main()
int m=10; {
for(i=0; i<n; i++) int x[4]={1,2,3}, y[4]={4,5,6,7}, z[7], i,j;
programul este eronat for(j=0; j<n;j++) for(i=0; i<4; i++)
if ( m > (*(a+i)) [j]) ) *(z+i) = *(y+i);
m=a[i][j]; for(j=0; j<3; i++)
\ *(z+i+j) = *(x+j);
} for(i=0; i<7; i++)
cout << *(z+i);
}
2.4.24.

#include<stdio.h>
int main()
{ a) 1,2,3,4,5,6,7
int u[4] = {1,2,3,4}, v[4]= {5,6,7,8}, w[4] = {0,0,0,0} i; b) 7,6,5,4,3,2,1
int (*x) [4] = &u, (*y) [4] = &v, (*z) [4] = &w;
for(i=0; i<4;i++) c) 3,2,1,7,6,5,4
d) 4,5,6,7,1,2,3
}
e) Programul este eronat

Care dintre
a) memorie
b)
c) Valoarea lui (*x) [2] este 3
d) Valoarea lui (*y) [4] este 8
e) din ciclu este , din cauza folosirii
operatorului

No 158 No 159
2.5. R spunsuri CAPITOLUL

2.5.
2.5.2. a)
2.5.
2.5.
2.5.5. d)
2.5.6.
2.5.7. b)
2.5.8. c) 3.1. iruri de caractere
2.5.9. e)
2.5.10. a)
2.5.11. b) atel
2.5.12. a), c)
2.5.13. e) folosit.
2.5.14. b)
2.5.15.
2.5.16. a), c) tablouri unidimensionale de caractere.
2.5.
2.5. Declararea unui tablou de caractere se face astfel:
2.5.19. c)
char num_tablou[dimensiune_maxima];
2.5.20. c)
2.5.21. b)
2.5.22. c)
Exemple:
2.5.23. d) char sir[20]; // tablou de 20 de caractere
2.5. char t[10]; // tablou de 10 caractere
2.5.25. d)

No 160 No 161
caractere:
- stdio.h gets()
char
puts().
- string.h le vom prezenta mai
departe.

L i m b a j u l C - t e o r i e s i a p l i c a t i i \0

sir[0] - Problema 1:
a)
caractere dat ca paramentru.
b)
adaug c)
fgets() gets() caractere.
d)

Exe

#include<stdio.h>
// determinarea lungimi unui sir
#include<stdio.h> int unsigned lungime(char a[])
int main(void) {
{ int i = 0;
char sir[256]; while( a[i] != NULL ) i++;
int i; return i;
for(i=0;i<26;i++) }
sir[i] = 'A' + i; // copierea unui sir in alt sir
sir[i] = NULL; char copiaza(char dest[], char sursa[])
printf("Sirul de caractere contine: %s\n",sir); {
} int i = 0;
while( sursa[i] != NULL )
{
dest[i] = sursa[i];
i++;
Sirul de caractere contine: ABCDEFGHIJKLMNOPRSTUVXYZW }
dest[i]=NULL;
}

No 162 No 163
// concatenarea a doua siruri
char concatenare(char a[], char b[]) #include<stdio.h>
{ char *stergere(char *sir, char *subsir)
int i=0,j=0; {
while(a[i]!=NULL) i++; int i,j,k,poz=-1;
while(b[j]!=NULL) // cauta subsirul in sirul dat si retine pozitia de unde incepe
{ a[i]=b[j];j++;i++; } for(i=0;(sir[i]) && (poz == -1);i++)
a[i]=NULL; for(j=i, k=0; sir[j]==subsir[k]; j++,k++)
} if(!subsir[k+1]) poz=i;
if(poz!=-1) // daca subsirul a fost gasit
// cauta un subsir in altul {
int cauta_sir(char sir[], char subsir[]) for(k=0;subsir[k];k++) ; //numara cate caractere are
{ subsirul
int i,j,k,nr=0; for(j=poz, i=poz+k; sir[i]; j++, i++) sir[j]=sir[i];
for(i=0;sir[i];i++) sir[j]=NULL;
for(j=i, k=0; sir[j]==subsir[k]; j++,k++) }
if(!subsir[k+1]) nr++; return sir;
return nr; }
} int main(void)
{
int main(void) char sir[256],sir1[256];
{ printf("\nDati sirul "); gets(sir);
char sir[256],sir1[256],sir2[256]; printf("\nDati subsirul care se sterge "); gets(sir1);
printf("\nDati sirul "); gets(sir); printf("Sirul ramas dupa stergere este %s",
printf("Sirul de caractere are %d caractere\n", stergere(sir,sir1));
lungime(sir)); }
printf("\nDati sirul sursa "); gets(sir1);
copiaza(sir2,sir1);
printf("\nSirul destinatie este: %s",sir2);
printf("\nDati sirul 1 "); gets(sir1);
printf("\nDati sirul 2 "); gets(sir2); Problema 3:
concatenare(sir1,sir2); r ersie
printf("\nSirul concatenat este: %s",sir1);
printf("\nDati sirul "); gets(sir); dintr- -
printf("\nDati subsirul care se cauta "); gets(sir1);
printf("Subsirul dat apare de %d ori",
cauta_sir(sir,sir1));
} IE LA CE FOLO TE
atof -
precizie
atoi -
Problema 2: întreg
atol -
- întreg de tip long
un alt strtod ntr- r real
dubl precizie
strtol - r de
tip long

No 164 No 165
#include<stdio.h> 3.2. Probleme rezolvate
#include<stdlib.h>
int main(void)
{
int numar_int; 3.2.1. Enun uri
float numar_real;
long numar;
numar_int = atoi("6789");
numar_real = atof("12.345"); transmis ca parametru.
numar = atol("1234567890L");
printf("%d %f %ld\n", numar_int, numar_real, numar);
} cu litere mici.

Problema 4: caracterele, citite de


r
dintr- -

IE TE
itoa - ir de
caractere
ftoa -
ir de caractere
ultoa r de tip unsigned long într- Problema 1:
un ir de caractere

transmis ca parametru.

#include<stdio.h> #include<iostream.h>
#include<stdlib.h> int lungime(char s[30])
int main(void) {
{ int i;
int numar_int=6789; i=0;
float numar_real; while(s[i]!=0) i++;
long numar=1234567890L; return i;
char sir[25]; }
int main(void)
itoa(numar_int, sir, 10); {
printf(" numar = %d sir = %s\n", numar_int, sir); char s[30];
ltoa(numar, sir, 10); int l;
printf(" numar = %ld sir = %s\n", numar, sir); cout<<"Dati sirul de caractere ";cin>>s;
} l=lungime(s);
cout<<"Numarul de caractere ale sirului este "<<l;
}

No 166 No 167
Problema 2: int main(void)
{
char s[30];
int l;
cout<<"Dati sirul de caractere ";cin>>s;
#include<iostream.h> cout<<"Prefixele sirului dat sunt : "<<endl;
void litere_mici(char s[30]) prefixe(s);
{ }
int i;
i=0;
while(s[i]!=0) Problema 4:
{
if( (s[i]>=65) && (s[i]<=90) ) s[i]=s[i]+32;
i++;
}
return;
#include<iostream.h>
}
int rima(char s[30],char t[30])
int main(void)
{
{
int i,j;
char s[30];
i=0;
int l;
while(s[i]!=0) i++;
cout<<"Dati sirul de caractere ";cin>>s;
j=0;
litere_mici(s);
while(t[j]!=0) j++;
cout<<"Sirul transformat in litere mici este "<<s;
if( (s[i]==t[j]) && (s[i-1]==t[j-1]) ) return 1;
}
else return 0;
}
int main(void)
{
Problema 3: char s[30],t[30];
int l;
cout<<"Dati primul sir de caractere ";cin>>s;
cout<<"Dati al doilea sir de caractere ";cin>>t;
toate caracterele, citite de if( rima(s,t)==1 ) cout<<s<<" rimeaza cu "<<t;
else cout<<s<<" NU rimeaza cu "<<t;
}
#include<iostream.h>
void prefixe(char s[30])
{
int i,j;
i=0;
while(s[i]!=0) Problema 5:
{
for(j=0;j<=i;j++) cout<<s[j];
cout<<endl;
i++;
}
return;
}

No 168 No 169
#include<iostream.h>
int main(void) 3.3. Probleme propuse spre rezolvare
{
char s[50];
int voc=0,cons=0,i;
cout<<"Dati sirul de caractere ";cin>>s;
i=0; 1. S it de la
while(s[i]!=0)
{
switch (s[i]){
case 'a':
Exemplu :
case 'e':
case 'i':
case 'o':
Sufixele sunt
case 'u':
case 'A':
case 'E':
case 'I':
case 'O': 2. litere :
case 'U': {voc++;break;}
default : cons++;
} cu litere mici.
i++;
}
cout<<"Numarul de vocale ale sirului este Exemplu :
"<<voc<<endl;
Si respectiv
cout<<"Numarul de consoane ale sirului este
"<<cons<<endl; b)
}

3.
caractere speciale)

Exemplu: irul 'AbcdeFGHijklMNOPRstu' devine 'AbCdEFGHIkLMNOPRsTU'.

4.

majuscule.

Exemplu : n textul "Acesta este un exemplu destul de banal" litera 'a' apare
de 4 ori.

No 170 No 171
5. Exemplu : -a nascut la Bucuresti in 1874 pe 4 mai. A trait mai bine

Exemplu : ar A = ( 10.

nd s-
6. -un text.
11. rime
Exemplu :

7. Exemplu : e.
. ; ,
12.

Exemplu :
Exemplu : Pentru fraza "Acesta este un exemplu simplu, dar bun, de fraza ."
8.
-a

13.
Exemplu : separa
Elevul iese la tabla formate din k caractere .
El raspunde la intrebarile profesorului
Daca raspunde corect ia nota mare Exemplu :
- .

9. 14. -

caracterelor-
Exemplu :

No 172 No 173
15. Exemplu:
, una sub alta, toate perechile de vocale situate pe pozi ii consecutive ordine, cuvintele: TUDENT, SUDENT, STDENT, STUENT, STUDNT,
STUDET, STUDEN.

Exemplu : 20.
ca am cumparat- .

Exemplu :
16.
21.
s e
, . ;
pot fi convertite.
Exemplu : si mi-a dat o
Exemplu :
era eleva. El era student si mi- merelor

17.
- 22.
-
ir.

Exemplu: Exemplu :

18.

3 cuvinte de lungime 4
4 cuvinte de lungime 5
Exemplu : 2 cuvinte de lungime 6

19. de lungime de cel mult 20 de


caractere 23. -
un text cu liter -a facut

No 174 No 175
27.

Exemplu : NFOINFO'.
Exemplu :
28.

24. -un text toate cuvintele care majuscule.

Exemplu :

Exemplu :
insistat sa- 29.
epaorpa perfect asa ca ma insistat sa- par doar
-
25. -un text dat care sunt mai lungi considera distincte de majuscule. Nu se vor folosi alte tipuri structurate de
ul dat cuvintele sunt date.

Exemplu :
Exemplu : afi
a
valoarea 3. 30.
\ \ \ \
26.

31.
Exemplu : !!! Nota 1
alfabetului.
celui final 26.
Exemplu :
permutarea literelor.

No 176 No 177
32. Se c 3.4.

sau a
Exemplu :
,
rei ori fiecare.

33.
de tipuri de date co
mai multor date, de diverse tipuri care pot fi prelucrate fie individual, fie ca o
-
toate,
struct.
O -un

Exemplu :

34.
3.4.1. Definirea structurilor

Exemplu : 2=22676644).
{
elementele structurii
};

complex:

Exemplu:
struct complex
{
double real;
double imaginar;
};

No 178 No 179
3.4.2. 3.4.4. Tablouri de structuri

sau

{ Exemplu: struct complex tablou_z[10]; // tablou u


elementele structurii 10 elemente de tip complex
Accesul la elementele tabloului se face la fel ca la variabilele simple:
tablou_z[i].real -al i-lea element al tabloului.

lista de varia 3.4.5. Pointeri la structuri

Exemplu: Structurile pot fi param


struct complex z1, z2;
sau
struct complex
{ *nume_pointer;
double real,imaginar;
}z1, z2;
Exemplu: struct complex *pz;

Accesul la elementele unei structuri folosind pointerii se face cu ajutorul


3.4.3. Accesarea elementelor unei structuri operator ->
Exemplu: z->real=3; z->imaginar=-2;

Expresie Efect
membru al structurii se face astfel: (++p)->m
++p->m
Exemplu: (p->m)++ increment -
[Link]=0.1 element al structurii ++(p->m) ->m) înainte de acces
[Link]=0
structurii

No 180 No 181
3.4.6. Tipuri definite de utilizator

union nume_uniune
{
programelor.
elementele uniunii
};

typedef tip_de_date_existent tip_de_date_nou;

Exemplu: typedef int INTREG;


Tipul de date int l-
3.5. Probleme rezolvate
cadrul programului respectiv, unde am f
denumire
i pentru structuri putem redefini astfel: 3.5.1. Enun uri

Exemplu: 1.
typedef struct complex
{
double real, imaginar;
}COMPLEX; calculul modulului unu
sau
typedef struct
{ 2.
double real, imaginar;
}COMPLEX;

:
dimensional sau bidimensional) este transmis
-

3.4.7. Uniuni
masivul respectiv.

pentru fiecare membru al structurii a ca un tot 3.


main()
pentru to Pentru acea
utilizator uniune - union.

No 182 No 183
: Spre deosebire de probl
complex inmultire(complex a,complex b);
complex conjugat(complex a);
double modul(complex a);
int optiune; // variabila folosita pentru a alege varianta
dorita
double w;
4. union
char raspuns; // variabila folosita pentru continuarea
de alegere a unei figure geometrice dorite introducerii
// datelor de intrare
-i calculeze aria.
clrscr();
do{
cout<<" Introduceti partea reala a numarului X : "
;cin>>[Link];
3.5.2. Solu ii propuse cout<<" Introduceti partea inaginara a numarului X :
";cin>>[Link];
cout<<" Introduceti partea reala a numarului Y :
Problema 1: ";cin>>[Link];
cout<<" Introduceti partea imaginara a numarului Y :
";cin>>[Link];
a unui nu cout<<" \n Doriti sa continuati ( D / N ) : "<<endl;
raspuns=getch();
}while(raspuns=='d' || raspuns=='D');
clrscr();
while(1)
{
#include <iostream.h> cout<<" Operatia :"<<endl;
#include <conio.h> cout<<" 1 : Adunarea a doua numere complexe\n";
#include <stdlib.h> cout<<" 2 : Scaderea a doua numere complexe \n";
#include <math.h> cout<<" 3 : Inmultirea a doua numere complexe \n";
#include <dos.h> cout<<" 4 : Conjugatul unui numar complex\n";
cout<<" 5 : Modulul unui numar complex\n";
typedef struct cout<<" 6,7,8,... : EXIT\n";
{ cin>>optiune;
double re; // re = partea reala a numarului switch (optiune) {
double im; // im = partea imaginara a numarului case 1 :
} complex; z=adunare(x,y);
cout<<"Adunare z = " <<[Link] <<" + "<< [Link]<<
int main(void) "*i\n";
{ delay(5000); // intarzie afisarea pe ecran a datelor
complex x,y,z; // x,y,z sunt de tip COMPLEX clrscr();
complex adunare(complex a,complex b); // tipul returnat de break;
functii case 2 :
complex scadere(complex a,complex b); // este tot COMPLEX z=scadere(x,y);
cout<<"Scadere z = " <<[Link]<< " + "<<[Link]<<"
*i\n";
delay(5000);
clrscr();
break;

No 184 No 185
case 3 :
z=inmultire(x,y); complex conjugat(complex a)
cout<<"Inmultirea lui x cu y este z = "<<[Link]<<" {
+ "<<[Link]<<" *i"<<endl;; complex rezultat;
delay(5000); [Link]=[Link];
clrscr(); [Link]=-[Link];
break; return rezultat;
case 4 : }
z=conjugat(x);
cout<<"Conjugatul lui x este z = "<<[Link]<<" double modul(complex a)
+"<<[Link]<<"*i"<<endl; {
delay(5000); double rez;
clrscr(); rez=sqrt([Link]*[Link]+[Link]*[Link]);
break; return rez;
case 5 : }
w=modul(x);
cout<<"Modulul lui x este w = "<<w<<endl;
delay(5000);
clrscr();
break; Problema 2:
default : exit(0);
}
}
getch();
}
calculelor.
complex adunare(complex a,complex b) :
{
complex rezultat; dimensional sau bidimensional) este transmis
[Link]=[Link]+[Link]; -
[Link]=[Link]+[Link];
return rezultat;
} masivul respectiv.
complex scadere(complex a,complex b)
{ #include<iostream.h>
complex rezultat; #include<conio.h>
[Link]=[Link]; struct matrice{
[Link]=[Link]; int a[3][3];
return rezultat; };
} void calculmat(struct matrice mat);
void printmat(struct matrice mat);
complex inmultire(complex a,complex b) int main()
{ {
complex rezultat; struct matrice mat={1,2,3,4,5,6,7,8,9};
[Link]=[Link]*[Link]*[Link]; clrscr();
[Link]=[Link]*[Link]*[Link]; cout<<endl<<" Matricea inainte de calcule : "<<endl;
return rezultat; printmat(mat);
} calculmat(mat);

No 186 No 187
int main()
{
cout<<endl<<"Matricea dupa revenirea din subprogram: struct matrice mat={1,2,3,4,5,6,7,8,9},*pmat;
\n"; clrscr();
printmat(mat); pmat=&mat;
getch(); cout<<"\n Matricea inainte de calcule : ";
} printmat(mat);
void calculmat(struct matrice mat) calculmat(pmat);
{ cout<<"\n Matricea dupa revenirea din subprogram : ";
int i,j; printmat(mat);
for(i=0;i<3;i++) getch();
for(j=0;j<3;j++) mat.a[i][j]*=mat.a[i][j]; }
cout<<"\nMatricea afisata in functia de calcul : \n"; void calculmat(struct matrice *pmat)
printmat(mat); {
} int i,j;
void printmat(struct matrice mat) for(i=0;i<3;i++)
{ for(j=0;j<3;j++) pmat->a[i][j]*=pmat->a[i][j];
int i,j; cout<<"\n Matricea afisata in functia de calcul : ";
for(i=0;i<3;i++) printmat(*pmat);
{ }
cout<<endl; void printmat(struct matrice mat)
for(j=0;j<3;j++) cout<<mat.a[i][j]<<" "; {
} int i,j;
} for(i=0;i<3;i++)
{
cout<<endl;
for(j=0;j<3;j++) cout<<mat.a[i][j]<<" ";
Problema 3: }
}

main() va initializa matricea, va

: Problema 4:
union

-i calculeze aria.

#include<iostream.h> #include<iostream.h>
#include<conio.h> #include<stdlib.h>
struct matrice{ #include<conio.h>
int a[3][3]; #define cerc 0
}; #define patrat 1
void calculmat(struct matrice *pmat); #define dreptunghi 2
void printmat(struct matrice mat); #define pi 3.14159265358979

No 188 No 189
typedef struct { int main(void)
int tip; {
union { char lit[2];
int raza; FIG f;
int lp; float a;
int ld[2]; clrscr();
} fig; cout<<"Tastati una din literele: C P sau D"<<endl;
} FIG; cout<<"C - pentru CERC"<<endl;
cout<<"P - pentru PATRAT"<<endl;
double aria (FIG *p) cout<<"D - pentru DREPTUNGHI"<<endl;
{ cin>>lit;
switch(p->tip) { switch(lit[0])
case cerc: return pi*p->[Link]*p->[Link]; {
case patrat: return p->[Link]*p->[Link]; case 'c':[Link]=cerc;break;
case dreptunghi: return p->[Link][0]*p->[Link][1]; case 'd':[Link]=dreptunghi;break;
default: return 0; case 'p':[Link]=patrat;break;
} default:cout<<"Nu s-a tastat unul din caracterele
} c, p sau d"<<endl;
};
int citfig(FIG *p) citfig(&f);
{ a=aria(&f);
char t[255]; cout<<"Aria este: "<<a;
switch(p->tip) getch();
{ }
case cerc: { cout<<"Dati raza: ";
cin>>p->[Link];
return 1;
};
case patrat:
{ cout<<"Dati latura: ";
cin>>p->[Link];
return 1;
};
case dreptunghi:
{ cout<<"Dati laturile: "; 3.6. Probleme propuse spre rezolvare
cin>>p->[Link][0];
cin>>p->[Link][1];
return 1;
};
default: return 0;
} 1. Tocmai s- egeri ale
}
primarului din ora ul du a voturilor primite
de cei pat

No 190 No 191
2. Exemplu : P
CNTV, 8), (Iliescu, CNET, 9), (Lazaroiu, CNTA, 10), elevii cu cea mai mare
caractere), urmat

7. -
e un

selecteaz

3.

Exemplu : 8.
01.06.2002 atunci persoana are 21 de ani. -

4.

5.

9.
Exemplu : -i, 7-2i, 1-
1.7320, 3.1622, 3.6055,7.2801. dore

6. La un concurs de inf entru fiecare elev


-
Despre fiecare student al unei grupe se cunosc numele studentului, media la
aloarea bursei.

10.
1, nota2, ...,
notam

No 192 No 193
este sub 5.00. Exemplu :
(-
11. a) (12,2), (9,5), (7,7), (6,22), (4,4), (3,8), (2,1), (2,6), (1,5), (-1,4);
1, nota2, b) (12,2), (-1,4), (9,5), (6,22), (4,4), (1,5), (2,1), (2,6), (7,7), (3,8);
..., notan c) s=45, p=5913600.

15. Se dau n puncte n plan prin coordonatele


12. 0,y0,R).

Exemplu :
descompunere. (4,4), (-1,4), (3,8), (6,22), iar x0=2, y0
(2,1), (4,4), (-
Exemplu : nu face parte din interiorul acestuia).

exponentul. 16.
telor aflate pe una din axele
13. Ox sau Oy.

sau Exemplu : -5,-5), (4,9)

axe.

17.
14. articole de tipul:
struct { int x,y; }
18.

c) eliminarea unui elev cu un nume dat;


d) eli
e) calcularea mediilor;
pare din a.

No 194 No 195
22.
19. -o magazie: fiind numere naturale. Se ce
a) elevi
b) denumirea materialului
c) se citesc de la
d) stoc normal
e)
f) 23.
alelor cu a) data;
- b) numele meteorologului de serviciu;
c)
20. d)
n perioada
-
meteorologilor de serviciu din zilele respective.
a) marca
b) 24. -un depozit, sunt necesare
c)
d) sex a) reg);
e) salariu b)
c)
-un vector de articole.
codului.

21.

le-

No 196 No 197
25. S se cons 3.7.

a)

3.7.1.
b) anumite date
c)
a) char c[4]="abcde"; b) char c[5]="abcde" ;
c) char c[6]="abcda"; d) char c[ ]="abcde";
26.
e) Nici una din variantele anterioare.

3.7.2.
char c[9]="abcde";
27.

a)
a) b)
student);
c) d)
b)
e) c [7] are valoarea 0 binar
c)
d)
e)
3.7.3.
f) me;
corect textul "C++"?
g)
a) b) c)
h) calcularea mediilor char s[4]="C++"; char s[3]="C++"; char s="C++";
i) en ilor; printf("%s", s) ; cout<<s; puts(s);
j)
k) d) e)
char s [4] ; char s [3] ;
l) eliminarea ultimului student din baza de date;
printf("%s",s="C++"); cout<<(s="C++");

28.
-
numitorul acestora.

No 198 No 199
3.7.4.

tere) a) Citir
b)
a) gets (s1, s2); b) gets (s1); gets(s2);
c) scanf("%s %s", s1, s2); d) scanf ("%s" ,&s1); scanf ("%s" ,&s2); c) i programul
e) cin >>s1 >>s2;
d) Con
3.7.5. e)
eronate ?

#include <stdio.h>
#include <string.h> 3.7.7.
int main()
{
char a[10], b[10]; int k; // (1)
scanf("%s %s",a,b); // (2) #include <iostream.h>
k=strlen (a) /2 ; // (3) #include <string.h>
a[k]='*'; // (4) int main()
printf ("%d",strlen(a)<strlen(b)); // (5) {
b=a; // (6) char s[20]="BorLanD C++ 3.1";
} int i ;
for(i=0;i<strlen(s);
a) iile de variabile din linia (1)
b) s[i]- -
cout<<s;
c) Atr }
d)
e) Atribuirea din linia (6) a) "BorLanD C++ 3.1"
b) "bORlANd C++ 3.1
3.7.6. c) "BORLAND C++ 3.1"

#include <iostream.h> d) "borland C++ 3.1


#include <string.h> e) "Borland C++ 3.1"
int main()
{
char s [20] ; 3.7.8.
int i,nr=0;
cin>>s; S1) S2)
for (i=0;i<strlen(s) ;i++)
if (s[i]>='0' && s[i]<='9') nr++;
cout<<nr ;
}

No 200 No 201
S1)
i=0; 3.7.11.
i++;
printf ("%c",a[i]) ; #include <iostream.h>
a) numai S1)
int main()
b) numai S2) {
S2) char s[10]="AB6X92P3M", b[10]; int i=0, k=0;
c) nici una while (s[i])
i=0;
d) ambele do { {
i++; if (i%2) b[k]=s[i];
e) i++;
} while (a [i] && !(a[i]>='A' && a[i]<='Z'));
putchar (a[i]); }
b[k]=0;
cout<<b;
}
a) BX23 b) A69PM
3.7.9. c) B d) 3
e) nimic

#include<stdio.h>
a) Popescu int main() 3.7.12. .
b) lonescu { s
char v[3][100] = {"Popescu", "lonescu",
c) Vasilescu "Vasilescu"}; ".
d) Nimic if ( v[0] < v[1] ) printf("%s",v[0]);
else printf("%s",v[1]);
e) ri } a) if (strlen(s)>=n) strncpy(s,t,n); t[n]=0;
b) if (strlen(s)>=n) strncpy(t,s,n); t[n]=0;
c) if (strlen(s)>=n) strncpy (n, s , t) ; t[n]=0;
3.7.10. d) if (n<=strlen(s)) strcpy(s,t,n);
e) if (strlen(s)>=n) strcpy(t,s,n);

#include <stdio.h>
int main() 3.7.13. char s1[15], s2[15], s3[15];
{
char s[6] [2]={ "ab", "ac", "ad", "bc" , "bd", "cd"};
printf ("%c%c",s[3] [0],s[2] [1]) ; if (strcmp(sl,s2) && strcmp(s2,s3)) cout<<1;
printf ("%s",s[3] [0]+s[2] [1]) ;
printf ("%s", s [5]) ;
} a)
b) Toate cele trei
a) Toate b) Numai prima c)
c) Numai primele d) d) rdine al
e) Nici una e) Nici una dintre variantele anterioare

No 202 No 203
3.7.14. 3.7.17.
char s[4]="123", t[4]; int x=123, y; #include <stdio.h>
Care dintre expresiile de mai jos au valoarea 0? int main ()
{
char *s="123456789", *t, *u;
a) atoi(s) !=x; b) itoa(x, t,10)==s; c) (y=atoi (s) )==x; u=&s[4], s+=3, t=&s[1];
, s==t) ;
d) x==(atoi(itoa(x,t,10))); e) !strcmp(itoa(x,t,10) ,s); }

a) 000 b) 001 c) 010


d) 100 e) 111
3.7.15.

3.7.18.
#include <stdlib.h>
main de mai jos sunt eronate?
#include <string.h>
#include <iostream.h> # include <stdio.h>
a) 0
int main () # include <string.h>
b) 6 { # include <iostream.h>
char s[12]="6789", t[12]="6", u[12]="89"; int main()
c) 89 long >>0; {
d) 689 strcat(t,u); char *s1, *s2, *s3;
if (strcmp(s,t)) x=atol(t); int x;
e) 6789 else x-atol(a); s1="test"; // (1)
if (strcmp(s,u)>0) x=atol(u); scanf ("%s",s2) ; // (2)
cout<<"\n"<<x; s3=&s1; // (3)
} cout « s1+s2; // (4)
x=strlen(*s2) ; // (5)
}

3.7.16.
a) ( c)
#include <stdio.h> e)
int main()
{
3.7.19. Fie programul:
char *s2="SIMPLU";
printf("\n%.8s%.6s",s1,s2);
} #include <iostream.h>
int main ()
a) "EXEMPLU" {
char *s, *t, *u;
b) "EXEMPLU SIMPLU"
int i,x;
c) "EXEMPLU SIMPLU SIMPLU" cin>>s;
for (x=0, i=0; s[i]; t=&s[i], u=t+1, u[0]=t[0] ? x=1 : 0, i++);
d) "EXEMPLUSIMPLU" cout<<x;
e) "SIMPLU" }

No 204 No 205
3.7.22.
a) Toate cara
#include <string.h>
b) #include <iostream.h>
c) aractere succesive identice a) -1 int main()
{
d) s b) 0 char *s[10]={"10","00","10","10","01","11"};
e) s c) 1 char *t="10"; int i=0, j=i-1;
while (s[i])
d) 3 {
if (!strcmp(s[i],t)) j=i;
3.7.20. Conside e) 4
}
cout<<j;
}
A)
B)
3.7.23.
I) char *a[2] ;
II) char (*b) [2] ; A. char *a[4][6];
B. char (*b[4]) [6] ;
C. char (*c)[4][6];
a) A) cu I) B) cu II) D. char ((*d) [4]) [6] ;
b) A) cu II B) cu I)
c) N1. Vector de 4 elemente, fiecare element este un pointe
d) B) nu are corespondent caractere.
e) N2. 6 coloane
N3.
3.7.21. N4.
P

#include <iostream.h>
a) 178 int main () a) (A,N1), (B, N2), (C, N3), (D, N4)
{
b) 1AB b) (A, N4), (B, N1), (C, N2), (D, N3)
char *s[5]={"012","345","678","9AB","CDE"};
c) 078 char *t, *u; c) (A, N4), (B, N1), (C, N3), (D, N2)
int i;
d) OAB t=&s[1][0]; d) (A, N2), (B, N3), (C, N4), (D, N1)
e) 067 cout<<(*(t+5)==s[2][1]); e)
u=&s[3];
i=0;
while (u[i]) cout<<u[i++];
}

No 206 No 207
3.7.24. 3.8.

int main () 3.8.1.


a) nici una {
char *(a[4][6]); 3.8.2.
b) una
char b; 3.8.3. a)
c) a [2][3]=&(b+2);
a [3][2]=&b+3; 3.8.4. b), c)
d) trei
*{4+a[2])=&b+1; 3.8.5. e)
e) patru *a[1][3]=b+3;
} 3.8.6.
3.8.7. d)
3.8.8. a)
3.8.9. a)
3.8.10. b)
3.8.11. e)
3.8.12. b)
3.8.13. a)
3.8.14.
3.8.15. d)
3.8.16. b)
3.8.17. c)
3.8.18. e)
3.8.19. d)
3.8.20. a)
3.8.21. b)
3.8.22. d)
3.8.23.
3.8.24. b)

No 208 No 209
CAPITOLUL

4.1. Declarare. Apel. Prototip

folosirea func

:O

Pentru a cons

1.
2.
3.

4.1.1.

No 210 No 211
Unde: tip
lista parametrii formali
ruia dintre ele, dar care au un nume (denumiri)
generice formale cu denumirile Unde tip
variabilelor
- compilatorul C ca fiind tipul int.
tip este void
i

1)
2)
astfel:
3)
4.1.2. 4) void

care
nume_functie(pa1, pa2, . . . ,pan);

1) double f(int, double, char);


Unde pa1, pa2, . . . ,pan 2) double f(int i, double x, char c);
3) double f();
- compilatorul nu va mai face, la apel, verificarea tipului parametrilor
4) double g(void); // nu are parametri
-
sau nu o valoare.

4.1.3.

No 212 No 213
#include <iostream.h>
int intreg_la_cub(int);
float real_la_cub(float);
variabilelor ca parametri actuali:
int main(void) int vârsta_angajat = 34;
{ float salariu_angajat = 4500000.00;

} in
int intreg_la_cub(int valoare)
{
return (valoare*valoare*valoare);
}
float real_la_cub(float valoare)
{ parametrilor formali. iderare numai valorile pe
return (valoare*valoare*valoare);
} care le au variabilele respective

4.1.

4.1.

variabile globale variabile locale.


parametrii formali sunt de fapt numele parametrilor
Variabilele locale locale

sa

} considerate:

Exemplu:
parametrii actuali (sau parametrii reali). As #include<stdio.h>
void var_locale(void)
{
int x = 10, y = 20, z = 30;

info_angajat(34, 4500000.00, 101);


}
int main(void)
{
var_locale();
sau variabile. Valoarea sau tip abila y = %d, variabila z =
parametrul formal.
}

No 214 No 215
val
variabilele globale par convenabile la prima vedere, ele nu sunt recomandate

Exemplu:
void local(void) apelului prin valoare .
{
int x, y, z;
x = 30; aloarea
y = x + 10;
z = x + y;

}
un control asupra efectelor acestor modi
variabilel

var_globale
cea de- main

Exemplu:
#include <stdio.h>
int x = 10, y = 20, z = 30;
Exemplu:
void var_globale(void) #include <stdio.h>
{ int a = 10, b = 20, c = 30; // variabile globale
void valoarea_lui_a(void)
{
int a = 100;
}
int main(void) variabila c contine %d\
{ }
var_global(); int main(void)
{
y, z); valoarea_lui_a();
} ine %d;
variabila c contine %d\
}

var_globale main,
-

No 216 No 217
variabila a contine 100; variabila b contine 20; variabila c contine 300
variabila a contine 10; variabila b contine 20; variabila c contine 300
:
1. variabilele locale automatice
2.
3.
ogramului. 4.

zona de date :
4.1. 1. variabilele globale
2.
3. variabilele locale statice
variabile statice variabile automatice (auto). zona registers :
Variabilele automatice 1. variabilele locale automatice
- 2.
Variabilele statice

programului:
ce
zona memoriei libere (HEAP)
__________________________________

__________________________________ -a fost

______________________

(BSS BLOCK STARTED BY SYMBOL)


__________________________________ matricol pentru fiecare elev dintr- ,
zona text (codul programului)
id_elev
elevului pentru care s-a t
Registers

elev:

No 218 No 219
void afiseaza_matricol(int numar_print)
{
static int id_elev; 1. abs():

} #include<stdio.h>
statice, astfel #include<math.h>
int main(void)
{
id_elev: \
bsoluta a lui %d este %d\
\ -10, abs(-10));
}
#include<stdio.h>
void afiseaza_matricol(int numar_print)
{
static int id_elev = 100;
\
id_elev++;
// celelalte instructiuni
} Valoar 10 este 10
int main(void)
{
afiseaza_matricol(1); 2. ceil() floor():
afiseaza_matricol(1);
afiseaza_matricol(1);
} ceil()
-
imediat u
floor()
-
Elevul cu numarul matricol 100
Elevul cu numarul matricol 101
Elevul cu numarul matricol 102 #include <stdio.h>
#include <math.h>
int main(void)
la alta. {
\
ceil(1.9));
4.1. printf( \
ceil(2.1));
\
floor(1.9));
matematice, put \
floor(2.1));
}
<math.h>, care trebuie inclus pentru compilarea programului.
Pr

No 220 No 221
\n Arccosinus\
Valoarea 1.900000 rotunjita cu functia ceil() este 2.000000 for(radian=-0.5; radian<=0.5; radian+=0.2)
\
Valoarea 2.100000 rotunjita cu functia ceil() este 3.000000
Valoarea 1.900000 rotunjita cu functia floor() este 1.000000 \n Arctangenta\
for(radian=-0.5; radian<=0.5; radian+=0.2)
Valoarea 2.100000 rotunjita cu functia floor() este 2.000000 \
}

3. nometrice
1. sinus sin()
2. cosinus cos() 4. - ex
3. sinusul hiperbolic sinh() Pentru a calcula ex exp():
4. cosinusul hiberbolic cosh()
#include <stdio.h>
5. tangenta tan() #include <math.h>
6. tanh() int main(void)
{
7. arcsinus asin() double valoare;
8. arccosinus acos() for(valoare=0.0; valoare<=1.0; valoare+=0.1)
printf("exp(%f) este %f\n", valoare, exp(valoare));
9. arctangenta atan() }
-un triunghi dreptunghic, sinusul unui unghi es

sin() exp(0.000000) este 1.000000


La fel, se pot exp(0.100000) este 1.105171
exp(0.200000) este 1.221403
exp(0.300000) este 1.349859
#include <stdio.h> exp(0.400000) este 1.491825
#include <math.h>
int main(void) exp(0.500000) este 1.648721
{ exp(0.600000) este 1.822119
double radian;
double pi=3.14159265; exp(0.700000) este 2.013753
for(radian=0.0; radian<3.1; radian+=0.1) exp(0.800000) este 2.225541
\
\ exp(0.900000) este 2.459603
i este %6.4f\ exp(1.000000) este 2.718282
\
\
\n Arcsinus\ 5. fmod():
for(radian=-0.5; radian<=0.5; radian+=0.2)
\

No 222 No 223
#include <stdio.h>
#include <math.h>
int main(void)
{ 10 ridicat la puterea 2 este 0.010000
double numarator=10.0, numitor=3.0; 10 ridicat la puterea 1 este 0.100000
printf("fmod(10,3) este %f\n",fmod(numarator,numitor));
} 10 idicat la puterea 0 este 1.000000
10 ridicat la puterea 1 este 10.000000
10 ridicat la puterea 2 este 100.000000
fmod(10,3)=1.000000
8. sqrt()
6. - modf(): -o valoare de tip double, putem
sqrt():
#include <stdio.h>
#include <math.h>
int main(void) #include <stdio.h>
{ #include <math.h>
double valoare=1.2345; int main(void)
double parte_intreaga, fract; {
fract=modf(valoare, &parte_intreaga); double valoare;
printf("Valoarea %f are partea intreaga egala cu %f si partea for(valoare=0.0; valoare<10.0; valoare+=0.1)
fractionara egala cu %f",valoare,parte_intreaga,fract); printf("Valoarea %f are radacina patrata %f\n", valoare,
} sqrt(valoare));
}

Valoarea 1.234500 are partea intreaga egala cu 1.000000 si partea


fractionara egala cu 0.234500

7. Calculul lui xn pow() 4.1.8. Apelul prin valoare

pow(), care ut double


double:

#include<stdio.h> stiva
#include<math.h>
int main(void)
{
int putere; l
for(putere=-2; putere <= 2; putere++)
\ adresa de revenire). Apoi,
pow(10.0, putere)); compilatorul de C plaseaz
}

No 224 No 225
respective.

printf("lucreaza . . . \n");
time(&start_time);
for(i=1; i<=1000000000L; i++)
rezultat+=i;
Variabile locale time(&stop_time);
printf("utilizare bucla %d secunde\n", stop_time - start_time);
1 printf("lucreaza . . . \n");
time(&start_time);
2 for(i=1; i<=1000000000L; i++)
rezultat = aduna(i,rezultat);
3 time(&stop_time);
printf("utilizare functie %d secunde\n", stop_time - start_time);
}
Adresa de
revenire
ele valori:
lucreaza . . . utilizare bucla 171 secunde
lucreaza . . . utilizare functie 492 secunde

apel prin valoare, pentru a da


procesare. Intervalul de timp necesar calc
suprasarcina

valoarea variabilelor care i-

#include <stdio.h>
#include <time.h> nou:
float aduna(long int x, float y) #include <stdio.h>
{ void aduna(int copie_x, int copie_y, int copie_z)
float rezultat; {
rezultat = x + y; printf("valorile originale ale functiei sunt %d %d %d\n",
return(rezultat); copie_x, copie_y, copie_z);
} copie_x+=100;
int main(void) copie_y+=100;
{ copie_z+=100;
long int i; printf("valorile finale ale functiei sunt %d %d %d\n", copie_x,
float rezultat; copie_y, copie_z);
time_t start_time, stop_time; }

No 226 No 227
int main(void)
{
int main(void)
int x=1,y=2,z=3;
{
int x=1,y=2,z=3; modifica(&x,&y,&z);
printf("valorile finale in functia main sunt %d %d %d\n",x,y,z);
aduna(x,y,z);
}
printf("valorile finale in functia main sunt %d %d %d\n",x,y,z);
}

valorile originale ale functiei sunt 1 2 3


valorile originale ale functiei sunt 1 2 3
valorile finale ale functiei sunt 11 12 13
valorile finale ale functiei sunt 101 102 103
valorile finale in functia main sunt 11 12 13
valorile finale in functia main sunt 1 2 3

4.1.
cel lalt, transmis prin
valoare nu va fi modificat.

modifice valorile variabilelor transmise ca parametri. Acest lucru nu se poate #include <stdio.h>
realiza folosind apelul prin valoare void modifica_unul(int *x, int y)
{
*x+=20;
variabilelor propriu-zise. y+=100;
}
. Acest tip de apel al int main(void)
{
parametrilor unei func r. Astfel
int x = 5, y = 10;
se transmit parametri , iar la modifica_unul(&x,y);
printf("valorile finale in functia main sunt %d %d\n", x, y);
.
}

valorile finale in functia main sunt 25 10

#include <stdio.h> n
void modifica(int *x, int *y, int *z)
{
printf("valorile originale ale functiei sunt %d %d Problema 1:
%d\n",*x,*y,*z);
*x+=10;
*y+=10; sunt sau nu numere prime gemene
*z+=10;
printf("valorile finale ale functiei sunt %d %d %d\n",*x,*y,*z); prime gemene
}

No 228 No 229
int main(void)
#include <stdio.h>
{
#include <math.h>
long int a,b,c,d;
int prim(long int x)
printf("Dati primul numar a= "); scanf("%ld",&a);
{
printf("Dati al doilea numar b= "); scanf("%ld",&b);
long int i,nr_prim=1;
c=cmmdc(a,b);
for(i=2;i<=x/2;i++)
d=(a*b)/c;
if(x%i==0) nr_prim=0;
printf("C.m.m.d.c. al numerelor %ld si %ld este %ld\n",a,b,c);
if(nr_prim==1) return 1;
printf("C.m.m.m.c. al numerelor %ld si %ld este %ld\n",a,b,d);
else return 0;
}
}

int main(void)
{ Problema 3:
long int a,b;
printf("Dati primul numar a= ");scanf("%ld",&a);
printf("Dati al doilea numar b= ");scanf("%ld",&b); sau nu palindrom r este palindrom
if( (prim(a) == 1) && (prim(b) == 1) && (abs(a-b) == 2) )
printf("numerele %ld si %ld sunt prime gemene\n", a, b);
else
printf("numerele %ld si %ld NU sunt prime gemene\n", a,
b); pr
}
#include <stdio.h>
int palindrom(long int x,*long int y)
Problema 2: {
long int z=x;
*y=0;
while(x!=0){ *y=*y*10+x%10; x=x/10; }
if(z==y) return 1;
algoritmul lui else return 0;
, iar pentru cea de- }
cmmmc( a, b) = ( a * b ) / cmmdc( a, b ). int main(void)
{
long int a,b;
#include <stdio.h> printf("Dati numarul a= ");scanf("%ld",&a);
#include <math.h> if(palindrom(a,b)==1)
long int cmmdc(long int x, long int y) printf("numarul %d este palindrom\n",a);
{ else
long int r; printf("numarul %d NU este palindrom\n",a);
r=x%y; }
while(r!=0) { x=y; y=r; r=x%y; }
return y;
}
Problema 4:
-un

Pentru rezolvare construim

No 230 No 231
un parametru dat prin valoare ( at
p tabl ). pune expresia (* nume_pointer).
Exemplu: char (*p)(char *, char *);
#include <stdio.h>
#include <math.h>
long int y;
int a[30],n,i; moduri:
void cifre(long int x, int *a, int *n)
{ a)
int i=0;
while(x!=0) { a[i]=x%10; i++; x=x/10; }
*n=i-1; (*nume_pointer) (lista de parametri actuali);
}

int main(void)
{ b)
printf("Dati numarul y= "); scanf("%ld",&y);
cifre(y,a,&n);
printf("Cifrele numarului sunt: ");
for(i=n;i>=0;i--) printf("%d ",a[i]); var=(*nume_pointer) (lista de parametri actuali);
}

bila var

double, care un
4.1.

<math.h>.

la

tablou[i]
*tablou[i]
(*tablou[i])(x) apelul
tip (*nume_pointer) (lista de parametri formali);

nteze sunt obligatorii deoarece expresia tip


*nume_pointer(lista de parametrii formali)
,

No 232 No 233
#include <stdio.h>
#include <math.h>
#include <conio.h> argv[0] nume_program
double(*tablou[])()={sin,cos,tan,exp,log,log10}; argv[1] argument_1
int main(void) argv[2] argument_2
{
int i;
double x; argv[n] argument_n
clrscr();
for(x=0;x<=1;x+=0.01)
{ PRODUS.C cu dou -al
for(i=0;i<sizeof(tablou);i++)
printf("%lf ",(*tablou[i])(x)); doilea argument.
printf("\n");
C:\Probleme\produs 25 4
}
} Ave
argv[ ] = \probleme\

argumentele inclusiv numele programului.


4.1.
Valoarea i Continutul lui argv
0 numele programului (inclusiv calea)
1 argument 1
main(). 2 argument 2

argc argument argc


formatul general este: NULL
C:\>nume_program argument_1 argument_2 . . . argument_n
:
-
argumentele s \dir /p).
main()
main():

int main(int argc, char *argv[ ]);

Unde: argc (argument count) umente din linia de

*argv[ ] (argument values)

No 234 No 235
4.2. Probleme rezolvate b)
produsul celorlalte elemente
c)
d)
4.2.1. Enun uri
8.
rep
1. S
a)
- cel mai mare divizor comun ( notat prin cmmdc
b)
ca parametri.
c)
- cel mai mic multiplu comun ( notat prin cmmmc
date ca parametri
ontrar.
9.
Pentru determinarea cmmdc se va folosi algoritmul lui Euclid prin

Exemplu: Pentru n=25


Pentru determinarea cmmmc se va folosi rela ia dintre cmmmc i
cmmdc:
e 31
cmmmc(a,b) = (a*b) / cmmdc(a,b)
10.
al II-lea, unde

a)
b)
c) rfecte mai mici sau egale cu n.

te ca parametru.
Urma unei matrice patratice este suma elementelor aflate pe diagonala
4.2.2. Solu ii propuse

Problema 1:
1. S
prime
- cel mai mare divizor comun ( notat prin cmmdc
gemene
ca parametri.
- cel mai mic multiplu comun ( notat prin cmmmc
parametru.
date ca parametri
7. S
a) Citi

No 236 No 237
#include <iostream.h>
Pentru determinarea cmmdc se va folosi algoritmul lui Euclid prin
#include <math.h>
void ecuatie(float a, float b, float c)
{
Pentru determinarea cmmmc se va folosi rela ia dintre cmmmc i float delta,x1,x2;
cmmdc: delta=b*b-4*c;
if(delta<0) cout<<"ecuatia are solutii complexe";
cmmmc(a,b) = (a*b) / cmmdc(a,b) else
if(delta==0)
{
cout<<"ecuatia are doua radacini egale"<<endl;
#include <iostream.h> x1=x2=-b/(2*a);
int cmmdc(int a, int b) cout<<"x1= "<<x1<<endl;
{ cout<<"x2= "<<x2<<endl;
int r; }
r=a%b; else
while(r!=0) {
{ x1=(-b+sqrt(delta))/(2*a);
a=b; x2=(-b-sqrt(delta))/(2*a);
b=r; cout<<"ecuatia are urmatoarele radacini: "<<endl;
r=a%b; cout<<"x1= "<<x1<<endl;
} cout<<"x2= "<<x2<<endl;
return b; }
} return;
int cmmmc(int a, int b) }
{ int main(void)
return(a*b/cmmdc(a,b)); {
} int a1,b1,c1,a2,b2,c2;
int main(void) cout<<"Dati coeficientii primei ecuatii "<<endl;
{ cout<<"Dati coeficientul a1 "; cin>>a1;
int x,y,divizor,multiplu; cout<<"Dati coeficientul b1 "; cin>>b1;
cout<<"Dati primul numar "; cin>>x; cout<<"Dati coeficientul c1 "; cin>>c1;
cout<<"Dati al doilea numar "; cin>>y; ecuatie(a1,b1,c1);
divisor = cmmdc(x,y); cout<<endl;
cout<<"C.m.m.d.c este "<<divizor<<endl; cout<<"Dati coeficientii celei de-a doua ecuatie "<<endl;
multiplu=cmmmc(x,y); cout<<"Dati coeficientul a2 "; cin>>a2;
cout<<"C.m.m.m.c este "<<multiplu<<endl; cout<<"Dati coeficientul b2 "; cin>>b2;
} cout<<"Dati coeficientul c2 "; cin>>c2;
ecuatie(a2,b2,c2);
}

Problema 2:
al II-lea, unde

rte.

No 238 No 239
Problema 3: #include <iostream.h>
int palindrom(long int x)
{
long int z=0,y;
y=x;
Urma unei matrice patratice este suma elementelor aflate pe diagonala while(x!=0){ z=z*10+x%10; x=x/10; }
if(z==y) return 1;
else return 0;
}
#include <iostream.h>
#include <math.h> int main(void)
int urma(int a[10][10],int n) {
{ long int a,b;
int suma=0,i,j; cout<<"Dati numarul a= "; cin>>a;
for(i=1;i<=n;i++) if(palindrom(a) == 1)
for(j=1;j<=n;j++) cout<<"numarul "<<a<<" este palindrom"<<endl;
if(i==j) suma+=a[i][j]; else
return suma; cout<<"numarul "<<a<<" NU este palindrom"<<endl;
} }
int main(void)
{
int a[10][10],i,j,n,u;
cout<<"Dati numarul de linii si coloane n = "; cin>>n; Problema 5:
cout<<"Dati elementele matricei "<<endl;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) prime gemene (sunt prime
cin>>a[i][j];
cout<<"Matricea data este: "<<endl; #include <iostream.h>
for(i=1;i<=n;i++) #include <math.h>
{
for(j=1;j<=n;j++) cout<<a[i][j]<<" "; int prim(long int x)
cout<<endl; {
} long int i,nr_prim=1;
u=urma(a,n); for(i=2;i<=x/2;i++)
cout<<"Urma matricei este "<<u; if(x%i==0) nr_prim=0;
} if(nr_prim==1) return 1;
else return 0;
}
int main(void)
{
Problema 4:
long int a,b;
cout<<"Dati primul numar a= "; cin>>a;
cout<<"Dati al doilea numar b= "; cin>>b;
if( (prim(a) == 1) && (prim(b) == 1) && (abs(a-b) == 2) )
palindrom cout<<"numerele "<<a<<" si "<<b<<" sunt prime
gemene"<<endl;
else cout<<"numerele "<<a<<" si "<<b<<" NU sunt prime
gemene"<<endl;
}

No 240 No 241
Problema 6: void suma(int a[10][10],int *s,int *p)
{
int i,j;
dat ca parametru. *s=0;*p=1;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
#include <iostream.h> if(i==j) *s=*s+a[i][j];
long int n; else *p=*p * a[i][j];
void cifre(long int n) return;
{ }
int s=0;
while(n!=0) { s+=n%10; n=n/10; } void afisare(int s, int p)
cout<<"Suma cifrelor este "<<s<<endl;; {
return; cout<<"suma elementelor de pe diagonala principala este
} "<<s<<endl;
cout<<"produsul elementelor este "<<p<<endl;
int main(void) return;
{ }
cout<<"Dati numarul n= ";cin>>n;
cifre(n); void afisare_matrice(int a[10][10],int n)
} {
int i,j;
cout<<"matricea este "<<endl;
Problema 7: for(i=1;i<=n;i++)
S {
for(j=1;j<=n;j++) cout<<a[i][j]<<" ";
a) Citirea unei mat cout<<endl;
}
b)
return;
produsul celorlalte elemente }
c)
int main(void)
d) {
cout<<"Dati numarul linii si de coloane n = ";
cin>>n;
citire(a,n);
#include <iostream.h> afisare_matrice(a,n);
int a[10][10],n,m,s,p; suma(a,&s,&p);
void citire(int a[10][10],int n) afisare(s,p);
{ }
int i,j;
cout<<"dati elem. matricii \n";
for(i=1; i<=n; i++)
for(j=1;j<=n;j++) Problema 8:
cin>>a[i][j];
return;
}
a)
b)

No 242 No 243
c) Problema 9:

Exemplu: Pentru n=25


#include <iostream.h>
int x[100], n;
void citire(int x[100],int n)
{
int i; #include <iostream.h>
cout<<"Dati elem. vectorului "<<endl; int n;
for(i=1; i<=n; i++) void baza_2(int n)
cin>>x[i]; {
return; int i=1, j, x[30], cifre;
} while(n!=0)
void multime(int x[100],int n) {
{ x[i] = n % 2;
int i, j, verific=1; n = n / 2;
for(i=1; i<n; i++) i++;
for(j=i+1; j<=n; j++) }
if(x[i] == x[j]) verific = 0; cifre = i-1;
if(verific == 1) cout<<"Vectorul reprezinta o multime"; cout<<"Reprezentarea numarului in baza 2 este: ";
else cout<<"vectorul NU reprezinta o multime"; for(i=cifre; i>=1; i--) cout<<x[i];
return; cout<<endl;
} return;
void afisare(int x[100],int n) }
{ void baza_8(int n)
int i; {
cout<<"Vectorul este "<<endl; int i=1,j,x[30],cifre;
for(i=1; i<=n; i++) while( n != 0)
cout<<x[i]<<" "; {
cout<<endl; x[i] = n % 8;
return; n = n /8;
} i++;
int main(void) }
{ cifre = i-1;
cout<<"Dati n = "; cin>>n; cout<<"Reprezentarea numarului in baza 8 este: ";
citire(x,n); for(i=cifre; i>=1; i--) cout<<x[i];
afisare(x,n); cout<<endl;
multime(x,n); return;
} }
int main(void)
{
cout<<"Dati n = "; cin>>n;
baza_2(n);
baza_8(n);
}

No 244 No 245
Problema 10: int main(void)
{
cout<<"Dati n = "; cin>>n;
numere_prime(n);
cout<<endl;
a) numerele prime mai mici sau egale cu n numere_perfecte(n);
b) cout<<endl;
numere_patrate_perfecte(n);
c) }

#include <iostream.h>
#include <math.h>
int n;
void numere_prime(int n)
{
int i,j,prim;
cout<<"Numerele prime mai mici sau egale decat
"<<n<<" sunt "<<endl;
for(i=2;i<=n;i++)
{
prim=1;
for(j=2;j<=i/2;j++)
if(i%j==0) prim=0;
if(prim==1) cout<<i<<" ";
}
return;
}
void numere_perfecte(int n)
{
int i, j, suma;
cout<<"Numerele perfecte mai mici sau egale decat "<<n<<"
sunt "<<endl;
for(i=6;i<=n;i++)
{
suma=0;
for(j=1;j<=i/2;j++)
if(i%j==0) suma=suma+j;
if(suma==i) cout<<i<<" ";
}
return;
}
void numere_patrate_perfecte(int n)
{ int i, j;
cout<<"Numerele patrate perfecte mai mici sau egale decat
"<<n<<" sunt "<<endl;
for(i=1; i<=n; i++)
if(sqrt(i) == floor(sqrt(i)) ) cout<<i<<" ";
return;
}

No 246 No 247
4.3. Probleme propuse spre rezolvare Exemplu:

1.
7.
consoane dintr-

void
2.
cerute.
e la

8.

3. Numim platou de lungime k -

ntr-
9.
Exemplu :
caracterul punct.

10.
4.

11.
Exemplu: ile
ca -

12.
5.

void pentru citirea,


13.

-un
6. aspect de munte

No 248 No 249
14.
-
x
mare cantita x.
15.
notate a b a u prefixul lui b. 22.

16. - plu, de la
-

17. -un text. 23.


unui

18. -
caractere notat

19. se trece la ziua


terminate

24.
20.
struct lista
int nr; - pentru un cerc: raza;
float nota; ; -

100 de elemente de tip lista nr - -un program.


nota din tablou.
25. ararea de variabile
21.

No 250 No 251
imaginare. De 33.
numere.

26. 34.
ru a calcula valoarea expresiei (a+b)4, unde a cele n
b

27. -un
tablou de numere. 35. -
n
28. ntru
a b p, respectiv q elemente
- a
29.
36. - a, cu l c
dreapta fiecare linie i cu i
30. cifra(n,m) care are ca rezultat valoarea celei de-a m-
n
exemplu: cifra(7283, 3) are valoarea 2. 37. -se doi vectori x y p, respectiv q componente rea

31. n
c. vector b n componente.

1 p (p 38. n dat, se cere:


reprezen a) term
10, 11, 12 etc. b)
c) s
32. larea valorii xn, unde x n sunt numere d) n

39.
(2k+1)2k+3 + (2k+3)2k+1 k

No 252 No 253
Exemplu: 16561 este palindrom.
parametri.
44. -

Exemplu: Matricea devine


Exemplu:

40. 45.

Exemplu: Exemplu: x={10,3,2,10,7,9,3,4,10) => x={10,3,2,7,9,4}.


5,7,11,13,17,19,23,29,31,37.
46. circular spre
41.

ca parametru.

Exemplu: .
Exemplu:
40,42,45,48,50.
47. Se cite
42.

ral dat ca parametru. elementelor nenule de pe o linie a c

Exemplu:
23, 25, 27, 29. Exemplu: Pentru matricea

43.
48.
a) un parametru de tip int a) suma componentelor din vectorul x
b) un parametru de tip b) num pare din x
c) elementul maxim din vector

No 254 No 255
Exemplu:
Exemplu: Pentru x= {2,9,15, 6,3,12 ,66,8,5} => a) 126; b) 4; c) 66. A U B={1,5,2,9,12,3,4,6,33,99,64}.

49. 53.
1, p2, ..., pm e ale celor

Exemplu: te afirmativ iar

50.
numere prime 54.
X

b b cifre ale sistemului zecimal


51. Se dau m, n 1 , a2, . . . , am 1 , b2, . . . , a+3a+...+9a, cu a numar natural
bn } memorate ca vectori. b

a) C = A B sau egale c
b) C = A U B n+2n+...+nn, pentru n num t de la
c) C = A - B
Exemplu: a) x=15 => 8;
b) a=3, b=9 => 3;
-un vector sau nu. c) a=11 => 4;
d) a=123, b=547 => 7;
Exemplu: e) n=11 => 6.
B={5,3,4,6,33,99,12,64} atunci:
a) C={5,12}; 55.
b) C={1,5,2,9,12,3,4,6,33,99,64}; 2, A3, ..., An.
c) C={1,2,9}.
56. Pentru codificar
52. tablouri bidimensionale 5x5, generate prin program.
se determine reuniunea celor doi vectori folosind:

-un vector ordonat pentru a

No 256 No 257
nspuse a matricei A,

r din tablou Exemplu:

tabel se permu c
Exemplu: P

2, 8, 10, 12, 16, 18, 2


T ={ 1, 2, 5, 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24 }.
Exemplu:
Exemplu: 8, 4, 6, 1, 3, 5 }, T1 = {
57.

-
11, a12,...,
a1n, a21,..., a2n,..., ann
58.
cu p elemente nenule. Matricea est

Exemplu: Pentru n=5, p=8, v= {2,7,8,4,6,1,3,5}, T= {1,5, 9,11,14,18,20,22}

No 258 No 259
4.4. Teste gril 4.4.4.

a) actuali, iar cei care


formali
b) fi trans

4.4.1.
c) Variabilele de tip tablou nu se pot transmite ca p
d)
v[0] ,v[1],...,v[n-

e)

a) void calcul (int v[n], 25) b) void calcul (int v[25] , int n)
4.4.5. -un program sunt:
c) void calcul (int v[ ] , int n) d) void calcul (int v[ ] , n)
e) void calcul (int v, int n)
a) ariabilelor

4.4.2. Consid demo, de tipul void


b)
c) Posibilitatea de a executa de mai multe ori instruc -o

d)
e) Nici unul dintre avantajele de mai sus
a) demo(int a, int b, int c); b) demo(int a; int b; int c);
c) demo (a, b, c); d) demo(a;b;c);
4.4.6.
e) demo (int a, b, c); #include <stdio.h>
int s, f;
int sf (int a)
4.4.3. {
f -=a ;
return (a*a) ;
}
a) 100,10,10000,10,10000,10 int main()
a) b) c) d) {
int D (int a); int D (int a) { int D (int a) ; int D (int a) b) 100, 0, 100, 0, 100, 0 f =10; s = sf (f) ;
{ D=(a+2); } D=a+2; } { return(a+2) ; } { return a+2; } c) 0, 0, 0, 0, 0, 0, -10 printf ("%6d%6d", s, f) ;
f=10; s=sf(10); s*=sf(f);
d) 100, 0, 10000, 0, 16960, 0 printf ("%6d%6d", s, f) ;
e) Nici una dintre variantele anterioare
e) 100, 0, 0, 0, 10000, -10 f=10; s=sf(f); s*=sf(10);
printf ("%6d%6d", s, f) ;
}

No 260 No 261
4.4.7. 4.4.9.
jos:
#include<stdio.h>
int x, y;
int T(int m, int n) //Programul P1 //Programul P2
{ #include <stdio.h> #include <stdio.h>
a) 43, 22, 10 m=n+x; void apel(int &m, int n) void apel (int &ia, int &n)
n+=1; { {
b) 43, 12, 10 return (n+y+m); m=m+n; m=m+n ;
c) 47, 10, 12 } n=(m-n)/2; n=(m-n)/2;
int main() } }
d) 44, 22, 11 { int main() int main()
y=10; { {
e) 44, 12, 11
x=12 ; int x,y; x=11; int x,y;
printf("%3d ",T(x,y)); y=3; x=11; y=3;
printf("%3d%3d ",x,y); do{ while ( cond )
} apel(x,y) ; {
printf("x=%d y=%d", x, y); apel(x,y);
}while ( cond ) ; printf("%3d%3d", x, y) ;
} }
#include<stdio.h>
4.4.8. Fie }
void F (.......)
programul: {
a+=2;
b--;
c=a+b;
}
int main ()
{ a) gramul P1
int x,y,z;
-un ciclu infinit
x=2;
y=4; P2
F(x,y,z);
va
printf("%3d%3d%3d",x,y,z);
}
vor produce ace
d) P1,
ordine, valorile 447? x
e) P2,
a) void F (int a, int b, int c)
b) void F (int a, int &b, int &c)
c) void F (int&a, int b, int &c)
d) void F (int &a, int b, into)
e) void F (int &a, int &b, int &c)

No 262 No 263
4.4.10. t
4.4.12.

#include <stdio.h>
a) 12 void F(int &nr, int x)
{
b) 13 do{ #include <iostream.h>
c) 14 x=x/2; void main()
nr++; {
d) 15 } while (x>0); int v[20],i,n;
e) 16 int main() ......
{ calcul (v,2.5,10);
int m,n; }
scanf ("%d", &m) ; void calcul (int v[], float x, int a)
n=0; {
F(n,m) ; ......
printf ("%d", n) ; }
}

4.4.11.

a) b) int p (int x) a) void calcul (int v, float x, int a);


int p(int x) { b) void calcul (int v[ ], float x, int a);
{ int i ;
int i, ok; for(i=2;i<x;i++) for(i=2; i<x; i++) c) void calcul (int, float, int);
if (x%i==0) ok=0; if (x%i==0) return 0; d) void calcul (int [ ], float, int);
else ok=1; else return 1;
return ok; } e) void calcul (int *, float, int);
}

4.4.13.
c) d)
int p (int x) int p (int x)
{ {
int i , ok=1 ; int i;
for(i=2;i<x;i++) return 1; a) -3 2 7 -1 0 1
if (x%i==0) ok=0; for (i=2; i<x; i++) b) 0 0 0 -1 0 1
return ok; if (x%i==0) return 0 ;
} } c) -3 2 7 0 0 0
d) -1 0 1 -3 2 7
e)
e) 0 0 0 -3 2 7

No 264 No 265
#include <iostream.h>
int u[5], v[5], w[5], t[5], i; 4.4.15.
void calcul (int *w, int *t)
{ int f(int x, int y=5)
for(i=0;i<3;i++) {
{ static int m=3;
w[i] = 0; m+=x;
t[i] = v[i] - u[i]; return m>=y ? m : -1;
} }
} int main()
int main () {
{ int a,b,c;
for (i=0 ; i<3 ; i++) a = f(4);
{ b = f(1,7);
u[i] = 2*i-1; c = f();
v[i] = 3*i-2; }
w[i] = u[i] + v[i];
t[i] = 0;
} Care dintre cele
calcul (w, t) ;
for(i=0;i<3;i++) cout<<" "<<w[i] ;
for(i=0;i<3;i++) cout<<" "<<t[i] ; a)
}
fi a=7, b=8
b)
4.4.14. fi a=7, b=-1
c) Numai al doi
#include <iostream.h> d) -
int f(int a=5, int b=2)
{ 1
a) 7
return --a + 2*b++; e) Toate cele trei apeluri sunt corecte
b) 8 }
int main()
c) 9 { 4.4.16.
d) 10 cout<<f();
} int * F (int *a, int *b, int c)
e) 11
{
d=(*a+*b+c)/3;
return &d ;
}

int *x, *y, z, *m, d;


nu
?

No 266 No 267
c) le nu este
a) b)
scanf("%d %d %d",x,y,&z); cin>>*x>>*y>>z;
d)
printf("\n%d",*F(x,y,z)); cout<<*F(x,y,z);
e)

c) d)
*m = *F(x,y,z); n=*F(x,y,z); 4.4.18. Care
cout<<*m; cout<<n;

#include <iostream.h>
a) n va avea valoarea -3 int *intreg (float *p)
e)
cout<<*F(2,3,4); b) n va avea valoarea -4 {
return (int *)p;
c) }
de la a) sau b) int main()
{
d) n va avea valoarea -3.56 int n;
4.4.17. e) Pro float x=-3.56;
n=x;
void afis1(int v[]) n=*intreg(&x) ;
{ }
int i=0 ;
while (i<4)
cout<<v[i++]<<" ";
}
4.4.19.

#include <iostream.h>
int q;
int *A(int *m, int *n)
1 a) programul este eronat {
b) *n=*m+1;
*m=*n+1 ;
void afis2(int v[4]) void afis3(int v[4]) q=*m-1 ;
{ { d) 5 return &q;
int i=0; int i,*x[4]; }
do for (i=0;i<4;i++) void B(int *p)
cout<<*(v+i++)<<" "; { {
while (i<4); x[i]=&v[i]; int y=4 ;
} cout<<*x[i]<<" "; y=*A(&y,p) ;
} int main()
} {
int y=9,x;
a) Ambele func B(&x) ;
cout<<x<<" "<<y;
b) }

No 268 No 269
4.4.20.
void f1 (int (*p) [8]); 4.4.22. Fie programul:
void f2 (int p [4] [8]);

#include<iostream.h>
int plus (int x)
int main () {
{ return x++;
int m[4] [8] , (*q) [8],*r[8]; }
f1(m); f2(m); int minus (int x)
f1(q); f2 (q); {
f1(r); f2 (r); return --x;
} }
void test (int p, int q,int (*F1) (int) ,int (*F2) (int))
a) Numai primele patru apeluri sunt corecte {
if (p && q) cout<<F1(p);
b) Numai pr else cout<<F2(q) ;
c) Numai pr int main()
{
d) Toate apelurile sunt g int a=2, b=5;
e) Toate apelurile sunt corecte test (a, b, plus, minus);
test (3, 0, plus, minus);
test (a, b, plus (a) , minus (b) );
4.4.21. test (3, 0, plus (3) , minus (0) );
}
int *(*f) (int *);

a)
b) test realizate din main ?

c) Pointer a) ,
d) Pointer pointer respectiv, -1,
pointer b) ,
e) b), c) d) respectiv, -1,
c) Ul
respectiv, -1, iar primel
d)
respectiv, -1
e) Toate cele patru apeluri sunt eronate

No 270 No 271
4.4.23.
4.4.25.
#include <iostream. h>
a) 21 int f (int n, . . .) #include <stdio.h>
b) 39 { char &f(char *p,int n)
int *a=&n+1, *b=a+2; a) Programul nu va af {
c) 18 return n*(*a+*b); return *(p+n);
d) 30 } }
int main() b) "aac" int main()
{ {
cout<<f(3, 2, 11, 5, 8); c) "abc"
char *s="abc"; f(s,1)='a';
} d) "aba" printf("%s",s);
}
e) "aabc"

4.4.24. XXX

4.4.26.
argumente, precizat la apel prin valoarea lui n?
valoarea lui n?
#include <stdio.h>
double f(int n,...) #include <stdio.h>
{ int *f (int &n)
double min=*(double *)(&n+1); {
for(int i=1;i<n;i++) a) Ambele return &n;
if (XXX<min) min=XXX; }
return min; b) Nici una
int main()
} c) I {
int main() int n=7;
{ d) II f(n) =2; // (I)
int n=3; e) *f(n)=3; // (II)
float a=2,b=8,c=-1; }
printf("%f",f(n,a,b,c));
printf("%f",f(n,2.0,8.0,-1.0));
printf("%f", f (3,2.0,8.0,-1.0));
}
4.4.27.
false.
a) *(double *) (&n+1+i)
b) *((double *)(&n+1)+i)
c) * (double *)(&n+(1+i))
d) * (double *) (& (n+1)+i)
e)

No 272 No 273
int &f1(int &x)
{
return x=1;
} a)
int *f2 (int *p)
{ b)
int a=2; c) Al doilea program este core
f1(a);
*p=3; d) Am
return p; e) Ambele programe sunt corecte, dar
}
int main()
{
int b=4;
f1(b); 4.4.29.
f1(b)=5; programului:
f2(&ib);
*f2(&b)=6; int f (char a[2])
} {
int i=0;
while (a[i++]>; return i;
valoarea variabilei b va fi 4 }
int main()
b) (b) =5, valoarea variabilei b va fi 5 {
c) , valoarea variabilei b va fi 3 int n=f("abcdefgh");
}
, valoarea variabilei b va fi 6
e) n a) 0
meca b) 2
c) 9
d) Corpul fun
4.4.28. e)

// (I) // (II)
char &f (char &a) char &f(char &a)
{ {
if (a>96) return a=a-32; if (a>96) return a-32;
else return a=a+32; else return a+32;
} }
int main() int main()
{ {
char x=' x';
f(x)=x; f(x)=x;
} }

No 274 No 275
4.5. CAPITOLUL

4.5.1.
4.5.2. c)
4.5.3.
4.5.4.
4.5.5.
4.5.6. e)
Pointeri
4.5.7. b)
4.5.8. c)
4.5.9. 5.1. Declarare
4.5.10.
4.5.11. c)
4.5.12. d)
4.5.13. b) n pointer
4.5.14. b)
4.5.15. a)
4.5.16. e)
4.5.17. b)
4.5.18. c) Ast
4.5.19. b)
4.5.20. a) prin r
4.5.21. d) ctive.
4.5.22. a)
4.5.23. a) Declararea unei variabile de tip pointer se face astfel:
4.5.24. b)
tip *nume_pointer;
4.5.25. b)
4.5.26. d)
4.5.27. a) Unde:
4.5.28. b) - tip
4.5.29. c)
- nume_pointer entru a identifica
pointerul respectiv

No 276 No 277
- *

Exemple: Adresa variabilei indice este fff4


char *pc; // pointer de tip caracter
int *pi; // pointer de tip întreg Adresa variabilei salariu_dolari este fff0
float *pf; // pointer de tip real Adresa variabilei salariu_lei este ffec

de tip registru.

void *nume_pointer;
&

nume_pointer = &variabila;

5.2. Operatori specifici pointerilor

adresa

1. #include<stdio.h>
int main(void)
adresa acelei variabile. {
int indice = 1;
int *p_indice;
p_indice = &indice;
printf("Valoarea lui p_indice %x\nValoarea lui indice
%d\n Adresa lui indice este %x\n", p_indice, indice, &indice);
#include<stdio.h> }
int main(void)
{
int indice=1;
float salariu_dolari=20000.0;
long salariu_lei=30000000L; Valoarea lui p_indice fff4
printf("Adresa variabilei indice este %x\n",&indice);
printf("Adresa variabilei salariu_dolari este %x\n", Valoarea lui indice 1
&salariu_dolari); Adresa lui indice este fff4
printf("Adresa variabilei salariu_lei este
%x\n",&salariu_lei);
}
2.

No 278 No 279
tribuie pointerului adresa unei variabile de tip variabile de tip int, atu
float

#include<stdio.h>
5.3.1.
int main(void)
{
int indice = 100;
int *p_indice;
p_indice = &indice;
printf("Adresa lui p_indice %x\nValoarea la p_indice pointeri.
%d\n", p_indice, *p_indice);
*p_indice = 50;
printf("Valoarea variabilei indice este %d\n", indice); fapt adresa primului element al tabloului.
} Exemplu:
int a[20], *p; p:

Adresa lui p_indice fff4 p=&a[0]; a:

Valoarea la p_indice 100


Valoarea variabilei indice este 50 a[0] a[1] a[19]

elementul al i-lea, iar p-i la elementul al i-


5.3. Aritmetica pointerilor

p: p+1 p+i

a:

a[0] a[1]

Observ n expresia p+i ne

00 a
ct ( tip_obiect *p ), atunci p+i va fi
unei variabile de tip char
-
char
Numele unei variabile de tip tablou este de fapt adresa primului

No 280 No 281
Deci, p = &a[0]; p = a; cp-cq = 1
ip-iq = 1
lp-lq = 1
p = &a[i] q = &a[j] ), at fp-fq = 1
dp-dq = 1

p == q
p != q
p<q
5.
p <= q
p>q
p >= q
2) p q
p = &a[0] p=a
p +1 &a[1]
*(p+1) a[1]
p+i &a[i]
teri. a +1 &a[1]
*(a+1) a[1]
a+i &a[i]
#include <stdio.h> *(a + i) a[i]
int main(void)
{ Deci, putem scrie:
int tab_i[]={1 ,2, 3, 4}, *ip, *iq;
a[i] *(a+i) *(i +a) i[a]
long tab_l[]={5, 6, 7}, *lp, *lq;
float tab_f[]={1.2, 3.44, 5.43, 6.890, 2.33}, *fp, *fq;
double tab_d[]={1.11, 2.222, 3.333, 4.44}, *dp, *dq;
cp=cq=s;
- -cq);
ip=iq=tab_i; Din echiva r
- -iq);
lp=lq=tab_l;
- -lq); -o expresie
fp=fq=tab_f; *(a+i) un pointer un deplasament
- -fq);
dp=dq=tab_d;
- -dq);
}

a[i] i[a].

No 282 No 283
#include<stdio.h> 5.3.3. Folosirea pointerilor de tip void*
int main(void)
{
int tablou_i[10] = {0,1,2,3,4,5,6,7,8,9}; Limbajul C++ permite folosirea pointerilor de tip void*, pe post de
int i = 7;
printf("%d\n", tablou_i[i]);
printf("%d\n", i[tablou_i]); cast.
} Adresa 0 d NULL pentru pointeri.

void*.
7
7 #include<stdio.h>
int main(void)
&* {
int a=10,b=5;
deplasament are
void *pa,*pb,*temp;
(int*)pa=&a; (int*)pb=&b;

*(int*)temp=*(int*)pa;
*& *(int*)pa=*(int*)pb;
*(int*)pb=*(int*)temp;

printf("\na = %d si b = %d\n",a,b);
}

#include<stdio.h>
int main(void)
{ a= 10 si b = 5
int tablou_i[10] = {0,1,2,3,4,5,6,7,8,9};
int *p = tablou_i;
printf("%x %x\n", tablou_i+3, &*(tablou_i+3)); 5.3.4. Expresii compacte cu pointeri
printf("%x %x\n", p+3, &*(p+3));
}

incrementare ( ++ ) decrementare ( -- ).

ffe8 ffe8
ffe8 ffe8

No 284 No 285
EXPRESIA OPERATIA CE SE

*p++ postincrementare pointerul


*p-- postdecrementare pointerul
2 2 1
*++p preincrementare pointerul
*--p predecrementare pointerul 4 3 -3
3 3 -2
++*p preincrementare obiectul 4 2 -2
--*p predecrementare obiectul
(*p)++ postincrementare obiectul La prima ++(*x) este preincrementare asupra obiectului referit
(*p)-- postdecrementare obiectul (*y)-- este

++c este pre

Expr
- 5.3.5. Tablouri de pointeri
asupra pointerului. Deci, nu putem uti
-i astfel:

ratorii ++ tip *nume_tablou_pointeri[];


-- asupra expresiilor compacte cu pointeri.

#include <stdio.h>
int main(void)
{
Exemple:
char *tpc[10];
int a = 1, b = 2, c = 0;
int *x = &a,*y = &b; float *tpf[25]; // tablou de
printf("%d\t", ++(*x));
printf("%d\t", (*y)--);
printf("%d\n", ++c); Acest
a++; b=2; c-=(*x) + b++;
printf("%d\t", ++(*x));
printf("%d\t", (*y)--);
printf("%d\n", ++c);
x=y;
printf("%d\t", ++(*x));
printf("%d\t", (*y)--);
printf("%d\n", ++c);
printf("%d\t%d\t%d\n", a, b, c);
}

No 286 No 287
#include <stdio.h>
#include <string.h>
int main(void) ABCDE
{ C/C++
char *tp[10] = {"1234567890", "abcde", "ABCDE", "info",
"INFO", "limbaj", "Programare", "C/C++", "Pascal", INFO
"nota10"}; Pascal
int i,inv;
char *t; Programare
printf("Afisarea sirului de pointeri dat\n"); abcde
for(i=0;i<=9;i++)
if(*tp[i]!=NULL) printf("%s\n",tp[i]); info
do limbaj
{
inv=0; nota10
for(i=0;i<9;i++)
if(strcmp(tp[i],tp[i+1])>0)
{
t=tp[i];tp[i]=tp[i+1];tp[i+1]=t;
inv=1;
}
}while(inv==1);
printf("Sirul de pointeri ordonat alfabetic\n");
for(i=0;i<=9;i++)
if(*tp[i]!=NULL) printf("%s\n",tp[i]);
}

rea

Afisarea sirului de pointeri dat


1234567890
abcde
ABCDE
info
INFO
limbaj
Programare
C/C++
Pascal
nota10
Sirul de pointeri ordonat alfabetic
1234567890

No 288 No 289
5.4. Probleme rezolvate Pentru a se rul diferit de zile ale lunilor anului se va defini
un tablou de constante nd anul este
nd 29 de zile.
5.4.1. Enun uri

4. Se dau n numere reale ce reprezint


- n baza 10.
determine coeficien ii acestui polinom.
Solu ie:
Func ia strtol pentru a face conversia unui r dintr-
Fie a1, a2 n cinile reale ale polinomului P:
b (2<=b<=36) ine i litere, este
P = (x-a1)* (x-a2)*...* (x-an)
reprezentat ca un ir de caractere. Pentru verificarea corectitudinii, este setat un
Fie polinomul P de forma:
pointer la primul caracter din ir care a ge
P = bn*xn + bn-1*xn-1 + . . .+ b1*x + b0
pointerul este NULL, nu a aparut nici o eroare.
Coeficien ii b0, b1, . . ., bn se pot calcula fie cu ajutorul rela iilor lui
Viete nd produsul descompunerea.
2. ia rela a
Astfel, dac :
d drepte se vor trata cazurile :
Q = cm *xm +cm-1 * xm-1 + . . . + c1 *x+ c0 si R=Q*(x-am+1)
1) Dreptele sunt paralele
unde R = dm+1*xm+l +dm*xm +... + d1* x + d0 vom avea rela iile:
2) n particular se va trata cazul cand dreptele
sunt perpendiculare.
dm+1 = cm
3) Dreptele coincid
dk = ck-1 - ck * am+1, 1 <= k <= m
Pentru aceasta vom calcula coeficien ii f n
d0 = -c0 * am+1
acest scop a fost defini
parametrii d
5. Fiind dat un nd un text, se scrie un program
puncte. Dupa ob inerea celor 6 coeficien i a1, b1, c1 si a2, b2, c2, vom avea
care r de ori a apari nt cu altul.
cazurile:
ir f ile func iilor din biblioteca
- a1*b2=a2*b1: dreptele su a1*c2=a2*c1
-un ir se va face definind func ia inlocuiri
atunci dreptele sunt confundate, altfel dreptele sunt paralele.
care are parametrii:
- n cazul c nd dreptele sunt perpendicular, atunci conform defini iei
sir, textul ini ial
avem: a1*a2 = b1*b2
d, ntul ini ial
c2, cuv nlocul
3. un program de determinare a unei date, tiind o dat de pornire i un
nr, nlocuiri
r de zile trecute.

No 290 No 291
5.4.2. Solu ii propuse puncte. inerea celor 6 coeficien i a1, b1, c1 i a2, b2, c2, vom avea
cazurile:

Problema 1: - a1*b2=a2*b1: dreptele su

r dintr-o baz n baza 10. a1*c2=a2*c1, atunci dreptele sunt confundate, altfel dreptele sunt paralele.

Functia strtol este folosita pentru a face conversia unui r dintr-o - nd dreptele sunt perpendiculare atunci conform defini iei

b (2<=b<=36) ine i litere, este trebuie s avem: a1*a2 = b1*b2

reprezentat ca un ir de caractere. Pentru verificarea corectitudinii este setat un


pointer la primul caracter din ir care a genera #include<stdio.h>
#include<stdlib.h>
pointerul este NULL, nu rut nici o eroare. #include<conio.h>
#include<graphics.h>
#include<stdio.h> void traiectorie(int x1, int x2, int y1, int y2, double *a, double *b,
#include<stdlib.h> double *c) ;
{ int x1, int x2, int x3, int y1, int y2, int y3 ;
int baza; double a1,b1,a2,b2,c1,c2,x,y ;
char numar[30], *p; void traiectorie(int x1, int x2, int y1, int y2, double *a, double *b,
long nr; double *c)
\ {
*a=y2-y1;
\ *b=x1-x2;
*c=x2*y1-x1*y2 ;
nr = strtol(numar, &p, baza); }
if(p) int main(void)
{
else puts("Introduceti coordonatele capetelor celor 2 drepte"j;
scanf("%d %d %d %d",&x1,&y1,&x2,&y2) ;
} scanf ("%d %d %d %d",&x3,&y3,&x4,&y4);
traiectorie(x1,x2,y1,y2, &a1,&b1,&cl;
traiectorie(x3, x4,y3,y4, &a2, &b2, &c2);
if (a1*b2==a2*b1)
if (a1*c2==a2*c1) printf("Dreptele se confunda" );
else printf("Drepte paralele ");
Problema 2: else
S {
x=(c2*b1-c1*b2) / (a1*b2-a2*b1) ;
drepte se vor trata cazurile: y=(a2*c1-a1*c2) / (a1*b2-a2*b1) ;
1) Dreptele sunt paralele printf(" Dreptele sunt concurente in (%lg,%lg)",x,y);
if(a1*a2==b1*b2) printf(" si perpendiculare");
2) Dreptele sunt concurente. n particular se va trata cazul c nd dreptele else printf(" si neperpendiculare.");
sunt perpendiculare }
}
3) Dreptele coincid
Pentru aceasta vom calcula coeficien n
acest scop
puncte distincte, calculeaz parametrii dreptei care trec

No 292 No 293
Problema 3: Problema 4:
un program de determinare a unei date de Se dau n numere reale ce reprezint se
pornire r de zile trecute. Pentru a se i rul diferit de determine coeficien ii acestui polinom.
zile ale lunilor anului, se va defini un tablou de constante Solu ie:
nd anul nd 29 de zile. Fie a1, a2 n r cinile reale ale polinomului P:
P = (x-a1)* (x-a2)*...* (x-an)
#include<stdio .h>
#include<conio .h> Fie polinomul P de forma:
const int t[13] ={ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
P = bn*xn + bn-1*xn-1 + . . .+ b1*x + b0
void calcul (int z, int an, int nr_zile, int *zi, in t*luna, int *a){
int i; Coeficien ii b0, b1, . . ., bn se pot calcula fie cu ajutorul rela iilor lui
for(i=1;i<=12;i++)
if ( (i==2) && (an%4==0) ) Viete nd produsul descompunerea.
if( nr_zile>29 ) nr_zile-=29; :
else break;
else Q = cm *xm +cm-1 * xm-1 + . . . + c1 *x+ c0 si R=Q*(x-am+1)
if( nr_zile>t[i]) nr_zile-=t[i]; unde R = dm+1*xm+l +dm*xm +... + d1* x + d0 vom avea rela iile:
else break;
*a=an;
do{ dm+1 = cm
if( (*an%4==0) && (i==2) ) {
z-=29-nr_zile; dk = ck-1 - ck * am+1, 1 <= k <= m
nr_zile=0; d0 = -c0 * am+1
i++;
if(zi<=0) { i--; z+=29; break; }
}
else{ #include <stdio.h>
if(i>12) { (*a)++; i++; } #include <stdlib.h>
z-=t[i]-nr_zile; nr_zile=0; i++;
if(z<=0) { i--; z+=t[i]; break; } int cit_date(float **rad)
} {
}while(z>0); *luna=i; *zi=z; int n, i;
}
int main(void)
{ *rad = malloc((n+1) * sizeof(float));
int nr_zile, zi, an, z, luna, a, i; for (i=1; i <=n ; i++)
printf("\nIntroduceti data (an luna zi) : "); {
scanf("%d%d%d", &an, &luna, &z);
for (a=0,i=2;i<luna;i++) a+=t[ i]+(an%4==0 && i==2);
if(luna<1 || luna>12 || z>t[luna] +(an%4==0 && i==2)) }
{ printf("Data gresita");return;} return n;
z+=a; }

scanf("%d",&nr_zile);
calcul(z, an, nr_zile, &zi, &luna, &a);
\t Luna: %d \
}

No 294 No 295
float* polinom(float *a, int n) d, c ial
{
float *b; c2, nlocul
int m, k; nr, nlocuiri
b = malloc((n+1) * sizeof(float));
b[1]=1;
b[0]= - a[n]; #include <stdio.h>
for( m = 2; m <= n; m++) #include <string.h>
{ #include <stdlib.h>
b[m] = b[m-1]; char *inlocuiri(char *,char *,char'*,int );
for(k=m-1; k>0; k--) int main(void)
b[k]=b[k-1] b[k] * a[m]; {
b[0] = -b[0] * a[m]; int nr;
} char sir[255], c1[200], c2[200] ;
return b; puts("Introduceti sirul:"); gets(sir);
} puts("Introduceti cuvantul care va fi inlocuit:"); gets(c1);
void afis_polinom(float *coef, int grad) puts("Introduceti cuvantul inlocuitor:"); gets(c2);
{ puts("Numarul maxim de inlocuiri:"); scanf("%d",&nr);
int i; puts("\nNoul sir:"); puts(inlocuiri(sir,c1,c2,nr));
}
for(i=grad; i>0 ; i++) char *inlocuiri(char *sir,char *c1,char *c2,int nr)
if(coef[i] != 0) {
printf( i); char *m,* p, q[100], a[100];
if(coef[0] != 0 || grad == 0) int n, poz, i=0;
m=sir;
\ do{
} p=strstr(m,c1);
int main(void) n=strlen(sir) ;
{ if (p != NULL)
float *a; {
float *b; nr--;
int n = cit_date(&a); poz=n-strlen(p);
b = polinom(a,n); for(i=0; i<poz; i++)
afis_polinom(b,n); *(q+i)=*(sir+i);
} for(i=poz; i<=n-strlen(c1); i++)
q[i]=sir[i+strlen(c1)];
for(i=0; i<poz; i++)
*(a+i)= *(q+i);
for(i=poz; i<=poz+strlen(c2);i++)
a[i]=c2[i-poz];
Problema 5: for(i=poz+strlen(c2); i<=strlen(c2)+n+1; i++)
Fiind dat un ir de caractere reprezent nd un text, se scrie un program a[i]=q[i-strlen(c2)];
\
care r de ori a apari nt cu altul. m=p+1;
ir f ile func iilor din biblioteca sir=strdup(a);
}
-un ir se va face definind func ia inlocuiri }while(p && nr);
care are parametrii: return a;
}
sir, textul ini ial

No 296 No 297
5.5. Probleme propuse spre rezolvare 7.

8.
1. (1<=n<=100)

baza b (b

2. Se dau 1, a2, . . . , am 1, b2, . . . , b n}


9.
:
a)
b)
10. >6).
c)
xn -

11.
3. scrie un program care
unidimensional (vector) folosind ca instrument de lucru pointeri.

12. sort3

4. crie un
13. Numim linii gemene -
-
-
caractere ",", ".", "
Pentru fiecare astfel de pereche, se vor

5. l mult 20 de caractere,

Exemplu : singura pereche este (1,3).

6.
comune tuturor numerelor.

No 298 No 299
14. Exemplu: Pentru vectorul x= {5,9,2,8,18,3} suma ceruta este s=10.
coloanele
19.
-
a unei linii dintr- -o matrice.
scrierea
15.
mult 255 caractere, format din litere mici ale alfabetului englez. Textul x se 20.

kpoz 1, 'b' se ate


2 a
-
puterea ab -

16. 21.
prin: suma de control. Grupele

17. apoi suma cifrelor acestei cifr -o


expresiei:
183 este 1+8+3 = 12 = 3).

Exemplu: Pentru x= {156, 91, 12, 10081, 822, 75} se va afisa;

Grupa 1: 156,12,822,75
retu Grupa 2: 10081
Grupa 3: 91
18. -
22.

No 300 No 301
-un grup de 26.
-1, ... , 3, 2, 1 iar cel care are cei

-se de d ori.
Exemplu: re 12 divizori.
23. toare la un concurs de
- 27.
astfel:

A
cere -

Alegerea
mic "meniu".
28. Numerele puternice
24.
-
n fiind puternic (n<70).

Exemplu:

Exemplu: 28, 496. 29. max2

25. - -al max3


k- - max2.

30. perm2
- e ord
perm2.
determinarea minimului va realiza stabilirea celui de- ui 31. -

No 302 No 303
38. -o matrice
vor fi numerotate de la 0 la 6

32.

multiplu comun al componentelor tabloului.

33.
Exemplu:

Exemplu:

34. 39.
cmmdc(fn, fm) = fcmmdc(n,m)
ie cu toate elementele pozitive k s-a notat al k-

c f0 = 1; f1 = 1; fn = fn-1 + fn-2, n>=2.

35. 4+bx2+c=0, folosind 40. 1,a2, ... , am

celor m valori P(ai).


36. dintr-o matrice A cu m linii
- 41. ecare angajat petrece la serviciu o
-un tablou liniar. : elementul
aij se nume te
pe coloana j sau invers).

37. 42. proprietatea sufixului


10

numerele mai 2=

No 304 No 305
are proprietatea 5.6.

-
5.6.1. area a doi pointeri x
Care dintre ele nu sunt corecte?
43. x[1]+2x[2]+...+2x[n]
a) typedef int* intreg; b) typedef int intreg;
intreg x,y; intreg *x,*y;
Observa ie : 100
c) int *x,*y; d) int &x,&y;
cifre.
e) typedef intreg int;
intreg *x,*y;
Exemplu:
34363937824.
5.6.2.
int a = 2, b, c = 5; int *x, *y;
44.

de program de mai jos.


x = &c;
a) 7, 7, 7 a+= *x;
45. cout<<a;
b) 7, 8, 9
b = ++a;
c) 7, 8, 8 y = &b ;
cout<<*y;
d) 7, 7, 8
x = y;
e) 8, 8, 9 cout<<(*x)++;

5.6.3.
int a, b, c; int *x, *y, *z;

mai jos. a = 3;
y = &c;
*y = a++;
a) 510 z = &a;
b) 410 x = y;
cout<<*x++;
c) 400 if (*x = *y) cout<<1;
else cout<<0;
d) 300
*z = *y;
e) 301 if (z == y) cout<<1;
else cout<<0;

No 306 No 307
#include <stdio.h>
5.6.4. #include <stdlib.h>
int main ()
{
int *a,*b;
float x;
a) x = (int)malloc(sizeof(int*)); a= (int*) malloc (sizeof (int));
b) x = (int*)malloc(sizeof(int*)); b= (int*) malloc (sizeof (int));
scanf("%d %d", &a, &b);
c) x = (int*)malloc(sizeof(int)); printf ("\n%f", x) ;
d) *x = (int*)malloc(sizeof(int)); free (a);
free (b);
e) *x = (int)malloc(sizeof(int*)); }

a) Declara
5.6.5. b) Alocarea d
int *x,*y, z; float m; c) rect
d) Atribuire
tre e)

a) b)
scanf(%d %d %d", x, y, z); scanf(%d %d %d", x, y, &z); 5.6.7.
m = (x + y + z) / 3; m=(*x + *y + z) / 3;
printf("%f", m); printf("%f", m); int **a, *b, c;

c) d)
scanf(%d %d %d",*x,*y,z); cin>>*x>>*y>>z ; a) a=&(&c) ; b) b=&(**a) ;
printf("%f",(*x+*y+z)/3); printf("%f",(*(x+y)+z)/2);
c) *a=&c; d) **a=&b;
e) *b=**a+c;
e)
cin>>*x>>*y>>z;
cout<<*x/3+*y/3+z/3; 5.6.8. Pentru s

5.6.6.
#include <iostream.h>
int main ()
{
int x,y;
x=y=0;
int &n=2 ;
for (int &i=x;i<n;i++)
cout<<y++;
}

No 308 No 309
a) ciclului nu poate fi un 5.6.12.
pointer
b) Instru int a, &b=a; b=1;
c) -o i
a) b) 0 c) 1
d) d) e) dimensiunea tipului int
e)
5.6.13. C
5.6.9. int **p; valoare:
p=&q; #include<stdio.h>
a) int main()
{
b) int a=2, *p=&a;
a) int q; b) int *q; c) int ***q; d) int &q; e) nici una. c) printf ("%d\n",*p+1) ;
printf ("%d\n",*&p+1 ;
d) nici una printf ("%d\n" , * (p+1) ) ;
5.6.10. e) programul este eronat printf ("%d\n ",*(&p+1) ;
}

a) 1 int main() 5.6.14. Care dintre tripletele de nu


{
b) 97 int a;
c) nepr char b=1;
a=*(int*)&b;
d) } #include <stdio.h>
e) int main ()
{
int a, b, c, m;
const int x=0 ;
scanf("%d %d %d" ,&a, &b, &c) ;
5.6.11. m=a<b?a:b;
printf ( "\n%d", x=m>c);
}

a) l int main() a) 1, 2, 3
{
b) II int a=1, b=2; b) 1, 3, 2
c) ambele float x; c) 2, 3, 1
x=a / * &b; // (I)
d) nici una x= (float) a/b; // (II) d) 1,1, 1
e) pr } e)
printf

No 310 No 311
5.6.15. 5.7.

#include <iostream.h>
int main() 5.7.1.
{
const int x=2,y=3; 5.7.2. c)
*(int*) &x=8; 5.7.3. d)
*(int*) &y=9;
cout<<"\n"<<x+y; 5.7.4. c)
cout<<"\n"<<*(int*)&x+y; 5.7.5.
cout<<"\n"<<x+*(int*)Sy;
cout<<"\n"<<*(int*)&x+*(int*)&y; 5.7.6. c)
} 5.7.7.
5.7.8. d)
a) prima 5.7.9. b)
b) a doua 5.7.10. c)
c) a treia 5.7.11. a)
d) a patra 5.7.12. c)
e) nici una 5.7.13. d)
5.7.14. e)
5.7.15. c)

No 312 No 313
CAPITOLUL

6.1.

separate pri
header ) -
ormat intern, iar

6.1.

1.
2.
3.
4. consu
5.
6.
7.
8.

No 314 No 315
acces -
1. Nivelul inferior de prelucrare se face apel
operare MS-DOS
VALOARE SEMNIFICATIE
2. Nivelul superior de prelucrare O_RDONLY deschis doar pentru citire
O_WRONLY deschis doar pentru scriere
O_RDWR
O_APPEND
O_TEXT
O_BINARY

6.1.2. O_WRONLY, sau O_RDONLY | O_BINARY.

a testa

io.h fcntl.h>

int df;
a) \ O_RDONLY)) == -1)
df]. {
prin \
exit(1);
DENUMIRE SEMNIFICATIE VALOARE }
FISIER DESCRIPTOR
stdin tastatura 0
stdout monitor 1
stderr 2
stdprn 3 -
stdaux 4
b) creat, care are

open

int creat(const char *cale, int mod);


int open(const char *cale, int acces);

Unde: cale Unde: cale este un p

directorul curent. directorul curent.

No 316 No 317
mod respectiv: 6.1.3 ierelor la nivel superior

VALOARE SEMNIFICATIE
S_IREAD creat pentrucitire
S_IWRITE creat pentru scriere Entitatea FILE
S_EXEC

O
a) citire (read)
>0,
b) scriere (write)
-1
c) append)
d) replace/update)
a testa

a) fread() sau fopen() cu argument r/r+


int df;
b) fopen() cu argument w/w+
\ ITE)) == -1)
{ c) fwrite() sau fopen() cu argument a/a+
\nEroare la deschiderea(crearea) d) fopen() cu argument w/w+
exit(1);
}
! stdio.h.

c) Citirea datelor dintr- read, care


-o entitate de tip FILE
utilizator creat folosind operatorul typedef struct.
stdio.h.
int read(int df, void *buf, int lung);
fopen()

df
buf.
fopen()
stdio.h

FILE* fopen (const char *filename, const char


*mode);

No 318 No 319
FILE. Ceea La
newline (NL CR-LF (carriage return
line feed nare
fclose() erii programului, conversie.
fclose() NULL
cauze) sau pointerul la FILE
fclose() a tuturor fluxurilor (stream

Argumentele aces fclose()


- filename - ;
- mode - fopen()
anume: tent (fluxul FILE. Argumentul
r = citire (read)
w = scriere (write) stdio.h:
a append
append poate f
FILE* fopen (const char *filename);
r+
w+ = cre Argumentul este deci numele fluxului deschis anterior cu fopen(). Este
a+ erului stream sau
pentru acel

specialitate flushing
mode este w sau a (cu variantele w+ eliberarea zonei de memorie astfel rezervate.
a+ mode este r
(nu pot citi dintr-
cu mode w flushing of buffer).
t la 0 EOF (End Of File).
variantele mode existente. De exemplu: wt sau a+t sau at+
b (de exemplu rb, wb sau w+b
sau ab+). freopen()

decizia pe baza valorii variabilei globale _fmode (cu valori O_BINARY sau
O_TEXT) din headerul fcntl.h. fopen() A B, atunci prin apelul

No 320 No 321
freopen() se poate asocia fluxul B A
- freopen() binare:
- deoarece EOF este codif , iar un fi
mul
freopen() va feof() pentru
- ot
fluxurilor standard stdin EOF
(tastatura), stdout stderr ferror() pentr

getc()
Sintaxa este: fgetc().

FILE* freopen (const char *numeFis, const char


*mode, FILE *flux);
fputc()
numeFis, modul de acces este dat prin mode,
flux. Scrie
NULL. La succes se
flux.

int fputc (int ch, FILE *flux);


fgetc()
int la unsigned char.
fgetc() EOF
specificat ca argument: de eroare.
T : pentru , EOF este un
int fgetc(FILE flux); ferror() pentru detectarea

. Caracterul este citit ca


un unsigned char putc()
EOF (End Of File), la fputc().

No 322 No 323
fgets() a:

size_t fread (void *buf, size_t octeti, size_t numar,


Sintaxa este:
FILE *flux);
char *fgets (char *sir, int num, FILE *flux);
numar. Dimensiunea unui
octeti. Acestea sunt citite din fluxul
num-1 caractere din fluxul de intrare flux flux buf
-un vector de caractere indicat prin sir citire/scrie
citit.
'\0').

NULL necunoscute, fie s-a atins


NULL feof() sau ferror().
ferror() feof(), pentru distingerea cazului real

CR-LF NL - new line).


fputs()
fwrite()
Sintaxa:
Complementara lui fread(). Aceasta scrie numar obiecte de dimensiune
int fputs(const char *sir, FILE *flux);
octeti buf.
flux.
flux ui de caractere specificat prin sir. Sintaxa este:

size_t fwrite(const void *buf, size_t octeit, size_t


- EOF.
numar, FILE *flux);
Pentru din cauza conversiilor amintite (CR-LF NL
posibilitatea ca num

-
fread() mod text

No 324 No 325
fprintf()

Func feof()

Sintaxa: Sintaxa acesteia este:

int feof(FILE *flux);

,
.
0 zero
binar) s- -un ciclu, pe baza
printf().

FILE fisier = fopen("c:\\fisier.c", r) ; // deschiderea fluxului asociat

fscanf() if(fisier != NULL){


while(!feof(fisier)) { // not(0) = 1
// in
Are un comportament identic cu celebra scanf() }
}
de la fluxul specificat. else { // tratarea erorii necunoscute
Sintaxa este: printf("\
printf("\n Cod eroare: %u", ferror(fisier));
asociat
int fscanf (FILE * exit(1);
a programului. prototip în stdlib.h:
// void exit (int) _ATTRIB_NORETURN;
}
fscanf() scanf()

-au atribuit efectiv valori.


EOF ulterioare vor returna EOF rewind()
atribuiri. (cu semnifica de derular

func ile fseek() sau fsetpos().

No 326 No 327
Observa : Exemplul 1:
feof() este util fi Lucrul cu fi - anume deschiderea unui flux asociat unui fi -
EOF este , pe o pozi ), este studiat urmator.
caracterului de control . mod text mod binar. Con prealabil
stabilit de programator. Pentru ca opera , atributul
ferror() read-only al fi erului este setat) trebuie dezactivat. Aceasta se face
cu ajutorul comenzilor Windows , apoi
Sintaxa este: alegerea comenzii Properties, dup -bifarea op Read-only (din
zona Attributes Read-only
int ferror(FILE *flux);
de programare.

Aceast erori de fi // lucru


#include<stdio.h>
preluat ca parametru. Dac o eroare. #include<stdlib.h> // pentru functia exit()
O valoare diferit indic o eroare.
int main(void){
char ch, *sirEroare = "Eroare la deschidere fisier" ;
asociat fi una int nrChar = 0 ; // contor al caracterelor
FILE *pFisier ; // pointerul la fisier; numele fluxului
din func rewind() sau clearerr(). Pentru natura exact se folose pFisier = fopen("c:\\[Link]", "W") ;
func perror(). // deschidere pentru scriere. Daca fisierul nu exista el este creat
// Este util sa fie deschis in mod 'append' (adaugare la sfarsit),
// pentru ca fisierul sa-si pastreze continutul intre doua deschideri.
// Un caracter Enter la intrare se traduce in perechea CR-LF la
scriere in fisier.
Func perror() if (pFisier == NULL){ // eroare la deschidere fisier
if(ferror(pFisier)) {
perror(sirEroare) ;
Sintaxa: exit(1) ; // iesire din program
}
void perror(const char *sir); }
else { while((ch = getchar()) != 'q'){
fputc((int)ch, pFisier) ;
nrChar++ ;
Realizeaz }
}
errno sir la dispozitivul standard de eroare (stderr).
Dac valoarea lui sir nu este nul , urmat de dou printf("\nNumarul caracterelor scrise: %i", nrChar) ;
fclose(pFisier) ; // inchiderea fluxului asociat fisierului '[Link]'
(:) de programare pentru eroarea
ap stderr este 'deviat' c ecran (stdout). sir este dat de int i ;
scanf("%i", &i) ;
programator.
}

No 328 No 329
Exemplul 2: Exemplul 3:
stream este analizat urmator. Se Schimbarea asocierii unui flux existent este exemplificat
observ fclose() este prezent . Pe linia 38 tor. Unul dintre fluxurile ini e este atribuit celuilalt, dup se
fclose() efectueaz
HDD
eroare. A nchiderii explicite a unui flux: eliberarea zonei de memorie [Link] [Link] toate

(flushing of buffer). deschidere din fiecare caz al fluxurilor pFis1 pFis2


Crea dou noi fluxuri flux1 flux2. Interschimba -le asocierea. Citi
// lucrul cu fisierele: deschiderea si inchiderea unui stream (flux)
#include<stdio.h> din flux1 flux2 fi
#include<conio.h>
#include<stdlib.h> // pentru functia exit() // lucrul cu fisierele: schimbarea asocierii unui flux fisier - freopen()
#include<stdio.h>
int main(void){ #include<conio.h>
char ch, *sirEroare = "Eroare la deschidere fisier" ; #include<stdlib.h> // pentru functia exit()
int nrChar = 0 ; // contor al caracterelor
FILE *pFisier ; // pointerul la fisier; numele fluxului int main(void){
char ch ;
pFisier = fopen("c:\\[Link]", "w+") ; char *sirErr1 = "Eroare la deschidere fisier 1" ;
// Deschidere pentru scriere si actualizare. char *sirErr2 = "Eroare la deschidere fisier 2" ;
// Un caracter Enter la intrare se traduce in perechea CR-LF la int nrCh1 = 0, nrCh2 = 0 ; // contoare ale caracterelor (octetilor)
scriere in fisier. int contor = 20; // numarul de executii al celei de-a doua bucle
while()
if (pFisier == NULL){ // eroare la deschidere fisier
if(ferror(pFisier)) { FILE *pFis1, *pFis2 ; // pointerii la fisiere; numele fluxurilor
perror(sirEroare) ;
exit(1) ; // iesire din program pFis1 = fopen("c:\\[Link]", "wt+") ;
} pFis2 = fopen("c:\\[Link]", "at+") ;
} // Un caracter Enter la intrare se traduce in perechea CR-LF la
else { while((ch = getchar()) != 'q'){ scriere in fisier.
fputc((int)ch, pFisier) ;
nrChar++ ; if (pFis1 == NULL){ // eroare la deschidere fisier1
} if(ferror(pFis1)) {
} perror(sirErr1) ;
exit(1) ; // iesire din program
printf("\nNumarul caracterelor scrise: %i", nrChar) ; }
}
// apar erori in acest moment?
if(ferror(pFisier)) perror(sirEroare) ; if (pFis2 == NULL){ // eroare la deschidere fisier2
// fclose(pFisier) ; // inchiderea fluxului asociat fisierului '[Link]' if(ferror(pFis2)) {
perror(sirErr2) ;
getch() ; exit(1) ; // iesire din program
} }
}

No 330 No 331
// scriere in fisierul 1 Exemplul 4:
printf("\n Se scrie in fisierul [Link]... \n") ;
while((ch = getchar()) != 'q'){
fputc((int)ch, pFis1) ; u tor se studiaz comportamentul func fgetc() pentru
nrCh1++ ;
un stream creat de programator.
}
printf("\nNumarul caracterelor scrise in fisierul >> [Link] <<: EOF) tip text tip binar.
%i", nrCh1) ;
// citire din fisierul 2. Acesta este un fisier de proba existent apriori
// la locatia anuntata. Trebuie sa contina cel putin 20 caractere (!). concluziile pe car
printf("\n\n\n Se citeste din fisierul [Link] ...\n") ;
while(contor){ // lucrul cu fisierele: citirea dintr-un fisier cu ajutorul functiei fgetc()
printf("%c", fgetc(pFis2)) ; -
nrCh2++ ; // incrementare a numarului de caractere citite.
#include<stdio.h>
contor-- ; // decrementare la fiecare carcter citit.
#include<conio.h>
} #include<stdlib.h> // pentru functia exit()
printf("\nNumarul caracterelor citite din fisierul >> [Link]
<<: %i", nrCh2) ;
int main(void){
char ch, *sirEroare = "Eroare la deschidere fisier" ;
// Inchiderea fluxului 2. Schimbarea asocierii fluxului 1, cu fluxul 2.
int nrCharT = 32 , nrCharB = 32; // numarul caracterelor ce vor
fclose(pFis2) ; fi citite
pFis2 = freopen("c:\\[Link]", "at+", pFis1) ; int contorT = 0, contorB = 0 ; // contoare de citire pentru
// asociez pFis1 fisierului '[Link]'. Acesta nu mai este asociat
fiecare dintre fluxuri
// fisierului [Link] (!) FILE *pFisT, *pFisB ; // pointerii la fisier;
// scriu in fisierul 2, in mod adaugare, dupa schimbarea atribuirii.
// numele fluxurilor: text si binar
nrCh1 = 0 ; // reset pe contorul de caractere pe care l-am stabilit,
// conventional, fisieurlui '[Link]'
pFisT = fopen("c:\\[Link]", "rt") ;
printf("\n\n\n Se scrie in fisierul [Link], dupa reatriuirea // deoarece urmeaza o citire din acest fisier se presupune ca el exista
fluxurilor. \n") ; // deja pe HDD, la locatia anuntata. Altfel sunt generate erori de
while((ch = getchar()) != 'q'){ // compilator. Un caracter Enter la intrare se traduce in perechea CR-
fputc((int)ch, pFis2) ; // LF la scriere in fisier.
nrCh1++ ; pFisB = fopen("c:\\[Link]", "rb") ; // citire in mod binar
}
printf("\nNumarul caracterelor scrise in fisierul >> [Link] << if (pFisT == NULL){ // eroare la deschidere fisier?
dupa \ reatribuire: %i", nrCh1) ;
if(ferror(pFisT)) {
perror(sirEroare) ;
// inchiderea definitiva a fluxurilor
exit(1) ; // iesire din program
fclose(pFis1); fclose(pFis2); }
getch() ; }
} if (pFisT == NULL){ // eroare la deschidere fisier?
if(ferror(pFisB)) {
perror(sirEroare) ;
exit(1) ; // iesire din program
}
}

No 332 No 333
HDD se poate observa cum caracterul '\n
de text sau
// urmeaza operatiile specifice fisierelor binar.
// pentru fisierul text
printf("\nCitire din fisierul [Link] ...") ; Pentru ca opera read-only al
fi erului st cu ajutorul
while(nrCharT){
if(ferror(pFisT)) perror(sirEroare) ; comenzilor Windows: click , apoi alegerea
printf("%c", fgetc(pFisT)) ; comenzii Properties, dup -bifarea op Read-only. Apply
// citesc din fisierul [Link], prin
// intermediul fluxului asociat pointerului 'pFisier' OK (sau direct OK).
nrCharT-- ; // cat mai raman in bucla?
contorT++ ; // cate caractere am scris pana acum? // lucrul cu fisierele: scrierea intr-un fisier cu ajutorul functiei fputc()
} -
printf("\n\nNumarul caracterelor citite: %i", contorT) ; #include<stdio.h>
#include<conio.h> // pentru functia getch()
// pentru fisierul binar #include<stdlib.h> // pentru functia exit()
printf("\n\nCitire din fisierul [Link] ...") ; #include<math.h> // pentru functia pow()

while(nrCharB){ typedef unsigned long int ULI ;


if(ferror(pFisB)) perror(sirEroare) ;
printf("%c", fgetc(pFisB)) ; int main(void){
// citesc din fisierul [Link], prin char *sirEroare = "Eroare la deschidere fisier" ;
// intermediul fluxului asociat pointerului 'pFisier' char *sirDeScris = " Un mesaj de proba\n Pe doua randuri" ;
nrCharB-- ; // cat mai raman in bucla? char *pCh = sirDeScris ; // pointer la inceputul sirului de scris
contorB++ ; // cate caractere am scris pana acum? FILE *pFisT, *pFisB ; // pointerii la fisier;
} // numele fluxurilor: text si binar
printf("\n\nNumarul caracterelor citite: %i", contorB) ;
pFisT = fopen("c:\\[Link]", "wt+") ; // actualizare in mod
// inchiderea celor doua fluxuri text.
fclose(pFisT) ; // inchiderea fluxului asociat fisierului '[Link]' // Un caracter Enter la intrare se traduce in perechea CR-LF la
fclose(pFisB) ; // inchiderea fluxului asociat fisierului '[Link]' scriere in fisier.
pFisB = fopen("c:\\[Link]", "wb+") ; // actualizare in mod
puts("\n\nIncheiati apasand o tasta alfa-numerica...") ; binar.
getch() ;
} if (pFisT == NULL){ // eroare la deschidere fisier?
if(ferror(pFisT)) {
perror(sirEroare) ;
exit(1) ; // iesire din program
}
Exemplul 5: }

if (pFisB == NULL){ // eroare la deschidere fisier?


Programul u tor arat if(ferror(pFisB)) {
perror(sirEroare) ;
fgetc(), anume fputc(). Fi mod actualizare pentru ca o exit(1) ; // iesire din program
asemenea opera Se observ }
}
pozi Prin

No 334 No 335
// lucrul cu fisierele: citirea intr-un fisier cu ajutorul functiei fgets() -
else { // incep scrierea in fisiere text si binar
ULI i ; // variabila locala corpului de instructiuni 'else' #include<stdio.h>
ULI contor = 0 ; #include<conio.h> // pentru functia getch()
printf("\n Se scrie in fisiere...\n") ; #include<stdlib.h> // pentru functia exit()
while(*pCh++ != '\0') { typedef unsigned long int ULI; // tip de data 'intreg lung fara semn'
i = (ULI) pow(2, 25) ; // poate contine valori in gama [0 232-1]
// numar natural posibil pentru acest tip de data (ULI) int main(void)
// 2^25 = 32 Mega {
fputc(*pCh, pFisT) ; char *sirEroare = "Eroare la deschidere fisier";
fputc(*pCh, pFisB) ; char sirCititT[32], sirCititB[32]; // sirurile citite sunt copiate in
acesti vectori de caractere (text, respectiv binar)
printf(" %i", contor) ; const int nrMax = 30; // numarul maxim de caractere ce urmeaza
contor++ ; sa fie citit
for(; i>0; i--) ;// delay FILE *pFisT, *pFisB; // pointerii la fisier;
} // numele fluxurilor: text si binar
} pFisT = fopen("c:\\[Link]", "rt+") ; // citire in mod text.
// Un caracter Enter la intrare se traduce in perechea CR-LF la
// inchiderea fluxurilor // scriere in fisier
fclose(pFisT) ; pFisB = fopen("c:\\[Link]", "rb+"); // citire in mod binar
fclose(pFisB) ;
if (pFisT == NULL){ // eroare la deschidere fisier?
printf("\n\n Dati un caracter alfa-numeric... "); if(ferror(pFisT)) {
getch() ; perror(sirEroare);
} exit(1); // iesire din program
}
}

if (pFisB == NULL){ // eroare la deschidere fisier?


Exemplul 6: if(ferror(pFisB)) {
Preluarea unui e dintr-un fi fgets()) perror(sirEroare);
exit(1); // iesire din program
observa sunt urm }
programul u tor. Trebuie avut din situa }
else { // incep citirea din fisiere
fi tip text. De aceea na de o printf("\n S-au citit din fisiere urmatoarele siruri...\n");
dimensiune acoperitoare. Dac puts(fgets(sirCititT, nrMax, pFisT));
puts(fgets(sirCititB, nrMax, pFisB));
NL caractere de control: CR-LF. Pute
} // end_else
calcula astfel, aproximativ, num rul de caractere al .
// afisarea continutului sirurilor buffer
Prin observarea rez -un printf("\n\n s Ce s-a scris in sirul sirCititT: \n %s", sirCititT);
printf("\n Iar ce s-a scris in sirul sirCititB: \n %s", sirCititB);
text sau binar new-line
// inchiderea fluxurilor
Nu se trece mai departe, pe linia fclose(pFisT);
fclose(pFisB);
printf("\n\n Dati un caracter alfa-numeric... ");
getch();
}

No 336 No 337
// operatia efectiva asupra fisierelor
Exemplul 7: else { // nu este eroare => incep scrierea in fisiere.
Func fgets() este fputs(). Utilizarea acesteia este ULI lenT = strlen(sirDeScrisT), lenB = strlen(sirDeScrisB) ;
// lungimile celor doua siruri de scris.
studiat u tor. Ca fgets() indicatorul de pozi fpos_t pozT, pozB ;
fi .
printf("\n Lungimile celor doua siruri ce urmeaza sa fie scrise:
Observa diferen actere \ text = %i, binar = %i", lenT, lenB) ;

// test eroare indicator fisier text: inainte de scriere


if(!fgetpos(pFisT, &pozT))
// lucrul cu fisierele: scrierea intr-un fisier cu ajutorul functiei fputs() printf("\n Indicatorul de pozitie al fisierului text
// urmarirea indicatorilor de pozitie inainte si dupa scriere - (inainte): %u", pozT) ;
binar else {
#include<stdio.h> if(ferror(pFisT)) {
#include<conio.h> // pentru functia getch() perror(sirEroare) ;
#include<stdlib.h> // pentru functia exit() exit(1) ; // iesire din program
#include<string.h> // pentru functia strlen() }
}
typedef unsigned long int ULI ;
// test eroare indicator fisier binar: inainte de scriere
int main(void){ if(!fgetpos(pFisB, &pozB) )
char *sirEroare = "Eroare la operatie asupra fisier" ; printf("\n Indicatorul de pozitie al fisierului binar
char *sirDeScrisT = "\n Un mesaj de proba, \n in mod text" ; (inainte): %u", pozB) ;
char *sirDeScrisB = "\n Un mesaj de proba, \n in mod binar" ; else {
if(ferror(pFisB)) {
FILE *pFisT, *pFisB ; // pointerii la fisier; perror(sirEroare) ;
// numele fluxurilor: text si binar exit(1) ; // iesire din program
}
// deschiderea fluxurilor, impreuna cu testele de eroare aferente }
pFisT = fopen("c:\\[Link]", "wt+") ;
// actualizare prin stergerea continutului anterior, in mod text. // scrierea efectiva. Teste de eroare la scriere (fputs() intoarce valori
// Un caracter Enter la intrare se traduce in perechea CR-LF la // non-negative in caz de succes. Intoarce EOF in caz contrar)
// scriere in fisier. printf("\n\n Se scrie in fisiere...\n") ;
pFisB = fopen("c:\\[Link]", "wb+") ;
// actualizare prin stergerea continutului anterior, in mod binar. if(fputs(sirDeScrisT, pFisT) == EOF) {
if(ferror(pFisT)) {
if (pFisT == NULL){ // eroare la deschidere fisier? perror(sirEroare) ;
if(ferror(pFisT)) { exit(1) ; // iesire din program
perror(sirEroare) ; }
exit(1) ; // iesire din program }
}
} if(fputs(sirDeScrisB, pFisB) == EOF) {
if(ferror(pFisB)) {
if (pFisB == NULL){ // eroare la deschidere fisier? perror(sirEroare) ;
if(ferror(pFisB)) { exit(1) ; // iesire din program
perror(sirEroare) ; }
exit(1) ; // iesire din program }
}
}

No 338 No 339
// test eroare indicator fisier text: dupa scriere
if(!fgetpos(pFisT, &pozT)) // lucrul cu fisierele: scrierea intr-un fisier cu ajutorul functiei
printf("\n Indicatorul de pozitie al fisierului text (dupa): fwrite()
%u", pozT) ; // urmarirea indicatorilor de pozitie inainte si dupa scriere. -
else { binar
if(ferror(pFisT)) { #include<stdio.h>
perror(sirEroare) ; #include<conio.h> // pentru functia getch()
exit(1) ; // iesire din program #include<stdlib.h> // pentru functia exit()
} #include<string.h> // pentru functia strlen()
}
typedef unsigned long int ULI ;
// test eroare indicator fisier binar: dupa scriere
if(!fgetpos(pFisB, &pozB)) int main(void){
printf("\n Indicatorul de pozitie al fisierului binar char *sirEroare = "Eroare la operatie asupra fisier" ;
(dupa): %u", pozB) ; char *sirDeScrisT = " Un mesaj de proba, in mod text." ;
else { char *sirDeScrisB = " Un mesaj de proba, in mod binar." ;
if(ferror(pFisB)) {
perror(sirEroare) ; const int nrObiecte = 8 ; // voi scrie/citi 8 obiecte ...
exit(1) ; // iesire din program const int dimObiect = 2 ; // ... de lungime 2 octeti, fiecare.
}
} FILE *pFisT, *pFisB ; // pointerii la fisier;
} // end_else // numele fluxurilor: text si binar

// inchiderea fluxurilor // deschiderea fluxurilor, impreuna cu testele de eroare aferente


fclose(pFisT) ; pFisT = fopen("c:\\[Link]", "wt+") ;
fclose(pFisB) ; // actualizare prin stergerea continutului anterior, in mod text.
// Un caracter Enter la intrare se traduce in perechea CR-LF la
// sfarsit // scriere in fisier.
printf("\n\n Dati un caracter alfa-numeric... "); pFisB = fopen("c:\\[Link]", "wb+") ;
getch() ; // actualizare prin stergerea continutului anterior, in mod binar.
}
if (pFisT == NULL){ // eroare la deschidere fisier?
if(ferror(pFisT)) {
perror(sirEroare) ;
exit(1) ; // iesire din program
Exemplul 8: }
}
Func fread() este urm u tor. Aten
if (pFisB == NULL){ // eroare la deschidere fisier?
primul argument - void *buf. Trebuie s te operatorul de conversie if(ferror(pFisB)) {
explicit -l citi . Dup perror(sirEroare) ;
exit(1) ; // iesire din program
concluziona, tipul void* reprezint '. }
Trebuie remarcate NL CR-LF. }

No 340 No 341
// aceleasi operatii pentru fisierul binar
// operatia efectiva asupra fisierelor if((scriseB = fwrite((char*)sirDeScrisB, dimObiect, nrObiecte,
else { // nu este eroare => incep scrierea in fisiere. pFisB)) == nrObiecte)
ULI lenT = strlen(sirDeScrisT), lenB = strlen(sirDeScrisB) ; printf("\n Succes! Numarul efectiv de caractere scrise (binar):
// lungimile celor doua siruri de scris. %u", scrise B*dimObiect) ;
fpos_t pozT, pozB ;
else {
printf("\n Lungimile celor doua siruri din care urmeaza sa se if(ferror(pFisB)) {
scrie: \ text = %i, binar = %i", lenT, lenB) ; perror(sirEroare) ;
exit(1) ; // iesire din program
// test eroare indicator fisier text: inainte de scriere }
if(!fgetpos(pFisT, &pozT) ) }
printf("\n Indicatorul de pozitie al fisierului text
(inainte): %u", pozT) ; // test eroare indicator fisier text: dupa scriere
else { if(!fgetpos(pFisT, &pozT))
if(ferror(pFisT)) { printf("\n\n Indicatorul de pozitie al fisierului text
perror(sirEroare) ; (dupa): %u", pozT) ;
exit(1) ; // iesire din program else {
} if(ferror(pFisT)) {
} perror(sirEroare) ;
exit(1) ; // iesire din program
// test eroare indicator fisier binar: inainte de scriere }
if(!fgetpos(pFisB, &pozB) ) }
printf("\n Indicatorul de pozitie al fisierului binar
(inainte): %u", pozB) ; // test eroare indicator fisier binar: dupa scriere
else { if(!fgetpos(pFisB, &pozB))
if(ferror(pFisB)) { printf("\n Indicatorul de pozitie al fisierului binar
perror(sirEroare) ; (dupa): %u", pozB) ;
exit(1) ; // iesire din program else {
} if(ferror(pFisB)) {
} perror(sirEroare) ;
exit(1) ; // iesire din program
// scrierea efectiva, impreuna cu testele de eroare aferente legate de }
functia folosita. }
{ } // end_else
ULI scriseT, scriseB ;
// numarul obiectelor scrise efectiv - raportat de functia fwrite() } // end_scriereEfectiva
printf("\n\n Se scrie in fisiere...\n") ; // inchiderea fluxurilor
if((scriseT = fwrite((char*)sirDeScrisT, dimObiect, nrObiecte, fclose(pFisT) ;
pFisT)) == nrObiecte) fclose(pFisB) ;
printf("\n Succes! Numarul efectiv de caractere scrise
(text): %u", scrise T*dimObiect) ; // sfarsit
printf("\n\n Dati un caracter alfa-numeric... ");
else { getch() ;
if(ferror(pFisT)) { }
perror(sirEroare) ;
exit(1) ; // iesire din program
}
}

No 342 No 343
Exemplul 9:
// operatia efectiva asupra fisierelor
else { // nu este eroare => incep citirea din fisiere.
Complementara lui fread() este fwrite() fpos_t pozT, pozB ; // indicatorii de pozitie ai celor doua tipuri de
programul u tor. Efectele sunt acelea fisiere.
// test eroare indicator fisier text: inainte de scriere
se modific ier, iar conversiile de caractere de if(!fgetpos(pFisT, &pozT) )
de tip text. printf("\n Indicatorul de pozitie al fisierului text
(inainte): %u", pozT) ;
else {
// lucrul cu fisierele: citirea dintr-un fisier cu ajutorul functiei fread() if(ferror(pFisT)) {
// urmarirea indicatorilor de pozitie inainte si dupa scriere. - perror(sirEroare) ;
binar exit(1) ; // iesire din program
#include<stdio.h> }
#include<conio.h> // pentru functia getch() }
#include<stdlib.h> // pentru functia exit()
#include<string.h> // pentru functia strlen() // test eroare indicator fisier binar: inainte de scriere
typedef unsigned long int ULI ; if(!fgetpos(pFisB, &pozB) )
void finalSir(const char*, ULI*, const ULI) ; printf("\n Indicatorul de pozitie al fisierului binar
(inainte): %u", pozB) ;
int main(void){ else {
char *sirEroare = "Eroare la operatie asupra fisier" ; if(ferror(pFisB)) {
void *sirCititT[32], *sirCititB[32] ; perror(sirEroare) ;
// cele doua zone tampon (buffer) in care exit(1) ; // iesire din program
// se salveaza textul citit din fisiere (text respectiv binar). }
}
const int nrObiecte = 8 ; // voi citi 8 obiecte ...
const int dimObiect = 3 ; // ... de lungime 2 octeti, fiecare. // citirea efectiva, impreuna cu testele de eroare aferente legate de
FILE *pFisT, *pFisB ; // pointerii la fisier; functia folosita.
// numele fluxurilor: text si binar { // un nou corp de instructiuni
// deschiderea fluxurilor, impreuna cu testele de eroare aferente ULI cititeT, cititeB ; // numarul obiectelor citite efectiv -
pFisT = fopen("c:\\[Link]", "rt") ; raportat de functia fread()
// mod citire si actualizare, in mod text. char *pVar ;
// Un caracter Enter la intrare se traduce in perechea CR-LF la int contor ;
scriere in fisier.
pFisB = fopen("c:\\[Link]", "rb") ; printf("\n\n Se citeste din fisiere...\n") ;
// mod citire si actualizare, in mod binar.
if((cititeT = fread((char*)sirCititT, dimObiect, nrObiecte,
if (pFisT == NULL){ // eroare la deschidere fisier? pFisT)) == nrObiecte)
if(ferror(pFisT)) { {
perror(sirEroare) ; printf("\n Succes! Numarul efectiv de caractere citite
exit(1) ; // iesire din program (text): %u",
}
} cititeT*dimObiect) ;
if (pFisB == NULL){ // eroare la deschidere fisier? finalSir((const char*)sirCititT, &cititeT, dimObiect) ;
if(ferror(pFisB)) { printf("\n Ceea ce s-a citit (text): %s", (char*)sirCititT) ;
perror(sirEroare) ; }
exit(1) ; // iesire din program
}
}

No 344 No 345
else { // inchiderea fluxurilor
if(ferror(pFisT)) { fclose(pFisT) ;
perror(sirEroare) ; fclose(pFisB) ;
exit(1) ; // iesire din program
} // sfarsit
} printf("\n\n Dati un caracter alfa-numeric... ");
getch() ;
// aceleasi operatii pentru fisierul binar }
if((cititeB = fread((char*)sirCititB, dimObiect, nrObiecte,
pFisB)) == nrObiecte) // implementarea functiei declarate local (functie proprie
{ programatorului).
printf("\n\n Succes! Numarul efectiv de caractere citite // Se marcheza explicit sfarsitul sirului tampon, deoarece fread() nu
(binar): %u", citite B*dimObiect) ; face acest lucru automat.
finalSir((const char*)sirCititB, &cititeB, dimObiect) ; void finalSir( const char *sirCitit,
printf("\n Ceea ce s-a citit (binar): %s", (char*)sirCititB) ; /* text sau binar, nu conteaza din cauza apelului referinta*/
} ULI *citite,
const ULI dimObiect) {
else { char *pVar ; // pointer variabil, pentru deplasarea in interiorul
if(ferror(pFisB)) { // sirului preluat ca argument.
perror(sirEroare) ; int contor ; // variabila locala
exit(1) ; // iesire din program
} // instructiunile proprii functiei
} contor = *citite*dimObiect ;
pVar = (char*) sirCitit ;
// test eroare indicator fisier text: dupa scriere
if(!fgetpos(pFisT, &pozT)) while(contor--) pVar++ ;
printf("\n\n Indicatorul de pozitie al fisierului text // variabila contor se decrementeaza dupa ce se testeaza valoarea de
(dupa): %u", pozT) ; adevar a conditiei logice.
else { *pVar = '\0' ; // marchez explicit sfarsitul sirului
if(ferror(pFisT)) { }
perror(sirEroare) ;
exit(1) ; // iesire din program
}
}
Exemplul 10:
// test eroare indicator fisier binar: dupa scriere
if(!fgetpos(pFisB, &pozB))
Func fprintf() fscanf() u tor. Dup
printf("\n Indicatorul de pozitie al fisierului binar
(dupa): %u", pozB) ; cum se cunoa te de la func printf() scanf(), comportamentul
else {
celor dedicate fi lor lor este similar. Observa
if(ferror(pFisB)) {
perror(sirEroare) ; de pozi . fscanf()
exit(1) ; // iesire din program
ifice
}
} 3
} // end_else
2 [Link]
} // end_citireEfectiva pe prima linie valori valide.

No 346 No 347
// lucrul cu fisierele: citirea/scrierea formatate intr-un/dintr-un fisier // operatia efectiva asupra fisierelor
// cu ajutorul functiilor pereche fprintf() / fscanf(). else { // nu este eroare => incep citirea din fisiere.
// urmarirea indicatorilor de pozitie inainte si dupa scriere. - fpos_t pozT, pozB ; // indicatorii de pozitie ai celor doua tipuri de
binar fisiere.

#include<stdio.h> // test eroare indicator fisier text: inainte de scriere


#include<conio.h> // pentru functia getch() if(!fgetpos(pFisT, &pozT) )
#include<stdlib.h> // pentru functia exit() printf("\n Indicatorul de pozitie al fisierului text
(inainte): %u", pozT) ;
typedef unsigned long int ULI ; else {
if(ferror(pFisT)) {
int main(void){ perror(sirEroare) ;
char *sirEroare = "Eroare la operatie asupra fisier" ; exit(1) ; // iesire din program
char *sirFormat = "\n Se scriu %f, %f, %f drept valori reale si }
%i, %i ca valori intregi." ; }
// test eroare indicator fisier binar: inainte de scriere
const int nrObiectReal = 3 ; // voi scrie 3 obiecte reale... if(!fgetpos(pFisB, &pozB) )
const int nrObiectInt = 2 ; // ... si 2 obiecte intregi. printf("\n Indicatorul de pozitie al fisierului binar
(inainte): %u", pozB) ;
FILE *pFisT, *pFisB ; // pointerii la fisier; else {
// numele fluxurilor: text si binar if(ferror(pFisB)) {
perror(sirEroare) ;
// deschiderea fluxurilor, impreuna cu testele de eroare aferente exit(1) ; // iesire din program
pFisT = fopen("c:\\[Link]", "wt+") ; }
// actualizare prin adaugare, in mod text. }
// Un caracter Enter la intrare se traduce in perechea CR-LF la
// scriere in fisier. // operatiile efective, impreuna cu testele de eroare legate de functiile
pFisB = fopen("c:\\[Link]", "at+") ; folosite.
// actualizare prin adaugare, in mod binar. {
ULI scriseT, cititeB ;// numarul caaracterelor scrisein mod text, si
if (pFisT == NULL){ // eroare la deschidere fisier? // citite in mod binar
if(ferror(pFisT)) { int i1, i2 ; // variabilele intregi citite binar.
perror(sirEroare) ; float r1, r2, r3 ; // variabilele reale citite binar.
exit(1) ; // iesire din program printf("\n\n Se scrie in fisierul text...") ;
} scriseT = fprintf(pFisT, sirFormat, 2.71828, -3.141592, -0.17, 3,
} 4) ;
printf("\n Numarul efectiv de caractere scrise in fisier (!) text):
if (pFisB == NULL){ // eroare la deschidere fisier? %u", scriseT) ;
if(ferror(pFisB)) {
perror(sirEroare) ; // operatiile pentru fisierul binar
exit(1) ; // iesire din program printf("\n\n Se citeste din fisierul binar...") ;
}
} cititeB = fscanf(pFisB, "%f,%f,%f,%i,%i", &r1, &r2, &r3,
&i1, &i2) ;
printf("\n Numarul efectiv de obiecte atribuite(!) (binar): %u",
cititeB) ;
printf("\n Valorile variabilelor dupa citirea din fisier: %f, %f,
%f si %i, %i", r1, r2, r3, i1, i2) ;

No 348 No 349
[Link] [Link] um

// test eroare indicator fisier text: dupa scriere u tor


if(!fgetpos(pFisT, &pozT)) cond
printf("\n\n Indicatorul de pozitie al fisierului text
(dupa): %u", pozT) ;
else {
if(ferror(pFisT)) {
perror(sirEroare) ;
exit(1) ; // iesire din program pentru citire scrierea
}
}
rulare).
// test eroare indicator fisier binar: dupa scriere
if(!fgetpos(pFisB, &pozB)) read-only
printf("\n Indicatorul de pozitie al fisierului binar egrat de
(dupa): %u", pozB) ;
else {
if(ferror(pFisB)) {
perror(sirEroare) ; // lucrul cu fisierele: functiile de tratare a erorilor
exit(1) ; // iesire din program
} #include<stdio.h>
} #include<conio.h> // pentru functia getch()
} // end_else #include<stdlib.h> // pentru functia exit()
} // end_citireEfectiva
int main(void){
// inchiderea fluxurilor char *sirEroareT = "\nLa operatia asupra fisierului text" ;
fclose(pFisT) ; char *sirEroareB = "\nLa operatia asupra fisierului binar" ;
fclose(pFisB) ; char bufferText[128], bufferBin[128] ;
// numarul maxim de caractere (octeti) cititi poate
// sfarsit // fi cel specificat de dimensiunea vectorilor.
printf("\n\n Dati un caracter alfa-numeric... ");
getch() ; FILE *pFisT, *pFisB ; // pointerii la fisier;
} // numele fluxurilor: text si binar

// deschiderea fluxurilor, impreuna cu testele de eroare aferente


pFisT = fopen("c:\\[Link]", "rt") ;
// Deschis in mod citire, pentru tip text.
Exemplul 11: // Ramane sa modificati pe rand aceste moduri de deschidere si sa
// observati efectele, vizualizand de fiecare data continutul fisierelor.
Func r legate de fi e sunt urm // Daca fisierul [Link] contine un numar dat de caractere, atunci
// incercarea de a citi mai multe caractere genereaza EOF.
programul u tor. Erorile sunt provocate pentru a putea urm // Modificati modul de deschidere in "wt". Observati
aspecte ale func . Fi ul fie nu exist // comportamentul compilatorului, care se blocheaza.

citirea din acesta, fie are atributul read-only activ // pFisB = fopen("c:\\[Link]", "wb") ;
// pFisB = fopen("c:\\[Link]", "ab") ;
-se
pFisB = fopen("c:\\[Link]", "rb") ;
dimensiunea acestuia (atingerea s EOF).

No 350 No 351
// Deschidere in mod adaugare, sau scriere sau citire. Ramane sa // operatiile efective, impreuna cu testele de eroare legate de functiile
// modificati pe rand aceste moduri de deschidere si sa observati // folosite.
// efectele, vizualizand de fiecare data continutul fisierelor. {
// Stabiliti pentru fisierul de pe HDD atributul read-only pe ON. int nrObiecte = 4 ; // numarul de obiecte ce urmeaza sa fie citite
// Compilatorul va genera erori grave si se va blocha. (variabila locala)
// Dezactivati apoi atributul read-only pentru a obtine o functionare int dimObiect = 2 ; // numarul de octeti al unui obiect (variabila
// normala a programului. Sau schimbati modul de deschidere al locala)
// fisierului, astfel incat acesta sa fie compatibil cu atributul read- printf("\n\n Se citeste din fisierul text...") ;
// only. printf("\n S-au citit efectiv %u obiecte", fread(bufferText,
// Daca modul de deschidere este 'append' si se doresc operatii de dimObiect, nrObiecte, pFisT)) ;
// citire acestea nu se executa cu succes.
if(feof(pFisT)) perror(sirEroareT) ; // test de EOF.
if (pFisT == NULL){ // eroare la deschidere fisier?
if(ferror(pFisT)) { int i = 0 ;
perror(sirEroareT) ; while(i < nrObiecte*dimObiect) i++ ;
exit(1) ; // iesire din program bufferText[i] = '\0' ; // marcarea explicita a sfarsitului de sir.
}
} // puts(bufferText) ;
if (pFisB == NULL){ // eroare la deschidere fisier? printf("\n Buffer-ul contine sirul: %s", bufferText) ;
if(ferror(pFisB)) {
perror(sirEroareB) ; // operatie improprie modului de deschidere ales
exit(1) ; // iesire din program fprintf(pFisT, "\n Operatie interzisa, conform modului de
} deschidere ales") ;
} // aceasta operatie este ignorata (!)
// operatia efectiva asupra fisierelor }
else { // nu este eroare => incep operatiile pe fisiere.
fpos_t pozT, pozB ; // indicatorii de pozitie ai celor doua tipuri de
fisiere. // operatiile pentru fisierul binar
// test eroare indicator fisier text: inainte de scriere {
if(!fgetpos(pFisT, &pozT) ) int nrObiecte = 24 ; // numarul de obiecte ce urmeaza sa fie citite
printf("\n Indicatorul de pozitie al fisierului text (variabila locala)
(inainte): %u", pozT) ; int dimObiect = 4 ; // numarul de octeti al unui obiect (variabila
else { locala)
if(ferror(pFisT)) {
perror(sirEroareT) ; printf("\n\n Se citeste din fisierul binar...") ;
exit(1) ; // iesire din program
} // o citire cu un numar de caractere peste dimensiunea fisierului,
} // considerand fisierul initializat cu mai putine caractere decat
// test eroare indicator fisier binar: inainte de scriere // valoarea nrObiecte*dimObiect din acest moment.
if(!fgetpos(pFisB, &pozB) ) // O rulare multipla a programului va schimba continutul fisierului
printf("\n Indicatorul de pozitie al fisierului binar // si deci si valoarea logic a conditiei din if(feof()) de mai jos.
(inainte): %u", pozB) ; fread(bufferBin, dimObiect, nrObiecte, pFisB) ;
else { if(feof(pFisB)) perror(sirEroareB) ; // test de EOF.
if(ferror(pFisB)) { int i = 0 ;
perror(sirEroareB) ; while(i < nrObiecte*dimObiect) i++ ;
exit(1) ; // iesire din program bufferText[i] = '\0' ; // marcarea explicita a sfarsitului de sir.
}
} printf("\n Buffer-ul contine sirul: %s", bufferBin) ;

No 352 No 353
6.2. Probleme rezolvate
// o scriere fara modificarea indicatorului de pozitie, dar cu
// schimbarea fluxului asociat
fclose(pFisT) ;
pFisT = freopen("c:\\[Link]", "ab", pFisB) ;
6.2.1. Enun uri
// reatribui pFisB lui pFisT
// voi modifica acum fisierul [Link], cu ajutorul fluxului 'pFisT'

fprintf(pFisT, "\n Un text oarecare\n pentru proba. Fisier


binar") ;
if(feof(pFisT)) perror(sirEroareB) ; // test de EOF.
if(feof(pFisB)) perror(sirEroareB) ; // test de EOF. 2. scrie u
}
ierul "[Link]", pe o linie,
// test eroare indicator fisier text: dupa operatii
if(!fgetpos(pFisT, &pozT))
printf("\n\n Indicatorul de pozitie al fisierului text
(dupa): %u", pozT) ; 3. scrie un p -
else {
if(ferror(pFisT)) {
perror(sirEroareT) ; indicat
exit(1) ; // iesire neconditionata din program
}
}

// test eroare indicator fisier binar: dupa operatii -


if(!fgetpos(pFisB, &pozB))
printf("\n Indicatorul de pozitie al fisierului binar
(dupa): %u", pozB) ; 6.2.2. Solu ii propuse
else {
if(ferror(pFisB)) {
perror(sirEroareB) ; Problema 1:
exit(1) ; // iesire neconditionata din program
} scrie un program ce
}
} // end_else
#include <stdio.h>
// inchiderea fluxurilor
#include <stdlib.h>
fclose(pFisT) ; #include <io.h>
fclose(pFisB) ; #include <fcntl.h>
int main()
// sfarsit
{
printf("\n\n Dati un caracter alfa-numeric... "); FILE *pf1, *pf2;
getch() ;
char sir1[100], sir2[100];
} char nume1[10], nume2[10];
printf("\n DATI NUMELE PRIMULUI FISIER:\n");
scanf("%s", nume1);

No 354 No 355
for(i=0; i<nr; i++)
if((pf1=fopen(nume1,"r")) == NULL)
{
{
printf("x[%d] = ",i+1);
printf("\n EROARE LA DESCHIDERE %s\n",nume1);
scanf("%d", &x[i]);
exit(1);
}
}
pf=fopen("[Link]","w");
printf("\n DATI NUMELE CELUI DE AL DOILEA
for(;n<nr;n++)
FISIER:\n");
{
scanf("%s", nume2);
a = x[n] + x[n+1];
if((pf2=fopen(nume2,"r")) == NULL)
fprintf(pf,"%d %4.2f %d\n", x[n], a, x[n+1]);
{
}
printf("\n EROARE LA DESCHIDERE %s\n",nume2);
fclose(pf);
exit(1);
getch();
}
}
while( !feof(pf1) && !feof(pf2) )
{
fgets(sir1,99,pf1);
fgets(sir2,99,pf2);
Problema 3:
if(strcmp(sir1,sir2)!=0)
{ scrie un p -
printf("\nprima linie diferita a celor doua fisiere este:%s\n",
sir1);
exit(1);
}
}
}
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<io.h>
Problema 2:
scrie u typedef struct inreg{
int nr;
linie, char nume[20];
char prenume[20];
char tel[7];
}elev;
#include<stdio.h> elev el;
#include<conio.h> FILE *pf;
#include<stdlib.h> unsigned int i, x, n;
#include<io.h> long int ofs;
FILE *pf;
int i, n, x[30], y[30], nr; int main()
double a, b; {
int main() clrscr();
{ pf = fopen("[Link]","w+");
clrscr(); printf("\ncate inregistrari introduceti n = ");
printf("\ndati nr. de elemente : "); scanf("%d", &nr); scanf("%d", &n);

No 356 No 357
if((f=fopen("[Link]","r"))==NULL)
for(i=0;i<n;i++) {
{ printf("\n nu se poate deschide fisierul [Link]");
printf("Numarul elevului : "); exit(1);
scanf("%d",&[Link]); }
printf("Numele elevului : "); do
scanf("%20s",&[Link]); {
printf("Prenumele elevului : "); ch=fgetc(f);
scanf("%20s",&[Link]); if(islower(ch)) p++;
printf("[Link] telefon : "); if(isupper(ch)) b++;
scanf("%7s",&[Link]); if(isdigit(ch)) d++;
fflush(stdin); if(!isprint(ch)) g++; // daca ch nu este afisabil
fwrite(&el,sizeof(elev),1,pf); }while(ch!=eof(f));
puts("\n"); fclose(f);
} printf("\n numarul de litere mici : %d", p);
// citire pozitie inregistare printf("\n numarul de litere mari : %d", b);
printf("\n ce inregistrare cautam ? "); printf("\n numarul de cifre : %d", d);
scanf("%u", &x); printf("\n numarul de caractere neafisabile : %d", g);
getch();
// deplasare }
ofs=(x-1)*sizeof(elev);
fseek(pf,ofs,0); // 0 = SEEK_SET - inceputul fisierului

fread(&el, sizeof(elev), 1, pf);


printf("\n\n intregistrarea este : \n %d %s %s %s", [Link],
[Link], [Link], [Link]);
fclose(pf);
getch();
}

Problema 4:

#include <stdio.h>
#include <conio.h>
#include <ctype.h>
int main()
{
FILE *f;
int p, b, d, g;
char ch;
clrscr();
p=b=d=g=0;

No 358 No 359
6.3. Probleme propuse spre rezolvare , punct,
-o
-
-).
1.

7.

astfel modificat.
2. :

8. Dintr- de caractere,
NUME, PRENUME, MEDIA1, MEDIA2, MEDIA3

(identificat printr-
caractere din care este compus).
3.

9. feritoare la un grup

4.
scrie un program care
magnetic, -
numere sunt prime, Numerele sunt
-

5. - :
A
AA
de nume.
AAA
........
10.
notate a, b, c, d

6. -
(a - b) U (c - d)

No 360 No 361
(a - b) - (c - d)

11.

17. Pentru f
tip real.

12. f
produsele firmei
g
13. f x
h f
pen y

14. 18.

ei
15. tregi. valoare manoper

n.

16. Se consid
enume student, media 19.

udentului cu media cea mai mare


20.
r-

No 362 No 363
22.

va denumirea
-se apoi

-se
actualizarea stocului pentru fiecare pr
la fiecare ap
a 23.

fiecare produs codul


oduselor cel mai des solicitate

21. 24. toate


f1 cu articole a1 = (a,b,c,d); m n, unde m n se
f2 cu articole a2 = (e,f,g,h,i);
f3 cu articole a3 = (j,k),
25.
f4 cu articole a4 = (t1,t2,t3,t4)
a unui ca
f5 cu articole a5 = (u1,u2,u3,u4,u5), - s
unde: stop
t1 = max (a,b,c,d); s), se
t2 = min (e,f,g,h,i);
t3 = max (j,k);
t4 = max (a,b,c,d,e,f,g,h,i,j,k); 26.
u1= min (a,b,c,d);
u2= max (e,f,g,h,i);
u3= min (j,k); Exemplu:
u4= min (a,b,c,d.e,f,g,h,i,j,k); este:
u5= min (u1,u2,u3,u4). 12 4 67 43 878
2 7 8 5 3 2 89 123

No 364 No 365
9 32.
utul celui de-

27. 33. pentru

elementele unei perechi separate printr-

34. 9 i

28. numere sau egale cu n,


verifice

Exemplu: :
triunghiului folosind formul 0 1 4 9 16 25 36 49 64

35.
(
29. linie un caracter A
var pe linia a t lin ie a
-a
30. :
de coloane ale matricii Exemplu: :
duri, elementele unei linii a A
matrici, AA
-se matricea AAA
AAAA

36.
31. mici mult 2
BAC.
Numerele singur car
Exemplu:

No 366 No 367
Exemplu: , 40.
c
natural
37. k
fo - ori.
prin s - "NU", In caz contrar.
numere n rele de pe a doua linie sunt valori Exemplu: d
intervalul [- EXAMEN DE BACALAUREAT LA INFORMATICA

litere pe prima lini


ecran mesajul "Da", 41.
pe a doua linie, sau mesajul "Nu" n caz contrar.
i
38. Toate distincte l
va scrie un -
Nu se cuno
elementele di Exemplu:
se vor scrie ele [Link] e bine bine, e foarte bine
Nu se va folosi nici un algoritm de e extraordinar de bine
sortare. [Link] e 3
bine 4
39. foarte 1
numere de telefon sunt formate din de extraordinar 1
de 1

ordinii numerelor naturale. Datele de intrare se ci 42. Se numere


numitorul

No 368 No 369
6.4.

Exemplu :
6.4.1. -un

12 18
a) Modificarea unor va
50 20
structuri de date
: 1 3
b) Testare
2 3
c)
5 2
d) Deschiderea pentru citire
7 2
e)

6.4.2.
y, ale

a) fprintf(f,"%d\n%d", x, y);
b) fprintf("%d\n%d", x, y, f);
c) fprintf(f,"\n%d%d\n", x, y);
d) fprintf ("\n%d%d\n", x, y, f);
e) fprintf("\n%d%d\n", x, y, *f);

6.4.3. f cu ur

50 2
1.4 3
8

No 370 No 371
#include <stdio.h>
int main()
{
FILE *f; ?
4 6 3 2 6 15 1
int a, b;
float x, y;
f=fopen("[Link]","r"); a) nici unul b) unul c) d) trei e) patru
fscanf(f,"%d %f\n", &a, &x);
fscanf(f,"%f\n", &y);
fscanf(f,"%d", &b); 6.4.5.
printf("\na=%d x=%f y=%f b=%d", a, x, y, b);
fclose(f);
} #include <stdio.h>
int main ()
{
a) a=50 x=2.000000 y=1.400000 b=8
int v[9]={0,l,0,0,2,3,0,4,5},i;
b) a=50 x=2.000000 y=1.400000 b=3 FILE *f;
f=fopen("[Link]","w");
c) a=50.000000 x=2.000000 y=1.4 b=3.000000
i=0;
d) a=50.000000 x=2.000000 y=1.4 b=8.000000 while (i<9)
{
e)
while (v[i])
{

i++;
6.4.4. }
fprintf (f,"%3d", 99) ;
# include <stdio.h> i++;
int main() }
{ f close (f) ;
FILE *f, *g; }
int a, x, S;
f = fopen ("[Link]", "r");
g = fopen ("[Link]", "w"); a) 4 b) 5 c) 8 d) 9 e)10
scanf ("%d", &a);
while (!feof(f))
{ 6.4.6. pe hard-
S=0;
while ( S < a && !feof(f))
{ AbCdEfGhI
fscanf (f ,"%d", &x); j
S+=x;
}
fprintf (g,"%d ",S); 66, etc.), iar literele mici au coduri
}
fclose (f);
fclose (g);
printf ("\nS=%d", S);
}

No 372 No 373
#include <stdio.h>
int main () 6.4.8.
{
char c1,c2;
FILE *f,*g;
a) bdfhj f=fopen("[Link]","r");
g=fopen("[Link]","w"); #include <stdio.h>
b) BDFHJ c1=96; int main()
c) acegi while (!feof(f)) {
{ FILE *f , *g;
d) ACEGI c2=fgetc(f); char s [101];
printf("%c",c2); f=fopen("[Link]","a");
e) abcdefghij
if (c2>cl) fputc(c2-32,g); g=fopen("2. txt", "r");
c1=c2; while (!feof(g))
} {
fclose(f); fgets(s,100,g);
fclose(g); fputs (s, f);
} }
fclose (f);
fclose (g);
6.4.7. }

a) nl
1 3 0 0 2 -3 0 -4 -1 b)

#include <stdio.h> c)
#include <math.h> d)
int main ()
a) 1 { e) Nici unul dintre cazurile anterioare
b) 72 FILE *f;
int s=1, i=0, a[20];
c) -12 f=fopen ( "numere . txt" , "r");
d) Pro while ( ! feof (f) ) 6.4.9.
{
i++;
e) Nu se pot citi corect fscanf(f,"%d ", &a[i]);
if (a[i]) s*=abs(a[i]); 33
} 123
printf ("\n%d", s); 456
fclose (f ); 789
}

No 374 No 375
#include <stdio.h> a) fseek(f ,11,0) ;
int main ()
{ b) fseek(f ,-2,2) ;
FILE *f; c) f seek (f, 3,1) ;
int i, j ,m,n,S=0,a[20] [20] ;
d) fseek(f,2,1) ;
fscanf(f,"%d %d", &m, &n); e) fseek(f,-3,2);
for (i=0; i<m; i++)
{
for(j=0; j<n; j++) 6.4.11.
{
fscanf (f,"%d ",&a[i][j]);
if ((i+j)%2) S+=a[i][j];
} #include <stdio.h>
} #include <string.h>
fclose (f) ; int main()
printf ("%d",S) ; {
} FILE *f;
int i = 0, j, k;
char *aux;
a) 0 char *a[9]={"Marius", "Claudiu" , "3rei-Sud-Est",
"Daniel" , "Vasile" , "Dan" , "Sinacdu" , "2Pac"} ;
b) 8 while (a[i]) i++;
c) 20 for (k=j +1; k<i; k++)
if ( strcmp(a[j],a[k]) > 0 )
d) 25 {
e) programul este eronat aux=a[j]; a[j]=a[k]; a[k]=aux;
}
k = 0;
6.4.10. f = fopen("propus . txt","w");
while (a[k])
fprintf (f,"%s\n", a[k++]);
33 1 -45 18 6
fclose(f);
}
..................

#include <stdio.h> a) 2Pac b) Claudiu c) Dan d) Daniel e) Marius


int main ()
{
FILE *f;
int x,y;
f=fopen("[Link]","r"); 6.4.12.
fseek(f,-6,2);
fscanf(f,"%d",&y);
..................
fscanf(f,"%d",&x); 11 2 13 4 15 6 17 8 19
printf("\n%d%d" ,x,y);
fclose(f) ;
}

No 376 No 377
#include <stdio.h>
#include <math.h>
int main()
{ CAPITOLUL
FILE *f,*g;
int v[10];
f=fopen("[Link]", "r");
g=fopen("[Link]","w");
fread(v,8,1,f);
fwrite(v,6,1,g);
fclose(f);
fclose(g);
}

a) 11 2 13 4 15 6 b) 1 2 1 4 1 6
c) 11 2 13 d) 11 2 1
e)

iblioteca
standard a sistemului;
Unul propriu limbajului C++, orientat pe obiecte.

6.5. R spunsuri
Sistemul de I/O orientat pe obiecte al limbajului C++ trate

6.5.1. b)
6.5.2. a)
6.5.3. b)
6.5.4. e) e I/O;
6.5.5. e) conceptul de stream (stream-
6.5.6. b) orice flux
6.5.7. b) ie re), la un consumator. Sursa poate fi tastatura (intrarea standard), un
6.5.8. c)
6.5.9. c) .1).
6.5.10. a), b) si e)
6.5.11. d)
6.5.12. d)

No 378 No 379
Fluxuri din clasa Fluxuri din clasa
istream ostream ios streambuf
Memoria intern

istream ostream strstreambas fstreambase


Fluxuri din Fluxuri din
clasa clasa
ifstream ofstream iostream

ifstream ofstream

fstream filebuf
Figura 7.1. Stream-ul - baza sistemului de I/O

Figura 7.2. Ierarhia claselor de intrare/

stream-urilor sunt:
azul includerea
headerului iostream.h.
Clasa ios

al parametrilor efectivi; ios:


I/O nu numai cu date de tipuri Clasa istream class istream:virtual public ios
Clasa ostream class ostream: virtual public ios
Clasa iostream

7.2.): buffer. Clas


ios care of

Clasa streambuf class iostream:public istream, public ostream


format.
Clasele istream, ostream iostream sunt, fiecare, clase de ba
pentru clasele derivate:

class istream_withassign:public istream


class ostream_withassign:public ostream
class iostream_withassign:public iostream

No 380 No 381
Clasele cu sufixul _withassign fluxurile
predefinite
a
1. cout
date de x
intrare
sir

Exemplu: int n; cout<<n;


buffer cin
Converte imal valoarea lui n
buffer cout

2. cin
Figura 7.3. Rolul buffere-

Exemplu: int n; cin>>n;


Extr

3. cerr: stderr cin>>a;

4. clog: - -o
intermediar).

Clasa streambuf ios cin>>a>>x;


17.45e5 exemplu
eriva clasa filebuf . re
-lor
flux de date)

Exemplu
primul blank), se transfer
int main()
{
int a; double x; char sir[20];

cout<<a<<' '<<x<<endl;
cout<<sir<<endl; 1. Stream-
} 2.

No 382 No 383
3. 7.1. ui flux
zon

Clasa ios
4.
-uri.
Starea unui stream (rezultatul ultimului
sistemul de operare.
, care este

te erorilor
-

class ios{

protected:
int state; // ile indicatorilor de stare
public:
enum io_state{
goodbit=0x00, //
eofbit=0x01, // s- -
intrare (lipsa caracterelor disponibile pentru citire)
failbit=0x02, //
-
I/O p
badbit=0x04, //
-ului este posibil ca stream-
utilizat
hardbit=0x08
};
};

No 384 No 385
Exemplu:
cu ajutorul metodelor: if (!cin) //echivalent cu if (![Link]())
int good(); // stare!\n";
este 0 else cin>>a;
int eof(); //
int fail(); // Operatorul void* - -un pointer generic. Conversia
:
int bad(); // Fun operator void *();
failbit. Exemplu: cin>>s;
stream-
asociat unui stream se if (cin>>s). . .
metodelor: Pentru scoaterea unui stream din starea de eroare, fie dispare cauza
void clear(int i=0);
S e
-ului hardfail.
Exemplu: [Link](ios::badbit);

da
rdstate.
Exemplu: [Link]([Link]()|val_f);
-le nemodificate pe celelalte; val_f are una
din valorile definite de enumerarea io_state.
int rdstate();
oarea
datei membru state).
Exemplu: [Link](ios::badbit | [Link]()); 7.2. Format

Unul dintre principalele avantaje oferite de sistemul de I/O din


operatorilor ! void* :
limbajul C++ -se o
Operatorul ! rcat printr-
cifice
int operator ! ();
-

metoda fail).

No 386 No 387
este
adjustfield, basefield, floatfield) un
singur bit poate fi activ.

floatfie basefield adjustfield


class ios { ld

protected:
long flag_x; //
int x_width;
unei valori pe ecran
skipws

left

intern

hex
oct
dec
right

showpoint

upperca
showbase

unitbuf
fixed
showpos

scientifi
public:
enum
{skipws = 0x0001,
left = 0x0002,
right = 0x0004, // aliniere la dreapta la iesire
internal = 0x0008, 1. Cu ajutorul manipulatorilor
bazei la ie
2. Cu ajutorul unor ale claselor istream sau ostream.
dec = 0x0010,
oct = 0x0020,
hex = 0x0040,
showbase = 0x0080, 7.2.1. Formatarea prin manipulatori
showpoint = 0x0100, umere reale

Manipulatorii sunt
uppercase = 0x0200, -
-
showpos = 0x0400,

scientific = 0x0800, ntru


numerele reale ,
fixed = 0x1000,
reale
unitbuf = 0x2000, Manipulatorii pot fi:
stdio=0x4000 // gole "
};
Manipulatori cu parametri
};

No 388 No 389
7.2 [Link]. Manipulatori cu parametri

l 7.2.) este:

ostream & nume_manipulator(ostream &);


istream & manipulator (argument);
istream & nume_manipulator(istream &);
ostream & manipulator (argument);

.1.) se folosesc astfel: Tabelul 7.2.


Manipulator Intrare/
Ie
flux_intrare>>manipulator; setbase(int baza) I/O
resetiosflags(long f) I/O

Tabelul 7.1
Manipul Intrare/ setiosflags (long f) I/O
ator Ie
dec I/O

hex I/O setfill (int c) I/O


implici -ul)

oct I/O setprecision (int p) I/O


reale

ws I setw (int w) I/O

endl O aracter '\n'


ends O \0) Utilizarea manipulatorilor impune includerea header-ului iomanip.h.

flush O -

No 390 No 391
Exemplificarea modului de folosire a manipulatorilor pentru 7.2.2. Formatarea prin metode

Formatarea metode
ale clasei ios.
#include <iostream.h> setf
#include <iomanip.h>
int main()
{ long setf (long);
int a,b,c;double alfa,x,y;long ll;char xx,yy;
float u,v; unsigned int w; unsigned char ab,db;
a=125,b=10;ll=100*a*b;
cout<<"100*a*b="<<ll<<endl; //100*a*b=-6072
alfa=75.50;y=1.345678; -urile care nu fac parte dintr-
xx=35;yy=6; x=y/alfa-xx/yy;
cout<<"x="<<x<<endl; //x=-4.982176
Exemplu: cout. setf (ios:: showpos); //
cout<<"x="<<setw(8)<<x<<endl; //x=-4.982176 long setf (long flags, long field);
cout<<"x="<<setw(20)<<x<<endl; //x= -4.982176

cout<<"x="<<setw(20)<<setfill('*')<<x<<endl;
//x=***********-4.982176
// precizie
cout<<"x="<<setw(8)<<setprecision(2)<<x<<endl; Exemple:
//x=***-4.98
cout<<"x="<<setw(8)<<setprecision(0)<<x<<endl; cout. setf (ios:: showpos | ios :: uppercase | ios:: internal) // r fi
//x=-4.982176
// afisarea octetului semnificativ var & 0377 si a celui mai
putin semnificativ (var>>8) & 0377
w=34; ab='34' & 0377; db=('34'>>8)&0377; basefield
cout<<"w="<<w<<" ab="<<ab<<" db="<<db<<endl;
u=2579.75; v=12345.567E+10; cout. setf (ios :: skipws | ios :: hex | ios:: showbase, ios :: basefield)
//formatare in octal si hexa fill permite testarea sau modificarea caracterului de
cout<<"a in baza 10="<<a<<" in octal="<<oct<<a<<"
in hexa="<<hex<<a<<endl; u
//a in baza 10=125 in octal=175 in hexa=7d int fill ( );
cout<<"b="<<dec<<b<<endl; //b=10
} Exemplu: [Link] ( );
int fill (char);

caracter de umplere.
Exemplu:
precision permite testarea sau modificarea preciziei.

No 392 No 393
int precision ( ); width care

int precision (int);

7.3. Metodele clasei istream


preciziei.
width
Clasa istream din clasa ios: ios:istream.
Supradefinirea
int width ( );
-ul (fluxul) de intrare este
.int width (int);
-o
Exemplu: cout. -un c
rolul de a extrage din fluxul de intrare
caractere.
valoare dintr-
-

-o (vezi capitolul 11), pentru a extrage din


-un tip definit de utilizator
caracterul de umplere.

#include <iostream.h> friend istream & operator >>(istream &, clasa &);
int main()
{ int i=123, j=456;
double x=1234.567890123456, y=5678; Metoda get
[Link](5); cout<<i<<' '<<j<<endl; //123 456
cout<<i; //toate metodele sunt persistente, cu istream & get (char &);
M
[Link](5); cout<<j<<endl; //123 456
[Link](ios::showpos); //afis. +
cout<<i<<' '<<j<<endl; //+123 +456 Exemplu: char c; [Link](c);
[Link](ios::hex, ios::basefield);
[Link](20); [Link](15); [Link]('*');
[Link](ios::showpos | ios::showpoint); int get ( );
cout<<x<<' '<<y<<endl;
//***+1234.56789012346 +5678.00000000000 Extrage din fluxul de
cout<<i<<' '<<j<<endl; //7b 1c8
[Link](ios::dec, ios::basefield);
[Link](ios::showpos); [Link](' '); -1).
cout<<i<<' '<<j<<endl; //123 456
cout<<x<<' '<<y<<endl;
//1234.56789012346 5678.00000000000 \ ;
}

No 394 No 395
Metoda peck -l

de intrare). R citire.
int peck( );
Metoda getline Exemplu: c = [Link] ( );

caractere, terminat cu un caracter cunoscut. Metoda putback


argument.
istream & putback(char &);

ir. 1) int a; [Link] (a) cin >> a;


Exemplu: \ // sau ; Exemplu: [Link](a).get(b).get (c);
Din fluxul de date de int
linie, cel mult 50 de caractere. Extragerea caracterelor din fluxul de intrare se
- 7.4. Metodele clasei ostream
caractere egal cu lungime-1 .

Metoda gcount r
caractere preluat prin getline.
-o
int gcount();

-
Metoda read
u
-
istream & read (char *
Primul argument este implicit (this). Al doilea argument este o
Exemplu: char t[30]; [Link](t, 20);

cat printr-o , pentru a


Metoda ignore -ului de
-un tip definit de
intrare.
utilizator (clas ):
friend ostream & operator << (ostream &, clasa &);
delimitator, dar nu
Metoda put nsmis ca
lungime. Caracterele extrase
parametru.
sunt eliminate, nu sunt memorate.
ostream put (char);

No 396 No 397
Exemple: 7.5.
char c='S'; cout . put ( c ); // echivalent cu cout << c;
char c1='A',c2='B',c3='C';[Link](c1).put(c2).put(c3);
Manipul
// echivalent cu: [Link](c1);[Link](c2); [Link](c3);
// echivalent cu cout<<c1<<c2<<c3;

Metoda write
ametri
ostream &nume_manipulator (ostream &);
ostream & write (char * tablou, int lungime);
istream &nume_manipulator (istream &); //pentru un flux de intrare
Exemplu: char t[ \n"; [Link](t, 4);
4 caractere,
Crearea manipulatorilor cu parametri

ostream & nume_manipulator (ostream &, int);

#include <iostream.h> omanip <int> nume_manipulator (int n) // (template) cu


#include <iomanip.h> parametru de tip int
int main()
{ {return omanip <int> (nume_manipulator, n);}
\n";
cout<<setw(5)<<resetiosflags(ios::internal |ios::right);
cout<<setiosflags(ios::left)<<setfill('#')<<i<<endl;
cout<<setw(5)<<setiosflags(ios::showpos)<<setfill(' ator.
')<<i<<endl;
cout<<setw(5)<<resetiosflags(ios::left)<<setfill('0')<<set
iosflags(ios::right);
cout<<i<<endl;
cout<<"\n hexagesimal:"<<setw(5)<<hex<<i<<endl;
cout<<"\n octal:"<<setw(5)<<oct<<i<<endl; Exemplu:
cout<<"\n zecimal:"<<setw(5)<<dec<<i<<endl;
cout<<mesaj; [Link](car); -
double d=123.456789012345678901234567890123456789;

cout<<"Afisare d cu lung 25 si precizie $).


15:"<<setw(25)<<setprecision(15)<<d<<endl;
cout<<"Schimbare caracter umplere
&:"<<setw(25)<<setfill('&')<<d<<endl;
cout<<endl;
}

No 398 No 399
fstreambase
#include <iostream.h>
#include <iomanip.h>
ostream &convhex (ostream &ies)
{
Pentru a asocia un flux de intrare
[Link](ios::hex,
ios::basefield); unui obiect de tipul ifstream. Clasa ifstream este din clasele istream
[Link](ios::showbase);
-un flux de
return ies;
} fstreambase privitoare la asocierea
ostream &indentare (ost
{
for (int i=0; i<nr_spatii; i++)
ies<<' ';
Pentru crearea unor obiecte din clasele ifstream sau ofstream se
return ies;
} impune includerea headere-lor iostream.h fstream.h.
ostream &init (ostream &ies)
{
[Link](10); Constructorii clasei ofstream sunt:
[Link](4);
[Link]('$'); ofstream();
return ies;
}
ofstream(const char *nume_fisier, int mod_acces=ios:out);
{ Parametrii
return omanip <int> (
}
int main() ofstream (int fd, char *buffer, int lung_buffer);
{
cout<<712<<' '<<convhex<<712<<endl;
cout<<indentare(10)<<"Linia1
text\n"<<indentare(5)<<"Linia2 text\n";
cout init<<123.123456;
} Constructorii clasei ifstream sunt:
ifstream();

7.6. ifstream(const char *nume_fisier, int mod_acces=ios:in);


Parametrii constructorului s

ifstream (int fd, char *buffer, int lung_buffer);

Pentru a asocia un crearea


).
unui obiect de tipul ofstream. Clasa ofstream este din clasele
ostream -un flux

No 400 No 401
Exemplu: ios::app mod append (de scriere la sf
ios::trunc
ios::nocreate
- ios::binary
le" clasei ostream. ios::noreplace
ofstream fis_ies("[Link]", ios::out); //sau: ofstream fis_ies("[Link]");
fis_ies<< . . . << . . .; Modul de deschidere este definit printr-

fis_ies.write(. . . );
Pentru examin if (fis_ies) . . .; class ios{

public:
enum open_mode{
rintr- in=0x01, out=0x02, ate=0x04,
app=0x08, trunc=0x10, nocreate=0x20,
ifstream fis_intr("[Link]", ios::in); //sau: ifstream fis_intr("[Link]"); noreplace=0x40, binary=0x80
fis_intr>> . . . >> . . .; };
rul asociat: fis_intr.read(. . . ); };
if (fis_intr) . . .;
Exemple: ifstream f1("[Link]", ios::in|ios::nocreate);
fstream f2("[Link]", ios::in|ios::out);

Fie decl Metoda open


acestuia, care se poate realiza:
Clasa fstream

rotec=filebuf::openprot); open);

Metoda open este definit fstreambase


ios::in
ios::out
ios::ate
acestuia

No 402 No 403
Metoda close
void close(); -
fstream fis_ies; fis_ies.open("[Link]", ios::out); fis_ies.close();
fstream fis_in; fis_in.open("[Link]", ios::in); fis_in.close();
Exemplu:
i, o serie de

desti
ir,

#include <iostream.h>
#include <fstream.h> #include <process.h>
#include <iomanip.h> #include <fstream.h>
int main() void semn_er(char *c)
{ { cerr<<"\n\n Eroare la deschiderea fisierului "<<c<<endl;
ofstream fis_ies("[Link]"); exit(1); }
[Link] void copiere(ofstream &dest, ifstream &sursa)
if (!fis_ies){ { char C;
\n"; while (dest && [Link](C))
return 1; } [Link](C);
fis_ies<<"Scrierea unui text \ \n"; }
fis_ies<<100<<hex<<setw(10)<<100<<setw(20)<<setpre int main()
cision(12); {
cout<<123.456789012356789<<endl; char nume_sursa1[14], nume_sursa2[14], destinatie[14];
fis_ies.close(); ifstream f1, f2;
ifstream fis_intr("[Link]"); //deschiderea fis. ptr. citire ofstream dest;
if (!fis_intr) cout<<"Numele celor 3 fisiere:"<<"Destinatie Sursa1
{ Sursa2\n";
cout<<"Eroare la deschiderea fis. ptr. [Link](destinatie,13);
citire!\n"; [Link](nume_sursa1,13);
return 1; } [Link](nume_sursa2,13);
char sir[100]; destinatie[13]=nume_sursa1[13]=nume_sursa2[13]='\0';
for (int k=0; k<9; k++) [Link](nume_sursa1, ios::nocreate);
if (!f1) semn_er(nume_sursa1); //utiliz operator ! redefinit
{ fis_intr>>sir; cout<<sir<<'\n'; }
cout<<endl; [Link](nume_sursa2, ios::nocreate);
int i, j; if (!f2) semn_er(nume_sursa2); //utiliz operator ! redefinit
double u; [Link](destinatie);
if (!dest) semn_er(destinatie); //utiliz operator ! redefinit
fis_intr>>i>>hex>>j>>u;
cout<<i<<' '<<j<<' '<<u<<endl; copiere (dest, f1);
fis_intr.close(); copiere(dest, f2);
return 0; [Link]();
} [Link]();
[Link]();
}

No 404 No 405
7.7.
xt.

#include <fstream.h>
#include <iostream.h>
int main()
{
ofstream fisierout("[Link]"); // Deschide fisierul text
[Link].
fisierout << " Teste fisiere "; //Scrie un text in fisier
[Link](); // Inchide fisierul terminatorul '\ \0'). Deoarece nu exist
// Deschide un alt fisier text si scrie in acesta niste numere
(numerele sunt separate prin spatii) un
[Link]("[Link]");
fisierout <<15<<" "<<42<<" "<<1;
[Link]();
// Deschide fisierul [Link] pentru citire. Metoda write
ifstream fisierin;
[Link]("[Link]"); ostream &write(const char * tab, int n);
char p[50]; // Stabileste o zona de memorie folosita pentru Metoda read
citirea textului.
fisierin >>p; // Citeste si afiseaza primele doua cuvinte din istream &read (const char * tab, int n);
fisier.
cout <<p<<" ";
fisierin >>p; -
cout <<p<<endl;
[Link](); // Inchide fisierul.
int numar;
[Link]("numere.c");
// Deschide fisierul text numere.c pentru citirea numerelor intregi
// Citeste numere din fisier pana cand ajunge la sfarsitul fisierului.
while (![Link]())
{
fisierin >> numar; // Citeste un numar intreg.
if (![Link]()) cout<<numar<<endl;
Clasele ifstream ofstream au ca metode f seekg
// Daca nu a ajuns la sfarsitul fisierului afiseaza numarul.
} clasei istream), respectiv seekp
[Link](); // Inchide fisierul.
// se citeste textul din fisierul [Link] cuvant cu cuvant. modificarea valorii pointerului.
[Link]("[Link]"); istream & seekg(long);
while (![Link]())
// Citeste cuvinte din fisier pana ajunge la sfarsitul fisierului. istream & seekg(long, seek_dir);
{ // Citeste cuvant cu cuvant. ostream & seekp(long);
fisierin >>p;
cout <<p<<endl; ostream & seekp(long, seek_dir);
}
}

No 406 No 407
Ambele metode primesc doi parametri:
#include <fstream.h>
#include <iomanip.h>
class student
{
char nume[20];
int grupa, note[3];
public:
void citire_date();
class ios{ friend ostream &operator<<(ostream &, const student &);
friend class fisier_stud;
//. . .
};
public:
class fisier_stud:public fstream
enum seek_dir{ student
beg=0, {
public:
cur=1, fisier_stud(){;};
end=2 fisier_stud(const char*num_f,int mod,int
};
}; void open(const char *num_f, int mod, int
protectie=filebuf::openprot)
{
fstream::open(num_f,mod|ios::binary,protectie);}
Pentru aflarea valorii pointerului, clasa ifstream are metoda tellg, iar //apelul met. open din cls. fstream
clasa ofstream are metoda tellp, cu prototipurile: int citeste_f(student &);
int scrie_f (const student &);
long istream::tellg(); };
long ostream::tellp();
void student::citire_date()
{
Exemplu: int gr, OK;
for (int k=0; k<21; k++) nume[k]=0;
implemen [Link](1000, '\n');
se real Datorit cout<<"Numele studentului:";
[Link](nume, 21);
[Link](1000, '\n');
do{
cout<<"Grupa:";
cin>>gr;
class fstream OK=(cin && gr>0 && gr<8000);
if (!OK)
clase prietene {
\n";
class student class fisier_stud
[Link]();
}
Figura 7.5. Ierarhia de clase else { grupa=gr; [Link](1000, '\n'); }
}while (!OK);

No 408 No 409
do{
for (int k=0; k<3; k++){
int n;
rasp=toupper([Link]());[Link](1000, '\n');
do{
cout<<"nota "<<k+1<<":"; CAPITOLUL
{ cin>>n; OK=cin && n>0 && n<=10; }
do{ if (!OK){
\n";
[Link](); \n');
[Link](1000, '\n');
} gata=1;
} }while (!OK);
[Link]();note[k]=n;[Link](1000, '\n');
//citire }
}
[Link](Nume_Fis, ios::in);
ostream
if (!fs){ &operator << (ostream &ies, const student &stud)
{ -lui "<<Nume_Fis<<"
ies<<"Student:"<<[Link]<<"
ptr. citire\n"; return 1; }
Grupa:"<<[Link]<<" Note:"; n acest capitol su
for (int k=0; k<3; k++) \n"; int k=0;
while (![Link]()) ies<<[Link][k]<<' ';
{ ies<<endl;
return
if (!fs &&ies;![Link]()){ cout<<"Eroare la citire\n";
}return 1; }
if (![Link]()) { cout<<s<<endl; cout<<"Poz în
typedef union {student s; char sbin[sizeof(student)];} stud;
cout<<endl;k++; }
}int fisier_stud::scrie_f(const student &s) Nume
{cout<<"S-au citit din \n";
[Link]();stud s1; s1.s=s; write([Link], sizeof(student)); calloc, malloc, realloc -
return bad();
free -
}
[Link](Nume_Fis, ios::in | ios::out); //deschidere fisier
actualizare (intr/ies)
int fisier_stud::citeste_f(student &s)
if (!fs){
{ stud s1; read([Link],
cout<<"Eroare sizeof(student));
la deschidere fis. "<<Nume_Fis<<"s=s1.s; ptr.
return bad();
citire/ scriere\n"; return 1;}
} void *calloc(unsigned nel, unsigned size);
int main() -lui pentru void *malloc(unsigned size);
{
datele:"; char Nume_Fis[]="Stud_bin.bin";
cin>>k; void *realloc(void *ptr, unsigned size);
[Link](1000, s; fisier_stud fs; int gata;
student '\n');
void free(void *ptr);
[Link](k*sizeof(stud)); s.citire_date(); fs.scrie_f(s); [Link](0);
k=0; [Link] (Nume_Fis, ios::out);
if (!fs){
while(![Link]()){ Descriere
fs.citire_f(s);
"<<Nume_Fis<<"
if (!fs && ptr. scriere\n";
![Link]()){cout<<"Eroare la citirea din calloc
return 1;} return 1; }
if (![Link]()){
cout<<s<<endl;
gata=0; c k++;}
} while(!gata)
{char rasp; malloc
cout<<"S- \n";
[Link]();cout<<"Datele
return 0; studentului:\n";s.citire_date();
} cout<<"Date introduse:"<<s<<endl;

No 410 No 411
free

amului void qsort(void *base, unsigned nel, unsigned size, int


este imprevizibil. (*comp) (const void *, const void *));
realloc
void *bsearch(const void *key, const void *base,
unsigned nel, unsigned size, int (*comp)(const void *,
const void *));

Descriere
qsort
precedent malloc, calloc sau realloc.
Elementele tabloului su
Valori returnate
Pentru calloc malloc argumente car
t, egal cu, sau mai mare dec t
t, egal cu,
free respectiv mai mare dec elemente comparate sunt
Fu realloc
bsearch -un tablou de nel elemente, fiecare de

realloc
- nu este nici eliberat nici mutat. C

Nume
qsort -
bsearch - -un tablou sortat
coincide cu obiectul indicat de key, sau NUL

No 412 No 413
8.3. Func ii de clasificare iscntrl

Nume
isdigit
isalnum, isalpha, isascii, iscntrl, isdigit,
isgraph, islower, isprint, ispunct, isspace,
isupper, isxdigit - rutine de clasificare
isgraph
tolower -
ui.
toupper -

islower

#include <ctype.h>
int isalnum(int c); int islower(int c); isprint
int isalpha(int c); int isprint(int c);
int isascii(int c); int ispunct(int c);
int iscntrl(int c); int isspace(int c);
int isdigit(int c); int isupper(int c); ispunct
int isgraph(int c); int isxdigit(int c);
-alfanumeric.
int tolower(int c); int toupper(int c);

isspace
Descriere

unsigned cha
isupper
mai sus.

isalnum
isxdigit

isdigit(c)).
a b c d e f A B C D E F.

isalpha
tolower

islower(c)).

isascii

No 414 No 415
toupper Nume
memcmp -

int memcmp(const void *s1, const void *s2, unsigned n);

Descriere

s2.

Valoare

Nume
memset -
Declar
#include <string.h>

Nume void *memset(void *s, int c, unsigned n);


memcpy -
Descriere

s cu constanta c pe un octet.
void *memcpy(void *dest, const void *src, unsigned n);
void *memmove(void *dest, const void *src, unsigned n);

Descriere
Nume
memchr -

void *memchr(const void *s, int c, unsigned n);

No 416 No 417
Descriere
char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, unsigned n);
Descriere

imi copia.
memorie.

8 lungimea lu
valoarea null.

#include <string.h>
Nume
strdup -
Nume
strlen -

char *strdup(const char *s);

unsigned strlen(const char *s);


Descriere

Descriere

terminator null.

Nume
Nume
strcpy, strncpy -
strcat, strncat -

No 418 No 419
char *strcat(char *dest, const char *src); char *strchr(const char *s, int c);
char *strncat(char *dest, const char *src, unsigned n); char *strrchr(const char *s, int c);

Descriere Descriere

null
c

i primele n

Nume
Nume strstr -
strcmp -

char *strstr(const char *sir, const char *subs);


int strcmp(const char *s1, const char *s2);
Descriere
Descriere

s2.
Nume
Nume strspn, strcspn - -
strchr, strrchr -

unsigned strspn(const char *s, const char *acc);

No 420 No 421
unsigned strcspn(const char *s, const char *rej); Fu
-aleatoare care vor fi returnate de rand.
Descriere

n acc.
#include <time.h>
srand(time(NULL));

Valori returnate

Numerical Recipes in C: The Art of Scientific Computing -


William H Press, Brian P Flannery, Saul A Teukolsky, William T Vetterling /
New York: Cambridge University Press, 1990 (1st ed, p 207), se face

j=1+(int)(10.0*rand()/(RAND_MAX+1.0));

Nume
j=1+(int)(1000000.0*rand())%10;
rand, srand - generarea numerelor pseudo-aleatoare

int rand(void);
void srand(unsigned int seed);
int abs(int i);
long labs(long i);
Descriere
int atoi(char *s);
-
long atol(char *s);
double atof(char *s); precizie

sistemului de calcul).
2) F

No 422 No 423
double fabs(double x); 8.7. Programe demonstrative
double floor(double x);
double ceil(double x);
double sqrt(double x);
lul [0, M
double sin(double x); sin(x)
double cos(double x); cos(x)
double tan(double x); tg(x)
double asin(double x); arcsin(x)
double acos(double x); arccos(x)
double atan(double x); arctg(x) [- /2, /2]
#include <stdlib.h>
double atan2(double y, double x); arctg(y/x) , ] #include <stdio.h>
double exp(double x); ex #include <time.h>
int cmp(const void *A, const void *B)
double log(double x); ln(x) {
double pow(double x, double y); xy return *(int *)A-*(int *)B;
}
double sinh(double x); sinh(x) int main(int ac, int **av)
double cosh(double x); cosh(x) {
int *X,*p,M,n,k,i,v;
double tanh(double x); tgh(x) if (ac!=4) {
double ldexp(double x, int e); x 2e fputs("Trei argumente!\n",stderr);
return 1;
double fmod(double x, double y); x modulo y }
n=atoi(av[1]);
k=atoi(av[2]);
f x a y f a M=atoi(av[3]);
x/y) |f | < y; f are semnul lui x. X=(int *)malloc(n*sizeof(int));
if (!X) return 1;
srand(time(NULL));
for (i=0; i<n; i++)
X[i]=rand()%M;
argument de tip pointer la int respectiv double. qsort(X,n,sizeof(int),cmp);
for (i=0; i<k; i++)
double frexp(double x, int *e);
{
x v=rand()%M;
p=(int *)bsearch(&v,X,n,sizeof(int), cmp);
f e x este 0 atunci f e 0.
if (p)
f. printf("Val: %d Pos: %d\n",v,p-X);
}
double modf(double x, double *n);
free(X);
x return 0;
}
f n. Valorile f n x. Valoarea
f.

No 424 No 425
int main(int ac, char **av)
{
int na,ne,i;
StEl *El;
FILE *fi;
e if (ac!=2) {
fputs("Un argument!\n",stderr);
return 1;
}
fi=fopen(av[1],"rt");
if (!fi) {
perror("Eroare la deschidere");
selectare a membrilor unei structuri cu ajutorul macrourilor. Macroul Fld return 1;
}
na=NA; ne=0;
tip void, El=(StEl *)malloc(na*sizeof(StEl));
while (fscanf(fi,"%s %d %d %d",
i un cast pentru a preciza tipul concret al acesteia. El[ne].nm,&El[ne].na,&El[ne].nb, &El[ne].nc)!=EOF)
{
if ((El[ne].na>=5) && (El[ne].nb>=5) &&
Deoarece te l (El[ne].nc>=5))
su ntru El[ne].ar='A';
else El[ne].ar='R';
El[ne].md=(El[ne].na+El[ne].nb+El[ne].nc)/3.0;
ne++;
if (ne==na)
{
na+=NA;
mare de elemente. Desigur, de fie
El=(StEl *)realloc(El,na*sizeof(StEl));
alocat. }
#include <stdlib.h>
}
#include <string.h>
fclose(fi);
#include <stdio.h>
qsort(El,ne,sizeof(StEl),comp);
#define NA 32
for (i=0; i<ne; i++)
typedef struct {
printf("%-12s c%6.2lf\n", El[i].nm,El[i].ar,El[i].md);
char nm[10], ar;
free(El);
float na, nb, nc, md;
return 0;
} StEl;
}
#define Fld(P,f) ((StEl *)P)->f
int comp(const void *A, const void *B) {
float w; int d;
if (d=Fld(A,ar)-Fld(B,ar)) return d; - i
if (Fld(A,ar)=='A') {
w=Fld(B,md)-Fld(A,md);
if (w>0) return 1;
if (w<0) return -1;
}
return strcmp(Fld(A,nm),Fld(B,nm)); }

No 426 No 427
cuvintele din
CAPITOLUL

fragmentarea memoriei. Teste recapitulative


#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int comp(const void *A, const void *B) n acest capitol sunt prezentate c ostintelor
{
return strcmp((char *)A,(char *)B); acumulate prin parcurgerea tuturor no iunilor i exemplelor din primele 8
} capitole.
int main(int ac, char **av)
{
char *C,s[11];
int n,l,i;
FILE *fi;
if (ac!=2)
{
fputs("Un argument!\n",stderr);
return 1;
}
fi=fopen(av[1],"rt");
if (!fi)
{
perror("Eroare la deschidere");
return 1;
}
fscanf(fi,"%d %s",n,s);
l=strlen(s);
C=(char *)malloc((l+1)*n);
Strcpy(C,s);
for (i=1; i<n; i++)
fscanf(fi,"%s",C+(l+1)*i);
fclose(fi);
qsort(C,n,l+1,comp);
for (i=0; i<n; i++)
printf("%s\n",C+(l+1)*i);
free(C);
return 0;
}

No 428 No 429
j=j/10

TESTUL NUM RUL 1

Scrie c;
a) Ce valoare va fi n=5 22, 235, 233, 6, 221?
1) b)
#include <iostream.h> 0.
int a[5], b[5], i; c)
void main() prezentat.
{ d) i dat.
for(i=0;i<5;i++)
if(i%2==0) a[i]=1; 3) Fie x
else a[i]=i+2; a)
for(i=0;i<5;i++) b[i]=a[i]*2;
for(i=0;i<5;i++) b)
modificat.
}
a) 1 6 1 10 1 b) 2 6 2 10 2
c) 2 2 6 2 2 d) 2 4 6 8 10

2)
; max=0
Pentru i=0,9 executa
nr[i]=0;

Pentru i=1, n executa


Citeste j

x=j%10;
nr[x]=nr[x]+1;
daca max<nr[x] atunci
max=nr[x]; c=x;

No 430 No 431
a) Ce valori vor fi afi ate pentru n=7 2,2, 34, 5, 6, 78, 8?
b)

TESTUL NUM RUL 2


c)
prezentat.
d)

1) Ce valori vor 3) Fie x :


#include <iostream.h> a) ;
int a[5], i; b)
void main()
{
for(i=0;i<5;i++) a[i]=(i+1)*10;
for(i=1;i<5;i++) a[i]-=a[i-1];

}
a) 10 20 30 40 40 b) 0 10 20 30 40
c) 10 10 10 10 10 d) 10 10 20 20 30

2)
; max=1;
Pentru i=1, n executa
[i]

Scrie a[1]
Pentru i=2, n executa
Daca a[i]<a[i-1] atunci
max=max+1

Scrie max

No 432 No 433
| |
| | y=[y/10]
|
TESTUL NUM RUL 3
| n=n*10+c
|

Scrie n
1) a)
i=0; numerele 12, 7, 354, 9, 1630, 0
while(i+j<=10) {i=i+1; j=j-2;} b)
Valoarea minim tru variabila j 752.
c) ului dat.
a) 1 b) 5 c) 6 d)
d) 17 e) 10 f) 2

2) 1
x (-2,2)? 5)
a) x*x-4<=0 b) 4-x*x>0 corespun
c) (2<x)&&(x<-2) d) (x-2)*(x+2)>0
Euclid.
3) Variabilele x y x 8, iar y 6) n
valoarea 6. Care dintre expresiile de mai jos are valoarea 0? rului dat.
a) 3*x-4*y= =0 b) (x+y)/2>x%y+1
c) !(x/2+2= =y) d) x-y+3!=0 Exemplu:
Pentru n=1235 30.
4)

n=0
c
| y=x; c=0
| c
| | dac y%10>c atunci
| | | c=y%10

No 434 No 435
| | p=p*10
| | altfel
| | k=k-1
TESTUL NUM RUL 4
|
| n=[n/10]

Scrie nr
1) a)
p=1; n valoarea 23456 k valoarea 3.
do { b)
p*=2; pentru n k
cout<<p; oarea 234.
} while(p%10!=6); c)
a) 2 4 8 6 b) 2486 d)
c) 2 4 8 16 d) 24816
final.
2) Variabila x
valoarea 1 x nu 5)
intervalului (2,9]?
a) (x>2)&&(x<=9) b) (x<=2)&&(x>9)
c) (x<=2)||(x>9) d) (x<2)||(x>9)
6) >100 r
3) 1 n.
variabilele x y Exemplu:
a) (x-y= =2)&&(y-x= =2) b) (x= =2)&&(y= =4) Pentru n=12345 se va 3.
c) x-y= =2 d) ((x-y= =2)||(y-x= =2)) && (x%2= =0)

4) Se c

nr=0; p=1;

| dac
| | nr=nr+[n/10]%10*p

No 436 No 437
2. Consideram urmatoarea secventa de program in care v este un vector
format din n numere intregi, iar n, i si aux sunt trei variabile de tip
intreg:
TESTUL NUM RUL 5
for(i=1;i<=n/2;i++)
{ aux=v[i];
v[i]=v[n/2+n%2+i];
v[n/2+n%2+i]=aux;
1. }
{num >1} Daca n=7 si v=(10, 20, 30, 40, 50, 60, 70) atunci dupa rularea
ok=0; secventei de mai sus vectorul v va avea urmatorul continut:
c >0 exe a) v=(40, 50, 60, 70, 10, 20, 30) b) v=(40, 50, 60, 10, 20, 30, 70)
| c=n%10; c) v=(50, 60, 70, 40, 10, 20, 30) d) v=(10, 20, 30, 70, 60, 50, 40)
| 1 atunci
| | ok=1 3. Se da o matrice patratica de ordinul n. Sa se formeze un vector cu n
| | altfel componente, in care componenta i a vectorului sa fie egala cu raportul
| | ok=0 dintre suma elementelor de pe linia i si suma elementelor de pe
| coloana i. Daca suma elementelor de pe coloana i este nula atunci
| componenta a i-a din vector va fi 0.
| | Exemplu: Daca matricea este
| | ok=1 5 0 6 1
| 2 -5 8 3
| n=[n/10] 2 0 4 0
-1 5 2 7
Se va obtine vectorul: 1.5, 0, 0.3, 1.1818
a) =9458
b) 3 cifre, care poate fi citi
9 7.
c)
d)

un alt tip.

No 438 No 439
Exemplu:
Daca matricea A este:
TESTUL NUM RUL 6
1 3 6 2 9
7 4 0 3 8
5 2 1 47 6
Si vectorul este: 5, 2, 1, 47, 6 atunci se va afisa valoarea 3.
1. Daca matricea A este:
{numere naturale} 1 3 6 2 9
c=0; d=0; p=1; 7 4 0 3 8
c >0 execut 5 2 1 47 6
| c=a%10+b%10+c; d=d+(c%10)*p; p=p*10; Si vectorul este: 2, 2, 1, 47, 6 atunci se va afisa valoarea matricea
| a=[a/10]; b=[b/10]; c=[c/10]; modificata:
1 3 6 2 9
Scrie d
7 4 0 3 8
a) Scrie =493
5 2 1 47 6
b=1836.
2 2 1 47 6
b)
c)

alt tip.
d) NU

2. Considerand urmatoarele instructiuni identificati doua echivalente:


a) for(i=0;i<n ;i++) if(i%2 !=0) s=s+a[i];
b) for(i=1; i<=n/2;i++) s=s+a[2*i-1];
c) for(i=n-1;i>1;i--) if(i%2 !=0) s=s+a[i-1] ;
d) for(i=2; i<=(n+1)/2 ;i++) s=s+a[i*2-3];
3. Fie a o matrice cu m linii si n coloane cu numere reale si un vector v cu n
componente reale. Sa se determine daca acest vector apare ca linie in
matricea a si, in caz afirmativ, sa se afiseze numarul acestei linii. In caz
contrar, sa se adauge vectorul ca ultima linia a matricei.

No 440 No 441
Cat timp n>=10 executa
| s=0
|
TESTUL NUM RUL 7
| | s=s+n%10
| |_ n=[n/10]
|_ n=s
Scrie n
a) Ce se va afisa daca valoarea citita pentru n este 989736?
1) Stiind ca variabilele a, b si c de tip intreg memoreaza valorile a=2, b) Stabiliti doua numere diferite, de 5 cifre fiecare care, atribuite initial lui
b=30, c=3, stabiliti care este rezultatul evaluarii expresiei aritmetice n, au ca efect afisarea valorii1
a+b+c+b/a/c? c) Scrieti programul C++ corespunzator algoritmului dat.
a) 95 b) 80 d) Scrieti un algoritm echivalent cu algoritmul dat, dar care sa utilizeze un
c) 38 d) 40 alt tip de structura repetitive
2) Ce se va afisa in urma executarii secventei de instructiuni urmatoare?
i=1; j=1; 5) Se dau n numere naturale (n numar natural nenul dat). Se cere sa se
while (i<=7) calculeze si sa se afiseze suma numerelor care au suma cifrelor divizibila cu
{ 7.
cout<<j; Exemplu
i=i+3; Pentru n=4 si numerele 15, 601, 815, 0 se va afisa 1416
}
a) 1 1 1 b) 1 2 3 4 5 6 7
c) 1 4 7 d) 1 1 1 1 1 1 1
3) De cate ori se va executa instructiunea de decizie din secventa de
program urmatoare, daca valoarea variabilei intregi n este 8?
int i,j;
for (i=1;i<n;i++)
for(j=i;j<n;j++)
if(j%i= =0) cout<<i<<j;
a) 16 b) 38
c) 28 d)36

4) Se considera urmatorul algoritm pseudocod:


Citeste n (numar natural cu cel mult 9 cifre)

No 442 No 443
4) Fie urmatorul algoritm pseudocod:
Citeste a,b (numere naturale)
c=a%10
TESTUL NUM RUL 8
pentru i=1,b-1 executa
| c=c*a
|_ c=c%10
Scrie c
a) Ce valoare afiseaza algoritmul pentru a=28 si b=10?
1) Care dintre urmatoarele expresii are valoarea 1 stiind ca variabilele a, b) Scrieti o pereche de valori de cate doua cifre pentru a si b astfel
b si c de tip intreg au valorile a=1, b=2, c=3, d=2? incat algoritmul sa afiseze valoarea 8.
a) (a= =c) && (b||d) b) (b>c) || (c>3) c) Scrieti programul C++ corespunzator algoritmului dat.
c) ((b= =d)&&(a!=0))||(b<=c) d) (b>c) && a d) Scrieti algoritmul pseudocod care sa fie echivalent cu cel dat si care
2) Care trebuie sa fie valoarea initiala a variabilei i de tip intreg pentru ca sa contina un alt tip de structura repetitive.
in urma executarii instructiunii urmatoare, pe ecran sa fie afisata
secventa de caractere *****? 5) Se dau n numere naturale (n numar natural nenul dat). Se cere sa se
while(i*5<1000) calculeze si sa se afiseze produsul numerelor care au un numar impar
{ de cifre.
Exemplu
i=i*2+10; Pentru n=4 si numerele 1590, 6, 105, 0 se va afisa 0
}
a) 3 b) 11
c) 13 d) 5
3) Ce se va afisa pe ecran in urma executarii urmatoarelor instructiuni,
daca pentru variabila intreaga a se citesc, in ordine, numerele: 1234,
234, 52, 25, 5432, 819?
for(i=1;i<=6;i++)
{
cin>>a;
if (i%2= =0) cout<<a/100%10;
else cout<<a/10%10;
}
a) 230241 b) 432221
c) 220241 d) 325038

No 444 No 445
Exemplu:
x=(10, 24, 467, 23, 140).
TESTUL NUM RUL 9
Se va afisa 3.

4) Fie x

1)
Exemplu:
x=(100, 2116, 4670, 1423, 40).
int x=a[1];
for(int i=1;i<6;i++) a[i]=a[i+1]; a=(2116, 1423) b=(100, 4670, 40).
a[6]=x;
for(int i=1;i<=6;i++) cout<<a[i]/10<<endl;

2)

#include<iostream.h>
int a[6],i;
int main()
{
for(i=1;i<=5;i++) a[i]=i-1;

a) 1 0 1 b) 1 1 1
c) 1 2 0 d) 1 0 0

3)

No 446 No 447
3)
dat care sunt palindroame si au cel putin 2 cifre.

TESTUL NUM RUL 10


Exemplu:
x=(10, 22, 4, 232, 1).
Se vor afisa 22 232.

4) Fie x
1)

int x=a[6]; Exemplu:


for(int i=6;i>=2;i--) a[i]=a[i-1]; x=(10, 2, 60, 13, 40).
a[1]=x;
for(i=6;i>=1;i-- a=(10, 60, 40) b=(2, 13).

2)

#include<iostream.h>
int a[5], b[5], i;
int main()
{
for(i=0;i<5;i++)
if(i%2==0) a[i]=1;
else a[i]=i+2;
for(i=0;i<5;i++) b[i]=a[i]*2;

a) 1 6 1 10 1 b) 2 6 2 10 2
c) 2 2 6 2 2 d) 2 4 6 8 10

No 448 No 449
| daca c>0 atunci
| | c=c-1
|
TESTUL NUM RUL 11
| m=m+c*p; p=p*10;
| n=[n/10]

Scrie m
a) Scrie n=5172.
1) Fiecare dintre variabilele x, y t b)
natural de cel mult 4 x<y c)
expresii are valoarea 1 cat timp...executa cu o structura repetitiva
variabila t nu (x,y)? de un alt tip.
a) (t<=x) || (t>=y) b) (t>x) || (t<y) d) 4 cifre, care pot
c) (t<=x) && (t>=y) d) (t>x) && (t<y) fi citite pentru variabila n 2008
pentru fiecare dintre acestea.
2) 1
x de tip int este divizibil cu 5) imine din
100?
a) x%10+x/10%10==0 b) x/100==0
c) x%10+x/10==0 d) x%10+x%10/10==0 Exemplu
Pentru sirul 45 60 201 102 78 89 se vor afisa
3) Variabilele x y 2 cifre. 45 60 201 102 78 89
Care este valoarea expresiei x-y 102 78
rea 1?
x/10==y%10 y/10==x%10 x/10==x%10+1 6)
a) 0 b) 9
c) 1 d)11
Exemplu
4) -90, 31, -7, -6, 0, 23 se va afisa 31 23 3

m=0; p=1; 7) [Link] naturale


cat timp n>0 executa m n
| c=n%10

No 450 No 451
[Link]
TESTUL NUM RUL 12
Exemplu
[Link] [Link]
3 4 2 0 4
34 2 9 67 1)
1 3 19 7
2 6 20 2 executare?
x=y+z; z=x-z; y=z; z=x-y;
a) numai x b)
c) d)

2) Stabi 1
x nu (-10,-2) [50,100].
a) x<= -10 || (x<50 &&x>= -2) || (x>100)
b) x<= -10 || (x<=50 &&x>= -2) || (x>=100)
c) x< -10 || (x<50 &&x> -2) || (x>100)
d) x<= -10 || (x<=50 ||x>= -2) || (x>100)

3) Variabilele n, z u n

n este:
a) n=(n/100*10+n%10)*10+n%100/10;
b) u=n%10; z=n/100%10; n=n/100+u*10+z;
c) n=(n/100*10+n%10)*10+n/100%10;
d) u=n%10; z=n/100%10; n=n/100*100+z*10+u;

4) Fie ur
Citeste n, d (numere naturale)
b=0; v=0;
pentru i=1,n executa
| citeste x (numar natural nenul)

No 452 No 453
| a=0; Exemplu
| aux=x; -90, 31, -7, -6, 0, 23 se va afisa -7 3 23 31
| cat timp x%d=0 executa
| | a=a+1 7) [Link]
| | x=[x/d] m n ale unei
|
| daca a>b atunci
| | b=a;
| | v=aux; [Link]
|

Scrie v, b Exemplu
[Link] [Link]
a) Scrie n=3, d=2, iar valorile citite pentru x 3 4 1 3 171 469
sunt, 40, 19, 56. 34 2 9 67
b) Pentru n=3 d=2 3 1 3 19 7
pentru x 0 0. 2 6 20 2
c)
d)
structura cat ti
cu test final.

5)

Exemplu
Pentru sirul 4 6 20 1 8 9 se vor afisa
4 6 20 1 8 9
4 2 6 2 20 1 1 1 8 1 9

6)
e

No 454 No 455
4) Fie G un graf orientat cu 10
i j
minim de arce pe care le poate avea graful.
TESTUL NUM RUL 13
a) 90 b) 45
c) 20 d) 10

5) Fie G un graf neorientat conex cu 20


minim de muchii ale grafului G?
1) Se consider a) 20 b) 10
c) 19 d) 190
01100
10100 6) p
11000 a) p2-2*p+2 elemente nule b) p elemente nule
00001 c) p2-p elemente nule d) p-1 elemente nule
00010
7)
: Citeste n (numar natural nenul)
a) Graful este conex; n1=0; n2=0; k1=0;
b) Prin ad ;
c) ; | daca n%10%2=0 atunci
d) | | n2=n2*10+n%10
| | altfel
2) Un arbore are nodurile numerotate de la 1 la 5. Care dintre urm | | n1=n1*10+n%10
| k1=k1+1;
a) 4 4 1 0 1 b) 4 4 1 2 1 | n=[n/10]
c) 2 3 0 4 3 d) 1 2 0 3 4
p=1;
3) Fie G un graf orientat cu n noduri i m arce. Care este valoarea sumei pentru i=1,k1 executa
gradelor exterioare ale tuturor nodurilor grafului? | p=p*10
a) 2*m b) n+m
c) n d) m x=n2*p+n1
scrie x

No 456 No 457
a) Scrie n
123611.
b)
TESTUL NUM RUL 14
pot fi citite pentru variabila n
10.
c)

d)
1) 13 [1,4],
[2,5], [3,8], [4,7], [4,9], [4,11], [6,3], [6,10], [6,12], [8,6], [13,2]}.
8) Se d Identifica

a) 3, 6, 8, 10, 12 b) 2, 5, 3, 6, 8, 10, 12
c) 1, 4, 7, 9, 11 d) 2, 5
9) , vectorii S D. Se cere
T 2) Pentru un arbore cu r 9
DESC. vectori ar
a) (4,3,0,3,9,9,6,6,9) b) (4,3,0,3,9,9,6,6,3)
10) c) (4,3,2,3,9,9,6,6,3) d) (4,3,2,3,9,9,6,6,0)

3) Fie graful orientat cu 5 (1,2), (1,5), (2,5), (2,4), (3,2),


(4,3), (4,5).

a) 1 b) 0
c) 3 d) 2

4) n n-1 muchii. Care este

un ciclu?
a) b)

c) 0 d) 1

No 458 No 459
5) Se consider 8 noduri numerotate de la 1 la 8, dat prin lista a) n 6, iar pentru
de muchii: (1,2), (1,3), (3,4), (3,5), (3,6), (4,8), (4,7). Care dintre x 2008, 1965, 2727, 1861,
11021, 165.
b) n este 4
distincte, numere naturale cu exact 3 cifre, care trebuie citite pentru
a) 1 b) 2 variabila x
c) 4 d) 3 itite pentru x.
c)
6) 8 16 arce este
test final.
d)
a) Fiecare nod al grafului are gradul interior diferit de gradul exterior
b) Fiecare nod al grafului are gradul interior egal cu gradul exterior
c) Nu 1 8)
d)
arbore.
7)
Citeste n (numar natural nenul) 9) , vectorii T DESC. Se
Pentru i=1,n executa
| Citeste x (numar natural) vectorii S D.
| nr=0
| cat timp x>0 executa 10)
| | nr=nr*100+x%10
| | x=[x/100]
|
| cat timp nr>0 executa
| | x=x*10+nr%10
| | nr=[nr/10]
|
| Scrie x

No 460 No 461
TESTUL NUM RUL 15
Exemplu:

4)
e
1) Se

a) de la prefixul cel mai mare la cel mai mic Exemplu:


MASCA 6 consoane; textul modificat va fi c*lc*l*t*r
MASC
MAS
MA
M
b) de la prefixul cel mai mic la cel mai mare
M
MA
MAS
MASC
MASCA

2) vocalele, cifrele semnele de


semne de
: .

Exemplu:
con

3)

No 462 No 463
cu litere mici.

TESTUL NUM RUL 16


Exemplu:

LAPTOPMOUSE
laptopmouse

1) Se 4)
toate sufixe iar fiecare c
a) de la sufixul cel mai mare la cel mai mic
MASCA
ASCA Exemplu:
SCA 5 vocale; textul modificat va fi i&&o&&a&i&a
CA
A
b) de la sufixul cel mai mic la cel mai mare
A
CA
SCA
ASCA
MASCA

2) litere mari litere mici


textul.

Exemplu:

pare

3)

No 464 No 465
- Functie pentru citirea matricei;
- Functie care returneaza suma elementelor pare de pe diagonala
principala a matricei
TESTUL NUM RUL 17
- Functie care returneaza numarul de elemente strict negative din
matrice.

Exemplu:
Pentru matricea
1) Fie x un sir cu n valori naturale. Se cere sa se calculeze produsul 3 -4 60 -18
numerelor din sir care sunt palindroame. Se vor folosi urmatoarele 2 2 2 2
subprograme: 9 9 3 3
- Functie pentru citirea sirului; 1 1 -1 2
- Functie care are ca parametru o variabila de tip intreg si care Se vor afisa valorile 4 3
returneaza 1 daca valoarea variabilei este palindrom si 0 in caz
contrar.
Exemplu: Pentru x=(2,13,44, 20) se va afisa 88

2) Se da o matrice cu numere intregi. Se cere sa se afiseze cate numere


divizibile cu 3 sunt pe fiecare linie a matricei. Se vor folosi urmatoarele
subprograme:
- Functie pentru citirea matricei;
- Functie care are ca parametru un indice de linie si returneaza
numarul de elemente divizibile cu 3 de pe linia respectiva.
Exemplu:
Pentru matricea
3 4 60 18
2 2 2 2
9 9 3 3
Se vor afisa valorile 2 0 4

3) Fie o matrice cu numere intregi. Se cere sa afiseze suma elementelor


pare de pe diagonala principala a matricei si numarul de elemente
strict negative din matrice. Se vor folosi urmatoarele subprograme:

No 466 No 467
3) Fie o matrice cu numere intregi. Se cere sa afiseze numarul
elementelor strict negative de pe diagonala secundara a matricei si
produsul elementelor din matrice care sunt strict pozitive si au exact o
TESTUL NUM RUL 18
cifra. Se vor folosi urmatoarele subprograme:
- Functie pentru citirea matricei;
- Functie care returneaza numarul elementelor strict negative de pe
diagonala secundara a matricei
1) Fie x un sir cu n valori naturale. Se cere sa se calculeze suma - Functie care returneaza produsul elementelor din matrice care sunt
elementelor din sir care sunt numere prime. Se vor folosi urmatoarele strict pozitive si au exact o cifra.
subprograme:
- Functie pentru citirea sirului; Exemplu:
- Functie care are ca parametru o variabila de tip intreg si care Pentru matricea
returneaza 1 daca parametrul este numar prim si 0 in caz contrar. 3 -4 60 -18
2 2 2 2
Exemplu: 9 9 3 3
Pentru x=(2,13,44, 20) se va afisa 15 -1 1 -1 2
Se vor afisa valorile 2 69984
2) Se da o matrice cu numere intregi. Se cere sa se afiseze cate numere
impare sunt pe fiecare coloana a matricei. Se vor folosi urmatoarele
subprograme:
- Functie pentru citirea matricei;
- Functie care are ca parametru un indice de coloana si returneaza
numarul de elemente impare de pe coloana respectiva.

Exemplu:
Pentru matricea
3 4 60 1
2 2 2 25
9 9 3 3
Se vor afisa valorile 2 1 1 3

No 468 No 469
5)

strcpy(a, );
TESTUL NUM RUL 19
for(i=0;i<strlen(a);i++)
a[i]=a[i]-1;
cout<<a;

6) Fie a Ce se va afi
1) Variabila s
expresii are valoare for (int i=1;i<=3;i++)
strcpy(a+1,a+2);
a) strlen(s)<10 b) strlen(s,10)<0 cout<<a;
c) leng(s)<10 d) s- a) Pavara b) ara
c) rim d) Para
2) -
succesiunea de caractere EXAMEN 7)
memorat de variabila s? Variabilele x p
x=strlen(s); strcpy(x, );
for(i=0;i<x/2;i++) x[0]=x[0]-32;
cout<<s[i]<<s[x-i-1];
a) ENXAME b) EAENMX cout<<x[0]<<p[0]<<x[strlen(x)-1];
c) NEEXMA d) NEMAXE a) aaa b) AaA
c) Aaa d) AAA
3) Care este valoarea variabilei s

strcpy(s,strcat(strchr(
a) BAC2012 b) laureat12
c) bac201212 d) aur2012

4) Variabila s

No 470 No 471
4) s executarea

strncpy(s, \
TESTUL NUM RUL 20

a) info b) infoBAC
c) BACinfo d) informaticaBAC

5)
1) variabila c mem i
i este de tip char?
for(i )
for(i=0;i<3;i++) c[i]=c[i+1];
cout<<c;
2) x s
caractere, iar i x s 6)
absolvent x strcpy(x,
if(strcmp(x,y)>0) cout<<x;

for(i=0;i<strlen(s);i++) else cout<<y;


if(strcmp(x,s+i)<0) strcpy(x,s+i); a) Macara b) Mama
a) nt b) absolvent c) MamaIncorect d) Incorect
c) solvent d) vent
7)
3) i s
a i
strcpy(s, );
a) ;
for(i=0;i<strlen(s);i++) b)
;
a) 10 b) lasucrrdecolla c) Transformarea ;
c) CA10BLAEONTRINFORMATICA d) CABLAEONTRINFORMATICA d)

No 472 No 473
a) 989736?
b)
lu
TESTUL NUM RUL 21
c)
d)

4) n m coloane
1) Care este valoarea pe care trebuie s x ( )
:
HHHHHH? [Link]
while (x!=3) {x=x-
a) 0 b) 4 [Link]
c) 6 d) 5

2) Variabilele n, z u n
Exemplu:
: 173 devine 345
a) n=(n/100*10+n%10)*10+n%100/10; 456 789
b) u=n%10; z=n/100%10; n=n/100+u*10+z; 789 456
c) n=(n/100*10+n%10)*10+n/100%10; 345 173
d) u=n%10; z=n/100%10; n=n/100*100+z*10+u;

3)
Citeste n (numar natural cu cel mult 9 cifre)
Cat timp n>=10 executa
| s=0
|
| | s=s+n%10
| |_ n=[n/10]
|_ n=s
Scrie n

No 474 No 475
4) n
) apoi construie 2*n 2*n
coloane, numerotate de la 1 la 2*n,
TESTUL NUM RUL 22

intervalul [1, 4*n2

1, 4*n2
1) Variabilele a, b y sunt reale, iar exemplu.
are valoarea 1 z
a b? ma
a) (z>a || z>b) b) (z<a) || (z>b)
c) z<a && z>b d) z>=a && z<=b
Exemplu:
2) t valoarea Pentru n=2 se ob :
-1 a b 1 3 5 7
diferite? 8 6 4 2
a) if ((a>0)||(b<0)) t= -1; b) if ((a>0)&&(b<0)) t= -1; 9 11 13 15
c) if(a*b<0) t= -1; d) if (a*b>0) t= -1; 16 14 12 10

3)
Citeste a,b (numere naturale)
c=a%10
pentru i=1,b-1 executa
| c=c*a
|_ c=c%10
Scrie c
a) a=28 b=10?
b)

c)
d)

No 476 No 477
b)

c)
TESTUL NUM RUL 23
d)

4) n m coloane
( )
1) Care este valoarea pe care trebuie s x l
: [Link]
HHHHHH?
while (x!=3) {x=x- [Link]
a) 0 b) 4
c) 6 d) 5
Exemplu:
2) Variabilele n, z u regi, iar n 173 devine 345
456 789
: 789 456
a) n=(n/100*10+n%10)*10+n%100/10; 345 173
b) u=n%10; z=n/100%10; n=n/100+u*10+z;
c) n=(n/100*10+n%10)*10+n/100%10;
d) u=n%10; z=n/100%10; n=n/100*100+z*10+u;

3)
Citeste n (numar natural cu cel mult 9 cifre)
Cat timp n>=10 executa
| s=0
|
| | s=s+n%10
| |_ n=[n/10]
|_ n=s
Scrie n
a) 989736?

No 478 No 479
n
) apoi construie 2*n 2*n coloane,
numerotate de la 1 la 2*n,
TESTUL NUM RUL 24

[1, 4*n2], iar

1) Variabilele a, b y sunt reale, iar


valoarea 1 z cupr 1, 4*n2
a b?
a) (z>a || z>b) b) (z<a) || (z>b)
c) z<a && z>b d) z>=a && z<=b
2) t valoarea -1
a b Exemplu:
diferite? Pentru n=2 se ob :
a) if ((a>0)||(b<0)) t= -1; b) if ((a>0)&&(b<0)) t= -1; 1 3 5 7
c) if(a*b<0) t= -1; d) if (a*b>0) t= -1; 8 6 4 2
9 11 13 15
16 14 12 10
Citeste a,b (numere naturale)
c=a%10
pentru i=1,b-1 executa
| c=c*a
|_ c=c%10
Scrie c
a) a=28 b=10?
b) astfel

c)
d)

No 480 No 481
[16] Maria Codrina, Dana Lica, Doru Popescu Anastasiu, Radu Boriga, Adrian

Bibliografie Runceanu, Mihaela Runceanu, Anca Voicu, Mariana Ciobanu - Bacalaureat la


me propuse;
Editura L&S Infomat, Bucu -99376-4-0
[1] Brian Kernighan, Dennis Ritchie - The C Programming Language; Editura
[17] Adrian Runceanu - Tehnici de programare - ;
Prentice Hall 1978, 1985
-Jiu, 2002, ISBN 973-85805-7-9
[2] Bjarne Stroustrup - The C++ Language (second edition); Editura Addison
[18] Adrian Runceanu - lculatoarelor; Editura
Wesley, 1993
-Jiu, 2003, ISBN 973-8436-44-3
[3] Margaretz Ellis, Bjarne Stroustrup - The Annotated C++ Reference
[19] Adrian Runceanu - -
Manual; Editura Addison Wesley, 1991
; -Jiu, 2003, ISBN
[4] Borland C++. Version 4.5 - Programmers Guide, Borland International,
973-8436-37-9
1995
[20] Adrian Runceanu, Mihaela Runceanu - , Editura
[5] Kacso Adrian, Kacso Daniela - Turbo C - Tehnici de programare; Editura
u-Jiu, 2004, ISBN 973-86389-7-X
MicroInformatica, Cluj, 1994
[21] Adrian Runceanu - , Editura
[6] Ionut Muslea - Initi pe obiecte; Editura
-Jiu, 2005, ISBN 973-7637-21-6
MicroInformatica, Cluj, 1992
[22] Adrian Runceanu - , Editura
[7] Ionut Muslea - C++ pentru avansati; Editura MicroInformatica, Cluj, 1994
-Jiu, 2007, ISBN (13) 978-7637-89-5
[8] Octavian Catrina, Iulian Cojocaru Turbo C++; Editura Teora, Bucuresti,
[23] Marian Popescu, Adrian Runceanu - Baze de date Visual Foxpro 6.0
1993
; -Jiu, 2007, ISBN
[9] Cristian Giumale, Eugenia Kalisz, Alexandru Plunoiu, Valentin Cristea -
978-973-144-008-8
; Editura Teora, Bucuresti,1992
[24] Adrian Runceanu - -limbajul C++.
[10] Clara Ionescu, Ioan Zsako - Structuri arborescente cu aplicatiile lor;
Laborator; -Jiu, 2008, ISBN 978-973-144-
, Bucuresti, 1990
109-2
[11] Dan Somnea si Doru Turturea - Initie pe
[25] Adrian Runceanu, Mihaela Runceanu - Tehnologii si aplicatii web
obiecte; Editura Tehnica, Bucuresti, 1990
rator; -Jiu, 2009, ISBN
[12] Nabajyoti Barakakati - Borland C++ 4; Ghidul programatorului;
978-973-144-302-7
(traducere) Editura Teora, Bucuresti,1996
[26] Adrian Runceanu, Mihaela Runceanu - Baze de date o abordare Visual
[13] Herbert Schilldt - C++ manual complet; (traducere), Editura Teora,
Foxpro, -Jiu, 2009, ISBN 978-973-144-
Bucuresti, 1997
235-8
[14] Herbert Schilldt - C manual complet; (traducere), Editura Teora,
[27] Adrian Runceanu - ,
Bucuresti, 1998
-Jiu, 2009, ISBN 978-973-144-301-0
[15] Mickey Williams - Bazele Visual C++ 4;(traducere), Editura Teora,
Bucuresti, 1997

No 482 No 483

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