Scrigroup - Documente si articole

Username / Parola inexistente      

Home Documente Upload Resurse Alte limbi doc  
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


SUBPROGRAME C / C++

c



+ Font mai mare | - Font mai mic



Subprograme C / C++



1. Introducere

Consideram urmatoarea secventa de program care memoreaza in variabila max valoarea maxima dintre valorile variabilelor intregi a, b, c:

max=a;

if (max<b)

max=b;

if (max<c)

max=c;

cout << 'max= '<<max;

 


Cele doua instructiuni conditionale realizeaza, de fapt, acelasi lucru: determina valoarea maxima dintre valorile memorate in doua variabile. Procesul de calcul este acelasi, difera doar valorile concrete ale variabilelor pentru care acest proces se executa.

Subprogramele sunt parti ale unui program, identificabile prin nume, care se pot activa la cerere prin intermediul acestor nume.

Prezenta subprogramelor implica functionarea in stransa legatura a doua notiuni: definitia unui subprogram si apelul unui subprogram.

Definitia unui subprogram reprezinta de fapt descrierea unui proces de calcul cu ajutorul variabilelor virtuale (parametri formali) iar apelul unui subprogram nu este altceva decat executia procesului de calcul pentru cazuri concrete (cu ajutorul parametrilor reali, (efectivi, actuali) ).

int Maxim (int p, int q)

 
Deoarece determinarea maximului dintre doua valori poate fi modelata matematic ca o functie si descrierea subprogramului are o structura asemanatoare cu cea a functiei:

Astfel pentru exemplul considerat, sectiunea de program care calculeaza maximul dintre trei valori, poate fi rescrisa astfel:

max = Maxim (a,b);

max = Maxim (max,c);

 


2. Structura unui subprogram C++

Un subprogram (functie) are o definitie si atatea apeluri cate sunt necesare.

2.1. Definitia unei functii are forma generala:

Tip_returnat

Reprezinta tipul rezultatului calculat si returnat de functie si poate fi: int, char, char*, long, float, void, etc.

In cazul in care tipul rezultatului este diferit de void, corpul functiei trebuie sa contina cel putin o instructiune return. Instructiunea return va specifica valoarea calculata si returnata de functie care trebuie sa fie de acelasi tip ca si tip_returnat.

Nume_functie

Reprezinta numele dat functiei de catre cel ce o defineste, pentru a o putea apela.

Lista_parametrilor_formali

Reprezinta o lista de declaratii de variabile separate prin virgula. Aceasta lista poate sa fie si vida.

Instructiune

Este o instructiune vida sau o instructiune simpla sau o instructiune compusa.

2.2. Apelul unei functii . Revenirea dintr-o functie

3.1 Apelul unei functii care nu returneaza o valoare are forma generala:

parametru efectiv = parametru actual = parametru real = parametru de apel

lista parametrilor efectivi = fie vida, fie o expresie sau mai multe despartite prin virgula

3.2. O functie care returneaza o valoare poate fi apelata fie printr-o instructiune de apel simpla (cazul functiilor care nu returneaza valori) si in plus poate fi apelata ca operand al unei expresii. In cazul in care functia se apelaza print-o instructiune de apel simpla, rezultatul functiei se pierde. Cand functia se apeleaza ca operand, valoarea returnata va fi utilizata in expresie.

Ex: char c=getche(); // nu se pierde

getche(); // valoarea se pierde

La apelul unei functii, valorile parametrilor efectivi se atribuie parametrilor formali corespunzatori. In cazul in care unul din tipul unui paramatru efectiv difera de tipul parametrului formal corespunzator, parametrul efectiv va fi convertit spre parametru formal (daca este posibil, altfel compilatorul genereaza eroare).

In momentul in care se intalneste un apel de functie, controlul executiei programul este transferat primei instructiuni din functie, urmand a se executa secvential instructiunile functiei.

3.3 Revenirea dintr-o functie se face in unul din urmatoarele cazuri:

dupa executia ultimei instructiuni din corpul functiei

la intalnirea unei instructiuni return

3.4. Instructiunea return are formatele:

return ;

return expresie ;

Exemplul 3.1

Exemplul 3.2

# include <iostream.h>

# include <conio.h>

void f1 ()

void main (void)

# include <iostream.h>

# include <conio.h>

void f1 (int k)

void main (void)

Se va afisa:

Abc

Se va afisa:

abc abc abc

Functia nu returneaza o valoare

Functia nu are parametri

Apelul functiei este o instructiune de apel simpla

Functia nu returneaza o valoare

Functia are un parametru formal de tip int

Apelul functiei este o instructiune de apel sinpla si se face cu ajutorul unui parametru actual care este de acelasi tip cu tipul parametrului formal corespunzator

