Você está na página 1de 37

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 coluna)
Vetor de 5 elementos (1 linha)

3.2 b[0]
a C A R R O
5.4 b[1]
a[0] a[1] a[2] a[3] a[4] b
9.3 b[2]

8.0 b[3]
● Possui apenas 1 índice
7.4 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)

Versão 19/11/12 Imagens: http://articles.mql4.com/417 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)

Versão 19/11/12 Imagens: http://articles.mql4.com/417 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.

Ex. de uso:
teatro[fileira][poltrona][andar]
Imagem adaptada de http://articles.mql4.com/417
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:
array 10 20 30 40 50 60 70 80 90
int array[9]; [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

Você também pode gostar