SlideShare a Scribd company logo
Programarea calculatoarelor
#4
Adrian Runceanu
www.runceanu.ro/adrian
2016
C++
Structura unui program C++.
Baze de numeratie
copyright@www.adrian.runceanu.ro
Curs 4
02.12.2016 Programarea calculatoarelor 2
copyright@www.adrian.runceanu.ro
4. Structura unui program C/C++
4.1. Preprocesare
4.2. Structura unui program C++
4.3. Baze de numeraţie
4.4. Conversia din baza 2 în bazele 8 şi 16 şi invers
4.4.1. Conversia din baza 2 în baza 8 şi invers
4.4.2. Conversia din baza 2 în baza 16 şi invers
4.4.3. Operaţii aritmetice în binar, octal,
hexazecimal
4.5. Probleme propuse spre rezolvare
02.12.2016 Programarea calculatoarelor 3
copyright@www.adrian.runceanu.ro
4.1. Preprocesare
02.12.2016 Programarea calculatoarelor 4
Schematic, parcursul unui program sursa scris în
C++, până la executarea lui este următorul:
program sursa iniţial ( extensia .CPP )
preprocesare
program sursă ( extensia .CPP )
compilare
program obiect ( extensia .OBJ )
editarea de legături (linkeditare)
program executabil ( extensia .EXE )
copyright@www.adrian.runceanu.ro
4.1. Preprocesare
În C++, după construirea unui program sursă,
se pot evalua anumite valori dacă se utilizează
preprocesorul.
Activitatea preprocesorului se împarte în:
a) includere de fişiere standard / utilizator
b) definire constante simbolice
c) definire macro-uri(macroinstructiuni)
d) compilare condiţionată
02.12.2016 Programarea calculatoarelor 5
copyright@www.adrian.runceanu.ro
4.1. Preprocesare
a) Includerea de fişiere standard/utilizator
se face pentru a putea:
utiliza funcţiile predefinite ale limbajului C++ care
se afla în fişiere standard numite header-e (au
extensia .h)
sau pentru a putea utiliza funcţii proprii aflate în
fişiere utilizator
02.12.2016 Programarea calculatoarelor 6
copyright@www.adrian.runceanu.ro
4.1. Preprocesare
Astfel, pentru a putea utiliza funcţiile
standard de intrare / ieşire cin / cout, trebuie
scris la începutul unui program C++:
#include <iostream.h> - fişier standard
Iar pentru a utiliza fişiere utilizator:
#include “nume fisier” – fişier utilizator
Observaţie:
Includerea fişierelor se execută numai pe timpul
compilării
02.12.2016 Programarea calculatoarelor 7
copyright@www.adrian.runceanu.ro
4.1. Preprocesare
b) Definire constante simbolice
Pentru a mări portabilitatea programelor
C++, se pot folosi constante.
O constantă este un nume pe care
compilatorul C++ îl asociază unei valori care nu
se modifică.
Pentru aceasta se utilizează directiva #define.
02.12.2016 Programarea calculatoarelor 8
copyright@www.adrian.runceanu.ro
4.1. Preprocesare
• Asociază numelui nume_constanta textul
denumit text care se poate prelungi pe mai linii.
• Aceasta substituţie a numelui este valabilă în tot
fişierul până la întâlnirea unei directive de
compilare #undef nume.
02.12.2016 Programarea calculatoarelor 9
#define nume_constanta text
copyright@www.adrian.runceanu.ro
4.1. Preprocesare
Exemplu:
#define NRLINII 30
#define NRCOLOANE 20
#define DIMENSIUNE NRLINII*NRCOLOANE
int t[NRLINII][NRCOLOANE];
double a[DIMENSIUNE];
Ce va întâlni compilatorul după preprocesor?
int t[30][20];
double a[30*20];
Observaţie: nu se vor face calculele pentru că este vorba
doar de informatie la nivel de text
02.12.2016 Programarea calculatoarelor 10
copyright@www.adrian.runceanu.ro
4.1. Preprocesare
Dacă se vor utiliza macroinstrucţiuni sau constante
simbolice în programele C++, atunci acestea trebuie să
aibă nume sugestive şi scrise cu litere mari pentru a
putea ajuta programatorii care citesc codul sursă să
facă diferenţa uşor între constante şi variabile.
Exemplu: Putem defini următoarele constante:
#define TRUE 1
#define FALSE 0
#define PI 3.1415
#define PROGRAMATOR “Pop Ion”
02.12.2016 Programarea calculatoarelor 11
copyright@www.adrian.runceanu.ro
4.1. Preprocesare
c) Definirea de macroinstrucţiuni
Un macrou (o macroinstrucţiune) este o
definiţie în care funcţionează reguli de
subtituţie de text.
Apelul macroului se face astfel:
02.12.2016 Programarea calculatoarelor 12
#define nume(param_form1, param_form2, . . . ,param_formn) text
nume(param_actual1, param_actual2,…,param_actualn)
copyright@www.adrian.runceanu.ro
4.1. Preprocesare
Unde:
• nume reprezintă numele macroului
• param_form1, param_form2, . . . , param_formn
parametrii formali ai macroului
• iar text este textul în care se vor face înlocuirile
• iar param_actual1, param_actual2, . . . ,
param_actualn sunt parametrii cu care se
apelează macroul în funcţia principală02.12.2016 Programarea calculatoarelor 13
copyright@www.adrian.runceanu.ro
4.1. Preprocesare
Funcţionarea macroului este următoarea:
1. în textul dat se înlocuiesc parametrii formali cu
parametrii actuali
2. iar apoi textul obţinut va substitui apelul
macroului.
Exemplu:
#define MAX(a, b) ( (a) < (b) ? (b) : (a) )
#define MIN(a, b) ( (a) > (b) ? (b) : (a) )
#define SGN(x) ((x) > 0 ? 1 : ( (x) == 0 ? 0 : (-1)))
02.12.2016 Programarea calculatoarelor 14
copyright@www.adrian.runceanu.ro
4.1. Preprocesare
Am definit câteva macrouri care pot fi utile
în multe programe C++, şi anume:
• MAX şi MIN determină maximul, respectiv
minimul a două numere de orice tip
• iar SGN determină signatura unui număr dat
02.12.2016 Programarea calculatoarelor 15
copyright@www.adrian.runceanu.ro
4.1. Preprocesare
Următorul
program C++
va folosi
aceste două
macro-uri:
02.12.2016 Programarea calculatoarelor 16
#include<iostream.h>
#define MAX(a, b) ( (a) < (b) ? (b) : (a) )
#define MIN(a, b) ( (a) > (b) ? (b) : (a) )
int main(void)
{
cout<<“Maximul valorilor 10.0 si 25.0
este “ <<MAX(10.0, 25.0)<<endl;
cout<<“Minimul valorilor 3.4 si 3.1
este ” <<MIN(3.4, 3.1)<<endl;
}
a, b parametri
formali
parametri actuali
copyright@www.adrian.runceanu.ro
4. Structura unui program C/C++
4.1. Preprocesare
4.2. Structura unui program C++
4.3. Baze de numeraţie
4.4. Conversia din baza 2 în bazele 8 şi 16 şi invers
4.4.1. Conversia din baza 2 în baza 8 şi invers
4.4.2. Conversia din baza 2 în baza 16 şi invers
4.4.3. Operaţii aritmetice în binar, octal,
hexazecimal
4.5. Probleme propuse spre rezolvare
02.12.2016 Programarea calculatoarelor 17
copyright@www.adrian.runceanu.ro
4.2. Structura unui program C++
/*-- nume.cpp -- comentariu iniţial --*/
#include <iostream.h>
#include <math.h>
. . . . /*-- alte directive include --*/
[ declaraţii şi definiţii globale ]
int main(void)
{
[ declaraţii locale ]
< instrucţiuni >
}
02.12.2016 Programarea calculatoarelor 18
optional
copyright@www.adrian.runceanu.ro
4.2. Structura unui program C++
02.12.2016 Programarea calculatoarelor 19
copyright@www.adrian.runceanu.ro
4. Structura unui program C/C++
4.1. Preprocesare
4.2. Structura unui program C++
4.3. Baze de numeraţie
4.4. Conversia din baza 2 în bazele 8 şi 16 şi invers
4.4.1. Conversia din baza 2 în baza 8 şi invers
4.4.2. Conversia din baza 2 în baza 16 şi invers
4.4.3. Operaţii aritmetice în binar, octal,
hexazecimal
4.5. Probleme propuse spre rezolvare
02.12.2016 Programarea calculatoarelor 20
copyright@www.adrian.runceanu.ro
4.3. Baze de numeraţie
Baza de numeraţie 2 (sistemul BINAR)
Ca în orice bază de numeraţie, cifrele folosite în
reprezentarea numerelor sunt cuprinse în intervalul:
[0, baza-1]
Rezultă că în baza 2 avem o reprezentare a
numerelor folosind doar cifrele 0 şi 1.
Fiecare dintre cifrele semnificative ale unei baze de
numeraţie poartă denumirea de digit.
În baza 2 deoarece sunt doar doi digiţi posibili
aceştia au preluat denumirea de binary digit (bit).
De aici provenienţa cuvântului bit.
02.12.2016 Programarea calculatoarelor 21
copyright@www.adrian.runceanu.ro
4.3. Baze de numeraţie
În baza 10 aceste cifre sunt 0...9.
Alte baze de numeraţie folosite în legătură cu sistemul binar
sunt: 4, 8 (octal) şi 16 (hexazecimal).
Pentru baza 16 cifrele de reprezentare sunt:
0 . . 9 şi A . . F
S-a convenit folosirea primelor litere ale alfabetului, cu
semnificaţia:
A ţine locul lui 10
B lui 11
C lui 12
D lui 13
E lui 14
F lui 1502.12.2016 Programarea calculatoarelor 22
copyright@www.adrian.runceanu.ro
4.3. Baze de numeraţie
În calculatoarele actuale baza de numeraţie
este 2.
Au existat încercări de creare a unor
calculatoare în bază 10, dar nu s-au putut ridica
la performanţele calculatoarelor binare.
S-a păstrat astfel sistemul binar ca standard
pentru calculatoarele digitale.
02.12.2016 Programarea calculatoarelor 23
copyright@www.adrian.runceanu.ro
4.3. Baze de numeraţie
Să luăm un exemplu de număr în baza 2:
0110 1101
Ce înseamnă acesta?
Cum poate fi interpretat astfel încât să poată
fi înţeles de către noi (adică tradus în baza 10)?
La aceste întrebări se răspunde plecând de la
regula de reprezentare în orice bază de
numeraţie (poziţională): fiecărei poziţii în număr
îi corespunde o putere a acelei baze de
numeraţie.
02.12.2016 Programarea calculatoarelor 24
copyright@www.adrian.runceanu.ro
4.3. Baze de numeraţie
Astfel:
 primei poziţii din dreapta îi corespunde puterea 0 a lui 2,
 următoarei poziţii îi corespunde puterea 1 a lui 2,
 iar ultimei poziţii (prima din stânga) îi corespunde puterea
7 a lui 2.
Atunci putem genera valoarea acestui număr în baza
10 - plecând de la dreapta spre stânga - astfel:
1*20 + 0*21 + 1*22 + 1*23 + 0*24 + 1*25 + 1*26 + 0*27 =
= 1 + 4 + 8 + 32 + 64 = 10910
02.12.2016 Programarea calculatoarelor 25
copyright@www.adrian.runceanu.ro
4.3. Baze de numeraţie
La fel procedăm cu un număr în baza 10 când dorim
să-i aflăm valoarea.
Dar, în baza 10 interpretăm natural şi aproape
instantaneu orice număr, care ne sugerează şi o
puternică semnificaţie "cantitativă" (adică mărimea
acelui număr).
Exemplu:
57810 = 8*100 + 7*101 + 5*102 = 8 + 70 + 500
Ştim imediat că avem de-a face cu 'cinci sute
şaptezeci şi opt' şi că acesta se situează cam la
jumătatea intervalului [0-1000].
02.12.2016 Programarea calculatoarelor 26
copyright@www.adrian.runceanu.ro
4.3. Baze de numeraţie
Notații:
Bitul se notează cu b.
Combinaţia de 8 biţi succesivi se numeşte Byte
(octet) şi este reprezentat prin litera B
02.12.2016 Programarea calculatoarelor 27
copyright@www.adrian.runceanu.ro
4.3. Baze de numeraţie
Într-un număr în baza 2 sunt importante două
poziţii:
Prima din dreapta - care poartă denumirea de Least
Significant bit (LSb)
Prima din stânga - care poartă denumirea de Most
Significant bit (MSb)
Poziţia MSb are de obicei rolul de semn al
numărului:
0 are semnificaţia de plus
1 are semnificaţia de minus
02.12.2016 Programarea calculatoarelor 28
copyright@www.adrian.runceanu.ro
4. Structura unui program C/C++
4.1. Preprocesare
4.2. Structura unui program C++
4.3. Baze de numeraţie
4.4. Conversia din baza 2 în bazele 8 şi 16 şi invers
4.4.1. Conversia din baza 2 în baza 8 şi invers
4.4.2. Conversia din baza 2 în baza 16 şi invers
4.4.3. Operaţii aritmetice în binar, octal,
hexazecimal
4.5. Probleme propuse spre rezolvare
02.12.2016 Programarea calculatoarelor 29
copyright@www.adrian.runceanu.ro
4.4.1. Conversia din baza 2 în baza 8 şi invers
Ştim că sistemele de numeraţie octal (baza
8) şi hexazecimal (baza 16) au particularitatea
de a folosi ca bază un număr (8 sau 16) care
rezultă din ridicarea la puterea a 3-a sau a 4-a a
cifrei 2, astfel între cele trei sisteme de
numeraţie se pot stabili compatibilităţi directe.
02.12.2016 Programarea calculatoarelor 30
4.4.1. Conversia din baza 2 în baza 8 şi
invers
Astfel, conversia octal-binar şi binar-octal
porneşte de la faptul că orice cifră octală se poate
reprezenta prin 3 cifre binare:
0 = 000 4 = 100
1 = 001 5 = 101
2 = 010 6 = 110
3 = 011 7 = 111
02.12.2016 Programarea calculatoarelor 31
copyright@www.adrian.runceanu.ro
4.4.1. Conversia din baza 2 în baza 8 şi invers
Dacă se consideră un număr octal, pentru
conversia în binar se va scrie fiecare cifră octală
prin 3 cifre binare.
Exemplu :
(3 4 7, 5)8 = (011 100 111, 101 )2
02.12.2016 Programarea calculatoarelor 32
copyright@www.adrian.runceanu.ro
4.4.1. Conversia din baza 2 în baza 8 şi invers
Dacă se consideră un număr binar, pentru
conversia în octal se vor grupa câte 3 cifre
binare pornind de la poziţia virgulei spre stânga
pentru partea întreagă, respectiv dreapta
pentru partea fracţionară, găsind
corespondentul în octal.
Exemplu:
( 001 110 011 101 , 101 100 )2 = (1635,54)8
1 6 3 5 5 4
02.12.2016 Programarea calculatoarelor 33
copyright@www.adrian.runceanu.ro
4. Structura unui program C/C++
4.1. Preprocesare
4.2. Structura unui program C++
4.3. Baze de numeraţie
4.4. Conversia din baza 2 în bazele 8 şi 16 şi invers
4.4.1. Conversia din baza 2 în baza 8 şi invers
4.4.2. Conversia din baza 2 în baza 16 şi invers
4.4.3. Operaţii aritmetice în binar, octal,
hexazecimal
4.5. Probleme propuse spre rezolvare
02.12.2016 Programarea calculatoarelor 34
4.4.2. Conversia din baza 2 în baza 16 şi
invers
La fel se poate proceda şi în cazul conversiei
binar - hexazecimal, orice cifra hexazecimală
putându-se reprezenta prin patru cifre binare:
0 = 0000 4 = 0100 8 = 1000 C = 1100
1 = 0001 5 = 0101 9 = 1001 D = 1101
2 = 0010 6 = 0110 A = 1010 E = 1110
3 = 0011 7 = 0111 B = 1011 F = 1111
02.12.2016 Programarea calculatoarelor 35
copyright@www.adrian.runceanu.ro
4.4.2. Conversia din baza 2 în baza 16 şi invers
Exemple:
( 5 A F 4, 3 E)16 = (0101 1010 1111 0100, 0011 1110)2
02.12.2016 Programarea calculatoarelor 36
copyright@www.adrian.runceanu.ro
4.4.2. Conversia din baza 2 în baza 16 şi invers
( 10 0110 1011 1100, 0011 1101 11 )2 = ( 26BC,3DC )16
2 6 B C 3 D C
02.12.2016 Programarea calculatoarelor 37
copyright@www.adrian.runceanu.ro
4. Structura unui program C/C++
4.1. Preprocesare
4.2. Structura unui program C++
4.3. Baze de numeraţie
4.4. Conversia din baza 2 în bazele 8 şi 16 şi invers
4.4.1. Conversia din baza 2 în baza 8 şi invers
4.4.2. Conversia din baza 2 în baza 16 şi invers
4.4.3. Operaţii aritmetice în binar, octal,
hexazecimal
4.5. Probleme propuse spre rezolvare
02.12.2016 Programarea calculatoarelor 38
4.4.3. Operaţii aritmetice în binar, octal,
hexazecimal
a) Operaţii aritmetice în binar:
Unde ‘*’ semnifică un împrumut de la poziţia imediat
următoare a descăzutului, care pentru poziţia curentă înseamnă 2
(deci se interpretează 2 - 1 = 1).
adunare înmulţire scădere
0 + 0 = 0 0  0 = 0 0 – 0 = 0
0 + 1 = 1 0  1 = 0 1 – 0 = 1
1 + 0 = 1 1  0 = 0 1 – 1 = 0
1 + 1 = 10 1  1 = 1 0 – 1 = 1*
02.12.2016 Programarea calculatoarelor 39
4.4.3. Operaţii aritmetice în binar, octal,
hexazecimal
Exemple de operaţii în binar:
11101101,101 +
1011010,001
1000101,110 -
111010,011
101000111,110 1011,011
110,11 
10,11
11011
11011
00000
11011
10010,1001
02.12.2016 Programarea calculatoarelor 40
4.4.3. Operaţii aritmetice în binar, octal,
hexazecimal
b) Operaţii aritmetice în octal:
+ 0 1 2 3 4 5 6 7
0 0 1 2 3 4 5 6 7
1 1 2 3 4 5 6 7 10
2 2 3 4 5 6 7 10 11
3 3 4 5 6 7 10 11 12
4 4 5 6 7 10 11 12 13
5 5 6 7 10 11 12 13 14
6 6 7 10 11 12 13 14 15
7 7 10 11 12 13 14 15 16
 0 1 2 3 4 5 6 7
