|
in cazul intreruperii programului pentru o eroare.Functia exit(0) tran-
|
səhifə | 21/55 | tarix | 07.05.2018 | ölçüsü | 4,6 Mb. | | #50260 |
| in cazul intreruperii programului pentru o eroare.Functia exit(0) tran-
sfera sistemului de operare constanta EXIT_SUCCES iar exit(1) transfera
sistemului de operare constanta EXIT_FAILURE.Functia nu returneaza nici
o valoare.Cele doua constante pot fi utilizate si ca parametri optionali.
EXEMPLU: #include
#include
#include
int x;
char y;
void iesire()
{ printf(" I E S I R E D I N P R O G R A M ");
sleep(5); }
main()
{ for (x=0;x<5;x++)
{ printf("Introduceti un caracter; \n");
y=getch();
printf("%c \n",y); };
atexit(iesire);
exit(EXIT_SUCCESS); }
Functia se recomanda pentru terminarea normala a programelor/aplicatiilor.
-145- [ stdlib.h -fcvt() si free() ]
FUNCTIA fcvt()
-converteste un numar in virgula mobila intr-un sir de caractere
SINTAXA GENERALA este:
char *fcvt(double value, int ndig, int *dec, int *sign);
Functia este identica cu ecvt,cu specificatia ca este proiectata special
pentru numarele float in timp ce ecvt() este proiectata pentru numerele
double.Cele doua functii utilizeaza acelasi tampon de memorie si se supra-
scriu reciproc.
In definitie,value este numarul ce urmeaza a fi convertit,ndig este for-
matul(numarul de digiti),dec arhiveaza pozitia virgulei(fata de primul
caracter) iar sign arhiveaza semnul numarului convertit.
Sirul rezultat va fi format din numarul de caractere specificat prin
ndig,la care se adauga in caracter NULL pentru terminarea sirului.Numarul
va fi preluat de la stanga spre dreapta,incepand cu bitul cel mai semni-
ficativ.Daca formatul specificat este prea mic,numarul va fi trunchiat,
iar daca este prea mare,se vor adauga zerouri in fiecare digit excedentar.
Pozitia virgulei(cea arhivata in dec) este exprimata fata de bitul cel mai
semnificativ(primul din sir).Sign este zero pentru valorile pozitive si
nonzero (1) pentru cele negative.Pointerul returnat de functie este
suprascris la fiecare apelare a functiei sau a functiei ecvt().
In caz de eroare,nu se returneaza nici o valoare.
EXEMPLU: #include
#include
#include
double numar;
char *text;
int x,y,z;
main()
{ for (z=1;z<19;z++)
{
numar=3.14/(z-9.7);
text=fcvt(numar,20,&x,&y);
printf("Numarul este: %f \n",numar);
printf("Numarul transcris este: %s \n",text);
printf("Pozitia virgulei este la: %d \n",x);
printf("Semnul numarului este: %d \n\n",y);
sleep(3);
};
}
Observati in exemplul de mai sus,atat transcrierea numarului rezultat cat
si modul de arhivare pentru pozitia virgulei si respectiv pentru semnul
numarului.Eventual incercati sa reconstituiti numarul sub forma de
valoare numerica (cu atof() ) utilizand si pozitia virgulai si semnul
numarului ( cu bucle if...else).
FUNCTIA free()
-elibereaza blocul de memorie alocat prin calloc(),malloc() sau realloc()
SINTAXA GENERALA este: void free(void *block)
unde block -este blocul de memorie alocat(care va fi dealocat)
Functia elibereaza (dealoca) blocul de memorie alocat anterior prin una
dintre functiile:calloc(),malloc() sau realloc().
-146- [ stdlib.h - gcvt() ]
Functia free() nu returneaza nici o valoare.
Numarul de biti eliberati este echivalent cu cel solicitat (rezervat) la
alocarea blocului de memorie.Daca blocul de memorie specificat este NULL,
pointerul este ignorat si functia free() returneaza comanda la programul
apelant.Daca se solicita eliberarea unui pointer gresit (care pointeaza
un bloc de memorie nealocat anterior) se pot genera erori care nu vor
mai permite alocarea de blocuri de memorie prin comenzi ulterioare.
Dupa eliberarea blocului de memorie,indicatorul de stiva se micsoreaza
prin alipirea zonelor de memorie neutilizate si returnarea lor la sis-
temul de operare(elibereaza adresele de memorie).Memoria eliberata va
putea fi realocata.In utilitarele de depanare "C run-time debug" functia
free() este inlocuita prin functia _free_dbg().
EXEMPLU: #include
#include
#include
int *memorie;
int x,y;
main()
{
for (x=10;x>0;x--)
{ y=x-1;
memorie=calloc(1,y);
strcpy(memorie,x);
printf("Memoria contine: %x %s \n ",memorie,memorie);
sleep(2);
}
free(memorie);
printf("%x %s",memorie,memorie);
sleep(5);
}
Observati cum prin alocarea unui spatiu tot mai mic de memorie,reapare
integral titlul de antet al memoriei de operare rezervata in C pentru
variabile si constante (Turbo-C -Copyright (c) 1988 Borland Intl. in caz
ca utilizati versiunea Turbo C.).
Este recomandabil sa utilizati functia,ori de cate ori blocurile de
memorie alocate nu mai sunt necesare pentru executia programului,deoarece
prin eliberarea memoriei,procesarea este mai rapida si scade foarte mult
riscul unei erori de excutie.Este recomandabil sa nu alocati blocuri de
memorie decat atunci cand sunt indispensabile si cand stiti exact scopul
pentru care vor fi utilizate.In situatiile banale,este preferabil sa
lasati programul C sa-si gestioneze singur memoria (exista riscul de a
dopa memoria de operare cu date irelevante,care impiedeca executia normala
a programelor si aplicatiilor).
FUNCTIA gcvt()
-converteste un numar in virgula mobila la un sir (arhivat intr-un tampon)
SINTAXA GENERALA este:
char *gcvt(double value,int ndec,char *buf);
unde : value este valoarea,ndec este formatul(numarul de digiti) iar
buf este tamponul de memorie in care se va arhiva sirul rezultat
Functia este similara cu fcvt,dar sirul contine virgula si semnul valorii.
-147- [ stdlib.h - getenv() ]
Sirul rezultat va avea formatul specificat prin ndec,la care se adauga un
caracter NULL(pentru terminarea sirului).Sirul rezultat include si semnul
valorii sau eventuala virgula.
Daca este executata cu succes,functia returneaza un pointer spre tamponul
de memorie care arhiveaza sirul rezultata iar in caz de eroare nu retur-
neaza nimic.
Tamponul specificat pentru arhivarea sirului rezultat trebuie sa fie
suficient de mare pentru a putea prelua sirul + caracterul NULL de ter-
minare (trebuie sa contina ndec+2 digiti),in caz contrar functia va
suprascrie si caracterul NULL terminal ce marcheaza sfarsitul tamponului
(caz in care unele functii vor produce rezultate impredictibile).
Ori de cate ori este posibil,functia gcvt va scrie numarul in format
decimal (FORTRAN F),iar in celelalte cazuri va utiliza formate exponen-
tiale (de tip print E).Este posibil sa amputeze zerourile din coada
numarului,in cazul in care formatul tamponului este insuficient.
In cazul numerelor nereprezentabile(overflow),functia nu converteste
nimic.
EXEMPLU: #include
#include
#include
char tampon[80];
double numar1=3.141592653e9;
double numar2=-0.00017935;
main()
{
printf("primul numar este: %lf \n",numar1);
gcvt(numar1,20,tampon);
printf("Sirul convertit este: %s \n",tampon);
sleep(5);
printf("Al doilea numar este: %lf \n",numar2);
gcvt(numar2,2,tampon);
printf("Sirul de conversie este: %s \n",tampon);
sleep(5);
}
Functia este utila in majoritatea situatiilor care necesita o conversie
din tipul de data numeric in cel de tip caracter.Observati in exemplul de
mai sus,ca amputarea numarului la un format mai mic se face prin rotunjire
spre valoarea cea mai apropiata.In plus,functia permite si utilizarea
numarelor exprimate exponential.
FUNCTIA getenv()
-preia un sir din mediul de memorie (enviroment)
SINTAXA GENERALA este: char *getenv(const char *name);
unde: -name specifica numele variabilei de memorie
Functia returneaza valoarea pentru variabila specificata prin *name.
Pentru sistemele de operare DOS si OS/2 numele variabilei trebuie sa fie
scris cu majuscule(pentru a fi recunoscut de sistem).In versiunile care
opereaza sub Windows sau sisteme mai noi,se pot utiliza si literele mici.
Numele specificat nu trebuie sa contina semnul egal(=) deoarece acesta
va determina stergerea variabilei respective(prin atribuire falsa).
Exemplu: getenv("numere=") sterge variabila numere din enviroment.
-148- [ stdlib.h -getenv() ]
Prin mediul de memorie al unui program(enviroment),se intelege complexul
de date (constante si variabile) ce se incarca automat in memorie inainte
de executia programului.Unele dintre ele sunt predefinite de catre sis-
tem(de exemplu calea de acces,ora sistemului etc.) iar altele sunt intro-
duse de catre utilizator prin comenzi putenv().Pentru a schimba valoarea
unei variabile de mediu,se va utiliza tot functia putenv(),nu se va uti-
liza functia getenv() pentru a schimba valoarea variabilelor.
Daca a fost executata cu succes,functia returneaza valoarea asociata
cu numele variabilei specificate,iar in caz contrar returneaza NULL (de
exemplu daca variabila solicitata nu este inclusa in mediul de memorie).
Pentru a sorta lista de variabile din mediul de memorie,atat getenv()
cat si putenv() apeleaza variabila globala _environ.
In cazul in care utilizati parametrul envp al functiei main() pentru
a pointa spre mediul de memorie,atunci modificarile mediului de memorie
aduse in interiorul functiei main() cu putenv() nu vor putea fi apelate
prin getenv(envp) deoarece envp pointeaza o arie fixa de date care nu se
actualizeaza in timpul derularii programului.
EXEMPLUL 1: #include
#include
char *variabila;
main()
{
variabila=getenv("PATH");
printf("Valoarea arhivata in PATH este: %s \n",variabila);
printf("Apasati orice tasta ! \n");
getch();
}
EXEMPLUL 2: #include
#include
char *val;
main()
{
putenv("dollar=2.78 RON");
putenv("euro=3.02 RON");
val=getenv("dollar");
printf("Valoarea de schimb a dolarului este: %s \n",val);
val=getenv("euro");
printf("Cursul de schimb pentru euro este: %s \n",val);
printf("Apasati orice tasta !");
getch();
}
Functia este extrem de utila in etapele de depanare a programelor si
aplicatiilor,pentru a afla cu ce valori de memorie opereaza programul la
un anumit moment dat al executiei,eventual comparativ cu mediul initial
de memorie instalat la lansarea programului.
Ca orice functie care opereaza direct asupra memoriei de lucru a pro-
gramului,se recomanda maximum de atentie la utilizarea ei.Nu efectuati
modificari ale variabilelor de memorie standard (gen PATH,_execlp etc.)
decat daca stiti exact ce rezultat ve-ti obtine (se pot deregla unele
functii principale ale programului).
-149- [ stdio.h -itoa() si labs() ]
FUNCTIA itoa()
-converteste un intreg la un sir de caractere
SINTAXA GENERALA este:
char *itoa(int value,char *string,int radix);
unde:
value -este valoarea numerica de convertit
string -este sirul rezultat (sir de caractere)
radix -este baza de numeratie(radacina cuprinsa intre 2 si 32)
Functia converteste numerele intregi in siruri de caractere terminate cu
un caracter NULL.Prin radix se specifica baza de numeratie utilizata la
conversia numarului si poate lua valori intre 2 si 32.Daca radix are
valoarea 10,numarul rezultat va fi negativ iar primul caracter din sirul
rezultat va fi semnul minus (se utilizeaza pentru conversia numerelor
negative).Sirul rezultata poate avea o lungime maxima de 17 de bytes(in
versiunile C si 33 bytes in C++).Spatiul alocat pentru sirul rezultat
trebuie sa fie suficient de mare pentru a cuprinde atat numarul cat si
caracterul NULL terminal.
Daca se executa cu succes,functia returneaza un pointer spre sir.
In functie de sistemul de operare si de versiunea de program,exista si
variante ale functiei: _itoa(),_i64toa(),_ui64toa(),_itowa(),_ito64wa()
etc. care au domenii de reprezentare diferite sau utilizeaza majuscule.
In caz de eroare,functia nu returneaza nimic.
EXEMPLU: #include
#include
#include
long int numar=1234567890;
char text[80];
int z;
main()
{ for(z=2;z<32;z++)
{
printf("Numarul este convertit in baza: %d\n",z);
itoa(numar,text,z);
printf("Numarul= %ld iar sirul este: %s\n\n",numar,text);
sleep(2);
};
sleep(5);
}
Functia se poate utiliza de exemplu,pentru a afla o adresa dintr-un
program hexadecimal(in baza 16) sau pentru a prescurta la maxim forma de
reprezentare a numerelor foarte mari la care nu conteaza valoarea exacta
ci doar valoarea exponentului.
FUNCTIA labs()
-returneaza valoarea absoluta a numerelor de tip long int
SINTAXA GENERALA este: long labs(long int x);
Functia calculeaza valoarea absoluta a unui numar de tip long int (cel
specificat prin x).
Daca este executata cu succes,functia returneaza valaorea absoluta
rezultata in urma calcului.In caz de eroare functia nu returneaza nimic.
Functia este inclusa atat in cat si in .
-150- [stdlib.h -ldiv() ]
EXEMPLU: #include
#include
#include
int z;
long int numar=-123456789;
long int rezultat;
main()
{ for (z=33;z<43;z++)
{ numar=numar*z;
rezultat=labs(numar);
printf("Numarul este: %ld rezultatul= %ld\n",numar,rezultat);
sleep(2);
};
sleep(5);
}
Practic,functia opereaza cu numere foarte mari si exclude valorile nega-
tive.Se include de obicei in rutinele de filtrare a datelor de intrare
ce urmeaza a fi prelucrate sau convertite intr-un anumit fel.
FUNCTIA ldiv()
-calculeaza modulul(impartirea cu rest) dintre doua numere de tip long
SINTAXA GENERALA este: ldiv_t ldiv(long int numer,long int denom);
unde numar este deimpartitul iar denom este impartitorul
Functia este similara cu div,dar opereaza cu numere de tim long int (mari)
Functia imparte cele doua numere si returneaza rezultatul sub forma unei
structuri de date din tipul de data ldiv_t,in care rezultatul impartirii
este arhivat in variabila quot iar restul in variabila rem.Structura este
de de tipul: typedef struct {
long int quot;
long int rem;
} ldiv_t
Daca este executata cu succes,functia returneaza structura de tip ldiv_t
cu rezultatul operatiei salvat in cele doua variabile.Daca impartitorul
este zero(impartire prin zero),programul se termina printr-un mesaj de
eroare.
EXEMPLU: #include
#include
ldiv_t cat;
long int numar1=987654321;
long int numar2=123456791;
main()
{
cat=ldiv(numar1,numar2);
printf("%ld /%ld=%ld rest %ld \n",numar1,numar2,cat.quot,cat.rem);
printf("Apasati orice tasta: \n);
getch();
}
Semnul pentru rezultatul operatiei este la fel ca pentru impartira simpla
iar valoarea absoluta este cel mai mare intreg care este mai mic decat
valoarea absoluta a rezultatului unei impartiri simple.Functia se utili-
zeaza pentru operatii cu numere foarte mari.
-151- [ stdlib.h - lfind() ]
FUNCTIA lfind()
-executa o cautare liniara intr-o arie de elemente
SINTAXA GENERALA este:
void *lfind(const void *key,const void *base,size_t *num,size_t width,
int(_USERENTRY *fcmp)(const void* elem1,const void elem2*));
unde:
key -este elementul cautat
base -este pointerul spre aria de memorie in care se cauta
num -este numarul de elemente din arie(linie)
width-este dimensiunea fiecarui element (exprimata in bytes)
fcmp -este functia specificata de catre utilizator pentru cautare
elem1-este pointerul spre elementul cutat (key)
elem2-este pointerul spre aria in care se cauta
Functia utilizata pentru compararea elementului cautata cu cele din aria
de memorie trebuie sa contina conventiile specificate pentru functiile
_USERENTRY(vezi si cuvantul cheie _cdecl),care sunt urmatoarele:
ELEMENT IMPLEMENTARE
ordinea de transfer a argumentului -de la dreapta la stanga
responsabilitatea mentinerii stivei -functia apelanta extrage din
stiva argumentele cautate
conventia pentru denumirea functiei -se utilizeaza liniuta de subli-
niere(_) la inceputul denumirii
translatarea cazului -nu se aplica conventii de
translatare
Functia citeste fiecare element din arie,incepand cu elementul specificat
prin base.Spre deosebire de functia bsearch(),elementele vor fi citite
in functie de pozitia lor din linia de elemente din arie in loc de a fi
citite in ordinea adresei binare.Aria trebuie sa contina numarul de ele-
mente specificat prin "num" si fiecare element sa fie din "width" bytes.
EXEMPLU: #include
#include
#include
int date[7]={11,60,77,37,99,22,44};
size_t nr=7;
int *x*y*rezultat;
typedef int (*fnt)(const void *,const void *);
int z,cod;
int _sortare(int *x,int *y)
{ return( *x - *y ); }
main()
{
printf("Numerele arhivate in fisierul de date sunt: \n");
for (z=10;z<100;z++)
{ cod=z;
rezultat=lfind(&cod,&date[0],&nr,sizeof(date[0]),(fnt)_sortare);
if (rezultat)
printf("Numarul %d este la adresa ...%x \n",z,rezultat); };
sleep(10);
}
Nu are importanta daca elementele sunt sortate,dar trebuie sa fie repre-
zentate in formatul specificat prin "width"(acelasi numar de bytes).
-152- [ stdlib.h -_rotl() ]
Daca este executata cu succes,functia returneaza adresa primului element
din arie care corespunde cu cel specificat prin key(cu cel cautat).Daca
nu exista nici un element corespondent,functia returneaza NULL.Functia
utilizata pentru compararea celor doua elemente trebuie sa returneze
0 daca *elem1 == *elem2 si o valoare nonzero in caz contrar.
Daca aria contine mai multe elemente identice cu cel cautat,functia va
returna adresa primului din linia de elemente arhivate in arie(citirea se
face in linie,astfel incat primul element intalnit este intotdeauna si
Dostları ilə paylaş: |
|
|