|
{
printf("Mesaj afisat la iesirea din program \n")
|
səhifə | 20/55 | tarix | 07.05.2018 | ölçüsü | 4,6 Mb. | | #50260 |
| {
printf("Mesaj afisat la iesirea din program \n");
printf(" Sfarsit ");
sleep(3);
}
main()
{
printf("Programul principal: \n\n");
sleep(2);
printf("Iesire din program ! \n\n");
sleep(2);
atexit(functie2);
atexit(functie1);
}
Functia este extrem de utila si permite rularea unor rutine la iesirea
normala din program,gen:-stergerea memoriei de operare,inchiderea filelor
si fisierelor,verificarea datelor,arhivarea datei si a orei la care s-a
operat in program,arhivarea eventualelor erori...etc.
FUNCTIA atof()
-converteste cifrele de tip ASCII in caractere numerice float,in dubla
precizie (prescurtare de la ASCII to float)
SINTAXA GENERALA este: double atof(const char *s);
Exista si o varianta pentru conversia in numare de tip long double (_atold)
cu sintaxa generala: long double _atold(const char *s);
Functia realizeaza conversia pentu cifrele din sirul de caractere spre
care este orientat pointerul *s,in caractere numerice in format float (cu
virgula mobila in functie de numarul de zecimale),in dubla precizie.
Sirul convertit poate contine optional si spatii goale,spatii TAB,semn sau
e ori E urmat de semn.
Formula generala a sirului convertit trebuie sa fie compatibila cu urma-
torul format:
[spatii goale][semn][cifre][.][cifre][e|E[semn]cifre]
Exemple: + 123.4321 e-1
502.85 E2
+ 2010.953
Atentie !!! -numarul final trebuie sa fie cuprins in domeniul de valori ce
poate fi reprezentat in formatul float in dubla precizie(E-308 E+308).
Functia recunoaste deasemenea si expresiile +INF si -INF pentru plus si
minus infinit,si respectiv +NAN si -NAN pentru caractere nenumerice.
La primul caracter care nu este o cifra,conversia este intrerupta iar
functia returneaza valoarea pana in acel loc.
-138- [ stdlib.h -atoi() ]
Functia _atold() este o varianta a functiei,impelementata pentru con-
versia cifrelor extreme in formatul long double (care accepta numere
pana la E-4932 si E+4932).
Functia este similara cu strod() si respectiv cu _strold(),dar are un
alt mecanism de detectare a erorilor si este preferata in unele aplicatii.
Lungimea maxima a sirului de caractere ce poate fi convertit la un numar,
este de 100 de caractere (inclusiv cele ce reprezinta exponentul).
Sunt acceptate atat semnul plus (+) cat si semnul minus(-).
Daca a fost executata cu succes,functia returneaza numarul rezultat
prin conversia sirului de caractere.Daca sirul de caractere nu a putut fi
convertit la un numar,functia returneaza zero (0),iar in cazul in care
numarul rezultat este in afara domeniului reprezentabil pentru formatul
de data respectiv,functia returneaza un rezultat eronat,imprevizibil prin
trunchierea si adaugarea sau scaderea fata de valoarea limita reprezenta-
bila.In cazul numerelor nereprezentabile se seteaza variabila errno la
ERANGE(rezultat in afara domeniului=out of range).
EXEMPLU: #include
#include
#include
float numar;
char *text=" 12345.67E+5"
main()
{
numar=atof(text);
printf("La sirul: %s corespunde numarul: %f",text,numar);
sleep(5);
}
Functia este utila pentru a prelua cifre din fisiere text si a le trans-
forma in numere cu care se pot efectua operatii matematice(de exemplu
pentru a analiza matematic datele dintr-un tabel).
FUNCTIA atoi()
-converteste cifre ASCII in numare intregi de tip int
SINTAXA GENERALA este: int atoi(const char *s);
Functia este similara cu atof() (vezi mai sus) cu deosebire ca opereaza
doar cu cifre care pot fi convertite la formatul int.
Functia accepta doar spatii goale,semn (+ sau -) si cifre din doneniul
reprezentabil (-127 la 128 pentru int8,-32768 la 32757 pentru int16 sau
-2147483648 la 2147483647 pentru int32) scrise in formatul general:
[spatii][semn][cifre]
Exemple: 12355
-737
+3
Conversia se termina la primul caracter ce nu este recunoscut de functie.
Pentru numerele din afara domeniului reprezentabil rezultatul este nede-
finit.
Daca a fost executata cu succes,functia returneaza numarul rezultat in
urma conversiei,sau zero(0) daca nu a rezultat nici un numar.
Versiunea Visual C++ accepta si functia _atoi64() care converteste cifrele
in numere in format int64 (valori intre -9223372036854775808 si respectiv
9223372036854775807 ).
-139- [ stdlib.h - atol() ]
EXEMPLU: #include
#include
#include
int x;
char *text=" 4577 (este numarul de inregistrare)";
main()
{
x=atoi(text);
printf("Numarul de inregistrare este: \n");
printf("%d",x);
sleep(5);
}
Domeniul de valori reprezentabile este determinat de sistemul de operare
(Exemple: int16 pentru MS-DOS,int32 pentru Windows etc.)
FUNCTIA atol()
-converteste cifre ASCII la un numar in format long
SINTAXA generala este: long atol(const char *s);
Functia este similara cu atoi() si atof() sau _atold() cu deosebirea ca
accepta valori reprezentabile in formatul long (-2147483548 la 2147483647)
Functia accepta spatii goale,semn (+ sau minus) si cifre,in formula
generala : [spatii][semn][cifre]
Primul caracter nerecunoscut incheie conversia.
Daca este executata cu succes,functia returneaza numarul rezultat in urma
conversiei sau zero (0) daca nu a rezultat nici un numar.
Numele functiei este o prescurtare de la "ASCII to long".
EXEMPLU: #include
#include
#include
long numar;
char *text=" -1945809981";
main()
{
numar=atol(text);
printf("Numarul preluat din sir este: \n");
printf("%dl",numar);
}
La fel ca si celelalte functii de conversie a cifrelor in numere,functia
atol() este utila pentru a prelua date din fisiere text si a le prelucra
apoi matematic.Deoarece datele din sirul sursa trebuie sa respecte un
anumit tipar,iar cifrele preluate trebuie sa genereze numere cuprinse
intre limitele domeniului de reprezentare,exista riscul de a genera un
numar foarte mare de erori de format.Pentru a evita aceste situatii,
puteti sa generati un program,prin combinarea celor trei functii de
conversie si a functiilor de citire a sirului dintr-un fisier de tip
text,astfel incat sa poata fi preluate si reprezentate toate datele care
contin cifre.Programul trebuie sa contina si o rutina care sa aleaga
tipul de format,in functie de valoarea numerica a datelor preluate,
astfel incat numarul rezultat prin conversie sa poata fi reprezentat.
Subsidiar,programul trebuie sa fragmenteze textul in siruri si sa parcurga
fiecare sir pana cand intalneste cifre ASCII(pe care le reprezinta).
-140- [ stdlib.h -bsearch() ]
FUNCTIA bsearch()
-este o functie (binara)de cautare a unui element,intr-o arie de elemente
SINTAXA GENERALA este:
void *bsearch(const void *key,const void *base,size_t nelem,size_t width,
int(_USERENTRY *fcmp)(const void *elem1,const void *elem2));
unde:
key -contine elementul ce va fi cautat in aria de elemente
base -este pointerul spre aria de elemente in care se cauta
nelem -este numarul de elemente din arie
width -este marimea fiecarui element(numarul de bytes de memorie)
fcmp -este functia definita de utilizator,pentru evaluare (functia
care compara elementul1 fata de elementul2)
elem1 -este pointerul spre elementul cautat
elem2 -este pointerul spre elementul din arie care este evaluat
Functia efectueaza o cautare binara intr-o arie de elemente sortate,cu
numarul nelem de elemente,fiecare dintre ele de dimensiunea width.Functia
bsearch apeleaza pentru fiecare element din aria specificata prin base,
functia de evaluare specificata prin fcmp,cu ajutorul careia compara ele-
mentul din arie cu cel cautat(specificat prin key).
Dupa efectuarea evaluarii,functia de evaluare returneaza una dintre urma-
toarele valori:
<0 -daca elementul1 este mai mic decat elementul2
0 -daca elementul1 este egal cu elementul2
>0 -daca elementul1 este mai mare decat elementul2
In urma executiei,functia bsearch() returneaza un pointer spre adresa de
memorie la care este arhivat elementul cautat,sau NULL daca elementul
cautat nu este gasit in aria de memorie specificata.In cazul in care
elementele din arie nu sunt ordonate ascendent sau daca aria contine mai
multe elemente identice,egale cu elementul cautat,rezultatul poate fi
impredicitibil(in principiu cauta un element unic,intr-o arie sortata).
EXEMPLU: #include
#include
#include
int *data,cheie,x;
typedef int (*fptr)(const void*,const void*);
int numare[]={123,125,122,127,800,129};
int functie(int *p1,int *p2)
{ return(*p1-*p2) }
main()
{ for (x=120;x<131;x++)
{ cheie=x;
data=bsearch(&cheie,numere,6,1,(fptr)functie);
printf("Element: %d \n",x);
if (data !=0)
printf(".......elementul este inclus in lista: ");
else
printf("Elementul nu este inclus in lista. ");
printf("Adresa este: %x \n",data);
sleep(2); }
return 0;
}
-141- [ stdlib.h - calloc() ]
In practica,este bine sa se aplice o functie de sortare inainte de a
cauta un element cu bsearch().Atunci cand exista mai multe elemente
identice,functia returneaza adresa primului element evaluat a fi identic
cu cel cautat(nu intotdeauna primul element evaluat ocupa primul loc in
arie,deoarece cautarea binara se face in functie de adresa binara a
elementului in stiva).
FUNCTIA calloc()
-aloca memoria principala(o arie de memorie cu elemente initializate la 0)
SINTAXA GENERALA este: void *calloc(size_t nitems,size_t size);
Functia permite accesul la memoria stiva a programului C (memoria rezer-
vata in program pentru alocarea dinamica a blocurilor de date,variabile
etc.).Un mare numar de structuri de date definite in C necesita o alocare
de memorie(exemplu: listele si tabelele,arborele de directoare "tree" etc)
Parametrii functiei sunt:numarul de elemente(nitems) si dimensiunea fie-
carui element(size) exprimata in bytes.
Accesul la memorie este usor diferit in functie de versiunea de program
si de sistemul de operare pe care este instalat programul.In principiu
accesul este permis la intreaga memorie,sau la intreaga memorie fara un
mic spatiu de la inceputul stivei rezervat pentru a permite sistemului
de operare sa creasca dimensiunile stivei la nevoie.
Functia returneaza un pointer spre noul bloc de memorie alocat.Daca nu
exista suficient spatiu in memorie sau daca numarul de elemente este zero,
functia returneaza NULL.Se pot aloca blocuri de memorie de maximum 64 K.
Pentru blocuri mai mari de 64 K trebuie sa se utilizeze functia farcalloc.
EXEMPLU: #include
#include
#include
int *memorie
int x;
main()
{ for (x=0;x<10;x++)
{ memorie=calloc(x,x);
strcpy(memorie,x);
printf("Memoria contine datele: %d %s\n",memorie,memorie);
sleep(2); };
free(memorie);
sleep(5);
}
Observati ca indicatorul de stiva creste proportional cu spatiul rezervat
(nr elemente x dimensiune) iar blocul de memorie alocat incepe sa stearga
antetul memoriei C (alocarea incepe de la primul element al stivei).
Blocul de memorie alocat poate fi sters cu functia free() (in caz contrar
va ramane definitiv).
Functia calloc() este definita si in fila si apeleaza functiile
malloc() si _set_new_mode(),pentru a desemna noul mod de afisaj al indica-
torului de stiva(din cat in cat creste stiva).Pentru a aloca ulterior
memorie cu functia malloc(),se va utiliza noul mod al indicatorului de
stiva (fara functia _set_new_mode malloc nu poate aloca memorie deoarece
va incerca sa scrie cu valoarea implicita a indicatorului de stiva care
stabileste pasul stivei).(vezi malloc,realloc(),free(), etc.)
-142- [ stdlib.h -div() si ecvt() ]
FUNCTIA div()
-imparte doi intregi si returneaza rezultatul si restul impartirii
SINTAXA GENERALA este: div_t div(int numer,int denom);
unde:
div_t -este tipul de data pentru structura ce va returna datele
numer -este deimpartitul
denom -este impartitorul
Functia returneaza rezultatul sub forma unei structuri de forma:
typedef struct {
int quot;
int rem;
} div_t;
in care quot este variabila care arhiveaza rezultatul impartirii iar
rem este variabila in care se arhiveaza restul impartirii si div_t este
tipul de data (numele structurii).
Daca a fost executata cu succes,functia returneaza structura cu datele
rezultate.Semnul rezultatului din quot va fi cel al catului matematic.
Daca deimpartitul este zero,programul se termina printr-un mesaj de
eroare.
EXEMPLU: #include
#include
div_t x;
int y;
main()
{
for (y=20;y<30;y++)
{ x=div(10*y,y+3);
printf("%d impartit la %d= %d rest %d \n",10*y,y+3,x.quot,x.rem);
printf("Apasati tasta ENTER: \n");
getch(); };
}
Functia se utilizeaza pentru impartirile cu rest (modul din ...).
FUNCTIA ecvt()
-converteste un numar in virgula mobila intr-un sir de caractere
SINTAXA GENERALA este:
char *ecvt(double value,int ndig,int *dec,int *sign);
unde:
value -este valoarea numerica
ndig -este numarul de digiti pentru reprezentarea numarului
dec -arhiveaza pozitia virgulei
sign -arhiveaza semnul numarului
Functia converteste o valoare numerica in virgula mobila de tip double,
intr-un sir de caractere cu formatul specificat prin ndig(numarul de
digiti de reprezentare) si terminat printr-un caracter nul.Numarul va fi
afisat de la stanga la dreapta,incepand cu digitul cel mai semnificativ.
Numarul va fi afisat fara punct sau virgula.Pozitia virgulei va fi salvata
in variabila specificata prin dec,iar semnul numarului va fi arhivat in
variabila specificata prin sign.Daca numarul arhivat in dec este negativ
inseamna ca pozitia virgulei trebuie deplasata la stanga cu numarul res-
pectiv de zecimale.Sign este zero pentru numere pozitive si nonzero (1)
-143- [ stdlib.h - _exit() ]
pentru valorile negative.Variabilele dec si sign sunt utile atunci cand
doriti sa realizati conversia inversa (din sir de caractere in valoare
numerica) cu una din functiile atof(),atoi() sau atol().
Dupa executie,functia returneaza un pointer spre sirul de caractere ce
contine valoarea numerica reprezentata sub forma de caractere si in
formatul specificat.Sirul de caractere se va actualiza de fiecare data
cand este apelata functia ecvt() sau fcvt().
Daca numarul de digiti specificat pentru reprezentarea numarului este
mai mic decat numarul de digiti al valorii numerice,atunci se va trunchia
numarul prin eliminarea digitilor cei mai putin semnificatifi(cei din
coada numarului),iar daca numarul de digiti este excedentar se vor com-
pleta cu zerouri,pana la formatul specificat.
Functia utilizeaza acelasi tampon de memorie ca si functia fcvt(),iar
datele convertite vor fi suprascrise reciproc de catre cele doua functii.
EXEMPLU: #include
#include
#include
double numar=-0.001331415926535;
char *text;
int x,y;
main()
{
text=ecvt(numar,20,&x,&y);
printf("Numarul este: %f \n",numar);
printf("Numarul transcris este: %s \n",text);
printf("Pozitia virgulei este la: %d \n",x);
printf("Semnul numarului este(0=+ 1=-): %d \n",y);
sleep(5);
}
Erorile cele mai frecvente sunt atunci cand se utilizeaza un sir de
conversii succesive si se pierde pozitia virgulei,semnul sau se trunchiaza
numarul datorita unui format de reprezentare insuficient(numerele care nu
se impart exact ocupa cu zecimale intregul format).Nu se recomanda con-
versia succesiva,sau eventual se vor utiliza rutine de conversie bine
verificate pentru toate situatiile matematice posibile.
FUNCTIA _exit()
-termina executia programului (imediat)
SINTAXA GENERALA este: void _exit(int status);
Functia termina executia programului,fara sa inchida file,fara sa trans-
fere datele in memoria fizica (prin flush) si fara sa apeleze functiile
de iesire specificate prin atexit.Este functia de intrerupere de urgenta
a programului.Procesul aflat in executie,cel din care s-a apelat functia
va utiliza valoarea parametrului specificat prin status.Daca valoarea
acestuia este zero (_exit(0) ) specifica o iesire normala din program,iar
daca valoarea este diferita de zero,specifica o iesire de urgenta(eroare).
Functia nu returneaza nici o valoare.Nu se recomanda utilizarea de rutina
deoarece nu permite depanarea programelor in caz de eroare.Se recomanda
pentru iesirea de urgenta din program sau din aplicatie,in situatiile in
care exista riscul de a supraincarca procesorul sau de a suprascrie date
prin depasirea tamponului de memorie alocat.
-144- [ stdlib.h - exit() ]
EXEMPLU: #include
#include
int data;
int numar;
char tasta;
main()
{
for (numar=0;numar<10;numar++)
{
printf("Tastati orice cifra...sau 0 pentru EXIT ! \n");
tasta=getch();
data=atoi(&tasta);
if(data==0)
_exit(0);
printf("Cifra introdusa este: %d \n",data);
}
}
In exemplul de mai sus,orice tasta de tip caracter sau cifra zero,deter-
mina intreruprea de urgenta a programului.Functia poate fi utilizata si
in procesul de depanare a programelor (in situatiile de supradopare a
memoriei de operare) sau in rutinele pentru dispozitive si parole.
FUNCTIA exit()
-executa terminarea normala a programului
SINTAXA GENERALA este: void exit(int status);
Functia determina terminarea procesului care a apelat functia.Inainte de
terminare se vor inchide toate filele,se vor scrie toate datele din tam-
poanele de memorie(cele aflate in asteptare) si vor fi executate toate
functiile de iesire (specificate prin atexit() ).
Parametrul specificat prin status,la fel ca si la functia _exit poate fi
zero in cazul iesirii normale din program sau poate fi nonzero(tipic 1)
0>
Dostları ilə paylaş: |
|
|