|
primul din linie-spre deosebire de bsearch() )
|
səhifə | 22/55 | tarix | 07.05.2018 | ölçüsü | 4,6 Mb. | | #50260 |
| primul din linie-spre deosebire de bsearch() )
Pentru functia de comparare se pot utiliza si functii prestabilte,gen
qsort().
FUNCTIA _rotl()
-roteste spre stanga expresia binara a unui numar de tip int
SINTAXA GENERALA este:
unsigned int _rotl(unsigned int value,int shift);
unde:
value -este expresia de convertit (rotat)
shift -este numarul de rotatii (exponentul functiei binare)
Prin rotatia bitilor se intelege de fapt deplasarea exponentului functiei
binare(in baza 2) spre stanga (creste exponentul) sau spre dreapta(scade
exponentul).Practic operatia de rotatie spre stanga este similara cu
inmultirea cu 2 la puterea n (n este valoarea specificata prin shift).
Functia returneaza valoarea rezultata in urma operatiei.In caz de eroare,
functia nu returneaza nimic.
EXEMPLU: #include
#include
#include
unsigned numar=2;
int z;
main()
{
printf("Deplasari la stanga ale expresiei binare: \n");
for (z=0;z<12;z++)
{
printf("Numarul de rotari este: %d \n",z);
printf(" Numarul rezultat este: %d \n",_rotl(numar,z));
printf("Adresa binara este: 0x%4.4x \n\n",_rotl(numar,z));
sleep(3);
}
}
Functia se aplica in cazul numerelor scrise binar,dar mai ales pentru
operatii de calcul al spatiului de memorie(atunci cand memoria este
ordonata binar-sub forma de stiva).Functia se poate aplica doar pentru
valorile numarice din domeniul de reprezentare unsigned int(0-32766).
Pentru valori din afara valorilor de reprezentare,numarul returnat este
eronat.Functia este utila mai ales pentru a calcula spatiul ocupat in
arii de memorie restranse,in urma unor oparatii de calcul care arhiveaza
date de acelasi fel,de un numar cunoscut de ori.Pentru operatii cu numere
mari se poate utiliza functia _lrotl() care este similara dar opereaza cu
numere de tipul long int (0-4294967295).
-153- [ stdlib.h -_lrotl() si _rotr() ]
FUNCTIA _lrotl()
-deplaseaza la stanga exponentul expresiei binare (roteste bitii) long int
SINTAXA GENERALA este:
unsigned long _lrotl(unsigned long value,int shift);
Functia este similara cu _rotl() dar opereaza cu numere long int si are
prin urmare un domeniu de reprezentare mult mai larg ( 0-4294967295 ).
Functia deplaseaza exponentul expresiei binare cu valoarea specificata
prin shift (practic inmulteste numarul cu 2 la puterea n).
Daca este executata cu succes,returneaza valoarea rezultata.In caz de
eroare nu returneaza nimic.
EXEMPLU: #include
#include
#include
unsigned long numar=11011;
int z;
main()
{
printf("Rotari spre stanga: \n");
for (z=0;z<12;z++)
{
printf("Numarul de rotari: %d \n",z);
printf("Numarul rezultat este: %ld \n",_lrotl(numar,z));
printf("Adresa binara este: 0x%8.8lx \n\n",_lrotl(numar,z));
sleep(5);
}
}
Functia opereaza cu valori mult mai mari (peste 4 miliarde) ceea ce per-
mite calcule pentru aflarea unei adrese de memorie,inclusiv intr-un
program mare sau un sistem de operare (4 miliarde de linii de adresa
formate din cate 32 sau 64 de bytes inseamna o memorie de 128-256 Gby).
Observati in cele doua exemple ca 0x%4.4x inseamna reprezentarea numerelor
sub forma de adrese binare in format de 4 biti/4 biti iar 0x%8.8lx
inseamna reprezentarea in format binar de 8 lx biti/8 biti.In mod similar
se pot utiliza formule de genul 8.16 (opt/sasesprezece) sau chiar 32.32
Pentru a intelege importanta functiei,sunt necesare notiuni elementare
despre formatul datelor binare.
FUNCTIA _rotr()
-scade exponentul expresiei binare (roteste la dreapta) de tip int
SINTAXA GENERALA este: unsigned int _rotr(unsigned int value,int shift);
Functia este inversa functiei _rotl(),respectiv scade exponentul expresiei
binare cu numarul specificat prin shift.Practic functia imparte valoarea
la 2 la puterea n (n=shift).Se spune ca numarul a efectuat un salt spre
dreapta de n ori.Pentru ca functia sa returneze valori corecte este
necesar ca valoarea initiala sa poata fi reprezentata binar (rezultatul
impartirii prin 2 la n sa fie un numar intreg ) si sa fie cuprinsa in
domeniul de valori unsigned int (0-32766).
Daca este executata corect,functia returneaza valoarea rezultata in urma
calculului.In caz de eroare,nu returneaza nimic.
Se poate utiliza pentru numere binare,sau pentru calcule cu adrese binare
(De exemplu cate elemente sunt intr-o arie de memorie cunoscuta ).
-154- [ stdlib.h -_rotr() si _lrotr() ]
EXEMPLU: #include
#include
#include
unsigned int numar=4096;
int z;
main()
{
printf("Deplasari spre dreapta ale expresiei binare: \n");
for (z=0;z<11;z++)
{
printf("Numarul de rotari este: %d \n",z);
printf(" Numarul rezultat este: %d \n",_rotr(numar,z));
printf("Adresa binara este: 0x4.4x \n\n",_rotr(numar,z));
sleep(5);
};
}
Functia se poate utiliza pentru calcule si operatii cu spatii de memorie
limitata (arii de date ) cu pentru operatii cu numare binare,pentru
calculul spatiului ocupat de diferite formate binare etc.
FUNCTIA _lrotr()
-scade exponentul expresiilor binare de tip long int (roteste la dreapta)
SINTAXA GENERALA este:
unsigned long _lrotr(unsigned long value,int shift);
Functia este similara cu _rotr() dar opereaza cu numere din domeniul long
int(0-4294967295).Este inversa functiei _lrotl().
Functia scade exponentul expresiei binare (value) cu shift.Practic functia
imparte numarul la 2 la puterea n (n=shift).Pentru ca sa returneze valori
corecte este necesar ca numarul specificat prin value sa poata fi repre-
zentat binar(impartirea prin 2 la puterea n sa returneze un numar int).
Executata corect returneaza valoarea rezultata.Nu returneaza nimic in caz
de eroare.Pentru numere impare (nebinare) returneaza valori eronate.
EXEMPLU: #include
#include
#include
unsigned long numar=1263616;
int z;
main()
{
printf("Rotari spre dreapta ale expresiei binare: \n");
for (z=0;z<11;z++)
{
printf("Numarul de rotari este: %d \n",z);
printf(" Numarul rezultat este: %ld \n",_lrotr(numar,z));
printf("Adresa binara este: 0x%8.8lx \n\n",_lrotr(numar,z));
sleep(5);
}
}
Functia se poate utiliza pentru operatii cu numare binare sau cu adrese
de memorie binare(stive -inclusiv programe sau sisteme).Pentru utilizarea
functiei sunt necesare notiuni elementare de logica binara.
-155- [ stdlib.h - lsearch() ]
FUNCTIA lsearch()
-efectueaza o sortare lineara,adauga elementul in caz ca nu este in lista
SINTAXA GENERALA este:
void *lsearch(const void *key,void *base,size_t *num,size_t width,
int(_USERENTRY *fcmp)(const void *elem1,const void *elem2));
unde: key -este elementul cautat in lista
base -este pointerul spre aria de memorie(baza de date)
num -este numarul de elemente din arie(din baza de date)
width -este dimensiunea in bytes a fiecarui element din arie
USERENTRY -este pointerul spre functia de comparare a elementelor
(functia trebuie sa fie definita de utilizator)
elem1 -este pointerul spre elementul cautat
elem2 -este elementul din arie ce va fi comparat cu cel cautat
Functia cauta intr-o lista de elemente valoarea specificata prin key si
returneaza adresa primului element din arie identic cu cel cautat.Cau-
tarea se face liniar,incepand cu primul element din arie,pana la ultimul,
astfel incat nu este important daca aria a fost ordonata valoric sau nu.
Functia cauta numarul de elemente specificat prin num,care au dimensiunea
egala cu cea specificata prin width.
Daca elementul cautat(cel specificat prin key) nu se gaseste in aria
de date,functia lsearch() il adauga automat la sfarsitul listei si incre-
menteaza numarul de elemente(num) cu unul.
Functia depinde de rutina de comparare specificata de utilizator.
Pentru cautarea elementului,functia lsearch() apeleaza pentru fiecare
comparare la functia USERENTRY care trebuie sa faca comparatia dintre
cele doua elemente si sa returneze o valoare de tip int egala cu zero in
caz ca elementele sunt identice sau nenula in caz ca sunt diferite.Practic
lsearch() identifica elementul pentru care USERENTRY returneaza zero.
EXEMPLU: #include
#include
#include
char *colors[10]={ "Rosu","Galben","Verde","Albastru","Gri" };
int ncolors=5;
int oldn,i;
char *key;
int colorscmp(char **arg1,char **arg2)
{ return(strcmp(*arg1,*arg2)); }
int addelem(char **key)
{ oldn=ncolors;
lsearch(&key,colors,(size_t *)&ncolors,sizeof(char *),colorscmp);
return(ncolors == oldn); }
int main()
{ printf("Introduceti culoarea dorita: \n");
scanf("%s",&key);
if (addelem(&key))
printf("%s este in gama de culori",key);
else
printf("%s a fost adaugata in paleta de culori",key);
for (i=0;i
printf("%s \n",colors[i]);
getch(); }
-156- [ stdlib.h - ltoa() ]
Exemplul contine doua functii,dintre care prima efectueaza comparatia iar
cea de a doua apeleaza functia lsearch() si returneaza o valoare nula sau
nenula in functie de rezultatul comparatiei (verifica daca numarul de
elemente a fost incrementat prin adaugarea unui element nou).
Functiile si rutinele definite de utilizator trebuie sa respecte con-
ditiile de apelare (vezi lfind).
La fiecare apelare a functiei de cautare,lsearch transfera doi parametri:
key -pointerul spre elementul cautat
elem -pointerul spre elementul cu care se face comparatia
functia de comparare va interpreta cei doi parametrii in functie de modul
in care a fost definita (eventual utilizeaza functii de comparare presta-
bilite cum este strcmp() din in exemplul de mai sus).
Functia este foarte utila pentru formarea de baze de date,dar trebuie
utilizata cu multa prudenta deoarece numarul mare de pointeri si argumente
se preteaza la foarte multe confuzii de interpretare,care genereaza rezul-
tate false.Verificati insistent functia inainte de aplicarea ei in orice
aplicatie.In C++,functia lsearch() este inclusa in .
FUNCTIA ltoa()
-converteste o valoare de tip long la un sir de caractere
SINTAXA GENERALA este:
char *ltoa(long value,char *string,int radix);
unde: value -este valoarea numerica de convertit
string -este sirul de caractere rezultat
radix -este baza de reprezentare numerica
Functia converteste valoarea numerica intr-un sir de caractere terminat cu
un caracter NULL,cu lungime maxima de 33 bytes(caractere).Argumentul radix
se refera la baza de numeratie in care va fi reprezentat numarul si tre-
buie sa fie intre 2 si 36.Pentru numerele negative se utilizeaza exclusiv
baza 10(numarul se transcrie iar primul caracter va fi semnul minus).
Variabila specificata pentru preluarea sirului trebuie sa fie suficient
de larga pentru a cuprinde toate caracterele din sirul rezultat (inclusiv
NUL pentru incheierea sirului) (maxim 34 de bytes).
Functia returneaza un pointer spre sirul rezultat(sau nimic pentru eroare).
EXEMPLU: #include
#include
#include
char sir[20];
long valoare=-123456789L;
int z;
main()
{
for (z=2;z<37;z++)
{
ltoa(valoare,sir,z);
printf("Baza de reprezentare este: %d \n",z);
printf("Numarul: %ld a fost convertit la: %s \n",valoare,sir);
sleep(2);
}
}
Functia permite economia de spatiu(prin reprezentarea in baze mari).
-157- [ stdlib.h - malloc() ]
FUNCTIA malloc()
-aloca un bloc de memorie din memoria principala
SINTAXA GENERALA este: void *malloc(size_t size);
unde: size este dimensiunea in bytes a blocului de memorie alocat
Functia malloc() aloca un bloc de memorie din stiva memoriei principale
(cea rezervata pentru declararea de variabile si constante).Functia
permite alocarea explicita a memoriei exact dupa dorinta programatorului
(la alocarea automata variabilele pot ocupa spatii de memorie mai mari
decat este strict necesar).Memoria principala este utilizata pentru
alocarea dinamica a unor blocuri de memorie de dimensiuni variabile,nece-
sare pentru executia unor rutine(de exemplu sortarea fisierelor etc.).
In versiunile de program pe 16 biti (MS-DOS),functia malloc poate
utiliza tot spatiul liber din stiva de memorie cu execptia unei benzi
marginale rezervata pentru sistemul de operare(DOS).In versiunile recente
(Windows) se poate aloca toata memoria libera din stiva.
Daca a fost executata cu succes,malloc() returneaza un pointer spre
blocul de memorie proaspat alocat.Daca nu exista suficient spatiu pentru
blocul de memorie solicitat,functia returneaza NULL.
Functia este inclusa si in si respectiv in (in C++).
Pointerul returnat de functie este de tip void.Daca dimensiunea speci-
ficata prin size este zero,functia returneaza NULL sau(in versiunea Visual
C++) aloca in stiva un spatiu de lungime zero si returneaza un pointer
valid spre spatiul respectiv.Este bine sa verificati intotdeauna daca
spatiul solicitat a fost intradevar alocat(chiar daca este foarte mic).
EXEMPLU: #include
#include
char *acces;
int mem=64;
main()
{
printf("Alocati memorie pentru calea de acces la fisier: \n");
printf("Apasati tasta A ! \n",mem);
getch();
acces=malloc(mem);
printf("Memoria alocata este de : %d bytes \n",mem);
printf("Apasati orice tasta pentru a elibera memoria ! \n");
getch();
free(acces);
}
In exemplul de mai sus,variabila acces va avea alocat un bloc de memorie
de 64 de bytes in care va putea prelua calea de acces spre orice fisier.
Functia malloc() este apelata la inceputul programelor pentru a aloca
blocurile de memorie necesare variabilelor din _environ,envp si argv (cele
care realizeaza mediul de memorie pentru program).Deasemenea,functia
malloc este apelata de catre o serie intreaga de alte functii,printre
care:calloc,fscanf,_getw,setvbuf,exec functions,fseek,_popen,_spawn
functions,fgetc,fsetpos,printf,_strdup,_fgetchar,_fullpath,putc,system,
fgets,fwrite,putchar,_tempnam,fprintf,getc,putenv,ungetc,fputc,getchar,
puts,vprintf,fputchar,getcwd,putw,vprintf,fputs,getdcwd,scanf,fread,gets
si search.Toate aceste functii apeleaza la malloc pentru a manipula blo-
curi de memorie din stiva principala.
-158- [ stdlib.h -max() si min() ]
In versiunea C++,functia "set new mode()" seteaza indicatorul de stiva
pentru malloc()(=pasul stivei sau formatul).Indicatorul de stiva(hendler
mode) este important pentru depanarea programelor atunci cand malloc()
nu reuseste sa aloce blocurile de memorie solicitate.
Este indicat sa nu utilizati aceasta functie decat daca a-ti inteles
foarte bine cum este gestionata memoria stiva principala(pot exista dife-
rente de la o versiune de program la alta).Riscati sa bulversati memoria
principala a programului fara de care nu poate rula nici o aplicatie.
Nu uitati sa eliberati memoria,ori de cate ori blocurile alocate nu mai
sunt necesare(memoria libera favorizeaza executia programelor).
FUNCTIA max()
-returneaza valoarea cea mai mare dintre doua valori de acelasi tip
SINTAXA GENERALA este: (type) max(a,b);
unde type este tipul de data numerica
a si b sunt cele doua valori (din acelasi tip de data)
Limbajul C contine si un macro,iar C++ o functie template care executa
aceeasi operatie(compara doua valori si o returneaza pe cea mai mare).
Functia returneaza valoarea cea mai mare dintre cele comparate.
EXEMPLU: #include
#include
#include
float x;
float y;
int z;
main()
{
for(z=25;z<35;z++)
{
x=2*z+3.14;
y=z+33.73;
printf("Valoarea maxima dintre:%f si %f este=%f\n",x,y,max(x,y));
printf("Maximum dintre: %f si %f este= %f",x/y,y/x,max(x/y,y/x));
sleep(2);
printf(" \n\n");
}
printf("Apasati orice tasta !");
getch();
}
FUNCTIA min()
-compara doua valori numerice si returneaza valoarea cea mai mica
SINTAXA GENERALA este: (type) min(a,b)
unde type este tipul de data numerica (int,float,signed,unsigned etc)
a si b sunt cele doua valori (de acelasi tip)
Functia compara cele doua valori si returneaza valoarea cea mai mica.
Atat cele doua valori comparate cat si valoarea returnata trebuie sa
fie de acelasi tip (nu se poate returna o valoare de tip float dupa
compararea a doua valori de tip int).
Versiunea C contine un macro iar versiunea C++ contine si o functie
template care efectueaza aceeasi operatie.(vezi si max() )
-159- [ stdlib.h - putenv() ]
EXEMPLU: #include
#include
float x;
float y;
main()
{
x=17139.33/3.172513;
y=73151.2765/14.97386;
printf("Valoarea minima dintre: %f si %f este=%f \n",x,y,min(x,y));
printf("Apasati orice tasta ! \n\n");
getch();
}
Functia este utila mai ales pentru ordonarea operatiilor matematice sau
pentru sortarea unor valori numerice (vezi si max() ).
FUNCTIA putenv()
-adauga un sir in mediul de memorie(enviroment) sau actualizeaza datele
SINTAXA GENERALA este: int putenv(const char *name);
unde name este pointerul spre sirul care contine datele dorite
Functia accepta numele sirului si respectiv valoarea continuta de acesta
si le introduce in mediul de operare al aplicatiei curente.Functia accepta
si atribuirea de valori in cadrul definitiei cu ajutorul operatorului
egal.Exemplu: putenv("PATH=C:\\BC"); va schimba valoarea pentru calea
de acces PATH la cea specificata.
In mod similar,functia se poate utiliza pentru a schimba valoarea
uneia dintre variabilele din mediul de memorie(mediul de memorie este un
bloc de memorie alocat pentru un anumit numar de date strict necesare in
executia aplicatiei respective).
Pentru a strege o variabila din mediul de memorie se poate utiliza si
Dostları ilə paylaş: |
|
|