Documente Academic
Documente Profesional
Documente Cultură
Programarea
calculatoarelor i
limbaje de programare
Lucrri de laborator
Cuvnt nainte
Volumul de fa reprezint suportul pentru lucrrile de laborator efectuate la
disciplina Programarea Calculatoarelor i Limbaje de Programare, care se pred
studenilor din anul I al Facultii de Mecanic de la Universitatea Dunrea de
Jos din Galai.
Cartea conine exemple de programe redactate n limbajul de programare C,
nsoite de explicaii i noiuni teoretice sumare, precum i unele probleme propuse
spre rezolvare. Ea reprezint o completare a elementelor teoretice predate la curs,
iar scopul ei este utilizarea direct i intensiv la scrierea programelor la calculator.
Programele prezentate au o complexitate progresiv i abordeaz principalele
elemente ale unui limbaj de programare.
Galai, 2014
Autorul
Cuprins
Bibliografie..........................................................................................................................6
1.
Generaliti ..............................................................................................................7
1.1
Tastatura ..............................................................................................................7
1.2
Ecranul aplicaiei Borland C .............................................................................8
1.3
Principalele meniuri i comenzi ale aplicaiei ................................................9
2.
Scheme logice i pseudocod................................................................................12
2.1
Reprezentarea algoritmilor prin scheme logice ...........................................12
2.2
Reprezentarea algoritmilor prin pseudocod.................................................12
2.3
Exemple .............................................................................................................13
3.
Noiuni de baz .....................................................................................................16
3.1
Structura unui program n C++......................................................................16
3.2
Principalele mesaje de avertizare i eroare ale compilatorului..................17
3.3
Date n limbajului C .........................................................................................18
3.4
Exemple .............................................................................................................20
4.
Intrri/ieiri n C/C++...........................................................................................21
4.1
Citirea/scrierea datelor ...................................................................................21
4.2
Intrri/ieiri n C++ .........................................................................................21
4.3
Intrri/ieiri n C ..............................................................................................22
4.4
Exemple .............................................................................................................23
4.5
Probleme propuse ............................................................................................26
5.
Operatori i expresii .............................................................................................28
5.1
Operatori ...........................................................................................................28
5.2
Prioritatea operatorilor ....................................................................................30
5.3
Conversia ntre bazele de numeraie .............................................................30
5.4
Exemple .............................................................................................................31
5.5
Probleme propuse ............................................................................................38
6.
Structuri de decizie (alternative, de selecie) ...................................................42
6.1
Structura de decizie: instruciunea if...........................................................42
6.2
Structura de selecie cu ramuri multiple: instruciunea switch...............42
6.3
Exemple if, switch ............................................................................................43
6.4
Probleme propuse ............................................................................................45
7.
Structura ciclic cu test iniial.............................................................................47
7.1
Instruciunea while ........................................................................................47
7.2
Exemple while ................................................................................................47
7.3
Instruciunea for .............................................................................................49
7.4
Exemple for .....................................................................................................49
7.5
Probleme propuse ............................................................................................51
8.
Structura ciclic cu test final ...............................................................................53
8.1
Instruciunea do - while ............................................................................53
8.2
Exemple do - while...........................................................................................53
8.3
Prelucrarea numerelor .....................................................................................56
8.4
Faciliti de ntrerupere a unei secvene........................................................59
8.5
Exemple break, continue ...........................................................................60
8.6
Probleme propuse ............................................................................................60
9.
Tablouri unidimensionale...................................................................................63
9.1
Declaraia de tablou .........................................................................................63
9.2
9.3
Vectori................................................................................................................64
Exemple .............................................................................................................64
10.
iruri de caractere .................................................................................................71
10.2
Probleme propuse ..........................................................................................74
11.
Tablouri multidimensionale...............................................................................76
11.1
Exemple ...........................................................................................................76
11.2
Probleme propuse ..........................................................................................78
12.
Pointeri i adrese ...................................................................................................80
12.1
Exemple ...........................................................................................................80
12.2
Probleme propuse ..........................................................................................85
13.
Funcii : generaliti, operaii cu tablouri .........................................................86
13.1
Structura unei funcii .....................................................................................86
13.2
Transferul parametrilor unei funcii............................................................86
13.3
Funcii definite de utilizator .........................................................................88
13.4
Exemple ...........................................................................................................88
13.5
Probleme propuse ..........................................................................................98
14.
Funcii: analiz matematic, biblioteci de funcii...........................................99
14.1
Exemple ...........................................................................................................99
14.2
Funcii predefinite........................................................................................103
14.3
Biblioteci de funcii scrise de ctre utilizator............................................108
14.4
Exemple .........................................................................................................108
15.
Funcii recursive ..................................................................................................111
15.1
Exemple - Recursivitate direct..................................................................111
15.2
Exemple - Recursivitate indirect ..............................................................121
15.3
Probleme propuse ........................................................................................122
16.
Tipuri de date definite de utilizator ................................................................124
16.1
Structuri .........................................................................................................124
16.2
Uniuni ............................................................................................................132
16.3
Exemple uniuni ............................................................................................132
16.4
Enumerri......................................................................................................138
16.5
Exemple .........................................................................................................138
16.6
Declaraii de tip ............................................................................................139
16.7
Alocarea dinamic a memoriei...................................................................140
16.8
Exemple .........................................................................................................141
16.9
Probleme propuse ........................................................................................142
17.
Fiiere ....................................................................................................................144
17.1
Deschiderea unui fiier................................................................................144
17.2
nchiderea unui fiier...................................................................................145
17.3
Prelucrarea fiierelor text ............................................................................146
17.4
Intrri/ieiri binare ......................................................................................152
17.5
Poziionarea ntr-un fiier ...........................................................................157
17.6
Funcii utilitare pentru lucrul cu fiiere ....................................................158
17.7
Alte operaii cu fiiere..................................................................................159
17.8
Exemple .........................................................................................................159
17.9
Probleme propuse ........................................................................................164
Bibliografie
Cerchez, E., erban, M., Programarea n limbajul C/C++ pentru liceu - Editura
Polirom, 2005.
Deaconu, A., Programare avansat n C i C++, Univ. "Transilvania" Braov, 2003.
Iorga, V., Chiri, P., Opincaru, C., Stratan, C., Programare n C/C++ - culegere de
probleme - Editura Niculescu, 2003.
Kernigham Brian W i Ritchie Dennis M., The ANSI C programming language
2nd ed. - Prentice Hall, 1998.
Negrescu, L., Limbajele C i C++ pentru nceptori. Vol. 1: Limbajul C, Editura
Microinformatica SRL, Cluj-Napoca, 1994.
Novac, C., Limbajul Turbo C++, Universitatea "Dunrea de Jos", Galai, 1993;
Ptru, B., Aplicaii n C i C++. Editura Teora, Bucureti, 1998.
Prisecaru, T., Ene, A.S., Limbajul de programare C++ - Noiuni de baz, Editura
Matrix Rom B, Editura Bucureti, 2000.
Schildt, H., C - Manual complet, Editura Teora, Bucureti, 1998.
Stoilescu, D., Culegere de C/C++, Editura Radial, Galai, 1998.
tefnescu, D., Segal, C., Iniiere n limbajele C/C++, Editura Fundaiei Univ.,
Galai, 2000.
Vlad, S., Ursu, M.F., Informatica tehnic, Univ. Tehnic Cluj-Napoca, ClujNapoca, 1996.
TASTATURA
1.
GENERALITI
1.1 Tastatura
Tastatura este component hardware a calculatorului ce permite utilizatorului s
introduc date prin apsarea unor taste. Cele mai folosite tastaturi sunt cele
QWERTY. Denumirea vine de la primele ase taste de pe rndul al treilea.
1.1.1
Sunt simbolizate cu F1F12, iar rolul lor este s lanseze n mod direct comenzi
pentru calculator, comenzi care sunt diferite n funcie de softul pe care l folosim
la un anumit moment.
1.1.2
Acesta conine tastele alfanumerice (litere, cifre, simboluri), dintre care enumerm
denumirile i funciile tastelor speciale:
Shift (), Alt, Ctrl (dou din fiecare) Nu au efect singure (se apas simultan
cu alt tast)
Caps Lock - folosit la scrierea cu
majuscule
Backspace - terge caracterul din stnga
cursorului
Esc - Escape
Backslash (\)
Asperand (@, "a" rond, coad de
maimu)
Shift+2
Shift+
Shift+3
GENERALITI
1.1.3
Tastele de navigare
1.1.4
Tastele numerice
Sunt active dac led-ul lui Num Lock este aprins, altfel funcioneaz ca Taste
speciale
Rama ferestrei - dubl, dac fereastra este activ, simpl dac este
inactiv
GENERALITI
10
9.
11
2.
STOP
CITETE a,b
AFIEAZ a,b
a6
Condiie
12
EXEMPLE
Sfrit algoritm:
nceput algoritm:
Citire (introducere) date:
Scriere (afiare) date:
Atribuire:
Structura de decizie (alternativ):
SFRIT
NCEPUT
CITETE lista
SCRIE lista
DAC condiie
ATUNCI aciune1
ALTFEL aciune2
CT TIMP condiie
REPET aciune
sau:
PENTRU contor=val_ini LA val_fin [PAS]
REPET aciune
Structuri repetitive cu test final:
REPET aciune CT TIMP condiie
sau:
REPET aciune PN CND condiie
Pe lng cuvintele cheie, n reprezentarea algoritmilor n pseudocod pot apare
i propoziii nestandard a cror detaliere va fi realizat ulterior.
n cazul n care se realizeaz un algoritm modularizat, pot apare cuvintele
cheie:
SUBALGORITM nume (lista_intrri)
CHEAM nume (lista_valori_efective_de_intrare)
2.3 Exemple
2.3.1
2.3.1.1
Pseudocodul
1. CITETE a, b, c
2. DAC a>b
ATUNCI max=a
ALTFEL max=b
3. DAC c>max
ATUNCI max=c
4. AFIEAZ max
13
2. suma=0
3.CT TIMP i<n
3.1 i++
3.2 suma=suma+i
4. AFIEAZ suma
2.3.3
Ecuaia de gradul 2
2.3.3.1
Schema logic
Start
Citete a,
b, c
F
Dac
a=0
= b2 4ac
A
Dac
>0
Dac
b=0
Scrie Ec e de
gradul unu
x1 = -c/b
F
-b
x1,2 = 2a
Scrie Ec are
doua rad dif
x1 i x2
-b
x1,2 = 2a
Scrie Ec are
rad dubla
x1 = x 2
Dac
<0
Daca
c=0
-b
re = 2a
-
im = 2a
Scrie Ec are
rad compl
x1,2 = reiim
Stop
14
Scrie Ec nu
are nici o
solutie
Scrie Ec are
o infinit ate
de solutii
EXEMPLE
2.3.4
Start
Start
Citete
a, b, c
Citete
a,b,m,n
Dac
a>b
max=b
A
max=a
F
Dac
c>max
Dac
im, jn
s=s+sin(a+3*i)*cos(b+5*j)
max=c
max=c
Scrie
Max = , max
Scrie
S = , s
Stop
Stop
Start
Citete
a,b
F
Dac
a0, b0
Start
A
Citete n
cmmmc=a*b
r=a%b
a=b
b=r
cmmmc=0
cmmdc=0
F
F
cmmmc=a
cmmdc=
cmmmc/
cmmdc
Scrie
cmmdc, cmmmc
Stop
i=1
fact=1
Dac
r0
Dac
in
fact*=i
i++
r=a%b
a=b
b=r
Scrie
n! =, fact
Stop
15
NOIUNI DE BAZ
3.
NOIUNI DE BAZ
16
Explicaii
Avertisment: Valoarea calculat nu este folosit
nicieri n continuare
Denumire greit n directiva de preprocesare
Caracter } sau { omis la o instruciune
compus
Eroare de sintax a declaraiei
Declaraie terminat incorect
Eroare de sintax
Caracter omis ; la scrierea instruciunii "for"
Funcia ar trebui s aib un prototip; pentru
a putea fi folosit, ea trebuie fie definit de
utilizator, fie folosit o directiv de preprocesare
(#include <>)
Funcia ar trebui s returneze o valoare - lips
"void" la tipul valorii returnate din antet sau
lips instruciune "return" n corpul funciei
Caracter ) sau ( omis la scrierea instruciunii
if
Structur greit a instruciunii (scriere/citire) la >> sau <<
Variabil iniializat cu un format
numeric incorect
Ramura else din instruciunea if este
poziionat greit
Variabila este declarat de mai multe ori
Caracter > omis la o directiv de preprocesare
dup numele bibliotecii
Caracter ;omis (la instruciunea precedent)
Numele bibliotecii a fost scris greit
Simbol '' (variabil sau funcie) nedefinit
Simbol neateptat - parantez sau acolad n
plus
ir de caractere sau constant caracter
neterminat - lips ' sau "
Caracter )sau ( omis la scrierea instruciunii
"while"
17
NOIUNI DE BAZ
Explicaii
Pentru a obine mai multe informaii despre o anumit eroare, atunci cnd
eroarea este selectat n fereastra cu mesaje (Message), se apas tasta F1.
Tipuri de date
Datele care intervin n programe sunt de mai multe tipuri. n acest laborator vom
prezenta tipurile simple, iar tipurile compuse vor fi prezentate n alte laboratoare.
Tabelul de mai jos va prezenta tipurile de baz:
Lungime
n bii
16
char
float
32
double
64
short
long
16
32
unsigned
char
unsigned
int
unsigned
long
3.3.2
16
32
Constante
Sunt caracterizate prin tip i valoare. Att tipul ct i valoarea se definesc prin
caracterele care o compun
18
Format de
reprezentare
zecimal
Mod de reprezentare
[- / +] <cifra de la 1 la 9> [<lista
Exemple
125
DATE N LIMBAJULUI C
Tip
dat
ntreg
*)
real
(flotant)
Format de
reprezentare
(n baza 10)
octal
(n baza 8)
hexazecimal
(n baza 16)
n
virgul
fix
n
virgul
mobil
ntre
apostroafe
Mod de reprezentare
cifre de la 0 la 9>]
[- / +] 0 <cifra de la 1 la 7>
[<lista cifre de la 0 la 7>]
[- / +] 0 {x / X} <cifra 1-9 sau
litera a-f sau A-F> [<lista cifre 07 sau litere a-f sau A-F>]
[- / +] <partea ntreag> .
<partea zecimal>
Aceasta este scrierea unui
numr raional n baza zece,
unde virgula zecimal este
nlocuit de punctul zecimal.
Partea zecimal poate fi vid
[- / +] <partea ntreag> .
<partea zecimal> {e sau E} [- /
+] <nr. ntreg zecimal>
Aceasta reprezint mantisa (ceea
ce este nainte de E) nmulit cu
10 la puterea dat de exponent
(ceea ce este dup E)
<caracter>
\<codul ASCII>
caracter
cu secvene
escape
\<caracter special>
ir
de
carac
ntre
ghilimele
cu secvene
escape
<ir>
ir caractere i secv.escape
Exemple
-11
0127
-022
0xa12f
-0Xad105
123
123.7
.25
78E4
.1e-3
1234.567e-4
\65 \7
\42 \140
\t
Tab
\n
Rnd nou
\a
Alarm (sunet)
\b
Backspace
\r
Retur de car
(pozi cursorul n
rndul curent col 1)
\v
Tabulator
vertical
\\
Backslash
\
Apostrof
Acesta este un sir de
caractere
Alte
\tsecvente
\tescape \nintr-un
sir
19
NOIUNI DE BAZ
3.3.3
Variabile
3.3.3.1
Declararea variabilelor
Modul general de declarare a variabilelor este:
tip_variabile list_nume_variabile;
Se specific tipul variabilei(lor) i o list format din unul sau mai muli
identificatori ai variabilelor de tipul respectiv.
Ex.:
int i, j; /*declararea var. simple i, j, de tip int. Se rezerv pentru i i j cte 16
bii (2 octei)*/
char c; /*declararea variabilei simple c, de tip char. Se rezerv un octet.*/
float lungime; /* declararea variabilei simple lungime de tip float; se
rezerv 4 octei */
3.3.3.2
Iniializarea variabilelor n declaraii
n momentul declarrii unei variabile, acesteia i se poate atribui o anumit valoare.
n acest caz, n memorie se rezerv numrul de locaii corespunztor tipului
variabilei respective, iar valoarea va fi memorat n acele locaii. Forma unei
declaraii de variabile cu atribuire este:
tip_variabil nume_variabil=expresie;
Se evalueaz expresia, iar rezultatul acesteia este atribuit variabilei specificate.
3.4 Exemple
char backslash=\\; /*declararea i iniializarea variabilei simple de tip
caracter backslash */
int a=7*9+2; /* declararea variabilei simple a, de tip int i iniializarea ei cu
rezultatul unei expresii - valoarea 65*/
float pi=3.14; /*declararea i iniializarea variabilei pi*/
short int z=3;
//declararea i iniializarea variabilei simple z
char d=\011;
char LinieNoua=\n;
double x=9.8, y=0;
20
INTRRI/IEIRI N C++
4.
INTRRI/IEIRI N C/C++
21
INTRRI/IEIRI N C/C++
Ex.: Pentru a afia pe ecran pe o linie nou, n cadrul unui mesaj, valorile a dou
variabile a i b folosim instruciunea:
cout<<"\na="<<a<<"\tb="<<b;
Instruciunea are urmtorul efect:
1. se trece pe o linie nou (\n)
2. se afieaz textul a=
3. se afieaz valoarea variabilei a
4. se las un spaiu (tab) (\t)
5. se afieaz textul b=
6. se afieaz valoarea variabilei b
Dac a=2 i b=5, atunci rezultatul instruciunii este:
a=2
b=5
Cnd dorim s citim date de la tastatur, le vom extrage din fluxul de intrare,
folosind operatorul de extragere >> (care poate fi utilizat nlnuit atunci cnd
dorim s citim succesiv mai multe variabile). Instruciunea care citete (de la
tastatur) una sau mai multe variabile este:
cin >>var.1[>>var.2 [...]]
Ex.: Pentru a citi de la tastatur valorile a dou variabile a i b folosim
instruciunea:
cin>>a>>b;
4.3 Intrri/ieiri n C
Citirile i scrierile n limbajul C se realizeaz prin intermediul unor funcii
specifice.
4.3.1
22
EXEMPLE
Ex. Pentru a se citi de la tastatur variabilele denumite: car (de tip caracter char), intrg (de tip ntreg - int), re (de tip real - float) i sir (de tip ir de caractere)
sintaxa instruciunii este:
scanf("%c%d%f%s",&car,&intrg,&re,sir);
4.3.2
4.4 Exemple
4.4.1
cout
#include <iostream.h>
void main(void)
{ cout<<"ACESTA ESTE PRIMUL PROGRAM\n"; }
4.4.2
cin, cout
#include <iostream.h>
void main()
//Citeste o data calendaristica sub forma
zzllaaaa (ziua-2 cifre, luna-2 cifre, anul-4 cifre) si o
rescrie in forma aaaa/ll/zz
23
INTRRI/IEIRI N C/C++
24
EXEMPLE
4.4.4
INTRRI/IEIRI N C/C++
#include<stdio.h>
void main()
{
char c;int i;float f;char sir[10];
clrscr();
printf("Introduceti un char/intreg/float/sir: \n");
scanf("%c%d%f%s",&c,&i,&f,sir);
printf("\nc=%c cod=%d",c,c);
//caracter si cod caracter
printf("\ni=%d",i);
//intreg
printf("\ni=%6d",i);
//cu lungime de cimp
printf("\ni=%-6d;i=%d",i,i);
//aliniat la stinga
printf("\ni=%06d",i);
//cu zerouri nesemnificative
printf("\ni in octal=%o",i);
//in octal
printf("\ni in hexa=%x",i);
//in hexa
printf("\nf=%f",f);
//float
printf("\nf=%10.2f",f);
//cu lungime si precizie
impusa
printf("\nf=%e",f);
//format stiintific
printf("\nf=%.3e",f);
//format
stiintific
cu
precizie data
printf("\nf=%g",f);
//cel
mai
scurt
dintre
formatele f si e
printf("\nsir=%4.6s",sir);
//sir cu lungime fixa
getch();
}
26
PROBLEME PROPUSE
{cout<<Program \nsimplu;
cout<< \n;}
#include <iostream.h>
void main ()
{cout<<Program;
cout<<simplu<< \n;}
27
OPERATORI I EXPRESII
5.
OPERATORI I EXPRESII
5.1 Operatori
Operatorul de atribuire: =
n tabelul de mai jos sunt prezentate principalele variante ale instruciunii de
atribuire.
sintaxa
<variabil>
=
<expresie>;
<variabil> <op> =
<expresie>;
exemple
x=y+z/3;
x+=y;
i-=2;
a*=ln(a);
alfa /=n;
observaii
28
b
0
1
0
1
a&&b
0
0
0
1
a||b
0
1
1
1
aXORb
0
1
1
0
!a
1
1
0
0
OPERATORI
Clas de
operatori
Primari
2.
Unari
Nr.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Multiplicativi
Aditivi
Deplasare pe bit
Relaionali
De egalitate
14.
De atribuire
15.
Virgul
Condiional
Operatori
() [] . -> ::
! (NOT pe cuvnt) ~ (NOT
pe bit) ++ -- sizeof
(tip)
-(unar)
*(defereniere)
&(refereniere)
* / %
+ << >>
< <= > >=
== !=
& (I logic pe bit)
^ (XOR pe bit)
| (SAU logic pe bit)
&& (I logic pe cuvnt)
|| (SAU logic pe cuvnt)
?:
=
+=
-=
*=
%=
&= ^= |= <<= >>=
,
Asociativitate
de la stnga la dreapta
de la stnga la dreapta
de la dreapta la stnga
de la stnga la dreapta
de la stnga la dreapta
de la stnga la dreapta
de la stnga la dreapta
de la stnga la dreapta
de la stnga la dreapta
de la stnga la dreapta
de la stnga la dreapta
de la stnga la dreapta
de la stnga la dreapta
de la dreapta la stnga
de la dreapta la stnga
de la stnga la dreapta
OPERATORI I EXPRESII
(tip) operator
Printr-o astfel de construcie, valoarea operandului se convertete spre tipul
indicat n paranteze. n construcia de mai sus (tip) se consider c este un operator
unar. l vom numi operator de forare a tipului sau de conversie explicit.
Construcia de mai sus o vom numi expresie cast.
Exemplu: int x; float y; y= (float)x/2;
5.3.1
Conversia zecimal-binar
5.3.2
Operaie
24:2
12:2
6:2
3:2
1:2
Ct
12
6
3
1
0
Rest
0
0
0
1
1
Conversia binar-zecimal
Numrul n baza 10 este suma produselor dintre cifrele numrului n baza doi i
doi ridicat la o putere egal cu poziia cifrei n numr; numerotarea ncepe din
dreapta cu poziia zero.
Ex.: 110102 = 124 + 123 + 022 + 121 + 020 = 2610
5.3.3
Conversia hexazecimal-binar
30
EXEMPLE
5.3.4
Conversia binar-hexazecimal
5.4 Exemple
5.4.1
Operatori aritmetici
5.4.2
<<a*b<<\nDiferenta=
Fie r un numr real, citit de la tastatur, care reprezint lungimea razei unui cerc.
S se scrie un program care s calculeze i s afieze aria i perimetrul discului de
raz r.
5.4.2.1
Soluie
Vom citi valoarea razei n variabila r. Vom calcula aria discului dup formula r2,
iar perimetrul, dup formula 2r. Numrul este un numr iraional. Calculatorul
nu poate memora numere iraionale (care au o infinitate de zecimale), ci doar
aproximri ale acestora. n fiierul antet math.h este definit o constant numit
M_PI care reprezint o aproximare a numrului iraional .
5.4.2.2
Programul
//Cerc
#include <iostream.h>
#include <math.h>
void main()
{
double r;
cout<<"\nRaza r= "; cin>>r;
cout<<"Aria=\t\t"<<M_PI*r*r <<"\nPerimetrul=\t" << 2*M_PI*r;
}
31
OPERATORI I EXPRESII
5.4.3
5.4.4
a21x + a22y = b2
1.CITETE a11,a12,a21,a22,b1,b2
2.det = a11*a22-a21*a12
3.detx = b1*a22-b2*a12
4.dety = a11*b2-a21*b1
5.x = detx/det; y = dety/det
6.SCRIE x,y
5.4.5
Incrementri/decrementri/atribuiri
32
EXEMPLE
c*=4
a/=2
Rezultatele programului se vor interpreta urmrind valorile variabilelor a, b i c
n fereastra Watch
5.4.6
5.4.7
#include <iostream.h>
void main()
{
int a=0, b=10, c=100, d=200;
int rezult; rezult=a&&b;
cout<<a&&b=<<rezult<<\n; //Afisare a&&b=0
rezult=a||b; cout<<a||b=<<rezult<<\n;
//Afisare a||b=1 (sau valoare nenula)
rezult=!a;cout<<!a=<<rezult<<\n;
//Afisare !a=1 (sau valoare nenula)
rezult=!b; cout<<!b=<<rezult<<\n;
//Afisare !b=0
rezult=
(a>b)
||
(b>c);
cout<<
(a>b)
||
<<rezult<<\n;
//Afisare (a>b) || (b>c) =1(sau valoare nenula)
rezult=!(c<d);cout<<!(c<d)=<<rezult<<\n;
//Afisare !(c>d)=0
rezult=(a-b)&&1;cout<<(a-b)&&1=<<rezult<<\n;
//Afisare (a-b)&&1 =1(sau valoare nenula)
rezult=d||b&&a;cout<<d||b&&a=<<rezult<<\n;
//Afisare d||b&&a =1
(b>c)=
33
OPERATORI I EXPRESII
5.4.8
An bisect
5.4.9
(an%4==0
Operatori pe bii
34
&&
an%100!=0
||
EXEMPLE
OPERATORI I EXPRESII
5.4.10
S se scrie un program care citete dou numere i afieaz maximul dintre ele.
// Operatorul ternar - maximul a 2 numere
#include <stdio.h>
void main ()
{
double a,b;
scanf("%lf %lf",&a,&b);
printf("a=%g\tb=%g\tmax(a,b)=%g\n", a,b, a > b ? a : b);
}
5.4.11
5.4.12
36
EXEMPLE
}
Obs.: n acest program, pentru extragerea rdcinii ptrate s-a utilizat funcia
sqrt. Ea are prototipul: double sqrt(double). Acest prototip este definit n
fiierul math.h.
5.4.13
5.4.14
Operatorul virgul
S se scrie un program care citete doi ntregi i afieaz maximul dintre valorile
lor absolute.
#include <stdio.h>
void main( )
{
int a,b,c,d;
scanf("%d%d", &a,&b);
printf("a=%d\tb=%d\tmax(abs(a),abs(b))=%d\n", a, b, ((c=a<0
?-a:a), (d=b<0 ? -b : b), (c>d)) ? c : d);
}
Obs.: Expresia: (c = a<0 ?-a), (d = b<0 ?-b:b), (c>d) se compune din trei expresii
care se evalueaz de la stnga la dreapta.
Prima atribuie lui c valoarea absolut a lui a, a doua atribuie lui d valoarea
absolut a lui b, iar a treia testeaz relaia c>d. Valoarea ntregii expresii coincide cu
1 dac c>d i cu zero n caz contrar.
37
OPERATORI I EXPRESII
3.
38
PROBLEME PROPUSE
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
OPERATORI I EXPRESII
17. Care dintre urmtoarele expresii sunt adevrate dac i numai dac valorile
variabilelor x i y sunt numere naturale consecutive?
x-y==1
(x==1) && (y==2)
(x-y==1) && (y-x==1)
y==x1
(x-y==1) || (y-x==1)
18. S considerm urmtoarele declaraii de variabile:
int x=0XF0A8, v=0XFFFD;
unsigned y=0XF0A8, z=1;
float a=s.5, b=4;
char c=8;
Evaluai urmtoarele expresii:
a+z/2
-1 > z
(v+z)/2
c>='0' && c <= '9' ? "da" : "nu"
(v+1) /2
x>>3&z<<4
c-'0'
y>>10|z
19. n contextul declaraiilor de variabile de la exerciiul precedent, care sunt
erorile din urmtoarele expresii?
(a+z)%2
a+++x
b*b-4ac
x=(a2)
c=a?"da" : "nu"
x&&=10
20. n condiiile urmtoarelor declaraii i iniializri de variabile:
unsigned char x=250, z=x+7, a='8';
Care este valoarea expresiei: z | (a-' 0') ?
Expresia nu se poate evalua, deoarece este eronat sintactic,
1
265
0
true
9
21. Se consider x, y i z trei variabile ntregi. Care dintre urmtoarele expresii are
valoarea diferit de 0 dac i numai dac y=max (x, y, z) ?
x>z?y>=x?1:0:y>=z?1:0
!(y<x || y<z)
!(y<x && y<z)
x>z && y>x || z>x && y>z
y>x && y>z
2ab - c2
22. Pentru a atribui variabilei reale x rezultatul expresiei 0.25 ,unde a, b i c
desemneaz variabile reale, se utilizeaz instruciunea:
x=(2*a*b)-(c*c)/0.25;
x=2*a*b-c*c/0.25;
40
PROBLEME PROPUSE
x=(2*a*b)-(c*c)*4;
x=(2*a*b-c*c)*4;
23. Fie A i B dou puncte n plan, specificate prin coordonatele lor carteziene. S
se scrie un program care s calculeze i s afieze lungimea segmentului AB.
41
6.
cu
ramuri
multiple:
42
Sintaxa:
switch (expresie)
{
case expresie_const_1: instructiune_1;
[break;]
case expresie_const_2: instructiune_2;
[break;]
. . . . . . . . . . . . . .
case expresie_const_n-1: instructiune_n-1;[break;]
[ default:
instructiune_n; ]
}
Instruciunea switch este o generalizare a instruciunii if. Spre deosebire de
if, care permite selectarea unei alternative din maximum dou posibile, switch
permite selectarea unei alternative din maximum n+1 posibile. O alt diferen
major const n faptul c n if se execut instruciunea corespunztoare valorii
expresiei i att, n timp ce n switch se execut i toate secvenele de instruciuni
ale alternativelor case urmtoare.
6.3.1.1
Pseudocodul
1.CITETE a,b,c
2.DAC a>b ATUNCI max=a ALTFEL max=b
3.DAC c>max ATUNCI max=c
4.SCRIE max
6.3.1.2
Programul
#include<iostream.h>
main()
{
int a,b,c,max;
cout<<"Dati a b c"; cin>>a>>b>>c;
if(a>b) max=a;
else max=b;
if(c>max) max=c;
cout<<"maximul="<<max;
}
6.3.2
Calculator de buzunar
6.3.3
Sum
Orice sum de bani S (S>7) poate fi pltit numai cu monede de 3 lei i de 5 lei. Dat
fiind S>7, scriei un program care s determine o modalitate de plat a sumei S
numai cu monede de 3 lei i de 5 lei. Cum se poate obine numrul minim de
monede ?
6.3.3.1
Soluie
Problema cere, de fapt, s gsim dou numere naturale x i y, astfel nct s s poat
fi scris sub forma S = 3*x+5*y (n unele cazuri exist dou soluii ale problemei !)
Vom analiza urmtoarele trei cazuri:
1. S%3 (restul mpririi lui S la 3) este 0. n acest caz, x = S/3, iar y = 0.
2. S%3 este 1. Deoarece S>7, vom considera x = S/3 - 3 i y = 2, pentru c S = 3 *
S/3 + l = 3 * (S/3 - 3) + 3*3 + 1 = 3*(S/3 - 3) + 10 = 3*(S/3 - 3) + 5*2.
3. S%3 este 2. n acest caz vom considera x = S/3 - l i y = l, deoarece S = 3*S/3
+ 2 = 3*(S/3 - l) + 3 + 2 = 3*(S/3 - l) + 5.
6.3.3.2
Programul
#include <stdio.h>
void main()
{
int S, x, y, r;
printf("Introduceti suma S: ");
scanf("%d", &S);
r=S%3;
switch (r)
{
case 0: x=S/3; y=0; break;
case 1: x=S/3-3; y=2; break;
case 2: x=S/3-1; y=1;
}
printf("%d = 3*%d + 5*%d\n",S,x,y);
}
44
PROBLEME PROPUSE
ALTFEL
2.2.1.2 DAC d=0 ATUNCI
2.2.1.2.1 SCRIE "ec.are rad.dubla x=",-b/(2*a)
ALTFEL
2.2.1.2.2 re = -b/(2*a),
im =
-d /(2*a)
ALTFEL
3.1.2 arg = -pi/2
3.2 ALTFEL
DAC re>0 ATUNCI
3.2.1 arg=arctg(im/re)
ALTFEL
3.2.2 arg=-arctg(im/re)
4.SCRIE modul, arg
45
4.
f(x,y)=
8.
46
x+y
5xy dac x, y > 0
min (x, y), dac x = 0 sau y = 0
1 1 1 1
x + y x + y + x2 + y2 , altfel
Fie x un numr natural de trei cifre. Scriei un program care s elimine una
dintre cifrele numrului astfel nct numrul de dou cifre rmas s fie maxim.
EXEMPLE WHILE
7.
7.2.1.1
Pseudocodul (vezi i schema logic de la 2.3.4)
1.CITETE a,b
2.cmmmc=a*b
3.CT TIMP b<>0
2.5.1.r = a%b //restul
2.5.2.a = b
2.5.3.b = r
2.6.cmmdc = a
2.7.cmmmc = cmmmc/cmmdc
2.8.SCRIE cmmmc, cmmdc
7.2.1.2
Programul
//Algoritmul lui Euclid
#include<iostream.h>
int main()
{
long int a,b,rest,cmmmc,cmmdc;
cout<<"\na=";cin>>a; cout<<"b=";cin>>b;
cmmmc=a*b;
while(b)
{
rest=a%b;
47
}
cmmdc=a;
cmmmc=cmmmc/cmmdc;
cout<<"\n\ncmmmc= "<<cmmmc<<" cmmdc= "<<cmmdc;
return 0;
}
Obs.: Nu se verific dac iniial a > b; acest lucru nu este necesar, deoarece, dac
iniial a < b, dup prima executare a instruciunii compuse subordonate
instruciunii while, valorile lui a i b vor fi schimbate.
7.2.2
#include <iostream.h>
void main()
{int prod=1,i=0,n; char c;
cout << "\nSpecificati numarul n:";
cin >> n;
while(i<n)
{
i++;
prod=prod*i;
}
cout << "\nFactorial de " << n << "=" << prod << "\n";
cin >> c;
}
7.2.3
#include <iostream.h>
void main()
{int suma=0,i=0,n;
cout << "\nSpecificati numarul n:";
cin >> n;
while(i<n)
{
i++;
suma=suma+i;
}
cout << "\nSuma primelor " << n << " numere naturale=" <<
suma << "\n";
}
7.2.4
7.2.4.1
Pseudocodul
48
EXEMPLE FOR
1. CITETE n
2. n=abs(n)
3. f=2
//factorul prim de testat
4. CT TIMP (f<=n)
4.1.e=0
//exponentul la care apare factorul n descompunere
4.2.CT TIMP (n%f==0) //n se divide la f
4.2.1.n=n/f
4.2.2.e=e+1
4.3.DAC (e0) SCRIE f," la ",e
4.4.DAC (f=2) f=f+1 ALTFEL f=f+2
Calculul factorialului
//Calculul factorialului
#include<iostream.h>
#include<conio.h>
void main()
{
49
7.4.2
sin(a+3*i)*cos(b+5*j).
j=1
i=1
7.4.2.1
Pseudocodul
1.CITETE a,b,m,n
2.i=1
3.j=1 4.s=0
5.CT TIMP (i<=m)
5.1.CT TIMP (j<=n)
5.1.1.s=s+ sin(a+3*i)*cos(b+5*j)
5.1.2.j=j+1
5.2.i=i+1
6.SCRIE s
7.4.2.2
Programul
#include<iostream.h>
#include<math.h>
void main()
{
float s=0,a,b; int m,n,i,j;
cout<<"a="; cin>>a; cout<<"b="; cin>>b; cout<<"m="; cin>>m;
cout<<"n="; cin>>n;
for(i=1,j=1; i<=m,j<=n; i++,j++)
s=s+sin(a+3*i)*cos(b+5*j);
cout<<"Suma="<<s;
}
7.4.3
50
PROBLEME PROPUSE
2. DAC n>=2
2.1. PENTRU f0=0 i f1=1, CT TIMP f1<n, f0=f1, f1=fi, REPETA
2.1.1. fi=f0 + f1
2.1.2. SCRIE fi
7.4.3.2
Programul
//Genereaza numerele Fibonacci
#include<stdio.h>
#include<conio.h>
void main()
{
int f0,f1,fi,n;
clrscr();
printf("Introd n: "); scanf("%d",&n);
if(n>=2)
{
for(f0=0,f1=1,fi=1;fi<n;f0=f1,f1=fi,fi=f0+f1)
{printf("\nf0=%d; \tf1=%d; \tfi=%d;",f0,f1,fi); }
}
getch();
}
7.4.4
2.
3.
4.
5.
6.
52
int n, d=2;
cin>>n;
while (n>l)
if (n%d==*0) n/=d;
cout<<d;
a. Ce valoare va fi afiat dac valoarea citit pentru variabila n este 720?
b. Dai exemplu de valori (cel puin dou) care ar putea fi introduse pentru
variabila n, astfel nct valoarea afiat s fie 11.
c. Care este efectul acestei secvene de instruciuni?
Se consider urmtoarea secven de instruciuni:
int x, a, b, i;
cin>>a>>b;
i=a; x=0;
while (i<=b) { x+=i;i++; }
cout<<x;
a. Ce valoare va fi afiat pe ecran dac se introduc valorile 1 i 10?
b. Ce valori ar putea fi introduse pentru a i b astfel nct programul s afieze
valoarea 22?
c. Dai exemplu de valori distincte care ar putea fi introduse astfel nct
programul s afieze valoarea 0.
d. Scriei un program echivalent mai eficient.
Care dintre urmtoarele secvene de instruciuni atribuie variabilei ntregi u
valoarea primei cifre a numrului natural reprezentat de variabila x ?
u=x/10;
u=x; while (u>=10) u=u%10;
u=x%10;
while (x>=10) x=x/10; u=x;
Ce valoare iniial ar trebui s aib variabila x astfel nct dup execuia
urmtoarei secvene de instruciuni s se afieze valoarea 640?
d=2;
while (d<50) { x=x*d; d=d*d;}
coutx;
Numere prietene - Dou numere naturale a i b se numesc prietene dac a este
egal cu suma divizorilor lui b (exclusiv b), iar b este egal cu suma divizorilor lui
a (exclusiv a). De exemplu, a=220 i b=284 sunt prietene. Scriei un program
care s determine primele trei perechi de numere prietene, cu a<b.
Plata sumei - Se citesc de la tastatur dou numere naturale S i x (0<S<10000,
0<x<l00). S reprezint o sum pe care trebuie s o pltim, utiliznd un numr
minim de bancnote. Bancnotele au ca valori numai puteri ale lui x (1, x, x2, x3,
...) i presupunem c dispunem de un numr suficient de mare de bancnote.
Scriei un program care afieaz pe ecran o modalitate de a plti suma,
utiliznd un numr minim de bancnote. De exemplu, pentru S=107 i x=5, vei
afia:
4 bancnote cu valoarea 25
1 bancnote cu valoarea 5
2 bancnote cu valoarea 1
EXEMPLE DO - WHILE
8.
8.2.1.1
Pseudocodul
1.s=0
2.REPET
2.1. CITETE x
2.2. s=s+x
CT TIMP (x!=0)
3. SCRIE s
8.2.1.2
Programul
#include<iostream.h>
void main()
{
float s,x; s=0;
cout<<"Dati numerele de adunat (0-oprire)";
do
{ cin>>x; s+=x;}
while (x!=0);
cout<<"suma este: "<<s;
}
53
8.2.2
S se calculeze suma S =
(-1)kxk
k! pn cnd |T/S| < .
k=1
8.2.3
Radical de ordinal 3
3
Fie x un numr real. S se calculeze x (radical de ordin 3 din x), folosind relaia
de recuren:
;
ri = (2*ri - 1 + x/(ri-1 * ri-1))/3, dac i>1
r1 = 1
Rezultatul trebuie s fie obinut cu o precizie mai bun dect 10-4.
54
EXEMPLE DO - WHILE
8.2.3.1
Soluie
Observm c pentru a calcula termenul i din acest ir recurent este necesar numai
termenul i-1. Prin urmare, vom utiliza dou variabile r1 (n care reinem termenul
calculat la pasul precedent) i r2 (n care reinem termenul pe care urmeaz s l
calculm).
Pentru a obine precizia cerut n problem, vom calcula termeni din ir pn
cnd diferena n valoare absolut dintre doi termeni consecutivi este mai mic
dect precizia specificat. Pentru a calcula diferena n valoare absolut dintre doi
termeni consecutivi, vom utiliza funcia fabs() din biblioteca de funcii
matematice (aceast funcie calculeaz modulul unui numr de tip double
specificat ca parametru).
8.2.3.2
Programul
//Radical de ord 3
#include <iostream.h>
#include <math.h>
#define EPS 0.0001
void main()
{
double x, r1, r2=1;
cout<<"\nx= "; cin>>x;
do
{
r1=r2;
r2=(2*r1+x/(r1*r1))/3;
}
while (fabs(r2-r1)>=EPS);
cout<<"Radical de ord 3: "<<r2;
}
8.2.4
55
56
PRELUCRAREA NUMERELOR
8.3.1
s=0;nl=n;
do
{
s+=nl%10; //se obtine pe rind fiecare cifra
nl/=10;
//incepind cu cea a unitatilor
}
while(nl);
cout<<"\nSuma cifrelor nr. "<<n<<" = "<<s;
8.3.2
nl=0;
do
{
if (n%10!=a) nl=nl*10+n%10;
n/=10;
}
while(n);
do
{
n=n*10+nl%10;
nl/=10;
}
while(nl);
cout<<"\nNoul numar: "<<n;
8.3.3
n_o=0;nl=n;
do
{
n_o=n_o*10+nl%10;
nl/=10;
}
while(nl);
cout<<"\nOglinditul lui "<<n<<" este "<<n_o;
8.3.4
while(aux);
cout<<"\nNumarul "<<n<<" in baza "<<b<<" este "<<n_b;
8.3.5
n_10=0;p=l;
do
{
n_10=n_10+n%10*p;
p*=b;
}
while(n);
cout<<n_10;
8.3.6
n/=10;
nr=0;nl=n;
do
{
if(nl%10==a) nr++;
nl/=10;
}
while(nl);
cout<<"\nCifra "<<a<<" apare de "<<nr<<" ori";
8.3.7
8.3.8
cmax=0;nl=n;
do
{
if(cmax<n%10)
58
cmax=nl%10;
nl/=10;
}
while (nl) ;
cout<<"\ncmax="<<cmax;
Instruciunea break
8.4.2
Instruciunea continue
8.4.3
do
{
instructiune1;
instructiune2;
if (expresie2)
break;
else
continue;
instructiune3;
}
while (expresie1);
while (expresie1)
{
instructiune1;
instructiune2;
if (expresie2)
break;
else
continue;
instructiune3;
}
for (expr1;expr2;expr3)
{
instructiune1;
instructiune2;
if (expresie2)
break;
else
continue;
instructiune3;
}
59
S se scrie un program care citete o cifr din intervalul [1,7] i afieaz denumirea
zilei din sptmn corespunztoare cifrei respective (1-luni, 2-mari, etc.).
#include <stdio.h>
#include <stdlib.h>
void main( )
{
int i;
scanf("%d", &i);
switch(i)
{
case 1: puts("luni");break;
case 2: puts("marti");break;
case 3: puts("miercuri"); break;
case 4: puts("joi"); break;
case 5: puts("vineri"); break;
case 6: puts("simbata"); break;
case 7: puts("duminica"); break;
default: puts("Valoare gresita !");exit(1);
}
}
8.5.2
60
PROBLEME PROPUSE
61
62
DECLARAIA DE TABLOU
9.
TABLOURI UNIDIMENSIONALE
Numim tablou o colecie (grup, mulime ordonat) de date, de acelai tip, situate
ntr-o zon de memorie continu (elementele tabloului se afl la adrese succesive i
pot fi referite prin indici.).
Unui tablou i se d un nume; tipul comun al elementelor este i tipul tabloului
respectiv. De exemplu, o mulime ordonat de ntregi reprezint un tablou de tip
ntreg.
n cazul n care elementele care se grupeaz ntr-un tablou sunt ele nsele
tablouri vom avea nevoie de mai muli indici pentru a ne referi la ele; n acest caz
avem un tablou multidimensional (n-dimensional, n fiind numrul de indici), altfel
- tablou unidimensional.
Exemple simple de tablouri unidimensionale sunt vectorii cu componentele de
acelai tip. O matrice este un tablou bidimensional.
Referirea la elementele unui tablou se face printr-o variabil cu indici. O
variabil cu indici se compune din numele tabloului urmat de valorile indicilor,
fiecare indice fiind reprezentat de o expresie inclus ntre paranteze ptrate.
Valoarea inferioar a indicilor este 0, iar cea superioar este (dimensiunea-1). De
exemplu, dac vect este un tablou cu 10 elemente (de dimensiune 10), atunci ne
referim la elementele lui cu ajutorul variabilelor cu indici:
vect[0]
primul element
............
vect[9]
ultimul element
Dac mat este o matrice de 3 linii a dou coloane fiecare, atunci elementele vor
fi referite prin:
mat[0][0] mat[0][1]
prima linie
mat[1][0] mat[1][1]
a doua linie
mat[2][0] mat[2][1]
a treia linie
63
TABLOURI UNIDIMENSIONALE
9.2 Vectori
Vectorii sunt tablouri unidimensionale. Declararea (i eventual iniializarea) lor se
face astfel:
tip nume_tabl[lim_1] = {lista valori}
Ex.:
int v[3]; float vec[2] = {66.1, 39.7} //Tablou unidimensional
numit vec[2] cu 2 elemente reale, initializat
9.3 Exemple
9.3.1
9.3.2
9.3.3
64
EXEMPLE
#include<conio.h>
void main()
{
int i,N;
float temp,suma,media,min,max,a[100];
clrscr();
printf("Dati nr. de elem ale sirului N=");
scanf("%2d",&N);
for(i=0;i<N;i++)
{
printf("A[%2d]=",i);
scanf("%f",&temp);
a[i]=temp;
}
min=a[0];max=a[0];//initializare min si max cu valoarea
primului element
for(i=1;i<N;i++)//de la al doilea element
{
if(a[i]<min) min=a[i];
if(a[i]>max) max=a[i];
}
suma=0;
for(i=0;i<N;i++)
suma+=a[i];
media=float(suma)/N;
printf("Valoarea minima a sirului MIN =%g\n",min);
printf("Valoarea maximii a siruJui MAX =%g\n",max);
printf("Suma elementelor sirului SUMA =%g\n",suma);
printf("Valoarea medie a sirului MED =%g\n",media);
N=getche();
}
9.3.4
9.3.4.1
Programul
#include<iostream.h>
void main()
{
unsigned n,i; float a[100],b[100],p;
cout<<\nDati dimensiunea:;cin>>n;
for (i=0;i<n;i++)
{ cout<<a[<<i<<]; cin>>a[i]; }
for (i=0;i<n;i++)
{ cout<<b[<<i<<]; cin>>b[i]; }
p=0;
for (i=0;i<n;i++) p+=a[i]*b[i];
cout<<Produsul=<<p;
}
65
TABLOURI UNIDIMENSIONALE
9.3.5
9.3.5.1
Pseudocodul
1. CITETE n
2. PENTRU i=0,n-1 CITETE v[i]
3. m=n, sort=0
4. CT TIMP (m>0) I (sort=0)
4.1. sort=1
4.2. PENTRU i=0,m-1
DAC (v[i]>v[i+1])
4.2.1. sort=0
4.2.2. aux=v[i]
4.2.3. v[i]=v[i+1]
4.2.4. v[i+1]=aux
4.3. m=m-1
5. PENTRU i=0,n-1 SCRIE v[i]
9.3.5.2
Programul
//Sortarea elementelor unui vector
#include<iostream.h>
void main()
{
int i,n,m,sort=0,v[10],aux;
cout<<"\nDati dimens vect n: ";cin>>n;
for(i=0;i<n;i++)
{
cout<<"Elem v["<<i<<"]= "; cin>>v[i];
}
m=n;
while((m>0)&&(sort==0))
{
sort=1;
for(i=0;i<m-1;i++)
if(v[i]>v[i+1])
{
sort=0;
aux=v[i]; v[i]=v[i+1]; v[i+1]=aux;
}
m--;
}
for(i=0;i<n;i++)
cout<<"\nv["<<i<<"]= "<<v[i];
}
66
EXEMPLE
9.3.6
Casierul automat
TABLOURI UNIDIMENSIONALE
rest %= valori[i];
}
for(i=0; i<13; i++)
if(cantitati[i])
printf ("Avem %d
cantitati[i], valori[i]);
getch();
}
9.3.7
bancnote
de
valoare
9.3.7.1
Pseudocodul
1 CITETE g,x
2 i=0
3 CT TIMP i<n
3.1 CITETE p[i]
3.2 i=i+1
4 v=p[0], xi=x, i=1 // v reprezinta valoarea, iar xi reprezinta xi
5 CT TIMP i<n
5.1 xi=xi*x
5.2 v=v+xi*p[i]
5.3 i=i+1
6 SCRIE v
9.3.8
9.3.8.1
Pseudocodul
1 CITETE g1,g2
2 i=0
3 CT TIMP i<g1
3.1 CITETE p1[i]
3.2 i=i+1
4 i=0
5 CT TIMP i<g2
5.1 CITETE p2[i]
5.2 i=i+1
6 i=0
7 CT TIMP i<(g1+g2)
7.1 q[i]=0
7.2 i=i+1
8 i=0
9 CT TIMP i<g1
9.1 j=0
9.2 CT TIMP j<g2
68
%ld\n",
EXEMPLE
9.3.9
Dndu-se trei numere ntregi reprezentnd data unei zile (an, lun, zi), s se
stabileasc a cta zi din an este aceasta.
9.3.9.1
Rezolvare
Definim doi vectori ce conin numrul de zile din fiecare lun i numele fiecrei
luni (de fapt, vom defini trei vectori, deoarece numrul de zile din luna februarie este
diferit n anii normali i cei biseci). Nu rmne dect s facem o simpl adunare.
9.3.9.2
Programul
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
void main (void)
{
// Numarul de zile din fiecare luna (an normal si bisect)
const int zile[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31,
30, 31};
const int zile_b[] = {31, 29, 31, 30, 31, 30, 31, 31, 30,
31, 30, 31};
// Numele fiecarei luni
const char nz[12][15] = {"Ianuarie", "Februarie", "Martie",
"Aprilie", "Mai", "Iunie", "Iulie", "August", "Septembrie",
"Octombrie", "Noiembrie", "Decembrie"};
int an, luna, zi;
int nr_zilei = 0;
int index;
// Indexul lunii curente
// Citim datele de intrare
printf("Introduceti anul:"); scanf("%d",&an);
printf("Introduceti luna:"); scanf("%d",&luna);
printf("Introduceti ziua:"); scanf("%d",&zi);
// Testam daca anul este bisect
if((an%4==0) && ((an%100!=0)||(an%400==0)))
{
// Adaugam lunile anterioare
for(index=0;index<luna-1;index++)
nr_zilei += zile_b[index];
// Adaugam numarul zilei din luna curenta
69
TABLOURI UNIDIMENSIONALE
nr_zilei += zi;
}
else
{
// Adaugam lunile anterioare
for(index=0; index<luna-1;index++)
nr_zilei += zile[index];
// Adaugam numarul zilei din luna curenta
nr_zilei += zi;
}
// Afisare rezultate
printf("Ati introdus ziua de %d %s, a %d-a zi din %d\n", zi,
nz[luna-1], nr_zilei, an);
getch();
}
70
EXEMPLE
10.1.1
10.1.2
Palindrom
IRURI DE CARACTERE
long n;
char sir1[100], sir2[100];
printf("Introduceti numarul: ");
scanf("%ld",&n);
ltoa(n,sir1,10); //transforma numarul in sir
strcpy(sir2,sir1);
strrev(sir2); //inverseaza ordinea caracterelor din sir
if(strcmp(sir1,sir2)==0)
puts("\nNumarul este palindrom!");
else
puts("\nNumarul nu este palindrom!");
}
10.1.3
Rime cuvinte
10.1.4
72
EXEMPLE
10.1.4.1 Programul
#include <stdio.h>
#include <string.h>
#define MAX 100
void main () /* citeste o succesiune de cuvinte si-l afiseaza
pe cel mai lung dintre ele */
{
int max=0,i; char cuvant[MAX+1]; char cuvant_max[MAX+1];
printf("\nIntroduceti cuvintele urmate de Ctrl-Z: \n");
while(scanf("%100s",cuvant) != EOF)
if(max < (i=strlen(cuvant)))
{ max = i; strcpy(cuvant_max,cuvant);}
if(max)
printf("Cel mai lung cuvant: %s", cuvant_max);
}
Obs.:
1. Cuvntul citit se pstreaz n tabloul cuvant de MAX+1 elemente. La citire
se utilizeaz specificatorul de format: %100s care permite s se citeasc cel mult
100 de caractere diferite de cele albe. Funcia scanf pstreaz caracterul NULL
dup ultimul caracter citit. Deci, un cuvnt de 100 de caractere ocup 101 octei.
2. Dup citirea unui cuvnt, se apeleaz funcia strlen pentru a determina
numrul caracterelor citite prin scanf i pstrate n tabloul cuvant. n acest caz sa utilizat expresia:
i = strlen(cuvant)
Apoi se compar lungimea cuvntului citit cu max.
Variabila max are ca valoare lungimea maxim a cuvintelor citite naintea celui
curent. Iniial max = 0, deoarece nu exist nici un cuvnt citit. Dac max este mai
mic dect lungimea cuvntului citit curent, atunci lui max i se atribuie aceast
valoare, iar cuvntul citit este transferat n zona de memorie alocat tabloului
cuvnt_max. n acest scop se apeleaz funcia strcpy:
strcpy(cuvant_max, cuvant);
10.1.5
IRURI DE CARACTERE
if(scanf("%100s",cuv1) != 1)
{ printf("nu s-a tastat un cuvant\n"); exit(1); }
if(scanf("%100s",cuv2) != 1)
{ printf("nu s-a tastat un cuvant\n"); exit(1); }
if(strcmp(cuv1,cuv2) < 0)
{
/* primul cuvant tastat este mai mic decit cel de-al
doilea */
printf("%s\n",cuv1) ; printf("%s\n",cuv2);
}
else
{ printf("%s\n",cuv2) ; printf("%s\n",cuv1); }
}
10.1.6
Eliminare vocale
74
PROBLEME PROPUSE
10.2.2
Se citete un cuvnt a cu cel mult 100 de litere. S se afieze pe linii separate toate
cuvintele care se pot forma prin eliminarea unei singure litere din cuvntul citit.
Ex: dac se citete cuvntul alin se vor afia: lin, ain, aln, ali
10.2.3
Interschimbare litere
10.2.4
Comparare cuvinte
75
TABLOURI MULTIDIMENSIONALE
11.1 Exemple
11.1.1
int mat1[2][3];
//Tablou bidimensional numit mat1 cu 2x3
elemente intregi
float mat2[10][10];
//Tablou bidimensional numit mat2 cu
10x10 elemente reale
11.1.2
11.1.3
11.1.4
este: 5 7 6 .
2 1 8
11.1.4.1 Programul
#include<stdio.h>
int c[5], mat1[5][5], mat[5][5],i, j, poz, max1, n=3;
76
EXEMPLE
void main()
{// Citire dimensiune
printf("Dimensiunea matricei: "); scanf("%d",&n);
// Citire matrice
printf("Elementele matricei: ");
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&mat[i][j]);
// Aflarea maximelor pe linii
for(i=1;i<=n;i++)
{
// Se determina coloana poz a unui element de maxim al
liniei i
poz=1; max1=mat[i][1];
for(j=2;j<=n;j++)
{
if(mat[i][j]>max1)
{ max1=mat[i][j]; poz=j; }
c[i]=poz;
}
}
// Se verifica daca coloanele obtinute sunt unice
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
if(c[i]==c[j])
{puts ("Problema nu are solutie"); return; }
// Copierea liniilor cu maximul pe diagonala principala in
alta matrice
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
mat1[c[i]][j]=mat[i][j];
puts("O solutie este: ");
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf ("%5d",mat1[i][j]);
puts(" ");
}
}
11.1.5
11.1.5.1 Programul
#include<iostream.h>
void main()
{
unsigned m,n,j,i;
float a[10][10],b[10][10],c[10][10];
cout<<nr de linii:;cin>>m; cout<<nr de coloane:;cin>>n;
77
TABLOURI MULTIDIMENSIONALE
for (i=0;i<m;i++)
for (j=0;j<n;j++)
{ cout<<a[<<i<<,<<j<<]= ; cin>>a[i][j]; }
for (i=0;i<m;i++)
for (j=0;j<n;j++)
{ cout<<b[<<i<<,<<j<<]= ; cin>>b[i][j]; }
for (i=0;i<m;i++)
for (j=0;j<n;j++)
c[i][j]=a[i][j]+b[i][j];
for (i=0;i<m;i++,cout<<\n)
for (j=0;j<n;j++)
cout<<c[i][j]<<\t;
}
11.1.6
11.1.6.1 Pseudocodul
1. CITETE m, n, p
2. PENTRU i=1,m
PENTRU j=1,n
CITETE a[i][j]
3. PENTRU i=1,n
PENTRU j=1,p
CITETE b[i][j]
4. PENTRU i=1,m
PENTRU j=1,p
4.1
c[i][j]=0
PENTRU k = 1,n
4.2
c[i][j]= c[i][j] + a[i][k]*b[k][j]
5. PENTRU i=1,m
PENTRU j=1,p
SCRIE c[i][j]
78
PROBLEME PROPUSE
2.
3.
79
POINTERI I ADRESE
12.1 Exemple
12.1.1
Pointeri
//Pointeri - exemple
#include<iostream.h>
void main()
{
int x=5, y, *ptr;
80
EXEMPLE
un
int;
x,y-variabile
12.1.2
POINTERI I ADRESE
12.1.3
82
EXEMPLE
12.1.4
//Pointer la vector
#include <iostream.h>
#define DIM 3
void main()
{
int i; float tablou[DIM], *ptablou;
ptablou=tablou;
cout<<"Introduceti elementele tabloului\n";
for(i=0;i<DIM;i++)
{
cout<<"a("<<(i+1)<<")=";
cin>>tablou[i];
}
cout<<"Elementele tabloului sunt:\n";
for(i=0;i<DIM;i++)
cout<<"a("<<(i+1)<<")="<<*(ptablou+i)<<"\n";
}
12.1.5
#include<iostream.h>
#include<conio.h>
void main()
{int a[3][3]={{5,6,7}, {55,66,77}, {555,666,777}};
83
POINTERI I ADRESE
clrscr();
cout<<"a="<<a<<" &a="<<&a<<" &a[0]="<<&a[0]<<'\n';
cout<<"Pointeri catre vectorii linii\n";
for (int i=0; i<3; i++){
cout<<" *(a+"<<i<<")="<<*(a+i);
cout<<" a["<<i<<"]="<<a[i]<<'\n';
}
// afiarea matricei
for (int i=0; i<3; i++){
for (int j=0; j<3; j++)
cout<<*(*(a+i)+j)<<'\t'; //sau: cout<<*(a[i]+j)<<'\t';
cout<<'\n';
}
}
12.1.6
//Pointer la matrice
#include <iostream.h>
#define DIM1 3
#define DIM2 2
float cere_element(int i,int j)
{
float elem;
cout<<"a("<<(i+1)<<","<<(j+1)<<")=";
cin>>elem;cout<<"\n";
return elem;
}
void afis_tablou(float **ptablou)
{
int i,j;
for(i=0;i<DIM1;i++)
for(j=0;j<DIM2;j++)
cout
<<"a("
<<(i+1)
<<","
*((*ptablou)+i*DIM2+j)<< "\n";
}
<<(j+1)<<
void main()
{
float tablou[DIM1][DIM2];
int i,j; float *ptablou;
ptablou=*tablou;
cout<<"Introduceti elementele tabloului\n";
for(i=0;i<DIM1;i++)
for(j=0;j<DIM2;j++)
tablou[i][j]=cere_element(i,j);
cout<<"Elementele tabloului sunt:\n";
afis_tablou(&ptablou);
84
")="
<<
PROBLEME PROPUSE
85
13.2.1
86
13.2.2
13.2.3
87
13.4 Exemple
13.4.1
88
EXEMPLE
float a;
if (x>y) a=x; else a=y;
return a;
}
13.4.2
Schimbarea valorilor a
parametrilor unei funcii
dou
variabile
transferul
13.4.3
Cel mai mare ptrat perfect mai mic sau egal cu un numr
dat
89
#include
#include
#include
#include
<stdio.h>
<stdlib.h>
<conio.h>
<math.h>
// Calculeaza cel mai mare patrat perfect mai mic sau egal cu
a
int patrat (int a)
{
int i=0;
while(i*i<=a)
i += 1;
return (i*i>a)?(i-1)*(i-1):i*i;
}
void main (void)
{
int n, a;
clrscr () ;
printf("Introduceti nr de valori: "); scanf("%d",&n);
// Prelucrare date si afisare rezultate
for(int i=0;i<n;i++)
{
printf("Introduceti elementul %d: ",i+1);
scanf("%d", &a);
printf("Patratul perfect mai mic sau egal cu %d este:
%d\n", a, patrat(a));
}
getch();
}
13.4.4
Perechi
90
EXEMPLE
{
int div;
for (div=2; div*div<=n; (div==2) ? div=3 : div+=2)
if(n%div==0) return 0;
return 1;
}
void main (void)
{
int n;
int a, b;
// Citire date de intrare
printf ("Introduceti numarul de perechi: ");
scanf ("%d", &n);
for(int i=0; i<n; i++)
{
printf (" Introduceti perechea %d: ", i);
scanf("%d%d", &a, &b);
if (prim(cmmdc(a, b)))
printf("cmmdc(%d,%d)=%d\n", a, b, cmmdc(a,b));
}
getch();
}
13.4.5
13.4.5.1 Programul
//Minimul elementelor unui tablou
#include <iostream.h>
#define DIM 5
float min2v(float a,float b)
{return (a<b?a:b);}
int sorttab(float tablou[DIM])
{
int i,indmin; float valmin;
valmin=tablou[0]; indmin=0;
for(i=1;i<DIM;i++)
{
valmin=min2v(valmin,tablou[i]);
if(valmin==tablou[i]) indmin=i;
}
return indmin;
}
void tiptab(float tablou[DIM])
{
int i;
for(i=0;i<DIM;i++)
91
cout<<"tabl("<<i<<")="<<tablou[i]<<"\n";
void main()
{
float tabl [DIM]; int imin,i;
cout<<"introduceti elementele tabloului\n";
for(i=0;i<DIM;i++)
{
cout<<"tabl ("<<i<<")=";
cin>>tabl[i]; cout<<"\n";
}
cout<<"Tabloul initial\n";
tiptab(tabl);
imin=sorttab(tabl);
cout<<"Elementul minim din tablou este: tabl("<<imin<<")=
"<<tabl[imin]<<"\n";
}
13.4.6
13.4.6.1 Programul
//Operatii cu matrice realizate cu functii
#include<iostream.h>
#include<stdio.h>
#define DIM 10
void citire(int nl,int nc,int mat[DIM][DIM])
{
int i,j;
for(i=0;i<nl;++i)
{
cout<<"\n ***** Linia "<<i<<"\n";
for(j=0;j<nc;++j)
{
cout<<"Introduceti elementul ["<<i<<","<<j<<"]: ";
cin>>mat[i][j];
}
}
}
int suma(int mat1[DIM][DIM], int mat2[DIM][DIM],int
nc,int summat[DIM][DIM])
{
int i,j;
for(i=0;i<nl;++i)
{
for(j=0;j<nc;++j)
summat[i][j]=mat1[i][j]+mat2[i][j];
}
92
nl,int
EXEMPLE
return 0;
}
void prod(int mat1[DIM][DIM], int mat2[DIM][DIM], int m,int
n,int p,int prodmat[DIM][DIM])
{
int i,j,k;
for(i=0;i<m;++i)
for(j=0;j<n;++j)
{
prodmat[i][j]=0;
for(k=0;k<p;++k)
prodmat[i][j]=prodmat[i][j]+mat1[i][k]*mat2[k][j];
}
}
void afisare(int nl,int nc,int mat[DIM][DIM])
{
int i,j;
for(i=0;i<nl;++i)
{
for(j=0;j<nc;++j)
cout<<mat[i][j]<<" ";
cout<<"\n";
}
}
void main()
{
int m1[DIM][DIM], m2[DIM][DIM], sum[DIM][DIM];
int a,b,c,d,i,j; char selector;
cout<<"\nIntr. nr-le de linii si coloane pentru prima
matrice, m: ";cin>>a;
cout<<"
si n: ";cin>>b;
cout<<"\nIntr. nr-le de linii si coloane pentru a doua
matrice, m: ";cin>>c;
cout<<"
si n: ";cin>>d;
cout<<"\n\nPrima matrice:\n";
citire(a,b,m1);
cout<<"\n\nA doua matrice:\n";
citire(c,d,m2);
printf("Tastati:'s' pentru suma\n
'd' pentru
diferenta\n
'p' pentru produs\nAici: ");
cin>>selector;
switch (selector)
{
case's':
{
if ((a==c)&&(b==d))
{
93
suma(m1,m2,a,b,sum);
afisare(a,b,m1);
cout<<"\n +\n\n";
afisare(c,d,m2);
cout<<"\n=\n";
afisare(c,d,sum);
}
else
cout<<"Nu se poate efectua suma deoarece numerele de
linii si coloane au nereguli";
break;
}
case'd':
{
cout<<"FACETI VOI DIFERENTA";
break;
}
case'p':
{
if(b==c)
{
prod(m1,m2,a,d,b,sum);
afisare(a,b,m1);
cout<<"\n*\n\n";
afisare(c,d,m2);
cout<<"\n=\n\n";
afisare(a,d,sum);
}
break;
}
default: cout<<"Nu s-a introdus una din literele cerute
!";
}
}
13.4.7
94
EXEMPLE
#include <stdio.h>
#include <conio.h>
/*Functia citeste valorile elementelor unei matrice */
void citire (float ta[NMAX][NMAX], int ordin, char numev)
{
float temp;
printf("\nElementele matricei %c\n",numev);
for (int i = 1,j; i<ordin+1; i++)
for(j=1; j<ordin+1; j++)
{
printf("%c[%d,%d]= ",numev,i,j);
scanf ("%f",&temp); ta[i][j]=temp;
}
}
/*Functia scrie valorile elementelor unei matrice */
void scriere(float ta[NMAX][NMAX], int ordin, char numev)
{
int trec;
printf("\nAfisarea
valorii
elementelor
pentru
matricea
%c:\n",numev);
trec=1;
for(int i=1,j; i<ordin+1; i++)
for(j=1; j<ordin+1; j++)
{
printf("%c[%d,%d]= %f",numev, i,j,ta[i][j]);
if(trec++==ordin)
{printf("\n"); trec=1;}
else printf("\t");
}
printf("\nApasa orice tasta!");getch();
}
/*Functia efect ridicarea la patrat, a unei matrice */
void patrat(float ta[NMAX][NMAX],float tb[NMAX][NMAX],
ordin)
{
for (int i=1,j,k; i<ordin+1; i++)
for(k=1; k<ordin+1; k++)
{
tb[i][k]=0.0;
for(j=1; j<ordin+1; j++)
tb[i][k]+=ta[i][j]*ta[j][k];
}
}
int
13.4.8
//Pointer la vector
#include <iostream.h>
#define DIM 3
float cere_element(int i)
{float elem;
cout<<"a("<<(i+1)<<")=";
cin>>elem; cout<<"\n";
96
EXEMPLE
return elem;
}
void afis_tablou(float *ptablou)
{int i;
for(i=0;i<DIM;i++)
cout<<"a("<<(i+1)<<")="<<*(ptablou+i)<<"\n";
}
void main()
{
float tablou[DIM];
int i;
float *ptablou;
ptablou=tablou;
cout<<"Introduceti elementele tabloului\n";
for(i=0;i<DIM;i++) tablou[i]=cere_element(i);
cout<<"Elementele tabloului sunt:\n";
afis_tablou(ptablou);
}
13.4.9
//Pointer la matrice
#include <iostream.h>
#define DIM1 3
#define DIM2 2
float cere_element(int i,int j)
{
float elem;
cout<<"a("<<(i+1)<<","<<(j+1)<<")=";
cin>>elem;cout<<"\n";
return elem;
}
void afis_tablou(float **ptablou)
{
int i,j;
for(i=0;i<DIM1;i++)
for(j=0;j<DIM2;j++)
cout
<<"a("<<(i+1)<<","<<(j+1)<<")="<<*((*ptablou)+i*DIM2+j)<<"\n"
;
}
void main()
{
float tablou[DIM1] [DIM2];
int i,j; float *ptablou;
ptablou=*tablou;
97
98
EXEMPLE
14.1 Exemple
14.1.1
Derivata unei funcii ntr-un punct reprezint panta tangentei la graficul funciei n
punctul respectiv, adic:
f(x) - f(x-h)
f'(x) = lim
h
h0
14.1.1.1 Programul
//Calculul derivatei unei functii
#include <stdio.h>
#include <math.h>
double fd(double);
double deriv(double,double,double(*)(double));
void main()
{
double d,x,h;
printf("\nx= ");
scanf("%lf",&x);
for(h=0.1;h>=1e-06;h/=10)
{
d=deriv(x,h,fd);
printf("\nx=%f; h= %f; d= %lf",x,h,d);
}
printf("\nx=%f;
d= %lf",x,-sin(x));
}
double deriv(double x,double h,double (*f)(double))
{
double it;
it=((*f)(x)-(*f)(x-h))/h;
return it;
}
double fd(double x)
{ return cos(x); }
99
14.1.2
Relaia de calcul:
b
f(a)+f(b) +f(a+h) +f(a+2h)+f(a+(n-1)h) ,
I=
f(x) dx = h
2
b-a
unde: h = n , n fiind numrul de diviziuni
f(x)
x
h
a
x1
x2
xn-1
14.1.2.1 Programul
//Calculul integralei prin metoda trapezelor
#include <stdio.h>
#include <math.h>
double fc(double);
double ing(double,double,double(*)(double));
void main()
{
double i,a,b;
printf("\nLimitele a,b: ");
scanf("%lf %lf",&a,&b);
i=ing(a,b,fc);
printf("\na=%f; b=%f; i= %lf",a,b,i);
}
double ing(double x,double y,double (*f)(double))
{
int n=120,k;
double it,h,S;
h=(y-x)/n;
100
EXEMPLE
for(k=1,S=0.0;k<n;k++)
S=S+(*f)(x+k*h);
it=(h/2)*((*f)(x)+(*f)(y))+h*S;
return it;
}
double fc(double x)
{ return x*x; }
14.1.3
float xs=0,xd=5,sol,eps=1e-05;
float f(float x)
{ return cos(x)-x;}
float bisec(float xs, float xd, float eps, float (*f)(float))
{
float x,ys,y,yd; int it=0,it_lim=100,gata=0;
ys=f(xs);
yd=f(xd);
if(ys*yd>0)
{ printf("f(xs)*f(xd) > 0"); x=0;}
else
{
while(!gata)
{
gata=0;
it++;
x=(xs+xd)/2;
y=f(x);
printf("%2d
%8.5f
%8.5f
%8.5f
%8.5f
%8.5f
%8.5f\n",it,xs,x,xd,ys,yd,fabs((yd-ys)/2));
if(it>it_lim)
{printf("\nS-a
depasit
numarul
maxim
de
iteratii !"); gata=1;
}
else
if(fabs(x-xs)<eps) gata=1;
else
{if(ys*y<=0) {xd=x; yd=y;}
else
{xs=x; ys=y;}
}
}
}
return x;
}
void main()
{
clrscr();
printf(" it
xs
x
xd
f(xs)
f(xd)
|f(xd)-f(xs)|/2\n");
printf("-------------------------------------------------------------\n");
sol= bisec(xs, xd, eps, f);
printf("\nRadacina aproximata x= %g radiani",sol);
}
102
FUNCII PREDEFINITE
Este bibliotec care conine toate funciile matematice. Unele dintre cele mai
utilizate sunt prezentate n urmtorul tabel:
abs
sqrt
acos
asin
cos
cosh
exp
Sintaxa
double
abs
(double x)
double
(double
double
(double
double
(double
sqrt
x)
acos
x)
asin
x)
double
cos
(double x)
double cosh
(double x)
double
exp
(double x)
Ce returneaza
valoarea
absolut a
unui numr
real
Exemplu
#include <iostream.h>
#include <math.h>
void main(void)
{ int number = -1234;
cout<<"valoarea
absoluta
a
nr."<<number<<=<<abs(number));}
radical
arccosinus
arcsinus
cosinus (la
toate funciile
trigonometrice
argumentul e
n radiani)
#include <iostream.h>
#include <math.h>
void main(void)
{ double result, x = 0.5;
result = cos(x);
cout<<"cos("<<x<<)=<<result);}
cosinus
hiperbolic
exponeniala
floor
double floor
(double x)
rotunjire prin
lips
ceil
double ceil
(double x)
rotunjire prin
adaus
#include <stdio.h>
#include <math.h>
void main(void)
{ double number=123.54; double
down,
up;
down=floor(number);
up=ceil(number);
cout<<"numarul
original="<<number<<"nr.rotunjit
prin
lipsa<<down<<"nr.rotunjit
prin adaus<<up;}
103
Nume
Sintaxa
Ce returneaza
fmod
double fmod
(double
x,double y)
restul
mpririi lui x
la y
hypot
double hypot
(double
x,double y)
ipotenuza
triunghiului
de catete x i y
calculeaz
produsul
dintre primul
parametru i 2
la puterea
dat de cel de
al doilea
parametru
ldexp
log
log10
pow
pow10
sin
sinh
tan
tanh
double
ldexp(double
x, int exp);
double
log(double
x);
double
log10(double
x);
double
pow(double
x,
double
y);
double
pow10(int
p);
double
sin(double
x);
double
sinh(double
x);
double
tan(double
x);
double
tanh(double
x);
14.2.2
Exemplu
#include <stdio.h>
#include <math.h>
void main(void)
{ double x=5.0, y = 2.0; double
result; result=fmod(x,y);
cout<<"restul
lui"<<x<<la<<y<<=<<result;}
#include <stdio.h>
#include <math.h>
int main(void)
{ double value; double x=7;
/* ldexp ridica 2 la puterea 3
apoi inmulteste rezultatul cu 7*/
value
=
ldexp(x,3);
cout<<"ldexp="<<value;}
logaritm
natural
logaritm
zecimal
puterea unui
numr la alt
numr
puterea lui 10
la un numr
ntreg
sinus
sinus
hiperbolic
sin_hyp = sinh(x);
sin_hyp = (exp(x) - exp(-x))/2
tangenta
tangenta
hiperbolic
104
FUNCII PREDEFINITE
strcat
Sintaxa
strcat(s1,s2)
Ce face
Concateneaz
irul s2 la
sfritul irul
s1
Exemplu
#include <string.h>
#include <stdio.h>
int main(void)
{
char destination[25];
char *blank = " ", *c =
"C++", *turbo = "Turbo";
strcpy(destination,
turbo);
strcat(destination,
blank);
strcat(destination, c);
printf("%s\n",
destination);
}
#include <string.h>
#include <stdio.h>
int main(void)
{
char *buf1 = "aaa",
*buf2 = "bbb", *buf3 =
"ccc";
int ptr;
strcmp
strcmp(s1,s2)
Comparare
de iruri; d
valoarea
0
dac s1=s2,
negativ dac
s1<s2
i
pozitiv dac
s1>s2.
ptr
=
strcmp(buf2,
buf1);
if (ptr > 0)
printf("buffer
2
is
greater
than
buffer
1\n");
else
printf("buffer
2
is
less than buffer 1\n");
ptr
=
strcmp(buf2,
buf3);
if (ptr > 0)
printf("buffer
2
is
greater
than
buffer
3\n");
else
printf("buffer
2
is
less than buffer 3\n");
}
105
Nume
Sintaxa
Ce face
strcpy
strcpy(s1,s2)
Copiaz irul
s2 n s1
strlen
strlen(s1)
Determina
lungimea
sirului s1
14.2.3
Exemplu
#include <stdio.h>
#include <string.h>
int main(void)
{
char string[10]; char
*str1 = "abcdefghi";
strcpy(string,
str1);
printf("%s\n", string);
}
#include <stdio.h>
#include <string.h>
int main(void)
{
char *string = "Borland
Internat";
printf("%d\n",
strlen(string));
}
Sintaxa
double
atof(const
char *s);
atol
long
atol(const
char *s);
atoi
int atoi(const
char *s);
itoa
char* itoa(int
value;char*
string;int
radix);
106
Ce face
conversia
unui ir la
real dubl
precizie
conversia
unui ir la
ntreg
long
conversia
unui ir la
ntreg
simplu
conversia
unui
ntreg la
ir
de
caractere
cu
lungimea
Exemplu
#include <iostream.h>
#include<stdlib.h>
void main (void)
{ long l;
char*
str=9876;
l=atol(str);
cout<<atol(<<str<<)=<<l;}
#include <stdlib.h>
#include <iostream.h>
void main(void)
{
int
n=123;
char
str[5];
itoa(n,str,4);
cout<<itoa(<<n<<)=<<str;}
FUNCII PREDEFINITE
Nume
Sintaxa
ltoa
char*
ltoa(long
value;char*
string;int
radix);
ultoa
char*
ultoa(unsigned
long
value;char*
string;int
radix);
ftoa
char*
ftoa(float
value;char*
string;int
radix);
rand
int rand(void)
random
int
num)
rand(int
Ce face
dat de al
treilea
parametru
conversia
unui
ntreg
long la ir
de
caractere
cu
lungimea
dat de al
treilea
parametru
conversia
unui
ntreg
unsigned
long la ir
de
caractere
cu
lungimea
dat de al
treilea
parametru
conversia
unui real
dubl
precizie la
ir
de
caractere
cu
lungimea
dat de al
treilea
parametru
genereaz
un numr
aleator
cuprins
ntre 0 i
10000
genereaz
un numr
Exemplu
#include <stdlib.h>
#include <iostream.h>
void main(void)
{ int i;
cout<<zece nr aleatoare de
la 0 la 99; for (i=0; i<10;
i++) cout<<rand()%100<<\n;}
107
Nume
system
Sintaxa
void
system(char*
string)
Ce face
aleator
cuprins
ntre 0 i
num-1
Exemplu
lanseaz
n
execuie o
comand
DOS
#include <stdlib.h>
#include <iostream.h>
void main(void)
{
cout<<Continutul
directorului
curent:\n;
system("dir");}
14.4 Exemple
14.4.1
108
EXEMPLE
#include<stdio.h>
main()
{
float a,b,c,d;
cout<<"introduceti a: ";cin>>a;
cout<<"introduceti b: ";cin>>b;
cout<<"\nvaloarea lui "<<a<<" la puterea "<<b<<" este:
"<<pow(a,b);
cout<<"\nvaloarea lui "<<10<<" la puterea "<<b<<" este:
"<<pow10(b);
cout<<"\nvaloarea log nat din "<<b<<" este: "<<log(b);
cout<<"\nvaloarea log zecimal din "<<b<<" este: "<<log10(b);
cout<<"\nvaloarea lui e la puterea "<<b<<" este: "<<exp(b);
cout<<"\nvaloarea lui "<<a<<"*2 la "<<b<<" e: "<<ldexp(a,b);
cout<<"\nvaloarea
absoluta
a
nr
real
"<<b<<"
este:
"<<fabs(b);
cout<<"\nvaloarea partii intregi a nr real "<<b<<" este:
"<<floor(b);
}
14.4.2
#include <iostream.h>
#include <string.h>
void main()
{
char sir1[] = abcd, sir2[] = abcde, sir3 = "abcdef, sir4
= "de;
cout<<strcmp(sir1, sir2)<<\n; // afisare:-101
// e = 101, a = 97, d = 100
//0 - e = -101
cout<<strcmp(sir2, sir1)<<\n; //afisare: 101
cout<<strcmp(sir1, "")<< '; //compararea variabilei sir1 cu
constanta sir vid
char str1[20]=hello;
char str2[20]=goodbye;
char str3[20];
int difer, lungime;
cout<<str1=<<str1<< str2=<<str2<<\n;
difer=strcmp(str1, str2);
if (difer == 0)
cout<<Siruri echivalente!\n;
else if (difer>0)
cout<<str1<< mai mare (lexicografic) dect <<str2<<\n;
else
cout<<str1<< mai mic (lexicografic) dect <<str2<<\n;
cout<<str1=<<str1<<\n; cout<<str3=<<str3<<\n;
strcpy (str3, str1); cout<<str1=<<str1<<\n;
109
cout<<str3=<<str3<<\n;
strcat (str3, str1);
cout<<str1=<<str1<<\n;
cout<<str3=<<str3<<\n;
}
110
15.1.1.1
Programul
111
FUNCII RECURSIVE
//Analiza combinatorica
#include<stdio.h>
int fact (int n)
{
if (n==0) return 1.0;
else return n*fact(n-1);
}
void main()
{
int n,m,p,A,C;
printf("\nintroduceti n=");
scanf("%d",&n);
printf("introduceti m=");
scanf("%d",&m);
p=fact(n);
A=fact(n)/fact(n-m);
C=fact(n)/(fact(m)*fact(n-m));
printf ("%d! =%d",n,p);
printf ("\nA(%d,%d) = %d",n,m,A);
printf ("\nC(%d,%d) = %d",n,m,C);
}
15.1.2
112
15.1.3
113
FUNCII RECURSIVE
15.1.4
114
p[i]=j;
poz[j]=1;/* selectam elementul j pe pozitia i */
if(i==n)/*Daca s-au generat toate pozitiile se afiseaza
solutia*/
{
for(k=1;k<=n;k++) printf("%d",p[k]);
printf("\t");
}
else permutare(i+1);
poz[j]=0; /* deselectam elementul j */
}
}
Varianta a doua va defini funcia recursiv permuta de generare a
permutrilor, care face generarea tuturor permutrilor prin interschimbarea
elementului de pe poziia curent k, pe rnd cu elementele din poziiile anterioare,
de la 1 la k-1. Cnd se ajunge la prima poziie, se tiprete permutarea generat.
//Generarea tuturor permutarilor unei multimi.
#include <stdio.h>
int a[100] ;
int n, k, i ;
void tipareste(int n)
{
int i;
for (i=1;i<=n;i++)
printf ("%d ", a[i]);
putchar('\n');
}
void permuta(int k)
{
int i;
if (k==1) tipareste (n);
else
{
permuta(k-1) ;
for (i=1;i<k;i++)
{
a[i] ^=a[k] ^=a[i] ^=a[k] ;
permuta(k-1);
a[i] ^=a[k] ^=a[ i] ^=a[ k] ;
}
}
}
void main()
{
printf("Introduceti n :" ) ;
scanf(" %d" , &n) ;
for(i=1; i<=n; i++) a[i] =i;
115
FUNCII RECURSIVE
permuta(n);
}
15.1.5
Problema reginelor
116
else scrie();
int ataca(int i)
{
int j;
for(j=1;j<=i-1;j++)
if(r[i]==r[j]||abs(r[i]-r[j])==abs(i-j)) return 1;
return 0;
}
void scrie()
{
int i,j;
textbackground(BLACK); clrscr();
printf("Solutia %d:\n",++nr);
for(i=1;i<=n;i++)
{
printf("\t");
for(j=1;j<=n;j++)
{
if(i%2==j%2) textbackground(WHITE) ;
else textbackground(BLACK);
if(r[i]==j) cprintf("R");
else cprintf(" ");
}
cprintf("\n\r");
}
printf("Ptr continuare apasati orice tasta!");
getch();
}
15.1.6
Problema rucsacului
Programul
117
FUNCII RECURSIVE
//Problema rucsacului
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define DIM 10
float gx, vx, gmax=9, vmax, g[DIM] = {0,1,2,4,5,8}, v[DIM] =
{0,5,9,12,15,25};
int s[DIM],smax[DIM],n=4;
void rucsac(int i) //i - nr curent max de obiecte
{
int j,k;
for(j=0;j<=1;j++)
/* Daca nu se depaseste greutatea maxima obiectul este
selectat */
if(gx+j*g[i]<=gmax)
{
/* Se actualizeaza greutatea si valoarea */
s[i]=j; gx+=j*g[i]; vx+=j*v[i];
/* Daca valoarea selectiei actuale este mai mare decat
maximul de pana acum se actualizeaza selectia de maxim */
if(vx>vmax)
{
vmax=vx;
printf("\nvmax=%5.2f: ",vmax);
for(k=1;k<=i;k++)
{
smax[k]=s[k];
printf("%2d*%4.2f(%4.2f)",smax[k],v[k],g[k]);
}
for(k=i+1;k<=n;k++)
{
smax[k]=0;
printf("%2d*%4.2f",smax[k],v[k]);
}
}
/*Apelul recursiv pentru trecerea la urmatorul obiect*/
if(i<n)
rucsac(i+1);
/*Refacerea starii dupa iesirea din recursivitate*/
gx-=j*g[i]; vx-=j*v[i];
}
}
void main()
{
int i; FILE *f;
clrscr();
/* Introducerea datelor */
//Citire din fisier
118
/* f=fopen("rucsac.txt","r");
fscanf(f,"%d",&n); fscanf(f,"%g",&gmax);
for(i=1;i<=n;i++)
fscanf(f,"%g %g",&g[i],&v[i]);
fclose(f);*/
gx=vx=0; vmax=-1;
/* Apelul recursiv */
rucsac(1);
/* Tiparirea solutiei maxime obtinute */
printf("\nValoarea
maxima:\t%g
\nGreut
max:\t%g
\nObiectele:\t",vmax, gmax);
for(i=1;i<=n;i++)
if(smax[i]==1)
printf("%d, ",i);
}
Observai modul n care s-a modificat programul atunci cnd se cere o
configuraie de optim:
1. n interiorul funciei recursive se face doar verificarea de optim i stocarea n
cazul ndeplinirii condiiilor de optim a datelor intermediare ntr-un set de date
separat;
2. tiprirea soluiei s-a fcut la ieirea din apelul recursiv i nu n interior.
15.1.7
Problema prjiturilor
Fiind date n tipuri de prjituri cu costul c[1], c[2], ..., c[n], s se determine toate
modurile posibile de a cumpra m prjituri care s nu depeasc suma s. Se
consider c pot fi cumprate oricte prjituri de un anumit tip.
Notaii fcute:
x, stocheaz cte prjituri s-au cumprat din fiecare tip;
suma, valoarea prjiturilor cumprate n momentul de fa;
nr, numrul de prjituri cumprate n momentul de fa.
n procedura recursiv rec, numrul maxim de prjituri care se pot cumpra
este minimul dintre numrul de prjituri rmase de cumprat, m, i numrul
posibil de cumprat cu suma rmas din prjiturile de tipul i, adic (s-suma)/c[i].
Datele se citesc din fiierul "prajitur.in", iar soluiile se scriu n fiierul
"prajitur.out".
15.1.7.1 Programul
//Prajituri
#include<iostream.h>
#include<fstream.h>
long x[100] ,c[100];
short k,i,j,n,m,nr;
unsigned nr_sol;
unsigned long s,suma;
fstream f;
119
FUNCII RECURSIVE
void rec(int i)
{
int max,j;
max=(s-suma)/c[i] ;
if(max>m-nr)
max=m-nr;
for(j=0;j<=max;j++)
{
suma+=c[i]*j;
nr+=j;
x[i]=j ;
if(suma<=s)
if(nr<m&&i<n) rec(i+1);
else if(nr==m)
{
//Tip ?rire
nr_sol++;
f<<"Suma totala: "<<suma<<endl;
for(k=1;k<=i;k++)
if(x[k]>0)
f<<"prajitura
"<<k<<"
de
"<<x[
k]<<"
ori\n";
f<<"-------------------------------------------\n";
}
nr-=j;
suma-=c[i]*j;
}
}
void main()
{
f.open("prajitur.in",ios::in);
f>>n; // Numarul de tipuri de prajituri:
f>>s; // suma data
f>>m; // numarul de prajituri pentru cumparat
for(i=1;i<=n;i++)
f>>c[i]; //costul fiecarei prajituri
f.close();
// Se deschide fisierul "prajitur.out" pentru
solutiilor
f.open("prajitur.out",ios::out);
nr_sol=0;
rec(1);
f<<"Numarul de solutii: "<<nr_sol ;
f.close();
}
120
scrierea
N din 4
Se tie c din numrul 4 se obine orice numr natural n scris n baza zece prin
aplicarea urmtoarelor operaii:
se scrie la sfrit cifra 4;
se adaug cifra 0;
se mparte la doi dac numrul este par.
Se cere s se scrie un program care produce un ir de numere conform regulilor
precedente n care primul numr este 4 iar ultimul este n.
Se pleac de la numrul n i se genereaz operaiile inverse celor menionate.
Programul este format din 2 funcii ntre care se face recursivitatea indirect:
proc2 - se nmulete numrul cu 2. Dac ultima cifr este 0 sau 4, se apeleaz
proc0, altfel se apeleaz proc2.
proc0 - se terge ultima cifr dac este 0 sau 4. Apelul recursiv este asemntor
cu proc0: dac ultima cifr este 0 sau 4 se apeleaz proc0, altfel se apeleaz
proc2.
#include<conio.h>
#include<stdio.h>
int n,a[100]; /*numarul initial si sirul de transformari*/
void proc2(int k);/*proceduri de transformare*/
void procO(int k);
void proc2(int k) /* se inmulteste numarul cu 2 */
{
int x;
if(k!=4)
{
a[++a[0]]=k*=2;
x=k%10;
if(x==0||x==4) procO(k);
else proc2(k);
}
}
void procO(int k) /* se elimina ultima cifra */
{
int x;
if(k!=4)
{
a[++a[0]]=k/=10;
x=k%10;
if(x==0||x==4) procO(k);
else proc2(k);
}
}
121
FUNCII RECURSIVE
void main(void)
{
int p;
printf("\nNumarul care se obtine: ") ; scanf("%d",&n) ;
a[1]=n;a[0]=1;
if(n!=4)
{
p=n%10;
if(p==0||p==4 ) procO(n);
else proc2(n);
}
printf("Sirul de numere este: ");
for(p=a[0];p>=1;p--) printf(" %d ",a[p]);
getch();
}
2.
3.
4.
5.
b
g(x)=
x2 + x + 1 *ln|x+a|dx + x*arctgb+x dx
a
6.
7.
122
PROBLEME PROPUSE
8.
j! +
sin(kx) ,
dac i<j
k 0
Ci,j =
xi,
i! + i
dac i=j
cos(kx) ,
dac i>j
k 0
123
16.1 Structuri
Structurile grupeaz date de tipuri diferite, constituind definiii ale unor noi tipuri
de date. Componentele unei structuri se numesc membrii (cmpurile) structurii. La
declararea unei structuri se pot preciza tipurile, identificatorii elementelor
componente i numele structurii.
Forma general de declarare a unei structuri:
struct identificator_tip_structura
{
lista_de_declaratii_membri;
} lista_identificatori_variabile;
n care:
struct este un cuvnt cheie (obligatoriu);
identificator_tip_structura reprezint numele noului tip (poate
lipsi);
lista_de_declaratii_membri este o list n care apar tipurile i
identificatorii membrilor structurii;
lista_identificatori_variabile este o list cu identificatorii
variabilelor de tipul declarat.
Membrii unei structuri pot fi de orice tip, cu excepia tipului structur care se
declar.
16.1.1
Punctul mediu
124
STRUCTURI
void main ()
{
punct2D a={0,3}, b={6,4}, c;
c=punct_mediu(a,b);
cout<<"\na("<<a.x<<","<<a.y<<")";
cout<<"\nb("<<b.x<<","<<b.y<<")";
cout<<"\nc("<<c.x<<","<<c.y<<")";
}
16.1.2
16.1.3
125
typedef struct{
double real;
double imag;
} COMPLEX;
double modul(COMPLEX *);//prototipul
void main()
{
COMPLEX nr;
clrscr();
while(scanf("%lf %lf",&nr.real,&nr.imag)==2)
printf("\nreal=%.2f
modul=%.2f",nr.real,nr.imag,modul(&nr));
getch();
}
imag=%.2f
16.1.4
Modul i argument
126
STRUCTURI
#include <stdio.h>
#include <math.h>
typedef struct {
double x;
double y; } COMPLEX;
double d_modul(COMPLEX *z)
/*calculeaza si returneaza modulul numarului complex z */
{ return sqrt(z->x*z->x+z->y*z->y) ;}
/* functia foloseste constanta M_PI=3.1415...
headerul math.h */
double d_arg(COMPLEX *z)
{
double a;
if(z->x==0 && z->y==0) return 0.0;
if(z->y==0)
if(z->x>0) return 0.0;
else /*y=0 si x<0 */ return M_PI;
if(z->x==0)
if(z->y>0) return M_PI/2;
else /*x=0 si y<0*/ return (3*M_PI)/2;
/*x!=0 si y!=0 */ a=atan(z->y/z->x);
if(z->x<0) /*x<0 si y!=0*/ return a+M_PI;
else /*x>0*/
if(z->y<0) /*x>0 si y<0*/ return 2*M_PI+a;
else /*x>0 si y>0*/ return a;
}
definita
in
16.1.5
Scriei o funcie avnd ca parametri dou date calendaristice (precizate prin an,
lun i zi), care stabilete una din situaiile:
Prima dat o precede pe cea de-a doua
Cele dou date sunt egale
A dou dat o precede pe prima
127
128
STRUCTURI
void main(void)
{
Data d1, d2;
do
{
printf("introduceti data d1 (zi luna an):\n");
scanf("%d %d %d", &d1.zi, &d1.luna, &d1.an);
if(!e_valida(d1))
printf("Data
nu
este
valida,
introduceti
corecta:\n");
}
while(!e_valida(d1));
do
{
printf("introduceti data d2 (zi luna an):\n");
scanf("%d %d %d", &d2.zi, &d2.luna, &d2.an);
if(!e_valida(d2))
printf("Data
nu
este
valida,
introduceti
corecta:\n");
}
while(!e_valida(d2));
switch(compara_date(d1,d2))
{
case -1: printf("d1 precede d2\n"); break;
case 0: printf("Datele sunt egale\n"); break;
case 1: printf("d1 urmeaza dupa d2\n");
}
}
16.1.6
una
una
<stdio.h>
<string.h>
<iostream.h>
<conio.h>
#define DIM_PAG
#define FALSE 0
#define TRUE 1
24
struct elev{
129
//sau
130
STRUCTURI
16.1.7
16.2 Uniuni
Aceeai zon de memorie poate fi utilizat pentru pstrarea unor obiecte (date) de
diferite tipuri, prin declararea uniunilor. Uniunile sunt similare cu structurile,
singura diferen constnd n modul de memorare. Declararea uniunilor:
union identificator_tip_uniune
{
lista de declaratii_membri;
} lista_identificatori_variabile;
Spaiul de memorie alocat corespunde tipului membrului de dimensiune maxim. Tipul
uniune folosete aceeai zon de memorie, care va conine informaii organizate n
mai multe moduri, corespunztor tipurilor membrilor.
//Uniuni
#include <iostream.h>
#include<conio.h>
union tip_dublu
{
int i; float f;
} ddata;
void main ()
{//ddata.f=1234.56e+5;
ddata.i=1234;
cout<<"ddata.f="<<ddata.f<<"\n";
cout<<"ddata.i="<<ddata.i<<"\n";
getch();
}
16.3.2
132
EXEMPLE UNIUNI
Vom folosi o structur pentru a memora numele, vrsta i sexul unei persoane,
indiferent dac aceasta este femeie sau brbat. Dar, n funcie de sex, persoana
respectiv va avea un so (dac e femeie), respectiv o soie (dac e brbat). O
nregistrare de tip union va fi folosit, aadar, pentru a memora partenerul unei
persoane oarecare.
O nregistrare union este similar cu o nregistrare de tip struct, cu excepia
faptului c union va permite s definii variabile (cmpuri) care s-i mpart
acelai spaiu de memorare.
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
union partener
{
char sotie[20];
char sot[20];
};
struct persoana
{
char nume[20];
char sex;
int varsta;
union partener p;
};
void Citeste(int nr_p, struct persoana *x)
{
int vs; char sx;
printf("Se citesc datele persoanei a %d-a:\n",nr_p);
fflush(stdin);
//goleste fluxul de date
printf("Dati numele: ");
gets(x->nume);
printf("Dati varsta: ");
scanf("%d",&vs);
x->varsta=vs;
fflush(stdin) ;
printf("Dati sexul: "); scanf("%c",&sx) ;
x->sex=sx;
fflush(stdin);
if (x->sex=='F'|| x->sex=='f')
{
printf("Dati numexe sotului: "); gets(x->p.sot);
}
else
{
printf("Dati numele sotiei: ");
gets(x->p.sotie);
}
}
133
16.3.3
Arii figuri
134
EXEMPLE UNIUNI
o triunghi.
n cazul primelor dou figuri, data de tip FIG conine o valoare de tip double
care, n cazul cercului reprezint lungimea razei acestuia, iar n cazul ptratului,
lungimea laturii ptratului. n cazul dreptunghiului, data conine dou elemente
de tip double: lungimea i limea. n sfirit, n cazul triunghiului, data conine
trei valori de tip double care reprezint lungimile celor trei laturi ale triunghiului.
Componenta tip definete elementele (figura) prezente ntr-o dat de tip FIG i
are valorile:
0 Pentru cerc
1
Pentru ptrat
2
Pentru dreptunghi
3 Pentru triunghi
-1
Pentru eroare.
n locul acestor valori, considerm constantele simbolice:
#define EROARE -1
#define CERC 0
#define PATRAT 1
#define DREPTUNGHI 2
#define TRIUNGHI 3
Funcia aria din program are ca parametru o dat de tip FIG, calculeaz i
returneaz aria figurii ale crei elemente sunt coninute n zona definit de
parametru. Funcia returneaz 0 n cazul n care datele sunt eronate.
La calculul arici unui triunghi se folosete formula lui Heron.
Funcia citire_fig din program are ca parametru un pointer spre o dat de
tip FIG i citete i pstreaz elementele figurii definite de componenta tip a datei
de tip FIG.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct {
int tip;
union {
double raza;
double lat_p;
double lat_d[2];
double lat_t[3];
} fig;
} FIG;
#define
#define
#define
#define
#define
EROARE -1
CERC 0
PATRAT 1
DREPTUNGHI 2
TRIUNGHI 3
#define PI 3.14159265358979
double aria(FIG *p)
/* calculeaza si returneaza aria figurii definite de
elementele prezente in zona spre care pointeaza p; la eroare
returneaza 0 */
135
{
double sp,a,b,c;
switch(p->tip)
{
case CERC: return PI*p->fig.raza*p->fig.raza;
case PATRAT: return p->fig.lat_p*p->fig.lat_p;
case DREPTUNGHI: return p->fig.lat_d[0]*p->fig.lat_d[1];
case TRIUNGHI: sp=(p->fig.lat_t[0] + p->fig.lat_t[1] +
p->fig.lat_t[2])/2;
if((a=sp - p->fig.lat_t[0]) > 0 && (b=sp - p>fig.lat_t[1]) > 0 && (c=sp - p->fig.lat_t[2]) > 0 )
return sqrt(sp*a*b*c);
else
{ /* cele 3 valori nu reprezinta lungimile laturilor
unui triunghi */
printf("a=
%g\tb=
%g\tc=
%g\tnu\
formeaza
un
triunghi\n",
p->fig.lat_t[0],
p->fig.lat_t[1],
p>fig.lat_t[2] );
return 0;
}
default:/* eroare */ return 0;
}/*switch*/
}
int citire_fig(FIG *p)
/* - citeste elementele figurii definite de p->tip; returneaza:
0 - la intilnirea sfirsitului de fisier sau la eroare;
1 - altfel. */
{
char t[255];
switch(p->tip)
{
case CERC:
for( ; ; )
{
printf("raza= ");
if(gets(t) == 0 ) return 0;
if(sscanf(t,"%lf",&p->fig.raza)==
1
&&
p>fig.raza>0) return 1;
printf("nu s-a tastat un numar pozitiv\n");
}
case PATRAT:
for( ; ; )
{
printf("latura patratului= ");
if(gets(t) == 0 ) return 0;
if(sscanf(t,"%lf",&p->fig.lat_p)==1
&&
p>fig.lat_p>0) return 1;
printf("nu s-a tastat un numar pozitiv\n");
}
136
EXEMPLE UNIUNI
case DREPTUNGHI:
for( ; ; )
{
printf("lungimea si latimea pe aceeasi linie: ");
if(gets(t)==0) return 0;
if(sscanf(t,"%lf
%lf",&p->fig.lat_d[0],
&p>fig.lat_d[1])==2 && p->fig.lat_d[0] > 0 && p->fig.lat_d[1] >
0)
return 1;
printf("nu s-au tastat 2 numere pozitive\n");
}
case TRIUNGHI:
for( ; ; )
{
printf("laturile triunghiului pe aceeasi linie: ");
if(gets(t) == 0 ) return 0;
if(sscanf(t,"%lf
%lf
%lf",&p->fig.lat_t[0],
&p>fig.lat_t[1], &p->fig.lat_t[2])==3 && p->fig.lat_t[0]>0 &&
p->fig.lat_t[1]>0 && p->fig.lat_t[2]> 0 ) return 1;
printf("nu s-au tastat 3 numere\ pozitive\n");
}
default: return 0;
}
}
void main ()
/* citeste o litera mare care defineste o figura geometrica,
apoi citeste elementele figurii respective;
- calculeaza si afiseaza aria acelei figuri. */
{
char t[255]; char er[]="s-a tastat EOF\n"; char lit[2]; FIG
f; double a;
for( ; ; )
{
printf("Tastati una din literele mari: C\tD\tP\tT\n");
if(gets(t)==0)
{ printf(er); exit(1); }
sscanf(t,"%ls",lit);
switch(lit[0])
{
case 'C': /* cerc */ f.tip = CERC; break;
case 'D': /* dreptunghi */ f.tip = DREPTUNGHI; break;
case 'P': /* patrat */ f.tip = PATRAT; break;
case 'T': /* triunghi */ f.tip = TRIUNGHI; break;
default: /* eroare */ printf("Nu s-a tastat una din
literele mari C,D,P sau T\n"); f.tip = EROARE;
}
if(f.tip != EROARE) break;
} /* sfirsit for */
/* citeste elementele figurii */
if(citire_fig(&f)==0)
137
{ printf(er); exit(1); }
/* calculeaza si afiseaza aria figurii */
if((a=aria(&f))==0)
exit(1);
printf("Aria figurii= %g\n", a);
}
16.4 Enumerri
Tipul enumerare permite programatorului s foloseasc nume sugestive pentru
valori numerice. De exemplu, n locul numrului unei luni calendaristice este mai
sugestiv s folosim denumirea lunii respective sau eventual o prescurtare:
ian - Pentru ianuarie n locul cifrei 1
feb - Pentru februarie n locul cifrei 2
i aa mai departe.
Un alt exemplu se refer la posibilitatea de a utiliza cuvintele FALS i
ADEVRAT pentru valorile 0, respectiv 1. n felul acesta se obine o mai mare
claritate n programele surs, deoarece valorile numerice sunt nlocuite prin
sensurile atribuie lor ntr-un anumit context.
n acest scop se utilizeaz tipul enumerare. Un astfel de tip se declar printr-un
format asemntor cu cel utilizat n cadrul structurilor. Un prim format general
este:
enum nume {nume0, nume1, nume2,..., numek} d1,d2,...,dn;
unde:
nume - este numele tipului de enumerare introdus prin aceast declaraie.
nume0, nume1,..., numek - sunt nume care se vor utiliza n continuare n
locul valorilor numerice i anume numei are valoarea i.
d1,d2,...,dn - sunt date care se declar de tipul nume. Aceste date sunt
similare cu datele de tip int.
Ca i n cazul structurilor, n declaraia de mai sus nu snt obligatorii toate
elementele. Astfel, poate lipsi nume, dar atunci va fi prezent cel puin d1. De
asemenea, poate lipsi n totalitate lista d1, d2, ..., dn, dar atunci va fi prezent nume.
n acest caz, se vor defini ulterior date de tip nume folosind un format de forma:
enum nume d1,d2,...,dn;
16.5 Exemple
16.5.1
enum { ileg, ian, feb, mar, apr, mai, iun, iul, aug, sep,
oct, nov, dec } luna;
Prin aceast declaraie, numrul lunii poate fi nlocuit prin denumirea
prescurtat a lunii respective. De exemplu, o atribuire de forma: luna = 3 se
138
DECLARAII DE TIP
poate nlocui cu una mai sugestiv: luna = mar deoarece, conform declaraiei de
mai sus, mar are valoarea 3.
n mod analog, o expresie de forma: luna == 7 este identic cu expresia: luna
== iul
Dac n locul declaraiei de mai sus s-ar fi utilizat declaraia de tip enumerare:
enum dl {ileg, ian, feb, mar, apr, mai, iun, iul, aug, sep,
oct, nov, dec };
atunci putem declara ulterior data luna de tip dl astfel: enum dl luna;.
Data luna declarat n acest fel este o dat identic cu data luna declarat la
nceput.
16.5.2
COMPLEX x, y;
16.7.1
Funcia malloc
Sintaxa:
void *malloc(size_t nr_octei_de_alocat);
Funcia malloc necesit un singur argument (numrul de octei care vor fi
alocai) i returneaz un pointer generic ctre zona de memorie alocat (pointerul
conine adresa primului octet al zonei de memorie rezervate).
16.7.2
Funcia calloc
Sintaxa:
void *calloc(size_t nr_elemente, size_t mrimea_n_octeti_
a_unui_elem);
Funcia calloc aloc memorie pentru un tablou de nr_elemente, numrul de
octei pe care este memorat un element este mrimea_n_octei_a_unui_elem i
returneaz un pointer ctre zona de memorie alocat.
16.7.3
Funcia realloc
void *realloc(void *ptr, size_t mrime);
140
EXEMPLE
16.8 Exemple
16.8.1
malloc
#include
#include
#include
#include
<iostream.h>
<malloc.h>
<string.h>
<stdlib.h>
void main()
{char *sirstoc="SIR DE STOCAT IN MEMORIE"; char **psir;
int nrart=5,i; char ch;
if((psir=(char **) malloc(nrart*sizeof(char*)))==NULL)
{cout << "Alocare esuata!\n"; exit(1);}
else
{for(i=0;i<nrart;i++)
if(
(psir[i] = (char *) malloc((strlen(sirstoc) + 1) *
sizeof(char)))== NULL
)
{cout << "Alocare esuata!\n"; exit(1);}
else strcpy(psir[i],sirstoc);
}
cout << "Sirul " << sirstoc << " a fost alocat in " << nrart
<< "blocuri distincte.\n"
for (i=0;i<nrart;i++)cout << psir[i] <<"\n";
cout << "Memoria pentru cele " << nrart << " blocuri " <<
sirstoc
<< \n";va fi eliberata apasind o tasta\n";
cin >> ch;
for(i=0;i<nrart;i++)free(psir[i]);
free(psir);
}
141
16.8.2
calloc
//calloc
#include <iostream.h>
#include <malloc.h>
float cere_element(int i)
{float elem;
cout << "a(" << (i+1) << ")="; cin >> elem; cout << "\n";
return elem;
}
void afis_tablou(int n,float *tablou)
{int i;
for(i=0;i<n;i++) cout << "a(" <<
*(tablou+i) << "\n";
}
(i+1)
<<
")="
<<
void main()
{int n,i; float *tablou;
cout << "Specificati numarul de elemente ale tabloului, n=";
cin >> n;
tablou=(float *)calloc(n,sizeof(float));
if(tablou!=NULL)
{cout << "\nIntroduceti elementele tabloului\n";
for(i=0;i<n;i++) *(tablou+i)=cere_element(i);
cout << " Elementele tabloului sunt:\n";
afis_tablou(n,tablou);
free(tablou);
}
else cout << "Alocare esuata!\n";
}
142
PROBLEME PROPUSE
2.
143
FIIERE
17. FIIERE
144
Funcia creat
int creat(const char *nume_fiier, int un_mod);
Creaz un fiier nou sau l suprascrie n cazul n care deja exist. Returneaz
indicatorul de fiier sau -1 (n caz de eec). Parametrul un_mod este obinut n mod
analog celui de la funcia de deschidere (prototip n io.h).
17.1.1.5
Funcia creatnew
int creatnew(const char *nume_fiier, int mod);
Creaz un fiier nou, conform modului specificat. Returneaz indicatorul
fiierului nou creat sau rezultat de eroare (-1), dac fiierul deja exist (prototip n
io.h).
Dup cum se observ, informaia furnizat pentru deschiderea unui fiier este
aceeai n ambele abordri, diferena constnd n tipul de date al entitaii asociate
fiierului. Implementarea din io.h ofer un alt tip de control la nivelul
comunicrii cu echipamentele periferice (furnizat de funcia ioctrl), asupra
cruia nu vom insista, deoarece desfurarea acestui tip de control este mai
greoaie, dar mai profund.
Funcia fclose
int fclose(FILE *pf);
145
FIIERE
Funcia fcloseall
int fcloseall(void);
nchide toate fluxururile de date i returneaz numrul fluxurilor de date
nchise (prototip n stdio.h).
17.2.1.3
Funcia close
int close(int indicator);
nchide un indicator de fiier i returneaz 0 (n caz de succes) sau -1 n caz de
eroare (prototip n io.h).
Fiierele pot fi scrise i citite caracter cu caracter folosind funciile putc (pentru
scriere) i getc (citire).
17.3.1.1
Funcia putc
int putc (int c, FILE *pf);
c este codul ASCII al caracterului care se scrie n fiier;
pf este pointerul spre tipul FILE a crui valoare a fost returnat de funcia
fopen.
Funcia putc returneaz valoarea lui c (valoarea scris n caz de succes), sau 1
(EOF) n caz de eroare sau sfrit de fiier.
17.3.1.2
Funcia getc
17.3.2
Exemplul 1
S se scrie un program care creaz un fiier text n care se vor scrie caracterele
introduse de la tastatur (citite din fiierul standard de intrare), pn la ntlnirea
caracterului ^Z = Ctrl+Z.
#include <stdio.h>
#include <process.h>
void main()
{
int c, i=0;
FILE *pfcar;
146
17.3.3
Exemplul 2
17.3.4
Exemplul 3
#include <stdio.h>
#include <process.h>
147
FIIERE
void main()
{
int c, i=0;
FILE *pfcar;
char mesaj[]="\nIntrodu caractere urmate de Ctrl+Z (Ctrl+D
sub Linux):\n";
char eroare[]="\n Eroare deschidere fisier \n";
while(mesaj[i])
putchar(mesaj[i++]);
pfcar=fopen("f_car1.txt","w");
// crearea fisierului cu
numele extern f_car1.txt
if(pfcar==NULL)
{
i=0;
while(eroare[i])
putc(eroare[i++],stdout);
exit(1);
}
while((c=getchar())!=EOF)
// sau:
while ((c=getc(stdin))
!= EOF)
putc(c,pfcar);
// scrierea caracterului in fisier
fclose(pfcar); // Inchiderea fisierului
}
17.3.5
17.3.6
Exemplul 1
int tab[100];
FILE *pf;
// . . .
deschidere fisier
while (!feof(pf)){
for (int i=0; i<100; i++){
if (feof(pf))
break;
tab[i]=getw(pf); //citire din fisier la nivel de
cuvnt si memorare n vectorul tab
// . . .
}
}
printf("Sfarsit de fisier\n");
148
17.3.7
ntr-un fiier text, liniile sunt considerate ca linii de text separate de sfritul de
linie ('\n'), iar n memorie, ele devin iruri de caractere terminate de caracterul
nul ('\0'). Citirea unei linii de text dintr-un fiier se realizeaz cu ajutorul funciei
fgets, iar scrierea ntr-un fiier - cu ajutorul funciei fputs.
Funcia fgets este indentic cu funcia gets, cu deosebirea c funcia gets
citete din fiierul standard de intrare (stdin). Funcia fputs este indentic cu
funcia puts, cu deosebirea c funcia puts scrie n fiierul standard de ieire
(stdout).
17.3.7.1
Funcia fputs
int fputs(const char *s, FILE *pf);
Funcia scrie un ir de caractere ntr-un fiier i primete ca argumente pointerul
spre zona de memorie (buffer-ul) care conine irul de caractere (s) i pointerul
spre structura FILE. Funcia returneaz ultimul caracter scris, n caz de succes, sau
-1 n caz de eroare.
17.3.7.2
Funcia fgets
char *fgets(char *s, int dim, FILE *pf);
Funcia citete maximum dim-1 octei (caractere) din fiier, sau pn la ntlnirea
sfritului de linie. Pointerul spre zona n care se face citirea caracterelor este s.
Terminatorul null ('\0') este plasat automat la sfritul irului (buffer-lui de
memorie). Funcia returneaz un pointer ctre buffer-ul n care este memorat irul
de caractere, n caz de succes, sau pointerul NULL n cazul eecului.
17.3.8
Exemplul 1
S se scrie un program care creaz un fiier text n care se vor scrie irurile de
caractere introduse de la tastatur.
#include <stdio.h>
void main()
{
int n=250;
FILE *pfsir;
char mesaj[]="\nIntrodu siruri car.urmate de Ctrl+Z(Ctrl+D
sub Linux):\n";
char sir[250],*psir;
fputs(mesaj,stdout);
pfsir=fopen("f_sir.txt","w");
//deschiderea
fisierului
f_sir.txt pentru scriere
psir=fgets(sir,n,stdin);
// citirea sirurilor din
fisierul standard de intrare
while(psir!=NULL)
{
fputs(sir,pfsir);
// scrierea n fisierul text
psir=fgets(sir,n,stdin);
}
fclose(pfsir);
149
FIIERE
17.3.9
Exemplul 2
S se scrie un program care citete un fiier text, linie cu linie, i afieaz coninutul
acestuia.
#include <stdio.h>
void main()
{
int n=250; FILE *pfsir; char sir[250],*psir;
pfsir=fopen("f_sir.txt","r"); psir=fgets(sir,n,pfsir);
while(psir!=NULL)
{
fputs(sir,stdout);
//sau: puts(sir);
//afisarea (scrierea n fisierul standard de iesire) sirului
(liniei) citit din fisierul text
psir=fgets(sir,n,pfsir); //citirea unei linii de text din
fisier
}
fclose(pfsir);}
17.3.10 Exemplul 3
S se scrie un program care creeaz un fiier text tabel.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#define PI 3.1415926
void main()
{
const n=250;
int i,j,dec,sg; FILE *pfsir;
char all[n],sir[n],*psir,*tab="\t",*cr="\n";
float x;
pfsir=fopen("f_tab.xls","w");
f_tab.txt pentru scriere
fputs("i\tsin\tcos\n",pfsir);
fisierului text
for(i=0;i<=90;i+=10)
// for(j=0;j<=90;j+=10)
{
150
//deschiderea
//
scrierea
fisierului
antetului
strcat(all,sir);
strcat(all,sir);
17.3.11 Exemplul 4
Scriei un program care s fac o copie (caracter cu caracter) a unui fiier text dat.
#include <stdio.h>
void main(void)
{
FILE *in, *out; char sursa[13], dest[13];
fflush(stdin);
printf("Dati sursa: "); scanf("%s",&sursa); fflush(stdin)
printf("Dati destinatia: "); scanf("%s",&dest);
if ((in = fopen (sursa, "rt")) == NULL)
{
printf("Nu se poate deschide fisierul sursa.\n");
return;
}
if ((out = fopen(dest, "wt")) == NULL)
{
printf("Nu se poate crea fisierul destinatie.\n");
return;
}
// se copiaza caracterele din "in" in "out"
while (!feof(in))
fputc(fgetc(in),out);
fclose(in); fclose(out);
}
151
FIIERE
Exemplul 1
S se scrie un program care creeaz un fiier binar n care se vor introduce numere
reale, nenule.
#include <iostream.h>
#include <stdio.h>
int main()
{ FILE *f;
double nr;
int x;
if ((f= fopen("test_nrb.dat", "wb")) == NULL) //deschidere
flux binar, scriere
{
cout<<"\nNu se poate deschide fisierul
test_nrb.dat"<<'\n';
return 1;
}
cout<<"\nIntroduceti numere(diferite de 0) terminate cu un
0:"<<'\n';
cin>>nr;
while(nr!=0)
{
x=fwrite(&nr, sizeof(nr), 1, f); //scriere n fisier
cin>>nr;
}
fclose(f);
return 0;
}
17.4.2
Exemplul 2
S se scrie un program care citete dintr-un fiier binar numere reale, nenule.
#include <iostream.h>
#include <stdio.h>
int main()
{ FILE *f;
double buf;
if ((f= fopen("test_nrb.dat", "rb")) == NULL)
{
cout<<"\nNu
se
poate
deschide
fisierul
test_nrb.dat"<<'\n';
return 1;
}
cout<<"\nNumerele nenule citite din fisier sunt:"<<'\n';
while((fread(&buf, sizeof(buf), 1, f))==1)
// functia sizeof(buf) care returneaza numarul de octeti
necesari variabilei buf.
cout<<buf<<" ";
fclose(f);
cout<<'\n';
152
INTRRI/IEIRI BINARE
return 0;
}
17.4.3
S se scrie un program pentru crearea unui fiier binar, avnd articole structuri cu
urmtoarele cmpuri:
Nume depuntor - ir de maxim 30 de caractere;
Data depunerii - o structur avnd cmpurile ntregi: zi, lun, an;
Suma depus - o valoare real.
Articolele sunt grupate pe zile n ordine cronologic. Datele se introduc de la
consol, fiecare pe trei linii. S se afieze apoi coninutul fiierului.
17.4.3.1 Rezolvare
Vom introduce mai nti datele ntr-o ordine aleatoare, apoi le vom sorta dup
dat. n final, vectorul de structuri va fi scris n fiierul "output.dat".
17.4.3.2 Programul
//Fisiere binare - Depuneri
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
void main (void)
{
// Cream un vector de articole pentru a le sorta ulterior
dupa data depunerii.
// Articolul suplimentar este necesar la sortare.
// In plus, vom citi ceea ce am scris in fisier intr-un
vector separat de articole.
struct {
char nume[30];
struct {
int zi, luna, an;
} data;
double suma;
} articole [20], articol, citite[20];
FILE *f;
int n; // Numarul de articole
int found;// Folosit la sortare
// Citire date de intrare
printf("Introduceti numarul de articole: ");
scanf ("%d", &n);
for (int i=0; i<n; i++)
{
printf ("Introduceti numele depunatorului: ");
scanf ("%s", articole[i].nume);
printf ("Introduceti data depunerii <ZZ/LL/AAAA>: ") ;
scanf ("%d/%d/%d", &articole[i].data.zi, \
153
FIIERE
&articole[i].data.luna, &articole[i].data.an);
printf("Introducei suma depusa: ");
scanf ("%lf", &articole[i].suma);
}
// Sortam dupa data depunerii
do
{
found=0;
for (i=0; i<n-1; i++)
// Testam cazurile in care data articolului curent este
'mai mare' decat data articolului urmator
if ( (articole[i].data.an > articole[i+1].data.an) \
|| (articole[i].data.an == articole[i+1].data.an \
&& articole[i].data.luna > articole[i+1].data.luna) \
|| (articole[i].data.an == articole[i+1].data.an \
&& articole[i].data.luna == articole[i+1].data.luna \
&& articole[i].data.zi > articole[i+1].data.zi) )
{
articol = articole[i];
articole[i] = articole[i+1];
articole[i+1] = articol;
found = 1;
}
}
while (found);
// Deschidere fisier
if((f=fopen("output.dat","wb")) == NULL)
{
printf(" Eroare la deschiderea fisierului! ");
exit(1);
}
// Scriem in fisier si il inchidem
// Scriem intai numarul de articole
fwrite(&n, sizeof(int), 1, f) ;
fwrite(&articole, sizeof(articol), n, f);
fclose(f);
if ((f=fopen ("output.dat","rb")) == NULL )
{
printf (" Eroare la deschiderea fi-ierului! ");
exit (1);
}
fread (&n, sizeof(int), 1, f);
fread (&citite, sizeof(articol), n, f);
for (i=0; i<n; i++)
printf (" Articolul %d: %s, %d/%d/%d, %lf\n", i+1, \
citite[i].nume, citite[i].data.zi, \
citite[i].data.luna, citite[i].data.an, \
citite[i].suma);
fclose(f);
getch();
}
154
INTRRI/IEIRI BINARE
17.4.4
Un fiier conine articole cu structura: cod (ir de caractere), nume (ir de caractere)
i cantitate (real). S se scrie un program care permite:
creare;
consultare;
tergere.
Opiunea se introduce ca argument al liniei de comand, prin numele complet
al operaiei:
Creare Nume_fisier - Se creeaz fiierul Nume_fisier prin citirea de la tastatur
a articolelor. Dup fiecare linie introdus se interogheaz dac se continu;
Consultare Nume_fisier - Coninutul fiierului Nume_fisier este listat pe ecran,
cte 20 de linii. Pentru continuarea afirii se apas ENTER;
tergere Nume_fisier cod_articol - Este cutat articolul n fiier i se marcheaz
punndu-i codul xxx.
17.4.4.1 Programul
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define FALSE 0
#define TRUE 1
struct ARTICOL
{
char cod[10];
char nume[30];
float cantitate; };
// Executa functia de creare fisier
void creare(char *fisier)
{
FILE *f;
struct ARTICOL a;
// Deschid fisierul pentru scriere in mod binar
if ((f=fopen(fisier,"wb")) == NULL)
{
printf (" Nu pot deschide fisierul. \n");
exit (1);
}
do
{
//Articolele citite unul cate unul si scrise in fisier
printf (" Introduceti codul, numele si cantitatea: ");
scanf("%s %s %f", &a.cod, &a.nume, &a.cantitate);
fwrite(&a,sizeof(ARTICOL),1,f);
printf("Doriti sa continuati ? (d/n)\n");
}
while (getch()=='d');
fclose(f);
155
FIIERE
}
// Executa functia de consultare fisier
void consultare(char *fisier)
{
FILE *f;
struct ARTICOL a;
int i=1;
// Deschid fisierul pentru citire in mod binar
if ((f=fopen(fisier,"rb")) == NULL)
{
printf("Nu pot deschide fisierul. \n");
exit (1) ;
}
while(fread(&a,sizeof(ARTICOL),1,f)>0)
// Am grija sa nu afisez articolele care au fost sterse
if(strcmp(a.cod,"xxx")!=0)
{
printf("%10s %30s %10.2f\n",a.cod,a.nume,a.cantitate);
// Daca am afisat 20 de articole, ma opresc si intreb
if (i++%20==0)
{
printf("Doriti sa continuati ? (d/n)\n");
if (getch()=='n') break;
}
}
fclose(f);
}
// Executa functia de stergere
void stergere(char *fisier,char *cod)
{
FILE *f;
struct ARTICOL a; int gasit=FALSE;
// Fisierul este deschis pentru citire/scriere in mod binar
f=fopen(fisier,"r+b");
while(fread(&a,sizeof(ARTICOL),1,f)>0)
if(strcmp(a.cod,cod)==0)
{
// Marchez articolul ca fiind sters
strcpy(a.cod,"xxx") ;
//Ma pozitionez cu o Inregistrare inainte pentru a
suprascrie articolul
fseek(f,ftell(f)-sizeof(ARTICOL),SEEK_SET);
fwrite(&a,sizeof(ARTICOL),1,f);
gasit=TRUE; break;
}
if (!gasit)
printf("Eroare: Articolul nu a fost gasit\n");
fclose(f);
}
156
Funcia lseek
int lseek(int indicator, long n, int referinta);
Seteaza poziia curent de citire/scriere n fiier la n octei faa de referint.
Returneaz valoarea 0 n caz de succes i diferit de zero n caz de eroare (prototip
n io.h).
17.5.1.3
Funcia fgetpos
int fgetpos(FILE *flux_date, fpos_t *pozitie);
Determin poziia curent (pointer ctre o structur, fpos_t, care descrie
aceast poziie n fluxul de date). nscrie valoarea indicatorului n variabila
indicat de pozitie. Returneaz 0 la determinarea cu succes a acestei poziii sau
valoare diferit de zero n caz de eec. Structura care descrie poziia poate fi
transmis ca argument funciei fsetpos (prototip n stdio.h).
17.5.1.4
Funcia fsetpos
157
FIIERE
Funcia ftell
Funcia tell
Funcia rewind
void rewind(FILE *flux_date);
Poziioneaz indicatorul la nceputul fluxului de date specificat ca argument
(prototip n stdio.h).
17.6.1.1
Funcia feof
Funcia eof
17.6.2
17.6.2.1
Funcia fflush
158
EXEMPLE
Funcia flushall
int flushall(void);
Golete toate fluxurile de date existente, pentru cele de scriere efectund i
scrierea n fiiere. Returneaz numrul de fluxuri asupra crora s-a efectuat
operaia (prototip n stdio.h).
Funcia remove
int remove(const char *nume_fisier);
terge un fiier. Returneaz valoarea 0 pentru operaie reuit i -1 pentru
operaie euat (prototip n stdio.h).
Funcia unlink
int unlink(const char *nume_fisier);
terge un fiier. Returneaz 0 la operaie reuit i -1 la eec; dac fiierul are
permisiune read-only, funcia nu va reui operaia (prototip n io.h, stdio.h).
17.8 Exemple
17.8.1
159
FIIERE
17.8.2
160
EXEMPLE
FIIERE
posf=ftell(f); fseek(f,posi,SEEK_SET);
return posf;
}
void scrieb(int nr,void *a,FILE *f)
//scriere n
binar
{long depl=(nr-1)*sizeof(material);
fseek(f,depl,SEEK_SET);
if(fwrite(a,sizeof(material),1,f)!=1)
{cout<<"Eroare de scriere in fisier !"<<'\n';
exit(1); }
}
fisierul
fisierul
162
EXEMPLE
FIIERE
}while(na);
fclose(pf);
}
void sterg() //stergerea din fisier a unui material
{ int n;long int na; pf=fopen("material.dat","r+");
mat.codm=0; na=lungfis(pf)/sizeof(material);
do
{
do
{cout<<"Numarul articolului de sters este (0=END):
";cin>>n;
if(n<0||n>na) cout<<"Articol eronat"<<'\n';
}while(!(n>=0 && n<=na));
if(n) scrieb(n,&mat,pf);
}while(n);
fclose(pf);
}
void list()
//afisare informatii despre un anumit
material
{
int na; pf=fopen("material.dat","r");
do
{cout<<"Numarul articolului de listat este (0=END):
";cin>>na;
if(na)
{citireb(na,&mat,pf);
afismat(&mat);
cout<<'\n';
}
}while(na);
fclose(pf);
}
2.
164
PROBLEME PROPUSE
3.
4.
5.
6.
7.
8.
9.
165