0 0 0 0 0 0 0 0 0
1 0 1 2 3 4 5 6 7
2 0 2 4 6 10 12 14 16
3 0 3 6 11 14 17 22 25
4 0 4 10 14 20 24 30 34
5 0 5 12 17 24 31 36 43
6 0 6 14 22 30 36 44 52
7 0 7 16 25 34 43 52 61
02.12.2016 Programarea calculatoarelor 41
copyright@www.adrian.runceanu.ro
4.4.3. Operaţii aritmetice în binar, octal,
hexazecimal
Exemple de operaţii în octal:
Se ţine seama de următoarele reguli:
• La adunare şi înmulţire rezultatul va fi constituit din
restul împărţirii sumei sau produsului la bază, câtul
constituind transportul pentru poziţia următoare
• La scădere, un împrumut de la poziţia următoare a
numărului înseamnă adunarea la descăzutul poziţiei
curente, a bazei de numeraţie
02.12.2016 Programarea calculatoarelor 42
copyright@www.adrian.runceanu.ro
4.4.3. Operaţii aritmetice în binar, octal,
hexazecimal
1475,367+
562,51
34022,56 –
1234,25
2260,077 32566,31
357,26 
3,7
321332
131602
1637,352
02.12.2016 Programarea calculatoarelor 43
4.4.3. Operaţii aritmetice în binar, octal,
hexazecimal
c) Operaţii aritmetice în hexazecimal:
+ 0 1 2 3 4 5 6 7 8 9 A B C D E F
0 0 1 2 3 4 5 6 7 8 9 A B C D E F
1 1 2 3 4 5 6 7 8 9 A B C D E F 10
2 2 3 4 5 6 7 8 9 A B C D E F 10 11
3 3 4 5 6 7 8 9 A B C D E F 10 11 12
4 4 5 6 7 8 9 A B C D E F 10 11 12 13
5 5 6 7 8 9 A B C D E F 10 11 12 13 14
6 6 7 8 9 A B C D E F 10 11 12 13 14 15
7 7 8 9 A B C D E F 10 11 12 13 14 15 16
8 8 9 A B C D E F 10 11 12 13 14 15 16 17
9 9 A B C D E F 10 11 12 13 14 15 16 17 18
A A B C D E F 10 11 12 13 14 15 16 17 18 19
B B C D E F 10 11 12 13 14 15 16 17 18 19 1A
C C D E F 10 11 12 13 14 15 16 17 18 19 1A 1B
D D E F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C
E E F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D
F F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E
02.12.2016 Programarea calculatoarelor 44
copyright@www.adrian.runceanu.ro
4.4.3. Operaţii aritmetice în binar, octal,
hexazecimal
 0 1 2 3 4 5 6 7 8 9 A B C D E F
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 1 2 3 4 5 6 7 8 9 A B C D E F
2 0 2 4 6 8 A C E 10 12 14 16 18 1A 1C 1E
3 0 3 6 9 C F 12 15 18 1B 1E 21 24 27 2A 2D
4 0 4 8 C 10 14 18 1C 20 24 28 2C 30 34 38 3C
5 0 5 A F 14 19 1E 23 28 2D 32 37 3C 41 46 4B
6 0 6 C 12 18 1E 24 2A 30 36 3C 42 48 4E 54 5A
7 0 7 E 15 1C 23 2A 31 38 3F 46 4D 54 5B 62 69
8 0 8 10 18 20 28 30 38 40 48 50 58 60 68 70 78
9 0 9 12 1B 24 2D 36 3F 48 51 5A 63 6C 75 7E 87
A 0 A 14 1E 28 32 3C 46 50 5A 64 6E 78 82 8C 96
B 0 B 16 21 2C 37 42 4D 58 63 6E 79 84 8F 9A A5
C 0 C 18 24 30 3C 48 54 60 6C 78 84 90 9C A8 B4
D 0 D 1A 27 34 41 4E 5B 68 75 82 8F 9C A9 B6 C3
E 0 E 1C 2A 38 46 54 62 70 7E 8C 9A A8 B6 C4 D2
F 0 F 1E 2D 3C 4B 5A 69 78 87 96 A5 B4 C3 D2 E1
02.12.2016 Programarea calculatoarelor 45
4.4.3. Operaţii aritmetice în binar, octal,
hexazecimal
Exemple de operaţii în hexazecimal:
AF59C +
D8E2
F000 –
1
BCE7E EFFF
5DA2 
B8
2ED10
405F6
434C70
02.12.2016 Programarea calculatoarelor 46
copyright@www.adrian.runceanu.ro
4. Structura unui program C/C++
4.1. Preprocesare
4.2. Structura unui program C++
4.3. Baze de numeraţie
4.4. Conversia din baza 2 în bazele 8 şi 16 şi invers
4.4.1. Conversia din baza 2 în baza 8 şi invers
4.4.2. Conversia din baza 2 în baza 16 şi invers
4.4.3. Operaţii aritmetice în binar, octal,
hexazecimal
4.5. Probleme propuse spre rezolvare
02.12.2016 Programarea calculatoarelor 47
copyright@www.adrian.runceanu.ro
4.5. Probleme propuse spre rezolvare:
1. Să se convertească din sistemul binar în sistemul octal
numerele reprezentate prin:
(101,101)2 = ?8
(111000111,101)2 = ?8
(10110,1101)2 = ?8
2. Să se convertească din sistemul binar în sistemul
hexazecimal numerele reprezentate prin:
(110010,11011)2 = ?16
(111000111,101)2 = ?16
(10111111101)2 = ?16
02.12.2016 Programarea calculatoarelor 48
copyright@www.adrian.runceanu.ro
4.5. Probleme propuse spre rezolvare:
3. Să se convertească din sistemul octal în sistemul
binar numerele reprezentate prin:
(173,236)8 = ?2
(153)8 = ?2
4. Să se convertească din sistemul hexazecimal în
sistemul binar numerele reprezentate prin:
(43,AC)16 = ?2
(1C8,B)16 = ?2
02.12.2016 Programarea calculatoarelor 49
copyright@www.adrian.runceanu.ro
4.5. Probleme rezolvate
1) Se introduce un număr natural cu maxim 9 cifre. Să se
determine şi să se afişeze numărul de cifre, cea mai mare
cifră, cea mai mică cifră şi suma tuturor cifrelor acestui
număr.
Exemplu:
02.12.2016 Programarea calculatoarelor 50
Date de intrare: 24356103
Date de ieşire:
Numarul de cifre 8
Cea mai mare cifra 6
Cea mai mica cifra 0
Suma cifrelor 24
copyright@www.adrian.runceanu.ro
#include<iostream.h>
int main()
{
long int n;
int nr_cifre=0;
int min=100;
int max=-100;
int suma=0;
int cifra;
cout<<"Dati numarul
(maxim 9 cifre) ";
cin>>n;
02.12.2016 Programarea calculatoarelor 51
while(n!=0)
{
cifra=n%10;
nr_cifre++;
if(cif>max) max=cifra;
if(cif<min) min=cifra;
suma=suma+cifra;
n=n/10;
}
cout<<"n numarul de cifre
"<<nr_cifre;
cout<<"n cea mai mare cifra "<<max;
cout<<"n cea mai mica cifra "<<min;
cout<<"n suma cifrelor "<<suma;
}
copyright@www.adrian.runceanu.ro
02.12.2016 Programarea calculatoarelor 52
copyright@www.adrian.runceanu.ro
4.5. Probleme rezolvate
2) Dat un număr intreg de
maxim 9 cifre, să se
afişeze numărul de apariţii
al fiecărei cifre.
02.12.2016 Programarea calculatoarelor 53
Exemplu:
Date de intrare 364901211
Date de ieşire:
0 apare de 1 ori
1 apare de 3 ori
2 apare de 1 ori
3 apare de 1 ori
4 apare de 1 ori
5 apare de 0 ori
6 apare de 1 ori
7 apare de 0 ori
8 apare de 0 ori
9 apare de 1 ori
copyright@www.adrian.runceanu.ro
#include<iostream.h>
int main()
{
long int n;
int n0,n1,n2,n3,n4,n5,n6,n7,n8,n9;
n0=n1=n2=n3=n4=n5=n6=n7=n8=n9=0;
cout<<"Dati numarul (cu maxim9 cifre) = ";
cin>>n;
while(n!=0) {
switch(n%10){
case 0: n0++;break;
case 1: n1++;break;
case 2: n2++;break;
case 3: n3++;break;
case 4: n4++;break;
case 5: n5++;break;
case 6: n6++;break;
case 7: n7++;break;
case 8: n8++;break;
case 9: n9++;break;
}
n=n/10;
}02.12.2016 Programarea calculatoarelor 54
cout<<"n 0 apare de "<<n0<<" ori";
cout<<"n 1 apare de "<<n1<<" ori";
cout<<"n 2 apare de "<<n2<<" ori";
cout<<"n 3 apare de "<<n3<<" ori";
cout<<"n 4 apare de "<<n4<<" ori";
cout<<"n 5 apare de "<<n5<<" ori";
cout<<"n 6 apare de "<<n6<<" ori";
cout<<"n 7 apare de "<<n7<<" ori";
cout<<"n 8 apare de "<<n8<<" ori";
cout<<"n 9 apare de "<<n9<<" ori";
}
copyright@www.adrian.runceanu.ro
02.12.2016 Programarea calculatoarelor 55
copyright@www.adrian.runceanu.ro
4. Tablouri
4.1. Generalități. Clasificare
4.2. Tablouri unidimensionale (vectori)
4.3. Tablouri bidimensionale (matrici)
4.4. Tablouri multidimensionale
02.12.2016 Programarea calculatoarelor 56
copyright@www.adrian.runceanu.ro
4.1. Generalitati. Clasificare
Numim tablou o colecţie de date de acelaşi
tip, în care elementele sunt ordonate, iar
accesul la fiecare element are loc prin indice.
În funcţie de numărul indicilor avem mai
multe tipuri de tablouri:
1. Tablouri unidimensionale (cu un singur indice)
2. Tablouri bidimensionale (cu doi indici)
3. Tablouri multidimensionale (cu mai mulţi
indici)
02.12.2016 Programarea calculatoarelor 57
copyright@www.adrian.runceanu.ro
4. Tablouri
4.1. Generalități. Clasificare
4.2. Tablouri unidimensionale (vectori)
4.3. Tablouri bidimensionale (matrici)
4.4. Tablouri multidimensionale
02.12.2016 Programarea calculatoarelor 58
copyright@www.adrian.runceanu.ro
4.2. Tablouri unidimensionale (vectori)
• Tablourile unidimensionale funcţionează ca un
vector şi se pot declara astfel:
• Se observă că este obligatorie folosirea
parantezelor drepte care să încadreze
dimensiunea maximă pe care o alege utilizatorul
pentru acel tablou unidimensional.
02.12.2016 Programarea calculatoarelor 59
tip nume_tablou[dimensiune_maximă];
copyright@www.adrian.runceanu.ro
4.2. Tablouri unidimensionale (vectori)
Exemplu:
Declarări de tablouri unidimensionale:
02.12.2016 Programarea calculatoarelor 60
int a[25]; // declararea unui tablou unidimensional cu maxim 25 de
// elemente, fiecare de tip întreg
float x[30]; // declararea unui tablou unidimensional cu maxim 30 de
// elemente, fiecare de tip real simplă precizie
char s[40]; // declararea unui tablou unidimensional cu maxim 40 de
// elemente, fiecare de tip caracter
copyright@www.adrian.runceanu.ro
4.2. Tablouri unidimensionale (vectori)
• Compilatorul C++ alocă un spaţiu de memorie
egal cu numărul maxim de elemente ale
tabloului, rezervând bineînţeles octeţi în funcţie
de tipul de bază al fiecărui tablou.
• Accesul la fiecare element al tabloului se face
prin numele acestuia urmat între paranteze, de
indicele său (adică poziţia pe care o ocupă în
tablou).
• În limbajul C++, indicii tablourilor încep
numărătoarea de la valoarea 0.
02.12.2016 Programarea calculatoarelor 61
copyright@www.adrian.runceanu.ro
4.2. Tablouri unidimensionale (vectori)
Exemplu:
Modalităţi de acces la elementele ce pot fi
memorate în tablourile unidimensionale
declarate anterior:
02.12.2016 Programarea calculatoarelor 62
a[0] – reprezintă elementul aflat pe prima poziţie în tablou
a[24] - reprezintă elementul aflat pe ultima poziţie în tablou
x[i] - reprezintă elementul aflat pe poziţia i în tablou, unde i poate
avea valori între 0 şi 29.
copyright@www.adrian.runceanu.ro
4.2. Tablouri unidimensionale (vectori)
Iniţializarea elementelor unui tablou se poate
face total sau parţial la declararea lor:
int b[5] = {1, 2, 3, 4, 5};
Astfel:
• elementul b[0] are valoarea 1
• elementul b[1] are valoarea 2
• elementul b[2] are valoarea 3
• elementul b[3] are valoarea 4
• elementul b[4] are valoarea 5
02.12.2016 Programarea calculatoarelor 63
copyright@www.adrian.runceanu.ro
4.2. Tablouri unidimensionale (vectori)
Problema 1:
Se consideră n numere reale. Se cere să se
determine valoarea minimă şi valoarea maximă.
Exemplu:
02.12.2016 Programarea calculatoarelor 64
Date de intrare:
n=5 si x={10, -2, 34, -198, 4}
Date de ieşire:
minim=-198, maxim=34
copyright@www.adrian.runceanu.ro
4.2. Tablouri unidimensionale (vectori)
02.12.2016 Programarea calculatoarelor 65
#include<iostream.h>
int main(void)
{
int i, n;
float x[50], min, max;
cout<<"Dati numarul de elemente ale tabloului ";
cin>>n;
for( i = 0; i <=n; i++ )
{
cout<<"x["<<i+1<<"]= ";
cin>>x[i];
}
Citirea elementelor si
memorarea lor in
vectorul x
Citirea numarului de
elemente ce vor fi
prelucrate in vector - n
copyright@www.adrian.runceanu.ro
4.2. Tablouri unidimensionale (vectori)
min = x[0]; max = x[0];
for( i=1; i<n; i++ )
if( min > x[i] )
min = x[i];
else
if( max < x[i] )
max = x[i];
cout<<"nMinimul este "<<min;
cout<<"nMaximul este "<<max;
}
02.12.2016 Programarea calculatoarelor 66
Determinarea
minimului
Determinarea
maximului
copyright@www.adrian.runceanu.ro
4.2. Tablouri unidimensionale (vectori)
Executia programului pe o serie de date de test:
02.12.2016 Programarea calculatoarelor 67
copyright@www.adrian.runceanu.ro
4.2. Tablouri unidimensionale (vectori)
Problema 2:
Se consideră n numere întregi.
Se cere să se verifice dacă ele sunt sau nu în
ordine crescătoare, afișând câte un mesaj
corespunzător.
Exemplu:
02.12.2016 Programarea calculatoarelor 68
Date de intrare:
n=5 si x={1, 2, 17, 25, 43}
Date de ieşire:
Elemente vectorului sunt in ordine crescatoare
copyright@www.adrian.runceanu.ro
4.2. Tablouri unidimensionale (vectori)
#include<iostream.h>
int main(void)
{
int i, n, verif=1;
int x[50];
cout<<"Dati numarul de elemente ale tabloului X ";
cin>>n;
for(i=0; i<n; i++)
{
cout<<"x["<<i+1<<"]= ";
cin>>x[i];
}
02.12.2016 Programarea calculatoarelor 69
Citirea numarului de
elemente ce vor fi
prelucrate in vector - n
Citirea elementelor si
memorarea lor in
vectorul x
copyright@www.adrian.runceanu.ro
4.2. Tablouri unidimensionale (vectori)
for(i=0; i<=n-2; i++)
if( x[i] > x[i+1] ) verif=0;
if( verif == 1 ) cout<<"Numerele din tablou sunt in
ordine CRESCATOARE";
else cout<<"Numerele din tablou NU sunt in ordine
CRESCATOARE";
}
02.12.2016 Programarea calculatoarelor 70
Verificarea
proprietatii cerute
in enunt
copyright@www.adrian.runceanu.ro
4.2. Tablouri unidimensionale (vectori)
Executia programului pe doua serii de date de
test:
02.12.2016 Programarea calculatoarelor 71
copyright@www.adrian.runceanu.ro
4. Tablouri
4.1. Generalităţi. Clasificare
4.2. Tablouri unidimensionale (vectori)
4.3. Tablouri bidimensionale (matrici)
4.4. Tablouri multidimensionale
02.12.2016 Programarea calculatoarelor 72
copyright@www.adrian.runceanu.ro
4.3. Tablouri bidimensionale (matrici)
• Tablourile bidimensionale funcţionează ca o
matrice şi se pot declara astfel:
• La fel ca şi în cazul tablourilor unidimensionale,
şi în cazul tablourilor bidimensionale, la
declarare, se trece dimensiunea maximă a liniilor
(dim_linie) şi dimensiunea maximă a coloanelor
(dim_coloana).
02.12.2016 Programarea calculatoarelor 73
tip nume_tablou[dim_linie][dim_coloana];
copyright@www.adrian.runceanu.ro
4.3. Tablouri bidimensionale (matrici)
Exemplu:
Declarări de tablouri bidimensionale:
02.12.2016 Programarea calculatoarelor 74
int a[10][10]; // declararea unui tablou bidimensional cu maxim 100 de
// elemente (10*10), fiecare de tip întreg
float x[5][5]; // declararea unui tablou bidimensional cu maxim 25 de
// elemente(5*5), fiecare de tip real simplă precizie
char s[20][10]; // declararea unui tablou bidimensional cu maxim 200 de
// elemente(20*10), fiecare de tip caracter
copyright@www.adrian.runceanu.ro
4.3. Tablouri bidimensionale (matrici)
• Compilatorul C++ alocă un spaţiu de memorie
egal cu numărul de linii înmulţit cu numărul de
coloane ale tabloului, rezervând bineînţeles
octeţi în funcţie de tipul de bază al fiecărui
tablou.
• Accesul la fiecare element al tabloului se face
prin numele acestuia urmat între paranteze, de
indicele liniei şi indicele coloanei (adică poziţia
pe care o ocupă în tablou).
02.12.2016 Programarea calculatoarelor 75
copyright@www.adrian.runceanu.ro
4.3. Tablouri bidimensionale (matrici)
Exemplu:
Modalităţi de acces la elementele ce pot fi
memorate în tablourile bidimensionale declarate
anterior:
02.12.2016 Programarea calculatoarelor 76
a[0][0] – reprezintă elementul aflat pe linia 0 coloana 0
a[9][9] - reprezintă elementul aflat pe linia 9 coloana 9
x[i][j] - reprezintă elementul aflat pe linia i, coloana j în
matrice, unde i şi j pot avea valori între 0 şi 4.
copyright@www.adrian.runceanu.ro
4.3. Tablouri bidimensionale (matrici)
Iniţializarea elementelor unui tablou se poate
face total sau parţial la declararea lor:
int b[2][3]={ {1, 2, 3}, {4, 5, 6} };
Astfel:
• elementul b[0][0] are valoarea 1
• elementul b[0][1] are valoarea 2
• elementul b[0][2] are valoarea 3
• elementul b[1][0] are valoarea 4
• elementul b[1][1] are valoarea 5
• elementul b[1][2] are valoarea 6
02.12.2016 Programarea calculatoarelor 77
copyright@www.adrian.runceanu.ro
4.3. Tablouri bidimensionale (matrici)
Problema 1:
Se consideră o matrice A cu nm numere
întregi. Se cere să se obţină transpusa sa.
Exemplu:
02.12.2016 Programarea calculatoarelor 78
Date de intrare:
n=3, m=4 si matricea A:
1 2 3 4
5 6 7 8
9 10 11 12
Date de ieşire:
Matricea transpusa B:
n=4 si m=3
1 5 9
2 6 10
3 7 11
4 8 12
copyright@www.adrian.runceanu.ro
4.3. Tablouri bidimensionale (matrici)
#include<iostream.h>
int main(void)
{
int a[10][10], b[10][10];
int n, m, i, j;
cout<<"Dati dimensiunile matricei A n";
cout<<"Dati numarul de linii n = "; cin>>n;
cout<<"Dati numarul de coloane m = "; cin>>m;
for(i=0; i<n; i++)
for(j=0; j<m; j++)
{
cout<<"a["<<i+1<<", "<<j+1<<"] = ";
cin>>a[i][j];
}
02.12.2016 Programarea calculatoarelor 79
Citirea numarului de linii – n
si de coloane - m ale matricei
Citirea elementelor
si memorarea lor in
matricea a
copyright@www.adrian.runceanu.ro
4.3. Tablouri bidimensionale (matrici)
cout<<"Elementele matricei A sunt : n";
for(i=0; i<n; i++)
{
for(j=0; j<m; j++) cout<<a[i][j]<<" ";
cout<<"n";
}
02.12.2016 Programarea calculatoarelor 80
Afisarea elementelor
din matricea a
copyright@www.adrian.runceanu.ro
4.3. Tablouri bidimensionale (matrici)
for(i=0; i<n; i++)
for(j=0; j<m; j++)
b[j][i] = a[i][j];
cout<<"Elementele matricei transpuse sunt n";
for(i=0; i<m; i++)
{
for(j=0; j<n; j++) cout<<b[i][j]<<" ";
cout<< "n";
}
}
02.12.2016 Programarea calculatoarelor 81
Construirea matricei
transpuse prin
transformarea liniilor in
coloane si invers
copyright@www.adrian.runceanu.ro
4.3. Tablouri bidimensionale (matrici)
Executia programului pe o serie de date de test:
02.12.2016 Programarea calculatoarelor 82
copyright@www.adrian.runceanu.ro
4.3. Tablouri bidimensionale (matrici)
Problema 2:
Se consideră două tablouri
bidimensionale (matrici) A şi B cu nm
numere întregi.
Se cere să se calculeze matricea suma:
C = A + B.
02.12.2016 Programarea calculatoarelor 83
copyright@www.adrian.runceanu.ro
4.3. Tablouri bidimensionale (matrici)
#include<iostream.h>
int main(void)
{
int Matrice1 [10][10], Matrice2 [10][10], Matricesuma[10][10];
int i, j, n, m;
cout<<"Dati dimensiunile primei matrici n";
cout<<"Dati numarul de linii n = "; cin>>n;
cout<<"Dati numarul de coloane m = "; cin>>m;
for(i=0; i<n; i++){
for(j=0; j<m; j++){
cout<<"Matrice1["<<i+1<<", "<<j+1<<"] = ";
cin>>Matrice1[i][j];
}
}
02.12.2016 Programarea calculatoarelor 84
Citirea numarului de linii – n
si de coloane - m ale matricei
Citirea
elemente
lor si
memorar
ea lor in
prima
matrice
copyright@www.adrian.runceanu.ro
4.3. Tablouri bidimensionale (matrici)
cout<<"Elementele primei matrici sunt : n";
for(i=0; i<n; i++)
{
for(j=0; j<m; j++) cout<<Matrice1[i][j]<<" ";
cout<<"n";
}
02.12.2016 Programarea calculatoarelor 85
Afisarea elementelor
din prima matrice
copyright@www.adrian.runceanu.ro
4.3. Tablouri bidimensionale (matrici)
for(i=0; i<n; i++){
for(j=0; j<m; j++){
cout<<"Matrice2["<<i<<", "<<j<<"] = ";
cin>>Matrice2[i][j];
}
}
cout<<"Elementele celei de-a doua matrice sunt : n";
for(i=0; i<n; i++)
{
for(j=0; j<m; j++) cout<<Matrice2[i][j]<<" ";
cout<<"n";
}
02.12.2016 Programarea calculatoarelor 86
copyright@www.adrian.runceanu.ro
4.3. Tablouri bidimensionale (matrici)
for(i=0; i<n; i++)
for(j=0; j<m; j++)
Matricesuma[i][j]=Matrice1[i][j]+Matrice2[i][j];
cout<<"Elementele matricii suma sunt : n";
for(i=0; i<n; i++)
{
for(j=0; j<m; j++) cout<<Matricesuma[i][j]<<" ";
cout<<"n";
}
}
02.12.2016 Programarea calculatoarelor 87
Construirea matricei
suma prin adunarea
valorilor pe linie si pe
coloana
copyright@www.adrian.runceanu.ro
4.3. Tablouri bidimensionale (matrici)
Executia
programului pe o
serie de date de
test:
02.12.2016 Programarea calculatoarelor 88
copyright@www.adrian.runceanu.ro
4.3. Tablouri bidimensionale (matrici)
Problema 3:
Se consideră două tablouri
bidimensionale (matrici) A şi B cu nm,
respectiv mp numere întregi.
Se cere să se calculeze matricea produs:
C = A * B.
02.12.2016 Programarea calculatoarelor 89
copyright@www.adrian.runceanu.ro
4.3. Tablouri bidimensionale (matrici)
Exemplu:
02.12.2016 Programarea calculatoarelor 90
Date de intrare:
n=2, m=3 si matricea a:
1 2 3
4 5 6
m=3, p=4 si matricea b:
1 2 3 4
5 6 7 8
9 10 11 12
Date de iesire:
n=2 si p=3 si matricea
produs c:
38 44 50 56
83 98 113 128
copyright@www.adrian.runceanu.ro
4.3. Tablouri bidimensionale (matrici)
#include<iostream.h>
int main(void)
{
int a[10][10], b[10][10], c[10][10];
int n, m, i, j, k, p;
cout<<"Dati dimensiunile matricei A n";
cout<<"Dati numarul de linii n = "; cin>>n;
cout<<"Dati numarul de coloane m = "; cin>>m;
for(i=0; i<n; i++)
for(j=0; j<m; j++)
{
cout<<"a["<<i+1<<", "<<j+1<<"] = ";
cin>>a[i][j];
}
02.12.2016 Programarea calculatoarelor 91
Citirea numarului de linii – n
si de coloane - m ale matricei
Citirea elementelor
si memorarea lor in
matricea a
copyright@www.adrian.runceanu.ro
4.3. Tablouri bidimensionale (matrici)
cout<<"Elementele matricei A sunt : n";
for(i=0; i<n; i++)
{
for(j=0; j<m; j++) cout<<a[i][j]<<" ";
cout<< "n";
}
02.12.2016 Programarea calculatoarelor 92
Afisarea elementelor
din matricea a
copyright@www.adrian.runceanu.ro
4.3. Tablouri bidimensionale (matrici)
cout<<"Dati dimensiunile matricei B n";
cout<<"Dati numarul de linii m = "; cin>>m;
cout<<"Dati numarul de coloane p = "; cin>>p;
for(i=0; i<m; i++)
for(j=0; j<p; j++)
{
cout<< "b["<<i<<", "<<j<<"] = ";
cin>>b[i][j];
}
cout<<"Elementele matricei B sunt : n";
for(i=0; i<m; i++)
{
for(j=0; j<p; j++) cout<<b[i][j]<<" ";
cout<<"n";
}
02.12.2016 Programarea calculatoarelor 93
Citirea
elementelor si
memorarea lor in
matricea b
copyright@www.adrian.runceanu.ro
4.3. Tablouri bidimensionale (matrici)
• Conditie: Numarul de coloane din prima
matrice trebuie sa fie egal cu numarul de linii
din a doua matrice.
02.12.2016 Programarea calculatoarelor 94
Prima matrice
2 x 4
A doua matrice
4 x 3
Trebuie sa fie
acelasi numar
Matricea rezultat
copyright@www.adrian.runceanu.ro
4.3. Tablouri bidimensionale (matrici)
for(i=0; i<n; i++)
for(j=0; j<p; j++)
{
c[i][j] = 0;
for(k=0; k<m; k++)
c[i][j] = c[i][j] + a[i][k] * b[k][j];
}
02.12.2016 Programarea calculatoarelor 95
Calculul
elementelor
matricei produs c
copyright@www.adrian.runceanu.ro
4.3. Tablouri bidimensionale (matrici)
cout<<"Elementele matricei produs C sunt : n";
for(i=0; i<n; i++) {
for(j=0; j<p; j++) cout<<c[i][j]<<" ";
cout<<"n";
}
}
02.12.2016 Programarea calculatoarelor 96
copyright@www.adrian.runceanu.ro
4.3. Tablouri bidimensionale (matrici)
Executia
programului pe o
serie de date de
test:
02.12.2016 Programarea calculatoarelor 97
copyright@www.adrian.runceanu.ro
Probleme rezolvate – tablouri unidimensionale
Enunt:
Se considera un numar natural n. Se cere sa se
formeze un vector cu cifrele numarului.
Exemplu:
02.12.2016 Programarea calculatoarelor 98
Date de intrare:
Pentru valoarea: n = 23416789
Date de iesire:
Se obtine vectorul cu elementele:
9 8 7 6 1 4 3 2
copyright@www.adrian.runceanu.ro
Probleme rezolvate – tablouri unidimensionale
#include<iostream.h>
int main(void)
{
// declaram variabilele pe care le vom utiliza in program
int x[30];
long int n, i, m;
cout<<"Dati numarul natural n = ";
cin>>n;
02.12.2016 Programarea calculatoarelor 99
copyright@www.adrian.runceanu.ro
Probleme rezolvate – tablouri unidimensionale
i = 0;
while(n != 0){
x[i] = n % 10;
i++;
n = n / 10;
}
m = i-1;
cout<<"nVectorul cu cifrele numarului este n";
for(i = 0; i < m; i++){
cout.width(3); cout<<x[i];
}
}
02.12.2016 Programarea calculatoarelor 100
copyright@www.adrian.runceanu.ro
Probleme rezolvate – tablouri unidimensionale
Executia programului pe o serie de date de test:
02.12.2016 Programarea calculatoarelor 101
copyright@www.adrian.runceanu.ro
Probleme rezolvate – tablouri unidimensionale
Enunt: Reuniunea a doua multimi
Sa se scrie un program care sa calculeze
reuniunea a doua multimi de cate n, respectiv m
numere intregi memorate cu ajutorul vectorilor.
Exemplu:
02.12.2016 Programarea calculatoarelor 102
Date de intrare:
n = 5, a = {1, 2, 5, 7, 12} si
m = 4, b = {2, 4, 8, 12}
Date de iesire:
se obtine: k=7, c={1, 2, 5, 7, 12, 4, 8}
copyright@www.adrian.runceanu.ro
Probleme rezolvate – tablouri unidimensionale
#include<iostream.h>
int main(void)
{
int a[100], b[100], c[100], n, m, i, j, k, ok;
cout<<"Dati cardinalul multimii A - n = ";
cin>>n;
cout<<"Dati elementele multimii A n";
for(i = 0; i < n; i++){
cout<<"a["<<i+1<<"] = ";
cin>>a[i];
}
02.12.2016 Programarea calculatoarelor 103
copyright@www.adrian.runceanu.ro
Probleme rezolvate – tablouri unidimensionale
cout<<"Dati cardinalul multimii B - m = ";
cin>>m;
cout<<"Dati elementele multimii B n";
for(i = 0; i < m; i++)
{
cout<<"b["<<i+1<<"] = ";
cin>>b[i];
}
// copiem elementele din multimea A in multimea C
for(i = 0; i < n; i++) c[i]=a[i];
k = n;
02.12.2016 Programarea calculatoarelor 104
copyright@www.adrian.runceanu.ro
Probleme rezolvate – tablouri unidimensionale
for(j = 0; j < m; j++)
{
ok = 1; // variabila care verifica daca un element apartine sau
un multimii A
for(i = 0; i <n ;i++)
if(b[j] == a[i]) // daca elementul din multimea B apartine si
multimii A atunci nu-l adaugam in multimea reuniune - C
ok = 0;
if(ok == 1)
{
k++;
c[k] = b[j];
}
} 02.12.2016 Programarea calculatoarelor 105
copyright@www.adrian.runceanu.ro
Probleme rezolvate – tablouri unidimensionale
cout<<"nElementele multimii reuniune sunt : n";
for(i = 0; i < k; i++)
{
cout.width(9);
cout<<c[i];
}
}
02.12.2016 Programarea calculatoarelor 106
copyright@www.adrian.runceanu.ro
Probleme rezolvate – tablouri unidimensionale
Executia programului pe o serie de date de test:
02.12.2016 Programarea calculatoarelor 107
copyright@www.adrian.runceanu.ro
Probleme propuse spre rezolvate – tablouri
unidimensionale
1. Intersectia a doua multimi
Sa se scrie un program care sa calculeze
intersectia a doua multimi de cate n, respectiv m
numere intregi memorate cu ajutorul vectorilor.
Exemplu:
02.12.2016 Programarea calculatoarelor 108
Date de intrare:
n = 5 a = {1, 2, 5, 7, 12} si
m = 4 b = {2, 4, 8, 12}
Date de iesire:
se obtine: k = 2 d = {2, 12}
copyright@www.adrian.runceanu.ro
Probleme propuse spre rezolvate – tablouri
unidimensionale
2. Diferența a două mulțimi
Sa se scrie un program care sa calculeze
diferenta a doua multimi de cate n, respectiv m
numere intregi memorate cu ajutorul vectorilor.
Exemplu:
02.12.2016 Programarea calculatoarelor 109
Date de intrare:
n = 5 a = {1, 2, 5, 7, 12} si
m = 4 b = {2, 4, 8, 12}
Date de iesire:
se obtine: k = 3 e = {1, 5, 7}
copyright@www.adrian.runceanu.ro
Probleme propuse spre rezolvate – tablouri
unidimensionale
3. Se dă un şir de n numere naturale. Să se afişeze
pe două randuri, pe primul rand cele pare şi pe al
doilea cele impare.
Exemplu:
02.12.2016 Programarea calculatoarelor 110
Date de intrare:
Pentru n = 10
si elementele 4 3 2 5 6 8 9 0 1 5
Date de iesire:
4 2 6 8 0
3 5 9 1 5
copyright@www.adrian.runceanu.ro
Probleme propuse spre rezolvate – tablouri
unidimensionale
4. Sa se scrie un program care sa introducă n
numere intr-un vector şi să citeasccă un număr d.
Să se afişeze acele numere din şirul dat care sunt
divizibile cu d.
Exemplu:
02.12.2016 Programarea calculatoarelor 111
Date de intrare:
n=5 si valorile: 5 7 10 23 15, d=5
Date de iesire:
5 10 15
copyright@www.adrian.runceanu.ro
Probleme propuse spre rezolvate – tablouri
unidimensionale
5. Se introduc temperaturile măsurate in n zile. Să
se scrie un program care să afişeze media
temperaturilor negative şi media celor pozitive.
Exemplu:
02.12.2016 Programarea calculatoarelor 112
Date de intrare:
n = 5 si temperaturile: 23 24 23 25 22
Date de iesire:
23.40
copyright@www.adrian.runceanu.ro
Pentru alte informații teoretice și aplicative legate
de acest capitol se recomandă următoarele referințe
bibliografice:
1. Adrian Runceanu, Mihaela Runceanu, Noțiuni de
programare în limbajul C++, Editura Academica
Brâncuși, Târgu-Jiu, 2012 (www.utgjiu.ro/editura)
2. Adrian Runceanu, Programarea şi utilizarea
calculatoarelor, Editura Academica Brâncuși, Târgu-Jiu,
2003 (www.utgjiu.ro/editura)
3. Octavian Dogaru, C++ - teorie şi practică, volumul I,
Editura Mirton, Timişoara, 2004
(www.utgjiu.ro/editura)
02.12.2016 Programarea calculatoarelor 113
copyright@www.adrian.runceanu.ro
“First, solve the problem. Then, write
the code.”
- John Johnson
02.12.2016 Programarea Calculatoarelor - curs 114

