Limbajul c si C++ abc-doar


sleep(3); } Observati ca in formatele mai mici de 10,conversia se opreste la litera a



Yüklə 4,6 Mb.
səhifə24/55
tarix07.05.2018
ölçüsü4,6 Mb.
#50260
1   ...   20   21   22   23   24   25   26   27   ...   55
sleep(3); }

Observati ca in formatele mai mici de 10,conversia se opreste la litera a

in timp ce in formatele mari se converteste intregul numar.Puteti utiliza

variabila stop pentru a identifica ce caracter a terminat conversia.


-167- [ stdlib.h - strtoul() ]

FUNCTIA strtoul()

-converteste un sir de caractere la un numar de tip unsigned long

SINTAXA GENERALA este:

unsigned long strtoul(const char *s,char **endptr,int radix);

Functia converteste sirul de caractere la o valoare de tip unsigned long

(cuprinsa intre 0 si 4294967295).

Functia este identica cu strtol() cu exceptia diferentei in ceea ce pri-

veste domeniul de reprezentare (strict numere pozitive si cu valoare

maxima dubla fata de strtol() ).

Functia returneaza valoarea rezultata sau zero in caz de eroare.

Toate regulile sunt la fel ca pentru functia strtol().

Exemple: formatele mici permit doar cifre mai mici decat formatul(de

exemplu in baza 6 se recunosc cifrele de la 0 la 5)

formatele mari permit si utilizarea literelor (de exemplu,in

baza 35 se recunosc atat cifrele de la 0 la 9 cat si literele de la a

la z ).

Daca aveti dificultati in intelegerea functiilor de acest gen,repetati

pe hartie cu patratele formatele de la 2 la 36 si respectiv modul de

reprezentare al numerelor in diferite formate,sau scrieti o aplicatie

(vezi mai jos pentru numere de la 0 la 40 in baze de la 2 la 20 ).

EXEMPLU: #include

#include

#include

char *text="012345678 unitati monetare"

char *stop;

long int numar1;

unsigned int numar2;

int x;

main()

{

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

{ numar1=strtol(text,&stop,x);

numar2=strtoul(text,&stop,x);

printf("in baza: %d strtol= %ld iar strtoul= %lu \n",x,numar1,numar2);

printf(" \n");

sleep(1);

}

sleep(3); }

Observati ca difertentele apar doar la numere mai mari decat 2147483548.

Remarcati ca pentru valorile unsigned int solicitarea se face cu %lu .

EXEMPLU (pentru formate): #include

#include

#include

int x,y;

char text[80];

main()

{ for (x=2;x<20;x++)

{ for (y=1;y<40;y++)

{ ltoa(y,text,x);

printf("numarul %d baza=%d formatat= %s \n",y,x,text);

sleep(1); } } } (exercitiu de formatare a numerelor)


-168- [ stdlib.h -swab() si system() ]

FUNCTIA swab()

-permuteaza bytes(cate doua caractere=octeti)

SINTAXA GENERALA este: void swab(char *from,char *to,int nbytes);

unde from este sirul sursa

to este sirul de destinatie

nbytes este numarul de caractere ce vor fi permitare (nr.int)

Functia copiaza numarul de carctere specificat prin nbytes,din sirul sursa

in sirul de destinatie si permuteaza caracterele doua cate doua.Numarul

specificat pentru numarul de caractere trebuie sa fie de tip int.Se va

efectua permutarea caracterelor doua cate doua adiacente,intre cel cu

numar impar si cel cu numar par,incepand cu primul caracter din sir.

Functia este foarte utila atunci cand se transfera date de la un calcula-

tor la altul,care are o ordoneaza bytes in mod binar invers.

Pentru ca permutarea sa fie simetrica,este bine ca numarul de bytes soli-

citat pentru copiere si permutare sa fie un numar par.

EXEMPLU: #include

#include

#include

char text[15]=rfna loBlrna d";

char nume[15];

char litere[30]="AB.-CD.-EF.-GH.-IJ.-KL";

char final[30];

main()

{

printf("Sirul initial este: %s \n",text);

swab(text,nume,strlen(text));

printf("Dupa permutare numele este: %s \n\n",nume);

printf("Sirul initial este: %s\n ",litere);

swab(litere,final,strlen(litere));

printf("Iar dupa permutare sirul este: %s \n\n",final);

printf("Apasati orice tasta:");

getch();

}
FUNCTIA system()

-introduce o comanda pentru sistemul de operare

SINTAXA GENERALA este: int system(const char *command);

unde command este comanda pentru sistemul de operare sau numele unei

file izolate,sau al unui program ce va fi lansat din interiorul aplicatiei

Functia apeleaza sistemul de operare pentru a determina procesorul sa

execute comanda specificata sau sa lanseze in executie fila sau programul

specificat.

Pentru a putea fi executat,programul solicitat trebuie sa fie arhivat

in directorul curent sau in unul dintre directoarele arhivate in lista

PATH din mediul de memorie (enviroment).Daca programul sau fila nu este

in directorul curent,se va apela variabila de mediu COMSPEC pentru a

comanda procesorului sa caute in restul directoarelor accesibile.

Daca parametrul command este NULL,sistemul returneaza o valoare nonzero

Daca command este nenul,sistemul returneaza zero(0) daca procesorul a fost

activat sau -1 in caz de eroare.In caz de eroare,variabila errno primeste

una dintre urmatoarele valori: ENOENT,ENOEXEC sau ENOMEM.


-169- [ stdlib.h - ultoa() ]

unde: ENOENT = Path or file function not found

ENOEXEC = Exec format error

ENOMEM = Not enough memory

(sau) E2BIG = Argument list(system dependent) is too big (C++)

Comanda inclusa in functie este transferata direct interpretorului de

comenzi din sistemul de operare si va fi interpretata ca si cand ar fi

fost apelata din cadrul sistemului.

Inainte de a introduce o comanda de sistem,trebuie sa inchideti toate

stream-urile cu comenzi explicite fflush sau flushall (pentru a nu pierde

date importante).Versiunea Visula contine si functia _wsystem() care este

identica dar opereaza doar cu majuscule(pentru sistemul DOS).

EXEMPLU: #include

#include

main()

{

system("chkdsk");

sleep(5);

system("dir");

sleep(5);

system("exit");

}

Nu introduceti comenzi de sistem,daca nu cunoasteti exact semnificatia

acestora deoarece riscati sa modificati setarile sistemului de operare iar

calculatorul poate deveni nefunctional.Verificati cu atentie orice coman-

da de sistem.Este bine sa verificati comanda si modul de excutie intr-o

aplicatie separata si doar apoi sa o introduceti intr-un program complex.

Atentie sa nu supradopati memoria de operare cu date stocate din prea

multe aplicatii apelate simultan sau succesiv.
FUNCTIA ultoa()

-converteste un numar de tip unsigned long la un sir de caractere

SINTAXA GENERALA este:

char *ultoa(unsigned long value,char string,int radix);

unde: value este valoarea numerica(0-4294967295),string este sirul in

care se arhiveaza iar radix este baza de reprezentare(baza de numeratie)

Functia este similara cu ltoa() dar lucreaza cu numere unsigned long.

Baza de reprezentare(radix) poate fi intre 2 si 36.Daca numarul este

negativ,semnul minus este ignorat(inclusiv in baza 10).

Functia returneaza sirul rezultat care poate fi format din maxim 33 bytes.

EXEMPLU: #include

#include

#include

unsigned long numar=987654321;

char text[30];

int x;

main()

{ for (x=2;x<37;x++)

{ ultoa(numar,text,x);

printf("numarul %lu transcris in baza:%d este: %s \n",numar,x,text);

sleep(1); }

sleep(5); }


