Sunteți pe pagina 1din 8

Capitolul 4 No iuni de programare n limbajul C

Obiectiv: familiarizarea cu no iunile baz ale limbajului C (tipuri, operatori, func ii). Activit i: - Trecerea n revist a tipurilor de date fundamentale; utilizarea modificatorilor; - Prezentarea operatorilor aritmetici, logici, rela ionali i la nivel de bit; - Prezentarea func iilor matematice (sin, cos, log, log10, sqrt, pow, M_PI, random); - Declararea i folosirea constantelor (const, define); - Afiarea i citirea de la tastatur - folosind func iile printf i scanf;

4.1. Tipuri de date


4.1.1 Tipuri de date fundamentale
Tipurile de date fundamentale ale limbajului C sunt: caractere (char), ntregi (int), numere reale reprezentate n virgul mobil cu simpl precizie (float), numere reale reprezentate n virgul mobil cu dubl precizie (double) i fr valoare (void). Toate celelalte tipuri de date folosite de limbajul C sunt bazate pe aceste tipuri de date fundamentale. Tip char int float double void Numr de bi i 8 16 32 64 Domeniu de valori -128 ...127 - 32,768 ... 32,767 - 3.4 * (10^38) ... 3.4 * (10^38) - 1.7 * (10^308) ... 1.7 * (10^308) Nici o valoare (mul imea vid)

Tabel 4.1 Tipuri de date fundamentale

4.1.2 Modificarea tipurilor de baz


Unele tipuri fundamentale de date pot fi precedate de diveri modificatori. Un modificator se utilizeaz pentru a schimba sensul tipului de baz n vederea unei adaptri mai precise la anumite situa ii. Modificatorii limbajului C sunt: signed unsigned long short Acesti modificatori pot fi aplica i tipurilor char i int iar modificatorul long poate fi aplicat i tipului double. Tip unsigned char unsigned int long int unsigned long int Numar de biti 8 16 32 32 Domeniu de valori 0 ...255 0 ...65,535 - 2,147,483,648 ... 2,147,483,647 0 ... 4,294,967,295

Tabel 4.2 Exemple de utilizare a modificatorilor

Utilizarea modificatorului signed pentru ntregi este permis dar este inutil pentru c declara ia implicit de ntreg presupune un numr cu semn. Modificatorul long poate fi utilizat fr a preciza tipul aspra cruia se aplic, n mod implicit va fi considerat tipul ntreg.

Programarea Calculatoarelor

Capitolul 4 No iuni de programare n limbajul C

Diferen a ntre ntregii cu semn i cei fr semn consta n modul n care este interpretat bitul de cel mai mare ordin al ntregului. n cazul numerelor cu semn, bitul cel mai semnificativ are rolul de a indica semnul: valoarea 0 a bitului indic un numr pozitiv iar valoarea 1 un numar negativ. n cazul numerelor fr semn bitul cel mai semnificativ con ine informa ie util.

4.2

Operatori

4.2.1 Operatori aritmetici


Operatorii aritmetici folosi i n limbajul C sunt: + adunarea a dou numere; - scderea a dou numere; * nmul irea a dou numere; / mpr irea a dou numere (rezultatul mpr irii pentru numere reale, ctul mpr irii pentru numere ntregi); % modulo (restul mpr irii a dou numere ntregi); ++ incrementarea (mrirea unei valori cu o unitate); -- decrementarea (micorarea unei valori cu o unitate); Exemplu pentru folosirea lui modulo: #include <stdio.h> int main (void) { int a = 54; int mod; mod = a % 10; printf ("Restul impartirii lui %d la 10 este %d\n",a, mod); return 0; } Operatorii de incrementare - decrementare sunt folosi i pentru mrirea respectiv micorarea unei valori cu o unitate. Sunt de forma: v++ incrementare; --v decrementare; Se pot folosi i instruc iuni de pre/post incrementare/decrementare: post-incrementare: x = a++; - este echivalent cu x = a; a = a + 1; pre-incremenatare: x = ++a; - este echivalent cu a = a + 1; x = a; Pentru decrementare se procedeaz n mod analog.

4.2.2 Operatori rela ionali i logici


Termenul rela ional se refer la rela iile care se pot stabilii ntre diverse valori. Termenul logic se refer la felul n care se pot lega rela iile existente. ntruct operatorii rela ionali i logici sunt deseori folosi i mpreun, i vom trata mpreun. Ideea de adevrat sau fals st la baza conceptelor de operatori logici i rela ionali. n C adevrat nseamn orice valoare deferit de 0, iar fals este 0. Expresiile care folosesc operatori rela ionali i logici returneaz 0 pentru fals i 1 pentru adevrat. Operator > >= < Actiune Mai mare dect Mai mare sau egal Mai mic

