Você está na página 1de 34

Informtica

1
Tipos de Dados Compostos
Variveis Indexadas e
Alocao Dinmica
Prof. Thiago Oliveira dos Santos
Departamento de Informtica
Universidade Federal do Esprito Santo

12/11/2013
Aula Programao Bsica de
Computadores (INF 09325)
Informtica

2
Viso Geral da Aula
Introduo
Variveis indexadas unidimensionais (Vetores)
Variveis indexadas bidimensionais (Matrizes)
Variveis indexadas multidimensionais
Inicializao de variveis indexadas
Alocao dinmica
Variveis indexadas como argumento de funo

Informtica

3
Viso Geral da Aula
Introduo
Variveis indexadas unidimensionais (Vetores)
Variveis indexadas bidimensionais (Matrizes)
Variveis indexadas multidimensionais
Inicializao de variveis indexadas
Alocao dinmica
Variveis indexadas como argumento de funo

Informtica

4
Introduo
Variveis
Variveis so abstraes que facilitam acesso a memria
So representadas por um smbolo

Limitaes das Variveis Comuns
No permitem armazenar vrios valores de mesmo tipo
Exemplo de problemas desse tipo
Armazenar idade de um grupo de pessoas
Soluo
Usar variveis indexadas
Informtica

5
Introduo
Variveis Indexadas
Possuem um mesmo nome
So variveis que so diferenciadas atravs de um ndice
Podem possuir mais de uma dimenso
Variveis indexadas unidimensionais (Vetores)
Variveis indexadas bidimensionais (Matriz)
Variveis indexadas multidimensionais
Essa tipo de varivel pode ser alocada de duas formas
Esttica
Dinmica

Informtica

6
Viso Geral da Aula
Introduo
Variveis indexadas unidimensionais (Vetores)
Variveis indexadas bidimensionais (Matrizes)
Variveis indexadas multidimensionais
Inicializao de variveis indexadas
Alocao dinmica
Variveis indexadas como argumento de funo

Informtica

7
Variveis Indexadas Unidimensionais (Vetores)
Nome
Segue a mesma regra das variveis comuns

Declarao
Deve ser feita antes do uso (geralmente no incio do bloco)
Sintaxe
<tipo> <nome>[<tamanho>];
<tipo> = tipo de dados vlido
<nome> = nomes da varivel
<tamanho> = tamanho do vetor
Exemplo
float velocidades[10]; int idades[30], char nome[10];



Informtica

8
Variveis Indexadas Unidimensionais (Vetores)
Acesso aos Dados
Utiliza-se o operador []
ndices vo de 0 a n-1
Exemplo 1
int idadeTemp = idades[0];
float velocidadeTemp = velocidades[9];



Informtica

9
Variveis Indexadas Unidimensionais (Vetores)
Acesso aos Dados
Exemplo




int n[3];

printf("Digite um num\n");
scanf("%d", &n[0]);
printf("Digite um num\n");
scanf("%d", &n[1]);
printf("Digite um num\n");
scanf("%d", &n[2]);

printf("num1 = %d\n", n[0]);
printf("num2 = %d\n", n[1]);
printf("num3 = %d\n", n[2]);
Informtica

10
Variveis Indexadas Unidimensionais (Vetores)
Acesso Iterativo
Possibilita percorrer uma seqncia de variveis
Exemplo




int i, numeros[3];
printf("Informe 3 nmeros inteiros:\n");
for (i = 0; i < 3; i++)
scanf("%d", &numeros[i]);

printf("Ordem inversa:\n");
for (i = 2; i >= 0; i--) {
printf("%d\n", numeros[i]);
}
Informtica

11
Variveis Indexadas Unidimensionais (Vetores)
Organizao em Memria





33
int Idades[3]
Idades[0]
20 Idades[1]
50 Idades[2]
80 IdadesTemp int IdadesTemp
Informtica

12
Viso Geral da Aula
Introduo
Variveis indexadas unidimensionais (Vetores)
Variveis indexadas bidimensionais (Matrizes)
Variveis indexadas multidimensionais
Inicializao de variveis indexadas
Alocao dinmica
Variveis indexadas como argumento de funo

Informtica

13
Variveis Indexadas Bidimensionais (Matriz)
Declarao
Sintaxe
<tipo> <nome>[<tamanho_n>] [<tamanho_m>];
<tipo> = tipo de dados vlido
<nome> = nomes da varivel
<tamanho_n> = nmero de linhas
<tamanho_m> = nmero de colunas

