|
Limbajul c si C++ abc-doar
|
səhifə | 1/55 | tarix | 07.05.2018 | ölçüsü | 4,6 Mb. | | #50260 |
|
**********************
* Limbajul C si C++ *
* ABC-doar *
* ********************
*********************************
* autor RUSU MIRCEA AUREL VALER *
*********************************
************************************
*MOTTO: *
* *
* Omul nu este supus masinii... *
* *
* ...si totusi... *
************************************
Limbajul C,si mai apoi urmasul sau C++,a fost gandit,comceput,
proiectat si apoi realizat prin structurare pe logica de procesor.
Acest program nu a fost creat pentru a face munca omului mai usoara,
ci pentru a face munca procesorului cat mai usoara.Pentru ca sa-l
intelegeti si sa-l iubiti,trebuie mai inatai sa invatati sa ganditi
ca o masina de calcul.Apoi,ve-ti realiza ca este usor,flexibil,rapid
si adaptabil,in permanenta schimbare...infinit.
C O N T I N U T
Generalitati . . . . . . . . . . . . . . . . . . . 1
Structura programelor . . . . . . . . . . . . . . 2
Biblioteca de functii standard (ANSI C) . . . . . 73
stdio.h (C++ 5.0 ) . . . . . . . . . . . 119
stdlib.h . . . . . . . . . . . . . . . . 135
stdlib.h (C++ 5.0 ) . . . . . . . . . . 170
stdarg.h . . . . . . . . . . . . . . . . 180
stddef.h . . . . . . . . . . . . . . . . 181
math.h . . . . . . . . . . . . . . . . . 182
graphics.h . . . . . . . . . . . . . . . 202
conio.h . . . . . . . . . . . . . . . . . 257
io.h . . . . . . . . . . . . . . . . . . 274
string.h . . . . . . . . . . . . . . . . 294
dos.h . . . . . . . . . . . . . . . . . . 312
process.h . . . . . . . . . . . . . . . . 359
ctype.h . . . . . . . . . . . . . . . . . 364
dir.h . . . . . . . . . . . . . . . . . . 373
alloc.h . . . . . . . . . . . . . . . . . 381
assert.h . . . . . . . . . . . . . . . . 384
bios.h . . . . . . . . . . . . . . . . . 385
errno.h . . . . . . . . . . . . . . . . . 391
float.h . . . . . . . . . . . . . . . . . 393
limits.h . . . . . . . . . . . . . . . . 397
mem.h . . . . . . . . . . . . . . . . . 397
setjmp.h . . . . . . . . . . . . . . . . 398
share.h . . . . . . . . . . . . . . . . . 400
signal.h . . . . . . . . . . . . . . . . 400
time.h . . . . . . . . . . . . . . . . . 403
values.h . . . . . . . . . . . . . . . . 409
Recomandari generale . . . . . . . . . . . . . 409
Anexe utile (functii grupate pe categorii) . . 411
Index alfabetic (functii si tipuri de date) . . 415
DATE GENERALE
Codul sursa utilizat pentru implementarea limbajului C nu este un
program in adevaratul sens al cuvantului ci o rutina interna de procesor
creata si apoi adaptata si readaptata in anii 1960-1970(Martin Richards,
Ken Thompson,Dennis Rithchie).Ca rezultat,sursa de cod C nu contine
functii de intrare/iesire a datelor,ci doar cuvinte cheie,utilizate doar
pentru ordonarea circulatiei fiecarui bit in interiorul procesorului.
Initial rutina de procesor(codul sursa) a fost utilizata doar experi-
mental,pentru realizarea de functii compatibile cu procesorul respectiv.
Pentru aplicarea limbajului,este necesar ca intrarea si iesirea datelor
in si din procesor sa fie reglementata,fie de catre un alt procesor(co-
procesor) fie de catre un set de functii I/O salvate si incarcate in me-
morie separat(o biblioteca de functii I/O).
Astfel,prima etapa in organizarea muncii pentru editarea unui program
in limbaj C si C++,consta din alegerea bibliotecilor de functii auxiliare
necesare.La prima vedere,pare o complicatie inutila,dar aceasta inovatie
a stat la baza vitezei de calcul,a flexibilitatii si a elegantei progra-
mului.Dupa cum este usor de intuit,procesorul nu este incarcat cu date
inutile ci doar strict cu functiile strict necesare pentru procesarea
aplicatiei dorite.Acest fapt are o semnificatie deosebita,mai ales atunci
cand se lucreaza la viteze foarte mari,cu volume mari de informatie.
In ansamblul sau,limbajul este format din cuvinte cheie(32 in C si 62
in C++),operatori(peste 40),modificatori(ai formatului pentru fiecare tip
de date) si functii auxiliare(545 de functii structurate in 30 de biblio-
teci in limbajul C).Prin combinarea acestor elemente se obtin circa un
milion de tipuri de formulare a expresiilor logice(linii de program),iar
prin includerea de constante si variabile in expresii se obtine un numar
practic infinit de variante posibile de limbaj exprimat corect(si impli-
cit un numar tot infinit de expresii incorecte).
Limbajul propriu zis nu este nici foarte complex,nici incomprehensi-
bil,dar nu este recomandat incepatorilor din doua motive:flexibilitatea
exprimarilor se preteaza la un numar extrem de mare de erori de conceptie
(expresiile sunt corecte,dar rezultatul este aberant) sau respectiv la
erori de sistem (codul sursa permite interventii la nivel de procesor,
care pot deregla sistemul de operare).
Pentru initiere in programare se recomanda programele de nivel inalt
cu functii explicite si comenzi secventiale(BASIC,FoxPro etc.).Este bine
ca utilizatorii limbajului C sa fie familiarizati cu modul de editare a
unei linii de program,structurarea de functii,rutine si subrutine,etc.
Daca sunteti incepator,si doriti totusi sa invatati acest limbaj,este
bine sa nu va lansati in operatii si comenzi al caror rezultat nu puteti
sa-l prevedeti.
Prin adaugarea de noi cuvinte cheie,sau de biblioteci de functii
auxiliare,programul este in continua dezvoltare si transformare.Dupa
prima standardizare ANSI(American National Standards Institute) din anul
1983,programul a primit noi valente si respectiv numele de C+ si apoi C++
(si salturile calitative probabil ca vor continua).
Limbajul C permite manevrarea bitilor,a octetilor si a adreselor de
memorie,este portabil pe aproape orice tip de calculator,este structurat
(sub forma de functii si biblioteci) si permite un numar mare de tipuri
si de formaturi pentru date(cinci tipuri de date).
-2- [asm-cdecl]
Nucleul de baza al limbajului C este format din urmatoarele cuvinte
cheie:asm,break,case,cdecl,char,const,continue,default,do,double,else,
enum,extern,far,float,for,goto,huge,if,int,interrupt,long,near,pascal,
register,return,short,signed,sizeof,static,struct,switch,typedef,union,
unsigned,void,volatile,while (versiunea Turbo 1.0 Borland 1988)
CUVINTE CHEIE(semnificatia lor):
asm<; or newline>
-este o declaratie care permite plasarea de declaratii in limbaj de
asamblare,situate in mijlocul sursei de cod C.In acest caz,toate
simbolurile C vor fi inlocuite prin echivalentul lor din limbajul de
asamblare.Pentru utilizarea acestui cuvant cheie,este necesara compi-
larea cu TCC.
EXEMPLU: asm mov ax,_stklen
break ;
-este o declaratie care determina deplasarea controlului la expresia
imediat urmatoare celei care inchide o bucla de tip while,do,for sau
switch (determina iesirea din bucla).
EXEMPLU: switch( i )
{
case -1:
n++
break;
case 0
p++
break;
case 1:
z++
}
case
-este declaratia prin care se realizeaza ramificarea unei comenzi de
tip switch() pentru a permite selectarea uneia
dintre variante(vezi mai sus).
Bucla de executie continua pana la epuizarea variantelor,sau pana la
cuvantul cheie break.
EXEMPLU: switch (operand) {
case MULTIPLY: x*=y;break;
case DIVIDE: x/=y;break;
case ADD: x+=y;break;
case SUBTRACT: x-=y;break;
case INCREMENT:x++;break;
}
cdecl ; sau cdecl ;
-declara numele unei variabile sau al unei functii in stilul C (adica
cu respectarea stricta a literelor majuscule si minuscule).
In plus,declara si conventia de transfer a parametrului functiei(tot
in stil C),care se va aplica functiei initiale(Exemplu:ultimul para-
metru va fi impins in fata iar apoi se sterge stiva)
EXEMPLE: int cdecl FileCount;
far cdecl HisFunc(int x);
-3- [char-do]
char
-desemneaza tipul unei date ca fiind de tip caracter.O variabila de
tip caracter au o lungime de 8 biti(1 byte=1 octet) si pot fi influ-
entate de modificatorul signed(valoarea implicita),unsigned,(ascii7).
Cu modificatorul signed,valoarea lor este cuprinsa intre -128 si 127,
iar cu unsigned intre 0 si 255.(in versiunea Visual C++ 6.0 valoarea
implicita pentru char este unsigned)
Modificatorul ascii7(in C++) specifica faptul ca toate valorile de
tip caracter vor fi transferate in filele generate fara modificator.
EXEMPLE: midl /char signed filename.idl
midl /char unsigned filename.idl
midl /char ascii7 filename.idl
const [=];
-permite atribuirea unei valori initiale pentru o variabila,fara ca
aceasta sa mai poata fi schimbata in timpul executiei programului.
EXEMPLU: const my_age=29;
Orice incercare a schimba valoarea pentru variabila my_age va genera
o eroare de compilare.
sau (const*;)
-se utilizeaza pentru a desemna tipul variabilei unei functii.
EXEMPLU: REZULTAT GetName(wchar_t * const pszName);
continue;
-determina trecerea controlului la sfarsitul buclei curente de tip
while,do sau for,la expresia care determina conditia de reevaluare a
continuarii buclei(determina continuarea executiei buclei).
EXEMPLU: for (i=0;i<20;i++){
if(array[y]==0)
continue;
array[i]=1/array[i];
}
default
-este valoarea implicita (originala) a unei date
Se poate include intr-o bucla pentru a returna un mesaj standard in
caz ca nici una dintre variante nu este evaluata a fi corecta.
EXEMPLU: switch (operand){
case MULTIPLY: x*=y;break;
case DIVIDE: x/=y;break;
default: printf("eroare de calcul!\n");
}
do while ();
-determina executia comenzii din atat timp cat valoarea
din este diferita de zero.Valoarea expresiei va fi veri-
ficata dupa fiecare executie a comenzii din .
EXEMPLU: i=1;n=1
do {
n*=i;
i++;
} while (i<=factorial);
-4- [double-far]
double, long double
-se utilizeaza pentru date de tip numar real
Variabilele de tip double au o lungime de 8 bytes(octeti) si exprima
numere cuprinse intre 1.7 E-308 si 1.7 E+308 (pe 15 digits).
Variabilele de tip long double au o lungime de 10 bytes(octeti) si
exprima numere cuprinse intre 1.2 E-4932 si 1.2 E+4932 (pe 19 digits)
Pentru utilizarea tipurilor de date double si float,este necesara si
incarcarea bibliotecii de functii matematice(# include math.h).
Se observa faptul ca se poate opera cu numere extreme (absolut inedit
pentru programele comerciale curente).
else
este optiunea alternativa din functia conditionala if
EXEMPLU: if (x
z=x;
else
z=y
#else face parte dintr-o declaratie #if de tip preprocesor si se
utilizeaza pentru a selecta liniile de date din program care vor fi
compilate,fata de cele care vor fi ignorate (conditia de selectare)
enum []{[=],...};
-defineste un set de constante de tip int.
Optional,sirul de constante poate primi un nume de identificare
Constantelor li se poate atribui o valoare fixa cu ,sau in
absenta acesteia li se va atribui automat valoarea constantei prece-
dente din lista de constante.Daca este o singura constanta si
lipseste,se va atribui valoarea implicita,adica zero (0).
EXEMPLU: enum moduri{LASTMODE=-1,BW40=0,C40,BW80,C80,MONO=7};
in exemplul de mai sus,C40,BW80 si C80 primesc valoarea lui BW40 (0).
extern ; sau extern ;
-este un declarator utilizat atunci cand functia respectiva are si
legaturi externe(de exemplu functia a fost declarata in alt modul
de cod sursa,situat pe o alta fila).
Se poate aplica atat pentru obiecte cat si pentru functii,in urma-
toarele situatii: 1.functii declarate in interiorul unui bloc,
2.obiecte intr-un bloc 3.obiecte in afara blocului 4.functii
EXEMPLE: extern int_fmode;
extern void Factorial(int n);
far far
sau far
-este un modificator care declara pointerul sau functia respectiva ca
fiind formata din doua cuvinte situate la maxim 1 megabyte distanta
(cat de departe se afla pointerul sau functia).Se utilizeaza atunci
cand compilarea se face pe modele foarte mici,la care conteaza dimen-
siunea memoriei (sa nu uitam ca au existat HDD-uri de 1-10 Mb).
Nu se mai utilizeaza in cazul C++ si in cazul sistemului de operare
Windows,care gestioneaza singur toate adresele.
EXEMPLE: char far *s;
void * far * p;
-5- [float-int]
float
-se utilizeaza pentru date de tip numere reale
Variabilele de tip float au o lungime de doua cuvinte (4 octeti) si
exprima numere cuprinse intre 3.4 E-38 si 3.4 E+38 (pe 7 digiti).
Pentru utilizarea datelor numerice de tip float este necesara si
incarcarea bibliotecii de functii matematice (#include math.h).
for([];[];[])
-este o bucla de repetitie in care comanda din statement este executata
in mod repetat pana cand valaorea lui este 0.Inaintea primei
repetitii,se evalueaza valoarea lui .Dupa fiecare repetitie,se
evalueaza care incrementeaza counterul.Toate cele trei expresii
sunt optionale (pot lipsi din expresie).Daca este omis,sa va
considera valoarea sa implicita,adica 1.
Bucla se executa pana cand evaluarea expresiei returneaza false
(adica 0).
EXEMPLE: for (i=0;i<100;i++)
sum +=x[i];
sau for(i=0,t=string;i<40&&*t;i++,t++)
putch(*t);
putch('\n');
goto ;
-transfera controlul la locatia specificata prin identificator
EXEMPLU: goto Again;
goto Stop;
huge huge
;
-este un modificator similar cu far,dar segmentul sau este normalizat,
astfel incat compararea celor doua adrese sa fie cat mai exacta,iar
valoarea pointerelor huge poate fi incrementata fara ca segmentul sau
sa fie redus (prin impachetare).
if() if()
sau
else
-daca evaluarea expresiei este diferita de zero,se va executa comanda
din (in primul caz) iar daca evaluarea expresiei este zero
se va executa comanda din varianta optionala inclusa prin else (in
cel de al doilea caz)
EXEMPLU: if(count<50)
count++;
#if este comanda de preprocesare prin care se selecteaza liniile de
adresa din program care vor fi compliate(incarcate in procesor)
int
desemneaza datele de tip integer.Cu modificatorul signed(implicit) ia
valori cuprinse intre -32768 si 32767 iar cu unsigned intre 0 si 65535
-6- [int-return]
_int8 (C++)
ocupa un octet si poate lua valori intre -128 si 127
_int16 (C++)
ocupa doi octeti si poate lua valori intre -32768 si 32768
-int32 (C++)
ocupa 4 octeti,ia valori intre -2147483648 si 2147483647
-int64 (C++)
0cupa 8 octeti,ia valori intre -9223372036854775808 si
9223372036854775808
interrupt ;
defineste o functie ca si nivel de intrerupere.
Toti registri CPU(unitatea centrala de procesare) vor fi salvati,
iar functia va fi terminata cu instructiunea IRET.
La executarea unei astfel de intreruperi,variabilele de registru si
avertizarea Stack(de supraincarcare a stivei) trebuie sa fie OFF.
long
-este un modificator ce se poate aplica datelor de tip int si double
EXEMPLE: long x (sau long int x /* int este implicit*/)
long double x
unsigned long int x
long int se reprezinta pe 4 octeti pentru numere cuprinse intre
-2147483648 si 1147483647
long double se reprezinta pe 10 octeti cu valori cuprinse intre
1.2 E-4932 si 1.2 E+4932 (pe 19 digits)
near near
/ near ;
-declara pointerul cu o lungime de un cavant (pana la 64K)
Acest modificator se utilizeaza la compilarea blocurilor mari de
memorie,pentru a forta pointerul sa fie cat mai apropiat.
EXEMPLE: char near*s
int(near*ip)[10];
pascal ; sau pascal ;
-declara o variabila sau o functie folosind conventiile de nume in
stilul Pascal(de exemplu scrise cu majuscule).
in plus,declara conventiile de tip Pascal pentru transferul de date
EXEMPLE: int pascal FileCount
far pascal HisFunc(int x,char*s);
In C++ acest cuvant cheie nu mai functioneaza.
register
-este un declarator
Specifica faptul ca variabila va fi arhivata intr-un registru masina
(in CPU daca este posibil) pentru a optimiza accesul.
EXEMPLU: register int i;
return [];
-executa iesirea imediata din functia curenta spre rutina din care a
fost apelata,eventual returnand o valoare.
-7- [short-struc]
EXEMPLU: double sqr(double x)
{
return(x*x)
}
short
-este un modificator care determina lungimea datei la 2 octeti(16 bit)
si domeniul de valori intre -32768-32767.Se aplica pentru int.
EXEMPLE: short int x
signed short int y
signed
-este un modificator ce se poate aplica datelor de tip int,char.
Pentru caracterele char reprezinta valoarea implicita(lungime de
1 octet=8 biti si valori intre -128 si 127.
Se poate cupla cu ceilalti modificatori.
EXEMPLE: signed char text
signed short int x
signed long int y
sizeof sau sizeof()
-returneaza lungimea expresiei,exprimata in bytes(octeti),sau respectiv
lungimea unui tip de date.
Ca operator,are precedenta fata de: * & -- ++ - " !
EXEMPLE: memset(buff,sizeof(buff),0);
nitems=sizeof(table)/sizeof(table[0]);
static sau static ;
-functiile si variabilele au sens doar in domeniul de valori cu care au
fost citite la compilarea actuala a programului.In cazul in care sunt
citite de catre un program extern si sunt utilizate de catre o functie
locala(din programul respectiv),static determina ca valoarea initiala
sa fie salvata si mentinuta intre apelari succesive ale functiei sau
variabilei respective(functia sau variabila mentine valoarea initiala,
intre solicitari).
Dostları ilə paylaş: |
|
|