Implementarea algoritmilor – Limbajul C++ Informatică

1



ELEMENTELE DE BAZA ALE LIMBAJULUI C++

Un program scris in C++ este alcatuit din una sau mai multe functii. Fiecare functie
are mai multe instructiuni in C++ care codifica algoritmul programului. Instructiunile unei
functii reprezinta corpul functiei si sunt cuprinse intre { }. Dupa fiecare instructiune din
corpul functiei se pune semnul ;
Functiile de acelasi domeniu sunt grupate in fisiere header numite si directive.
La inceputul fiecarui program se specifica fisierele care contin functiile ce se utilizeaza in
program astfel: # include <numefisier.h>
Dupa specificarea directivelor trebuie scrisa functia radacina care se numeste main( ) sau
void main( ). Dupa numele directivelor sau a functiilor nu se pune semnul ;

1. CITIRI , SCRIERI.

- pentru realizarea citirii se utilizeaza : cin>>nume variabila
cin>>a>>b>>c - citeste variabilele a, b, c
- pentru realizarea scrierii se utilizeaza: cout<<nume variabila
cout<<a<<b<<c - scrie variabilele a, b, c

Exemplul 1:
#include<iostream.h>
#include<conio.h>
void main()
{
int L,l,h;
clrscr(); // sterge ecranul //
cout<<"Lungimea=" ; cin>>L;
cout<<"Latimea="; cin>>l;
cout<<"Inaltimea="; cin>>h;
getch(); // in C++ sub DOS permite vizualizarea
rezultatului programului//
}

Exemplul 2:

#include<iostream.h>
#include<conio.h>
void main()
Implementarea algoritmilor – Limbajul C++ Informatică

2


{
int L,l,h,v;
clrscr();
cout<<"Lungimea=" ; cin>>L;
cout<<"Latimea="; cin>>l;
cout<<"Inaltimea="; cin>>h;
v=L*l*h;
cout<<"Volumul este"<<" "<<v;
getch();
}

2. TIPURI DE DATE.

2.1. TIPURI INTREGI.
int (tip intreg care ocupa 16 biti)
long (tip intreg care ocupa 32 de biti)
unsigned int sau unsigned long (valorile datelor sunt fara semn, adica pozitive)
char (tip caracter, aceste date se pun intre doua apostrofuri ' ' )
2.2. TIPURI REALE
float (tip real care retin si numerele zecimale , ocupa 32 biti)
ATENTIE!! IN C++ LA SCRIEREA UNUI NUMAR ZECIMAL IN LOCUL VIRGULEI SE PUNE
PUNCT
double ( tip real care ocupa 64 biti)
long double (tip real care ocupa 80 biti)
2.3. CONSTANTE
Pentru a da un nume constantelor se foloseste declaratia const care are forma:
const [tip] nume=valoare ;
[tip] - tipul constantei ; nume -numele constantei ; valoare - valoarea constantei
Exemplu:
const float a=12.6 constanta este de tip float, poarta denumirea a, are valoarea 12,6







Implementarea algoritmilor – Limbajul C++ Informatică

3


3. OPERATORI C++

3.1. OPERATORI ARITMETICI.
+ (adunare) ; - (scadere) ; * (inmultire) ; / (impartire) ; % (restul impartirii intregi)
3.2. OPERATORI RELATIONALI.
< (mai mic) ; <= (mai mic sau egal) ; > (mai mare) ; >= (mai mare sau egal)
3.3. OPERATORI DE EGALITATE.
== (egalitate) ; != (inegalitate)
3.4. OPERATORI DE INCREMENTARE SI DECREMENTARE.
++ (incrementare) ; -- (decrementare)
Operatorii pot fi : prefixati (in fata operandului) situatie in care variabila este
incrementata sau decrementata inainte ca valoarea retinuta de ea sa intre in calcul
postfixati (dupa operand) situatie in care variabila este
incrementata sau decrementata dupa ce valoarea retinuta de ea intra in calcul
Exemplu:
Daca a si b sunt variabile de tip int care retin valorile 1 si 3 atunci:
a++*b++ produce valoarea 3, dupa evaluare cele 2 variabile retin 2 si 4
++a*++b produce valoarea 8, dupa evaluare cele 2 variabile retin 4 si 4
3.5. OPERATORI LOGICI
! - negare logica ; && - SI logic ; || SAU logic
3.6. OPERATORI DE ATRIBUIRE
Apare foarte frecvent si reprezinta memorarea unei valori intr-o variabila
Este reprezentata prin semnul =
a=3 (atribuie variabilei a valoarea 3)
Se mai utilizeaza operatori de atribuire combinati:
+= ; -= ; *= ; /= ; %= ; &= ; <<= ; >>=
Exemplu: a=a+b este echivalent cu a+=b ; a=a*b este echivalent cu a*=b
3.7. OPERATORUL CONDITIONAL.
Forma generala e1 ? e2 : e3
Se evalueaza e1, daca este adevarata se executa e2, daca este falsa se executa e3
Exemplu: Citirea unuui numar x si tiparirea numarului |x| (modulul numarului x)
#include<iostream.h>
#include<conio.h>
void main()
{
Implementarea algoritmilor – Limbajul C++ Informatică

4


float x;
clrscr();
cout<<"x=" ; cin>>x; cout<<"|x|="<<" "<<(x>=0?x:-x);
getch();
}

