Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Functii - Structura unei functii

c



+ Font mai mare | - Font mai mic



Functii

Structura unei functii

O functie este formata din antet si corp:



antet_functie

Sau:

tip_val_return nume_func (lista_declaratiilor_param_ formali)

Antetul functiei contine deci urmatoarele 3 elemente:

tipul valorii returnate de functie

numele functiei

lista declaratiilor parametrilor formali

O functie poate fi apelata printr-o constructie urmata de punct si virgula, numita instructiune de apel, de forma:

nume_functie (lista_parametrilor_efectivi);

Parametrii efectivi trebuie sa corespunda cu cei formali ca ordine si tip.

Transferul parametrilor unei functii

Functiile comunica intre ele prin argumente (parametri). Exista urmatoarele moduri de transfer (transmitere) a parametrilor catre functiile apelate:

Transfer prin valoare;

Exemplul devenit clasic este cel al functiei de permutare (interschimbare) a doua variabile. Fie functia vschimb definita astfel:

void vschimb (float x, float y)

void main()

Parametri functiei vschimb sunt transmisi prin valoare: parametrilor formali x, y li se atribuie (la apel) valorile parametrilor efectivi a, b. Functia vschimb permuta valorile parametrilor formali x si y, dar permutarea nu are efect asupra parametrilor efectivi a si b.

Transfer prin pointeri

Pentru ca functia de interschimbare sa poata permuta valorile parametrilor efectivi, in limbajul C/C++ parametrii formali trebuie sa fie pointeri catre valorile care trebuie interschimbate:

void pschimb(float *x, float *y)

void main()

Se atribuie pointerilor x si y valorile pointerilor pa, pb, deci adresele variabilelor a si b. Functia pschimb permuta valorile spre care pointeaza pointerii x si y, deci valorile lui a si b.

Transfer prin referinta.

In limbajul C++ acceasi functie de permutare se poate defini cu parametri formali de tip referinta.

void rschimb(float &x, float &y)

void main()

In acest caz, x si y sunt sinonime cu a si b (nume diferite pentru aceleasi grupuri de locatii de memorie). Interschimbarea valorilor variabilelor x si y inseamna interschimbarea valorilor variabilelor a si b.

Functii definite de utilizator

In afara de functiile predefinite existente in header-ele <stdlib.h>, <math.h>, <iostream.h>, <string.h> - exista posibilitatea de a se construi noi functii de catre programator(utilizator).

Sintaxa definitiei unei functii este:

<tip valoare returnata> <nume functie> (<tip parametru> [*] <nume parametru> [,])

unde:

<tip valoare returnata> - poate fi oricare din tipurile de baza sau void (tipul vid)

<tip parametru> - poate avea orice tip cu exceptia lui void

[*] - este un parametru optional, utilizat numai pentru parametrii a caror valoare se modifica (spunem ca functia are efecte laterale)

<instructiuni> - au aceeasi sintaxa cu cele dintr-un program, servesc la calculele intermediare din corpul functiei

<lista variabile auxiliare> - sunt variabile locale functiei, nu sunt vazute in afara functiei

instructiunea return este principala instructiune a unei functii, ea inseamna returnarea de catre functie a rezultatului care va fi transmis programului principal sau altei functii care o apeleaza; ea este obligatorie in toate functiile cu exceptia celor de tip void

Sintaxa apelului unei functii este:

<nume functie> ( <nume parametru> [,])

deci numele functiei urmat de lista parametrilor intre paranteze; acestia poarta numele de parametrii actuali iar parametrii din definitia functiei se numesc parametrii formali. Este necesar ca parametrii actuali sa corespunda ca numar si tip cu parametrii formali.

Observatie: De obicei functiile se declara si se definesc la inceputul programului, dar se mai pot declara si astfel: se declara la inceput prototipul si apoi la sfarsit definirea = descrierea detaliata (inclusiv prototipul).

Exemple

Functie pentru calculul maximului a doua numere reale.

float max(float x, float y)

Schimbarea valorilor a doua variabile - transferul parametrilor unei functii

//Transferul parametrilor unei functii

#include<iostream.h>

