Sunteți pe pagina 1din 7

Laborator 4-5 Variabile si tipuri de date de baza

Variabile
Un aspect fundamental pentru programele ce urmeaza a fi dezvoltate este utilizarea
variabilelor. O variabila poate fi privita ca o locatie de memorie folosita pentru stocarea unei
valori si este caracterizata prin:
nume: acesta este asociat adresei locatiei de memorie. Caracterele ce formeaza
numele pot fi : litere, cifre, respectiv caracterul _ (numit underline). Exista o serie de
restrictii in alegerea numelui: primul caracter trebuie sa fie o litera; cuvinte cheie de
genul : if, else, int , float etc. sunt rezervate si nu pot fi folosite ca nume de variabile.
Exemple de greseli in alegerea numelor:
2suma - incepe cu cifra
multiplu+comun contine caracterul + (rezervat pt operatorul de adunare)
while este cuvant rezervat (numele unei instructiuni)
divizor comun - contine spatiu
ATENTIE! (in principal pentru studentii obisnuiti cu limbajul Pascal) C este "case sensitive":
va lua in considerare diferentele dintre literele mari si cele mici folosite in cadrul numelor
identificatorilor.
Compilatorul face distinctie intre:
Mediaaritmetica
mediaAritmetica
MediaAritmetica
MEDIAARITMETICA
media_aritmetica
Se recomanda ca variabilelor sa li se asocieze nume sugestive pentru contextul/scopul in
care vor fi folosite.
valoare: informatia stocata
tip: determina multimea de valori pe care le poate lua variabila precum si operatiile
ce se pot aplica acestor valori. Interpretarea informatiei stocate este data de tipul
specificat.
Toate variabilele trebuie declarate inainte de a fi folosite. In cadrul unei declaratii se va
specifica numele si tipul variabilei. Nu este necesara declararea independenta a
variabilelor ce au acelasi tip, fiind suficienta specificarea unica a tipului si apoi a listei de
variabile (delimitate prin caracterul ',').
Exemple de declaratii:
int i;
/*am declarat o variabila de tip intreg ce are numele i */
char s,t,t23; /*am declarat trei variabile de tip caracter ce au numele s, t, respectiv t23 */
Observatii:
La declararea variabilelor nu se face initializarea implicita a acestora (compilatorul nu le da
automat valoarea 0), ci acestea vor avea valorile arbitrare care se afla in locatiile de

memorie pe care le-au primit in urma declararii. Exceptie fac variabilele globale declarate
in afara oricarei functii care sunt initializate implicit cu valoarea 0.
Volosirea unei variabile neinitializate (implicit sau explicit) in partea dreapta a unei expresii
trebuie evitata deoarece va duce la o functionare eronata, impredictibila a programului.

Tipuri de date
Tipuri de date intregi

char: suficient pentru a ne referi la un caracter membru al setului de caractere de


baza. Fiecarui caracter ii corespunde un numar intreg ce reprezinta codul acestuia
(codul ASCII). In cazul in care acest caracter apartine "setului de baza", valoarea
numerica asociata este pozitiva (uzual, domeniul de valori al tipului char este
cuprins intre -128 (-2^7) si 127 ( 2^7-1), un caracter ocupand in memorie 1 octet).
Exemplu: A are codul 65, B - 66
int: numere intregi cu domeniul de valori intre -32768 (-2^15) si +32767 (+2^15-1).
short int, long int, long long int : numere intregi; aceste tipuri difera prin lungimea
reprezentarii si implicit domeniul de valori corespunzator lor.
Tipul int poate primi ca prefix calificatori care specifica:
dimensiunea: short, long (eventual long long)
semnul: signed (implicit, in caz de omisiune), unsigned
Cele doua se pot combina, iar int poate fi omis: (ex. unsigned short in loc de unsigned
short int)
signed char: numere intregi; un element avand acest tip ocupa in memorie acelasi spatiu
ca si un caracter obisnuit. Are obligatoriu semn.
unsigned char: numere intregi cu valori intre 0 si 255 (2^8-1).
Standardul prevede urmatoarele limite:
int, short: >= 2 octeti, minim [2^15, 2^15 1] = [-32768, 32767]
long: >= 4 octeti, acopera minim [2^31 (-2147483648) , 2^31 1]
long long: 8 octeti, acopera minim [2^63, 2^63 1]
unsigned pastreaza dimensiunea; ntre 0 si 2^8b 1 (b = nr. octeti; ex pt unsigned int:
[0,2^(2*8)-1] )
sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
Constante
definite
n
<limits.h>
(valori
minime
cerute
de
standard)
SHRT_MIN,
INT_MIN
-32767
SHRT_MAX,
INT_MAX
32768
LONG_MIN
-2147483647
LONG_MAX
2147483647
USHRT_MAX,
UINT_MAX
65535
ULONG_MAX
4294967295
Pentru mai multe informatii specifice compilatorului pe care il utilizati este obligatoriu sa
consultati documentatia (help-ul, paginile de manual) ce-l insotesc.
Constante intregi : sunt reprezentate in functie baza de numeratie:

zecimal : secventa de cifre (0-9) incepand cu o cifra diferita de 0


exemple: 234, 65443, 4, 53
octal : incep cu 0 (prefix), urmand apoi o secventa de cifre (0-7)
exemple: 0234, 05435, 05
hexazecimal : incep cu prefixul "0x" sau "0X" si se continua cu o secventa de cifre
(0-9) si litere (a,b,c,d,e,f sau A,B,C,D,E,F)
exemple: 0x34ab54, 0x100, 0xf
Acestea pot fi urmate de unul dintre sufixele : "U","u" - pentru valori unsigned, "l","L" pentru date long , respectiv "ll","LL" pentru long long int
Exemple: 20005; 2562011140L; 0xafaf; 0Xcefel; 037
Constante caracter : - sunt date de o secventa de unul sau mai multe caractere cuprinse
intre apostroafe - ex: 'H'. Valoarea constantei caracter este data de numarul intreg ce
corespunde caracterului definit de secventa respectiva (in cazul codului ASCII caracterului 'A' ii corespunde numarul 65 , 0x41 in hexa). Constantele caracter pot fi tratate
ca orice numar intreg si pot fi cuprinse in constructii specifice intregilor. Nu toate
caracterele reprezentabile pot fi cuprinse direct intre apostroafe, acestea fiind inlocuite de
secvente de caractere (formate, in principal din caracterul respectiv precedat de
"backslash"):
- ghilimele : \" - apostrof : \' - backslash : \\ - semnul intrebarii: \?
Pe langa acestea exista o serie de secvente ce corespund caracterelor invizibile:
\a : alerta - produce un semnal sonor(uzual) sau vizual de avertizare.
\b : backspace - deplaseaza cursorul inapoi cu o pozitie
\n : new line - deplaseza cursorul la inceputul liniei urmatoare.
\r : carriage return - aduce cursorul pe prima pozitie a liniei curente.
\f : form feed - trece de la pozitia activa la pozitia de start a urmatoarei pagini
\t : tabulator orizontal - sare la urmatoarea pozitie a tabulatorului(orizontal)
\v : tabulator vertical - sare la urmatoarea pozitie a tabulatorului(vertical)
(Efectele produse sunt specifice unui sistem de tip consola / terminal)
Prin secvente de tipul \145 (145 - in octal) sau \x41 (41 in hexazecimal) se pot specifica
numerele intregi ce vor determina caracterul (unul singur) asociat constantei.
Toate secventele prezentate anterior vor fi cuprinse intre apostroafe!
Exemple: 'A', '\t', '\,'\x42'
Citirea si afisarea tipurilor intregi si a caracterelor
Pentru numerele intregi se foloseste:
%d, %i numere intregi in baza 10
%o pt baza 8, intregi fara semn
%x,%X pt baza 16, intregi fara semn
%ld pt long int
%hd pt short int
%c pt caractere
Pentru detalii consultati help-ul.
Exemple:
scanf(%d,&i);
/* pentru citirea unei valori de tip intreg fara semn in baza zece*/
scanf(%c,&g); /*pt citirea unui caracter*/