More Related Content

Viewers also liked

Maximo camacho bandera 18969013
Maximo camacho bandera 18969013 Maximo camacho bandera 18969013
Maximo camacho bandera 18969013
Diego Hernández
 
Guia8compromisos
Guia8compromisosGuia8compromisos
Guia8compromisos
Esther Segovia
 
Presentacion hsa region del libertador bernardo o`higgins
Presentacion hsa region del libertador bernardo o`higginsPresentacion hsa region del libertador bernardo o`higgins
Presentacion hsa region del libertador bernardo o`higgins
vidasindical
 
Service gestión pre coloquio
Service gestión pre coloquioService gestión pre coloquio
Service gestión pre coloquio
Sebastián Grau
 
Las principales causas de las manchas marrones y el oscurecimiento del piel
Las principales causas de las manchas marrones y el oscurecimiento del pielLas principales causas de las manchas marrones y el oscurecimiento del piel
Las principales causas de las manchas marrones y el oscurecimiento del piel
Dermatologia Estetica - Blanqueamiento de la Piel
 
Crisis ecuador
Crisis ecuadorCrisis ecuador
Crisis ecuador
viviana loza
 
Práctica de word
Práctica de wordPráctica de word
Práctica de word
Ramiro Fárez Peñafiel
 
Cultura sociedad y comunicacindigital
Cultura sociedad y comunicacindigitalCultura sociedad y comunicacindigital
Cultura sociedad y comunicacindigital
Josmari Jauregui
 
01 trabajo colaborativo
01 trabajo colaborativo01 trabajo colaborativo
01 trabajo colaborativo
hectortorreslima
 
Mapas progresoperu
Mapas progresoperuMapas progresoperu
Mapas progresoperu
Esther Segovia
 
Teoria
TeoriaTeoria
Teoria
desax100
 
Informe ejecutivo – fase 2 (configuracion e instalacion de sistemas operativos )
Informe ejecutivo – fase 2 (configuracion e instalacion de sistemas operativos )Informe ejecutivo – fase 2 (configuracion e instalacion de sistemas operativos )
Informe ejecutivo – fase 2 (configuracion e instalacion de sistemas operativos )
francisco avendaño de la hoz
 
mi disertacion sobre Starkid Productions!
mi disertacion sobre Starkid Productions!mi disertacion sobre Starkid Productions!
mi disertacion sobre Starkid Productions!
MartiRamos
 
Yo creo en ti
Yo creo en tiYo creo en ti
Yo creo en ti
Inspira y Avanza
 
Binary search
Binary searchBinary search
Binary search
Muhammad Salman
 
Discurso de la puente
Discurso de la puenteDiscurso de la puente
Discurso de la puente
vidasindical
 
Meditação
MeditaçãoMeditação
semiotica
semioticasemiotica
Justica
JusticaJustica
Hardwarevs software2016
Hardwarevs software2016Hardwarevs software2016
Hardwarevs software2016
Jessy Lorein Barreno
 

Viewers also liked (20)

Maximo camacho bandera 18969013
Maximo camacho bandera 18969013 Maximo camacho bandera 18969013
Maximo camacho bandera 18969013
 
Guia8compromisos
Guia8compromisosGuia8compromisos
Guia8compromisos
 
Presentacion hsa region del libertador bernardo o`higgins
Presentacion hsa region del libertador bernardo o`higginsPresentacion hsa region del libertador bernardo o`higgins
Presentacion hsa region del libertador bernardo o`higgins
 
Service gestión pre coloquio
Service gestión pre coloquioService gestión pre coloquio
Service gestión pre coloquio
 
Las principales causas de las manchas marrones y el oscurecimiento del piel
Las principales causas de las manchas marrones y el oscurecimiento del pielLas principales causas de las manchas marrones y el oscurecimiento del piel
Las principales causas de las manchas marrones y el oscurecimiento del piel
 
