You are on page 1of 53

Algoritmos e Estruturas de Dados I

01/2013

Variveis Indexadas

Pedro O.S. Vaz de Melo


Problema 1

Uma loja pretende simular um dia de suas vendas. Sabe-se


que os preos dos produtos vendidos nesta loja variam de
R$5,00 a R$100,00 e que cada cliente compra apenas um
produto.

O nmero e o preo de cada produto, o nmero de clientes


e os produtos comprados pelos clientes devem ser gerados
aleatoriamente.

No mximo 200 produtos.

No mximo 50 clientes.

2
Entendendo o problema

Preciso de uma lista de produtos (max: 200) e de clientes


(max: 50)

Preos dos produtos Clientes


Id Produto Valor Id Cliente

0 5.99 0

1 7.04 1

2 99.99 2

3 1.99 3

4 42.50 4

... ... ...

3
Problema 1

Uma loja pretende simular um dia de suas vendas. Sabe-se


que os preos dos produtos vendidos nesta loja variam de
R$5,00 a R$100,00 e que cada cliente compra apenas
um produto.

O nmero e o preo de cada produto, o nmero de clientes


e os produtos comprados pelos clientes devem ser gerados
aleatoriamente.

No mximo 200 produtos.

No mximo 50 clientes.

4
Entendendo o problema

Preciso de uma lista de produtos (max: 200) e de clientes


(max: 50)

Preos dos produtos Clientes


Id Produto Valor Id Cliente

0 5.99 0

1 7.04 1

2 99.99 2

3 1.99 3

4 42.50 4

... ... ...

5
Entendendo o problema

Preciso de uma lista de produtos (max: 200) e de clientes


(max: 50)

Preos dos produtos Compras dos clientes


Id Produto Valor Id Cliente Id Produto

0 5.99 0 3

1 7.04 1 0

2 99.99 2 45

3 1.99 3 12

4 42.50 4 30

... ... ... ...

6
Codificando o Problema

7
Entendendo o Problema

Como popular os vetores precos e compras?

Preos dos produtos Compras dos clientes


Id Produto Valor Id Cliente Id Produto

0 5.99 0 3

1 7.04 1 0

2 99.99 2 45

3 1.99 3 12

4 42.50 4 30

... ... ... ...

8
Codificando o Problema

9
Codificando o Problema

10
Entendendo o Problema

Como calcular o valor total das compras feitas em um dia?

Preos dos produtos Compras dos clientes


Id Produto Valor Id Cliente Id Produto

0 9.99 0 32

1 9.99 1 32

2 9.99 2 32

3 9.99 3 32

4 9.99 4 32

... ... ... ...

11
Codificando o Problema

12
Codificando o Problema

13
Problema 1

Uma loja pretende simular um dia de suas vendas. Sabe-se


que os preos dos produtos vendidos nesta loja variam de
R$5,00 a R$100,00 e que cada cliente compra apenas um
produto.

O nmero e o preo de cada produto, o nmero de


clientes e os produtos comprados pelos clientes devem
ser gerados aleatoriamente.

No mximo 200 produtos.

No mximo 50 clientes.

14
Entendendo o problema

Como gerar nmeros aleatrios???

Preos dos produtos Compras dos clientes


Id Produto Valor Id Cliente Id Produto

0 5.99 0 3

1 7.04 1 0

2 99.99 2 45

3 1.99 3 12

4 42.50 4 30

... ... ... ...

15
Gerao de nmeros aleatrios

A linguagem C dispe da funo rand para a gerao de


um inteiro aleatrio no intervalo de 0 at RAND_MAX
(constante definida em stdlib.h).

Especificamente: RAND_MAX = 0x7FFF = 32767.

Para gerar nmeros aleatrios em um intervalo


especfico podemos escrever uma funo:

int random(int n) Que valor este?


{
return rand()%n; Um inteiro pertencente
} ao intervalo: [0,n-1]
16
Gerao de nmeros aleatrios

Sendo assim, para a gerao do nmero de produtos,


podemos utilizar:

num_produtos = 1 + random(MAX_PRODUTOS);

Se MAX_PRODUTOS uma constante que vale 200,


tem-se: num_produtos [1,200].

Para a gerao dos preos dos produtos, podemos


escrever:
preco = 5 + random(96);
preco[i] = preco;

ou seja, p [5,100].

17
Gerao de nmeros aleatrios

Ao trabalhar com nmeros aleatrios, busca-se em


cada execuo do programa, gerar novos nmeros.

Para isso, ao se usar a funo rand, necessrio


fornecer uma semente mesma... Como assim?

Para uma dada semente, a funo rand far brotar


uma determinada sequncia de nmeros.

Para garantir que a sequncia gerada seja sempre