4. INSTRUCTIUNILE LIMBAJULUI C++

1. Instructiunea expresie.
Exemplul1. Interschimbarea continutului a 2 variabile care au fost initial citite.
#include<iostream.h>
#include<conio.h>
void main()
{
int a,b,m;
clrscr();
cout<<"a=" ; cin>>a;
cout<<"b="; cin>>b;
m=a,a=b,b=m;
cout<<"a="<<" "<<a<<endl;
cout<<"b="<<" "<<b;
getch();
}

Exemplul2. Se citesc 3 valori intregi a,b,c si se afiseaza media lor aritmetica
#include<iostream.h>
#include<conio.h>
void main()
{
int a,b,c;
float m;
clrscr();
cout<<"a=" ; cin>>a;
cout<<"b="; cin>>b;
cout<<"c=" ; cin>>c;
m=float(a+b+c)/3;
cout<<"media aritmetica ="<<" "<<m;
getch();
}







Implementarea algoritmilor – Limbajul C++ Informatică

5


2. INSTRUCTIUNEA IF.
Forma generala:
if (expresie) instructiune1 else instructiune2
Se evalueaza expresia, daca este adevarata se executa instructiune1, daca este falsa
se executa instructiune2
Exemplul 1. Calculeaza maximul dintre 2 numere citite
#include<iostream.h>
#include<conio.h>
void main()
{
int a,b,max;
clrscr();
cout<<"a=" ; cin>>a;
cout<<"b="; cin>>b;
if(a>b) max=a;
else max=b;
cout<<"numarul mai mare este "<<" "<<max;
getch();
}


Exemplul 2. Se citesc coeficientii a, b, c ale unei ecuatii de gradul doi si se precizeaza
natura radacinilor si semnul lor.

#include<iostream.h>
#include<math.h>
#include<conio.h>
void main()
{
float a,b,c,d,s,p;
clrscr();
cout<<"a=";cin>>a;cout<<"b=";cin>>b;cout<<"c=";cin>>c;
d=b*b-4*a*c; s=float(-b/a); p=float(c/a);
cout<<"Discriminantul ecuatiei D="<<d<<endl;
cout<<"Produsul radacinilor P="<<p<<endl;
cout<<"Suma radacinilor S="<<s<<endl;
if(d<0) cout<<"Ecuatia nu are solutii reale";
else
{ if(d==0) {if(s>0) cout<<"Ecuatia are 2 solutii reale
egale si pozitive";
else cout<<"Ecuatia are 2 solutii reale egale si
negative";
}
else
if(p>0)
{if(s>0) cout<<"Ecuatia are 2 solutii reale
pozitive";
else cout<<"Ecuatia are 2 solutii reale negative";
Implementarea algoritmilor – Limbajul C++ Informatică

6


}
else cout<<"Ecuatia are 2 solutii reale de semne
opuse";
}
getch();
}

Exemplul 3. Rezolvarea unei ecuatii de gradul 1.

#include<iostream.h>
#include<conio.h>
void main()
{
float a,b,x;
clrscr();
cout<<"a=" ; cin>>a;
cout<<"b="; cin>>b;
if (a!=0)
{x= -b/a ;cout<<"x="<<" "<<x; }
else
if(b==0) cout<<"ecuatia are o infinitate de solutii";
else cout<<"ecuatia nu are solutie";
getch();
}

Exemplul 4. Rezolvarea unei ecuatii de gradul 2.

