Jump to content

Recommended Posts

Posted

Funcţii

Funcţiile sunt elementele de bază ale unui program scris în C: orice program, de orice dimensiune, constă din una sau mai multe funcţii, care specifică operaţiile care trebuie efectuate. Acest fapt dă limbajului C caracterul de limbaj de programare procedural.

Funcţiile sunt singurul mod de a face faţă complexităţii programelor mari, permit desfacerea programelor mari în module mai mici, şi dau utilizatorului posibilitatea de a dezvolta programe, folosind ceea ce alţii au făcut deja, în loc să o ia de la început.

Limbajul C a fost conceput să permită definirea de funcţii eficiente şi uşor de mânuit. În general e bine să concepem programe constituite din mai multe funcţii mici decât din puţine funcţii de dimensiuni mari. Un program poate fi împărţit în mai multe fişiere sursă în mod convenabil, iar fişierele sursă pot fi compilate separat.

O prezentare a functiilor din biblioteca standard aici: Link

Exemple:

1. Funcţia atof converteşte un şir de cifre din formatul ASCII într-un număr flotant în precizie dublă. Această funcţie acceptă un şir care conţine reprezentarea unui număr zecimal (eventual cu semn), compus din parte întreagă şi parte fracţionară (oricare putând lipsi), separate prin punct zecimal.


double atof(char s[]) {

double val,fr;

int i,sn;

sn = 1; i = 0;

if (s[0]=='+' || s[0]=='-')

   sn = (s[i++]=='+') ? 1 : -1;

for (val=0; s[i]>='0' && s[i]<='9'; i++)

   val = 10 * val + s[i] - '0';

if (s[i]== '.')

   i++;

for (fr=1; s[i]>='0' && s[i]<='9'; i++) {

   val = 10 * val +s[i] - '0';

   fr *= 10;

   }

return sn * val / fr;

}

2. Funcţia atoi converteşte un şir de cifre în echivalentul lor numeric întreg.

int atoi(char s[]) {

int i,sn,v;

i = 0; sn = 1;

if (s[i]=='+' || s[i]=='-')

   sn = (s[i++]=='+') ? 1 : -1;

for (v=i=0; s[i]>='0' && s[i]<='9'; i++)

   v = 10 * v + s[i] - '0';

return sn * v;

}

3. Funcţia lower converteşte literele mari din setul de caractere ASCII în litere mici. Dacă lower primeşte un caracter care nu este o literă mare atunci îl returnează neschimbat.

int lower(int c) {

if (c>='A' && c<='Z')

   return c + 'a' - 'A';

else

   return c;

}

4. Funcţia binary realizează căutarea valorii x într-un masiv sortat v, care are n elemente.

int binary(int x, int v[], int n) {

int l,r,m;

l = 0;  r = n - 1;

while (l<=r) {

   m = (l + r) / 2;

   if (v[m]==x) return m;

   if (v[m]<x) l = m + 1;

      else r = m - 1;

   }

return -1;

}
Funcţia returnează poziţia lui x (un număr între 0 şi n-1), dacă x apare în v sau -1 altfel. Alte rutine din biblioteca standard: Sortare si cautare Nume
	qsort - sorteaza un masiv

	bsearch - cautare binara într-un masiv sortat
