Documente Academic
Documente Profesional
Documente Cultură
LA INFORMATICA
TEMA PROIECTULUI
Subprograme
Motivatie
Am ales “Subprograme” drept tema pentru lucrarea de atestat pentru ca ele au o deosebita
importanta practica in programarea C++ iar principiul care sta la baza lor are o larga aplicabilitate in
viata de zi cu zi. Subprogramele, numite in C++ functii, fac posibila crearea programelor complicate
intr-un mod efi cient diminuand munca pe care programatorul o depune. Functiile impart o
problema aparent foarte complicata in mai multe probleme mai mici care pot fi cu usurinta
rezolvate. Prin interactiunea mai multor functii simple se rezolva o problema complexa.
Definitie
Subprogramele sunt parti ale unui program defi nite in afara functiei main, identifi cabile prin nume
si aeplabile de cate ori este nevoie. Ele contin tipuri de date, variabile si instructiuni in vederea unei
anumite prelucrari. Pentru a face referire la un subprogram, in C++ se foloseste doar notiunea de
functie, spre deosebire de limbajul Pascal unde subprogramele se impart in functii si proceduri.
Avantaje
Funcţiile :
• permit obţinerea unor funcţii mai complexe prin combinareaunora mai simple, care scriu, citesc,
testează şi depanează programe
Un program C++ conţine cel putin o funcţie main() care este apelată la lansarea în execuţie a
programului, funcţii predefi nite (de bibliotecă) şifuncţii construite de programator.
Structura:
Dacă o funcţie este apelată dintr-o bibliotecă standard sau defi nită de utilizator sub forma de fi şier
obiect sau dacă se afl ă într-un alt fi şier sursă, pentru a verifi ca validitatea apelurilor de către
compilator esteobligatorie folosirea declaraţiei acelei funcţii, declaraţie numită prototip.
tip-rez nume(lista);
unde lista poate conţine doar tipul parametrilor şi numărul lor fără a fi neapărat necesară şi specifi
carea numelui lor (care este însărecomandată).Prototipul unei funcţii trebuie pus înaintea primului
apel al său, de obiceichiar la începutul programului.
Definitia unei functii este alcatuita din: tip_returnat nume_funcţie(lista parametrilor formali)
El conține următoarele:
Antetul subprogramului:
În cazul în care tipul rezultatului este diferit de void, corpul funcţiei trebuie să conţină cel puţin o
instrucţiune return. Instrucţiunea return va specifi ca valoarea calculată şi returnată de funcţie care
trebuie să fi e de acelaşi tip ca şi tip_returnat.
Instructiune 1;
Instructiune 2;
Instructiune 3;
Corpul funcţiei este un bloc, care implementează algoritmul de calcul folosit de către funcţie. În
corpul funcţiei apar (în orice ordine) declaraţii pentru variabilele locale şi instrucţiuni.
apar în antetul subprogramului şi sunt utilizaţi de subprogram pentru descrierea abstractă a unui
proces de calcul.
Parametri actuali
apar în instrucţiunea de apelare a unui subprogram şi sunt folosiţi la execuţia unui proces de calcul
pentru valori concrete.
Parametrii formali nu sunt variabile. O variabilă este caracterizată de nume, tip, şi adresă. Legarea
unui parametru formal la o adresă se realizează în timpul execuţiei instrucţiunii de apelare a
subprogramului.
Lista parametrilor formali
-listă de declaraţii de variabile separate prin virgulă. Această listă poate să fie şi vidă.
Corpul functiei
Modul de definitie:
Exemple:
Apelul unei funcții operand se realizează in expresii (atribuire, instrucțiuni de control (if, while, for) )
sau ca parametrii ai unei alte funcții.
- character
- pointer
-înregistrare(struct)
Variabile
Sistemul de operare alocă fi ecărui program trei zone distincte în memoria internă în care se găsesc
memorate variabilele programului:
o Segment de date
o Segment de stivă
o Heap.
Funcţia main.
În C, numele de funcţie main determină prima instrucţiune pe care o va executa programul. Acesta
este unica diferenţă dintre main şi celelalte funcţii.
Funcții operand: subprogram care returnează un rezultat chiar prin numele lui, dar eventual poate
returna și alte rezultate prin intermediul parametrilor de ieșire; 2.
Funcții procedurale: subprogram care are una, mai multe sau nici o valoare, valorile se returnează
prin intermediul parametrilor; apelul unei funcții procedurale se realizează printr-o instrucțiune
procedurala cu sintaxa: 1.
Variabile locale
La fel cum se declară variabilele în cadrul funcţiei main, la fel se pot declara varibile în cadrul
celorlalte funcţii. Aceste variabile se numesc locale şi sunt accesibile doar de funcţia care le-a
declarat.
La fel în cadrul unei funcţii se pot apela şi alte funcţii, ca şi în main, dacă acestea au fost defi nite
înaintea eventualului apel sau dacă este prezent un prototip de funcţie înaintea funcţiei apelante şi o
defi niţie de funcţie în cadrul programului respectiv sau în fi şierele incluse în programului respectiv.
Variabile globale
Sunt declarate în afara oricărei funcţii şi pot sunt vizibile (pot fi utilizate) în tot programul (în
rogramul principal şi în subprograme) din momentul declarării lor.
Mai jos, sunt cateva exemple care ilustreaza modul de folosire a variabilelor locale si globale.
# include <iostream.h>
int N;
void f1()
{int x=5;
N=10;
void main ()
{N=4;
cout << N;
f1();
Se va afişa: 4 10 5
#include <iostream.h>
int N;
void f1()
{int x=5;
P=2 //eroare
int P=9;
void main ()
{f1();
cout << x;
P=7;//corect
Compilatorul generează eroare deoarece funcţia main încearcă să acceseze variabila x care este
vizibilă doar în funcţia f1().
# include
<iostream.h>
int N;
void f1(int p)
int x=p;
cout << x;
void main ()
f1(3);}
Se afişează 3
Transmiterea parametrilor
Parametrii actuali trebuie să corespundă celor formali, ca număr şi tip de date. Tipul parametrilor
actuali trebuie fi e să coincide cu tipul parametrilor formali, fi e să poată fi convertit implicit la tipul
parametrilor formali.
În cadrul subprogramului, parametrii transmişi şi memoraţi în stivă sunt variabile. Numele lor este
cel din lista parametrilor formali.
Parametrului i se atribuie o valoare, o expresie sau conţinutul unei variabile. Se folosește, de obicei,
numai pentru parametrii de intrare.Dacă se utilizează, totuși, acest mod pentru transmiterea
rezultatelor, se pot folosi variabile de tip pointer.
Varianta 1
# include <iostream.h>
int a,b;
void
{int z;
int main()
{cin>>a>>b;
//a=10, b=20
sch(a,b);
Varianta 2
# include <iostream.h>
int a,b;
void
{int z;
int main()
{cin>>a>>b;//a=10, b=20
sch(&a,&b);//atenție la parametri
return 0;
Subprogramul primeşte o adresă de memorie la care este stocată variabila primită ca parametru. Se
foloseşte pentru parametrii de ieşire, sau intrare/ieşire. In lista parametrilor formali, sunt precedaţi
de operatorul adresă de memorie (caracterul &).
Parametrii efectivi corespunzători parametrilor formali transmişi prin referinţă TREBUIE să fi e doar
variabile, adică nu pot fi constante, expresii, apeluri ale altor funcţii;
Varianta 3
# include <iostream.h>
int a,b;
{int z;
int main()
sch(a,b);
return 0;
Supradefinirea funcţiilor
Această facilitate permite obţinerea unui rezultat chiar dacă tipurile parametrilor diferă. Ea
contribuie la simplifi carea programării pentru că permite folosirea unui singur nume de funcţie când
programul trebuie să îndeplinească o anumită sarcină.
Parametrul tablou
Funcţiile care transmit ca parametru un tablou necesită declararea acelui parametru ca pointer la
tipul de bază al tabloului.
tip_baza nume_tablou;
Exemplu. Funcţia calculează suma elementelor lui vector. Parametrul int* este tipul de bază al
parametrului vector.
void main ()
s + = p[i];
return s;
Şirurile de caractere în C + + sunt considerate tablouri de caractere. Dacă un şir de caractere este
parametrul unei funcţii, pentru el sunt valabile aceleaşi reguli ca la parametrul tablou.
Exemplu:
struct persoana
char nume[20];
int varsta;
};
gets(x.nume);
void main ()
clrscr();
persoana P;
Citeste (P);
Afi seaza(P);
Modificarea membrilor structurii necesita apelul prin referinţă pe cand pentru a afi şa o structură
este sufi cient apelul prin valoare
Funcţii recursive
Dacă o funcţie se autoapelează direct sau indirect se numeşte recursivă. Astfel apelul unei funcţii
recursive poate apărea şi în defi niţia sa. O funcţie recursivă nu are sintaxă specială. Ea implică
existenţa unei stive care la fi ecare apel al funcţiei recursive se încarcă cu valorile parametrilor,
variabilelor locale şi rezultatului. La fi ecare revenire,această stivă este descarcată. Recursivitatea se
aplică în special la prelucrarea structurilor de date de tiprecursiv cum ar fi liste, arbori, etc.
Exemplu.
Calcul nerecursiv
int rez=1;
void main ()
{
int num;
cin >>num;
cout << endl << “ Rezultat:”<< num <<”!=”<<factorial (num) << endl;
Calcul recursiv
if (n==0)
return 1;
else
return n*fact(n-1);
void main ()
int num;
cin >>num;
cout << endl << “ Rezultat:”<< num <<”!=”<<fact (num) << endl;
Aplicatii
Problema nr. 1.
(c.m.m.d.c.)
#include<iostream>
using namespace std;int cmmdc(int a,int b)
if(a==b) return a;
int main(){
int x,y;
cout<<"x=";cin>>x;
cout<<"y=";cin>>y;
Problema nr 2.
#include<iostream>
long n,c,d,k;
int prim(long n)
for(int i=2;i<=sqrt(n);i++)
if(n%i==0) return 0;
return 1;
long rasturnat(long n)
{d=0;
while(n!=0)
{c=n%10;
d=d*10+c;
n=n/10;
}return d;
Problema nr. 3.
numar
, cu trei parametri, care primeşte prin intermediul parametrului n un număr natural format din cel
mult 9 cifre, iar prin intermediul parametrilor c1 şi c2 câte o cifră nenulă. Subprogramul caută fi
ecare apariţie a cifrei c1 în n, şi dacă aceasta apare, o înlocuieşte cu c2. Subprogramul furnizează tot
prin n numărul astfel obţinut. Dacă cifra c1 nu apare în n, atunci valoarea lui n rămâne nemodifi cată.
#include<iostream>
int p=0,p1=1,c;
long nr=n;
while(nr)
p=p+1;
if(nr%10==c1)
p1=1;
for(int i=1;i<p;i++)
p1=p1*10;
cout<<p1<<endl;
c=n%p1;
cout<<"c="<<c;
cout<<endl;
p1=p1*10;
n=n/p1;
n=n*10+c2;
p1=p1/10;
n=n*p1+c;
cout<<n<<endl;
nr=nr/10;
int main(){
long n;
int c1,c2;
cin>>n>>c1>>c2;numar(n,c1,c2);
cout<<n;
Problema nr. 4.
#include <iostream>
#include <conio.h>
int a[10],b[10],na,nb,nc,c[20];
int i,ok,aux;
do{ok=1;
for (i=0;i<n-1;i++)
if (x[i]>x[i+1]){
ok=0;
aux=x[i];
x[i]=x[i+1];
x[i+1]=aux;
}}while(!ok);}
int i,j,ok=1;
nc=na;
for (i=0;i<nb;i++){
ok=1;
for (j=0;j<na;j++)
if (a[j]==b[i]){
ok=0;
break;
}if (ok){
v[nc]=b[i];
nc++;
}}}
int main(){
clrscr();
citire(a,na);
citire(b,nb);
ordonare(a,na);
ordonare(b,nb);
afi sare(a,na);
cout<<endl;
cout<<endl;
inter(c);
afi sare(c,nc);
getch();
Problema nr. 5.
Scrieti un program C/C++ care citeste de la tastatura un numar natural nenul n (1≤n≤100),
construieste in memorie si apoi afi seaza pe ecran un tablou unidimensional a, avand n elemente.
Tabloul a se completeaza cu numerele naturale de la 1 la n, astfel : se memoreaza valoarea 1 pe
pozitia 1, valoarea 2 pe pozitia n, 3 pe pozitia 2, 4 pe pozitia n-1, 5 pe pozitia 3, etc.
#include<iostream>
#include<math.h>
int n,i,a[100];
void citire()
cin>>n;
for(i=1;i<=ceil((fl oat)n/2);i++)
a[i]=2*i-1;
for(i=n;i>ceil((fl oat)n/2);i--)
a[i]=2*(n-i)+2;
int main()
citire();
for(i=1;i<=n;i++)
cout<<a[i]<<" ";
}
CONCLUZII
Subprogramele au o serie de avantaje care fac programarea mai usoara si mai efi cienta. Impartirea
unei probleme mari in mai multe probleme mici este un principiu aplicabil in viata de zi cu zi, fapt
care m-a determinat sa aleg aceasta tema pentru sustinerea lucrarii de atestat la informatica.