Limbajul c si C++ abc-doar


FUNCTIA offsetof() (=MACRO)



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

FUNCTIA offsetof() (=MACRO)

-returneaza locatia unui membru in cadru unei structuri

SINTAXA GENERALA este:

size_t offsetof(struct_type,struct_member);

Offsetof() este implementata doar sub forma de macro si doar in C++.

struct_type este numele structurii,iar struct_member este oricare dintre

membrii structurii ce poate fi accesat fie prin operatorii de selectie a

membrilor fie cu ajutorul unui pointer(spre membrul respectiv).

In cazul in care membrul structurii specificat prin struct_member este

o arie de date,rezultatul returnat va fi nedefinit.

offsetof() returneaza numarul de bytes cuprins intre adresa de inceput a

structurii si cea de la care incepe membrul respectiv.

Se poate utiliza fie pentru a determina spatiul de memorie ocupat de un

membru al structurii,fie pentru a localiza pozitia unui membru al struc-

turii in etapa de depanare a unei aplicatii (De exemplu pentru a afla la

ce adresa de memorie se pot gasi datele arhivate in unul dintre membrii

unei structuri.

Se poate utiliza impreuna cu sizeof,care returneaza in bytes spatiul de

memorie al unei variabile sau al unui tip de date.In cazul unei structuri

sizeof returneaza spatiul de memorie ocupat de intreaga structura in timp

ce offsetof() returneaza spatiul ocupat de membrii care il preced.


-182- [stddef.h - offsetof() si math.h ]

EXEMPLU: #include

#include

#include

typedef struct date1{

char unu[40];

char doi[17]

int trei;

} inform1;

main()

{

printf("In structura INFORM1,primul membru incepe dupa: \n");

printf("%d bytes \n\n",offsetof(inform1,unu));

printf("iar al doilea membru incepe dupa: \n");

printf("%d bytes ...fata de primul \n\n",offsetof(inform1,doi));

printf("al treilea membru incepe dupa: \n");

printf("%d bytes...fata de primul \n\n",offsetof(inform1,trei));

printf("Intreaga structura ocupa: %d bytes \n\n",sizeof(date1));

sleep(7);

}

Observati ca valoarea returnata de sizeof include spatiul ocupat de cei

trei membrii la care se adauga si caracterele NULL (unul de inceput si

cate unul la sfarsitul fiecarui sir de caractere).Macroul este foarte

util pentru calculul spatiilor de memorie,mai ales in timpul etapei de

depanare a programelor.

BIBLIOTECA C -FILA ANTET math.h (C si C++)

Desi prin extinderea aplicatiilor audio-vizuale calculatoarele au din ce

in ce mai mult un caracter multifunctional,totusi principala functie a

unui calculator consta in efectuarea de calcule matematice.Limbajul C si

respectiv C++,nu numai ca permite calcule cu numere extrem de mari si

respectiv extrem de mici,in diverse formate de reprezentare a datelor,dar

asigura si un numar mare de functii predefinite,care faciliteaza foarte

mult toate operatiile de calcul matematic.Biblioteca math.h din C++ este

o extensie a celei din versiunea C dar include si cate o varianta long

pentru majoritatea functiilor si un numar de variabile globale suplimen-

tare.Pentru economie de spatiu si timp,ambele biblioteci vor fi prezentate

simultan.

Functiile matematice pot fi grupate cate doua sau mai multe,pentru a

realiza algoritmi de calcul simpli,sau rutine de calcul.Atunci cand

realizati aplicatii de calcul matematic este bine sa arhivati filele res-

pective intr-o arhiva personala la care sa puteti apela ulterior ori de

cate ori este necesar.Este bine ca rutinele de calcul sa fie scrise in

file separate astfel incat sa fie foarte usor de aplelat din interiorul

oricarui program (sa fie usor de inclus intr-un nou proiect).Este bine sa

va obisnuiti cu un sistem oarecare de notatie pentru constante si variabi-

le,astfel incat sa va fie cat mai usor sa va depanati propriile aplicatii.

Puteti utiliza sisteme de notatie conventionale,sau proprii,cu conditia sa

fiti consecventi si sa utilizati aceleasi conventii in toate aplicatiile

generate.


-183- [ math.h -abs() si acos() acosl() ]

FUNCTIA abs()

-returneaza valoarea absoluta a unui numar int.

Este descrisa detaliat in stdlib.h.Poate fi apelata si pentru numere

complexe sau bcd(binary-coded decimals) cu ajutorul unor functii friend

in formule de tipul abs(bcd &) (doar in versiunea C++).
FUNCTIA acos()

-calculeaza arccosinus din valoarea specificata

SINTAXA GENERALA este: double acos(double x);

unde: x este o valoare cuprinsa intre -1 si 1 reprezentata ca numar de

tip double,pentru care se va returna valoarea arccosinusului tot

ca numar de tip double (3,4 E-308 la 3,4 E+308 )

Valoarea returnata va fi cuprinsa intre 0 si pi(3,14...).Daca argumentul

functiei (x) este mai mic decat -1 sau mai mare decat 1,rezultatul retur-

nat va fi nedefinit.

EXEMPLU: #include

#include

#include

double rezultat1;

double rezultat2;

int z;

main()

{

for (z=0;z<361;z++)

{

rezultat1=acos(sin(z));

rezultat2=asin(cos(z));

printf("arccosinus din sinus de %d este: %lf \n",z,rezultat1);

printf("arcsinus din cos de %d este: lf \n\n ",z,rezultat2);

sleep(1);

}

}

Observati dinamica valorilor returnate.Eventual desenati un grafic,care

sa cuprinda rezultatele returnate.Incercati sa scrieti o aplicatie simpla

in care sa introduceti o valoare si sa obtineti arc cosinusul acesteia de

genul: #include

#include

double x;

main()

{ printf("Introduceti un numar real intre -1 si 1 \n");

scanf("%lf",&x);

printf("Arccosinusul valorii introduse este: %f \n ",acos(x));

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

getch(); }

Versiunea C++ include si functia acosl() care este identica dar accepta

si returneaza valori numerice de tip long double(+- 1.2 E4932)

SINTAXA GENERALA este: lomg double acos(long double x);

Incercati cateva aplicatii in care sa verificati precizia functiilor

descrise si eventual sa reprezentati grafic rezultatul returnat.

Daca argumentul x este gresit,variabila globala de manevrare a erorilor

errno va fi setata EDOM (domain error).


-184- [ math.h -asin() si atan() ]

FUNCTIA asin() si asinl()

-calculeaza arc sinusul valorii

SINTAXA GENERALA este: double asin(double x);

Functia returneaza arc sinusul din valoarea x.Atat valoarea lui x cat si

valoarea returnata sunt numere de tip double.

Argumentul functiei (valoarea lui x) trebuie sa fie cuprins intre -1 si

1(arcsin este inversa functiei sin).In afara acestui domeniu de valori,

functia returneaza NAN si seteaza variabila globala de menevrare a erori-

lor denumita errno la valoarea EDOM (domain error).

Rezultatul returnat este o valoare numerica cuprinsa intre -PI/2 si PI/2

Functiile de menevrare a erorilor pot fi modificate cu _matherr sau

_matherrl pentru a forta executia unor anumite rutine in caz de eroare.

EXEMPLU: #include

#include

#include

double rezultat;

float z,w;

main()

{

for (w=2;w<20;w++)

{ z=3.14/w;

rezultat=asin(sin(z));

printf("sin de %f este: %f \n",z,sin(z));

printf("arcsin din sin de %f este: %lf \n\n",z,rezultat);

sleep(2);

}

}

Versiunea C++ include si functia asinl() care este similara dar accepta si

returneaza valori numerice de tip long double.

SINTAXA GENERALA este: long double asinl(long double x);

Incercati sa scrieti o aplicatie in C++ cu asinl() in care puteti sa

utilizati si constantele M_PI,M_PI_2,M_PI_4 etc.
FUNCTIA atan() si atanl()

-calculeaza arctangenta valorii

SINTAXA GENERALA este: double atan(double x);

Functia calculeaza arctangenta din valoarea x.Atat valoarea pentru x cat

si valoarea returnata sunt numere de tip double (+- 1,7 E308 ).

Valoarea returnata este cuprinsa in domeniul -PI/2 la PI/2.

Pentru modificarea functiilor de menevrare a erorilor generate de apelarea

incorecta a acestei functii se pot utiliza functiile _matherror() si

_matherrorl().

Versiunea C++ cuprinde si functia atanl() care este similara dar

accepta si returneaza valori numerice de tip long double (functia este

foarte utila pentru calcule extrem de mari,de exemplu pentru a calcula

gradul de uzura sa de solicitare a unui ax motor dupa un numar foarte

mare de rotatii complete).

SINTAXA GENERALA este: long double atanl(long double x);

Functia atan() poate fi utilizata impreuna cu tan() pentru calculul

motoarelor(momentul fortei,unghiuri etc.) sau pentru descrierea unor

miscari circulare etc....


-185- [ math.h - atan2() ]

EXEMPLU: #include

#include

#include

#include

double rezultat;

float z,w;

main()

{ randomize();

for (w=2;w<10;w++)

{ z=random(10)-3/w;

rezultat=atan(z);

printf("unghiul aleator este: %f \n",z);

printf("tangenta de %f este: %f \n",z,tan(z));

printf("arctangenta de %f este: %lf \n\n",z,rezultat);

sleep(2);

}

}
FUNCTIA atan2()

-calculeaza arctangenta din y/x (pentru un raport)

SINTAXA GENERALA este: double atan2(double y,double x);

Functia returneaza arctangenta raportului celor doua numere de tip double.

Rezultatele sunt corecte chiar si atunci cand unghiul este apropiat de

PI/2 sau -PI/2 (x aproape de zero).Daca x si y sunt zero,functia seteaza

variabila globala errno la valoarea EDOM (domain error).

Functia returneaza o valoare cuprinsa intre -PI si PI.Erorile returnate

pot fi modificate cu ajutorul functiei _matherror().

EXEMPLU: #include

#include

#include

double x,y,rezultat;

int z;

main()

{

for (z=10;z<20;z++)

{ x=77-z*5;

y=93-z*7;

rezultat=atan2(x,y);

printf("x= %f y= %f x/y= %f \n",x,y,x/y);

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

printf("unghiul este: %f \n",tan(rezultat));

printf("tangenta este: %f \n",tan(x/y));

printf("unghiul tangentei este: %lf \n",atan(tan(x/y)));

printf("arctangenta este: %lf \n\n",atan(x/y));

sleep(7); } }

Observati valorile returnate in functie de domeniul de valori pentru x,y.

Eventual trasati graficul functiilor si urmariti dinamica valorilor.

Versiunea C++ contine si functia atan2l() care este similara dar

accepta valori din domeniul long double.

SINTAXA GENERALA este: long double atan2l(long double y,long double x);

Rezultatul returnat va fi tot un numar de tip long double (format %LG).


-186- [ math.h -atof() si cabs() ]

FUNCTIA atof() si atold()

-converteste un sir la un numar de tip float (in virgula mobila)

SINTAXA GENERALA este: double atof(const char *s)

Functia este descrisa pe larg in biblioteca stdlib.h,dar este definita si

in math.h si poate fi utilizata si dupa #include .

EXEMPLU: #include

#include

#include

double x;

char *numar="277539.773E-5";

main()

{

x=atof(numar);

printf("sirul este: %s \n",numar);

printf("numarul rezultat este: %lf \n\n",x);

sleep(5);

}

Versiunea C++ include si functia _atold() care este similara dar opereaza

cu numere de tip long double si are sintaxa generala:

long double _atold(const char *s);

Cele doua functii sunt foarte utile pentru a prelua valori numerice din

baze de date formatate in mod text(pentru calcule matematice).
FUNCTIA cabs() si cabsl()

-calculeaza valoarea absoluta a unui numar complex

SINTAXA GENERALA este: double cabs(struct complex z);

Pentru a putea apela functia cabs() trebuie ca numerele complexe sa fie

reprezentate sub forma de structuri din tipul de data complex(in C) sau

_complex(in C++),tip de data care este definit in math.h de forma:

struct complex {

double x,y

};

unde: x este partea reala a numarului iar y este partea imaginara

Valoarea absoluta returnata este echivalenta cu cea obtinuta prin extra-

gerea radacinii patrate din suma patratelor celor doua componente ale

numarului sqrt(z.x*z.x+z.y*z.y)(calculeaza modulul numarului complex).

Atat componentele numarului complex cat si valoarea returnata vor fi

reprezentate in memorie sub forma de numere complexe (atentie la calcula-

rea spatiului de memorie ocupat).

In caz ca valoarea obtinuta este in afara domeniului de reprezentare

(+- 1,7E308),functia returneaza HUGE_VAL(cea mai mai mare valoare repre-

zentabila) si seteaza variabila globala de menevrare a erorilor errno la

valoarea ERANGE (rezult out of range).

Versiunea C++ include si functia cabsl() care este similara dar opereaza

cu numere de tip long double (+- 1,2E4932) si are sintaxa generala:

long double cabsl(struct _complexl z);

In versiunea C++,functiile care opereaza si cu numere complexe sunt gru-

pate si intr-o biblioteca de functii separate denumita .

In C++,functiile cabs() si cabsl() pot fi apelate si dupa comanda de

preprocesare #include .

Erorile generate de aceste functii pot fi modificate cu _matherr().


-187- [ math.h -ceil() si cos() ]

EXEMPLU: #include

#include

#include

struct complex numar={3.1473,2.7283};

double valoare;

main()

{

valoare=cabs(numar);

printf("Valoarea absoluta a numarului {3.1473,2.7283} este: \n");

printf("%f \n",valoare);

printf("si reprezinta valoarea reala+cea imaginara \n");

printf("adica radical din suma patratului componentelor \n");

printf("verificare: %f \n",sqrt(3.1473*3.1473+2.7283*2.7283));

sleep(7);

}
FUNCTIA ceil() si ceill()

-rotunjeste spre intregul cel mai mare

SINTAXA GENERALA este: double ceil(double x)

Functia returneaza cel mai mic numar integru mai mare decat x.Cu alte

cuvinte,functia rotunjeste numarul spre numarul intreg mai mare decat x,

sau respectiv stabileste plafonul superior al numarului respectiv.

Functia opereaza si returneaza numere de tip double.

EXEMPLU: #include

#include

#include

#include

double x,y,z;

main()

{

randomize();

for (z=1;z<11;z++)

{ y=random(30000)/3.14;

x=ceil(y);

printf("Numarul aleator este: %lf\n",y);

printf("Plafonul superior este: %lf \n\n",x);

sleep(3);

}

}

Versiunea C++ include si functia ceill() care este similara dar opereaza

si returneaza numere de tip long double.Sintaxa generala este:

long double ceill(long double x);
FUNCTIA cos() si cosl()

-calculeaza cosinusul valorii

SINTAXA GENERALA este: double cos(double x);

Functia calculeaza valoarea cosinusului din x unde x exprima in radiani

unghiul specificat.Functia poate fi aplicata si pentru numere complexe si

respectiv pentru clasa de numere zecimale BCD (binary-coded decimals).

Valoarea returnata va fi cuprinsa intre -1 si 1.Erorile generate de

functie pot fi manipulate cu functia _matherror.


-188- [ math.h -cosh() si exp() ]

EXEMPLU: #include

#include

#include

double x;

main()

{

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

{ printf("Cosinus de %lf este: %lf \n\n",x,cos(x));

sleep(2); };

}

Versiunea C++ include si functia cosl() care opereaza si returneaza valori

de tip long double.Sintaxa generala este:

long double cosl(long double x);

Erorile pentru cosl() se pot manipula cu _matherrl().
FUNCTIA cosh() si coshl()

-calculeaza valoarea cosinusului hiperbolic

SINTAXA GENERALA este: double cosh(double x);

Functia calculeaza valoarea (e^x+e^-x)/2,adica cosinusul hiperbolic pentru

x,unde x reprezinta valoarea in radiani a unghiului specificat(un radian

este unghiul pentru care lungimea arcului de cerc este egala cu raza).

Functia poate fi aplicata numerelor complexe si BCD (binary-coded decimal)

Daca valoarea rezultata este mai mare decat domeniul de reprezentare al

numerelor double(1,7E308),atunci functia returneaza HUGE_VAL (1,7 E308)

adica valoarea cea mai mare reprezentabila si pentru manipularea erorii

seteaza variabila globala errno la valoarea ERANGE (domain error).

EXEMPLU:

#include

#include

#include

double x;

main()

{

for (x=1;x<10;x++)

{ printf("Cosinus hiperbolic de %lf este: %lf \n",x,cosh(x));

printf("verificare: \n");

printf("(e^x+e^-x)/2 este: \n");

printf("(%lf+%lf)/2=%lf\n\n",exp(x),exp(-x),(exp(x)+exp(-x)/2);

sleep(4); };

}

Versiunea C++ include si functia coshl() care este similara dar opereaza

si returneaza valori log double.Sintaxa generala este:

long double coshl(long double x);
FUNCTIA exp() si expl()

-calculeaza valoarea exponentiala pentru e la puterea x

SINTAXA GENERALA este: double exp(double x);

Functia calculeaza si returneaza valoarea rezultata prin ridicarea bazei

e(=2.718282) la puterea x.

Functia poate fi utilizata atat cu numere complexe cat si cu tipul de

zecimale BCD(binary-coded decimals).


-189- { math.h -fabs() si floor() ]

Daca valoarea rezultata prin apelarea functiei este corecta dar este in

afara domeniului de reperezentare,functia returneaza HUGE_VAL (1.7E308) si

seteaza variabila errno la ERANGE (result out of range).Daca valoarea

rezultata prin apelarea functiei este mai mic decat valoarea minima repre-

zentabila,functia returneaza zero si nu modifica variabila errno.

EXEMPLU: #include

#include

#include

double x;

main()

{ for (x=1;x<22;x++)

{

printf("e^%lf= %lf \n\n",x,exp(x));

sleep(1);

}

sleep(5);

}

In versiunea C++ este inclusa si functia expl() care este similara dar

opereaza si returneaza numere de tip long double.
FUNCTIA fabs() si fabsl()

-returneaza valoarea absoluta pentru numare float(in virgula mobila)

SINTAXA GENERALA este: double fabs(double x);

Functia accepta si returneaza numere de tip double(-1.7E308-1.7E308).

Yüklə 4,6 Mb.

Dostları ilə paylaş:
1   ...   22   23   24   25   26   27   28   29   ...   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