Declaratie
	#include <stdlib.h>

	void qsort(void *base, unsigned nel,

  unsigned size, int (*comp)

  (const void *, const void *));

	void *bsearch(const void *key, const void

  *base, unsigned nel, unsigned size, int
Descriere Functia qsort sorteaza un masiv de nel elemente, fiecare de marime size. Argumentul base indica spre începutul masivului. Elementele masivului sunt sortate în ordine crescatoare în concordanta cu functia de comparare referita de comp, apelata cu doua argumente care indica spre obiectele ce se compara. Functia de comparare trebuie sa returneze un întreg mai mic decât, egal cu, sau mai mare decât zero daca primul argument este considerat a fi mai mic decât, egal cu, respectiv mai mare decât al doilea. Daca cele doua elemente comparate sunt egale, ordinea în masivul sortat este nedefinita. Functia bsearch cauta într-un masiv de nel elemente, fiecare de marime size, un membru care coincide cu obiectul indicat de key. Argumentul base indica spre începutul masivului. Continutul masivului trebuie sa fie sortat crescator în concordanta cu functia de comparare referita de comp, apelata cu doua argumente care indica spre obiectele ce se compara. Functia de comparare se defineste ca în cazul qsort. Primul argument este adresa cheii, al doilea este adresa unui element din masiv. Valoare returnata Functia bsearch returneaza un pointer la un membru al masivului care coincide cu obiectul indicat de key, sau NULL daca nu se gaseste nici un membru. Daca exista mai multe elemente care coincid cu key, poate fi returnat oricare element cu aceasta proprietate. Rutine de clasificare Nume
isalnum, isalpha, isascii, iscntrl, isdigit,

isgraph, islower, isprint, ispunct, isspace,

isupper, isxdigit	- rutine de clasificare

tolower  -  conversie în litera mica

toupper  -  conversie în litera mare
Declaratie
#include <ctype.h>

int isalnum(int c);

int isalpha(int c);

int isascii(int c);

int iscntrl(int c);

int isdigit(int c);

int isgraph(int c);

int islower(int c);

int isprint(int c);

int ispunct(int c);

int isspace(int c);

int isupper(int c);

int isxdigit(int c);

int tolower(int c);	

int toupper(int c);
Descriere Primele 12 functii verifica daca c, care trebuie sa fie o valoare de tip unsigned char sau EOF, se afla în una din clasele de caractere enumerate mai sus. isalnum Verifica daca c este alfanumeric (litera sau cifra).
isalpha
Verifica daca c este alfabetic (litera mare sau mica).
isascii
Verifica daca c este o valoare pe 7 biti din setul de caractere ASCII.
iscntrl
Verifica daca c este un caracter de control.
isdigit
Verifica daca c este o cifra (între 0 si 9).
isgraph
Verifica daca c este un caracter afisabil cu exceptia spatiului.
islower
Verifica daca c este o litera mica.
isprint
Verifica daca c este un caracter afisabil inclusiv spatiu.
ispunct
Verifica daca c este un caracter diferit de spatiu si non-alfanumeric.
isspace
Verifica daca c este un spatiu alb.
isupper
Verifica daca c este o litera mare.
isxdigit
Verifica daca c este o cifra hexazecimala din setul:
0 1 2 3 4 5 6 7 8 9  a b c d e f A B C D E F

tolower
Converteste caracterul c, daca este o litera, la litera mica corespunzatoare.
toupper
Converteste caracterul c, daca este o litera, la litera mare corespunzatoare.
Valoare returnata
Valoarea returnata de functiile is... este nenula daca caracterul c se afla în clasa testata, si zero în caz contrar. Valoarea returnata de functiile to... este litera convertita daca caracterul c este o litera, si nedefinita în caz contrar. Operatii cu siruri de caractere Pentru majoritatea functiilor din aceasta categorie compilatorul expandeaza codul acestora folosind instructiuni pe siruri de caractere. Aceste functii sunt declarate în <string.h> Nume
	strlen - calculeaza lungimea unui sir
Declaratie
	unsigned strlen(const char *s);
Descriere Functia strlen calculeaza lungimea sirului s, fara a include caracterul terminator null. Valoare returnata Functia returneaza numarul de caractere din s. Nume
	strcpy, strncpy - copiaza un sir de caractere
Declaratie
	char *strcpy(char *dest, const char *src);

	char *strncpy(char *dest, const char *src,

     unsigned n);
Descriere Functia strcpy copiaza sirul indicat de src (inclusiv caracterul terminator null) în zona indicata de dest. Sirurile nu trebuie sa se suprapuna, si în plus zona dest trebuie sa fie suficient de mare pentru a primi copia. Functia strncpy este similara, cu exceptia faptului ca nu se copiaza mai mult de n octeti din src. Astfel, daca caracterul terminator null nu se afla în primii n octeti din src, rezultatul nu va fi terminat cu null. În cazul în care lungimea lui src este mai mica decât n, restul octetilor din dest primesc valoarea null. Valoare returnata Functiile returneaza un pointer la sirul dest. Nume
	strdup - duplica un sir
Declaratie
	char *strdup(const char *s);
Descriere Functia strdup returneaza un pointer la un nou sir care este un duplicat al sirului s. Memoria pentru noul sir se obtine cu malloc, si poate fi eliberata cu free. Valoare returnata Functia returneaza un pointer la sirul duplicat, sau NULL daca nu exista memorie suficienta disponibila. Nume
	strcat, strncat - concateneaza doua siruri
Declaratie
	char *strcat(char *dest, const char *src);

	char *strncat(char *dest, const char *src,

	     unsigned n);
Descriere Functia strcat adauga sirul src la sirul dest suprascriind caracterul null de la sfârsitul lui dest, si la sfârsit adauga un caracter terminator null. Sirurile nu trebuie sa se suprapuna, si în plus sirul dest trebuie sa aiba suficient spatiu pentru a pastra rezultatul. Functia strncat este similara, cu exceptia faptului ca numai primele n caractere din src se adauga la dest. Valoare returnata Functiile returneaza un pointer la sirul rezultat dest. Nume
	strcmp - compara doua siruri de caractere
Declaratie
	int strcmp(const char *s1, const char *s2);
Descriere Functia strcmp compara cele doua siruri s1 si s2. Valoare returnata Functia returneaza un întreg mai mic decât, egal cu, sau mai mare decât zero daca s1 este mai mic decât, coincide, respectiv este mai mare decât s2. Nume
	strchr, strrchr - localizeaza un caracter
Declaratie
	char *strchr(const char *s, int c);

	char *strrchr(const char *s, int c);
Descriere Functia strchr returneaza un pointer la prima aparitie a caracterului c în sirul s. Functia strrchr returneaza un pointer la ultima aparitie a caracterului c în sirul s. Valoare returnata Functiile returneaza un pointer la caracterul gasit sau NULL daca valoarea nu a fost gasita. Nume
	strstr - localizeaza un subsir
Declaratie
	char *strstr(const char *sir, const char *subs);
Descriere Functia strstr gaseste prima aparitie a subsirului subs în sirul sir. Caracterul terminator null nu este luat în considerare. Valoare returnata Functia returneaza un pointer la începutul subsirului, sau NULL daca subsirul nu este gasit. Nume
	strspn, strcspn - cauta un set de caractere într-un sir
Declaratie
  unsigned strspn(const char *s, const char *acc);

  unsigned strcspn(const char *s, const char *rej);
Descriere Functia strspn determina lungimea segmentului initial din s format în întregime numai cu caractere din acc. Functia strcspn determina lungimea segmentului initial din s format în întregime numai cu caractere care nu se gasesc în rej. Valori returnate Functia strspn returneaza pozitia primului caracter din s care nu se afla în acc. Functia strcspn returneaza pozitia primului caracter din s care se afla în rej. Biblioteca matematica 1) Functiile din prima categorie sunt declarate în <stdlib.h> Nume
	rand, srand - generarea numerelor pseudo-aleatoare
