|
FUNCTIA offsetof() (=MACRO)
|
səhifə | 26/55 | tarix | 07.05.2018 | ölçüsü | 4,6 Mb. | | #50260 |
| 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).
Dostları ilə paylaş: |
|
|