Baixe o app para aproveitar ainda mais
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
Compartilhar