Crisis ecuador
Crisis ecuadorCrisis ecuador
Crisis ecuador
 
Práctica de word
Práctica de wordPráctica de word
Práctica de word
 
Cultura sociedad y comunicacindigital
Cultura sociedad y comunicacindigitalCultura sociedad y comunicacindigital
Cultura sociedad y comunicacindigital
 
01 trabajo colaborativo
01 trabajo colaborativo01 trabajo colaborativo
01 trabajo colaborativo
 
Mapas progresoperu
Mapas progresoperuMapas progresoperu
Mapas progresoperu
 
Teoria
TeoriaTeoria
Teoria
 
Informe ejecutivo – fase 2 (configuracion e instalacion de sistemas operativos )
Informe ejecutivo – fase 2 (configuracion e instalacion de sistemas operativos )Informe ejecutivo – fase 2 (configuracion e instalacion de sistemas operativos )
Informe ejecutivo – fase 2 (configuracion e instalacion de sistemas operativos )
 
mi disertacion sobre Starkid Productions!
mi disertacion sobre Starkid Productions!mi disertacion sobre Starkid Productions!
mi disertacion sobre Starkid Productions!
 
Yo creo en ti
Yo creo en tiYo creo en ti
Yo creo en ti
 
Binary search
Binary searchBinary search
Binary search
 
Discurso de la puente
Discurso de la puenteDiscurso de la puente
Discurso de la puente
 
Meditação
MeditaçãoMeditação
Meditação
 
semiotica
semioticasemiotica
semiotica
 
Justica
JusticaJustica
Justica
 
Hardwarevs software2016
Hardwarevs software2016Hardwarevs software2016
Hardwarevs software2016
 

Similar to Lecture4 - PC

baze c++sructura unui program declarare variabilepdf.
baze c++sructura unui program declarare variabilepdf.baze c++sructura unui program declarare variabilepdf.
baze c++sructura unui program declarare variabilepdf.
AdrianaDanielaCupsa
 
C++
C++C++
Tutorial C++
Tutorial C++Tutorial C++
Tutorial C++
Anca Ciubotaru
 
Curs Visual c++
Curs Visual c++Curs Visual c++
Curs Visual c++
Apolo Apolo
 
Curs C++
Curs C++Curs C++
Curs C++
Apolo Apolo
 
Aplicatii iunie2004.ppt
Aplicatii iunie2004.pptAplicatii iunie2004.ppt
Aplicatii iunie2004.ppt
Mihai277302
 
manual-de-programare-c
manual-de-programare-cmanual-de-programare-c
manual-de-programare-cSerghei Urban
 
functii in Excel
functii in Excelfunctii in Excel
functii in Excelmirela.jipa
 
Tema2final
Tema2finalTema2final
Tema2final
mirela.jipa
 
utilizarea functiilor in Excel
utilizarea functiilor in Excelutilizarea functiilor in Excel
utilizarea functiilor in Excelmirela.jipa
 
E d informatica_2020_sp_sn_c_var_test_02
E d informatica_2020_sp_sn_c_var_test_02E d informatica_2020_sp_sn_c_var_test_02
E d informatica_2020_sp_sn_c_var_test_02
Ovidiu Dumitrescu
 

Similar to Lecture4 - PC (13)

baze c++sructura unui program declarare variabilepdf.
baze c++sructura unui program declarare variabilepdf.baze c++sructura unui program declarare variabilepdf.
baze c++sructura unui program declarare variabilepdf.
 
Lucr2
Lucr2Lucr2
Lucr2
 
Cap02
Cap02Cap02
Cap02
 
C++
C++C++
C++
 
Tutorial C++
Tutorial C++Tutorial C++
Tutorial C++
 
Curs Visual c++
Curs Visual c++Curs Visual c++
Curs Visual c++
 
Curs C++
Curs C++Curs C++
Curs C++
 
Aplicatii iunie2004.ppt
Aplicatii iunie2004.pptAplicatii iunie2004.ppt
Aplicatii iunie2004.ppt
 
manual-de-programare-c
manual-de-programare-cmanual-de-programare-c
manual-de-programare-c
 
functii in Excel
functii in Excelfunctii in Excel
functii in Excel
 
Tema2final
Tema2finalTema2final
Tema2final
 
utilizarea functiilor in Excel
utilizarea functiilor in Excelutilizarea functiilor in Excel
utilizarea functiilor in Excel
 
E d informatica_2020_sp_sn_c_var_test_02
E d informatica_2020_sp_sn_c_var_test_02E d informatica_2020_sp_sn_c_var_test_02
E d informatica_2020_sp_sn_c_var_test_02
 

