Introdução à Computação para Engenharia MAC2166 Prof. Dr. Paulo Miranda IME-USP Vetores
Motivação: O programa abaixo calcula a média de N notas. float nota,media,soma=0.0; int i,n; printf("entre com a quantidade: "); scanf("%d",&n); for(i=1; i<=n; i++){ scanf("%f",¬a); soma += nota; /* soma = soma + nota; */ media = soma/n; printf("media: %.2f\n",media);
Motivação: E para calcular o desvio padrão? Para usar a equação acima precisamos primeiro calcular a média e depois percorrer novamente cada nota a fim de calcular o somatório acima. Como fazer? Pedir para o usuário digitar novamente os dados. Extremamente deselegante. Armazenar cada nota em uma variável. Complicado de se programar.
Motivação: E para calcular o desvio padrão? Armazenar cada nota em uma variável (inviável). float nota,media,soma=0.0; float nota1,nota2,nota3,... int i,n; scanf("%d",&n); for(i=1; i<=n; i++){ scanf("%f",¬a); soma += nota; if(i==1) nota1 = nota; else if(i==2) nota2 = nota; else if(i==3) nota3 = nota;... media = soma/n;...
Motivação: Uma solução alternativa no caso do desvio padrão, é considerarmos o desenvolvimento abaixo: Agora podemos calcular os dois somatórios da expressão resultante acima simultaneamente, percorrendo os dados uma única vez. Porém veremos problemas onde a necessidade de relembrar os dados que foram digitados, não pode ser evitada.
Definição: Vetor é uma série de variáveis do mesmo tipo referenciadas por um único nome, onde cada variável (elemento) é diferenciada através de um número chamado índice. Os elementos do vetor são guardados em posições consecutivas de memória (alocação sequencial). int main(){ float notas[5]; Representação gráfica: notas[0] = 2.5; notas[1] = 4.5; notas[2] = 9.0; notas[3] = 7.0; notas[4] = 5.5; 2.5 4.5 9.0 7.0 5.5 0 1 2 3 4
Definição: Vetores Declaração: Vetor é uma série tipo de variáveis identificador[tamanho]; do mesmo tipo referenciadas por um único nome, onde cada variável (elemento) é diferenciada através de um número O tamanho chamado deve índice. ser uma constante inteira! Os elementos do vetor int N; são guardados em posições consecutivas de memória scanf("%d", (alocação &N); seqüencial). float notas[n]; /* Errado. */ int main(){ float notas[5]; Representação gráfica: notas[0] = 2.5; notas[1] = 4.5; notas[2] = 9.0; notas[3] = 7.0; notas[4] = 5.5; 2.5 4.5 9.0 7.0 5.5 0 1 2 3 4
Definição: Vetor é uma série de variáveis do mesmo tipo referenciadas por um único nome, onde cada Referenciando variável (elemento) um é elemento: diferenciada através de um número chamado índice. Os elementos do vetor identificador[índice] são guardados em posições consecutivas de memória Índices (alocação válidos seqüencial). entre 0 e tamanho-1. Cuidado: C não realiza verificação de int main(){ limites. Acessos errados acarretam float notas[5]; resultados Representação imprevisíveis. gráfica: notas[0] = 2.5; notas[1] = 4.5; notas[2] = 9.0; notas[3] = 7.0; notas[4] = 5.5; 2.5 4.5 9.0 7.0 5.5 0 1 2 3 4
Problema: Calcular o desvio padrão das notas digitadas. #define LIM 500 int main(){ float media,desvio,soma=0.0,notas[lim]; int i,n; scanf("%d",&n); { scanf("%f",¬as[i]); soma += notas[i]; media = soma/n; soma = 0.0; soma += (notas[i]-media)*(notas[i]-media); desvio = sqrtf(soma/n); printf("desvio: %.2f\n",desvio);
Problema: Calcular o desvio padrão das notas digitadas. #define LIM 500 int main(){ float media,desvio,soma=0.0,notas[lim]; int i,n; scanf("%d",&n); { scanf("%f",¬as[i]); soma += notas[i]; media = soma/n; soma = 0.0; Índice pode ser especificado por uma expressão inteira ou pelo conteúdo de uma variável inteira. soma += (notas[i]-media)*(notas[i]-media); desvio = sqrtf(soma/n); printf("desvio: %.2f\n",desvio);
Problema: Calcular o desvio padrão das notas digitadas. #define LIM 500 int main(){ float media,desvio,soma=0.0,notas[lim]; int i,n; scanf("%d",&n); { scanf("%f",¬as[i]); if(n>lim){ printf("tamanho excedido\n"); /* Encerra o programa. */ soma += notas[i]; media = soma/n; soma = 0.0; soma += (notas[i]-media)*(notas[i]-media); desvio = sqrtf(soma/n); printf("desvio: %.2f\n",desvio);
Operações com vetores: Reflexão Problema: inverter a ordem dos elementos do vetor. #define LIM 500 int main(){ float notas[lim],tmp[lim]; int i,n; scanf("%d",&n); scanf("%f",¬as[i]); tmp[n-1-i] = notas[i]; notas[i] = tmp[i]; printf("%.2f ",notas[i]); printf("\n");
Invertendo elementos Troca usando variável auxiliar: float a,b,tmp;... tmp = a; a = b; b = tmp;... Troca sem uso de variável auxiliar: float a,b;... a = a + b; b = a - b; a = a - b;...
Operações com vetores: Reflexão Problema: inverter a ordem dos elementos do vetor. #define LIM 500 int main(){ float notas[lim],tmp; int i,n; scanf("%d",&n); scanf("%f",¬as[i]); for(i=0; i<n/2; i++){ tmp = notas[i]; notas[i] = notas[n-1-i]; notas[n-1-i] = tmp; printf("%.2f ",notas[i]); printf("\n");
Exercício: 1) Dados n > 0 números inteiros, imprimi-los na ordem inversa a da leitura. 2) Faça um programa que lê dois vetores ordenados (ordem crescente), com m > 0 e n > 0 elementos respectivamente, e gera um terceiro vetor ordenado contendo todos os elementos das duas sequências originais sem repetição. 3) Dados n > 0 lançamentos de uma roleta (números entre 0 e 36), calcular a frequência de cada número. 4) Dada uma sequência de n > 0 números reais, imprimi-los eliminando as repetições.