#include<iostream.h>
#include<conio.h>
#include<math.h>
void main()
{
float a,b,c,d,x1,x2,x;
clrscr();
cout<<"a=" ; cin>>a;
cout<<"b="; cin>>b;
cout<<"c=" ; cin>>c;
d=float( b*b-4*a*c);cout<<"discriminantul ecuatiei este"<<"
"<<sqrt(d)<<endl;
if(d<0) {cout<<"ecuatia nu are solutii reale";}
else
if (d>0)
{ x1=(-b+sqrt(d)) / (2*a) ; x2=(-b-sqrt(d)) / (2*a);
cout<<"x1="<<x1<<endl;cout<<"x2="<<x2<<endl;}
else
{x=float(-b/2*a);cout<<"ecuatia are solutie unica
x=x1=x2="<<" "<<x;}
getch();
}


Implementarea algoritmilor – Limbajul C++ Informatică

7



3. INSTRUCTIUNEA WHILE.
Aceasta instructiune permite programarea ciclurilor cu test initial.
Forma generala este:
while (expresie)
{....... instructiuni }
Se evalueaza expresie, daca este adevarata se executa {....instructiuni} dupa care se
revine la evaluarea expresiei , daca este falsa se trece la instructiune urmatoare.
Exemplu. Executarea unui program intr-un ciclu repetat pana la apasarea unei anumite
taste(se introduc coeficientii unei ec. de gr.2 si se afiseaza solutiile de "n" ori pina la
apasarea tastei "q")
#include<iostream.h>
#include<conio.h>
#include<math.h>
void main()
{
float a,b,c,d,x1,x2,x;
int tasta;
while(tasta!='q')
{
clrscr();
cout<<"a=" ; cin>>a;
cout<<"b="; cin>>b;
cout<<"c=" ; cin>>c;
d=float( b*b-4*a*c);cout<<"discriminantul ecuatiei este"<<"
"<<sqrt(d)<<endl;
if(d<0) {cout<<"ecuatia nu are solutii reale";}
else
if (d>0)
{ x1=(-b+sqrt(d))/(2*a) ; x2=(-b-sqrt(d))/(2*a);
cout<<"x1="<<x1<<endl;cout<<"x2="<<x2<<endl;}
else
{x=float(-b/2*a);cout<<"ecuatia are solutie unica
x=x1=x2="<<" "<<x<<endl;}
cout<<"Pentru continuare apasa o tasta"<<endl;
cout<<"Pentru iesire apasa tasta q";
tasta=getch();
}
}







Implementarea algoritmilor – Limbajul C++ Informatică

8


4. INSTRUCTIUNEA FOR
Se utilizeaza cel mai fracvent pentru programarea ciclurilor cu test initial.
Forma generala:
for( e
INITIALIZARE
; e
TEST
; e
INCREMENTARE
) instructiune
e
INITIALIZARE
- se evalueaza o singura data pentru initializarea variabilei de ciclare inaintea
primului ciclu ;
e
TEST
- este evaluata inaintea fiecarui ciclu pentru a testa daca se executa instructiunea
subordonata si reprezinta conditia de iesire din ciclu;
e
INCREMENTARE
- se evalueaza la sfirsitul fiecarui ciclu pentru incrementarea variabilei de
ciclare.
Principiul de executie:
Se evalueaza e
INITIALIZARE
(numai la prima rulare), se evalueaza e
TEST
, daca este
adevarata se executa instructiunea subordonata for, se evalueaza e
INCREMENTARE
si se
revine la evaluarea expresiei e
TEST
. Daca e
TEST
este falsa se trece la urmatoarea
instructiune (se termina executarea instructiunii for)
Observatie. Daca expresia e
TEST
este vida se executa un ciclu infinit. Pentru a iesi din
acest ciclu : in DOS se tasteaza CTRL+PAUSE
in WINDOWS se tasteaza CTRL +ALT + DEL
Exemplul 1. Se introduce de la tastatura numarul n si se calculeaza suma si produsul
primelor n numere
#include<iostream.h>
#include<conio.h>
void main()
{ N
2
int i,n,tasta;
long double a,b;
while(tasta !='q') {
clrscr();
cout<<"Introduceti numarul"<<"";cin>>n;
a=b=1;
for(i=2;i<=n;i++)
{a*=i;b+=i;}
cout<<"suma="<<b<<endl;cout<<"produsul="<<a<<endl;
cout<<"Pentru iesire apasa tasta q";
tasta=getch(); }
}

Observatie. Variabila n poate fi definita la inceput fara a mai trebui introdusa de la
tastatura utilizand #define n valoare (comanda se scrie inainte de void main() )

Exemplul2. Afisarea literelor alfabetului
Implementarea algoritmilor – Limbajul C++ Informatică

9



#include<iostream.h>
#include<conio.h>
void main()
{
char litere;
for(litere='A';litere<='Z';litere++)cout<<litere<<" ";
getch();
}

Exemplul3. Afiseaza toate patratele si radicalii numerelor naturale pina la numarul n
introdus de la tastatura.

#include<iostream.h>
#include<conio.h>
#include<math.h>
void main()
{
float i,n,a,b;
clrscr();
cout<<"n=";cin>>n;
a=b=0;
for(i=1 ;i<=n;i++) {
a=sqrt(i) ; b=i*i;
cout<<"Patratul numarului"<<" "<<i<<"
= "<<b<<'\t'<<
"Radicalul numarului"<<" "<<i<<"
="<<a<<endl;
}
getch();
}




















Implementarea algoritmilor – Limbajul C++ Informatică

10


5. TIPURI DE DATE STRUCTURATE

1. TABLOURI
1.1. TABLOURI IN C++
Tabloul este o lista de elemente de acelasi tip plasate succesiv intr-o zona de memorie.
Tablourile por fii : simple (vector) sau multiple (matrice)
Exemple:
- int v[10] ; am declarat un vector cu 10 componente de tip intreg care au indici intre 0
si 9 , v[0], v[1],.........v[9]
- float a[10], b[20] ; am declarat doi vectori a si b care au 10 respectiv 20 de
componente de tip real
- int a[10][20] ; am declarat o matrice cu 10 linii si 20 coloane cere se adreseaza astfel:
a[0][0], a[0][1], a[0][2],...........a[9][19].
Un tablou poate fi initializat cu un set de valori astfel:
- int a[5]={-2,4,8,1,9} ;
- int b[3][4]={ {11,12,13,14}, {21,22,23,24}, {31,32,33,34} } ;

Exemplul1. Afisarea unei matrici cu componentele declarate initial.

#include<iostream.h>
#include<conio.h>
void main()
{
int a[3][3]={11,12,13,21,22,23,31,32,33};
int i,j;
for(i=0;i<3;i++){
for(j=0;j<3;j++)
{
cout<<a[i][j]<<' ';
}
cout<<endl;
}
getch();
}

Rezultatul programului va fii afisarea urmatoarei matrici:
11 12 13
21 22 23
31 32 33
Implementarea algoritmilor – Limbajul C++ Informatică

11


Exemplul2. Se introduce numarul de linii m si numarul de coloane n ale unei matrici, se
intoduc elementele matricii apoi se afiseaza matricea creata.
#include<iostream.h>
#include<conio.h>
void main()
{
int i,j,m,n,a[10][10];
clrscr();
cout<<"Introduceti numarul de linii"<<" "<<"n=";cin>>m;
cout<<"Introduceti numarul de coloane"<<" "<<"n=";cin>>n;
cout<<"Intoduceti elementele"<<endl;
for(i=1;i<=m;i++) {
for(j=1;j<=n;j++) {

cout<<"a["<<i<<j<<"]=", cin>>a[i][j];
}
}
cout<<"Matricea intodusa are
forma:"<<endl<<'\t'<<'\t'<<'\t'<<'\t';
for(i=1;i<=m;i++){
for(j=1;j<=n;j++) {
cout<<a[i][j]<<' ';
}
cout<<endl<<'\t'<<'\t'<<'\t'<<'\t';
}


getch();
}

Exemplul3. Se introduc valorile componentelor unui vector a[100] si se atribuie aceste
valori componentelor vectorului b[100].
#include<iostream.h>
#include<conio.h>
void main()
{
int n,i,a[100],b[100];
clrscr();
cout<<"Introduceti numarul de componente n="<<" ";cin>>n;

for(i=1;i<=n;i++)
{ cout<<"a["<<i<<"]=";cin>>a[i];}

for(i=1;i<=n;i++) b[i]=a[i];

cout<<endl;

for(i=1;i<=n;i++) cout<<"b["<<i<<"]="<<b[i]<<'\t';

Implementarea algoritmilor – Limbajul C++ Informatică

12


getch();}

1.2. ALGORITMI FUNDAMANTALI CARE LUCREAZA CU VECTORI.

1.2.1. MAXIM, MINIM.
O variabila preia continutul primei componente a vectorului (max=v[0] sau
min=v[0]), apoi o compara pe rind cu celelalte componente ale vectorului, iar in functie de
conditia care se pune in program variabila va retine componenta cu valoare maxima sau
componente cu valoare minima.
Pentru maxim :
max=v[0] ; if(v[i]>max) max=v[i]
Pentru minim ;
min=v[0] ; if(v[i]<min) min=v[i]

Exemplu. Se introduc valorile componentelor unui vector si se afiseaza valoarea maxima
si valoarea minima.

#include<iostream.h>
#include<conio.h>
void main()
{
int max,min,n,i,v[100];

cout<<"Introduceti numarul de elemente n="; cin>>n;

for(i=1;i<=n;i++)
{cout<<"v["<<i<<"]=";cin>>v[i];};
max=v[0];

for(i=1;i<=n;i++) if(v[i]>max) max=v[i] ;

cout<<"Valoarea maxima citita este"<<" "<<max<<endl;

min=v[0];

for(i=1;i<=n;i++) if(v[i]<min) min=v[i];

cout<<"Valoarea minima citita este"<<" "<<min;

getch();

}


Implementarea algoritmilor – Limbajul C++ Informatică

13



1.2.2. ELEMENTE DISTINCTE.
Se citeste un vector cu n componente si se decide daca numerele citite sunt
distincte (nu exista doua numere egale) sau daca nu sunt distincte (exista doua numere
egale).
Pentru a rezolva problema se procedeaza astfel:
- o variabila i retine indicele primei componente
- o variabila j retine indicele urmatoarelor componente
Ex: cand i=1 j=2,3,........n
cand i=2 j=3,4,........n
cand i=n j=n-1
- se initializeaza o variabila gasit cu valoarea logica 0
-- daca sunt gasite doua valori egale variabilei gasit i se atribuie vloarea logica 1

Exemplu.
#include<iostream.h>
#include<conio.h>
void main()
{
int v[10],i,j,n,gasit;
cout<<"introduceti numarul de elemente n="<<" "; cin>>n;
for(i=1;i<=n;i++)
{ cout<<"v["<<i<<"]="; cin>>v[i]; }

gasit=0;

for(i=1;i<=n ;i++)

for(j=i+1;j<=n ;j++)

if(v[i]==v[j]) gasit=1;

if(gasit) cout<<"Numerele nu sunt distincte";

else cout<<"Numerele sunt distincte";

getch();

}



Implementarea algoritmilor – Limbajul C++ Informatică

14



5.2.3. METODE DE SORTARE

Se aplica pentru sortarea unor valori citite in ordine crescatoare sau descrescatoare.
a) Sortarea prin selectarea minimului(maximului).
- se determina minimul dintre toate valorile retinute incepand cu pozitia 1 si acesta este
trecut pe pozitia1 prin interschimbarea continuturilor dintre cele 2 componente
- se determina minimul dintre valorile ratinute incepand cu pozitia 2 si acesta este trecut
pe pozitia 2 prin interschimbarea continuturilor dintre cele 2 componente

......................................................
- se determina minimul dintre valorile retinute incepand cu penultima pozitie si acesta
este trecut pe penultima pozitie.
Exemplul1. Se citeste o multime de numere si se listeaza valorile in ordine crescatoare si
in ordine descrescatoare
#include<iostream.h>
#include<conio.h>
int a[10],n,i,j,k,min,m;
void main()
{
clrscr();
cout<<"Introduce numarul elementelor"<<" "<<"n=";cin>>n;
for(i=1;i<=n;i++) { cout<<"a["<<i<<"]=";cin>>a[i];};

for(i=1;i<=n-1;i++)
{
min=a[i];k=i;
for(j=i+1;j<=n;j++)
if(a[j]<min)
{
min=a[j];
k=j;
}
m=a[k];
a[k]=a[i];
a[i]=m;
}
cout<<"Listez numerele in ordine crescatoare"<<endl;
for(i=1;i<=n;i++) cout<<a[i]<<" ";

cout<<endl<<"Listez numerele in ordine descrescatoare"<<endl;
for(i=n;i>=1;i--)cout<<a[i]<<" ";
getch();
Implementarea algoritmilor – Limbajul C++ Informatică

15


}
b) Sortarea prin interschimbare
Se parcurge variabila intr-un ciclu do while inversand continuturile componentelor care nu
sunt in ordine crescatoare(descrescatoare)
Exemplu: Fie situatia initiala:
3 1 4 2
A[1] A[2] A[3] A[4]
Algoritmul este urmatorul:
- se efectueaza prima parcurgere si se schimba A[1] cu A[2] (deoarece 3 > 1) si A[3] cu
A[4] (deoarece 4 > 2), vectorul va arata astfel:

1 3 2 4
A[1] A[2] A[3] A[4]
- se efectueaza a doua parcurgere si se schimba A[2] cu A[3] (deoarece 3 > 2), iar
vectorul va arata astfel:

1 2 3 4
A[1] A[2] A[3] A[4]
- se efectueaza a treia parcurgere dar deoarece numerele sunt in ordine crescatoare
algoritmul se incheie
Exemplu:
#include<iostream.h>
#include<conio.h>
int a[10],n,i,k,temp,gasit;
void main()
{
clrscr();
cout<<"Introduce numarul de elemente"<<" "<<"n=";cin>>n;
for(i=1;i<=n;i++) {cout<<"a["<<i<<"]=";cin>>a[i];};
do
{
gasit=0;
for(i=1;i<=n-1;i++)
if(a[i]>a[i+1])
{temp=a[i] ; a[i]=a[i+1]; a[i+1]=temp; gasit=1;}
} while(gasit);

cout<<"Listez numerele in ordine crescatoare"<<endl;
for(i=1;i<=n;i++) cout<<a[i]<<" ";

cout<<endl<<"Listez numerele in ordine descrescatoare"<<endl;
Implementarea algoritmilor – Limbajul C++ Informatică

16


for(i=n;i>=1;i--)cout<<a[i]<<" ";
getch();
}


