EXEMPLE DE FUNCTII ( APEL PRIN VALOARE )
Exemplul 4.4.1.
Urmatoarea functie determina daca numarul natural n >=
este prim sau compus . Daca numarul este prim functia va intoarce valoarea zero , daca este egal cu 0 sau 1 va intoarce valoarea 1 , iar daca este compus va intoarce primul divizor gasit .
unsigned prim ( unsigned long n )
Exemplul 4 .4 . 2 .
Acest exemplu calculeaza combinari de n luate cite k .
unsigned long cnk ( unsigned n , unsigned k )
Se observa ca functia returneaza 0 in situatia cind combinarile nu se pot calcula .
Exemplul 4 . 4 . 3 .
Functia urmatoare determina maximul elementelor unui sir de numere :
double maxs ( unsigned n , double a [ ] )
Exemplul 4 .4 . 4 .
Calculul valorii unui polinom cu ajutorul schemei lui Horner .Gradul polinomului este n , coeficientii a [ 0 ] , a [ 1 ] , . . . , a [ n ] , iar x este punctul in care se calculeaza valoarea polinomului .
double valpol ( double x , unsigned n , double a [ ] )
Observati ca pentru calculul valorii polinomului s-a folosit scrierea acestuia astfel :
p ( x ) = ( . . . ( a0 . x + a 1 ) . x + . . . + a n - 1 ) . x + a n
Exemplul 4 . 4. 5
Fie a , b , c trei numere reprezentind lungimile laturilor unui triunghi . Dorim sa scriem o functie care sa returneze :
0 - daca nu exista un triunghi cu laturile a , b , c ;
1 - daca triunghiul este ascutitunghic ;
2 - daca triunghiul este dreptunghic ;
3 - daca triunghiul este obtuzunghic .
Vom utiliza teorema cosinusului .Astfel , daca expresia - a 2 + b 2 + c 2 este mai mare decit zero , atunci unghiul A este ascutit , daca este egala cu zero , unghiul A este drept , iar daca este mai mica decit zero unghiul A este obtuz .
int tiptr ( double a , double b , double c )
Exemplul 4 . 4 . 7 .
Daca avem la dispozitie o data calendaristica de forma : z z - 1 1 - aaaa si dorim sa determinam si sa afisam data calendaristica pentru ziua urmatoare , functia care face aceste lucruri si in plus verifica si corectitudinea datei este :
void miine ( unsigned zi , unsigned luna , unsigned an )
;
bisect = an % 4 = = 0 & & an % 100 ! = 0 | | an % 400 = = 0 ;
zile [ 1 ] + = bisect ;
if ( zi = = 0 | | luna = = 0 | | luna >12 | | an < 1583 )
ind = 1 ;
else
if ( zi > zile [ luna -1 ] )
ind = 1 ;
if ( ind )
printf ( " Data eronata n " ) ;
else
}
printf ( " 2 d - % 2 d - % d \ n " , zi , luna , an ) ;
}
Observati ca in linia cinci a programului variabila bisect va primii valoarea 0 daca anul este bisect , respectiv valoarea 1 daca este , valoarea care este adunata pe linia urmatoare variabilei zilei [ 1 ] care corespunde lunii februarie . Modul cum se determina daca anul este bisect sau nu corespunde calendarului gregorian introdus incepand din anul 1582 .
Functia nu intoarce nici o valoare , de aceea am declarat - o ca fiind de tip void , iar controlul executiei programului revine functiei apelante la detectarea acoladei drepte de la sfarsitul corpului functiei .
Exemplul 4 . 4 . 8 .
Pentru calcularea radicalului de ordinul k dintr - un numar se poate utiliza functia de mai jos . Radicalul se calculeaza folosind sirul ( convergent la ....) :
x n = [ ( k - 1 ) x n - 1 + a / x n- 1K-1] / k ; n > = 1 si x 0 = 1
Vom calcula succesiv x 1 , x 2 , . . . , x n- 1 , x n pina la acel n pentru care | x n - x n- 1 | < 10 - 9 .
# include " math . h "
double radn ( unsigned k , double a )
return x 1 ;
}
Variabilele x 0 si x 1 sint utilizate pentru aproximatiile succesive radicalului de ordinul k . In prima instructiune a corpului while ( x 0 = x 1 ) variabilele basculeaza ,
x 1 trece in x 0 pentru ca apoi in urmatoarele doua instructiuni sa se calculeze urmatoarea aproximatie x 1 .
In cazul in care a < 0 sau k = 0 functia va returna valoarea negativa - 1 .
Exemplul 4 . 4 . 9 .
Urmatoarea functie realizeaza discutia naturii si semnului radacinilor unei ecuatii de gradul 2 . Functia va returna urmatoarele valorii :
- 1 daca ecuatia este de gradul 1 sau 0 ;
- 0 radacini complexe conjugate ;
- 1 radacini reale si pozitive ;
- 2 radacini reale si negative ;
- 3 radacini reale , una pozitiva si cealalta negativa .
int discecz ( double a , double b , double c )
Exemplu 4. 4. 1 0
Calculul lungimii unui sir de caractere terminat cu caracterul nul ('\ 0 ' ) se poate face utilizind functia strlen de mai jos:
unsignen strlen ( char a [ ] )
Exemplul 4 . 4 . 11 .
Compararea sirului de caractere a cu sirul b , din punct de vedere lexicografic , se poate realiza cu ajutorul functiei de mai jos . Functia va returna o valoare negativa , nula respectiv pozitiva , astfel :
<0 daca sirul a este in dictionar inaintea lui b ;
daca sirul a este egal cu sirul b ;
>0 daca sirul a este in dictionar dupa b .
Compararea unui singur caracter se face utilizind codul ASCII corespunzator caracterului. Sirurile sunt terminate cu ' \ 0 ' .
int strcmp (char a[ ] , char b [ ] )
De exemplu, daca avem de comparat sirurile a = " program " si b = " produs ", se observa ca :
a [ 0 ] = b [ 0 ] = `p
a [ 1 ] = b [ 1 ] = `r'
a [ 2 ] = b [ 2 ] =`0`
a [ 3 ] = ` g` ` d ` = b [3] deci functia va returna a[3] - b [3] , sau `g` - `d`, sau 103 - 100 = 3> 0, adica sirul a este mai mare decit sirul b . ( vezi codul ASCI in Anexa 1) .
Exemplu 4.4.12 .
Copierea sirului b in sirul a se realizeaza cu functia :
void strcpy ( char a [ ] , char b [ ] )
Exemplu 4.4. 13.
Urmatoarea functie converteste literele majuscule ale codului ASCI extins , in litere minuscule :
char lower ( char c)
Analizind codul ASCI se observa ca majusculele sunt in tabelul respectiv, inaintea minusculelor . Anume, majusculele cu codul de la 65 la 90 ( in hexa de la 0x 41 la 0x 5A ) , iar minusculele de la 97 la 122 ( in hexa de la 0x 61 la 0x 7A ) . Trecerea de la majuscule la minuscule se face adunand 32( in hexa 0x 20) si de aceea instructiunea :
return c l 0x 20 ; este echivalenta cu :
return c + `a` - `A` ; sau
return c + 32 ; sau inca
return c + 0x 20 ;
|