Limbajul c si C++ abc-doar


in cazul intreruperii programului pentru o eroare.Functia exit(0) tran-



Yüklə 4,6 Mb.
səhifə21/55
tarix07.05.2018
ölçüsü4,6 Mb.
#50260
1   ...   17   18   19   20   21   22   23   24   ...   55

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

Yüklə 4,6 Mb.

Dostları ilə paylaş:
1   ...   17   18   19   20   21   22   23   24   ...   55




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin