programa˘c~ao de computadores i - decom-ufop · 100 comandos scanf 100 comandos if ... i e por m,...
TRANSCRIPT
1/62
Programacao de Computadores I
Aula 09
Programacao: Vetores
Jose Romildo Malaquias
Departamento de ComputacaoUniversidade Federal de Ouro Preto
2011-1
2/62
Motivacao
Problema
Faca um programa que leia as notas dos alunos de uma turma de 5alunos, determine e mostre a media aritmetica das notas, e onumero de alunos com notas inferiores a media.
3/62
Motivacao (cont.)
#include <stdio.h>
int main(void)
{
double nota;
double soma = 0.0;
for (int i = 0; i < 5; i++)
{
printf("nota %d: ", i+1);
scanf("%lf", ¬a);
soma = soma + nota;
}
double media = soma / 5;
printf("media: %2f\n", media);
// e agora ... como acessar as notas ja digitadas?
return 0;
}
4/62
Motivacao (cont.)
I Este programa utiliza uma unica variavel para armazenar anota digitada pelo usuario.
I Toda vez que o usuario digita uma nova nota, o valoranteriormente digitado e perdido.
I Apos ler todas as notas e calcular a media, nao e maispossıvel comparar cada nota com a media.
I Solucao?Usar uma variavel diferente para armazenar cada nota.
5/62
Motivacao (cont.)
#include <stdio.h>
int main(void)
{
double n1, n2, n3 , n4 , n5;
printf("nota 1: "); scanf("%lf", &n1);
printf("nota 2: "); scanf("%lf", &n2);
printf("nota 3: "); scanf("%lf", &n3);
printf("nota 4: "); scanf("%lf", &n4);
printf("nota 5: "); scanf("%lf", &n5);
double media = (n1 + n2 + n3 + n4 + n5) / 5;
printf("media: %2f\n", media);
int cont = 0;
if (n1 < media) cont ++;
if (n2 < media) cont ++;
if (n3 < media) cont ++;
if (n4 < media) cont ++;
if (n5 < media) cont ++;
printf("abaixo da media: %d\n", cont);
return 0;
}
6/62
Motivacao (cont.)
I O problema foi resolvido.
I Porem o fato de usarmos uma variavel diferente para cadanota impossibilita o uso de comando de repeticao.
I Assim foi necessaro escrever scanf 5 vezes, e if 5 vezes.
7/62
Motivacao (cont.)
I Estenda o problema para trabalhar com uma turma de 100alunos.
E possıvel, porem esta sera uma tarefa enfadonha e sujeita aerros, pois serao necessarios:
100 variaveis distintas, cada uma com um nome diferente.100 comandos scanf
100 comandos if
I Pergunta:Existe outra maneira de trabalhar com as 100 variaveis semusar 100 nomes diferentes?
I Resposta:Sim, utilizando vetor.
8/62
Motivacao (cont.)
I Estenda o problema para trabalhar com um numero de alunosque somente sera conhecido em tempo de execucao.
Com este esquema nao e possıvel.
I Pergunta:Existe uma maneira de trabalhar com um numerodesconhecido (pelo programador) de variaveis?
I Resposta:Sim, utilizando vetor.
9/62
Vetor
I Vetor e uma variavel composta homogeneaunidimensional.
I Um vetor e formado por uma sequencia de variaveis, todas domesmo tipo de dados.
I Dizemos que cada variavel componente e um elemento dovetor.
I As variaveis que compoem um vetor sao todas identificadaspor um mesmo nome.
I Estas variaveis sao alocadas sequencialmente na memoria.
10/62
Vetor (cont.)
11/62
Declaracao de uma variavel vetor
tipo identificador [tamanho];
I Primeiro o tipo de dado dos componentes do vetor:int, float, double, char, . . .
I Segundo o nome da variavel vetor: usando as mesmasconvencoes de um identificador comum:array, vetor, variavelDeNumeros, vet, . . .
I E por fim, o tamanho do vetor (isto e, a quantidade deelementos que formam o vetor) escrito entre colchetes:[5], [10], [3], . . .
12/62
Declaracao de uma variavel vetor (cont.)
Exemplos:
int vet [6]; // um vetor de 6 inteiros
double notas [100]; // um vetor de 100 doubles
char texto [256]; // um vetor de 256 caracteres
double medias [2*n]; // um vetor de 2*n doubles
13/62
Declaracao de uma variavel vetor (cont.)
I Todo vetor e um espaco linear na memoria dividido em variasvariaveis componentes de acordo com o tamanho declarado.
I Ao declaramos
int vet[4]
e alocado na memoria um espaco linear para 4 variaveisinteiras, representadas da seguinte forma:
I Assim vet e uma variavel vetor formada por 4 espacos dememoria.
14/62
Acessando elementos de um vetor
I Os componentes de um vetor sao numeradossequencialmente comecando com zero.
I Para identificar cada componente usamos o nome do vetorjuntamente com o numero que indica a posicao docomponente na sequencia.
I A posicao de um componente e chamada de ındice.
I Exemplo:
double Notas [10];
15/62
Acessando elementos de um vetor (cont.)
I Sintaxe:
vetor[ındice]
I Primeiramente escreve-se o vetor.
I Depois escreve-se o ındice (uma expressao inteira) entrecolchetes.
16/62
Acessando elementos de um vetor (cont.)
I Exemplo:
double Notas [10];
Notas [1] = 9.35;
printf("%f", Notas [1]);
Notas[1] refere-se ao componente na posicao 1 do vetorNotas, ou seja, o segundo elemento do vetor.
17/62
Acessando elementos de um vetor (cont.)
I Uma vez que as variaveis que compoem o vetor tem o mesmonome, o que distingue cada uma delas e o seu ındice, quereferencia sua localizacao dentro da estrutura.
18/62
Acessando elementos de um vetor (cont.)
19/62
Acessando elementos de um vetor (cont.)
I A primeira posicao de um vetor tem ındice 0.
I A ultima posicao de um vetor tem ındice tamanho - 1 .
I Importante:
O sistema de execucao nao verifica se o ındice usado paraacessar um componente do vetor e valido.
E responsabilidade do programador garantir que o ındiceusado para acessar um elemento de um vetor e valido.
20/62
Acessando elementos de um vetor (cont.)
Nao esqueca:
I Para acessar uma posicao especıfica de um vetor basta indicara posicao desejada entre colchetes
I A posicao e chamada de ındice.
I A faixa de ındices validos inicia em 0 e termina com otamanho - 1.
I Exemplo: os ındices validos para um vetor de tamanho 4 sao0, 1, 2 e 3.
21/62
Acessando elementos de um vetor (cont.)
Exemplo:
Declarar um vetor de tamanho 4 e atribuir o valor 540 na posicao1 e o valor 8456 na posicao 3.
int vetor [4];
vetor [1] = 540;
vetor [3] = 8456;
22/62
Acessando elementos de um vetor (cont.)I O limite do vetor e sempre o seu tamanho menos 1.
I No exemplo anterior o vetor e de tamanho 4, a posicaomaxima e 3, pois 4 − 1 = 3.
I Se um valor for atribuıdo fora dos limites do vetor ocorreraum erro muito grave, pois o valor estara sendo armazenadoem um espaco de memoria que nao pertence ao vetor.
I Ainda no exemplo anterior, nao se deve fazer
vetor [4] = 200;
23/62
Exemplo: ler e mostrar um vetor
Inserir 5 notas em um vetor, depois disso visualizar as notasinseridas.
24/62
Exemplo: ler e mostrar um vetor (cont.)
#include <stdio.h>
int main(void)
{
double notas [5]; // um vetor de 5 elementos
int j; // ındice no vetor
// entrada dos dados
for (j = 0; j < 5; j++)
{
printf("Inserir nota %d: ", j+1);
scanf("%d", ¬as[j]);
}
// visualizac~ao dos dados
for (j = 0; j < 5; j++)
printf("%d ", notas[j]);
return 0;
}
25/62
Exemplo: ler e mostrar um vetor (cont.)
26/62
Exemplo: ler e mostrar um vetor (cont.)
27/62
Exemplo: ler e mostrar um vetor (cont.)
28/62
Exemplo: ler e mostrar um vetor (cont.)
29/62
Exemplo: ler e mostrar um vetor (cont.)
30/62
Exemplo: ler e mostrar um vetor (cont.)
31/62
Exemplo: ler e mostrar um vetor (cont.)
32/62
Exemplo: ler e mostrar um vetor (cont.)
33/62
Exemplo: ler e mostrar um vetor (cont.)
34/62
Exemplo: ler e mostrar um vetor (cont.)
35/62
Exemplo: ler e mostrar um vetor (cont.)
36/62
Exemplo: ler e mostrar um vetor (cont.)
37/62
Exemplo: ler e mostrar um vetor (cont.)
38/62
Exemplo: ler e mostrar um vetor (cont.)
39/62
Exemplo: ler e mostrar um vetor (cont.)
40/62
Exemplo: ler e mostrar um vetor (cont.)
41/62
Exemplo: ler e mostrar um vetor (cont.)
42/62
Exemplo: ler e mostrar um vetor (cont.)
43/62
Exemplo: media de 5 notas
Faca um programa que leia as notas dos alunos de uma turma de 5alunos, determine e mostre a media aritmetica das notas, e onumero de alunos com notas inferiores a media.
44/62
Exemplo: media de 5 notas (cont.)
#include <stdio.h>
int main(void)
{
double notas [5];
int indice;
// leitura dos dados
for (indice = 0; indice < 5; indice ++)
{
printf("nota %d: ", indice + 1);
scanf("%lf", ¬as[indice ]);
}
// calculo e exibic~ao da media
double soma = 0;
for (indice = 0; indice < 5; indice ++)
soma = soma + notas[indice ];
45/62
Exemplo: media de 5 notas (cont.)
double media = soma /5;
printf("media: %2f\n", media );
// calculo e exibic~ao da quantidade
// de notas abaixo da media
int cont = 0;
for (indice = 0; indice < 5; indice ++)
if (notas[indice] < media)
cont = cont + 1;
printf("abaixo da media: %d\n", cont);
return 0;
}
46/62
Exemplo: preenchendo um vetor
I Colocar os numeros de 1 a 5 em Vetor.
for (int i = 0; i < 5; i++)
Vetor[i] = i + 1;
I Colocar os numeros de 5 a 1 em Vetor.
for (int i = 0; i < 5; i++)
Vetor[i] = 5 - i;
46/62
Exemplo: preenchendo um vetor
I Colocar os numeros de 1 a 5 em Vetor.
for (int i = 0; i < 5; i++)
Vetor[i] = i + 1;
I Colocar os numeros de 5 a 1 em Vetor.
for (int i = 0; i < 5; i++)
Vetor[i] = 5 - i;
46/62
Exemplo: preenchendo um vetor
I Colocar os numeros de 1 a 5 em Vetor.
for (int i = 0; i < 5; i++)
Vetor[i] = i + 1;
I Colocar os numeros de 5 a 1 em Vetor.
for (int i = 0; i < 5; i++)
Vetor[i] = 5 - i;
46/62
Exemplo: preenchendo um vetor
I Colocar os numeros de 1 a 5 em Vetor.
for (int i = 0; i < 5; i++)
Vetor[i] = i + 1;
I Colocar os numeros de 5 a 1 em Vetor.
for (int i = 0; i < 5; i++)
Vetor[i] = 5 - i;
47/62
Uso de constantes com vetores
I Geralmente e melhor usar um nome representando um valorconstante do que usar a propria constante em um programa.
I Para tanto define-se a constante no inıcio do programa, e norestante do programa usa-se o nome definido.
I Se for necessario redefinir o valor da constante no texto doprograma, o local a ser alterado e somente na declaracao daconstante.
I Alem disto, o uso de um nome pode ser uma dica dosignificado da constante.
48/62
Uso de constantes com vetores (cont.)
I Geralmente e melhor definir e usar uma constante pararepresentar o tamanho de um vetor do que escrever o valor dotamanho explicitamente em todas os locais que precisamos dotamanho.
49/62
Uso de constantes com vetores (cont.)I Uma constante pode ser definida como uma macro do
pre-processador usando a diretiva #define.
I No inıcio da compilacao, o pre-processador substitui todas asocorrencias no nome da macro pela definicao dada.
I Este procedimento e apenas manipulacao do texto doprograma.
I Nao e feita nenhuma checagem de tipo com o nome da macro.
I Exemplo:
#define TAMANHO 5
double VetReais[TAMANHO ];
// coloca 5,4,3,2,1 no vetor
for (i = 0; i < TAMANHO; i++)
VetReais[i] = TAMANHO + i;
50/62
Uso de constantes com vetores (cont.)
I Uma constante pode ser definida no nıvel da linguagematraves do especificador const colocado em uma declaracaode variavel, antes no nome do tipo.
I A variavel assim definida e similar as outras variaveis, excetopelo fato de que o seu valor nao pode ser alterado. Portantonao e possıvel fazer uma atribuicao a ela.
I Exemplo:
const int TAMANHO = 20
double VetReais[TAMANHO], VetCopia[TAMANHO ];
// copia os dados de um vetor para outro
for(i = 0; i < TAMANHO; i++)
VetCopia[i] = VetReais[i];
51/62
Exemplo: ordem inversa
Construa um algoritmo que leia 300 numeros inteiros e imprimaesses numeros na ordem inversa de entrada.
52/62
Exemplo: ordem inversa (cont.)
#include <stdio.h>
#define QUANTIDADE 300 // definic~ao de macro
int main(void)
{
int vet[QUANTIDADE ];
int i;
// leitura dos dados
for (i = 0; i < QUANTIDADE; i++)
{
printf("numero %d: ", i + 1);
scanf("%d", &vet[i]);
}
// impress~ao na ordem inversa
printf("\nordem inversa :\n");
for (i = QUANTIDADE - 1; i >= 0; i--)
printf("numero %d: %d\n", i + 1, vet[i]);
return 0;
}
53/62
Inicializacao de vetores
I Quando declaramos um vetor, os seus elementos nao saoinicializados.
I Neste caso os seus elementos sao desconhecidos (lixo) e sodeverao ser utilizados apos atribuicao.
I Porem e possıvel fazer a inicializacao de um vetor com osvalores iniciais desejados.
I Os valores inicias sao colocados entre chaves {}.
I Exemplo:
int v[5] = { 16, 36, 3, 8, 26 };
54/62
Inicializacao de vetores (cont.)
I A quantidade de valores entre chaves nao deve ser maior queo tamanho do vetor.
I A fim de facilitar a inicializacao, C permite omitir o numerode elementos (tamanho): [].
I Neste caso, o compilador assume que o tamanho do vetor eigual ao numero de valores especificados na inicializacao(entre chaves).
I Exemplo:
int v[] = { 16, 36, 3, 8, 26 };
55/62
Busca
I Dada uma colecao de n elementos, pretende-se saber se umdeterminado valor x esta presente nessa colecao.
I Para efeitos praticos, vamos supor que essa colecao eimplementada como sendo um vetor de n elementos inteiros:v[0]..v[n-1].
56/62
Pesquisa sequencial
I Utilizamos uma variavel encontrado para sinalizar se o valorja foi encontrado. Inicialmente o seu valor e falso(representando como 0 no C).
I Percorremos o vetor desde a primeira posicao ate a ultima, ouate o valor ser encontrado:
Para cada posicao i , comparamos v[i] com o valor x:
se forem iguais sinalizamos que o valor foi encontradoatribuindo verdadeiro (representado como 1 no C) a variavelencontrado
se chegarmos ao fim do vetor sem sucesso concluımos que ovalor nao existe no vetor
57/62
Pesquisa sequencial (cont.)
Passos:
1. Inicializacao
int i = 0;
int encontrado = 0; /* falso */
58/62
Pesquisa sequencial (cont.)
2. Pesquisa
while (i < TAMANHO && ! encontrado)
{
if (vetor[i] == x)
encontrado = 1; /* verdadeiro */
else
i++;
}
59/62
Pesquisa sequencial (cont.)
3. Tratamento do resultado
if (encontrado)
printf("Valor %d encontrado na posic~ao %d\n",
vetor[i], i);
else
printf("Valor %d n~ao encontrado\n",
vetor[i]);
60/62
Pesquisa sequencial (cont.)
Exemplo:
#include <stdio.h>
#define TAMANHO 4
int main(void)
{
int vet[TAMANHO ];
int i;
// leitura dos dados
printf("Digite %d numeros :\n", TAMANHO );
for (i = 0; i < TAMANHO; i++)
scanf("%d", &vet[i]);
// leitura do valor a ser pesquisado
int valor;
printf("Valor procurado :\n");
scanf("%d", &valor);
61/62
Pesquisa sequencial (cont.)
// realiza a pesquisa
int encontrado = 0; /* falso */
for (i = 0; i < TAMANHO && !encontrado; i++)
encontrado = (vet[i] == valor);
// exibe resultado
if (encontrado)
printf("encontrado na posic~ao %d\n", i - 1);
else
printf("n~ao encontrado\n");
return 0;
}
62/62
FIM
Creditos:Baseado no material preparado pelo
Prof. Guillermo Camara-Chavez.