Buscar

Prog I - Aula 10: vetores

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 31 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 31 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 31 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Vetores (Arrays)
INF1005 – Programação I – 33B
Prof. Gustavo Moreira
gmoreira@inf.puc-rio.br 
1
vetores
tópicos
definição
declaração e inicialização
vetores locais a funçõesvetores locais a funções
passagem de vetores como parâmetros de função
referência
Capítulo 7 da apostila
Capítulo 5 do livro
2
para que servem vetores
conjuntos de valores
Exemplo: cálculo de média (m) e variância 
(s2)
( )∑
3
N
x
X ∑=
( )
N
Xx
s
∑ −
=
2
2
/* cálculo de média, sem utilizar vetor */
#include <stdio.h>
int main(void)
{
float media = 0.0f; /* a média calculada */
int n; /* número de valores que serão digitados */
int i; /* o contador para a leitura de cada número */
/* lê número de valores */
______("Digite o número de valores para o cálculo da média: ");
_____("__", __);
if (n <= 0) return 1; /* sai do programa se não houver valores a ler */
4
if (n <= 0) return 1; /* sai do programa se não houver valores a ler */
/* lê cada valor, somando-os um a um */
for (i=0; _____; i++)
{
float valor;
scanf("__", ______);
media += valor;
}
/* calcula média */
media /= n;
/* exibe resultado */
printf("A média dos valores digitados é: __\n", _____);
return 0;
}
/* cálculo de média, sem utilizar vetor */
#include <stdio.h>
int main(void)
{
float media = 0.0f; /* a média calculada */
int n; /* número de valores que serão digitados */
int i; /* o contador para a leitura de cada número */
/* lê número de valores */
printf("Digite o número de valores para o cálculo da média: ");
scanf("%d", &n);
if (n <= 0) return 1; /* sai do programa se não houver valores a ler */
5
if (n <= 0) return 1; /* sai do programa se não houver valores a ler */
/* lê cada valor, somando-os um a um */
for (i=0; i < n; i++)
{
float valor;
scanf("%f", &valor);
media += valor;
}
/* calcula média */
media /= n;
/* exibe resultado */
printf("A média dos valores digitados é: %f\n", media);
return 0;
}
para que servem vetores
Como faríamos para calcular a variância?
( )∑
6
N
x
X ∑=
( )
N
Xx
s
∑ −
=
2
2
como definir um vetor
tipo de dado que será armazenado
em cada posição do vetor
dimensão do vetor (quantos
elementos poderá armazenar)
nome da variável
int vet[10];
7
como um vetor é armazenado
espaço de memória contínuo
declaração:
int v[10];
acesso a cada elemento:
v[5]
v[6]
v[7]
v[8]
v[9]
124
128
132
136
140
acesso a cada elemento:
v[0]
v[1]
...
v[9]
cuidado:
v[10] não existe!
8
v
v[0]
v[1]
v[2]
v[3]
v[4]
104
108
112
116
120
inicializando um vetor
declaração com inicialização:
int v[5] = {1, 3, 5, 7, 9};
124
ou
int v[ ] = {1, 3, 5, 7, 9};
9
1
3
5
7
9
v
v[0]
v[1]
v[2]
v[3]
v[4]
104
108
112
116
120
Se
int v[10];
Qual é o primeiro valor do vetor?
10
Qual é o primeiro valor do vetor?
E qual é o último valor do vetor?
v[0]
v[9]
Se
int v[10];
Quem é v? 
v[5]
v[6]
v[7]
v[8]
v[9]
124
128
132
136
140
v é um ponteiroponteiroponteiroponteiro para o 
primeiro elemento do vetor
11
Qual é seu valor?
v
v[0]
v[1]
v[2]
v[3]
v[4]
104
108
112
116
120
primeiro elemento do vetor
v contém o endereço de v[0]
v == &v[0]
v+1 == &v[1]
...
dúvidas?dúvidas?
12
/* cálculo da média, utilizando vetor */
#include <stdio.h>
#define NUM_VALORES 10
int main(void)
{
float soma = 0.0f; /* a soma dos valores */
int i; /* o contador para a leitura de cada número */
float valor[NUM_VALORES]; /* vetor que armazenará os valores */
/* exibe instrução */
printf("Digite %d numeros para calcular sua media:\n", NUM_VALORES);
/* lê e soma cada valor */
13
/* lê e soma cada valor */
for (i=0; i < NUM_VALORES; i++) {
scanf("%f", &valor[i]);
soma += valor[i];
}
printf("Valores digitados: \n"); /* exibe valores */
for (i=0; i < NUM_VALORES; i++)
printf("%.3f ", valor[i]);
/* calcula média e exibe resultado */
printf("\nA media dos valores digitados e’: %.3f\n", soma/NUM_VALORES);
return 0;
}
/* cálculo da média e da variância, utilizando vetores */
#include <stdio.h>
#define NUM_VALORES 10
int main(void)
{
float media = 0.0f; /* a média dos valores */
float variancia = 0.0f; /* a média dos valores */
int i; /* o contador para a leitura de cada número */
float valor[NUM_VALORES]; /* vetor com os valores */
printf("Digite %d numeros para calcular sua media e variancia:\n", NUM_VALORES);
/* lê todos os valores */
for (i=0; i < NUM_VALORES; i++) {
N
x
X ∑=
( )
N
Xx
s
∑ −
=
2
2
14
scanf("%f", &valor[i]);
media += valor[i]; /* somatório do numerador da média */
}
/* calcula a média */
media /= NUM_VALORES; 
/* calcula a variância */
for (i=0; i < NUM_VALORES; i++)
variancia += (valor[i]-media)*(valor[i]-media); /* som. numer. da variância */
variancia /= NUM_VALORES;
/* exibe o resultado */
printf("Media : %f\nVariancia: %f\n", media, variancia);
return 0;
}
Se
int v[ ] = {1, 3, 5, 7, 9};
Quem é v+1? 124
15
Quem é v+1?
E quem é *(v+3)?
&v[1] 
/* endereço do segundo elemento */
v[3] 1
3
5
7
9
v
v[0]
v[1]
v[2]
v[3]
v[4]
104
108
112
116
120
, , , , ou seja, 7
Passando um vetor para função
Quero agora criar uma função para a calcular a média 
dos elementos do vetor.
Como passar um vetor como parâmetro para a função?
Por exemplo, um vetor declarado como:Por exemplo, um vetor declarado como:
float v[10000];
É razoável copiar todos os elementos do vetor para a 
função? Empilhá-los todos na pilha de execução?
16
Passando um vetor para função
Se
float v[10];
Como declarar o parâmetro da função média?
float media(int n, ______________)float media(int n, ______________)
{
...
}
Se eu quero chamá-la da seguinte maneira:
med = media(n, v);
17
Passando vetor para função
Se
float v[10];
Como declarar o parâmetro da função média?
float media(int n, float* vet)float media(int n, float* vet)
{
...
}
Se eu quero chamá-la da seguinte maneira:
med = media(n, v);
18
/* função para o cálculo da média */
float media (int n, float* v)
{
int i;
float soma = 0.0f;
N
x
m
∑
=
A função também pode ser declarada como: 
float media (int n, float v[])
19
float soma = 0.0f;
for (i = 0; i < n; i++)
soma += v[i];
return soma/n;
}
O que pode dar errado?
Passando vetor para função
Se
float v[10];
E existe uma função com o seguinte protótipo:
float func (int n, float* x);float func (int n, float* x);
A função func pode alterar o valor dos elementos do 
vetor v, quando eu a chamo como a seguir?
resultado = func(n, v);
20
Sim! Por quê?
/* função para o cálculo da variância */
float variancia (int n, float* v, float med)
{
int i;
float soma = 0.0f;
( )
N
mx
s
∑ −
=
2
2
21
float soma = 0.0f;
for (i = 0; i < n; i++)
soma += (____-med)*(____-med);
return soma/n;
}
( )
N
mx
s
∑ −
=
2
2
/* função para o cálculo da variância */
float variancia (int n, float* v, float med)
{
int i;
float soma = 0.0f;
22
float soma = 0.0f;
for (i = 0; i < n; i++)
soma += (v[i]-med)*(v[i]-med);
return soma/n;
}
O que pode dar errado?
dúvidas?dúvidas?
23
exercício
Escreva uma função que retorne o valor máximo dos 
elementos de um vetor de inteiros.EX. 01
______________________________________________________________
______________________________________________________________
______________________________________________________________
24
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
exercício
Precisamos agora saber, além do valor máximo do vetor, o índice
desse valor no vetor. Como a função precisaria ser modificada?
EX. 02
______________________________________________________________
______________________________________________________________
______________________________________________________________
25
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
Complete e modifique o programa abaixo para ler todos os dados 
para um vetor e gravar no arquivo a matrícula e média de cada
um e, no final, a média e a variância da turma.
EX. 03
...
FILE *fpIn, *fpOut;
float p1, p2, p3;
int mat;
fpIn = fopen("notas.txt", "r"); /* abre para leitura */
fpOut = fopen("medias.txt", "w"); /* abre para escrita*/
if (! (fpIn && fpOut) ) { /* verifica se arquivos puderam ser abertos */
printf("Erro.\n"); 
26
printf("Erro.\n"); 
exit(1); 
}
/* lê número de matrícula e notas de cada aluno do arquivo de entrada */
while (fscanf (fpIn, "%d %f %f %f ", &mat, &p1, &p2, &p3) == 4)
/* escreve matrícula e média de cada aluno no arquivo de saída */
fprintf (fpOut, "%d %.1f\n", mat, (p1+p2+p3)/3);
/* fecha arquivos de entrada e de saída */
fclose (fpIn);
fclose (fpOut);
...
dúvidas?dúvidas?
27
arquivos 
binários
28
Armazenando vetores em arquivos binários 
> escrita
void escreve_vetor(int n, float* vNotas) 
/* n: número de elementos no vetor vNotas */
{
FILE *fp = fopen("notas.dat", "wb"); /* abre o arquivo binário para escrita */
if (fp == NULL) /* verifica se o arquivo foi aberto */
{
printf("Erro ao abrir o arquivo para escrita.\n");
exit(1);exit(1);
}
fwrite(vNotas, sizeof(float), n, fp); /* escreve todo o vetor de uma vez */
fclose(fp); /* fecha o arquivo */
}
29
file pointer
número de elementos
tamanho de cada elemento
ponteiro para o vetor
Armazenando vetores em arquivos binários 
> leitura
int le_vetor(float* vNotas)
/* vetor vNotas deve ter espaço suficiente para todos os elementos no arquivo */
{
int num; /* número de elementos no arquivo */
long filesize; /* tamanho do arquivo */
FILE *fp = fopen("notas.dat", "rb"); /* abre um arquivo binário para leitura */
if (fp == NULL) /* verifica se o arquivo foi aberto */
{{
printf("Erro ao ler do arquivo.\n");
exit(1);
}
fseek(fp, 0, SEEK_END); /* vai para o final do arquivo */
filesize = ftell(fp); /* tamanho do arquivo = posição final */
num = filesize/sizeof(float); /* número de floats armazenados */
fseek(fp, 0, SEEK_SET); /* vai para o início do arquivo */
fread(vNotas, sizeof(float), num, fp); /* lê todos os elementos do vetor */
fclose(fp); /* fecha o arquivo de entrada */
return num; /* retorna número de elementos lidos */
}
30
ex09_06_vetor_arquivobin.c
dúvidas?dúvidas?
31
Prof. Gustavo Moreira
gmoreira@inf.puc-rio.br

Outros materiais