|
functia putenv() la care nu se specifica nimic dupa operatorul de atribu-
|
səhifə | 23/55 | tarix | 07.05.2018 | ölçüsü | 4,6 Mb. | | #50260 |
| 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);
}
Dostları ilə paylaş: |
|
|