Limbajul c si C++ abc-doar


primul din linie-spre deosebire de bsearch() )



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

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

Yüklə 4,6 Mb.

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