3. Tipuri de date • •
Câteva concepte teoretice: data, tipul de dată Tipul de dată combină: 1. 2.
•
Din pc. de vedere fizic: 1. 2.
•
Reprezentare nativă (VF, VM) Reprezentare “prin convenţie”
Din pc. de vedere logic: 1. 2.
•
Conceptul fizic (reprezentarea internă) Conceptul logic (nevoia prelucrării)
Simple (probleme reprezentării interne) Structurate (probleme liniarizării)
Din punct de vedere al adresării: statice, dinamice
Tipuri de date Pascal
C
Da
Da
reale (diverse)
Da
Da
caracter
Da
Da1
enumerativ
Da
Da
boolean
Da
Nu
masiv
Da
Da
şir
Da
Nu
articol
Da
Da
fişier
Da
Da
Da
DA2
întregi (diverse) Simple STATICE
Structurate
DINAMICE
simple+structurate
TOATE DATELE TREBUIE DECLARATE INAINTE DE FOLOSIRE (A)
O importantă caracteristică C: datele reprezentate prin convenţie (caracter, boolean, enumerativ) au doar interpretare numerică (sunt numere) LIMBAJUL C ESTE MAI APROAPE DE MAŞINĂ DECÂT ALTELE
De exemplu: • Tipul char poate memora caractere, dar el este un întreg cu valori intre diverse valori; • Tipul BOOLEAN nu există, dar expresiile logice au valorile 1 (adevărat); 0 (fals); • Tipul enumerativ este un întreg cu valori între diverse valori.
NU TE PANICA ! LUCRURILE SUNT SIMPLE. TE VEI CONVINGE.
3.1. TIPURILE SIMPLE DE DATE •
Întregi native: 1. Aritmetice (fără semn): au prefixul unsigned: char, int, long 2. Algebrice (cu semn): au prefixul signed, care este şi atribut implicit (poate lipsi): char, int, long
•
Reale native: simplă, dublă şi extra precizie
Tipuri de date în C Grupa de dată
INTREG
REAL
Tipul
Lungi- Domeniul de mea valori/Magnitudine (B)
Observaţii
unsigned char
1
0..255 (0..28-1)
Fără semn
char
1
-128..127 (-27..27-1)
Cu semn
unsigned int
2
0..65535
Fără semn
[short] [int]
2
-32768..32767
Cu semn
unsigned long
4
0..232-1
Fără semn
long [int]
4
-231..231-1
Cu semn
enum
2
0..216-1
Fără semn
float
4
3.4*10-38..3.4*1038
Simplă
double
8
1.7*10-308.. 1.7*10308
Dublă
long double
10
3.4*10-4932.. 3.4*104932
Extra
Reprezentare internă
VF
VM
Corespondenţa P - C Tip
Reprezentare Aritmetică
ÎNTREG Algebrică
REAL
Lungime
C
P
1
unsigned char
BYTE
2
unsigned int
WORD
4
unsigned long
-
1
char
SHORTINT
2
int
INTEGER
4
long
LONGINT
4
float
SINGLE
8
double
DOUBLE
10
long double
EXTENDED
CONSIDERENTE PRIVIND UNELE TIPURI SIMPLE DE DATE • Tipul caracter a)Tipul char memorează valori numerice (se comporta ca shortint din Pascal); b)Tipul unsigned char: i) memorează valori numerice (se comportă ca byte din Pascal); ii)memorează caractere (se comportă ca char din Pascal); Exemple: [unsigned] char a,b; ……………………. a=100; /* corect */ b=’Q’; /* corect */ b=81; /* corect, echivalent cu precedentul */ a=a+b; /* corect, prin context, se lucrează numeric */
• Calificatori ai tipului int short int short int long int long signed int int signed long long
• Tipul enumerativ enum identificator {lista_valori_simbolice} !! ESTE TIP Ex.enum culoare {rosu,verde,galben} (valorile 0,1,2) Variabila: culoare x=rosu; Se accepta şi atribuiri de valori : Ex.enum culoare {rosu=5,verde,galben=10} (valorile 5,6,10)
ÎN C, LUNGIMILE NU MAI SUNT CATEGORICE: DIFERĂ DE LA O MAŞINĂ LA ALTA ŞI DE LA O IMPLEMENTARE LA ALTA MODUL DE DECLARARE A VARIABILELOR: tip lista_variabile Pascal: lista_variabile:tip DEFINIREA TIPULUI DE DATA AL UTILIZATORULUI: typedef nume_utilizator Pascal: TYPE nume_utilizator=orice_tip
Constante •
Definiţie: sunt valori precizate la momentul compilării şi nu se modifică la execuţie.
•
Constantele pot fi: A. Literali B. Constante simbolice
A. LITERALI •
Literali întregi: se exprimă în zecimal, octal (prefixul 0) şi hexazecimal (prefixul 0x). În funcţie de mărimea lor se asociază un tip întreg.
Exemplu ZECIMAL 0-32767
OCTAL 00-077777
HEXAZECIMAL 0x0000-0x7fff
TIP unsigned int
Dacă se doreşte ca un literal să aibă un tip explicit (long) se poate folosi sufixul L/l. Dacă se doreşte ca un literal să fie fără semn se poate folosi sufixul U/u. L şi U pot fi folosiţi împreună. Vezi necesitatea corespondenţei parametrilor funcţiilor ! • Literali reali: se exprimă matematic (cu punct) sau ştiinţific (cu E).
• Literali caracter: ‘c’. • Literali şiruri de caractere: “text”
B. Constante simbolice (numite):
# define nume valoare Ex. #define PI 3.14159 C. Constante obiect (nu există în Pascal): const tip nume = valoare Ex. const int a=7; /* vezi deosebirea faţă de int a=7;*/
3.2. DATE STRUCTURATE 1.MASIVE • Declarare: nume[d1][d2]…, unde d1,d2 sunt constante care indică numărul de elemente de pe fiecare dimensiune. Sintaxa diferită de Pascal ! Exemple: int b [10]; float a [10][20];
/* vector cu 10 componente */ /* matrice cu 10 linii şi 20 de coloane */
• Liniarizarea; “în ordinea liniilor” (lexicografic) (A)
• Iniţializarea: int b [10] ={2,3,0,5,6,7,3,6,8,5} /* numărul constantelor = dim */ (iniţializarea se face în ordinea liniarizării) • Referirea: globală; Dimensiune completă: a[2] - linia 3 a matricei a; Un element: b[3], b[j], a[3][5], a[s][p].
• În C, primul indice de pe fiecare dimensiune este 0.
Exemplu: float x[100]; ……………. x[0]=5.987; /* primul element */ x[99]=7.4539; /*ultimul element*/
OBS.: Nu se face control de indici: a[12][20] este corect.
ATENŢIE LA CONTROLUL CORECT AL INDICELUI. Se acceptă oricâte dimensiuni.
2. TIPUL ARTICOL (STRUCT) – încapsulează unul sau mai multe câmpuri. Este un tip de date neomogene. • Declararea tipului: struct nume_tip_art { cimp_1; cimp_2; }; • Declararea variabilei: nume_tip_art variabila_articol; • Referirea câmputilor (prin calificare): variabila_articol.cimp
Exemplu: #include<string.h> main() { struct articol { char nume[40]; char adresa[20]; int an; int luna; int zi; }; [struct] articol pers; /*cuvântul struct poate lipsi în turbo C*/ ……………………………… strcpy(pers.nume,”Popescu Ion”); strcpy(pers.adresa, “Bucuresti, Pta. Romana 77”); pers.an = 1979; pers.luna = 3; pers.zi = 15; }
În ANSI C se putea obţine acelaşi rezultat sintactic scriind: typedef struct articol { cimpurile } articol pers;
Pot fi construite structuri complexe: articol – articol; articol – masiv; masiv – articol etc.
Exemplul 1 (articol - articol): [typedef] struct art_1 { int an; int luna; int zi; }; [typedef] struct articol { char nume[40]; char adresa[20]; art_1 data_nasterii; }; [struct] articol pers; /*struct poate lipsi în turbo C*/ …………………………………….. strcpy(pers.nume,”Popescu Ion”); strcpy(pers.adresa, “Bucuresti, Pta. Romana 77”); pers.data_nasterii.an = 1979; pers.data_nasterii.luna = 3; pers.data_nasterii.zi = 15;
Exemplul 2 (masiv - articol): Struct articol { Int cant; Float pret }; Articol x[200]; ….. X[7].cant = 50; X[7].pret = 100000;
X[0] cant pret
X[1] cant pret
X[2] cant pret
… …
X[199] cant pret
Exemplul 3 (articol - masiv): struct articol { int cant[30];float pret[30]; }; ……… articol vinz; …………. vinz.cant[7] = 50; vinz.pret[7] = 100000; cant 0 1
2
29
pret 0 1
2
29
3. Lucrul cu şiruri de caractere Nu există un tip special ŞIR, dar se pot prelucra şiruri!
• Şirurile în C se scriu între ghilimele: Exemplu: “Limbajul C” Şirurile scrise pe mai multe rânduri se concatenează automat: unsigned char a[11] = “Limbajul ” “ C”; Reprezentarea internă a şirurilor:caractere încheiate cu 0x00 (caracterul null): L i
m b a j
u l
C 0x00
• Cum se pot memora şirurile? ÎN TABELE DE CARACTERE. (vectori de tip char sau alte tipuri întregi) Exemplul 1: unsigned char c[15]=“Limbajul C”; /* aceasta este iniţializare*/ Spaţiu nefolosit L
i
m b
a
j
u
l
C 0x00
Început Exemplul 2: char d[]=“este”;/*Se rezervă exact cât trebuie (4+1 elemente)*/
Exemplul 3: unsigned char x[4]= “ABC”; este echivalent cu unsigned char x [4]={‘A’,’B’,’C’,0x00}; Exemple eronate a) char c[3]=“Limbajul C”; b) char c[14]; c=“Limbajul C”; /* Nu se pot face atribuiri*/
NU SE POATE FACE ATRIBUIRE LA MOMENTUL EXECUŢIEI (ATRIBUIRE DINAMICĂ) “Atribuirea” din ex. 3 este făcută la compilare (compilatorul are incluse reguli de atribuire; de fapt, o iniţializare)
NU EXISTĂ OPERAŢII CU ŞIRURI (NU EXISTĂ TIPUL SIR)
• CUM SE PRELUCREAZĂ ŞIRURILE ÎN C? Cu funcţii speciale: SE GĂSESC ÎN FIŞIERUL string.h ( #include<string.h> ) NUME PARAMETRI SEMNIFICAŢIE OBSERVAŢII ŞI EXEMPLE
strcpy
strcat
(destinaţie, sursă)
(sir1, sir2)
Copiere (rezultat şir)
Concatenare (rezultat şir)
Se poate folosi în locul atribuirii de la momentul execuţiei. EX: strcpy(a, “ok”) EX:strcat (“ok”,”.”)
NUME PARAMETRI SEMNIFICAŢIE OBSERVAŢII ŞI EXEMPLE strcmp
(sir1, sir2)
Comparare (rezultat întreg)
Se returnează: 1:sir1>sir2 0:sir1=sir2 -1:sir1<sir2 EX: If(strcmp(a,b)>0) /*a>b*/; else /*a
strlen
(sir)
Lungime şir (rezultat întreg)
Se returnează lungimea efectivă a şirului (până la terminatorul 0x00)
Există şi alte funcţii (inclusiv de I/E pentru şiruri)