Lecture4 - PC

  • 3. copyright@www.adrian.runceanu.ro 4. Structura unui program C/C++ 4.1. Preprocesare 4.2. Structura unui program C++ 4.3. Baze de numeraţie 4.4. Conversia din baza 2 în bazele 8 şi 16 şi invers 4.4.1. Conversia din baza 2 în baza 8 şi invers 4.4.2. Conversia din baza 2 în baza 16 şi invers 4.4.3. Operaţii aritmetice în binar, octal, hexazecimal 4.5. Probleme propuse spre rezolvare 02.12.2016 Programarea calculatoarelor 3
  • 4. copyright@www.adrian.runceanu.ro 4.1. Preprocesare 02.12.2016 Programarea calculatoarelor 4 Schematic, parcursul unui program sursa scris în C++, până la executarea lui este următorul: program sursa iniţial ( extensia .CPP ) preprocesare program sursă ( extensia .CPP ) compilare program obiect ( extensia .OBJ ) editarea de legături (linkeditare) program executabil ( extensia .EXE )
  • 5. copyright@www.adrian.runceanu.ro 4.1. Preprocesare În C++, după construirea unui program sursă, se pot evalua anumite valori dacă se utilizează preprocesorul. Activitatea preprocesorului se împarte în: a) includere de fişiere standard / utilizator b) definire constante simbolice c) definire macro-uri(macroinstructiuni) d) compilare condiţionată 02.12.2016 Programarea calculatoarelor 5
  • 6. copyright@www.adrian.runceanu.ro 4.1. Preprocesare a) Includerea de fişiere standard/utilizator se face pentru a putea: utiliza funcţiile predefinite ale limbajului C++ care se afla în fişiere standard numite header-e (au extensia .h) sau pentru a putea utiliza funcţii proprii aflate în fişiere utilizator 02.12.2016 Programarea calculatoarelor 6
  • 7. copyright@www.adrian.runceanu.ro 4.1. Preprocesare Astfel, pentru a putea utiliza funcţiile standard de intrare / ieşire cin / cout, trebuie scris la începutul unui program C++: #include <iostream.h> - fişier standard Iar pentru a utiliza fişiere utilizator: #include “nume fisier” – fişier utilizator Observaţie: Includerea fişierelor se execută numai pe timpul compilării 02.12.2016 Programarea calculatoarelor 7
  • 8. copyright@www.adrian.runceanu.ro 4.1. Preprocesare b) Definire constante simbolice Pentru a mări portabilitatea programelor C++, se pot folosi constante. O constantă este un nume pe care compilatorul C++ îl asociază unei valori care nu se modifică. Pentru aceasta se utilizează directiva #define. 02.12.2016 Programarea calculatoarelor 8
  • 9. copyright@www.adrian.runceanu.ro 4.1. Preprocesare • Asociază numelui nume_constanta textul denumit text care se poate prelungi pe mai linii. • Aceasta substituţie a numelui este valabilă în tot fişierul până la întâlnirea unei directive de compilare #undef nume. 02.12.2016 Programarea calculatoarelor 9 #define nume_constanta text
  • 10. copyright@www.adrian.runceanu.ro 4.1. Preprocesare Exemplu: #define NRLINII 30 #define NRCOLOANE 20 #define DIMENSIUNE NRLINII*NRCOLOANE int t[NRLINII][NRCOLOANE]; double a[DIMENSIUNE]; Ce va întâlni compilatorul după preprocesor? int t[30][20]; double a[30*20]; Observaţie: nu se vor face calculele pentru că este vorba doar de informatie la nivel de text 02.12.2016 Programarea calculatoarelor 10
  • 11. copyright@www.adrian.runceanu.ro 4.1. Preprocesare Dacă se vor utiliza macroinstrucţiuni sau constante simbolice în programele C++, atunci acestea trebuie să aibă nume sugestive şi scrise cu litere mari pentru a putea ajuta programatorii care citesc codul sursă să facă diferenţa uşor între constante şi variabile. Exemplu: Putem defini următoarele constante: #define TRUE 1 #define FALSE 0 #define PI 3.1415 #define PROGRAMATOR “Pop Ion” 02.12.2016 Programarea calculatoarelor 11
  • 12. copyright@www.adrian.runceanu.ro 4.1. Preprocesare c) Definirea de macroinstrucţiuni Un macrou (o macroinstrucţiune) este o definiţie în care funcţionează reguli de subtituţie de text. Apelul macroului se face astfel: 02.12.2016 Programarea calculatoarelor 12 #define nume(param_form1, param_form2, . . . ,param_formn) text nume(param_actual1, param_actual2,…,param_actualn)
  • 13. copyright@www.adrian.runceanu.ro 4.1. Preprocesare Unde: • nume reprezintă numele macroului • param_form1, param_form2, . . . , param_formn parametrii formali ai macroului • iar text este textul în care se vor face înlocuirile • iar param_actual1, param_actual2, . . . , param_actualn sunt parametrii cu care se apelează macroul în funcţia principală02.12.2016 Programarea calculatoarelor 13
  • 14. copyright@www.adrian.runceanu.ro 4.1. Preprocesare Funcţionarea macroului este următoarea: 1. în textul dat se înlocuiesc parametrii formali cu parametrii actuali 2. iar apoi textul obţinut va substitui apelul macroului. Exemplu: #define MAX(a, b) ( (a) < (b) ? (b) : (a) ) #define MIN(a, b) ( (a) > (b) ? (b) : (a) ) #define SGN(x) ((x) > 0 ? 1 : ( (x) == 0 ? 0 : (-1))) 02.12.2016 Programarea calculatoarelor 14
  • 15. copyright@www.adrian.runceanu.ro 4.1. Preprocesare Am definit câteva macrouri care pot fi utile în multe programe C++, şi anume: • MAX şi MIN determină maximul, respectiv minimul a două numere de orice tip • iar SGN determină signatura unui număr dat 02.12.2016 Programarea calculatoarelor 15
  • 16. copyright@www.adrian.runceanu.ro 4.1. Preprocesare Următorul program C++ va folosi aceste două macro-uri: 02.12.2016 Programarea calculatoarelor 16 #include<iostream.h> #define MAX(a, b) ( (a) < (b) ? (b) : (a) ) #define MIN(a, b) ( (a) > (b) ? (b) : (a) ) int main(void) { cout<<“Maximul valorilor 10.0 si 25.0 este “ <<MAX(10.0, 25.0)<<endl; cout<<“Minimul valorilor 3.4 si 3.1 este ” <<MIN(3.4, 3.1)<<endl; } a, b parametri formali parametri actuali
  • 17. copyright@www.adrian.runceanu.ro 4. Structura unui program C/C++ 4.1. Preprocesare 4.2. Structura unui program C++ 4.3. Baze de numeraţie 4.4. Conversia din baza 2 în bazele 8 şi 16 şi invers 4.4.1. Conversia din baza 2 în baza 8 şi invers 4.4.2. Conversia din baza 2 în baza 16 şi invers 4.4.3. Operaţii aritmetice în binar, octal, hexazecimal 4.5. Probleme propuse spre rezolvare 02.12.2016 Programarea calculatoarelor 17
  • 18. copyright@www.adrian.runceanu.ro 4.2. Structura unui program C++ /*-- nume.cpp -- comentariu iniţial --*/ #include <iostream.h> #include <math.h> . . . . /*-- alte directive include --*/ [ declaraţii şi definiţii globale ] int main(void) { [ declaraţii locale ] < instrucţiuni > } 02.12.2016 Programarea calculatoarelor 18 optional
  • 19. copyright@www.adrian.runceanu.ro 4.2. Structura unui program C++ 02.12.2016 Programarea calculatoarelor 19
  • 20. copyright@www.adrian.runceanu.ro 4. Structura unui program C/C++ 4.1. Preprocesare 4.2. Structura unui program C++ 4.3. Baze de numeraţie 4.4. Conversia din baza 2 în bazele 8 şi 16 şi invers 4.4.1. Conversia din baza 2 în baza 8 şi invers 4.4.2. Conversia din baza 2 în baza 16 şi invers 4.4.3. Operaţii aritmetice în binar, octal, hexazecimal 4.5. Probleme propuse spre rezolvare 02.12.2016 Programarea calculatoarelor 20
  • 21. copyright@www.adrian.runceanu.ro 4.3. Baze de numeraţie Baza de numeraţie 2 (sistemul BINAR) Ca în orice bază de numeraţie, cifrele folosite în reprezentarea numerelor sunt cuprinse în intervalul: [0, baza-1] Rezultă că în baza 2 avem o reprezentare a numerelor folosind doar cifrele 0 şi 1. Fiecare dintre cifrele semnificative ale unei baze de numeraţie poartă denumirea de digit. În baza 2 deoarece sunt doar doi digiţi posibili aceştia au preluat denumirea de binary digit (bit). De aici provenienţa cuvântului bit. 02.12.2016 Programarea calculatoarelor 21
  • 22. copyright@www.adrian.runceanu.ro 4.3. Baze de numeraţie În baza 10 aceste cifre sunt 0...9. Alte baze de numeraţie folosite în legătură cu sistemul binar sunt: 4, 8 (octal) şi 16 (hexazecimal). Pentru baza 16 cifrele de reprezentare sunt: 0 . . 9 şi A . . F S-a convenit folosirea primelor litere ale alfabetului, cu semnificaţia: A ţine locul lui 10 B lui 11 C lui 12 D lui 13 E lui 14 F lui 1502.12.2016 Programarea calculatoarelor 22
  • 23. copyright@www.adrian.runceanu.ro 4.3. Baze de numeraţie În calculatoarele actuale baza de numeraţie este 2. Au existat încercări de creare a unor calculatoare în bază 10, dar nu s-au putut ridica la performanţele calculatoarelor binare. S-a păstrat astfel sistemul binar ca standard pentru calculatoarele digitale. 02.12.2016 Programarea calculatoarelor 23
  • 24. copyright@www.adrian.runceanu.ro 4.3. Baze de numeraţie Să luăm un exemplu de număr în baza 2: 0110 1101 Ce înseamnă acesta? Cum poate fi interpretat astfel încât să poată fi înţeles de către noi (adică tradus în baza 10)? La aceste întrebări se răspunde plecând de la regula de reprezentare în orice bază de numeraţie (poziţională): fiecărei poziţii în număr îi corespunde o putere a acelei baze de numeraţie. 02.12.2016 Programarea calculatoarelor 24
  • 25. copyright@www.adrian.runceanu.ro 4.3. Baze de numeraţie Astfel:  primei poziţii din dreapta îi corespunde puterea 0 a lui 2,  următoarei poziţii îi corespunde puterea 1 a lui 2,  iar ultimei poziţii (prima din stânga) îi corespunde puterea 7 a lui 2. Atunci putem genera valoarea acestui număr în baza 10 - plecând de la dreapta spre stânga - astfel: 1*20 + 0*21 + 1*22 + 1*23 + 0*24 + 1*25 + 1*26 + 0*27 = = 1 + 4 + 8 + 32 + 64 = 10910 02.12.2016 Programarea calculatoarelor 25
  • 26. copyright@www.adrian.runceanu.ro 4.3. Baze de numeraţie La fel procedăm cu un număr în baza 10 când dorim să-i aflăm valoarea. Dar, în baza 10 interpretăm natural şi aproape instantaneu orice număr, care ne sugerează şi o puternică semnificaţie "cantitativă" (adică mărimea acelui număr). Exemplu: 57810 = 8*100 + 7*101 + 5*102 = 8 + 70 + 500 Ştim imediat că avem de-a face cu 'cinci sute şaptezeci şi opt' şi că acesta se situează cam la jumătatea intervalului [0-1000]. 02.12.2016 Programarea calculatoarelor 26
  • 27. copyright@www.adrian.runceanu.ro 4.3. Baze de numeraţie Notații: Bitul se notează cu b. Combinaţia de 8 biţi succesivi se numeşte Byte (octet) şi este reprezentat prin litera B 02.12.2016 Programarea calculatoarelor 27
  • 28. copyright@www.adrian.runceanu.ro 4.3. Baze de numeraţie Într-un număr în baza 2 sunt importante două poziţii: Prima din dreapta - care poartă denumirea de Least Significant bit (LSb) Prima din stânga - care poartă denumirea de Most Significant bit (MSb) Poziţia MSb are de obicei rolul de semn al numărului: 0 are semnificaţia de plus 1 are semnificaţia de minus 02.12.2016 Programarea calculatoarelor 28
  • 29. copyright@www.adrian.runceanu.ro 4. Structura unui program C/C++ 4.1. Preprocesare 4.2. Structura unui program C++ 4.3. Baze de numeraţie 4.4. Conversia din baza 2 în bazele 8 şi 16 şi invers 4.4.1. Conversia din baza 2 în baza 8 şi invers 4.4.2. Conversia din baza 2 în baza 16 şi invers 4.4.3. Operaţii aritmetice în binar, octal, hexazecimal 4.5. Probleme propuse spre rezolvare 02.12.2016 Programarea calculatoarelor 29
  • 30. copyright@www.adrian.runceanu.ro 4.4.1. Conversia din baza 2 în baza 8 şi invers Ştim că sistemele de numeraţie octal (baza 8) şi hexazecimal (baza 16) au particularitatea de a folosi ca bază un număr (8 sau 16) care rezultă din ridicarea la puterea a 3-a sau a 4-a a cifrei 2, astfel între cele trei sisteme de numeraţie se pot stabili compatibilităţi directe. 02.12.2016 Programarea calculatoarelor 30
  • 31. 4.4.1. Conversia din baza 2 în baza 8 şi invers Astfel, conversia octal-binar şi binar-octal porneşte de la faptul că orice cifră octală se poate reprezenta prin 3 cifre binare: 0 = 000 4 = 100 1 = 001 5 = 101 2 = 010 6 = 110 3 = 011 7 = 111 02.12.2016 Programarea calculatoarelor 31
  • 32. copyright@www.adrian.runceanu.ro 4.4.1. Conversia din baza 2 în baza 8 şi invers Dacă se consideră un număr octal, pentru conversia în binar se va scrie fiecare cifră octală prin 3 cifre binare. Exemplu : (3 4 7, 5)8 = (011 100 111, 101 )2 02.12.2016 Programarea calculatoarelor 32
  • 33. copyright@www.adrian.runceanu.ro 4.4.1. Conversia din baza 2 în baza 8 şi invers Dacă se consideră un număr binar, pentru conversia în octal se vor grupa câte 3 cifre binare pornind de la poziţia virgulei spre stânga pentru partea întreagă, respectiv dreapta pentru partea fracţionară, găsind corespondentul în octal. Exemplu: ( 001 110 011 101 , 101 100 )2 = (1635,54)8 1 6 3 5 5 4 02.12.2016 Programarea calculatoarelor 33
  • 34. copyright@www.adrian.runceanu.ro 4. Structura unui program C/C++ 4.1. Preprocesare 4.2. Structura unui program C++ 4.3. Baze de numeraţie 4.4. Conversia din baza 2 în bazele 8 şi 16 şi invers 4.4.1. Conversia din baza 2 în baza 8 şi invers 4.4.2. Conversia din baza 2 în baza 16 şi invers 4.4.3. Operaţii aritmetice în binar, octal, hexazecimal 4.5. Probleme propuse spre rezolvare 02.12.2016 Programarea calculatoarelor 34
  • 35. 4.4.2. Conversia din baza 2 în baza 16 şi invers La fel se poate proceda şi în cazul conversiei binar - hexazecimal, orice cifra hexazecimală putându-se reprezenta prin patru cifre binare: 0 = 0000 4 = 0100 8 = 1000 C = 1100 1 = 0001 5 = 0101 9 = 1001 D = 1101 2 = 0010 6 = 0110 A = 1010 E = 1110 3 = 0011 7 = 0111 B = 1011 F = 1111 02.12.2016 Programarea calculatoarelor 35
  • 36. copyright@www.adrian.runceanu.ro 4.4.2. Conversia din baza 2 în baza 16 şi invers Exemple: ( 5 A F 4, 3 E)16 = (0101 1010 1111 0100, 0011 1110)2 02.12.2016 Programarea calculatoarelor 36
  • 37. copyright@www.adrian.runceanu.ro 4.4.2. Conversia din baza 2 în baza 16 şi invers ( 10 0110 1011 1100, 0011 1101 11 )2 = ( 26BC,3DC )16 2 6 B C 3 D C 02.12.2016 Programarea calculatoarelor 37
  • 38. copyright@www.adrian.runceanu.ro 4. Structura unui program C/C++ 4.1. Preprocesare 4.2. Structura unui program C++ 4.3. Baze de numeraţie 4.4. Conversia din baza 2 în bazele 8 şi 16 şi invers 4.4.1. Conversia din baza 2 în baza 8 şi invers 4.4.2. Conversia din baza 2 în baza 16 şi invers 4.4.3. Operaţii aritmetice în binar, octal, hexazecimal 4.5. Probleme propuse spre rezolvare 02.12.2016 Programarea calculatoarelor 38
  • 39. 4.4.3. Operaţii aritmetice în binar, octal, hexazecimal a) Operaţii aritmetice în binar: Unde ‘*’ semnifică un împrumut de la poziţia imediat următoare a descăzutului, care pentru poziţia curentă înseamnă 2 (deci se interpretează 2 - 1 = 1). adunare înmulţire scădere 0 + 0 = 0 0  0 = 0 0 – 0 = 0 0 + 1 = 1 0  1 = 0 1 – 0 = 1 1 + 0 = 1 1  0 = 0 1 – 1 = 0 1 + 1 = 10 1  1 = 1 0 – 1 = 1* 02.12.2016 Programarea calculatoarelor 39
  • 40. 4.4.3. Operaţii aritmetice în binar, octal, hexazecimal Exemple de operaţii în binar: 11101101,101 + 1011010,001 1000101,110 - 111010,011 101000111,110 1011,011 110,11  10,11 11011 11011 00000 11011 10010,1001 02.12.2016 Programarea calculatoarelor 40
  • 41. 4.4.3. Operaţii aritmetice în binar, octal, hexazecimal b) Operaţii aritmetice în octal: + 0 1 2 3 4 5 6 7 0 0 1 2 3 4 5 6 7 1 1 2 3 4 5 6 7 10 2 2 3 4 5 6 7 10 11 3 3 4 5 6 7 10 11 12 4 4 5 6 7 10 11 12 13 5 5 6 7 10 11 12 13 14 6 6 7 10 11 12 13 14 15 7 7 10 11 12 13 14 15 16  0 1 2 3 4 5 6 7 0 0 0 0 0 0 0 0 0 1 0 1 2 3 4 5 6 7 2 0 2 4 6 10 12 14 16 3 0 3 6 11 14 17 22 25 4 0 4 10 14 20 24 30 34 5 0 5 12 17 24 31 36 43 6 0 6 14 22 30 36 44 52 7 0 7 16 25 34 43 52 61 02.12.2016 Programarea calculatoarelor 41
  • 42. copyright@www.adrian.runceanu.ro 4.4.3. Operaţii aritmetice în binar, octal, hexazecimal Exemple de operaţii în octal: Se ţine seama de următoarele reguli: • La adunare şi înmulţire rezultatul va fi constituit din restul împărţirii sumei sau produsului la bază, câtul constituind transportul pentru poziţia următoare • La scădere, un împrumut de la poziţia următoare a numărului înseamnă adunarea la descăzutul poziţiei curente, a bazei de numeraţie 02.12.2016 Programarea calculatoarelor 42
  • 43. copyright@www.adrian.runceanu.ro 4.4.3. Operaţii aritmetice în binar, octal, hexazecimal 1475,367+ 562,51 34022,56 – 1234,25 2260,077 32566,31 357,26  3,7 321332 131602 1637,352 02.12.2016 Programarea calculatoarelor 43
  • 44. 4.4.3. Operaţii aritmetice în binar, octal, hexazecimal c) Operaţii aritmetice în hexazecimal: + 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 0 1 2 3 4 5 6 7 8 9 A B C D E F 1 1 2 3 4 5 6 7 8 9 A B C D E F 10 2 2 3 4 5 6 7 8 9 A B C D E F 10 11 3 3 4 5 6 7 8 9 A B C D E F 10 11 12 4 4 5 6 7 8 9 A B C D E F 10 11 12 13 5 5 6 7 8 9 A B C D E F 10 11 12 13 14 6 6 7 8 9 A B C D E F 10 11 12 13 14 15 7 7 8 9 A B C D E F 10 11 12 13 14 15 16 8 8 9 A B C D E F 10 11 12 13 14 15 16 17 9 9 A B C D E F 10 11 12 13 14 15 16 17 18 A A B C D E F 10 11 12 13 14 15 16 17 18 19 B B C D E F 10 11 12 13 14 15 16 17 18 19 1A C C D E F 10 11 12 13 14 15 16 17 18 19 1A 1B D D E F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C E E F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D F F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 02.12.2016 Programarea calculatoarelor 44
  • 45. copyright@www.adrian.runceanu.ro 4.4.3. Operaţii aritmetice în binar, octal, hexazecimal  0 1 2 3 4 5 6 7 8 9 A B C D E F 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 2 3 4 5 6 7 8 9 A B C D E F 2 0 2 4 6 8 A C E 10 12 14 16 18 1A 1C 1E 3 0 3 6 9 C F 12 15 18 1B 1E 21 24 27 2A 2D 4 0 4 8 C 10 14 18 1C 20 24 28 2C 30 34 38 3C 5 0 5 A F 14 19 1E 23 28 2D 32 37 3C 41 46 4B 6 0 6 C 12 18 1E 24 2A 30 36 3C 42 48 4E 54 5A 7 0 7 E 15 1C 23 2A 31 38 3F 46 4D 54 5B 62 69 8 0 8 10 18 20 28 30 38 40 48 50 58 60 68 70 78 9 0 9 12 1B 24 2D 36 3F 48 51 5A 63 6C 75 7E 87 A 0 A 14 1E 28 32 3C 46 50 5A 64 6E 78 82 8C 96 B 0 B 16 21 2C 37 42 4D 58 63 6E 79 84 8F 9A A5 C 0 C 18 24 30 3C 48 54 60 6C 78 84 90 9C A8 B4 D 0 D 1A 27 34 41 4E 5B 68 75 82 8F 9C A9 B6 C3 E 0 E 1C 2A 38 46 54 62 70 7E 8C 9A A8 B6 C4 D2 F 0 F 1E 2D 3C 4B 5A 69 78 87 96 A5 B4 C3 D2 E1 02.12.2016 Programarea calculatoarelor 45
  • 46. 4.4.3. Operaţii aritmetice în binar, octal, hexazecimal Exemple de operaţii în hexazecimal: AF59C + D8E2 F000 – 1 BCE7E EFFF 5DA2  B8 2ED10 405F6 434C70 02.12.2016 Programarea calculatoarelor 46
  • 47. copyright@www.adrian.runceanu.ro 4. Structura unui program C/C++ 4.1. Preprocesare 4.2. Structura unui program C++ 4.3. Baze de numeraţie 4.4. Conversia din baza 2 în bazele 8 şi 16 şi invers 4.4.1. Conversia din baza 2 în baza 8 şi invers 4.4.2. Conversia din baza 2 în baza 16 şi invers 4.4.3. Operaţii aritmetice în binar, octal, hexazecimal 4.5. Probleme propuse spre rezolvare 02.12.2016 Programarea calculatoarelor 47
  • 48. copyright@www.adrian.runceanu.ro 4.5. Probleme propuse spre rezolvare: 1. Să se convertească din sistemul binar în sistemul octal numerele reprezentate prin: (101,101)2 = ?8 (111000111,101)2 = ?8 (10110,1101)2 = ?8 2. Să se convertească din sistemul binar în sistemul hexazecimal numerele reprezentate prin: (110010,11011)2 = ?16 (111000111,101)2 = ?16 (10111111101)2 = ?16 02.12.2016 Programarea calculatoarelor 48
  • 49. copyright@www.adrian.runceanu.ro 4.5. Probleme propuse spre rezolvare: 3. Să se convertească din sistemul octal în sistemul binar numerele reprezentate prin: (173,236)8 = ?2 (153)8 = ?2 4. Să se convertească din sistemul hexazecimal în sistemul binar numerele reprezentate prin: (43,AC)16 = ?2 (1C8,B)16 = ?2 02.12.2016 Programarea calculatoarelor 49
  • 50. copyright@www.adrian.runceanu.ro 4.5. Probleme rezolvate 1) Se introduce un număr natural cu maxim 9 cifre. Să se determine şi să se afişeze numărul de cifre, cea mai mare cifră, cea mai mică cifră şi suma tuturor cifrelor acestui număr. Exemplu: 02.12.2016 Programarea calculatoarelor 50 Date de intrare: 24356103 Date de ieşire: Numarul de cifre 8 Cea mai mare cifra 6 Cea mai mica cifra 0 Suma cifrelor 24
  • 51. copyright@www.adrian.runceanu.ro #include<iostream.h> int main() { long int n; int nr_cifre=0; int min=100; int max=-100; int suma=0; int cifra; cout<<"Dati numarul (maxim 9 cifre) "; cin>>n; 02.12.2016 Programarea calculatoarelor 51 while(n!=0) { cifra=n%10; nr_cifre++; if(cif>max) max=cifra; if(cif<min) min=cifra; suma=suma+cifra; n=n/10; } cout<<"n numarul de cifre "<<nr_cifre; cout<<"n cea mai mare cifra "<<max; cout<<"n cea mai mica cifra "<<min; cout<<"n suma cifrelor "<<suma; }
  • 53. copyright@www.adrian.runceanu.ro 4.5. Probleme rezolvate 2) Dat un număr intreg de maxim 9 cifre, să se afişeze numărul de apariţii al fiecărei cifre. 02.12.2016 Programarea calculatoarelor 53 Exemplu: Date de intrare 364901211 Date de ieşire: 0 apare de 1 ori 1 apare de 3 ori 2 apare de 1 ori 3 apare de 1 ori 4 apare de 1 ori 5 apare de 0 ori 6 apare de 1 ori 7 apare de 0 ori 8 apare de 0 ori 9 apare de 1 ori
  • 54. copyright@www.adrian.runceanu.ro #include<iostream.h> int main() { long int n; int n0,n1,n2,n3,n4,n5,n6,n7,n8,n9; n0=n1=n2=n3=n4=n5=n6=n7=n8=n9=0; cout<<"Dati numarul (cu maxim9 cifre) = "; cin>>n; while(n!=0) { switch(n%10){ case 0: n0++;break; case 1: n1++;break; case 2: n2++;break; case 3: n3++;break; case 4: n4++;break; case 5: n5++;break; case 6: n6++;break; case 7: n7++;break; case 8: n8++;break; case 9: n9++;break; } n=n/10; }02.12.2016 Programarea calculatoarelor 54 cout<<"n 0 apare de "<<n0<<" ori"; cout<<"n 1 apare de "<<n1<<" ori"; cout<<"n 2 apare de "<<n2<<" ori"; cout<<"n 3 apare de "<<n3<<" ori"; cout<<"n 4 apare de "<<n4<<" ori"; cout<<"n 5 apare de "<<n5<<" ori"; cout<<"n 6 apare de "<<n6<<" ori"; cout<<"n 7 apare de "<<n7<<" ori"; cout<<"n 8 apare de "<<n8<<" ori"; cout<<"n 9 apare de "<<n9<<" ori"; }
  • 56. copyright@www.adrian.runceanu.ro 4. Tablouri 4.1. Generalități. Clasificare 4.2. Tablouri unidimensionale (vectori) 4.3. Tablouri bidimensionale (matrici) 4.4. Tablouri multidimensionale 02.12.2016 Programarea calculatoarelor 56
  • 57. copyright@www.adrian.runceanu.ro 4.1. Generalitati. Clasificare Numim tablou o colecţie de date de acelaşi tip, în care elementele sunt ordonate, iar accesul la fiecare element are loc prin indice. În funcţie de numărul indicilor avem mai multe tipuri de tablouri: 1. Tablouri unidimensionale (cu un singur indice) 2. Tablouri bidimensionale (cu doi indici) 3. Tablouri multidimensionale (cu mai mulţi indici) 02.12.2016 Programarea calculatoarelor 57
  • 58. copyright@www.adrian.runceanu.ro 4. Tablouri 4.1. Generalități. Clasificare 4.2. Tablouri unidimensionale (vectori) 4.3. Tablouri bidimensionale (matrici) 4.4. Tablouri multidimensionale 02.12.2016 Programarea calculatoarelor 58
  • 59. copyright@www.adrian.runceanu.ro 4.2. Tablouri unidimensionale (vectori) • Tablourile unidimensionale funcţionează ca un vector şi se pot declara astfel: • Se observă că este obligatorie folosirea parantezelor drepte care să încadreze dimensiunea maximă pe care o alege utilizatorul pentru acel tablou unidimensional. 02.12.2016 Programarea calculatoarelor 59 tip nume_tablou[dimensiune_maximă];
  • 60. copyright@www.adrian.runceanu.ro 4.2. Tablouri unidimensionale (vectori) Exemplu: Declarări de tablouri unidimensionale: 02.12.2016 Programarea calculatoarelor 60 int a[25]; // declararea unui tablou unidimensional cu maxim 25 de // elemente, fiecare de tip întreg float x[30]; // declararea unui tablou unidimensional cu maxim 30 de // elemente, fiecare de tip real simplă precizie char s[40]; // declararea unui tablou unidimensional cu maxim 40 de // elemente, fiecare de tip caracter
  • 61. copyright@www.adrian.runceanu.ro 4.2. Tablouri unidimensionale (vectori) • Compilatorul C++ alocă un spaţiu de memorie egal cu numărul maxim de elemente ale tabloului, rezervând bineînţeles octeţi în funcţie de tipul de bază al fiecărui tablou. • Accesul la fiecare element al tabloului se face prin numele acestuia urmat între paranteze, de indicele său (adică poziţia pe care o ocupă în tablou). • În limbajul C++, indicii tablourilor încep numărătoarea de la valoarea 0. 02.12.2016 Programarea calculatoarelor 61
  • 62. copyright@www.adrian.runceanu.ro 4.2. Tablouri unidimensionale (vectori) Exemplu: Modalităţi de acces la elementele ce pot fi memorate în tablourile unidimensionale declarate anterior: 02.12.2016 Programarea calculatoarelor 62 a[0] – reprezintă elementul aflat pe prima poziţie în tablou a[24] - reprezintă elementul aflat pe ultima poziţie în tablou x[i] - reprezintă elementul aflat pe poziţia i în tablou, unde i poate avea valori între 0 şi 29.
  • 63. copyright@www.adrian.runceanu.ro 4.2. Tablouri unidimensionale (vectori) Iniţializarea elementelor unui tablou se poate face total sau parţial la declararea lor: int b[5] = {1, 2, 3, 4, 5}; Astfel: • elementul b[0] are valoarea 1 • elementul b[1] are valoarea 2 • elementul b[2] are valoarea 3 • elementul b[3] are valoarea 4 • elementul b[4] are valoarea 5 02.12.2016 Programarea calculatoarelor 63
  • 64. copyright@www.adrian.runceanu.ro 4.2. Tablouri unidimensionale (vectori) Problema 1: Se consideră n numere reale. Se cere să se determine valoarea minimă şi valoarea maximă. Exemplu: 02.12.2016 Programarea calculatoarelor 64 Date de intrare: n=5 si x={10, -2, 34, -198, 4} Date de ieşire: minim=-198, maxim=34
  • 65. copyright@www.adrian.runceanu.ro 4.2. Tablouri unidimensionale (vectori) 02.12.2016 Programarea calculatoarelor 65 #include<iostream.h> int main(void) { int i, n; float x[50], min, max; cout<<"Dati numarul de elemente ale tabloului "; cin>>n; for( i = 0; i <=n; i++ ) { cout<<"x["<<i+1<<"]= "; cin>>x[i]; } Citirea elementelor si memorarea lor in vectorul x Citirea numarului de elemente ce vor fi prelucrate in vector - n
  • 66. copyright@www.adrian.runceanu.ro 4.2. Tablouri unidimensionale (vectori) min = x[0]; max = x[0]; for( i=1; i<n; i++ ) if( min > x[i] ) min = x[i]; else if( max < x[i] ) max = x[i]; cout<<"nMinimul este "<<min; cout<<"nMaximul este "<<max; } 02.12.2016 Programarea calculatoarelor 66 Determinarea minimului Determinarea maximului
  • 67. copyright@www.adrian.runceanu.ro 4.2. Tablouri unidimensionale (vectori) Executia programului pe o serie de date de test: 02.12.2016 Programarea calculatoarelor 67
  • 68. copyright@www.adrian.runceanu.ro 4.2. Tablouri unidimensionale (vectori) Problema 2: Se consideră n numere întregi. Se cere să se verifice dacă ele sunt sau nu în ordine crescătoare, afișând câte un mesaj corespunzător. Exemplu: 02.12.2016 Programarea calculatoarelor 68 Date de intrare: n=5 si x={1, 2, 17, 25, 43} Date de ieşire: Elemente vectorului sunt in ordine crescatoare
  • 69. copyright@www.adrian.runceanu.ro 4.2. Tablouri unidimensionale (vectori) #include<iostream.h> int main(void) { int i, n, verif=1; int x[50]; cout<<"Dati numarul de elemente ale tabloului X "; cin>>n; for(i=0; i<n; i++) { cout<<"x["<<i+1<<"]= "; cin>>x[i]; } 02.12.2016 Programarea calculatoarelor 69 Citirea numarului de elemente ce vor fi prelucrate in vector - n Citirea elementelor si memorarea lor in vectorul x
  • 70. copyright@www.adrian.runceanu.ro 4.2. Tablouri unidimensionale (vectori) for(i=0; i<=n-2; i++) if( x[i] > x[i+1] ) verif=0; if( verif == 1 ) cout<<"Numerele din tablou sunt in ordine CRESCATOARE"; else cout<<"Numerele din tablou NU sunt in ordine CRESCATOARE"; } 02.12.2016 Programarea calculatoarelor 70 Verificarea proprietatii cerute in enunt
  • 71. copyright@www.adrian.runceanu.ro 4.2. Tablouri unidimensionale (vectori) Executia programului pe doua serii de date de test: 02.12.2016 Programarea calculatoarelor 71
  • 72. copyright@www.adrian.runceanu.ro 4. Tablouri 4.1. Generalităţi. Clasificare 4.2. Tablouri unidimensionale (vectori) 4.3. Tablouri bidimensionale (matrici) 4.4. Tablouri multidimensionale 02.12.2016 Programarea calculatoarelor 72
  • 73. copyright@www.adrian.runceanu.ro 4.3. Tablouri bidimensionale (matrici) • Tablourile bidimensionale funcţionează ca o matrice şi se pot declara astfel: • La fel ca şi în cazul tablourilor unidimensionale, şi în cazul tablourilor bidimensionale, la declarare, se trece dimensiunea maximă a liniilor (dim_linie) şi dimensiunea maximă a coloanelor (dim_coloana). 02.12.2016 Programarea calculatoarelor 73 tip nume_tablou[dim_linie][dim_coloana];
  • 74. copyright@www.adrian.runceanu.ro 4.3. Tablouri bidimensionale (matrici) Exemplu: Declarări de tablouri bidimensionale: 02.12.2016 Programarea calculatoarelor 74 int a[10][10]; // declararea unui tablou bidimensional cu maxim 100 de // elemente (10*10), fiecare de tip întreg float x[5][5]; // declararea unui tablou bidimensional cu maxim 25 de // elemente(5*5), fiecare de tip real simplă precizie char s[20][10]; // declararea unui tablou bidimensional cu maxim 200 de // elemente(20*10), fiecare de tip caracter
  • 75. copyright@www.adrian.runceanu.ro 4.3. Tablouri bidimensionale (matrici) • Compilatorul C++ alocă un spaţiu de memorie egal cu numărul de linii înmulţit cu numărul de coloane ale tabloului, rezervând bineînţeles octeţi în funcţie de tipul de bază al fiecărui tablou. • Accesul la fiecare element al tabloului se face prin numele acestuia urmat între paranteze, de indicele liniei şi indicele coloanei (adică poziţia pe care o ocupă în tablou). 02.12.2016 Programarea calculatoarelor 75
  • 76. copyright@www.adrian.runceanu.ro 4.3. Tablouri bidimensionale (matrici) Exemplu: Modalităţi de acces la elementele ce pot fi memorate în tablourile bidimensionale declarate anterior: 02.12.2016 Programarea calculatoarelor 76 a[0][0] – reprezintă elementul aflat pe linia 0 coloana 0 a[9][9] - reprezintă elementul aflat pe linia 9 coloana 9 x[i][j] - reprezintă elementul aflat pe linia i, coloana j în matrice, unde i şi j pot avea valori între 0 şi 4.
  • 77. copyright@www.adrian.runceanu.ro 4.3. Tablouri bidimensionale (matrici) Iniţializarea elementelor unui tablou se poate face total sau parţial la declararea lor: int b[2][3]={ {1, 2, 3}, {4, 5, 6} }; Astfel: • elementul b[0][0] are valoarea 1 • elementul b[0][1] are valoarea 2 • elementul b[0][2] are valoarea 3 • elementul b[1][0] are valoarea 4 • elementul b[1][1] are valoarea 5 • elementul b[1][2] are valoarea 6 02.12.2016 Programarea calculatoarelor 77
  • 78. copyright@www.adrian.runceanu.ro 4.3. Tablouri bidimensionale (matrici) Problema 1: Se consideră o matrice A cu nm numere întregi. Se cere să se obţină transpusa sa. Exemplu: 02.12.2016 Programarea calculatoarelor 78 Date de intrare: n=3, m=4 si matricea A: 1 2 3 4 5 6 7 8 9 10 11 12 Date de ieşire: Matricea transpusa B: n=4 si m=3 1 5 9 2 6 10 3 7 11 4 8 12
  • 79. copyright@www.adrian.runceanu.ro 4.3. Tablouri bidimensionale (matrici) #include<iostream.h> int main(void) { int a[10][10], b[10][10]; int n, m, i, j; cout<<"Dati dimensiunile matricei A n"; cout<<"Dati numarul de linii n = "; cin>>n; cout<<"Dati numarul de coloane m = "; cin>>m; for(i=0; i<n; i++) for(j=0; j<m; j++) { cout<<"a["<<i+1<<", "<<j+1<<"] = "; cin>>a[i][j]; } 02.12.2016 Programarea calculatoarelor 79 Citirea numarului de linii – n si de coloane - m ale matricei Citirea elementelor si memorarea lor in matricea a
  • 80. copyright@www.adrian.runceanu.ro 4.3. Tablouri bidimensionale (matrici) cout<<"Elementele matricei A sunt : n"; for(i=0; i<n; i++) { for(j=0; j<m; j++) cout<<a[i][j]<<" "; cout<<"n"; } 02.12.2016 Programarea calculatoarelor 80 Afisarea elementelor din matricea a
  • 81. copyright@www.adrian.runceanu.ro 4.3. Tablouri bidimensionale (matrici) for(i=0; i<n; i++) for(j=0; j<m; j++) b[j][i] = a[i][j]; cout<<"Elementele matricei transpuse sunt n"; for(i=0; i<m; i++) { for(j=0; j<n; j++) cout<<b[i][j]<<" "; cout<< "n"; } } 02.12.2016 Programarea calculatoarelor 81 Construirea matricei transpuse prin transformarea liniilor in coloane si invers
  • 82. copyright@www.adrian.runceanu.ro 4.3. Tablouri bidimensionale (matrici) Executia programului pe o serie de date de test: 02.12.2016 Programarea calculatoarelor 82
  • 83. copyright@www.adrian.runceanu.ro 4.3. Tablouri bidimensionale (matrici) Problema 2: Se consideră două tablouri bidimensionale (matrici) A şi B cu nm numere întregi. Se cere să se calculeze matricea suma: C = A + B. 02.12.2016 Programarea calculatoarelor 83
  • 84. copyright@www.adrian.runceanu.ro 4.3. Tablouri bidimensionale (matrici) #include<iostream.h> int main(void) { int Matrice1 [10][10], Matrice2 [10][10], Matricesuma[10][10]; int i, j, n, m; cout<<"Dati dimensiunile primei matrici n"; cout<<"Dati numarul de linii n = "; cin>>n; cout<<"Dati numarul de coloane m = "; cin>>m; for(i=0; i<n; i++){ for(j=0; j<m; j++){ cout<<"Matrice1["<<i+1<<", "<<j+1<<"] = "; cin>>Matrice1[i][j]; } } 02.12.2016 Programarea calculatoarelor 84 Citirea numarului de linii – n si de coloane - m ale matricei Citirea elemente lor si memorar ea lor in prima matrice
  • 85. copyright@www.adrian.runceanu.ro 4.3. Tablouri bidimensionale (matrici) cout<<"Elementele primei matrici sunt : n"; for(i=0; i<n; i++) { for(j=0; j<m; j++) cout<<Matrice1[i][j]<<" "; cout<<"n"; } 02.12.2016 Programarea calculatoarelor 85 Afisarea elementelor din prima matrice
  • 86. copyright@www.adrian.runceanu.ro 4.3. Tablouri bidimensionale (matrici) for(i=0; i<n; i++){ for(j=0; j<m; j++){ cout<<"Matrice2["<<i<<", "<<j<<"] = "; cin>>Matrice2[i][j]; } } cout<<"Elementele celei de-a doua matrice sunt : n"; for(i=0; i<n; i++) { for(j=0; j<m; j++) cout<<Matrice2[i][j]<<" "; cout<<"n"; } 02.12.2016 Programarea calculatoarelor 86
  • 87. copyright@www.adrian.runceanu.ro 4.3. Tablouri bidimensionale (matrici) for(i=0; i<n; i++) for(j=0; j<m; j++) Matricesuma[i][j]=Matrice1[i][j]+Matrice2[i][j]; cout<<"Elementele matricii suma sunt : n"; for(i=0; i<n; i++) { for(j=0; j<m; j++) cout<<Matricesuma[i][j]<<" "; cout<<"n"; } } 02.12.2016 Programarea calculatoarelor 87 Construirea matricei suma prin adunarea valorilor pe linie si pe coloana
  • 88. copyright@www.adrian.runceanu.ro 4.3. Tablouri bidimensionale (matrici) Executia programului pe o serie de date de test: 02.12.2016 Programarea calculatoarelor 88
  • 89. copyright@www.adrian.runceanu.ro 4.3. Tablouri bidimensionale (matrici) Problema 3: Se consideră două tablouri bidimensionale (matrici) A şi B cu nm, respectiv mp numere întregi. Se cere să se calculeze matricea produs: C = A * B. 02.12.2016 Programarea calculatoarelor 89
  • 90. copyright@www.adrian.runceanu.ro 4.3. Tablouri bidimensionale (matrici) Exemplu: 02.12.2016 Programarea calculatoarelor 90 Date de intrare: n=2, m=3 si matricea a: 1 2 3 4 5 6 m=3, p=4 si matricea b: 1 2 3 4 5 6 7 8 9 10 11 12 Date de iesire: n=2 si p=3 si matricea produs c: 38 44 50 56 83 98 113 128
  • 91. copyright@www.adrian.runceanu.ro 4.3. Tablouri bidimensionale (matrici) #include<iostream.h> int main(void) { int a[10][10], b[10][10], c[10][10]; int n, m, i, j, k, p; cout<<"Dati dimensiunile matricei A n"; cout<<"Dati numarul de linii n = "; cin>>n; cout<<"Dati numarul de coloane m = "; cin>>m; for(i=0; i<n; i++) for(j=0; j<m; j++) { cout<<"a["<<i+1<<", "<<j+1<<"] = "; cin>>a[i][j]; } 02.12.2016 Programarea calculatoarelor 91 Citirea numarului de linii – n si de coloane - m ale matricei Citirea elementelor si memorarea lor in matricea a
  • 92. copyright@www.adrian.runceanu.ro 4.3. Tablouri bidimensionale (matrici) cout<<"Elementele matricei A sunt : n"; for(i=0; i<n; i++) { for(j=0; j<m; j++) cout<<a[i][j]<<" "; cout<< "n"; } 02.12.2016 Programarea calculatoarelor 92 Afisarea elementelor din matricea a
  • 93. copyright@www.adrian.runceanu.ro 4.3. Tablouri bidimensionale (matrici) cout<<"Dati dimensiunile matricei B n"; cout<<"Dati numarul de linii m = "; cin>>m; cout<<"Dati numarul de coloane p = "; cin>>p; for(i=0; i<m; i++) for(j=0; j<p; j++) { cout<< "b["<<i<<", "<<j<<"] = "; cin>>b[i][j]; } cout<<"Elementele matricei B sunt : n"; for(i=0; i<m; i++) { for(j=0; j<p; j++) cout<<b[i][j]<<" "; cout<<"n"; } 02.12.2016 Programarea calculatoarelor 93 Citirea elementelor si memorarea lor in matricea b
  • 94. copyright@www.adrian.runceanu.ro 4.3. Tablouri bidimensionale (matrici) • Conditie: Numarul de coloane din prima matrice trebuie sa fie egal cu numarul de linii din a doua matrice. 02.12.2016 Programarea calculatoarelor 94 Prima matrice 2 x 4 A doua matrice 4 x 3 Trebuie sa fie acelasi numar Matricea rezultat
  • 95. copyright@www.adrian.runceanu.ro 4.3. Tablouri bidimensionale (matrici) for(i=0; i<n; i++) for(j=0; j<p; j++) { c[i][j] = 0; for(k=0; k<m; k++) c[i][j] = c[i][j] + a[i][k] * b[k][j]; } 02.12.2016 Programarea calculatoarelor 95 Calculul elementelor matricei produs c
  • 96. copyright@www.adrian.runceanu.ro 4.3. Tablouri bidimensionale (matrici) cout<<"Elementele matricei produs C sunt : n"; for(i=0; i<n; i++) { for(j=0; j<p; j++) cout<<c[i][j]<<" "; cout<<"n"; } } 02.12.2016 Programarea calculatoarelor 96
  • 97. copyright@www.adrian.runceanu.ro 4.3. Tablouri bidimensionale (matrici) Executia programului pe o serie de date de test: 02.12.2016 Programarea calculatoarelor 97
  • 98. copyright@www.adrian.runceanu.ro Probleme rezolvate – tablouri unidimensionale Enunt: Se considera un numar natural n. Se cere sa se formeze un vector cu cifrele numarului. Exemplu: 02.12.2016 Programarea calculatoarelor 98 Date de intrare: Pentru valoarea: n = 23416789 Date de iesire: Se obtine vectorul cu elementele: 9 8 7 6 1 4 3 2
  • 99. copyright@www.adrian.runceanu.ro Probleme rezolvate – tablouri unidimensionale #include<iostream.h> int main(void) { // declaram variabilele pe care le vom utiliza in program int x[30]; long int n, i, m; cout<<"Dati numarul natural n = "; cin>>n; 02.12.2016 Programarea calculatoarelor 99
  • 100. copyright@www.adrian.runceanu.ro Probleme rezolvate – tablouri unidimensionale i = 0; while(n != 0){ x[i] = n % 10; i++; n = n / 10; } m = i-1; cout<<"nVectorul cu cifrele numarului este n"; for(i = 0; i < m; i++){ cout.width(3); cout<<x[i]; } } 02.12.2016 Programarea calculatoarelor 100
  • 101. copyright@www.adrian.runceanu.ro Probleme rezolvate – tablouri unidimensionale Executia programului pe o serie de date de test: 02.12.2016 Programarea calculatoarelor 101
  • 102. copyright@www.adrian.runceanu.ro Probleme rezolvate – tablouri unidimensionale Enunt: Reuniunea a doua multimi Sa se scrie un program care sa calculeze reuniunea a doua multimi de cate n, respectiv m numere intregi memorate cu ajutorul vectorilor. Exemplu: 02.12.2016 Programarea calculatoarelor 102 Date de intrare: n = 5, a = {1, 2, 5, 7, 12} si m = 4, b = {2, 4, 8, 12} Date de iesire: se obtine: k=7, c={1, 2, 5, 7, 12, 4, 8}
  • 103. copyright@www.adrian.runceanu.ro Probleme rezolvate – tablouri unidimensionale #include<iostream.h> int main(void) { int a[100], b[100], c[100], n, m, i, j, k, ok; cout<<"Dati cardinalul multimii A - n = "; cin>>n; cout<<"Dati elementele multimii A n"; for(i = 0; i < n; i++){ cout<<"a["<<i+1<<"] = "; cin>>a[i]; } 02.12.2016 Programarea calculatoarelor 103
  • 104. copyright@www.adrian.runceanu.ro Probleme rezolvate – tablouri unidimensionale cout<<"Dati cardinalul multimii B - m = "; cin>>m; cout<<"Dati elementele multimii B n"; for(i = 0; i < m; i++) { cout<<"b["<<i+1<<"] = "; cin>>b[i]; } // copiem elementele din multimea A in multimea C for(i = 0; i < n; i++) c[i]=a[i]; k = n; 02.12.2016 Programarea calculatoarelor 104
  • 105. copyright@www.adrian.runceanu.ro Probleme rezolvate – tablouri unidimensionale for(j = 0; j < m; j++) { ok = 1; // variabila care verifica daca un element apartine sau un multimii A for(i = 0; i <n ;i++) if(b[j] == a[i]) // daca elementul din multimea B apartine si multimii A atunci nu-l adaugam in multimea reuniune - C ok = 0; if(ok == 1) { k++; c[k] = b[j]; } } 02.12.2016 Programarea calculatoarelor 105
  • 106. copyright@www.adrian.runceanu.ro Probleme rezolvate – tablouri unidimensionale cout<<"nElementele multimii reuniune sunt : n"; for(i = 0; i < k; i++) { cout.width(9); cout<<c[i]; } } 02.12.2016 Programarea calculatoarelor 106
  • 107. copyright@www.adrian.runceanu.ro Probleme rezolvate – tablouri unidimensionale Executia programului pe o serie de date de test: 02.12.2016 Programarea calculatoarelor 107
  • 108. copyright@www.adrian.runceanu.ro Probleme propuse spre rezolvate – tablouri unidimensionale 1. Intersectia a doua multimi Sa se scrie un program care sa calculeze intersectia a doua multimi de cate n, respectiv m numere intregi memorate cu ajutorul vectorilor. Exemplu: 02.12.2016 Programarea calculatoarelor 108 Date de intrare: n = 5 a = {1, 2, 5, 7, 12} si m = 4 b = {2, 4, 8, 12} Date de iesire: se obtine: k = 2 d = {2, 12}
  • 109. copyright@www.adrian.runceanu.ro Probleme propuse spre rezolvate – tablouri unidimensionale 2. Diferența a două mulțimi Sa se scrie un program care sa calculeze diferenta a doua multimi de cate n, respectiv m numere intregi memorate cu ajutorul vectorilor. Exemplu: 02.12.2016 Programarea calculatoarelor 109 Date de intrare: n = 5 a = {1, 2, 5, 7, 12} si m = 4 b = {2, 4, 8, 12} Date de iesire: se obtine: k = 3 e = {1, 5, 7}
  • 110. copyright@www.adrian.runceanu.ro Probleme propuse spre rezolvate – tablouri unidimensionale 3. Se dă un şir de n numere naturale. Să se afişeze pe două randuri, pe primul rand cele pare şi pe al doilea cele impare. Exemplu: 02.12.2016 Programarea calculatoarelor 110 Date de intrare: Pentru n = 10 si elementele 4 3 2 5 6 8 9 0 1 5 Date de iesire: 4 2 6 8 0 3 5 9 1 5
  • 111. copyright@www.adrian.runceanu.ro Probleme propuse spre rezolvate – tablouri unidimensionale 4. Sa se scrie un program care sa introducă n numere intr-un vector şi să citeasccă un număr d. Să se afişeze acele numere din şirul dat care sunt divizibile cu d. Exemplu: 02.12.2016 Programarea calculatoarelor 111 Date de intrare: n=5 si valorile: 5 7 10 23 15, d=5 Date de iesire: 5 10 15
  • 112. copyright@www.adrian.runceanu.ro Probleme propuse spre rezolvate – tablouri unidimensionale 5. Se introduc temperaturile măsurate in n zile. Să se scrie un program care să afişeze media temperaturilor negative şi media celor pozitive. Exemplu: 02.12.2016 Programarea calculatoarelor 112 Date de intrare: n = 5 si temperaturile: 23 24 23 25 22 Date de iesire: 23.40
  • 113. copyright@www.adrian.runceanu.ro Pentru alte informații teoretice și aplicative legate de acest capitol se recomandă următoarele referințe bibliografice: 1. Adrian Runceanu, Mihaela Runceanu, Noțiuni de programare în limbajul C++, Editura Academica Brâncuși, Târgu-Jiu, 2012 (www.utgjiu.ro/editura) 2. Adrian Runceanu, Programarea şi utilizarea calculatoarelor, Editura Academica Brâncuși, Târgu-Jiu, 2003 (www.utgjiu.ro/editura) 3. Octavian Dogaru, C++ - teorie şi practică, volumul I, Editura Mirton, Timişoara, 2004 (www.utgjiu.ro/editura) 02.12.2016 Programarea calculatoarelor 113
  • 114. copyright@www.adrian.runceanu.ro “First, solve the problem. Then, write the code.” - John Johnson 02.12.2016 Programarea Calculatoarelor - curs 114