Programarea Calculatoarelor

Capitolul 4 No iuni de programare n limbajul C

<= == != Operator && || !


Tabel 4.4 Operatori logici

Mai mic sau Egal Egal Diferit


Tabel 4.3 Operatori rela ionali

Actiune SI SAU NU

Tabelul cu valorile de adevr pentru operatorii logici este prezentat folosind cifrele 1 i 0. a 0 0 1 1 b 0 1 0 1 a && a 0 0 0 1 a || b 0 1 1 1 !a 1 1 0 0

Tabel 4.5 Valorile de adevr a operatorilor logici

Exemplu: int a=3,b=4,c=0,rez; rez=!(a < c) && (a<b) || (b<=c); printf(%d\n,rez);

4.2.3 Operatori la nivel de bit


Limbajul C pune la dispozi ie ase operatori la nivel de bit, furniznd astfel facilit i specifice de obicei limbajelor de asamblare. Aceti operatori permit scrierea unor programe care lucreaz ndeaproape cu sistemul hardware al calculatorului. Operatorii la nivel de bit se aplic unor valori ntregi asociate cu tipurile char, int, long, cu / fr semn - iar rezultatele ob inute sunt, de asemenea, ntregi. Fa de ceilal i operatori ai limbajului, acetia opereaz asupra fiecrui bit din reprezentarea intern a operanzilor, tratndu-l independent de valorile celorlal i bi i. Operatorii la nivel de bit sunt urmtorii. & - AND (i logic); | - OR (sau logic); ^ - XOR (sau exclusiv); << - deplasare la stnga; >> - deplasare la dreapta; ~ - negare la nivel de bit (operator unar); ntreg A 0 0 1 1 ntreg B 0 1 0 1 & 0 0 0 1 Rezultatul ^ 0 1 1 0 | 0 1 1 1

Tabel 4.6 Operatori pe bi i

Indiferent de scopul n care sunt utiliza i operatorii, maniera n care sunt folosi i este n general aceeai. n cele ce urmeaz, se vor descrie pe scurt principiile de baz ale utilizrii lor. Observa ie: Operatorii la nivel de bit nu modific valoarea operanzilor (se comport ca i operatorii aritmetici obinui i), astfel o opera ie n << 2 va rezulta ntr-un nou numr, fr a modifica valoarea variabilei n. Pentru a modifica valoarea variabilei n trebuie s avem o atribuire:

Programarea Calculatoarelor

Capitolul 4 No iuni de programare n limbajul C

n = n << 2; Exemplu de folosire a operatorului AND - afiarea unui bit dintr-un ntreg. Pentru a afla un bit din reprezentarea binar a unui numr zecimal, se poate realiza o opera ie AND ntre numrul n format binar i numrul binar care are doar bitul X egal cu 1 (unde X este egal cu numrul bitului care se dorete aflat). Rezultatul va fi diferit de 0 dac bitul respectiv este 1 i va fi 0 dac bitul respectiv este 0. Exemplu: dac dorim s aflm valoarea bitului de pe pozitia 3 (numrarea ncepe de la 0 i se face de la dreapta la stnga) a intregului 108: int a=108; /*0000 0000 0110 1100*/ int masca=8; /*0000 0000 0000 1000*/ if(a & masca) /*0000 0000 0000 1000*/ /*bitul are valoarea 1*/ else /*bitul are valoarea 0*/ Operatorul AND (&) se poate folosi i pentru a masca anumi i bi i dintr-un numr: Exemplu: n = n & 177 va pune pe 0 bi ii din n corespunztori valorilor zero din reprezentarea binar a numrului 177 (adic 10110001), bi ii cu valoarea 1 rmnnd nemodifica i. Operatorii de deplasare (<< i >>) realizeaz deplasarea bi ilor din operandul stng cu attea pozi ii cte sunt indicate de operandul drept. Deplasarea la stnga (<<) completeaz la dreapta cu 0 (bi ii din stnga se vor pierde), iar la dreapta numrului se completeaz cu 0. Exemplu: int a=255; /* 0000 0000 1111 1111*/ a=a<<3; /* 0000 0111 1111 1000*/ n cazul deplasrii la dreapta (>>), bi ii din dreapta se pierd, iar n stnga se introduc bi i de 0, n caz c numrul era de tip fr semn (unsigned) sau bi i egali cu bitul de semn (cel mai din stnga bit) n cazul numerelor de tip cu semn. Numere fr semn: unsigned int a= 32768;/*1000 0000 0000 0000*/ a=a>>3; /*0001 0000 0000 0000*/ Numere cu semn: int a=-18; a=a>>3; int b=18; b=b>>3;