Observatie importanta: semnul & (numit ampersant) aplicat unei variabile reprezinta
operatorul de referentiere si returneaza adresa zonei de memorie a acelei variabile.
La apelarea functiei scanf este obligatorie utilizarea adreselor variabilelor, nu a
numelor (valorilor) acestora. Functia scanf trebuie sa primeasca informatii despre
UNDE in memorie sa depoziteze valoarea pe care a citit-o de la intrare.
printf(%d,i) /*pentru afisarea valorii unei variabile intregi*/
printf(%c,l) /*pentru afisarea valorii unei variabile de tip caracter*/
Observatie: functia printf nu are nevoie de adresa variabilei ce va fi afisare, valoarea
acesteia fiind suficienta.
Tipul intreg implicit este int.

Tipuri de date reale


float , double, long double : se refera la numere reale (floating point), diferind precizia
reprezentarii. Setul de valori al tipului float este un subset al double, care la randul sau este
un subset al long double.
Trebuie avut in vedere ca fiind data reprezentarea interna pe un numar finit de biti si
numarul infinit de numere reale continute intr-un interval, numerele reale nu vor fi
reprezentate toate exact, mai exact marea lor majoritate vor fi reprezentate cu aproximatie.
Ganditi-va asa: dorim sa reprezentam numere reale in calculator pe un anumit numar de
biti n. Pe n biti nu se pot reprezenta decat 2^n valori. Deci cardinalul multimii acesteia este
2^n. Acum sa zicem ca dorim sa reprezentam numere reale din intervalul [-h,h]. Cardinalul
acestei multimi este infinit (pentru h pozitiv, nenul). Teoretic, avem nevoie de o mapare
bijectiva intre elementele celor doua multimi, ceea ce este imposibil deoarece multimile au
cardinal diferit si nu putem asigura injectivitatea acestei mapari. Ce putem face pentru a
rezolva practic aceasta problema este sa impartim intervalul [-h,h] in 2^n subintervale de
dimensiuni egale si sa mapam numerele reale din fiecare interval unei valori din multimea
tipului de date. Explicatia aceasta este neexacta si se doreste a contribui doar la
intelegerea problemelor ce apar la reprezentarea numerelor reale.
Limitele numerice ale tipurilor se regasesc in fisierul header "float.h" si sunt specifice
fiecarui mediu de programare.
Informatii corecte privind reprezentarea tipurilor regasiti in documentatia ISO/IEC 9899.
De obicei, float este reprezentat pe 32 de biti, double pe 64 si long double pe 80.
Tipul real implicit este double.
Constante reale : - au o parte "seminficativa" , urmata (nu neaparat) de un exponent si un
sufix. Portiunea semnificativa poate fi alcatuita din partea intreaga si eventual din
caracterul "punct":"." insotit de partea fractionara. Exponentul este format dintr-un caracter
din setul "e","E","p","P" si o valoare intreaga ce indica puterea (putere a lui 10 - in cazul
constantelor
definite
in
zecimal,
respectiv
2
in
hexazecimal).
Acestea pot fi urmate de unul dintre sufixele : "F","f" - pentru constante float (implicit sunt
double) sau "l" / "L" pentru long double.

Ex: 23.45; 0.2f; 2345e-2; .251


Pentru
o
definitie
riguroasa,

consultati

documentatia

ISO/IEC

9899.

Observatie: este bine sa verificati inainte de efectuarea unei impartiri daca impartitorul nu
are valoarea 0. Daca nu veti face asta si impartitorul are valoarea 0, programul se va bloca
sau va avea o comportare nedeterminista.
Nu comparati numerele reale direct cu operatorul ==. Intrucat precizam ca reprezentarea
lor nu este exacta, nu verificati niciodata daca a==b, ci daca |a-b|<epsilon, unde epsilon
este un numar real mic.

Intructiunea if
if (conditie) instructiune1; else instructiune2;
Functionare: daca valoarea de adevar a conditiei este adevarata (adica diferita de 0),
atunci se executa intructiune1, altfel se executa intructiune2.
Conditia e obligatoriu sa fie pusa intre paranteze rotunde.
Atat instructiune1, cat si intructiune2 pot sa lipseasca. Exemple:
if(conditite); /*este ok, dar utilitatea este redusa*/
if(conditie)intructiune1;
if(conditie);else intructiune2;
Daca instuctiune1 sau intructiune2 contin mai mult de o instructiune, atunci acestea vor fi
incadrate intre acolade:
if(conditie)
{

}
else
{

}
Observatie importanta: operatorul = semnifica atribuire si nu trebuie confundat cu
operatorul ==. Pentru verificarea egalitatii se foloseste operatorul ==, iar pentru verificarea
diferentei se foloseste operatorul != (diferit).
Folosind aceasta intructiune puteti face diverse validari ale datelor de intrare, puteti verifica
impartitorul unei impartiri, puteti compara valori de variabile etc.
Atentie! La imbricarea (cascadarea) if-urilor fiecare ramura else apartine de cel mai
apropiat if anterior ei. Exemplu:
if(a>2)
if(b<6)y=2;
else y=9;

Contrar modului in care au fost aliniate instructiunile, ramura else apartine de al doilea if,
nu de primul. Daca dorim sa apartina de primul if, atunci trebuie sa punem un else vid
celui de-al doilea if.
if(a>2)
if(b<6)y=2;else;
else y=9;
Aplicatii:
1. Scrieti un program ce citeste de la tastatura 3 numere intregi si afiseaza valoarea
celui mai mare numar citit (doar aceasta).
2. Sa se realizeze un program care citeste de la tastaura coeficientii a,b,c (float) ai
ecuatiei de gradul II , calculeaza si tipareste numarul si valorile solutiilor (toate cazurile inclusiv solutii complexe).
Informatii utile:
- pentru citirea unei valori float de la tastatura puteti folosi apeluri de forma
scanf("%f",&a);
- calculul radicalului de ordinul 2 se face prin apelul functiei sqrt definita in fisierul
"math.h". =>la inceputul programului va trebui inclusa si linia: #include<math.h>.
Tipul valorilor calculate de sqrt este double.
#include <math.h>
...
double d;
float f;
d=4.0;
f=(float)sqrt(d);
...
- sunt valabile constructii si expresii de tipul:
...
int a,b; a=5; b=7;
a>b?printf("a mai mare ca b\n"):printf("a mai mic sau egal cu b\n"); // se afiseaza textul "a
mai mare ca b" daca a>b, respectiv // "a mai mic sau egal cu b" in caz contrar.
...
3. Se citesc coordonatele a doua puncte din plan :P1(x1,y1) ; P2(x2,y2) ce determina un
dreptunghi (colturile opuse). Se citesc coordonatele inca unui punct din plan P(x,y). Sa se
afiseze daca acesta este interior sau exterior dreptunghiului.

4. Folosind operatorul sizeof (consultati documentatia), afisati dimensiunile reprezentarilor


cariabilelor de tip: char, int, long, unsigned char, signed char, unsigned int, unsiged long,
float, double, long double.
5. Declarati o variabila de tip unsigned char si atribuiti-i valoarea 255. Apoi incrementati
valoarea acestei variabile si afisati valoarea ei. Explicati rezultatul.
6. Declarati o variabila de tip unsigned int si initializati-o cu 0. Scadeti 5 din ea si apoi
afisati rezultatul. Explicati!
7. Declarati trei variabile, cate una din fiecare tip de numere reale. Atribuiti-le pe rand
valorile 1, 1.4, 2, 15. Afisati de fiecare data rezultatul. Apoi adaugati la fiecare valoarea
0.000000001. Afisati din nou rezultatele. Explicati!

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