-170-

BIBLIOTECA C++
Contine toate functiile prezentate pentru limbajul C,la care se adauga si

functiile:_crotr() si crotl(),_fullpath(),_makepath(),mblen(),mbtowc(),

mbstowcs(),_searchenv(),_searchstr(),_splitpath(),_strtold(),time(),

wcstombs(),wctomb().

Functiile permit o mai buna exploatare a sistemului si vor fi prezentate

pe scurt.Remarcati inca o data faptul ca in versiunea C++ variabilele si

tipurile de date locale pot fi declarate si definite in interiorul functi-

ilor in care opereaza sau in interiorul functiei principale [main()] spre

deosebire de limbajul C in care toate declaratiile se fac exclusiv in

afara functiilor.
FUNCTIILE _crotl() si crotr()

-executa un salt binar de tip unsigned char,la dreapta sau la stanga

SINTAXA GENERALA este:

unsigned char _crotl(unsigned char val,int count);

unsigned char _crotr(unsigned char val,int count);

Functia _crotl() executa saltul binar spre stanga iar functia _crotr()

executa saltul binar spre dreapta.Prin salt binar se intelege trecerea

la un exponent imediat superior sau respectiv imediat inferior pentru

baza de numeratie 2.Practic functia inmulteste valoarea numarului cu

2 la puterea respectiva.

In formula,val este valoarea de tip unsigned char(0-255),iar count este

valoarea saltului,respectiv valoarea exponentului la saltul binar.Se

utilizeaza expresia de "rotire a numarului spre dreapta sau spre stanga".

Functiile sunt similare cu _rotl() si _rotr() dar opereaza doar cu valori

cuprinse in domeniul unsigned char (0-255).Functiile sunt utile pentru

operatii cu caracterele ASCII (255 de caractere) sau pentru operatii cu

date in format binar(de exemplu calculul liniilor telefonice ce pot fi

gestionate de o memorie RAM ce opereaza pe 256 biti).

EXEMPLU: #include

#include

#include

main()

{ unsigned char numar=1;

unsigned char rezultat1;

unsigned char rezultat2;

int x;

for (x=2;x<12;x++)

{ printf("Exemplu de salt binar: \n");

printf("numarul initial este: %d \n",numar);

rezultat1=_crotl(numar,x);

rezultat2=_crotr(numar,x);

printf("numarul de salt este: %d \n",x);

printf("dupa salt la stanga numarul este: %d \n",rezultat1);

printf("iar dupa salt la dreapta numarul este: %d \n",rezultat2);

printf(" \n \n ");

sleep(3); }

sleep(5);}

Repetati exercitiul si cu alte valori pentru numar (2,3,4,5 etc...).


-171- [ stdlib.h - _fullpath() ]

Atat numarul initial cat si valoarea returnata de functie trebuie sa

fie cuprins in domeniul reprezentabil (unsigned char),adica sa fie un

numar cuprins intre zero si 255,sau echivalentul decimal sau hexadecimal

al unui astfel de numar.

Functiile returneaza valoarea rezultata in urma saltului binar (vezi si

operatorul de salt binar << si >> ).In caz ca rezultatul operatiei este

in afara domeniului reprezentabil,functia returneaza valoarea cea mai

apropiata din domeniul reprezentabil (saltul imediat inferior).

Functiile _crotl() si _crotr() sunt foarte utile mai ales pentru gestio-

narea memoriei de operare atunci cand se lucreaza cu date in format binar.
FUNCTIA _fullpath()

-converteste calea de acces de la o valoare relativa la valoarea absoluta

SINTAXA GENERALA este:

char *_fullpath(char *buffer,const char *path,int buflen);

unde:

buffer -este tamponul de memorie in care se va salva valoarea

absoluta pentru calea de acces(calea complecta)

path -este constanta de tip caracter care contine calea relativa

de acces la fisier(rezumatul caii de acces)

