Limbajul c si C++ abc-doar


functia putenv() la care nu se specifica nimic dupa operatorul de atribu-



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

functia putenv() la care nu se specifica nimic dupa operatorul de atribu-

ire.EXEMPLU: putenv("fisier="); va sterge variabila fisier din memorie

Pentru sistemele de operare DOS si OS/2 numele variabilei trebuie sa

fie specificat cu majuscule(pentru a fi identificat de sistem).Pentru

celelalte sisteme de operare,numele sirului poate fi cu orice caractere.

Numele sirului inclus nu trebuie sa contina si semnul = in cadrul denu-

mirii,deoarece va fi confundat cu operatorul de atribuire.

Functia putenv() se poate utiliza doar pentru a modifica mediul de

memorie al aplicatiei curente,iar la terminarea aplicatiei mediul de

memorie va reveni automat la valoarea initiala.Nu se poate schimba mediul

de memorie cu care sistemul de operare deschide aplicatia.Modificarile

mediului de memorie se pot insa transmite si subprogramelor lansate din

interiorul aplicatiei cu functii spawnl() etc.

Sirurile introduse in mediul de memorie trebuie sa fie statice sau

globale(sa fie cu valoare constanta).in cazul in care se incearca intro-

ducerea in memorie a unor siruri cu alocare dinamica (cu valori variabile)

rezultatul final va fi impredictibil.

Functia returneaza zero daca a fost executata cu succes,sau -1 in caz de

eroare.

Ca si getenv(),functia apeleaza la variabila globala _environ pentru a

accesa lista variabilelor incluse in mediul de memorie.Versiunea Visual

C++ include si functia _wputenv() care opereaza doar cu majuscule.


-160- [ stdlib.h - qsort() ]

EXEMPLU: #include

#include

char *memorie;

chat *text;

int e;

main()

{

e=putenv("memorie= 32 biti/linie din stiva principala");

text=getenv("memorie");

if (e == 0 )

printf("Mediul de memorie contine si: %s \n",text);

else

printf("Datele nu au putut fi incluse in mediul de memorie!");

printf(" \n\n Apasati orice tasta ! \n");

putenv("memorie=");

getch();

}

In exemplul de mai sus este inclusa o rutina de verificare a operatiei.

Este bine sa verificati intotdeauna daca datele solicitate au fost incluse

in mediul de memorie (eventual cu un semnal bip de avertizare),deoarece

sunt date importante care afecteaza intregul mod de desfasurare al apli-

catiei.
FUNCTIA qsort()

-efectueaza o sortare rapida

SINTAXA GENERALA este:

void qsort(void *base,size_t nelem,size_t width,int(_USERENTRY *fcmp)

(const void elem1*,const void elem2*));

unde: base este pointerul spre lista de elemente (aria de memorie)

nelem este numarul de elemente din lista

width este dimensiunea(in bytes) a fiecarui element(nr de octeti)

_USERENTRY este functia definita de utilizator pentru comparare

elem1 este pointerul spre elementul cautat

elem2 este pointerul spre elementul din care cu care se compara

Functia efectueaza o sortare rapida a datelor conform algoritmului preci-

zat prin functia definita de catre utilizator.Functia este o varianta a

algoritmului de sortare de tipul "elementul mediam dintre trei elemente"

care opereaza prin compararea elementului cu cel din fata lui si cu cel

imediat urmator(ca o lista dublu inlantuita).Pentru executarea operatiei,

functia apeleaza succesiv functia de sortare definita de catre utilizator,

pana cand epuizeaza toate elementele din lista.

Functia _USERENTRY trebuie sa respecte conventiile de apelare(vezi lfind)

si sa returneze valoarea zero in caz ca elementele comparate sunt identice

( ==0 ),sau o valoare < 0 , respectiv > 0 daca elementele nu sunt identice

Elementele vor fi sortate de la cel mai mic spre cel mai mare,in functie

de valoarea returnata de functia utilizata pentru comparare.

Functia qsort() nu returneaza nici o valoare.

In versiunile C++,functia este inclusa in .

Dupa sortare,qsort() suprascrie aria de date cu noua ordine a elementelor.

Pentru a sorta elementele in ordine inversa (de la cel mai mare spre cel

mai mic) se inverseaza in functia de comparare sensul pentru < 0 si > 0.


-161- [ stdlib.h - rand() ]

EXEMPLU: #include

#include

#include

sortare(const void *a,const void *b);

char lista1[7][8]={ "branza","carne","lapte","oua","paine" };

char lista2[7][10]={"Mihai","Stefan","Adrian","Mircea","Victor","Dan"};

int x;

int main()

{

printf("Datele sortate alfabetic sunt: \n\n");

qsort((void *)lista1,5,sizeof(lista1[0]),sortare);

qsort((void *)lista2,6,sizeof(lista2[0]),sortare);

for (x=0;x<7;x++)

printf("%s .......... %s \n",lista1[x],lista2[x]);

printf("Apasati orice tasta:");

getch();

return 0;

}

int sortare( const void *a,const void *b)

{

return( strcmp((char *)a,(char *)b));

}

Functia se poate utiliza pentru sortarea rapida a datelor din una sau

mai multe arii de memorie (liste).Este foarte utila inainte de a utiliza

functia bsearch() care necesita ca datele sa fie sortate inainte de a fi

comparate cu elementul cautat.Este in general simpla si usor de utilizat.

Cand se aplica pentru mai multe arii de memorie,care contin tipuri dife-

rite de date,este necesar sa se defineasca cate o functie de comparare

separata pentru fiecare tip de date (nu se poate utiliza aceeasi functie

pentru toate tipurile de date).
FUNCTIA rand()

-genereaza un numar aleator (pseudoaleator)

SINTAXA GENERALA este: int rand(void);

Functia genereaza un numar pseudoaleator(numere aleatoare care se repeta

in aceeasi secventa daca initierea s-a facut prin aceeasi valoare).Pentru

generarea numerelor functia utilizeaza un generator de numere cu baza de

reprezentare cuprinsa intre 2 si 32 si valoare cuprinsa intre zero si

RAND_MAX(RAND_MAX este o constanta care se seteaza in stdlib.h la o

anumita valoare,in functie de tipul datelor reprezentate int,long int etc)

Functia returneaza numarul aleator generat,iar in caz de eroare nu retur-

neaza nimic.

Inainte de apelarea functiei rand() este bine sa se genereze o samanta

de initiere a generatorului de numere cu ajutorul functiei srand().Daca

samanta de initiere este un numar constant,atunci la fiecare apelare a

rutinei,numerele aleatoare vor fi generate in aceeasi secventa (motiv

pentru care se mai numesc si pseudoaleatoare).Daca samanta de initiere

este variabila (de exemplu ora sistemului)numerele generate vor fi absolut

aleatoare.Daca se omite samnata de initiere,generatorul de numere va

functiona ca si cand ar fi fost initiat cu srand(1).Uneori functia nece-

sita combinatii complexe pentru a genera numere extreme (>32000).


-162- [ stdlib.h - random() ]

EXEMPLU: #include

#include

#include

int x,y;

main()

{

printf("Cate numere aleatoare doriti sa selectati ?: \n");

scanf("%d",&x);

srand(x);

for (y=0;y

{

printf("Numarul %d este= %d \n",y,rand() );

sleep(1);

}

}

Functia este usor de aplicat pentru numerele int (intre 0 si 32000).Se

utilizeaza mai ales pentru a alege la intamplare o inregistrare dintr-o

baza de date.
FUNCTIA random()

-returneaza un numar aleator

SINTAXA GENERALA este: int random(int num);

unde: num este un numar de tip int specificat de utilizator

Functia returneaza un numar aleator de tip int cu valoarea cuprinsa intre

zero si num.Practic num specifica valoarea maxima pe care o poate lua

numarul aleator.Functia opereaza doar cu numere de tip int,deci are

domeniul de reprezentare cuprins intre -32768 si 32767.

Atat valoarea pentru num cat si valoarea returnata sunt de tip int.

In versiunea Visual C++,functia este integrata sub forma de macro.

Pentru ca numerele returnate sa fie absolut aleatorii se poate utiliza

functia randomize() care initializeaza generatorul de numere cu un numar

samanta ales la intamplare(aleator).

EXEMPLU: #include

#include

#include

int x,y;

main()

{

printf("Cate numere aleatoare doriti sa selectati ? : \n");

scanf("%d",&x);

randomize();

for (y=0;y

{

printf("Numarul %d este= %d \n",y,random(30000) );

sleep(1);

}

}

Functia este utila mai ales atunci cand se doreste extragerea aleatoare a

unui element dintre un numar mic de elemente (de exemplu random(10) va

alege un element din 10 variante posibile).Daca se omite initializarea

prin randomize,numerele generate vor fi pseudoaleatoare(aceeasi secventa).


-163- [ stdlib.h -randomize() si srand() ]

FUNCTIA randomize()

-initializeaza generatorul de numere aleatorii

SINTAXA GENERALA este: void randomize(void);

Functia initializeaza generatorul de numere aleatorii cu o valoare aleasa

la intamplare (aleatorie).Se utilizeaza pentru ca sa nu se repete aceeasi

secventa de numere aleatorii la fiecare lansare a aplicatiei.

Functia nu returneaza nici o valoare.

EXEMPLU: #include

#include

#include

int x,y;

long int z;

main()

{

printf("cate numere aleatoare doriti sa selectati ? : \n");

scanf("%d",&x);

randomize();

for (y=0;y

{

z=random(random(300000))*random(100000);

printf("Numarul %d este= %ld \n",y,z);

sleep(1);

}

}
FUNCTIA srand()

-initializeaza generatorul de numere aleatorii

SINTAXA GENERALA este: void srand(unsigned seed);

unde seed este numarul utilizat ca samanta de initializare

Functia fixeaza un set de pornire pentru generatorul de numere aleatorii.

Pentru a reinitializa generatorul se poate utiliza functia srand(1).

Orice alta valoare a samantei in afara de 1 seteaza generatorul de numere

aleatorii la o valoare aleatorie de la care va incepe secventa de numere

pseudoaleatorii (aleatorii care se repeta in aceeasi secventa).Daca se

apeleaza functia rand() fara initializare prin srand() rezultatul va fi

ca dupa o initializare prin srand(1).Samanta poate fi si un numar float.

EXEMPLU: #include

#include

#include

#include

int x,y;

main()

{ printf("Cate numere aleatoare doriti sa selectati ?: \n");

scanf("%d",&x);

srand((unsigned)time(NULL));

for (y=0;y

{ printf("Numarul %d este= %d \n",y,rand() );

sleep(1) ; }

}

Exemplul utilizeaza ora sistemului pentru numarul samanta evitand astfel

repetarea secventelor.Functia accepta si numere samanta in format float.


-164- [ stdlib.h - realloc() ]

FUNCTIA realloc()

-realoca memoria principala

SINTAXA GENERALA este: void *realloc(void *block,size_t size);

Functia ajusteaza (micsoreaza sau mareste) un bloc de memorie alocat

anterior prin calloc(),malloc() sau tot prin realloc() la dimensiunea

specificata prin size.In definitie,block este blocul de memoria alocat

anterior iar size este dimensiunea sa finala (in bytes=octeti).Daca size

are valoarea zero,atunci blocul de memorie specificat va fi sters si fun-

ctia returneaza NULL.Prin block se specifica pointerul spre blocul de

memorie alocat anterior.Daca blocul de memorie specificat este un pointer

NULL,atunci functia se comporta la fel ca si malloc() (adica aloca un bloc

nou de memorie cu dimensiunea size).Functia reajusteaza dimensiunea blo-

cului de memorie specificat si copiaza datele continute,eventual la o

noua adresa de memorie(daca este cazul).

In urma executiei,functia returneaza adresa noului bloc de memorie,care

poate fi diferita de cea a blocului alocat initial (mai mare).Daca blocul

de memorie nu poate fi realocat,functia returneaza NULL.Daca marimea

specificata pentru realocare (prin size) este zero,atunci blocul de me-

morie este sters(dealocat) iar functia returneaza tot NULL.

Daca blocul nu a putut fi realocat din lipsa de spatiu de memorie,atunci

datele din blocul initial de memorie raman neschimbate im timp ce in caz

ca la realocare s-a specificat valoarea zero pentru size (realloc(bloc,0))

datele din blocul de memorie vor fi sterse complet ,iar memoria eliberata.

Pentru executie,functia realloc() apeleaza functia malloc().In C++ se

poate seta valoarea indicatorului de stiva cu ajutorul functiei set_new_-

mode sau set_new_handler.

EXEMPLU: #include

#include

#include

char *str;

char *text="Text exemplificativ pentru realloc() ";

main()

{

str=(char *) malloc(40);

strcpy(str,text);

printf{"textul este: %s\n Adresa este: %p\n ",str,str);

str=(char *) realloc(str,15);

printf("textul este: %s\n Noua adresa este:%p\n ",str,str);

printf("Apasati orice tasta ! \n");

getch();

free(str);

return 0;

}

Observati ca prin redimensionare (micsorare) se pierd datele continute in

variabila pentru care s-a alocat blocul de memorie.Este bine sa utilizati

functia mai ales pentru a extinde blocul de memorie astfel incat sa puteti

adauga date noi.In caz ca micsorati blocurile de memorie (pentru elibera-

rea memoriei) verificati cu atentie inainte de apelarea functiei,daca nu

se vor pierde date importante in urma redimensionarii blocurilor de memo-

rie si daca nu va fi deranjata buna functionare a programului (prin sterge-

rea de comenzi,adrese sau date care genereaza mesaje de eroare).


-165- [ stdlib.h -strtod() si strtol() ]

FUNCTIA strtod()

-converteste un sir de caractere la un numar in format double

SINTAXA GENERALA este: double strtod(const char *s,char **endptr);

unde: *s este pointerul spre sirul de caractere

*endptr este pointerul spre caracterul care termina citirea

(primul caracter neinterpretabil va fi stocat la adresa res-

pectiva intr-o variabila de tip caracter predefinita)

Functia converteste caracterele de tip cifra dintr-un sir de caractere,

intr-o valoare numerica in format double (float).

Sirul de caractere trebuie sa respecte formula generala:

[spatii goale][semn][cifre][.][cifre][exponent(e sau E)][semn][cifre]

Functia recunoaste de asemenea notatiile +INF si -INF pentru plus si

minus infinit si +NAN sau -NAN pentru Not-a-Number.

EXEMPLE de siruri ce pot fi convertite:

+ 1234.1981e-1

- 502.99E3

29.333 lei

Functia se opreste la primul caracter neinterpretabil(care nu este cifra

,punct sau e si E).Atentie atunci cand sirul contine caracterul E sau e

fara ca acesta sa semnifice exponentul numarului.

Daca primul caracter neinterpretabil nu este uncaracter NULL,atunci fun-

ctia va seta pointerul specificat prin **endptr sa pointeze spre carac-

terul respectiv(caracterul de stop) care va putea fi utilizat in pro-

cesul de depanare pentru identificarea erorilor de conversie.

Functia returneaza o valoare de tip double cu numarul rezultat in urma

conversiei.In cazul in care numarul rezultat nu poate fi reprezentat in

format numeric(este prea mare) functia returneaza valoarea setata pentru

HUGE_VAL(cel mai mare numar reprezentabil) si semnul numarului rezultat.

Daca nu se poate face conversia sirului,functia returneaza zero (0).

EXEMPLU: #include

#include

char suma[80]="991235797813.14159265E5 lei vechi";

char *stop;

double numar;

int main()

{

numar=strtod(suma,&stop);

printf("Sirul convertit este: %s \n",suma);

printf("Numarul rezultat este: %lf \n",suma);

printf("Apasati orice tasta ! \n");

getch();

}

Observati ca functia deplaseaza virgula si rotunjeste zecimalele pentru a

respecta formatul solicitat.
FUNCTIA strtol()

-converteste un sir la un numar in format long

SINTAXA GENERALA este:

long strtol(const car *s,char **endptr,int radix);

unde: *s este sirul de caractere,*endptr este variabila pentru caracte-

rul de terminare a functiei iar radix este baza de reprezentare a valorii.


-166- [ stdlib.h -strtol() ]

Practic functia canverteste cifrele dintr-un sir de caractere intr-o

valoare numerica in format long (-2147483548 la 2147483647 ).Prin radix

se specifica baza de numeratie in care se va transcrie numarul.Baza de

reprezentare (radix) poate lua valori intre 2 si 36.Pentru valori mai

mici de 2 sau mai mari de 36 numarul va fi considerat invalid(nu va fi

convertit) iar functia va returna zero.

Daca se solicita reprezentarea in baza zero (radix=0) numarul va fi

totusi convertit la o valoare pentru care baza de reprezentare se va

stabili in functie de primele cifre din numar,dupa cum urmeaza:

Primul caracter Al doilea caracter Sir interpretat ca...

0 1-7 Octal

0 x-X Hexazecimal

1-9 Decimal Decimal

Daca sirul este interpretat ca octal,nu vor fi recunoscute decat cifrele

intre 0 si 7,iar daca sirul va fi interpretat ca fiind un numar decimal,

vor fi recunoscute cifrele de la 0 la 9.

Pentru formate mai mici,vor fi recunoscute doar cifrele reprezentabile in

acel format (exemplu: in baza 5 se recunosc doar cifrele de la 0 la 4).

Pentru formate mari,se recunosc cifrele de la 0 la 9 si literele din

formatul respectiv (exemplu: in format hexadecimal baza=16 se recunosc si

literele mici a,b,c,d,e,f ) etc...

Expresia generala pentru sirurile reprezentabile este:

[spatii goale] [semn] [0] [x] [cifre (si litere in formatele mari)]

Variabila specificata prin endptr se utilizeaza pentru a salva primul

caracter considerat a fi neinterpretabil,care a determinat terminarea

conversiei(cu exceptia caracterului NULL care marcheaza sfarsitul sirului)

si se utilizeaza in procesele de depanatre a programelor pentru a identi-

fica punctul in care s-a terminat conversia sirului.Functia returneaza un

pointer spre variabila care a arhivat caracterul nenul.

Functia returneaza valoarea rezultata in urma conversiei sau zero in

caz de eroare.

EXEMPLU: #include

#include

#include

char *text="012a34c unitati monetare";

char *stop;

long numar;

int x;

main()

{

for (x=0;x<37;x++)

{

numar=strtol(text,&stop,x);

printf("textul este: %s in baza: %d are valoarea: %ld \n",text,x,numar);

printf(" \n");

sleep(1);

}


Yüklə 4,6 Mb.

Dostları ilə paylaş:
1   ...   19   20   21   22   23   24   25   26   ...   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