Exemplul 3.3

Exemplul 3.4

# include <iostream.h>

# include <math.h>

# include <conio.h>

int prim (int x)

void main (void)

# include <iostream.h>

# include <math.h>

# include <conio.h>

int prim (int x)

void main (void)

Functia returneaza o valoare de tip int

Functia are un parametru de tip int

Rezultatul functiei este este utilizat in cadrul unei expresii.

In cazul in care se intalneste un divizor a lui x se executa instructiunea return 0. Astfel apelul functiei se incheie. Daca x este numar prim, instructiunea return 0 nu se executa niciodata si in acest caz, dupa terminarea executiei instructiunii for, se executa instructiunea return 1 (care determina incheierea executiei functiei).

In cazul in care tipul returnat de functie lipseste din definitia functiei, acesta este implicit int si nu void.

Exemplul 3.5

Exemplul 3.6

Exemplul 3.7

P( )

void main (void)

p( )

void main (void)

void p( )

void main (void)

Compilatorul genereaza WARNING

Se va afisa un numar intreg

Se afiseaza 25

Compilatorul genereaza eroare

4. Prototipul unei functii

Pentru a apela o functie, aceasta trebui mai intai definita. Astfel apelul unei functii trebuie precedat de definitia functiei respective.

O a doua posibilitate de apelare a functiei consta in scrierea prototipului functiei inainte ca acesta sa fie apelata.

Prototipul functiei contine informatii asemanatoare cu cele din antetul functiei. Pot lipsi numele parametrilor formali (conteaza doar tipul si ordinea acestora), in plus acesa este urmat de ";".

Exemplul 4.1.

# include <iostream.h>



# include <conio.h>

int max (int, int);

void main (void)

int max (int a, int b=2)

PROTOTIPUL FUNTIEI

APELUL FUNCTIEI

DEFINITIA FUNCTIEI

antetul functiei

si

- corpul functie

5. Variabile locale si variabile globale

. Functia main.

In C, numele de funtie main determina prima instructiune pe care o va executa programul. Acesta este unica diferenta dintre main si celelalte functii. Din acest motiv se poate spune ca "orice se poate face in main se poate face si in celelalte functii".

Variabile locale

La fel cum se declara variabilele in cadrul functiei main, la fel se pot declara varibile in cadrul celorlalte functii. Aceste variabile se numesc locale si sunt accesibile doar de functia care le-a declarat. La fel in cadrul unei functii se pot apela si alte functii, ca si in main, daca acestea au fost definite inaintea eventualului apel sau daca este prezent un prototip de functie inaintea functiei apelante si o definitie de functie in cadrul programului respectiv sau in fisierele incluse in programului respectiv.

Variabile globale

Variabilele globale sunt declarate inafara oricarei functii si pot sunt vizibile (pot fi utilizate) in tot programul (in programul principal si in subprograme) din momentul declararii lor.

Exemplul 5.1

Exemplul 5.2

Exemplul 5.3

# include <iostream.h>

# include <conio.h>

int N;

void f1()

void main (void)

# include <iostream.h>

# include <conio.h>

int N;

void f1()

int P=9;

void main (void)

# include <iostream.h>

# include <conio.h>

int N;

void f1(int p)

void main (void)

N este variabila globala. Poate fi accesata in cadrul oricarei functii.

x este variabila locala, vizibila doar in cadrul functiei f1()

Se va afisa:

4

Compilatorul genereaza eroare deoarece functia main incearca sa acceseze variabila x care este vizibila doar in functia f1().

Compilatorul genereaza eroare deoarece P este accesata in f1() inainte de a fi declarata.

Se afiseaza 3

N este variabila globala. Poate fi accesata in cadrul oricarei functii.

x este variabila locala. Poate fi accesata doar in cadrul functiei f1()

p este parametru formal. Poate fi accesat doar in f1().

Regula de omonimie

In cazul in care exista o variabila locala care are acelasi nume cu o variabila globala, aceste doua variabile se numesc variabile omonime.

Variabilele locale sunt prioritare (ascund) variabilele globale omonime.

Exemplul 5.4

Int N=10;

Void f1()

void main (void)

Variabila N este definita atat ca variabila globala cat si ca variabila locala in f1().

Se va afisa:

Functia f1() actioneaza asupra variabilei locale N.

Functia main() actioneaza supra variabilei globale N.

Intrebare. Cum gestioneaza compilatorul cele doua variabile omonime ?

Raspuns:

Variabilelor globale li se rezerva spatiu de memorare la inceputul executiei programului, intr-o zona de memorie numita "zona de date". Acest spatiu va fi ocupat pana la incheierea executiei programului.