Declaratie
	int rand(void);

	void srand(unsigned int seed);
Descriere Functia rand returneaza un întreg pseudo-aleator între 0 si RAND_MAX (pentru majoritatea mediilor de programare C aceasta constanta este egala cu valoarea maxima cu semn reprezentabila pe un cuvânt al sistemului de calcul). Functia srand initializeaza generatorul cu valoarea seed pentru o noua secventa de valori întregi pseudo-aleatoare care vor fi returnate de rand. Aceste secvente se repeta daca srand se apeleaza cu aceeasi valoare seed. Se obisnuieste ca generatorul sa fie initializat cu o valoare data de ceasul sistemului de calcul, ca în exemplul de mai jos:
	#include <time.h>

	srand(time(NULL));
Valoare returnata Functia rand returneaza o valoare între 0 si RAND_MAX. Tot în fisierul <stdlib.h> sunt descrise si urmatoarele functii:
int abs(int i); 		   valoare absoluta

long labs(long i); 	   valoare absoluta

int atoi(char *s);	   conversie din ASCII în întreg

long atol(char *s);       conversie din ASCII în întreg lung

double atof(char *s);   conversie din ASCII în dubla precizie
Urmatoarele functii de conversie necesita o discutie detaliata:
double strtod(char *str, char **end);
conversie din ASCII în dubla precizie
long strtol(char *str, char **end, int base);
conversie din ASCII în întreg lung
unsigned long strtoul(char *str, char **end, int base);
conversie din ASCII în întreg lung fara semn Sirul de caractere str este convertit în reprezentare binara, ca si în cazul functiilor atoi, atol, atof. Pentru conversii de tip întreg se precizeaza si baza de numeratie folosita, care poate fi între 2 si 36. Pentru baze mai mari decât zece se folosesc litere mici sau mari. În plus, daca parametrul end indica o adresa valida (nu este null), la iesire primeste adresa primului caracter invalid din str, care nu respecta regulile de scriere a unei valori numerice de tipul asteptat. 2) Functiile din a doua categorie sunt declarate în <math.h>
double fabs(double x);    valoare absoluta

double floor(double x);  parte întreaga inferioara

double ceil(double x);    parte întreaga superioara

double sqrt(double x);   

double sin(double x);      sin(x)

double cos(double x);      cos(x)

double tan(double x);      tg(x)

double asin(double x);   arcsin(x)

double acos(double x);   arccos(x)

double atan(double x);   arctg(x)  în [-pi/2,pi/2]

double atan2(double y, double x); arctg(y/x)  în [–pi,pi]				

double exp(double x);     e^x

double log(double x);     ln(x)

double pow(double x, double y);       x^y

double sinh(double x);   sinh(x)

double cosh(double x);   cosh(x)

double tanh(double x);   tgh(x)

double ldexp(double x, int e);          x *2^e

double fmod(double x, double y);     x modulo y
Functia fmod returneaza o valoare f definita astfel: x =a*y + f; a este o valoare întreaga (data de x/y) si 0 <= |f | < y; f are semnul lui x. Urmatoarele doua functii returneaza doua valori: una este valoarea returnata de functie (de tip double), si cealalta returnata prin intermediul unui argument de tip pointer la int respectiv double.
	double frexp(double x, int *e);
Functia frexp desparte valoarea x în doua parti: o parte fractionara normalizata (f apartine intervalului [0.5,1)) si un exponent e. Daca x este 0 atunci f=0 si e=0. Valoarea returnata este f.
	double modf(double x, double *n);
Functia modf desparte valoarea x în doua parti: o parte fractionara subunitara f si o parte întreaga n. Valorile f si n au acelasi semn ca si x. Valoarea returnata este f. Functii pentru timp si data calendaristica Functiile din aceasta categorie, împreuna cu tipurile si structurile de date folosite, sunt declarate în <time.h> Functia time Data si ora calendaristica se reprezinta în format compact printr-o valoare de tip time_t. Majoritatea mediilor de programare definesc acest tip ca un sinonim pentru unsigned long. Aceasta valoare se obtine prin apelul functiei time.
time_t time(time_t *tims);
Functia returneaza data si ora curenta în coordonate universale (UTC), care reprezinta numarul de secunde de la începutul erei Unix (1 ianuarie 1970, ora 0:00:00). Valoarea returnata este memorata la adresa indicata de argumentul tims, daca acesta nu este NULL. Daca argumentul tims este NULL, trebuie sa memoram valoarea returnata. Structura tm Functia gmtime O valoare de tip time_t poate fi defalcata pe componente si memorata într-o structura:
struct tm {

	int tm_sec;	/* secunde, între 0 si 59 */

	int tm_min;	/* minute, între 0 si 59 */

	int tm_hour;	/* ore, între 0 si 23 */

