IFTO LÓGICA DE PROGRAMAÇÃO AULA 05 Prof. Manoel Campos da Silva Filho Tecnólogo em Processamento de Dados / Unitins Mestre em Engenharia Elétrica / UnB http://lab.ifto.edu.br/~mcampos http://manoelcampos.com mcampos at ifto.edu.br Versão 19/11/12 Slide 1
Arrays Variáveis compostas homogêneas Permitem acesso a seus elementos por meio de índice(s) numérico(s) Em linguagem C, a primeira posição de um array é a zero (em linguagens como Pascal e Lua a primeira posição é 1) Quantidade fixa de elementos Existem dois tipos: vetores e matrizes Versão 19/11/12 Slide 2
Arrays: Vetores Possuem apenas uma dimensão (1 linha ou 1 coluna, isto é uma questão de convenção, só um detalhe de como exibir os dados) Vetor de 5 elementos (1 linha) Vetor de 5 elementos (1 coluna) a C A R R O 3.2 5.4 b[0] b[1] a[0] a[1] a[2] a[3] a[4] b 9.3 b[2] Possui apenas 1 índice 8.0 7.4 b[3] b[4] Versão 19/11/12 Slide 3
Arrays: Vetores Declaração tipo nome[dimensao]; Exemplos char nome[50]; float alturas[10]; float medias[20]; int precos[10], idades[20]; Versão 19/11/12 Slide 4
Arrays: Vetores Inicialização na declaração. Exemplo: int pares[5] = {0, 2, 4, 6, 8}; Outro exemplo Declaração Uso (acesso aos elementos) Imagens: http://articles.mql4.com/417 Versão 19/11/12 Slide 5
Arrays: Vetores Percorrendo os elementos de um vetor, e imprimindo o mesmo como um vetor coluna (só 1 coluna) int pares[5] = {0, 2, 4, 6, 8}; int i; for(i = 0; i < 5; i++) { } printf( %d\n, pares[i]); Versão 19/11/12 Slide 6
Arrays: Vetores Percorrendo os elementos de um vetor e imprimindo o mesmo como um vetor linha (só 1 linha) int pares[5] = {0, 2, 4, 6, 8}; int i; for(i = 0; i < 5; i++) { } printf( %d\t, pares[i]); O que mudou em relação ao exemplo anterior? Versão 19/11/12 Slide 7
Arrays: Vetores Solicitando que o usuário preencha os elementos do vetor: int idade[5]; int i; printf( Informe a idade de 5 pessoas\n\n ); for(i = 0; i < 5; i++) { } printf( Informe uma idade: ); scanf( %d, &idade[i]); Versão 19/11/12 Slide 8
Arrays: Matrizes Possuem mais de uma dimensão. Os índices em todas as dimensão também iniciam em zero. Mais comumente são utilizadas matrizes bidimensionais Normalmente, considera-se que, nas matrizes bidimensionais, o primeiro índice representa linhas e o segundo colunas Versão 19/11/12 Slide 9
Arrays: Matrizes Exemplo de matriz bidimensional Imagem: http://articles.mql4.com/417 Versão 19/11/12 Slide 10
Arrays: Matrizes Declaração tipo nome[dimensao1][dimensao2]; tipo nome[dimensao1][dimensao2][dimensaon]; Exemplos char nomes[2][50]; int reservas_onibus[20][4]; Versão 19/11/12 Slide 11
Arrays: Matrizes Inicialização na declaração. Exemplos int matriz_a[2][4] = {{1,2,3,4}, {5,6,7,8}}; ou int matriz_b[2][4] = { 1,2,3,4, 5,6,7,8 }; Versão 19/11/12 Slide 12
Arrays: Matrizes Outro exemplo Declaração Uso (acesso aos elementos) Imagens: http://articles.mql4.com/417 Versão 19/11/12 Slide 13
Arrays: Matrizes Matriz Tridimensional (linhas, colunas e faces) int teatro[3][3][2]; Matriz com 3 linhas, 3 colunas e 2 faces. Pense nela como um teatro com dois andares, onde em cada andar existem 3 fileiras, cada uma com 3 poltronas. Imagem adaptada de http://articles.mql4.com/417 Ex. de uso: teatro[fileira][poltrona][andar] Versão 19/11/12 Slide 14
Arrays: Matrizes Percorrendo uma matriz bidimensional (exibindo) int i, j; int matriz_a[2][4] = {{1,2,3,4}, {5,6,7,8}}; for (i = 0; i < 2; i++) { } for (j = 0; j < 4; j++) { } printf("%d\t", matriz_a[i][j]); printf("\n"); Versão 19/11/12 Slide 15
Arrays: Matrizes Percorrendo uma matriz bidimensional (preenchendo) int i, j; int matriz_a[2][4] = {{1,2,3,4}, {5,6,7,8}}; for (i = 0; i < 2; i++) { } for (j = 0; j < 4; j++) { } printf("digite um valor pra ln %d e cl %d: ", i, j); scanf( %d, &matriz_a[i][j]); printf("\n"); Versão 19/11/12 Slide 16
Arrays: Matrizes Uma matriz também é denominada como vetor de vetores: int mat[2][4] = {{1,2,3,4}, {5,6,7,8}}; //ou int mat[2][4] = {1,2,3,4,5,6,7,8}; A matriz mat é um vetor de 2 elementos, onde cada posição armazena outro vetor de 4 elementos, como pode ser visto na atribuição, a matriz mat possui os elementos {1,2,3,4} e {5,6,7,8}, sendo cada um deles, um vetor de 4 elementos. Versão 19/11/12 Slide 17
Arrays: Matrizes Matriz de char: //Vetor de 2 posições, onde cada posição //armazena uma string de até 10 caracteres. //Também denominada vetor de strings char nomes[2][10]; int i; for(i=0; i < 2; i++) { printf("digite um nome: "); scanf("%s", nomes[i]); } for(i=0; i < 2; i++) printf("nome %d: %s\n", i+1, nomes[i]); Versão 19/11/12 Slide 18
Arrays: Armazenamento Os elementos de um array são armazenados em endereços de memória RAM sequenciais, assim, matrizes não são armazenadas em quadriláteros como imaginamos. Matriz 1 Matriz 2 Vetor 1 Imagem adaptada de http://www.fcleaner.com/ramrush.htm Versão 19/11/12 Slide 19
Arrays: Armazenamento Exemplo de fórmula (a ser utilizada internamente pelo programa) para descoberta da posição de um elemento da matriz na memória RAM, a partir dos valores de seus índices //fórmula considerando-se uma matriz bidimensional posicao = (num_ln*total_cls)+num_cl Versão 19/11/12 Slide 20
Arrays: Armazenamento Matriz 3x3 como imaginamos graficamente (em uma estrutura quadrilátera) Matriz 3x3 como armazenada em memória RAM (em posições sequenciais) 10 20 30 40 50 60 70 80 90 [0] [1] [2] [3] [4] [5] [6] [7] [8] A instrução array2d[2][2], para acesso a um elemento na matriz, é traduzida em algo como array2d[8] (posição obtida com a fórmula anterior) Versão 19/11/12 Slide 21
Arrays: Armazenamento Independente de quantas dimensões o array tenha, os dados são armazenados sequencialmente como uma estrutura unidimensional. Os valores dos índices do array é automaticamente traduzido em um único índice, como mostrado anteriormente Versão 19/11/12 Slide 22
Arrays: Armazenamento Cada variável possui um endereço na memória RAM Um array é composto por um conjunto de posições na RAM A variável array armazena apenas o endereço do primeiro elemento. Versão 19/11/12 Slide 23
Arrays: Armazenamento A descoberta do exato endereço de memória RAM de um elemento é calculado a partir do índice único para acesso aos elementos do array (seja um vetor ou matriz) Versão 19/11/12 Slide 24
Arrays: Armazenamento Internamente é utilizada a fórmula: endereco = endereco_inicial + indice*tamanho_tipo_dado Exemplo: int array[9]; array 10 20 30 40 50 60 70 80 90 [0] [1] [2] [3] [4] [5] [6] [7] [8] printf( Endereço da 1ª posição do array: %p, &array); printf( Endereço da 2ª posição do array: %p, &array[1]); Os endereços de memória normalmente são exibidos como números hexadecimais (para reduzir o total de dígitos a serem impressos e facilitar a leitura) Versão 19/11/12 Slide 25
Arrays: Armazenamento Quando se deseja acessar um dado de uma posição, como: printf( Valor da posição %d do vetor: %d, 1, array[1]); o programa automaticamente descobre o endereço de memória onde o dado da posição informada está armazenado, baseado no endereço inicial e na posição a ser acessada, utilizando a fórmula mostrada anteriormente: endereco = endereco_inicial + indice*tamanho_tipo_dado Versão 19/11/12 Slide 26
Arrays: Armazenamento Usando o vetor de inteiros do exemplo anterior: Tamanho do tipo de dados (int) = 4 bytes Cada posição do vetor ocupa 4 bytes Considere posição inicial igual a 0xbfa3f00c (números iniciados em 0x ou terminados em h são hexadecimais) A segunda posição do vetor (índice 1) estaria no endereço 0xbfa3f010 Em decimal, a diferença entre o segundo e o primeiro endereço é de exatamente 4 (bytes), o tamanho de cada posição int. Versão 19/11/12 Slide 27
Arrays: Armazenamento Veja que a diferença entre o primeiro e o segundo elemento do vetor será de 4 bytes (caso o tipo int do compilador C utilizado tenha este tamanho) int array[9]; printf( Endereço do array[0]: %p, &array[0]); printf( Endereço do array[0]: %p, &array[1]); Versão 19/11/12 Slide 28
Arrays: Armazenamento Acessar o endereço da variável array é o mesmo que acessar o endereço do seu primeiro elemento (de índice zero): int array[9]; printf( Endereço do array é o mesmo da 1ª posição dele ); printf( Endereço do array : %p, &array); printf( Endereço do array[0]: %p, &array[0]); Versão 19/11/12 Slide 29
Arrays: Armazenamento Se o array é uma matriz, primeiramente os índices da mesma são convertidos para um único índice (como já mostrado) e depois o endereço de memória da posição solicitada é calculado para assim poder acessar o dado armazenado neste endereço Versão 19/11/12 Slide 30
Arrays: Definindo dimensões usando variáveis Permitindo que o usuário defina a(s) dimensão(ões) do array (após definidas, as dimensões continuam não podendo ser alteradas): int i, total; printf( Informe o total de alturas que deseja digitar: ); scanf( %d, &total); float alturas[total]; for(i=0; i < total; i++) { } printf( Digite uma altura (%d de %d):, i+1, total); scanf( %f, &alturas[i]); Versão 19/11/12 Slide 31
Exercícios Crie um programa que solicite a nota de 10 alunos e armazene todas elas. O programa deve exibir a média das notas da turma, a maior e a menor nota. Crie um programa que solicite a nota de 3 avaliações de 10 alunos. O programa deve exibir a média ponderada das notas de cada aluno, sendo que cada avaliação tem os pesos 2, 3 e 5, respectivamente. A média ponderada é obtida pela soma das notas do aluno, multiplicadas pelos seus respectivos pesos e dividindo-se este resultado pela soma dos pesos. Versão 19/11/12 Slide 32
Exercícios Crie um programa que solicite o nome e a idade de uma quantidade de pessoas determinada pelo usuário. O programa deve exibir, ao final, o total de pessoas cadastradas, o nome da pessoa mais velha e sua idade e a moda das idades (a idade que mais se repetiu dentre o conjunto de idades informadas). Versão 19/11/12 Slide 33
Exercícios Crie um programa para registrar a votação para escolha do líder da turma. O programa deve exibir um menu com a lista de 5 candidatos, numerados de 1 a 5. O usuário deve escolher um candidato e o voto para ele deve ser contabilizado. Quando o usuário digitar 0 o programa deve terminar e exibir o total de votos de cada candidato, além do candidato vencedor. Versão 19/11/12 Slide 34
Exercícios Crie um programa para realizar o cadastro de 10 pessoas. O programa deve armazenar o CPF, nome e data de nascimento das pessoas, nessa ordem. Após digitar o CPF, antes de incluí-lo no cadastro de pessoas, deve-se verificar se ainda não existe uma pessoa com o CPF informado. Caso exista, deve-se exibir os dados da pessoa cadastrada, caso contrário, deve-se solicitar os outros dados para cadastrar a pessoa. Versão 19/11/12 Slide 35
Exercícios Crie um programa para realizar o cadastro de 10 pessoas, como o anterior. No entanto, o programa deve ter um menu como abaixo: 1-Cadastrar 2-Listar pessoas cadastradas 3-Alterar cadastro 4-Excluir último cadastro 0-Sair O programa deve cadastrar uma pessoa por vez, cada vez que o usuário escolher a opção 1 do menu. Considerando que o vetor tem apenas 10 posições, antes de cadastrar uma pessoa, deve-se verificar se ainda há posições vazias no vetor. Para isto, deve-se utilizar uma variável para armazenar o total de pessoas cadastradas. Na opção 2, deve-se solicitar o CPF da pessoa cujo cadastro deve ser alterado, após isto, deve-se localizar a posição em que a pessoa está cadastrada. Ver função strcmp da biblioteca string.h A opção 4 deve apenas decrementar a variável que indica o total de pessoas cadastradas. Versão 19/11/12 Slide 36
Exercícios Criar um programa como o anterior, mas que na opção de excluir cadastro, solicite o CPF da pessoa a ser excluída, localize o cadastro e exclua o mesmo. Versão 19/11/12 Slide 37