buflen -este dimensiunea tamponului de memorie (in Bytes) adica

lungimea maxima posibila a sirului returnat

Functia converteste rezumatul caii de acces la o cale de acces completa

(unitate,director,subdirectoare,extensii etc.),care va fi salvata intr-un

tampon de memorie spre care pointeaza pointerul specificat prin buffer.

Pentru numarul maxim de caractere ce poate fi continut in sirul returnat

se poate utiliza constanta _MAX_PAH care contine numarul maxim de carac-

tere acceptat de sistemul de operare pentru calea de acces(difera de la

un sistem de operare la altul).Daca tamponul de memorie specificat pentru

salvarea sirului nu este suficient de mare,functia returneaza NULL.Tot

NULL returneaza si in cazul in care calea de acces specificata este

eronata,contine nume de unitati inexistente etc.Daca tamponul de memorie

specificat prin buffer este NULL,functia aloca un tampon de memorie cu

lungimea _MAX_PATH.Cand tamponul alocat nu mai este necesar este bine sa

fie eliberat din memorie cu free().

Daca a fost executata cu succes,functia returneaza un pointer spre tampon-

ul de memorie care contine calea absoluta de acces la fila sau fisierul

respectiv,iar in caz de eroare returneaza NULL.

Calea relativa de acces (relative path) specifica o cale de acces spre

o alta locatie din acelasi director (Exemplu: de la Text.txt la Text.exe)

in timp ce calea absoluta de acces cuprinde toate datele:unitate,director,

subdirector,extensie etc.

Spre deosebire de _makepath(),functia _fullpath() poate fi utilizata si

pentru a obtine calea absoluta de acces din cai de acces relative ce

contin unul sau mai multe subdirectoare ( "./" sau "../") in denumirea

lor.

Functia este extrem de utila pentru a simplifica rutinele de deschidere

automata a unor file si fisiere cu open() si fopen().In caz ca tamponul

specificat prin buffer este NULL,functia apeleaza la malloc() pentru a

aloca spatiul de memorie necesar pana la valoarea de _MAX_PATH si ignora

valoarea specificata prin buflen.Tamponul nu va fi eliberat automat !.


-172- [ stdlib.h - _makepath() ]

EXEMPLU: #include

#include

#include

#include

main()

{

char *cale;

char *fila="fullpath";

char *rezultat;

printf("Calea relativa de acces este: %s \n",fila);

cale=searchpath("fullpath1.cpp");

rezultat=_fullpath(fila,cale,80);

printf("Calea absoluta de acces este: %s \n",rezultat);

printf("PATH= %s \n",cale);

sleep(5);

}

Exemplul identifica calea de acces spre fila de aplicatie care contine

exemplul pe acre am denumit-o fullpath1.cpp si pentru care am aplicat

functia automata searchpath() din .Calea de acces obtinuta poate

fi utilizata pentru apelarea filei ori de cate ori este necesar.Pentru

exercitiu,specificati tampoane de memorie de dimensiuni diferite si

cai de acces diferite (eventual si eronate) pentru a observa rezultatul

returnat de functie.In aplicatii si programe este bine sa urilizati

functii automate pentru identificarea caii de acces la fisiere.
FUNCTIA _makepath()

-construieste o cale de acces,din parti componente

SINTAXA GENERALA este:

void _makepath(char *path,const char *drive,const char *dir,

const char *name,const char *ext);

unde: path este pointerul spre tamponul de memorie in care se va arhiva

calea returnata

drive este pointerul spre constanta care contine numele unitatii

dir este pointerul spre constanta care contine numele fisierului

name este pointerul spre constanta care contine numele filei

ext este pointerul spre constanta care contine tipul de extensie

Toti pointerii sunt spre date de tip caracter.Functia construieste calea

de acces din subunitati dupa modelul general:

X:\DIR\SUBDIR\NAME>EXT

unde X este numele unitatii de disc

