Tipuri de date
Scopul acestui laborator este prezentarea noțiunilor de bază legate de bazele de numerație,
formatele de reprezentare, variabile, operatori și funcții de intrare/ieșire. Sursa de lucru pentru acest
laborator poate fi descărcată de aici:
laborator2.cpp
1.Baze de numerație
Baza 10
Pentru a putea scrie un numar în baza 10, avem nevoie de cifre care fac parte din următorul set:
0,1,2,3,4,5,6,7,8,9. După cum este bine cunoscut, un număr în baza 10 se poate descompune după
următoarea regulă: Fie numărul 12345, atunci:
$12345 = 1*10^4+2*10^3+3*10^2+4*10^1+5*10^0 $
Baza 2
Un număr este reprezentat în baza 2, utilizând doar două simboluri: 0 și 1. Regula de calcul este
asemănatoare cu cea a numerelor codificate în baza 10, unde fiecare simbol este corespunzător unei
puteri a lui 2.
După cum se poate observa, biții unui număr în binar corespund puterilor lui 2. Acest lucru face ca
bitul din dreapta să corespundă lui 2 la puterea 0, iar bitul din stanga lui 2 la puterea 7 (pentru tipul
de date unsigned char). Bitul din dreapta având corespondent cea mai mică putere a lui 2, va conta
cel mai putin în valoarea numărului, motiv pentru care se mai numește si LSB ( least significant bit),
iar bitul din stanga, corespunzând celei mai mari puteri a lui doi se va numi MSB ( most significant bit
).
Baza 16
Pentru a reprezenta un număr în baza 16, vom utiliza simbolurile bazei 10, la care vom adăuga
următoarele:
A -> 10
B -> 11
C -> 12
D -> 13
E -> 14
F -> 15
Cu alte cuvinte, 13 în baza 10 reprezintă D în baza 16. Vom folosi același algoritm de descompunere a
unui număr în baza 16. Conversia unui număr din baza 16 în baza 10 se realizează după următorul
exemplu:
2.Formate de reprezentare
Numere întregi
În memoria unui calculator, valorile numerice sunt salvate sub formă de unor șiruri de biți. Pentru
tipurile întregi valorile vor fi reprezentate în baza 2, iar valorile acestora pot fi convertite după cum a
fost arătat la punctele anterioare.
Chiar dacă în memorie numerele sunt stocate în baza 2 (folosind doar simbolurile
0 și 1), programatorul poate interpreta această valoare în orice bază, iar valoarea
rămâne aceeași. De exemplu, 1010 în baza 2 reprezintă numărul 10 în baza 10 și
A în baza 16 - chiar dacă este scris în alt mod, valoarea efectivă a numărului
rămâne aceeași.
Virgulă fixă
Tipurile de date întregi nu pot reprezenta decât numere naturale. Totuși, există nevoia reprezentării
unor numere fracționare ( numere cu zecimale ). Pentru a explica mai bine acest format de
reprezentare, vom studia un exemplu. Presupunem ca vrem să memorăm valoarea 2.5. Din modul de
stocare al informației pe care îl cunoaștem momentan, nu putem reprezenta un astfel de număr.
Pentru a rezolva această problemă, numărul este împărțit cu ajutorul unei virgule fixe astfel:
$b7$ $b6$ $b5$ $b4$ $b3$ $b2$ . $b1$ $b0$ (se alege
formatul 6.2)
În acest moment, cei 8 biți nu vor mai corespunde puterilor lui 2, așa cum știam, ci după cum
urmează:
Astfel, numărul 2.5 în baza 10 va fi reprezentat în formai binar ca având valoarea 000010.10.
Acest format de reprezentare este folosit pentru a putea reprezenta numere negative. Vom folosi
următorul exemplu: se dorește reprezentarea numărului -3 într-o locație de memorie de 8 biți (un
octet).
3 = 00000011
~3 = ~00000011 = 11111100
11111100 + 1 = 11111101
Virgulă mobilă
Acest format a fost creat pentru a putea reprezenta numere cu o precizie cat mai bună. Formatul în
virgulă mobilă este standardizat IEEE 754. Un număr stocat astfel în memorie va fi constituit astfel:
Semn: pentru numere pozitive este 0, iar pentru numere negative este 1
Exponent: este calculat ca un numar pe 8 biti, din care se scade din 127 sau aduna la 127, dupa caz.
Mantisa: în fața primului bit din mantisă, se află un 1 ( implicit ), după care biții sunt corespunzători
valorilor 1/2, 1/4, etc.
3.Variabile
Orice program C conține variabile sau constante de lucru. Numele variabilelor, alături de numele
funcțiilor și numele vectorilor fac parte din clasa identificatorilor. Un identificator trebuie să înceapă
cu literă sau cu underscore și trebuie sa aibă o dimensiune maximă de 32 de caractere. Denumirea
unei variabile trebuie să fie sugestivă pentru ce reprezintă acea varibilă, dar trebuie făcut un
compromis între lungimea și detaliile din denumire. Există o serie de denumiri consacrate, un bun
exemplu fiind variabilele cu numele i,j,k. Acestea sunt folosite pentru indexarea unui vector.
4.Tipuri de date
În funcție de scopul pentru care sunt folosite, datele pot avea diferite tipuri. Prin alegerea unui tip de
dată a unei variabile, de fapt alegem modul în care este reprezetată informația în memorie, spațiul de
memorie ocupat și precizia cu care poate fi reprezentate valorile dorite.
5.Funcții de intrare/ieșire
Efect:
Parametrul format este un şir de caractere care poate conţine specificatori de format şi, eventual, alte
caractere. În paramentrul format trebuie să existe câte un specificator de format pentru fiecare
expresie din lista de parametri (specificatorul 1 corespunde expresiei 1, specificatorul 2, corespunde
expresiei 2 etc.). Celelalte caractere din parametrul format vor fi afişate pe ecran în poziţiile
corespunzătoare. Un specificator de format are următoarea sintaxă:
Un specificator de format începe cu caracterul %, trebuie să conţină obligatoriu o literă care să indice
tipul expresiei corespunzătoare şi, eventual, alte elemente opţionale.
Opţional înainte de literă_tip poate să apară litera l sau L (pentru long int sau long double).
Pentru expresiile de tip real sau şir de caractere se poate specifica şi precizia prec. Pentru valorile reale, aceasta indică
numărul de cifre de la partea zecimală care vor fi afişate. Pentru şiruri de caractere, precizia indică numărul de
caractere din şir care se afişează.
Exemplu:
#include <stdio.h>
void main()
{
int a=15;
printf("Acest sir se afiseaza ca atare\n");
printf("\tvariabila a are valoarea: %d sau %o sau %x\n",a,a,a);
}
Citirea datelor cu format specfificat se realizează apelând funcţia scanf(). Această funcţie permite
citirea datelor sub controlul unui format specificat. Ea este declarată în fişierul antet stdio.h şi are
următorul format:
Funcţia parcurge succesiunea de caractere introdusă de la tastatură şi extrage valorile care trebuie
citite conform formatului specificat. Valorile citite sunt memorate în ordine în variabilele specificate
prin adresa lor în lista de parametri ai funcţiei scanf(). Adresa unei variabile se obţine cu ajutorul
operatorului de referenţiere &. Funcţia scanf() returnează numărul de valori citite correct. În cazul
unei erori, citirea se întrerupe în poziţia în care a fost întâlnită eroarea. Parametrul format este un şir
de caractere care poate conţine specificatori de format, caractere albe şi alte caractere. Specificatorul
de format are următoarea sintaxă:
Exemplu:
#include <stdio.h>
void main()
{
int a;
scanf("%d", &a);
printf("\tVariabila a are valoarea: %d sau %o sau %x\n", a, a, a);
Pentru mai multe informații în legătură cu aceste două funcții accesați link-urile următoare:
http://www.cplusplus.com/reference/cstdio/printf/
http://www.cplusplus.com/reference/cstdio/scanf/
6.Exerciții
4. Folosind Convertorul (de la link-ul de mai sus) pentru numerele reale, determinați cea mai mică
valoare pozitivă pe care o poate avea un număr în simplă precizie.
5. Scrieți un program în care să declarați și să inițializați câte o variabilă, fiecare inițializată cu valori
menționate în bazele 2, 8, 10 și 16. Afișați toate aceste variabile, fiecare pe câte un rand.
Ex:
12
123
1234
d. citeste de la tastatura un numar intreg in baza 10 si il afiseaza in baza 10, in baza opt si in
baza 16.
Exemplu:
Exemplu:
Intrare Ieșire
h=15 15:02:03
m=2
s=3
9. Sursa: Cerchez E., Şerban M., Programarea în limbajul C/C++ pentru liceu / pag. 42. Se
consideră un număr natural format din 5 cifre, ABCDE. Să se afişeze un tringhi format din cifrele
numărului astfel:
C
BCD
ABCDE
From:
https://wiki.mta.ro/ - Cursuri Academia Tehnică Militară "Ferdinand I"
Permanent link:
https://wiki.mta.ro/c/1/prog/lab/lab2