Exemplo
float matriz[10][10]; int imagem[30][30];



Informtica

14
Variveis Indexadas Bidimensionais (Matriz)
Acesso aos Dados
Utiliza-se o operador [] duas vezes
ndices vo de 0 a n-1
Exemplo
float idadeTemp = matriz[0][0];
int pixel = imagem[29][29];



Informtica

15
Variveis Indexadas Bidimensionais (Matriz)
Acesso Iterativo
Exemplo




int i, j, matriz[2][2];
printf("Informe 4 nmeros inteiros:\n");
for (i = 0; i < 2; i++)
for (j = 0; j < 2; j++)
scanf("%d", &matriz[i][j]);

printf("Matriz:\n");
for (i = 0; i < 2; i++) {
printf("\t");
for (j = 0; j < 2; j++) {
printf("%d ", matriz[i][j]);
}
printf("\n");
}
Informtica

16
Variveis Indexadas Unidimensionais (Vetores)
Organizao em Memria





31
int matriz[2][2]
matriz[0][0]
23
233
43
matriz[0][1]
matriz[1][0]
matriz[1][1]
31 23
233 43
0
0
1
1
80 item int item
Informtica

17
Viso Geral da Aula
Introduo
Variveis indexadas unidimensionais (Vetores)
Variveis indexadas bidimensionais (Matrizes)
Variveis indexadas multidimensionais
Inicializao de variveis indexadas
Alocao dinmica
Variveis indexadas como argumento de funo

Informtica

18
Variveis Indexadas Multidimensionais
Caractersticas
Equivalente a bidimensional
Inclui [] adicionais na declarao e no acesso a dados
Exemplo
float matriz3D[10][10][10]; int multiDim[30][20][10][10];



Informtica

19
Viso Geral da Aula
Introduo
Variveis indexadas unidimensionais (Vetores)
Variveis indexadas bidimensionais (Matrizes)
Variveis indexadas multidimensionais
Inicializao de variveis indexadas
Alocao dinmica
Variveis indexadas como argumento de funo

Informtica

20
Inicializao de Variveis Indexadas
Variveis
int a = 1; float b = 2.0;

Variveis Indexadas
Conceito similar
Porm, requer o uso de {}
Exemplo
float velocidades[3] = { 100.0, 80.0, 50.0 };
int matriz[2][2] = { 1, 2, 3, 4 };
char umNome[10] = { 'J', 'o', 'a', 'o', '\0' };
char outroNome[10] = "Joao";
char vetorStrings[3][10] = { "Joao", "Maria", "Jose" };



Informtica

21
Viso Geral da Aula
Introduo
Variveis indexadas unidimensionais (Vetores)
Variveis indexadas bidimensionais (Matrizes)
Variveis indexadas multidimensionais
Inicializao de variveis indexadas
Alocao dinmica
Variveis indexadas como argumento de funo

Informtica

22
Alocao Dinmica
Variveis Indexadas Estticas
Ao declarar uma varivel indexada
feita uma alocao de memria do tamanho declarado
A alocao definida durante a compilao
Alocao esttica
Problema
Existem situaes que no se sabe o tamanho a ser alocado
Essa informao s obtida durante a execuo do programa
Soluo
Alocao dinmica




Informtica

23
Alocao Dinmica
Variveis Indexadas com Ponteiros
int vetor[4]





31 vetor [0] *(vetor+0)
23
233
43
vetor [1] *(vetor+1)
vetor[2] *(vetor+2)
vetor[3] *(vetor+3)
vetor
Int*
Int
Int
Int
Int
Informtica

24
Alocao Dinmica
Variveis Indexadas com Ponteiros
Identificador da varivel do tipo ponteiro
Exemplo




int i;
float vetor[6] = { 1.3, 4.5, 2.7, 4.1, 0.0, 100.1 };
float *ponteiro = vetor;
for (i = 0; i < 6; i++) {
printf("%.1f\n", *ponteiro);
ponteiro++;
}
Informtica

25
Alocao Dinmica
Variveis Indexadas com Ponteiros
O operador de acesso [idx] equivalente
Ao apontado pelo endereo do identificador mais idx




int i;
float vetor[6] = { 1.3, 4.5, 2.7, 4.1, 0.0, 100.1 };
float *ponteiro = &vetor[0];

for (i = 0; i < 6; i++)
printf("%.1f\n", ponteiro[i] );