diferente, deve-se mudar a semente a cada execuo.

18
Gerao de nmeros aleatrios

Mas como mudar a semente?

Uma boa ideia usar o valor retornado pela funo


time (definida em time.h).

A funo time retorna como valor o nmero de


segundos transcorridos desde 01/01/1970 e pode
armazenar este valor num parmetro.

t = time(p); ou t = time(NULL);

Caso no seja necessrio o


parmetro p.
19
Gerao de nmeros aleatrios

A funo srand responsvel pela inicializao da


semente a ser usada pela funo rand.

A funo srand exige como parmetro um valor inteiro


do tipo unsigned.

Podemos escrever:

srand((unsigned)time(NULL));

20
Anlise do programa

21
Anlise do programa

22
Anlise do programa

23
Variveis indexadas

Considere a seguinte execuo do programa:

Para esta simulao, observa-se 5 clientes (0 a 4).

Os produtos comprados por estes clientes esto


armazenados na varivel indexada compras.

24
Variveis indexadas

Ou seja:
compras 68 45 90 45 44 ...

0 1 2 3 4 5 ... 49

Exemplo: o cliente 0 comprou o produto 68.

Os preos esto armazenados na varivel precos:

precos
? ... 5 57 ... 73 ... 82 ... ? ... ? ...

0 44 45 ... 68 ... 90 ... 146 ... 158 ... 199



Exemplo: o produto 68 tem preo igual a 73 reais e foi
comprado pelo cliente 0.

25
Variveis indexadas

Observe que o valor de uma varivel indexada pode ser


o ndice de uma outra varivel indexada.

Veja, por exemplo, o caso do cliente 0:

compras[0] = 68
precos[68] = precos[compra[0]] = 73

Ou seja, o ndice de uma varivel indexada precisa ser


um inteiro com valor limitado ao nmero de posies de
memria declaradas para a varivel.

26
Variveis indexadas

O valor deste inteiro pode ser o valor de uma constante,


o valor de uma expresso, o valor de uma varivel ou o
valor retornado por uma funo.

Assim, so vlidas as expresses:

int x[10], i = 5, a;

a = x[3];
a = x[i];
a = x[x[a]];
a = x[random(10)];

27
Variveis indexadas
Ateno!

Ao utilizar variveis indexadas, temos que controlar o
valor do ndice no intervalo 0 a n-1, onde n o
nmero de posies de memria.


Caso contrrio, podemos ter invaso de memria.

28
Variveis indexadas
Variveis indexadas

invaso de memria!
Variveis indexadas
Variveis indexadas

End. Varivel Valor

#1 vec[0] 10

#2 vec[1] 20

#3 vec[2] 30

#4 vec[3] 40

#5 i 0
Variveis indexadas

End. Varivel Valor

#1 vec[0] 1

#2 vec[1] 1

#3 vec[2] 1

#4 vec[3] 1

#5 i 3
Variveis indexadas

End. Varivel Valor

#1 vec[0] 1

#2 vec[1] 1

#3 vec[2] 1

#4 vec[3] 1

#5 i 4

vec[4]
Variveis indexadas

End. Varivel Valor

#1 vec[0] 1

#2 vec[1] 1

#3 vec[2] 1

#4 vec[3] 1

#5 i 1

vec[4]
Variveis indexadas

End. Varivel Valor

#1 vec[0] 1

#2 vec[1] 1

#3 vec[2] 1

#4 vec[3] 1

#5 i 1

vec[4]
Problema 2

Uma grande empresa armazena em uma varivel indexada


os nmeros dos cheques emitidos num dia pelo setor
financeiro.

Considere que os nmeros dos cheques so valores


inteiros de 1 a 100 e que os cheques so emitidos em uma
ordem aleatria.

Ao final do dia, para facilitar o controle, a empresa precisa


ordenar estes dados em ordem crescente.

37
Ordenao por contagem

A ordenao de dados uma aplicao importante em


computao, existindo vrios algoritmos eficientes de
ordenao.

O algoritmo que veremos para resolver este problema um


dos mais simples e menos eficientes: ordenao por
contagem.

Exemplo: imagine uma varivel indexada vet contendo os


seguintes valores:

vet 38 97 19 100 23 47 41 8

0 1 2 3 4 5 6 7
38
Ordenao por contagem

Considere ainda uma outra varivel pos, de mesmo


tamanho, com valores inicialmente iguais a zero:

pos 0 0 0 0 0 0 0 0

0 1 2 3 4 5 6 7

O propsito da varivel pos[i] armazenar a posio que o


elemento vet[i] deve ter na ordenao.

Para determinar esta posio, basta contar para cada


elemento vet[i], quantos elementos menores do que ele
existem na varivel vet e armazenar em pos[i].

39
Ordenao por contagem

Exemplo:

vet 38 97 19 102 23 47 41 8

0 1 2 3 4 5 6 7

Elementos menores do
i vet[i] pos[i]
que vet[i]
0 38 19, 23, 8 3
1 97 38, 19, 23, 47, 41, 8 6
2 19 8 1
3 102 38, 97, 19, 23, 47, 41, 8 7
4 23 19,8 2
5 47 38, 19, 23, 41, 8 5
6 41 38, 19, 23, 8 4
7 8 - 0
40
Anlise do programa

Veja o parmetro v[ ] !!!

Esta funo verifica se


existe no vetor v (que tem n
elementos) um elemento
igual a k. Se existir, retorna
1. Do contrrio, retorna 0.

41
Anlise do programa

Observe que um valor r


gerado aleatoriamente, ser
includo no vetor v somente se
ele ainda no estiver no vetor.

42
Anlise do programa

43
Anlise do programa

Funo existe:
Usada para evitar a gerao
de nmeros de cheques
repetidos.

Observe que a varivel indexada declarada na lista de


parmetros como int v[ ], ou seja, no se especificou o
nmero de posies.

Isto possvel somente em listas de parmetros de


funes.

Neste caso, o nmero de posies da varivel indexada


declarada como parmetro na funo corresponde ao
valor de um outro parmetro (n).

44
Vetores e matrizes

Uma varivel indexada pode ter uma ou mais dimenses.


Considere, por exemplo, as declaraes:

int a[10];
char b[3][5];
double c[2][2][3];

Dizemos que a tem uma dimenso, b tem duas dimenses


e c tem trs dimenses.

Para as declaraes anteriores, temos:

Memria alocada Exemplo de


Varivel N de posies
(bytes) referncia
a 10 10 * 4 = 40 a[i]
b 3 * 5 = 15 15 * 1 = 15 b[i][j]
c 2 * 2 * 3 = 12 12 * 8 = 96 c[i][j][k]
45
Vetores e matrizes

Em programao, os termos vetor e matriz so usados


como sinnimos de varivel indexada.

O termo vetor usado para uma varivel indexada de uma


nica dimenso e o termo matriz para variveis indexadas
de duas ou mais dimenses.

Para uma melhor compreenso das variveis indexadas,


utiliza-se abstraes a respeito da disposio espacial de
seus elementos.

46
Vetores e matrizes

Considere as variveis a[10], b[3][5] e c[2][2][3]

a
0 1 2 3 4 5 6 7 8 9

9
8
c
7 b (0,0,0) (0,1,0)
6 (0,0) (0,1) (0,2) (0,3) (0,4) (1,0,0) (1,1,0)
5
(0,0,1) (0,1,1)
4
(1,0) (1,1) (1,2) (1,3) (1,4)
(1,0,1) (1,1,1)
3
2 (0,0,2) (0,1,2)
(2,0) (2,1) (2,2) (2,3) (2,4)
1 (1,0,2) (1,1,2)
a 0
47
Problema 3

Uma matriz usada para armazenar os resultados da


simulao da rolagem de dois dados. O elemento [i][j] da
matriz armazena o nmero de vezes que o valor do
primeiro dado i e o valor do segundo dado j.

Considere que um vetor armazena a frequncia de cada


soma possvel dos valores dos dados. Determinar qual a
soma mais frequente aps rolar os dados 36.000 vezes.

48
Anlise preliminar do problema
Pergunta:

Quais so as somas possveis para os valores dos dados?

Resposta: 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ou seja, existem


11 possibilidades.

Ou seja, precisamos de um vetor de 11 posies para


armazenar as freqncias das somas acima.

Exemplo: 3 125 23 41 5 9 2 86 231 45 13

0 1 2 3 4 5 6 7 8 9 10

Somas: 2 3 4 5 6 7 8 9 10 11 12
49
Anlise do programa

Observe que:

O elemento mat[0][0]
armazena quantas vezes
o resultados foi:
dado1 = 1
dado2 = 1.

O elemento mat[3][5]
armazena quantas vezes
o resultados foi:
dado1 = 4
dado2 = 6.

E assim por diante...

50
Anlise do programa

Entendeu?

51
Anlise do programa

Lembre-se que o valor da soma corresponde ao valor


do ndice do vetor + 2.

res 3 125 23 41 5 9 2 86 231 45 13

0 1 2 3 4 5 6 7 8 9 10

Somas: 2 3 4 5 6 7 8 9 10 11 12

Por isso, se a soma mais freqente est em res[i], o


resultado (soma) mais freqente ser i+2:

if (res[i] > val)


{
val = res[i];
rmf = i + 2;
} 52
Anlise do programa

Resultado da execuo:

53

You might also like