Limbajul c si C++ abc-doar


{ printf("Mesaj afisat la iesirea din program \n")



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

{

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)

Yüklə 4,6 Mb.

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