Pentru utilizarea funcţiilor în C++, este necesară cunoaşterea următoarelor aspecte de bază:
a) Funcţiile grupează setul de operatori pentru îndeplinirea unei sarcini concrete.
b) Programul principal apelează funcţia, prin numele ei, după care urmează paranteze rotunde.
c) După terminarea prelucrării informaţiei, majoritatea funcţiilor întorc programului principal valori de tipuri concrete, care pot fi folosite în calcule.
d) Programul principal transmite funcţiilor parametrii (informaţia iniţială), inclusă în paranteze rotunde, care urmează după numele funcţiei.
e) Limbajul C++ foloseşte prototipuri de funcţie pentru determinarea tipului valorii returnate de câtre funcţie, a cantităţii si tipurilor parametrilor transmişi funcţiei.
În timpul creării programului, e necesar să se rezerve fiecare funcţie pentru rezolvarea unei sarcini. Fiecare funcţie creată trebuie să primească un nume unic.
Ca şi în cazul variabilelor, numele unei funcţii este un identificator şi e de dorit să corespundă cu sensul logic al sarcinii pe care o îndeplineşte.
Funcţiile din C++ se aseamănă structural cu funcţia principală main().
În faţa numelui funcţiei se indică tipul ei, iar după numele funcţiei urmează lista de parametri descrişi în interiorul parantezelor rotunde.
Corpul funcţiei (compus din operatori) este amplasat după descrierea parametrilor, între acolade.
Sintaxa descrierii unei funcţii:
tip_f nume_f (lista parametri) {declarare de variabile; operatori;}
unde
tip_f - tipul funcţiei sau tipul valorii returnate de funcţie,
nume_f - numele funcţiei.
Dacă funcţia nu întoarce valori, tipul ei este void.
1. Transmiterea parametrilor în funcţie.
Dacă funcţia foloseşte parametri, ei trebuie descrişi în cadrul descrierii funcţiei.
În timpul descrierii parametrelor funcţiei se indică numele şi tipul fiecărui parametru.
tip_parametru nume_parametru;
Dacă funcţia conţine mai mulţi parametri, ei vor fi descrişi împreună între parantezele rotunde după numele funcţiei, despărţiţi prin virgulă
tip_funcţie nume_funcţie (tip_parametru1 nume_parametru1,
tip_parametru2 nume_parametru2
….
tip_parametruN nume_parametruN );
În unele surse de descriere a limbajului de programare C/C++, parametrii ce se transmit din program în funcţie se numesc actuali, iar parametrii ce sunt declaraţi în antetul funcţiei şi cărora li se atribuie valorile parametrilor actuali, se numesc parametri formali.
În momentul folosirii parametrilor în funcţie, este necesară cunoaşterea următoarelor aspecte:
- Dacă funcţia foloseşte parametri, ea trebuie să indice numele unic şi tipul fiecărui parametru.
- Când programul apelează funcţia, compilatorul atribuie valoarea parametrilor de la stânga la dreapta
- Valorile transmise din program în funcţie, trebuie să coincidă ca număr, loc şi tip cu parametrii din funcţie.
2. Întoarcerea valorilor din funcţie.
Obiectivul oricărei funcţii este îndeplinirea unei sarcini concrete. În majoritatea cazurilor, funcţiile vor efectua calcule. După aceasta, funcţia va întoarce rezultatul fie funcţiei din care a fost apelată, fie funcţiei principale main. În momentul când funcţia întoarce o valoare, trebuie să fie cunoscut tipul ei. Tipul valorii returnate de funcţie se indică în momentul descrierii funcţiei, înainte de numele ei. Tipul valorii returnate se mai numeşte şi tipul funcţiei.
Funcţiile folosesc operatorul return pentru a întoarce valori funcţiilor din care au fost apelate.
Când compilatorul întâlneşte operatorul return, el întoarce valoarea dată şi încheie necondiţionat executarea funcţiei curente, controlul executării programului fiind cedat funcţiei din care a fost chemată funcţia curentă. Dacă după operatorul return, în funcţie mai există şi alţi operatori, ei vor fi ignoraţi, funcţia terminîndu-se odată cu îndeplinirea operatorului return.
În cadrul unui subprogram pot exista mai multe instrucţiuni return. Dacă există mai multe instrucţiuni return, ele se vor găsi obligatoriu pe ramuri diferite ale unor instrucţiuni IF-ELSE (una singură pe fiecare ramură).
Deoarece atunci când compilatorul întâlneşte instrucţiunea return se încheie executarea funcţiei curente, controlul executării programului fiind cedat funcţiei din care a fost chemată funcţia curentă, înseamnă că funcţia va executa o singură instrucţiune return.
Valoarea întoarsă de funcţie poate fi folosită în orice loc al programului, unde e posibilă folosirea unei valori de tip identic cu valoarea returnată. Când funcţia întoarce o valoare, această valoare poate fi atribuită unei variabile de acelaşi tip, folosind operatorul de atribuire. Valoarea mai poate fi folosită în cadrul instrucţiunilor de afişare, în cadrul instrucţiunilor de decizie sau a instrucţiunulor de ciclare.
De asemenea, ea poate fi folosită ca parametru în cadrul apelului altei funcţii.
3. Prototipul funcţiei.
Înainte de apelul unei funcţii, compilatorul C++ trebuie să cunoască tipul valorii returnate, cantitatea şi tipul parametrilor folosiţi de funcţie.
Există însă situaţii cînd unele funcţii în program sînt apelate reciproc. În aceste cazuri, este posibilă situaţia cînd o funcţie va fi apelată înaintea descrierii sale.
În acest caz, se folosesc prototipuri ale funcţiilor. Prototipul unei funcţii este amplasat la începutul programului şi conţine informaţia despre tipul valorii returnate, cantitatea şi tipul parametrilor folosiţi de funcţie.
Odată declarat prototipul unei funcţii, înainte de a fi început corpul programului, descrierea funcţiei poate fi făcută după acolada de închidere a programului principal.
4. Variabile locale şi domeniul de vizibilitate.
Apare adeseori necesitatea folosirii în funcţii a variabilelor proprii.Variabilele declarate în cadrul funcţiei e numesc variabile locale. Numele şi valoarea unei variabile locale sunt cunoscute numai funcţiei în care ea a fost declarată. Chiar faptul că variabila locală există este cunoscut numai de către funcţia în are ea a fostd eclarată. Declararea variabilelor are loc la începutul funcţiei, imediat după acolada care deschide corpul acesteia. Numele variabilei locale trebuie să fie unic în funcţia în care a fost declarată. O variabilăse numeşte locală, din cauză că este văzută numai din funcţia în care a fost descrisă.
Sintaxa de declarare a unei variabile locale:
tip_f numele_f (lista parametrilor) {tip_vl numele_vl;}
unde:
tip_f - tipul funcţiei;
nume_f - numele funcţiei;
tip_vl - tipul variabilei;
numele_vl - numele variabilei;
Principiile de declarare şi folosire a unei variabile locale oricărei funcţii sunt identice cu principiile de declarare şi utilizare a unei variabile declarate în corpul funcţiei principalemain( );
O variabilă declarată în corpul funcţiei main() este şi ea locală acestei funcţii.
În general, tot ceea ce este valabil pentru a fost spus despre variabilele declarate în funcţia main( ) - tipurile, numele, principiile de utilizare ş.a.- rămâne valabil şi pentru o variabilă locală, din orice altă funcţie.
5. Variabile globale
Numim variabilă globală o variabilă pentru care numele şi valoarea sunt cunoscute pe parcursul întregului program, orice funcţie din acest program.
Pentru a crea o variabilă globală, se foloseşte declararea ei la începutul programului, în afara oricărei funcţii. Orice funcţie (inclusiv funcţia main), care va urma după această declarare, poate folosi această variabilă globală.
Declararea unei variabile globale:
# include<…>
# include<…>
…
# include<…>
tip_vg nume_vg;
eventuale declaraţii de funcţii
void main (void){…}
unde tip_vg este tipul variabilei globale, iar nume_vg – numele variabilei globale.
Fiind declarată o variabilă globală, valoarea ei nu numai că e cunoscută oricărei funcţii din program, dar şi poate fi şi schimbată de către oricare dintre funcţiile prezente în program.
Cu toate că prezenţa variabilelor globale în program adaogă noi posibilităţi, este de dorit să nu se facă abuz de folosirea lor. Din cauză că orice funcţie din program poate schimba valoarea variabilei globale, este dificil de urmărit toate funcţiile care ar putea schimba această valoare, ceea ce conduce la un control dificil asupra execuţiei programului
6. Conflicte dintre variabile locale şi globale
În cazul în care un program trebuie să folosească o variabilă globală, poate apărea o situaţie de conflict între numele variabilei globale şi numele unei variabile locale. În aceste cazuri, limbajul C++ oferă prioritate variabilei locale.
Dacă există o variabilă globală cu acelaşi nume ca o variabila locală, compilatorul consideră, că orice apel al variabilei cu acest nume este un apel al variabilei locale.
Există situaţii, când apare necesitatea de a se adresa o variabilă globală care se află în conflict cu o variabilă locală. În acest caz, se poate folosi operatorul global de acces :: .