/* 1111 1111 1110 1110*/ /* 1111 1111 1111 1110*/ /* 0000 0000 0001 0010*/ /* 0000 0000 0000 0010*/

Operatorul de negare ~ realizeaz complementarea tuturor bi ilor unui numr (bitii de 0 se pun pe 1, iar cei de 1 se pun pe 0) Exemplu: int a = 5171; /* 0001 0100 0011 0011*/ a=~a; /*1110 1011 1100 1100*/ ntruct ntregul a este cu semn, prin complementare bitul de semn a luat valoarea 1 i s-a ob inut un numr negativ.

Programarea Calculatoarelor

Capitolul 4 No iuni de programare n limbajul C

4.3

Func ii matematice

Limbajul C ofer o foarte mare libertate programatorului, libertate nentlnit n nici un alt limbaj de programare, aceasta fiind una dintre caracteristicile care l-au fcut att de popular printre programatori. Aceast libertate se reflect, n special, n manipularea tipurilor, compilatorul limbajului C fiind mult mai pu in restrictiv n privin a folosirii tipurilor de date (nu face verificri referitoare la compatibilitatea tipurilor). Pentru a putea folosi aceste func ii ntr-un program, este necesar includerea fiierului header MATH.H, folosind directiva #include <math.h>. Cteva dintre func iile matematice folosite n limbajul C sunt urmtoarele: sin calculeaz func ia sinus a unui unghi (dat n radiani); cos calculeaz func ia cosinus a unui unghi (dat n radiani); log calculeaz logaritmul natural al unui numr; log10 calculeaz logaritmul n baza 10 al unui numr; sqrt calculeaz radicalul dintr-un numr; pow calculeaz func ia sinus a unei valori (a unui unghi); random returneaz o valoare aleatoare ntre 0 i parametrul dat 1; necesit fiierul header STDLIB.H; Nr. Crt 1 2 3 4 5 6 7 Func ia sin cos log log10 sqrt pow random Tipul returnat double double double double double double int Tipul parametrului double double double double double double, double int Observa ii valoarea se specific n radiani valoarea se specific n radiani parametru pozitiv

Tabel 4.7 Func ii matematice

M_PI constant, egal cu valoarea lui (3.14159363...); se mai poate aduga eventual M_E.

4.4

Declararea constantelor

n limbajul C, constantele se pot declara n dou moduri: folosind cuvntul cheie const; folosind directiva #define; Cuvntul cheie const Declararea unei valori constante se poate face folosind cuvntul cheie const, astfel: const int c = 14; Prin aceast declarare, variabila c ia valoarea 14 i NU i se mai poate modifica aceast valoare. O variabil declarat folosind const nu se poate folosi pentru precizarea lungimii unui ir. Directiva #define Directiva define este o directiv preprocesor, utilizat pentru a face un program mai uor de realizat/parcurs.

Programarea Calculatoarelor

Capitolul 4 No iuni de programare n limbajul C

Declararea unei directive preprocesor ncepe cu simbolul # i nu se terminat cu ';'. Ea poate aprea oriunde ntr-un program, dar afecteaz numai liniile care urmeaz declarrii ei. n mod uzual, directivele preprocesor sunt scrise la nceputul programului. n general, directivele preprocesor sunt scrise cu majuscule. Considerm urmtoarele exemple: #define #define #define #define #define #define TRUE FALSE NULL AND OR EQUALS 1 0 0 & | ==

gata = TRUE; Directivele preprocesor sunt prelucrate de ctre compilator nainte de compilarea programului. Secven a este urmtoarea: se proceseaz directivele, apoi simbolurile ce apar n cadrul programului sunt nlocuite cu valoarea lor, iar ulterior programul este compilat. Avantajele folosirii directivei #define lizibilitate mrit a programului - citirea si n elegerea rapid a fiierului surs; schimbrile ulterioare ale unor valori constante se pot face foarte uor; Exemplu: modificarea valorii lui LIMIT de la 100 la 10.000 se face prin nlocuirea liniei: #define LIMIT 100 cu linia: #define LIMIT

10000

Daca nu s-ar fi folosit acest mod de definire a constantei LIMIT, atunci ar fi trebuit sa se modifice peste tot in program 100 cu 10000. Macroinstruc iuni Identificatorul definit prin #define poate fi substituit cu o instruc iune. Exemplu: # define afiseaza(a) printf ("%.2f \n",a) int main (void) { float b = 3.12; afiseaza (b); return 0; } n acest program preprocesorul va nlocui expresia afiseaza (b) cu printf ("%.2f \n",n1); De asemenea, #define poate fi folosit pentru a declara constante simbolice. # define RAD2 1.41

Programarea Calculatoarelor

Capitolul 4 No iuni de programare n limbajul C

float x; ... x = RAD2 * 15; ... Ulterior, n program, nu se pot atribui valori constantelor simbolice.

4.5

Func iile printf () i scanf ()

4.5.1 Functia printf()


int printf ( char *format, arg1, arg2, ...); Func ia printf afiseaz pe ecran valorile din lista de argumente, conform formatului specificat. irul format poate con ine caractere ordinare, care se vor afia ca atare, i descriptori de format prefixati de caracterul %. Un descriptor de format poate con ine n ordine urmtoarele: un semn minus care indic alinierea la stinga n cadrul formatului a valorii afiate; un numr care specific lungimea minim a cmpului de afiare; un punct care separ lungimea cmpului de afiare de precizia de afiare (de ex. numrul de zecimale pentru valorile reale); Exemplu: int nr1=3,nr2=4; printf("%-5d+%5d=%d",nr1,nr2,nr1+nr2); n exemplul de mai sus nr1 i nr2 se vor afia pe 5 spa ii, nr1 va fi aliniat la stnga iar nr2 va fi aliniat la dreapta. Exemplu: float r=1.12345; printf(%.3f,r); n exemplul de mai sus r va fi afiat cu 3 zecimale. Cei mai uzuali descriptori de format pot fi vizualiza i n tabelul 4.8.

4.5.2 Functia scanf()


int scanf (char *format, adr1, adr2,...); Func ia scanf citete date de la tastatur, conform formatului, i nscrie valorile citite la adresele specificate. Primul su argument este un ir de control care con ine formatele corespunztoare interpretrii irurilor de intrare. Urmtoarele argumente sunt adresele variabilelor. Operatorul & returneaz adresa memoriei unei variabile. Exemplu: scanf("%d", &x); Formatul %d implic interpretarea caracterelor citite ca un ntreg zecimal, urmat de memorarea valorii variabilei la adresa precizat prin &x. Exemplu: adunarea a dou numere reale, citite de la tastatur: #include <stdio.h> int main (void) { float a, b, c;

Programarea Calculatoarelor

Capitolul 4 No iuni de programare n limbajul C

printf (Introduceti primul nr: ); scanf (%f,&a); printf (Introduceti cel de-al doilea nr: ); scanf (%f,&b); c = a + b; printf ("Suma celor doua numere este %f ", c); return 0; } Descriptorii de format cei mai utilizati sunt surprini n tabelul urmtor: Tip Descriptor fromat printf Descriptor format scanf char %c %c int %d sau %i %d sau %i unsigned int %u %u long %ld %ld sau %D unsigned long %lu %lu sau %U float %f %f double %lf %lf
Tabel 4.8 Descriptori de format

Citirea mai multor variabile n aceeai func ie se realizeaz astfel: scanf ("%d %d", &a, &b);

4.6
1. 2. 3. 4. 5.

Probleme propuse

S se scrie un program care citete de la tastatur lungimile laturilor unui triunghi i afieaz aria acestuia, calculat cu formula lui Heron. S se scrie un program care s citeasc un octet n baza 2 i s-l afieze n baza 10. Realiza i un program care s citeasc un numr pe un octet i s-l afieze n baza 2 (utiliznd AND i deplasarea la dreapta). S se scrie un program care seteaza n bi i ncepnd cu pozi ia p ai unui ntreg citit de la tastatur. ntregul va fi afiat n binar nainte de setarea bi ilor i dup ce acetia au fost seta i. S se scrie un program care inverseaz octe ii unui ntreg fr semn citit de la tastatur. ntregul va fi afiat n binar att nainte de inversare ct i dup inversare.

4.7
1. 2.

ntrebri recapitulative

3.

Care sunt principalii operatori matematici folosi i n limbajul C? Dar operatori logici? Pentru ce sunt folosi i operatorii la nivel de bit? Care este scopul folosirii directivei #define?