1.3 APLICATII CARE LUCREAZA CU MATRICI.
1.3.1 INTERSCHIMBAREA A DOUA LINII INTRE ELE SAU A DOUA COLOANE

Pentru a interschimba 2 variabile intre ele utilizam o a treia variabila de manevra
care am denumit-o temp si inca doua variabile x si y carora le atribuim ca valori numerele
liniilor sau a coloanelor care dorim sa le interschimbam intre ele.

a) Interschimbarea a 2 linii
for(j=1;j<=n;j++) {
temp=a[x][j];
a[x][j]=a[y][j];
a[y][j]=temp ;
}
b) Interschimbarea a 2 coloane
for(i=1;i<=n;i++) {
temp=a[i][x];
a[i][x]=a[i][y];
a[i][y]=temp ;
}
Exemplu. Schimbarea a 2 coloane a unei matrici

#include<iostream.h>
#include<conio.h>
void main()
{
int i,j,m,n,a[10][10],x,y,temp;
clrscr();
cout<<"Introduceti numarul de linii"<<" "<<"n=";cin>>m;
cout<<"Introduceti numarul de coloane"<<" "<<"n=";cin>>n;

cout<<"Intoduceti elementele"<<endl;
for(i=1;i<=m;i++) {
for(j=1;j<=n;j++) { cout<<"a["<<i<<j<<"]=", cin>>a[i][j];}}

cout<<"Matricea intodusa are forma:"<<endl;
for(i=1;i<=m;i++){
for(j=1;j<=n;j++) {cout<<a[i][j]<<' '; } cout<<endl; }
cout<<endl;
Implementarea algoritmilor – Limbajul C++ Informatică

17



cout<<"Introduceti numerele coloanelor care doriti sa le
interschimbati"<<endl;
cout<<"x=";cin>>x;cout<<"y=";cin>>y;
for(i=1;i<=n;i++) { temp=a[i][x]; a[i][x]=a[i][y]; a[i][y]=temp ;
}
cout<<endl;

cout<<"Noua matrice are forma:"<<endl;
for(i=1;i<=m;i++){
for(j=1;j<=n;j++){ cout<<a[i][j]<<' '; } cout<<endl;}
getch(); }
1.3.2. SPIRALA
Se citeste o matrice patratica (numarul de linii=numarul de coloane=n). Se cere sa se
afiseze elementele tabloului in ordinea rezultata prin parcurgerea acestuia in spirala,
incepand cu primul element din linia 1 in sensul acelor de ceasornic.






