//Transfer prin valoare

void schimb_v (float x, float y)

//Transfer prin pointeri

void schimb_p(float *x, float *y)

//Tansfer prin referinta

void schimb_r(float &x, float &y)

void main()

Minimul elementelor unui tablou

Programul:

//Minimul elementelor unui tablou

#include <iostream.h>

#define DIM 5

float min2v(float a,float b)

int sorttab(float tablou[DIM])

return indmin;

void tiptab(float tablou[DIM])

void main()

cout<<'Tabloul initialn';

tiptab(tabl);

imin=sorttab(tabl);

cout<<'Elementul minim din tablou este: tabl('<<imin<<')='<<

tabl[imin]<<'n';

Realizarea apelului prin referinta utilizand parametri de tip pointer

Sa se scrie o functie (pcit_int) care afiseaza caracterele unui tablou si citeste un intreg de tip int.

Functia are doi parametri:

text Tablou unidimensional de tip caracter si care are aceeasi utilizare ca parametrul text din functia 6.3.

x - Pointer spre intregi de tip int; are ca valoare adresa zonei de memorie in care se pastreaza valoarea intregului citit.

Aceasta functie este asemanatoare cu functia definita in exercitiul 6.3. Diferenta consta in aceea ca, functia definita in exercitiul 6.3. atribuie numarul citit variabilei globale v_int, in loc sa-l transfere functiei care face apelul, ca in cazul de fata.

Functia de fata returneaza aceleasi valori ca si cea amintita mai sus, adica 0 la intilnirea sfirsitului de fisier si 1 altfel.

//FUNCTIA BVIII2

int pcit_int(char text[], int *x)

/* - citeste un intreg si-l pastreaza in zona de memorie a carei adresa este

valoarea lui x;

- returneaza:

0 - la intilnirea sfirsitului de fisier;

1 - altfel */

Functie

Sa se scrie o functie (pcit_int_lim) care citeste un intreg de tip int care apartine unui interval dat.

Ea are parametrii:

text - Tablou unidimensional de tip char care are aceeasi utilizare ca in functia definita in exercitiul 6.4. (functia cit_int_lim).

int - intreg de tip int care are aceeasi utilizare ca in functia cit_int_lim

sup - intreg de tip int care are aceeasi utilizare ca in functia cit_int_lim

pint - Pointer spre intregi de tip int; are ca valoare adresa zonei de memorie in care se pastreaza numarul citit.

Ca si functia cit_int_lim, functia de fata returneaza:

0 - La inltalnirea sfarsitului de fisier.

1 - Altfel.

//FUNCTIA BVIII3

int pcit_int(char[], int *); /* prototip */

int pcit_int_lim(char text[], int inf, int sup, int *pint)

/* - citeste un intreg de tip int ce apartine intervalului [inf.sup] si-l

pastreaza in zona de memorie a carei adresa este valoarea parametrului pint;

- returneaza:

0 - la intilnirea sfirsilului de fisier;

1 - altfel. */

Operatii cu matrici cu ajutorul unor functii:

Programul

//Operatii cu matrici realizate cu functii

#include<iostream.h>

#include<stdio.h>

#define DIM 10

void citire(int nl,int nc,int mat[DIM][DIM])

}

int suma(int mat1[DIM][DIM], int mat2[DIM][DIM],int nl,int nc,int summat[DIM][DIM])

return 0;

void prod(int mat1[DIM][DIM], int mat2[DIM][DIM], int m,int n,int p,int prodmat[DIM][DIM])

void afisare(int nl,int nc,int mat[DIM][DIM])

void main()

else

cout<<'Nu se poate efectua suma deoarece numerele de linii si coloane au nereguli';

break;

}

case'd':

case'p':

break;

}

default: cout<<'Nu s-a introdus una din literele cerute !';

}

Calculul puterii si transpusei unei matrici patrate

Sa se alcatuiasca un program pentru ridicarea la putere a unei matrici patratice si pentru calculul transpusei acesteia.

Strategia de rezolvare

in cazul matricilor patratice A(n,n) numarul de linii si de coloane este egal cu ordinul matricii. Ridicarea la putere se face pe baza algoritmului prezentat in programele 12 si 13. Transpusa se obtine prin interschimbarea elementelor din partea dreapta a diagonalei principale cu cele avand indicii liniei si coloanei inversati.

Programul

/* Program 14.

Ridicarea la o putere a unei matrici patratice. Calculul transpusei unei matrici patratice.*/

#define NMAX 20 // Numarul maxim de linii sau coloane al matriciilor

#include <stdio.h>

#include <conio.h>

/*Functia citeste valorile elementelor unei matrici */

void citire (float ta[NMAX][NMAX], int ordin, char numev)

/*Functia scrie valorile elementelor unei matrici */

void scriere(float ta[NMAX][NMAX], int ordin, char numev)

else printf('t');

}

printf('nApasa orice tasta!');getch();

/*Functia efectueaza ridicarea la patrar, a unei matrici */

void patrat(float ta[NMAX][NMAX],float tb[NMAX][NMAX], int ordin)

/*Functia calculeaza transpusa unei matrici*/

void transpusa(float ta[NMAX][NMAX], int ordin)

void main(void)

Pentru ca elementele matricei sa nu se piarda in timpul operatiei de transpunere, se utilizeaza o variabila intermediara care stocheaza valoarea uneia dintre variabilele ce trebuiesc interschimbate:

temp=ta[i][j];

ta[i][j]=ta[j][i];

ta[j][i]=temp;

Daca am fi aplicat direct relatia:

ta[i][j]=ta[j][i];

valoarea variabilei ta[i][j] s-ar fi pierdut fiind inlocuita cu cea a variabilei ta[j][i] si astfel (valoarea variabilei ta[j][i] nefiind modificata) matricea ar fi fost alterata, devenind simetrica fata de diagonala principala.

in apelul functiei patrat o scriere de tipul: patrat(a,a,n); nu ar fi dus la calculul patratului matricii a ci la alterarea valorilor elementelor acesteia. in cazul sirurilor, aceeasi variabila sir nu poate constitui pentru o functie si argument 'valoare' si argument 'variabila'.

Probleme practice

1. Sa se realizeze un program care implementeaza operatii cu vectori utilizand functii (citire, scriere, produs scalar, sortare)

2. Sa se realizeze un program care calculeaza valoarea unui polinom utilizand o functie pentru calculul puterii

Functii - continuare

Calculul derivatei unei functii

Derivata unei functii intr-un punct reprezinta panta tangentei la graficul functiei in punctul respectiv, adica:

f'(x) =

Programul

//Calculul derivatei unei functii

#include <stdio.h>

#include <math.h>

double fd(double);

double deriv(double,double,double(*)(double));

void main()

printf('nx=%f; d= %lf',x,-sin(x));

double deriv(double x,double h,double (*f)(double))

double fd(double x)

Calculul integralei definite a unei functii prin metoda trapezelor

Relatia de calcul:

I = =
= h

unde: h= , n fiind numarul de diviziuni

Programul

//Calculul integralei prin metoda trapezelor

#include <stdio.h>

#include <math.h>

double fc(double);

double ing(double,double,double(*)(double));

void main()

double ing(double x,double y,double (*f)(double))

double fc(double x)

Functii predefinite

Biblioteca matematica (math.h)

Este biblioteca care contine toate functiile matematice. Unele dintre cele mai utilizate sunt prezentate in urmatorul tabel:

Nume

Sintaxa

Ce returneaza

Exemplu

abs

double abs (double x)

valoarea absoluta a unui numar real

#include <iostream.h>

#include <math.h>

void main(void)

sqrt

double sqrt (double x)

radical

acos

double acos (double x)

arccosinus

asin

double asin (double x)

arcsinus

cos

double cos (double x)

cosinus (la toate functiile trigonometrice argumentul e in radiani)

#include <iostream.h>

#include <math.h>

void main(void)

cosh

double cosh (double x)

cosinus hiperbolic

exp

double exp (double x)

exponentiala

floor

double floor (double x)

rotunjire prin lipsa

#include <stdio.h>

#include <math.h>

void main(void)

ceil

double ceil (double x)