	int tm_mday;	/* ziua din luna, între 1 si 31 */

	int tm_mon;	/* luna, între 0 si 11 */

	int tm_year;	/* anul curent minus 1900 */

	int tm_wday;	/* ziua din saptamâna, duminica: 0 */

	int tm_yday;	/* ziua din an, între 0 si 365 */

	int tm_isdst;	/* optiunea daylight saving time */

	};
Observatie. Alegerea numelui tm pentru aceasta structura a fost cât se poate de neinspirata. Programatorii trebuie sa fie deosebit de atenti ca, atunci când folosesc functii din aceasta categorie, sa nu foloseasca în nici un caz numele tm pentru definitii proprii. Functia gmtime returneaza adresa unei zone unde se afla data calendaristica defalcata. Informatiile din aceasta zona trebuie salvate în cazul în care se efectueaza prelucrari ulterioare. Un apel ulterior al functiei gmtime le va suprascrie, zona fiind alocata static în interiorul acesteia.
struct tm *gmtime(const time_t *tims); 
Functia mktime
time_t mktime(struct tm *datc);
Aceasta functie efectueaza conversia inversa, de la o structura defalcata la o valoare compacta. Este suficient sa completam valorile tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec. Daca o valoare se afla în afara limitelor permise, acestea sunt automat normalizate. De exemplu, ora 25:00:00 este echivalata cu ora 1:00:00 a zilei urmatoare. Functia corecteaza (daca e nevoie) toate valorile structurii. Daca data calendaristica nu poate fi reprezentata ca o valoare de tip time_t, funcsia returneaza valoarea (time_t)(–1). Functiile ctime si asctime
char *ctime(const time_t *tims);

char *asctime(const struct *datc);
Aceste functii convertesc data calendaristica în reprezentare ASCII. Aceste functii returneaza adresa unui sir de forma: "Sun Jun 05 10:00:00 2005" Informatiile din aceasta zona trebuie salvate în cazul în care se efectueaza prelucrari ulterioare. Un apel ulterior al functiei le va suprascrie, zona fiind alocata static în interiorul acesteia. Functia clock
clock_t clock(void);
Functia clock returneaza o aproximare a timpului pe care procesorul l-a folosit pentru program pâna la momentul apelului. Tipul clock_t este definit de majoritatea mediilor de programare ca un sinonim pentru unsigned long. Numarul de secunde de la lansarea programului se obtine astfel:
	(double)clock()/CLOCKS_PER_SECOND
Constanta CLOCKS_PER_SECOND este specifica mediului de programare folosit. De exemplu, biblioteca GNU C Compiler pentru sistemul de operare Linux defineste valoarea 1000000. O consecinta a acestui fapt este ca pe un sistem de calcul pe 32 de biti functia clock va returna aceeasi valoare la aproximativ fiecare 72 de minute. Observatie. Standardul C nu impune ca aceasta cronometrare sa înceapa de la zero la lansarea programului. De aceea, pentru a garanta un maxim de portabilitate, cronometrarea se face astfel:
main() {

double stm;

stm = clock();

. . .

printf("Time:%.3lf\n",(clock()-stm)/

                  CLOCKS_PER_SECOND);

}
Unele sisteme de operare, de exemplu Linux, permit cronometrarea exacta a timpului de rulare a unui program (evident, cu limitarea la 72 de minute), incluzând aici si timpul ocupat de sistemul de operare pentru efectuarea unor operatii cerute de program. Nu este cronometrat timpul cât procesorul este ocupat cu rularea altui program. Executarea unei comenzi sistem Functia system, declarata în <stdlib.h>, ofera posibilitatea de a executa o comanda sub controlul programului. Nume
	system – executa o comanda a interpretorului de comenzi
Declaratie
	system(char *com);

Descriere

Functia system executa comanda com prin lansarea interpretorului de comenzi cu acest parametru.

Se recomanda folosirea cu atentie a acestei functii sub unele sisteme de operare (de exemplu Linux), daca

interpretorul de comenzi permite precizarea mai multor comenzi într-o singura linie.

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.