Implementarea algoritmilor – Limbajul C++ Informatică

18


6. FISIERE
Fisierul este o colectie de date de acelasi fel stocate pe un suport extern care are
un mune si o extensie (al carei nume este in functie de tipul fisierului).Ex: nume.exe (fisier
executabil) ; nume.dbf (fisier baza de date,utilizat in fox), etc.

1. FISIERE TEXT

Aceste fisiere se caracterizeaza prin urmatoarele:
- datele sunt memorate sub forma unei succesiuni de caractere
- caracterele sunt memorate in codul ASCII
- fisierul se termina cu caracterul EOF
- este format din una sau mai multe linii care se termina cu caracterul newline (\n)
- o variabila speciala numita pointer retine intotdeauna un octet al fisierului

1.1. Citiri / scrieri cu format
Acestea sun caracterizate prin:
- latime - width - se utilizeaza la scriere si are rolul de a stabili numarul de caracatere
utilizate pentru afisarea unei date;
- precizie - precision - se utilizeaza la scriere atunci cand se foloseste o variabila reala,
stabileste numarul de zecimale care vor fi afisate pentru valoare;
- caracterul de umplere - fill - se utilizeaza la scriere in cazul in care data propriuzisa
ocupa mai putini octeti decat latimea si precizeaza caracterul care se afiseaza in spatiile
neocupate;
- alinierea - left sau right - se utilizeaza cand data ocupa mai putin decat latimea si se
precizeaza unde anume sa fie afisata - stanga sau drepta -
- salt sau nu peste caractere albe - se utilizeaza la citire

* Pentru formatarea citirii / scrierii se utilizeaza varibilele:
precision , wihth, fill
Accesul la aceste varibile se face cu ajutorul unor functii speciale numite manipulatori.
Pentru a le putea utiliza in program trebuie inclusa directiva #<iomanip.h>
Manipulatorii sunt inclusi in expresiile de citire/scriere astfel:
- setw (int) - stabileste latimea int pe care este afisata variabila
- setprecision(int) - stabileste numarul de zecimale int care sunt afisate
Implementarea algoritmilor – Limbajul C++ Informatică

19


- setfill(char) - stabileste caracterul de umplere char a pozitiilor ramase libere
Exemplu.
#include<iostream.h>
#include<iomanip.h>
#include<conio.h>
void main()
{
double a=0.123456789;
cout<<setw(20)<<setfill('$')<<setprecision(2)<<a;
getch();
}

Afisarea se poate face pe 20 pozitii ; pe pozitiile ramase libere se afiseaza caracterul $ ,
variabila a va fi afisata cu 2 zecimale.
*Pentru formatarea intrarilor / iesirilor se utilizeaza variabila:
flags care utilizeaza comenzile:
- skipws - sunt sarite caracterele albe care preced valoarea ce trebuie citita
- left - datele se tiparesc aliniate la stanga
- right - datele se tiparesc aliniate la dreapta
- internal - se fiseaza semnaul la stinga si numarul la drepta
- dec - conversie in zecimal
- oct - conversie in octal
- hex - conversie in hexazecimal
- showbase - afisarea indicatorului de baza
- showpoint - forteaza afisarea punctului zecimal
- uppercase - in cazul afisarii in hexazecimal se vor utiliza literele mari (A,B,..F)
- showpos - valorile afisate sunt precedate de semn
- scientific - afisarea valorilor se face prin utilizarea formei stiintifice (1e-8)
- fixed - afisarea valorilor se face prin utilizarea formai normale

Variabila flags se utilizeaza in doua moduri:
setiosflags(masca) - pentru setarea bitilor accesati
resetiosflags(masca) - pentru resetarea bitilor accesati
Pentru a avea acces la comanzile cu care lucreaza flags numele lor vor fi precedate de
ios::
masca este formata din una sau mai multe grupe de comenzi de forma:
ios::comanda separate intre ele de operatorul logic | (SAU-pe biti)
Exemplu de masca:
Implementarea algoritmilor – Limbajul C++ Informatică

