Sunteți pe pagina 1din 8

Capitolul 4 Noiuni de programare n limbajul C

Obiectiv: familiarizarea cu noiunile baz ale limbajului C (tipuri, operatori, funcii).


Activiti:
- Trecerea n revist a tipurilor de date fundamentale; utilizarea modificatorilor;
- Prezentarea operatorilor aritmetici, logici, relaionali i la nivel de bit;
- Prezentarea funciilor matematice (sin, cos, log, log10, sqrt, pow, M_PI, random);
- Declararea i folosirea constantelor (const, define);
- Afiarea i citirea de la tastatur - folosind funciile 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 bii
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 (mulimea 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
situaii. Modificatorii limbajului C sunt:
signed
unsigned
long
short
Acesti modificatori pot fi aplicai 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 declaraia
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 Noiuni de programare n limbajul C

Diferena 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 conine informaie util.

4.2

Operatori

4.2.1 Operatori aritmetici


Operatorii aritmetici folosii n limbajul C sunt:
+ adunarea a dou numere;
- scderea a dou numere;
* nmulirea a dou numere;
/ mprirea a dou numere (rezultatul mpririi pentru numere reale, ctul mpririi
pentru numere ntregi);
% modulo (restul mpririi 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 folosii pentru mrirea respectiv micorarea
unei valori cu o unitate.
Sunt de forma:
v++
incrementare;
--v
decrementare;
Se pot folosi i instruciuni 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 relaionali i logici


Termenul relaional se refer la relaiile care se pot stabilii ntre diverse valori. Termenul
logic se refer la felul n care se pot lega relaiile existente. ntruct operatorii relaionali i logici sunt
deseori folosii mpreun, i vom trata mpreun.
Ideea de adevrat sau fals st la baza conceptelor de operatori logici i relaionali. n C adevrat
nseamn orice valoare deferit de 0, iar fals este 0. Expresiile care folosesc operatori relaionali 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 Noiuni de programare n limbajul C

<=
==
!=

Mai mic sau Egal


Egal
Diferit
Tabel 4.3 Operatori relaionali

Operator
&&
||
!

Actiune
SI
SAU
NU
Tabel 4.4 Operatori logici

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 dispoziie ase operatori la nivel de bit, furniznd astfel faciliti 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 obinute sunt, de asemenea, ntregi. Fa de ceilali operatori ai limbajului,
acetia opereaz asupra fiecrui bit din reprezentarea intern a operanzilor, tratndu-l independent de
valorile celorlali bii.
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

ntreg B

0
0
1
1

0
1
0
1

&
0
0
0
1

Rezultatul
^
0
1
1
0

|
0
1
1
1

Tabel 4.6 Operatori pe bii

Indiferent de scopul n care sunt utilizai operatorii, maniera n care sunt folosii este n general
aceeai. n cele ce urmeaz, se vor descrie pe scurt principiile de baz ale utilizrii lor.
Observaie: Operatorii la nivel de bit nu modific valoarea operanzilor (se comport ca i
operatorii aritmetici obinuii), astfel o operaie 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 Noiuni 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 operaie
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 anumii bii dintr-un numr:
Exemplu:
n = n & 177
va pune pe 0 biii din n corespunztori valorilor zero din reprezentarea binar a numrului 177 (adic
10110001), biii cu valoarea 1 rmnnd nemodificai.
Operatorii de deplasare (<< i >>) realizeaz deplasarea biilor din operandul stng cu attea
poziii cte sunt indicate de operandul drept.
Deplasarea la stnga (<<) completeaz la dreapta cu 0 (biii 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 (>>), biii din dreapta se pierd, iar n stnga se introduc bii de 0,
n caz c numrul era de tip fr semn (unsigned) sau bii 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;

/* 1111 1111 1110 1110*/


/* 1111 1111 1111 1110*/

int b=18;
b=b>>3;

/* 0000 0000 0001 0010*/


/* 0000 0000 0000 0010*/

Operatorul de negare ~ realizeaz complementarea tuturor biilor 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 obinut
un numr negativ.

Programarea Calculatoarelor

4.3

Capitolul 4 Noiuni de programare n limbajul C

Funcii 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 puin restrictiv n privina folosirii tipurilor de date (nu face verificri referitoare la
compatibilitatea tipurilor).
Pentru a putea folosi aceste funcii ntr-un program, este necesar includerea fiierului header
MATH.H, folosind directiva #include <math.h>.
Cteva dintre funciile matematice folosite n limbajul C sunt urmtoarele:
sin
calculeaz funcia sinus a unui unghi (dat n radiani);
cos
calculeaz funcia 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 funcia 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

sin

Tipul
returnat
double

Tipul
parametrului
double

cos

double

double

3
4
5
6
7

log
log10
sqrt
pow
random

double
double
double
double
int

double
double
double
double, double
int

Funcia

Observaii
valoarea se specific n
radiani
valoarea se specific n
radiani
parametru pozitiv

Tabel 4.7 Funcii matematice

4.4

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

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 Noiuni 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.
Secvena 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 nelegerea 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.
Macroinstruciuni
Identificatorul definit prin #define poate fi substituit cu o instruciune.
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 Noiuni de programare n limbajul C

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

4.5

Funciile printf () i scanf ()

4.5.1 Functia printf()


int printf ( char *format, arg1, arg2, ...);
Funcia printf afiseaz pe ecran valorile din lista de argumente, conform formatului specificat.
irul format poate conine caractere ordinare, care se vor afia ca atare, i descriptori de format
prefixati de caracterul %. Un descriptor de format poate conine 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 spaii, 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 vizualizai n tabelul 4.8.

4.5.2 Functia scanf()


int scanf (char *format, adr1, adr2,...);
Funcia scanf citete date de la tastatur, conform formatului, i nscrie valorile citite la adresele
specificate. Primul su argument este un ir de control care conine 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 Noiuni 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 funcie se realizeaz astfel:


scanf ("%d %d", &a, &b);

4.6
1.
2.
3.
4.
5.

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.
Realizai 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 bii ncepnd cu poziia p ai unui ntreg citit de la
tastatur. ntregul va fi afiat n binar nainte de setarea biilor i dup ce acetia au fost setai.
S se scrie un program care inverseaz octeii 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.

3.

Probleme propuse

ntrebri recapitulative

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

S-ar putea să vă placă și