printf("\n");

for (i = 0; i < 6; i++)
printf("%.1f\n", *(vetor+i) );
Informtica

26
Alocao Dinmica
Alocao de Memria Dinmica
Requer ajuda de funes adicionais
Requer manuseio de ponteiros
Funes
void* malloc (size_t size); da biblioteca #include <stdlib.h>
Aloca uma quantidade de memria definida por size
Retorna um ponteiro para a memria alocada (void*)
O retorno deve ser convertido para o tipo desejado
O tamanho da memria pode ser calculado com o operador sizeof
sizeof retorna o tamanho de um determinado tipo
Tamanho a ser alocado a igual a sizeof(tipo)*qtd_de_itens
qtd_de_itens o nmero de itens do vetor


Informtica

27
Alocao Dinmica
Alocao de Memria Dinmica
Exemplo



int i, qtd, *numeros;
printf("Quantos nmeros deseja informar? ");
scanf("%d", &qtd);
numeros = (int *)malloc(qtd * sizeof(int));

printf("Informe %d nmeros inteiros:\n", qtd);
for (i = 0; i < qtd; i++)
scanf("%d", &numeros[i]);

printf("Dobro dos nmeros informados em ordem inversa:\n");

for (i = qtd - 1; i >= 0; i--) {
numeros[i] = numeros[i] * 2;
printf("%d\n", numeros[i]);
}
Informtica

28
Alocao Dinmica
Desalocao de Memria Dinmica
Memria alocada dinamicamente
Deve ser desalocada manulamente se no for mais usada
Funo
void free (void* ptr); da biblioteca #include <stdlib.h>

Exemplo
Acrescentar a linha abaixo ao final do exemplo anterior
free(numeros);


Informtica

29
Alocao Dinmica
Desalocao de Memria Dinmica
Reusar o ponteiro de memria dinmica sem desaloca-la
Pode causar vazamento de memria
Exemplo


CUIDADO!
void leImprimeInverte(){
int i, qtd, *numeros;
printf("Quantos nmeros deseja informar? ");
scanf("%d", &qtd);
numeros = (int *)malloc(qtd * sizeof(int));
printf("Informe %d nmeros inteiros:\n", qtd);
for (i = 0; i < qtd; i++)
scanf("%d", &numeros[i]);
printf("Dobro dos nmeros informados em ordem inversa:\n");
for (i = qtd - 1; i >= 0; i--) {
numeros[i] = numeros[i] * 2;
printf("%d\n", numeros[i]);
}
//free(numeros); //sem essa linha ocorre vazamento
}
int main(int argc, char * argv[])
{
leImprimeInverte();
leImprimeInverte();
leImprimeInverte();

return 0;
}
Informtica

30
Viso Geral da Aula
Introduo
Variveis indexadas unidimensionais (Vetores)
Variveis indexadas bidimensionais (Matrizes)
Variveis indexadas multidimensionais
Inicializao de variveis indexadas
Alocao dinmica
Variveis indexadas como argumento de funo

Informtica

31
Variveis Indexadas como Argumento de Funo
Unidimensional
Vetores podem ser passados como argumento para funo
Existem 3 formas
Exemplo para um vetor int vetor[10];
void func(int* vet);
void func(int vet[]);
void func(int vet[10]);



CUIDADO! VETOR NO ALOCADO
Informtica

32
Variveis Indexadas como Argumento de Funo
Bidimensional e Multidimensional
Existe duas formas
Exemplo para um vetor int vetor[10][10];
void func(int vet[10][10]);
void func(int vet[][10]);
Exemplo para um vetor int vetor[10][10][20];
void func(int vet[10][10][20]);
void func(int vet[][10][20]);



Informtica

33
Pergunta???


Informtica

34
Exerccios
1) Elabore um algoritmo para realizar a soma de dois vetores,
A e B, de nmeros reais e de tamanho 5 e armazenar em um
vetor C.
2) Estenda o algoritmo anterior para realizar a soma de duas
matrizes, A e B, de nmeros reais e de dimenso 3 x 5.
3) Reescreva o exerccio 1 utilizando alocao dinmica de
vetores, ou seja: pergunte ao usurio o tamanho dos vetores,
em seguida leia A e B. Ao final, imprima C.
4) Reescreva o exerccio 1 utilizando funo. A funo deve ter
o seguinte cabealho: void SomaVet(float* A, float* B , float*
C, int tamanhoVet);

Você também pode gostar