20


(ios::internal | ios::showpos | ios::right)
Exemplu:
#include<iostream.h>
#include<iomanip.h>
#include<conio.h>
#include<math.h>
void main()
{
double a,b,c,d,e,f;
cout<<"Introduceti primul numar "<<" "<<"a=";cin>>a;
cout<<"Introduceti al doilea numar "<<" "<<"b=";cin>>b;
c=a/b;
d=a*b;
e=sqrt(d);
f=d*d;
cout<<endl;

cout<<"Rezultatul impartirii "<<" "<<"a : b ="
<<setw(100)<<setfill(' ')<<setprecision(10)
<<setiosflags(ios::left|ios::showpos|ios::fixed)<<c;
cout<<endl;

cout<<"Rezultatul inmultirii "<<" "<<"a x b ="
<<setw(100)<<setfill(' ')<<setprecision(10)
<<setiosflags(ios::left|ios::showpos|ios::fixed)<<d;
cout<<endl;

cout<<"Radicalul inmultirii este "<<" "
<<setw(100)<<setfill(' ')<<setprecision(20)
<<setiosflags(ios::left|ios::showpos|ios::fixed)<<e;
cout<<endl;

cout<<"Patratul inmultirii este "<<" "
<<setw(100)<<setfill(' ')<<setprecision(20)
<<setiosflags(ios::left|ios::showpos|ios::fixed)<<f;
getch();
}











1.2. Declararea fisierelor text memorate pe suport magnetic.
Cand se lucreaza cu fisiere pe suport magnetic in program trebuie inclusa directiva:
Implementarea algoritmilor – Limbajul C++ Informatică

21


#include<fstream.h> daca utilizam acesta directiva poatei fi scoasa <iostream.h>
Pentru a lucra usor asupra fisierelor sunt definite comenzile:
- in - deschide fisierul pentru citire
- out - deschide fisierul pentru scriere
- ate - salt la sfirsitul fisierului dupa deschiderea acestui
- app - deschide fisierul pentru a scrie la sfirsitul lui
- trunc - daca fisierul care se deaschide exista in locul lui se creaza altul
- nocreate - daschide fisierul daca acesta exista (nu se creaza altul)
- noreplace - daca fisierul exista el poate fi deschis numai pentru consultare
- binary - fisier binar. Se utilizeaza constructorul inplicit al clasei ofstream(); apoi se
utilizeaza metoda open in forma generala

Inainte de a lucra cu un fisier acesta trebuie declarat. Forma generala a declaratiei:
fstream nume_logic("nume_fizic" , mod_de_deschidere)
Exemplu1: Declar un fisier cu numele fizic fis.txt care se va gasi in radacina (c:\\) , cu
numele logic f , fisierul este declarat in vedera crearii lui (ios::out)
fstream f("c:\\fis.txt",ios::out);
Exemplul2. Declar doua fisiere, unul (f) pentru citire si celalat (g) pentru scriere
fstream f("c:\\fis1.txt",ios::in), g("c:\\fis2.txt",ios::out);
In cazul in care numele fisierului trebuie citit de la tastatura declaratia fisierului trebuie sa
contina numele sau si trebuie plasata dupa citirea sirului respectiv astfel:
char nume_fisier[20] ;
cout<<"Numele fisierului este ";cin>>nume_fisier ;
fstream f(nume_fisier, ios::out);
Dupa deschiderea si prelucrarea unui fisier acesta trebuie inchis astfel:
nume_fisier.close() , in cazul nostru f.close()
Exemplu de creare a unui fisier de tip text in c:\ :
#include<iostream.h>
#include<fstream.h>
#include<iomanip.h>
#include<conio.h>
void main()
{
fstream f("c:\\fis.txt",ios::out);
getch();
}

Implementarea algoritmilor – Limbajul C++ Informatică

22