O varianta online poate fi exersata la xxx sau la subprogrameEx1



O varianta online poate fi exersata la xxx sau la subprogrameEx2


O varianta online poate fi exersata la xxx sau la subprogrameEx3

Pentru vectorul de 40 de elemente:
17 3 22 23 15 17 4 11 47 28 5 9 41 21 37 5 18 33 12 17 4 81 33 14 29 5 44 62 11 76 1 52 48 79 6 35 32 33 8 28
se obtine rezultatul

O varianta online poate fi urmarita la xxx sau la subprogrameVectori1

Pentru vectorul de 40 de elemente:
17 3 22 23 15 17 4 11 47 28 5 9 41 21 37 5 18 33 12 17 4 81 33 14 29 5 44 62 11 76 1 52 48 79 6 35 32 33 8 28
se obtine rezultatul

Text
Text
Text
Text
Text
Text
#include <iostream>
#include <graphics.h>
#include <winbgim.h>
#include <fstream>
using namespace std;
struct nod{
nod * ante;
char nume[30];
float lat, lng;
nod * post;
};
nod * curent, * prim, * ultim, * ajut, * aux;
int n=0, i, poz, pozcautat, gasit;
char oras[30], numefis[25];
void creare(){
cout<<"Pun bazele unei noi liste, prin crearea primului nod"<<endl<<endl;
prim = new nod;
cout << "nume = ? "; gets(prim -> nume);
cout << "latitudinea = ? "; cin >> prim -> lat;
cout << "longitudinea = ? "; cin >> prim -> lng;
prim -> ante = 0;
prim -> post = 0;
ultim = prim;
n=1;
}
void listarestdr(){
cout<<"Lista are "<<n<<" noduri"<<endl;
cout<<"Lista de la stanga la dreapta : "<<endl<<endl;
curent = prim;
while(curent -> post !=0){
cout<<curent->nume<<" "<<curent->lat<<" "<<curent->lng<<endl;
curent = curent -> post;
}
cout<<curent->nume<<" "<<curent->lat<<" "<<curent->lng<<endl;
}
void listaredrst(){
cout<<"Lista are "<<n<<" noduri"<<endl;
cout<<"Lista de la dreapta la stanga : "<<endl<<endl;
curent = ultim;
while(curent -> ante !=0){
cout<<curent->nume<<" "<<curent->lat<<" "<<curent->lng<<endl;
curent = curent -> ante;
}
cout<<curent->nume<<" "<<curent->lat<<" "<<curent->lng<<endl;
}
void insmijloc(){
int rasp;
cout<<" Inserarea unui nod dupa un nod cu un nume cautat"<<endl;
cout<<" Introduceti numele orasului cautat: "; gets(oras);
cout<<" cauti orasul "<<oras<<endl<<endl;
poz=0;
i=1; int gasit=0;
curent=prim;
while(i<=n && !gasit){
cout<<"sunt la orasul "<<curent->nume<<endl;
cout<<"compar orasul "<<oras<<" cu "<<curent->nume<<endl;
if(!strcmp(oras,curent->nume)) {poz=i; gasit=1; cout<<"atentie!"<<endl;}
cout<<"gasit="<<gasit<<endl;
curent=curent->post;
i++;
}
if(gasit) {
cout<<"am gasit orasul pe pozitia "<<poz<<endl;
ajut=new nod;
cout<<"Introduceti noul nume de oras "; gets(ajut -> nume);
cout<<"Introduceti latitudinea noului oras "; cin>>ajut -> lat;
cout<<"Introduceti longitudinea noului oras "; cin>>ajut -> lng;
curent = curent ->ante;
ajut -> ante = curent;
ajut -> post = curent -> post;
curent -> post = ajut;
aux = ajut -> post;
aux -> ante = ajut;
n++;
}
}
void insinaint(){
cout<<"Inserez un nod inainte de prima pozitie"<<endl<<endl;
ajut = new nod;
cout << "nume = ? "; gets(ajut -> nume);
cout << "latitudinea = ? "; cin >> ajut -> lat;
cout << "longitudinea = ? "; cin >> ajut -> lng;
ajut -> post = prim;
prim -> ante = ajut;
ajut -> ante = 0;
prim = ajut;
n++;
}
void inscoada(){
cout<<"Inserez un nod dupa ultima pozitie"<<endl<<endl;
ajut = new nod;
cout << "nume = ? "; gets(ajut -> nume);
cout << "latitudinea = ? "; cin >> ajut -> lat;
cout << "longitudinea = ? "; cin >> ajut -> lng;
ajut -> ante = ultim;
ultim -> post = ajut;
ajut -> post = 0;
ultim = ajut;
n++;
}
void stergint(){
int rasp;
cout<<"Alegeti:"<<endl<<
"1. Stergerea unui nod de pe o pozitie data"<<endl<<
"2. Stergerea unui nod cu un continut dat"<<endl;
cin>>rasp;
if(rasp==1){
cout<<"Introduceti pozitia orasului cautat: "; cin>>pozcautat;
cout<<"cauti orasul de pe pozitia "<<pozcautat<<endl<<endl;
poz=0;
i=1; int gasit=0;
curent=prim;
while(i<=n && !gasit){
if(i==pozcautat){poz=i;gasit=1;break;}
curent=curent->post;
i++;
}
if(gasit){
aux=curent->ante;
aux->post=curent->post;
aux=curent->post;
aux->ante=curent->ante;
n--;
cout<<"Lista are acum "<<n<<" noduri"<<endl;
}
else cout<<"Nu exista pozitia cautata in lista"<<endl;
}
if(rasp==2){
cout<<"Introduceti numele orasului cautat: "; gets(oras);
cout<<"cauti orasul "<<oras<<endl<<endl;
poz=0;
i=1; int gasit=0;
curent=prim;
while(i<=n && !gasit){
cout<<"sunt la orasul "<<curent->nume<<endl;
cout<<"compar orasul "<<oras<<" cu "<<curent->nume<<endl;
if(!strcmp(oras,curent->nume)) {poz=i; gasit=1; cout<<"atentie!"<<endl;}
cout<<"gasit="<<gasit<<endl;
curent=curent->post;
i++;
}
if(gasit) {
cout<<"am gasit orasul pe pozitia "<<poz<<endl;
curent = curent -> ante;
aux = curent ->ante;
aux -> post = curent -> post;
aux = curent -> post;
aux -> ante = curent -> ante;
n--;
cout<<"Lista are acum "<<n<<" noduri"<<endl;
}
else cout<<"n-am gasit orasul"<<endl;
}
}
void stergprim(){
cout<<"Sterg primul nod"<<endl;
if(ultim->ante==0 && ultim->post==0)
{cout<< "A mai ramas un singur nod" <<endl;}
else{curent=prim->post;
curent->ante=0;
prim=curent;
n--;
}
cout<<"Lista are acum "<<n<<" noduri"<<endl;
}
void stergult(){
cout<<"Sterg ultimul nod"<<endl;
if(ultim->ante==0 && ultim->post==0)
{cout<< "A mai ramas un singur nod" <<endl;}
else
{curent=ultim->ante;
curent->post=0;
ultim=curent;
n--;}
cout<<"Lista are acum "<<n<<" noduri"<<endl;
}
void modific(){
int rasp;
cout<<endl<<endl;
cout<<"Alegeti:"<<endl;
cout<<"1. Modificarea continutului unui nod de pe o pozitie data"<<endl;
cout<<"2. Modificarea continutului unui nod cu un nume dat"<<endl;
cin>>rasp;
if(rasp==1){
cout<<"Introduceti pozitia orasului cautat: "; cin>>pozcautat;
cout<<"cauti orasul de pe pozitia "<<pozcautat<<endl<<endl;
poz=0;
i=1; int gasit=0;
curent=prim;
while(i<=n && !gasit){
if(i==pozcautat){poz=i;gasit=1;break;}
curent=curent->post;
i++;
}
if(gasit){
cout<<"am gasit orasul de pe pozitia "<<poz<<endl;
cout<<"Introduceti noul nume de oras "; gets(curent -> nume);
cout<<"Introduceti latitudinea noului oras "; cin>>curent -> lat;
cout<<"Introduceti longitudinea noului oras "; cin>>curent -> lng;
}
else cout<<"nu exista pozitia cautata in lista"<<endl;
}
if(rasp==2){
cout<<"Introduceti numele orasului cautat: "; gets(oras);
cout<<"cauti orasul "<<oras<<endl<<endl;
poz=0;
i=1; int gasit=0;
curent=prim;
while(i<=n && !gasit){
cout<<"sunt la orasul "<<curent->nume<<endl;
cout<<"compar orasul "<<oras<<" cu "<<curent->nume<<endl;
if(!strcmp(oras,curent->nume)) {poz=i; gasit=1; cout<<"atentie!"<<endl;break;}
cout<<"gasit="<<gasit<<endl;
curent=curent->post;
i++;
}
if(gasit) {
cout<<"am gasit orasul pe pozitia "<<poz<<endl;
cout<<"Introduceti noul nume de oras "; gets(curent -> nume);
cout<<"Introduceti latitudinea noului oras "; cin>>curent -> lat;
cout<<"Introduceti longitudinea noului oras "; cin>>curent -> lng;
}
else cout<<"n-am gasit orasul"<<endl;
}
}
void grafic(){
int n, i;
float x[20], y[20], maxx, minx, maxy, miny, dx, dy;
float canvmaxx=639, canvmaxy=479, b=20;
char nume[20][20];
cout<<endl<<endl;
ifstream xx(numefis);
xx>>n;
maxx=0; minx=639; maxy=0; miny=439;
for(i=1; i<=n; i++){
xx>>nume[i]; cout<<i<<" "<<nume[i]<<" : ";
xx>>y[i]; cout<<y[i]<<" ";
if(y[i]>maxy) maxy=y[i];
if(y[i]<miny) miny=y[i];
xx>>x[i]; cout<<x[i]<<endl;
if(x[i]>maxx) maxx=x[i];
if(x[i]<minx) minx=x[i];
}
dx=maxx-minx;
dy=maxy-miny;
for(i=1; i<=n; i++) x[i]=(x[i]-minx)*(canvmaxx-2*b)/dx+b;
for(i=1; i<=n; i++) y[i]=439-((y[i]-miny)*(canvmaxy-2*b)/dy+b)+2*b;
/* cerere de auto detectie */
int gdriver = DETECT, gmode, errorcode;
/* initializare mod graphics */
initgraph(&gdriver, &gmode, "");
/* citire rezultate initializare */
errorcode = graphresult();
if (errorcode != grOk) /* s-a produs o eroare */
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
exit(1); /* se returneaza codul erorii */
}
setbkcolor(15);
setcolor(8);
line(b-10,b-10,canvmaxx-b+10,b-10);
line(canvmaxx-b+10,b-10,canvmaxx-b+10,canvmaxy-b+10);
line(canvmaxx-b+10,canvmaxy-b+10,b-10,canvmaxy-b+10);
line(b-10,canvmaxy-b+10,b-10,b-10);
delay(500);
for(i=1; i<=n-1; i++){
circle(x[i], y[i], 5);
if(x[i]<600) outtextxy(x[i]+10, y[i], nume[i]);
else outtextxy(x[i]-80, y[i], nume[i]);
delay(2500);
line(x[i], y[i], x[i+1], y[i+1]);
}
circle(x[n], y[n], 5);
if(x[n]<600) outtextxy(x[n]+10, y[n], nume[i]);
else outtextxy(x[n]-80, y[n], nume[i]);
int maximumx = getmaxx();
int maximumy = getmaxy();
/* incheiere mod geaphic */
cin>>n;
closegraph();
}
void salvez(){
cout<<"Salvez lista in fisier"<<endl;
cout<<"Numele fisierului de iesire: "; cin>>numefis;
ofstream fout(numefis);
fout<<n<<" "<<endl;
curent=prim;
fout<<curent->nume<<" "<<curent->lat<<" "<<curent->lng<<" "<<endl;
for(i=2; i<=n; i++){
curent=curent->post;
fout<<curent->nume<<" "<<curent->lat<<" "<<curent->lng<<" "<<endl;
}
}
void caut(){
cout<<"Introduceti numele orasului cautat: "; gets(oras);
cout<<"cauti orasul "<<oras<<endl<<endl;
poz=0;
i=1; int gasit=0;
curent=prim;
while(i<=n && !gasit){
cout<<"sunt la orasul "<<curent->nume<<endl;
cout<<"compar orasul "<<oras<<" cu "<<curent->nume<<endl;
if(!strcmp(oras,curent->nume)) {poz=i; gasit=1; cout<<"atentie!"<<endl;break;}
cout<<"gasit="<<gasit<<endl;
curent=curent->post;
i++;
}
if(gasit) cout<<"am gasit orasul pe pozitia "<<poz<<endl;
else cout<<"n-am gasit orasul"<<endl;
}
void meniu2(){
int rasp;
cout<<"OPERATII CU LISTE :"<<endl<<endl;
cout<<endl;
cout<<" 1: listare de la stanga la dreapta"<<endl;
cout<<" 2: listare de la dreapta la stanga"<<endl;
cout<<" 3: inserare nod in interiorul listei"<<endl;
cout<<" 4: inserare nod pe prima pozitie"<<endl;
cout<<" 5: inserare nod pe ultima pozitie"<<endl;
cout<<" 6: stergerea unui nod din interiorul listei"<<endl;
cout<<" 7: stergerea primului nod"<<endl;
cout<<" 8: stergerea ultimului nod"<<endl;
cout<<" 9: modificarea continutului unui nod"<<endl;
cout<<"10: reprezentare grafica"<<endl;
cout<<"11: salvez lista"<<endl;
cout<<"12: caut dupa continut"<<endl<<endl;
cin>>rasp;
switch (rasp){
case 1: listarestdr();break;
case 2: listaredrst();break;
case 3: insmijloc();break;
case 4: insinaint();break;
case 5: inscoada();break;
case 6: stergint();break;
case 7: stergprim();break;
case 8: stergult();break;
case 9: modific();break;
case 10: grafic();break;
case 11: salvez();break;
case 12: caut();break;
default: exit(1);
}
meniu2();
}
int citire(){
cout<<"Citesc lista din fisier"<<endl;
cout<<"Numele fisierului de intrare: "; cin>>numefis;
ifstream fin(numefis);
fin>>n; cout<<"in fisier sunt "<<n<<" orase"<<endl;
prim = new nod;
fin>>(prim -> nume);
fin >> prim -> lat;
fin >> prim -> lng;
prim -> ante = 0;
prim -> post = 0;
ultim = prim;
for(i=2; i<=n; i++){
ajut = new nod;
fin>>(ajut -> nume);
fin >> ajut -> lat;
fin >> ajut -> lng;
ajut -> ante = ultim;
ultim -> post = ajut;
ajut -> post = 0;
ultim = ajut;
}
return 0;
}
void meniu1(){
int rasp;
cout<<"EXPLOATAREA LISTELOR INLANTUITE"<<endl<<endl;
cout<<"1 Citire lista din fisier"<<endl;
cout<<"2 Lista noua"<<endl<<endl;
cin>>rasp;
switch (rasp){
case 1: citire();meniu2();break;
case 2: creare();meniu2();break;
default: exit(1);
}
}
int main(){
meniu1();
return 0;
}
10
Bucuresti 44.426765 26.102537
Cluj 46.77121 23.623634
Constanta 44.159801 28.634813
Iasi 47.158455 27.601442
Timisoara 45.748871 21.208679
Craiova 44.330177 23.794882
Suceava 47.663452 26.27323
Brasov 45.657974 25.601198
Ploiesti 44.936665 26.012861
Oradea 47.046501 21.918943