DIR\SUBDIR\ este numele directorului si subdirectorului(fisiere)

NAME este numele filei(aplicatiei)

EXT este extensia filei

Cand constanta pentru numele unitatii contine caracterul NULL,calea de

acces returnata va omite numele unitatii de disc(se va utiliza implicit

cea instalata) iar daca lipsesc cele doua puncte,acestea vor fi incluse

automat in expresie.

In lipsa numelui pentru director sau subdirectoare,calea de acces va fi

construita fara numele fisierului.Daca lipseste bara de separatie

(\ sau /),se va adauga automat o bara de tip \.Calea poate fi construita

si fara numele filei sau al tipului de extensie.Punctul se adauga automat.


-173- [ stdlib.h - splitpath() ]

Pentru ca functia sa poata fi aplicata,tamponul de memorie specificat

pentru salvarea sirului rezultat trebuie sa fie suficient de mare ca sa

cuprinda sirul generat.Dimensiunea maxima a tamponului nu poate fi mai

mare decat _MAX_PATH (80 pe 16 biti sau 256 pe 32 de biti).

Functia este inversa si compatibila cu _splitpath() care separa calea de

acces in componente.Astfel o cale de acces separata cu _splitpath() poate

fi reconstruita cu _makepath()...si viceversa.

Functia nu returneaza nici o valoare.

EXEMPLU: #include

#include

#include

main()

{

char *tampon,*unitate,*director,*nume,*extensie;

tampon=" ";

unitate="C";

director="Programe/prog1/";

nume="Scrisoare";

extensie="txt";

_makepath(tampon,unitate,director,nume,extensie);

printf("Calea construita este: %s \n",tampon);

sleep(5);

free(tampon);

}

Este bine sa eliberati tamponul de memorie atunci cand nu mai este nece-

sar(nu se elibereaza automat).Functia este foarte utila,mai ales impreuna

cu _splitpath() pentru a construi calea de acces spre o fila noua(De

exemplu se identifica calea de acces la fisier cu _searchpath() care se

fragmenteaza cu splitpath() si apoi se construieste cu _makepath() calea

de acces spre noua fila,adaugand doar numele filei si extensia.)

(vezi si fullpath() si splitpath() )
FUNCTIA _splitpath()

-separa o cale de acces in elemente componente

SINTAXA GENERALA este:

void _splitpath(const char *path,char *drive,char *dir,char *name,

char *ext);

functia este inversa cu _makepath() si separa o cale de acces(PATH) in

elementele sale componente,dupa formula generala:

X:\DIR\SUBDIR\NAME.EXT

va fi separata in: drive=numele unitatii ( X:)

dir =directorul si subdirectorul (DIR\SUBDIR)

name =numele filei (NAME)

ext =extensia filei (EXT)

datele preluate in urma scindarii vor fi salvate in variabilele de tip

char spre care pointeaza pointerii din declaratia functiei.Calea de acces

(constanta de tip char) poate fi preluata si de la o functie _makepath()

cu care _splitpath() este perfect compatibila.Oricare dintre elementele

componente (inclusiv calea de acces) poate fi nula,caz in care datele

respective vor fi transferate functiei _splitpath() dar nu vor fi arhi-

vate in variabila specificata.


-174- [ stdlib.h - mblen() ]

Lungimea maxima pentru sirurile arhivate in cele patru variabile poate

fi specificata si utilizand constantele _MAX_DRIVE,_MAX_DIR,_MAX_FNAME,

si _MAX_EXT(predefinite in ) la care se adauga si un spatiu

nul terminator de sir.

Functia este identica cu fnsplit() din care are o sintaxa iden-

tica si salveaza sirurile rezultate in variabile cu dimensiunea maxima

determinata de constantele MAXDRIVE,MAXDIR,MAXPATH,MAXFILE si MAXEXT

(din ) dupa cum urmeaza:

Yüklə 4,6 Mb.

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