1.3. Prelucrarea fisierelor de tip text
Prelucrarea unui fisier se face dupa urmatorul algoritm:
while(daca nu este sfirsit de fisier)
{
citeste ;
prelucreaza ;
}
Pentru a preciza sfirsitul de fisier care se testeaza in paranteza de dupa while se scrie:
! nume_fisier.eof()
Atentie! Functia eof() nu citeste ci doar testeaza daca anterior a fost detectat
sfarsitul de fisier
Exemple de programe:
Exemplul1. Creez un fisier fis.txt in d:\ cu intrare de la tastatura (scriu in el de la
tastatura).In acest exemplu nu sunt scrise caracterele albe(deci intre cuvintele scrise nu
este spatiu.Ca sa termin scrierea apas consecutiv tastele CTRL+Z (echivalent cu EOF)

#include<iostream.h>
#include<fstream.h>
#include<iomanip.h>
#include<conio.h>
void main()
{
fstream f("d:\\fis.txt",ios::out);
char x;
while(cin>>x) f<<x;
f.close();
}

Exemplul2. Creez acelasi fisier dar for fi scrise si caracterele
albe. Aceasta sa realizat deoarece a fost introdusa comanda
resetiosflags(ios::skipws)

#include<iostream.h>
#include<fstream.h>
#include<iomanip.h>
#include<conio.h>
void main()
{
fstream f("d:\\fis.txt",ios::out);
char x;
while(cin>>resetiosflags(ios::skipws)>>x) f<<x;
f.close();
getch();
}

Implementarea algoritmilor – Limbajul C++ Informatică

23


Exemplul3. Afisez fisierul creat la exemplul2

#include<iostream.h>
#include<fstream.h>
#include<iomanip.h>
#include<conio.h>
void main()
{
fstream f("d:\\fis.txt",ios::in);
char x;
while(f>>resetiosflags(ios::skipws)>>x) cout<<x;
f.close();
getch();
}

Exemplul4. Scriu la sfirsitul fisierului creat la exemplul2

#include<iostream.h>
#include<fstream.h>
#include<iomanip.h>
#include<conio.h>
void main()
{
fstream f("d:\\fis.txt",ios::app);
char x;
while(cin>>resetiosflags(ios::skipws)>>x) f<<x;
f.close();
getch();
}

Exemplul5. Creez un fisier al carui nume il dau de la tastatura si scriu in el.

#include<iostream.h>
#include<fstream.h>
#include<iomanip.h>
#include<conio.h>
void main()
{
char fisier[10];
cout<<"Numele fisierului este ";cin>>fisier;
fstream f(fisier,ios::out);
char x;
while(cin>>resetiosflags(ios::skipws)>>x) f<<x;
f.close();
getch();
}

Observatie: Cand scriu numele fisierului trebuie sa specific si locatia lui astfel:
c:\nume_fisier.txt sau d:\nume_fisier.txt

Exemplul6. Cuvantul "FINISH" se adauga la sfarsitul fisierului creat la exemplul2.
Implementarea algoritmilor – Limbajul C++ Informatică

24



#include<string.h>
#include<fstream.h>
#include<stdlib.h>
#include<iomanip.h>
#include<conio.h>
void main()
{
fstream f("d:\\fis.txt",ios::in|ios::out);
char c[100];
f>>resetiosflags(ios::skipws)>>c ;cout<<c;
f.seekp(0,ios::end);
strcpy(c,"FINISH");
f<<resetiosflags(ios::skipws)<<c;
f.close();
getch();
}

& Functia: nume_fisier.seekp(0,ios::end) - pozitioneaza pointerul in fisierul precizat
- primul parametru reprezinta pozitia pointerului
- al doilea parametru reprezinta reperul in raport de care este calculata pozitia
Sunt definite trei constante:
end - sfarsit de fisier
beg - inceput de fisier
cur - pozitia curenta in fisier
& Functia : nume_fisier.tellp() - returneaza pozitia pointerului la un moment dat.

Exemplul7. Se convertesc primele n numere naturale in octal si hexazecimal

#include<iostream.h>
#include<fstream.h>
#include<iomanip.h>
#include<conio.h>
void main()
{
fstream f("C:\\numere.txt",ios::out,ios::in);
int i,n;
cout<<"Introduce numarul n= ";cin>>n;
for(i=1;i<=n;i++) {
f<<setw(10)<<oct<<i;
f<<setw(10)<<dec<<i;

f<<setw(10)<<setiosflags(ios::uppercase)<<hex<<i<<endl;
};
f.close();
getch();
}

Implementarea algoritmilor – Limbajul C++ Informatică

25



2. FISIERE BINARE.

Caracteristici:
- fisierele sunt alcatuite din mai multe inregistrari de acelasi tip (int , struct, etc)
- datele sunt memorate in format intern, iar fisierele se termina tot cu EOF
- pentru deschiderea unui fisier binar se utilizeaza ios::binary
- fisierele lucreaza cu variabile de tip pointer. O astfel de variabila retine o anumita adresa
a unei alte variabile. Ea se declara in felul urmator:
int a, *adr_a=&a , variabila *adr_a a fost initializata cu adresa variabilei a
Variabila *adr_a este de tip poiner
Pentru a obtine adresa unei variabile , variabila este precedata de operatorul &
Daca avem o variabila a de tip int* si o variabila b de tip float* nu este permisa atribuire
de tipul a=b , aceasta atribuire se poate face astfel a=(int*)b
- scrierea unei variabile de tip pointer adr_p intr-un fisier se face utilizand:
nume_fisier.write((char*) adr_p,sizeof(p))
- citirea unei variabile de tip poiter adr_p dintr-un fisier se face utilizand:
nume_fisier.read((char*)adr_p,sizeof(p))
Prin aceste comenzi de fapt se scrie respectiv citeste continutul variabilei p , numarul de
caractere scrise sau citite fiind date de lungimea variabilei p prin comanda sizeof(p).
Exemplul1. Se creaza un fisier binar cu n inregistrari in care fiecare inregistrare retine
datele personale a unei persoane(numele,prenumele,ocupatia,varsta)

Sign up to vote on this title
UsefulNot useful