rotunjire prin adaus

fmod

double fmod (double x,double y)

restul impartirii lui x la y

#include <stdio.h>

#include <math.h>

void main(void)

hypot

double hypot (double x,double y)

ipotenuza triunghiului de catete x si y

ldexp

double ldexp(double x, int exp);

calculeaza produsul dintre primul parametru si 2 la puterea data de cel de al doilea parametru

#include <stdio.h>

#include <math.h>

int main(void)

log

double log(double x);

logaritm natural

log10

double log10(double x);

logaritm zecimal

pow

double pow(double x, double y);

puterea unui numar la alt numar

pow10

double pow10(int p);

puterea lui 10 la un numar intreg

sin

double sin(double x);

sinus

sinh

double sinh(double x);

sinus hiperbolic

sinh(x) = (ex - e-x)/2

tan

double tan(double x);

tangenta

tanh

double tanh(double x);

tangenta hiperbolica

Biblioteca string.h

Contine functii pentru siruri de caractere

Nume

Sintaxa

Ce face

Exemplu

strcat

strcat(s1,s2)

Concateneaza sirul s2 la sfarsitul sirul s1

#include <string.h>

#include <stdio.h>

int main(void)

strcmp

strcmp(s1,s2)

Comparare de siruri; da valoarea 0 daca s1=s2, negativ daca s1<s2 si pozitiv daca s1>s2.

#include <string.h>

#include <stdio.h>

int main(void)

strcpy

strcpy(s1,s2)

Copiaza sirul s2 in s1

#include <stdio.h>

#include <string.h>

int main(void)

strlen

strlen(s1)

Determina lungimea sirului s1

#include <stdio.h>

#include <string.h>

int main(void)

Biblioteca stdlib

Contine functiile de conversie; le vom prezenta in urmatorul tabel:

Nume

Sintaxa

Ce face

Exemplu

atof

double atof(const char *s);

conversia unui sir la real dubla precizie

atol

long atol(const char *s);

conversia unui sir la intreg long

#include <iostream.h>

#include<stdlib.h>

void main (void)   

atoi

int atoi(const char *s);

conversia unui sir la intreg simplu

itoa

char* itoa(int value;char* string;int radix);

conversia unui intreg la sir de caractere cu lungimea data de al treilea parametru

#include <stdlib.h>

#include <iostream.h>

void main(void)   

ltoa

char* ltoa(long value;char* string;int radix);

conversia unui intreg long la sir de caractere cu lungimea data de al treilea parametru

ultoa

char* ultoa(unsigned long value;char* string;int radix);

conversia unui intreg unsigned long la sir de caractere cu lungimea data de al treilea parametru

ftoa

char* ftoa(float value;char* string;int radix);

conversia unui real dubla precizie la sir de caractere cu lungimea data de al treilea parametru

rand

int rand(void)

genereaza un numar aleator cuprins intre 0 si 10000

#include <stdlib.h>

#include <iostream.h>

void main(void)   

random

int rand(int num)

genereaza un numar aleator cuprins intre 0 si num-1

system

void system(char* string)

lanseaza in executie o comanda DOS

#include <stdlib.h>

#include <iostream.h>

void main(void)   

Biblioteci de functii scrise de catre utilizator

In cazul folosirii mai frecvente a anumitor functii, acestea pot fi scrise grupat intr-un fisier biblioteca, si apelate apoi ori de cate ori este nevoie.

Programul urmator apeleaza functia suma, care se gaseste intr-un fisier header User_Lib.H

//Biblioteci de functii

#include 'USER_LIB.H'

void main()

Biblioteca de functii este un fisier header/antet (cu extensia h) scris de catre utilizator, caruia ii pot fi adaugate functii dupa nevoie.

#ifndef _USER_LIB_

#define _USER_LIB_

int suma(int x,int y)

#endif

Exemple

Functii din biblioteca matematica

//Functii din biblioteca matematica

#include<math.h>

#include<iostream.h>

#include<stdio.h>

main()

Operatii cu siruri de caractere utilizand functii predefinite

#include <iostream.h>

#include <string.h>

void main()



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1607
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