Variabilelor locale li se rezerva spatiu intr-o zona speciala de memorie numita "stiva". La incheierea executiei subprogramului, continutul stivei este eliberat. Din acest motiv, variabilele globale sun vizibile doar in interiorul subprogramului in care au fost declarate.

6. Parametri formali si parametri actuali

Parametri formali apar in antetul subprogramului si sunt utilizati de subprogram pentru descrierea abstracta a unui proces de calcul .

Parametri actuali apar in instructiunea de apelare a uni subprogram si sunt folositi la executia unui proces de calcul pentru valori concrete.

Parametrii formali nu sunt variabile. O variabila este caracterizata de nume, tip, si adresa. Legarea unui parametru formal la o adresa se realizeaza in timpul executiei instructiunii de apelare a subprogramului.

7. Apel prin valoare si apel prin referinta

Exista doua tipuri de apel al subprogramelor:

A. Apel prin valoare

B.     Apel prin referinta

7.1. Apel prin valoare - se transmite o copie a parametrului actual.

Valorile transmise la apelul unui subprogram sunt memorate in stiva. Datorita faptului ca, dupa terminarea executiei unui subprogram, stiva este eliberata, in cazul apelului prin valoare parametrul actual nu se modifica (se opereaza asupra unei copii a parametrului efectiv)

7.2. Apel prin referinta - se transmite adresa parametrului actual.

In cazul apelului prin referinta, subprogramul, cunoscand adresa parametrului actual, actioneaza direct asupra locatiei de memorie indicata de aceasta, modificand valoarea parametrului actual.

In C, implicit apelul este prin valoare. Pentru a specifica un apel prin referinta, in lista parametrilor formali, numele parametrului formal va trebui precedat de cuvantul simbolul &

Exemplul 7.1

void schimba_valoare (int x, int y)

void schimba_referinta (int &a, int &b)

void main (void)

APEL PRIN VALOARE

APEL PRIN REFERINTA

Se va afisa:

M=1    N=5

M=5    N=1

8. Transmiterea tablourilor unei functii

In C numele unui tablou reprezinta adresa primului element din tablou, celelalte elemente fiind memorate la adresele urmatoare de memorie. Din acest motiv, in cazul transmiterii unui tablou unei functii se transmite de fapt o adresa, realizandu-se un apel numit pointer care determina modificarea parametrului actual.

Exemplul 8.1

# include <iostream.h>

# include <conio.h>

# include <stdlib.h>

void Genereaza (int A[100], int &x)

void main (void)

Functia modifica parametrul actual T prin intermediul parametrului formal A deoarece se relizeaza apelul prin pointer.

Functia modifica valoarea parametrului actual N prin intermediul parametrului x deoarece se realizeaza apelul prin referinta.

Datorita faptului ca functia foloseste doar adresa primului element pentru a accesa celelalte elemente ale vectorului, in cadrul prototipului sau antetului functiei este suficient daca se specifica faptul ca parametrul este un vector, nefiind necesara precizarea numarului de elemente ale vectorului.

Exemplul 8.2.

# include <iostream.h>

# include <conio.h>

# include <stdlib.h>

void Genereaza (int A[], int &x)

void main (void)

Functia modifica parametrul actual T prin intermediul parametrului formal A deoarece se relizeaza apelul prin pointer.

Functia modifica valoarea parametrului actual N prin intermediul parametrului x deoarece se realizeaza apelul prin referinta.

O matrice este gestionata in memoria interna ca o succesiune de elemente. Liniile sunt memorate succesiv. Astfel pentru a retine o matrice este suficient daca se cunosc: adresa de inceput a primului element din matrice si lungimea unei linii (adica numarul de coloane). Astfel la transmiterea unei matrice intr-o functie este suficient daca se precizeaza numele matrice respective (adresa de primului element) si dimensiunea unei linii (numarul de coloane).

Exemplul 8.3.

void Genereaza (int A[][10], int &x, int &y)

void Afiseaza (int A[][10], int x, int y)

cout<<endl;

}

void main (void)

9. Transmiterea sirurilor de caractere unei functii

Datorita faptului ca pentru a memora un sir de caractere compilatorul pastreaza doar adresa de inceput a sirului de caractere iar restul caracterelor sunt memorate folosind octetii urmatori pana la intalnirea unui in cazul unui parametru de tip sir de caractere, functia primeste adresa de inceput a sirului, modificand astfel parametrul actual.

Exemplul 9.1.

void modifica (char * p)

void afiseaza (char * p)

void main (void)

10. Transmiterea structurilor unei functii

Exemplul 10.1.

struct persoana

;

void Citeste (persoana &x)

void Afiseaza (persoana x)

void main (void)

Modificarea membrilor structurii necesita apelul prin referinta

Pentru a afisa o structura este suficient apelul prin valoare





Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 3131
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved