|
sleep(3); }
Observati ca in formatele mai mici de 10,conversia se opreste la litera a
|
səhifə | 24/55 | tarix | 07.05.2018 | ölçüsü | 4,6 Mb. | | #50260 |
| 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:
Dostları ilə paylaş: |
|
|