Baixe o app para aproveitar ainda mais
Prévia do material em texto
VETORES ‹nº› Exercício Faca um programa capaz de corrigir uma prova de múltipla escolha. A prova terá 10 questões, valendo 1 ponto cada uma. Cada questão tem 5 alternativas numeradas de 1 a 5. O programa deve inicialmente obter o gabarito da prova. Ele será constituído de um conjunto de 10 números representando a alternativa correta de cada questão ( um número entre 1 e 5) Após a leitura do gabarito, o programa devera corrigir as provas dos alunos. Portanto, para cada aluno da turma, captura sua matrícula e suas respostas (validando-as), calculando sua nota de acordo com o gabarito e exibindo-a. A leitura termina com um código de matricula negativo. ‹nº› 2 ‹nº› Exemplo de prova ‹nº› Exercício Entradas Gabarito (10 números) Aluno1: matricula, 10 respostas Aluno2: matricula , 10 respostas ..... Saídas nota do aluno 1 nota do aluno 2 ..... ‹nº› 4 ‹nº› Solução Geral Obtém gabarito Captura matrícula Calcula acertos(nota) de acordo c/o gabarito Exibe matrícula e nota Matr ≠ 0 Calcula acertos de acordo com o gabarito: acertos = 0 Captura resposta da questão Se resposta da questão == gabarito da questão i incrementa total de acertos 10 x ‹nº› 5 ‹nº› Armazenando o gabarito Como uma variável int só pode armazenar 1 resposta do gabarito, para armazená-lo serão necessárias 10 variáveis!!!!! int main(void) { int gab1, gab2,gab3,gab4gab5,gab6,gab7,gab8,gab8,gab10; gab1 gab2 gab3 gab4 gab5 gab6 gab7 gab8 gab9 gab10 ‹nº› Exemplo int main (void) { int gab1, gab2,gab3,gab4gab5,gab6,gab7,gab8,gab9,gab10,nota,matr; scanf ( "%d", &gab1); scanf ( "%d", &gab2); scanf ( "%d", &gab3); scanf ( "%d", &gab4); scanf ( "%d", &gab5); scanf ( "%d", &gab6); scanf ( "%d", &gab7); scanf ( "%d", &gab8); scanf ( "%d", &gab9); scanf ( "%d", &gab10); printf( " Digite a matricula, ou 0 para terminar"; )scanf( " %d",&matr); while (matr !=0) { nota= corrige_prova(gab1, gab2,gab3,gab4gab5,gab6,gab7,gab8,gab9,gab10) printf(" %d - %d", matr, nota); printf( " Digite a matricula, ou 0 para terminar"; )scanf( " %d",&matr) } 5 3 4 2 3 2 4 2 1 1 gab1 gab2 gab3 gab4 gab5 gab6 gab7 gab8 gab9 gab10 Como cada resposta do gabarito está em uma variável, para corrigir a prova do aluno será necessário um if por questão. Como cada resposta do gabarito está em uma variável é necessário ler cada resposta individualmente. ‹nº› Questões para a Solução Problema: Para comparar as respostas de cada aluno com a alternativa correta do gabarito é necessário ter o gabarito disponível Como? Utilizando 10 variáveis distintas: gab1,gab2,....gab10? NÃO!!!!! Desejo: 1 variável que seja capaz de armazenar simultaneamente as 10 respostas do gabarito: (o conjunto de respostas) Solução: um mecanismo que nos permita armazenar um conjunto de valores na memória do computador:vetor 5 3 4 2 3 2 4 2 1 1 gabarito ‹nº› 8 ‹nº› É uma variável capaz de armazenar diversos valores do mesmo tipo simultaneamente Um vetor contém um número fixo de células idênticas Cada célula armazena UM e APENAS UM dos valores do vetor Exemplo: Vetor 5 3 2 1 5 3 2 1 4 4 gabarito ‹nº› 9 ‹nº› Vetor Problemas Na declaração da variável Quantos valores? Tipo de cada valor? No uso da variável Como armazenar um valor em uma determinada posição? Como acessar um determinado valor? ‹nº› 10 ‹nº› Declaração de Vetores Precisamos especificar: o tipo dos valores que o vetor armazena (um vetor só pode armazenar um tipo de valor) e o tamanho do vetor. tipo identificador[tamanho]; ‹nº› Declaração de Vetores int v [5]; A declaração acima reserva um espaço na memória para 5 inteiros e o endereço desta área é armazenado no ponteiro constante v v Esse espaço de memória é acessado através de seu endereço armazenado no ponteiro constante v ‹nº› Exemplos de Declaração int a, b[20]; float c[10]; double d[30], e, f[5]; int v[4]; ‹nº› Exemplos de Declaração int a, b[20]; float c[10]; double d[30], e, f[5]; int v[4]; Declara um inteiro e um vetor de inteiros de 20 posições ‹nº› Exemplos de Declaração int a, b[20]; float c[10]; double d[30], e, f[5]; int v[4]; Declara um vetor de variáveis de tipo float de 10 posições ‹nº› Exemplos de Declaração int a, b[20]; float c[10]; double d[30], e, f[5]; int v[4]; Declara um vetor de 30 posições, uma variável e outro vetor de 5 posições. Todas as variáveis são do tipo double. ‹nº› Exemplos de Declaração int a, b[20]; float c[10]; double d[30], e, f[5]; int v[4]; Representação de v (int []) v ??? (int) ??? (int) ??? (int) ??? (int) ‹nº› 17 ‹nº› Exemplo de Declaração com Inicialização int v[4] ={17,42,23,34}; 17 (int) 42 (int) 23 (int) 34 (int) ‹nº› Vetor Problemas No uso da variável Como armazenar /acessar um valor em uma determinada posição? DUAS FORMAS: Pelo endereço Por indexação ‹nº› 19 ‹nº› Vetor : acesso pelo endereço v v 17 42 23 34 ‹nº› 20 ‹nº› Vetor : acesso pelo endereço: exibindo o 1º valor printf( “%d”, *v); 17 42 23 34 v v 17 E os demais valores???? ‹nº› 21 ‹nº› Vetor : acesso pelo endereço Considerando que: v é um tipo de "ponteiro constante", cujo valor não pode ser alterado e armazena o endereço do 1º elemento do vetor Os elementos de um vetor estão armazenados em áreas consecutivas na memória O endereço resultante do incremento de um ponteiro reflete o tamanho do tipo referenciado. 17 42 23 34 v v V+1 V+2 Tem-se que: v+1 é o endereço da 2º elemento, o endereço do terceiro elemento é v+2 e assim sucessivamente ‹nº› 22 ‹nº› Vetor : acesso pelo endereço - Exibindo valores 17 42 23 34 v v int i; for(i=0;i<4;i++) { printf(“%d”, *(v+i)); } ‹nº› 23 ‹nº› Vetor : acesso pelo endereço - Exibindo valores 17 42 23 34 v v 0 i int i; for(i=0;i<4;i++) { printf(“%d”, (); } 17 (v+i) ‹nº› 24 ‹nº› Vetor : acesso pelo endereço - Exibindo valores 17 42 23 34 v v 1 i int i; for(i=0;i<4;i++) { printf(“%d”, (); } 42 * (v+i) ‹nº› 25 ‹nº› Vetor : acesso pelo endereço - Exibindo valores 17 42 23 34 v v 2 i int i; for(i=0;i<4;i++) { printf(“%d”, (); } 23 * (v+i) ‹nº› 26 ‹nº› Vetor : acesso pelo endereço - Exibindo valores 17 42 23 34 v v 3 i int i; for(i=0;i<4;i++) { printf(“%d”, (); } 34 * (v+i) ‹nº› 27 ‹nº› Vetor : acesso pelo endereço - Exibindo valores 17 42 23 34 v v 4 i int i; for(i=0; i<4 ;i++) { printf(“%d”, *(v+i)); } ‹nº› 28 ‹nº› Vetor : acesso pelo endereço - Alterando valores 17 42 23 34 v v *(v+2) = 99; ‹nº› 29 ‹nº› Vetor : acesso pelo endereço Armazenando valor na 3ª posição 17 42 99 34 v v *(v+2) = 99; ‹nº› 30 ‹nº› Vetor : acesso pelo endereço 17 42 99 34 v v 1 i *(v+i) = 77; Armazenando valor na i_ésima posição ‹nº› 31 ‹nº› Vetor : acesso pelo endereço 17 77 99 34 v v 1 i *(v+i) = 77; Armazenando valor na i_ésima posição ‹nº› 32 ‹nº› Vetor Problemas No uso da variável Como armazenar /acessar um valor em uma determinada posição? DUAS FORMAS: Pelo endereço Por indexação ‹nº› 33 ‹nº› Vetor : acesso por indexação Cada POSIÇÃO (célula) é identificada por um NÚMERO vetor [número da posição]v[4] = 3; 0 1 2 3 4 5 6 7 8 9 3 v ‹nº› 34 ‹nº› Vetor : acesso por indexação - Exibindo valores 17 42 23 34 v v int i; for(i=0;i<4;i++) { printf(“%d”, v[i]); } 0 1 2 3 ‹nº› 35 ‹nº› Vetor : acesso por indexação - Exibindo valores 17 42 23 34 v v 0 i int i; for(i=0;i<4;i++) { printf(“%d”, (); } 17 V[i]) 0 1 2 3 ‹nº› 36 ‹nº› Vetor : acesso por indexação - Exibindo valores 17 42 23 34 v v 1 i int i; for(i=0;i<4;i++) { printf(“%d”, (); } 42 V[i] 0 1 2 3 ‹nº› 37 ‹nº› Vetor : acesso por indexação - Exibindo valores 17 42 23 34 v v 2 i int i; for(i=0;i<4;i++) { printf(“%d”, (); } 23 V[i] 0 1 2 3 ‹nº› 38 ‹nº› Vetor : acesso por indexação - Exibindo valores 17 42 23 34 v v 3 i int i; for(i=0;i<4;i++) { printf(“%d”, (); } 34 V[i] 0 1 2 3 ‹nº› 39 ‹nº› Vetor : acesso por indexação - Exibindo valores 17 42 23 34 v v 4 i int i; for(i=0; i<4 ;i++) { printf(“%d”, v[i]); } 0 1 2 3 ‹nº› 40 ‹nº› Vetor : acesso por indexação 17 42 23 34 v v V[2] = 99; Armazenando valor na 3ª posição ‹nº› 41 ‹nº› Vetor : acesso por indexação 17 42 99 34 v v Armazenando valor na 3ª posição ‹nº› 42 ‹nº› Vetor : acesso por indexação 17 42 99 34 v v 1 i V[i] = 77; Armazenando valor na i_ésima posição ‹nº› 43 ‹nº› Vetor : acesso por indexação 17 42 99 34 v v 1 i V[i] = 77; Armazenando valor na i_ésima posição 77 ‹nº› 44 ‹nº› Resumo Vetor VETOR: Variável capaz de armazenar vários elementos simultaneamente A variável é dividida em várias células (posições) identificadas por um nº (índice) Cada valor fica armazenado em uma posição (célula)do vetor As células podem ser acessadas por seu endereço ou pelo número de seu índice EM C: Na declaração da variável vetor é necessário determinar a quantidade de células (elementos) e o tipo de dado dos elementos Um vetor de dimensão DIM os índices variam de 0 a DIM-1 0 1 2 3 4 5 6 7 8 9 5 3 2 1 5 3 2 1 4 4 Vetor ‹nº› 45 ‹nº› Resumo Declaração e Inicialização int a, b[20],c[10]; /* declara uma variável simples e dois vetores inteiros*/ float notas[6]; /* declara um vetor de reais*/ double d[30], e, f[5]; /* declara dois vetores e uma variável simples */ Declaração com inicialização: int v[5] = {12, 5, 34, 32, 9}; Inicialização com valores diferentes após a declaração: notas[0]=7.5; notas[1]=9.9; notas[2]=8.7 ; notas[3]=3.2; notas[4]=9.8; notas[5]=1.2; Inicialização com mesmo valor após a declaração: for(i=0;i<10;i=i+1) { v[i]=0; } ‹nº› 46 ‹nº› Voltando ao exercício - Declaração e Inicialização int vgab[10]; // índices variam de 0 a 9 Esta declaração reserva um espaço de memória para armazenar 10 valores inteiros e este espaço de memória é referenciado pelo nome vgab. O identificador vgab armazena o endereço da área onde os dados são armazenados Para acessar uma posição é necessário identificá-la por um número que varia de 0 a DIM-1 Inicialização de algumas posições do vetor gabarito: * (vgab+0) = 5; * (vgab+1)] = 3; vgab[4]= 3; vgab[9] = 4; 5 3 ? ? 3 ? ? ? ? 4 0 1 2 3 4 5 6 7 8 9 vgab ‹nº› 47 ‹nº› Voltando ao exercício Faca um programa capaz de corrigir uma prova de múltipla escolha. A prova terá 10 questões, valendo 1 ponto cada uma. Cada questão tem 5 alternativas numeradas de 1 a 5. O programa deve inicialmente obter o gabarito da prova. Ele será constituído de um conjunto de 10 números representando a alternativa correta de cada questão ( um número entre 1 e 5) Após a leitura do gabarito, o programa devera corrigir as provas dos alunos. Portanto, para cada aluno da turma, captura sua matrícula e suas respostas (validando-as), calculando sua nota de acordo com o gabarito e exibindo-a. A leitura termina com um código de matricula negativo. Obtém gabarito Captura matrícula Calcula acertos(nota) de acordo c/o gabarito Exibe matrícula e nota Matr ≠ 0 ‹nº› 48 ‹nº› int main (void) { int vgab[10]; scanf ( "%d", (vgab+0)); scanf ( "%d", (vgab+1)); scanf ( "%d", (vgab+2)); scanf ( "%d", (vgab+3)); scanf ( "%d", (vgab+4)); scanf ( "%d", (vgab+5)); scanf ( "%d", (vgab+6)); scanf ( "%d", (vgab+7)); scanf ( "%d", (vgab+8)); scanf ( "%d", (vgab+9)); vgab int main (void) { int gab1, gab2,gab3,gab4gab5; int gab6,gab7,gab8,gab8,gab10; scanf ( "%d", &gab1); scanf ( "%d", &gab2); scanf ( "%d", &gab3); scanf ( "%d", &gab4); scanf ( "%d", &gab5); scanf ( "%d", &gab6); scanf ( "%d", &gab7); scanf ( "%d", &gab8); scanf ( "%d", &gab9); scanf ( "%d", &gab10); gab1 gab2 gab3 gab4 gab5 gab6 gab7 gab8 gab9 gab10 4 5 6 7 0 1 2 3 8 9 Voltando ao Exercício com vetor ARGHH!! ‹nº› int main (void) { int vgab[10]; scanf ( "%d", (vgab+0)); scanf ( "%d", (vgab+1)); scanf ( "%d", (vgab+2)); scanf ( "%d", (vgab+3)); scanf ( "%d", (vgab+4)); scanf ( "%d", (vgab+5)); scanf ( "%d", (vgab+6)); scanf ( "%d", (vgab+7)); scanf ( "%d", (vgab+8)); scanf ( "%d", (vgab+9)); 4 5 6 7 0 1 2 3 8 9 vgab for ( pos=0 ; pos < 10; pos ++) { scanf ( "%d", (vgab + pos)); } for ( pos=0 ; pos < 10; pos ++) { scanf ( "%d", &vgab[pos]); } ‹nº› Solução – Capturar Gabarito #include <stdio.h> int main (void) { int pos; int vgab[10]; for (pos=0; pos<10; pos++) { printf("Digite a resposta da questão %d", pos+1); scanf("%d", (vgab+pos)); } ……. return 0; Como garantir que o gabarito só contenha números que sejam respostas ( 1 a 5)? Os valores digitados precisam ser validados!!! ‹nº› 51 ‹nº› Solução – Capturar Gabarito int ler_resp_valida(int questao){ int resp; printf( “\nQuestao %d - Digite a sua opcao de resposta (1 a 5): ”,questao ); scanf( “%d”, &resp); while ( resp <1 || resp >5){ printf( “\n\tOpcao invalida. Digite a sua opcao de resposta – 1 a 5”: ) scanf( “%d”, &resp); } return resp; } int main (void){ int pos, vgab[10]; /* Obter gabarito */ for (pos=0; pos<10; pos++){ vgab[pos] = ler_resp_valida(pos+1); } /* exibir as respostas armazenadas no gabarito */ /* Para cada aluno da turma */ /* Corrigir a prova de um aluno */ return 0; } ‹nº› 52 ‹nº› Solução – Capturar Gabarito int ler_resp_valida(int questao){ int resp; printf( “\nQuestao %d - Digite a sua opcao de resposta (1 a 5): ”,questao ); scanf( “%d”, &resp); while ( resp <1 || resp >5){ printf( “\n\tOpcao invalida. Digite a sua opcao de resposta – 1 a 5”: ) scanf( “%d”, &resp); } return resp; } int main (void){ int pos, vgab[10]; /* Obter gabarito */ for (pos=0; pos<10; pos++){ vgab[pos] = ler_resp_valida(pos+1); } /* exibir as respostas armazenadas no gabarito */ for (i=0; i<10; i++) { printf("\n Questão %d – %d", i+1, *(vgab+i)); } /* Para cada aluno da turma */ /* Corrigir a prova de um aluno */ return 0; } ‹nº› 53 ‹nº› Solução – Calcular acertos /* Para cada aluno da turma */ printf("Digite a matr"); scanf("%d",&matr); while(matr>0) { /* Corrigir a prova de um aluno */ nota=0; for (questao=1; questao<=10; questao = questao + 1) { resp= ler_resp_valida(questao); pos=questao -1; if (resp == gabarito[pos]) nota=nota+1; } printf("\n Matr: %d – Nota %d",matr,nota); printf("Digite a matr"); scanf("%d",&matr); } return 0; Função!!! ‹nº› 54 ‹nº› printf("Digite a matr"); scanf("%d",&matr);while(matr>0) { for (questao=1; questao<=10; questao = questao + 1){ prova[questao-1]= ler_resp(questao); } nota=0; for (i=0; i<10; i++) { printf("\nQuestao %d - %d", i+1, prova[i]); if (prova[i] == gabarito[i]) { nota=nota+1; printf("\tCORRETA" ); } else printf("\tINCORRETA" ); } printf("\n Matr: %d – Nota %d",matr,nota); printf("Digite a matr"); scanf("%d",&matr); } Armazenando as respostas do aluno em um vetor ( int provas[10]) para depois de capturadas, mostrar as questões válidas/ inválidas e a nota ‹nº› 55 ‹nº› Resolvendo com funções Obtém gabarito ( função carrega(...)) Para cada aluno Capturar matrícula Calcular acertos(nota) de acordo c/o gabarito ( função calcula_acertos(...)) Exibir matrícula e nota Faca um programa capaz de corrigir uma prova de múltipla escolha. A prova terá 10 questões, valendo 1 ponto cada uma. Cada questão tem 5 alternativas numeradas de 1 a 5. O programa deve inicialmente obter o gabarito da prova. Ele será constituído de um conjunto de 10 números representando a alternativa correta de cada questão ( um número entre 1 e 5) Após a leitura do gabarito, o programa devera corrigir as provas dos alunos. Portanto, para cada aluno da turma, captura sua matrícula e suas respostas (validando-as), calculando sua nota de acordo com o gabarito e exibindo-a. A leitura termina com um código de matricula negativo. corrige_provas(...)) ‹nº› 56 ‹nº› Vetor e Funções #define MAXQ 5 int main(void) { int gabarito[MAXQ]; carrega(??????); corrige_provas(??????); return 0; } ? ? ? ? ? 0 1 2 3 4 gabarito ‹nº› Vetor e Funções #define MAXQ 5 int main(void) { int gabarito[MAXQ]; carrega(gabarito); corrige_provas(gabarito); return 0; } ? ? ? ? ? 0 1 2 3 4 gabarito ‹nº› int main(void) { int gabarito[MAXQ]; carrega(gabarito); corrige_provas(gabarito); return 0; } void carrega ( ????????? ) { int i; for (i=0; i<MAXQ; i++) { printf("Questão%d",i+1); gab[i]= ler_resp_valida(i+1)); } return ; } void carrega( int gab[ ]) int * gab ? ? ? ? ? 0 1 2 3 4 gabarito Vetor e Funções ‹nº› 59 ‹nº› void carrega ( int gab[ ] ) { int i; for (i=0; i<MAXQ; i++) { printf("Questão%d",i+1); gab[i]= ler_resp_valida(i+1)); } return ; } int main(void) { int gabarito[MAXQ]; carrega(gabarito); corrige_provas(gabarito); return 0; } ? ? ? ? ? 0 1 2 3 4 gabarito Vetor e Funções gab ‹nº› 60 ‹nº› Corrigindo as Provas int calcula_acertos(int gabarito[ ] ){ int nota,questao,pos,resp; nota=0; for (questao=1; questao<MAXQ; questao = questao + 1){ printf("Digite sua resposta da questão %d", questao); scanf("%d",&resp); pos=questao -1; if (resp == gabarito[pos])) nota=nota+1; } return nota; } void corrige_provas( int gabarito[ ]){ int matr,nota; scanf( "%d",&matr); while ( matr>0){ nota=calcula_acertos(gabarito); printf("%d - %d",matr,nota); scanf("%d",&matr); } return ; } ‹nº› Solução do exercício de correção automática com funções int calcula_acertos(int gabarito[]) { int nota,questao,pos,resp; nota=0; for (questao=1; questao<=MAXQ; questao ++) { printf("Questão%d",questao); scanf("%d",&resp); pos=questao -1; if (resp == gabarito[pos]) nota=nota+1; } return nota; } void corrige_provas( int gab[ ]) { int matr,nota; scanf( "%d",&matr); while ( matr>0) { nota=calcula_acertos(gab); printf("%d - %d",matr,nota); scanf("%d",&matr); } return ; } void carrega ( int gab [ ] ) { int i; for (i=0; i<MAXQ; i++) { printf("Questão%d",i+1); scanf("%d", (gab+i)); } return ; } int main(void) { int gabarito[MAXQ]; carrega(gabarito) corrige_provas(gabarito); return 0; } ‹nº› Vetores Passados para Funções Representação de vetores na memória: vetor é alocado em posições contíguas de memória Exemplo: int v[10]; v = vetor de inteiros com 10 elementos espaço de memória de v = 10 x valores inteiros de 4 bytes = 40 bytes Nome do vetor armazena o endereço inicial da área, isto é, onde na memória está o primeiro valor do vetor v armazena 104 ‹nº› 63 63 ‹nº› Vetores Passados para Funções Exemplo: int main(void){ int v[10]={12,23,34,45,56,67,78,89,90,14}; exibir_vetor(v,10); return 0; } Passagem de vetor para função: consiste em passar o endereço da primeira posição do vetor "passar um vetor para uma função" é equivalente a "passar o endereço inicial do vetor" elementos do vetor não são copiados para a função argumento copiado é apenas o endereço do primeiro elemento a função chamada recebe uma referência para o vetor , ou seja, a função chamada, quando acessa os elementos, acessa as mesmas posições de memória que a função que declarou vetor. 14 144 90 89 78 67 56 45 34 23 v 12 104 ‹nº› 64 ‹nº› Vetores Passados para Funções CONSEQUÊNCIAS: se atribuirmos um valor a um elemento do vetor passado como parâmetro, este elemento também é alterado no vetor original. Uma função auxiliar pode ser chamada para acessar e/ou modificar os elementos de um vetor de outra função. A referência do vetor passada para a função indica apenas o início do espaço de memória a partir do qual os elementos estão armazenados. Para a função chamada, a dimensão do vetor original é indiferente – a função sempre recebe apenas uma referência para o início da área de memória. Como tratar o problema da quantidade de elementos? Receber como parâmetro, também, o número de elementos do vetor. ‹nº› 65 ‹nº› Exercício Faça um programa que capture valores de dois vetores de reais de 4 elementos e mostre o produto interno dos dois vetores. Exemplo: X = (1,2,3,4) Y = (4,3,2,1) X.Y = 1*4 + 2*3 + 3*2 + 4*1 = 20 ‹nº› Possível Solução # define TAM 4 int main(void) { int X[TAM] , Y[TAM], i , prodint; for(i=0;i<TAM;i=i+1) { printf("Valor:"); scanf("%d",&X[i]); } for(i=0;i<TAM;i=i+1) { printf("Valor:"); scanf("%d", &Y[i]); } prodint=0; for(i=0;i<TAM;i++) prodint= prodint + X[i]*Y[i]; printf( "\n Produto interno destes vetores: %d", prodint); return 0; } prodint ? i ? Y 120 X 104 3 ? 2 ? 1 ? 0 ? 120 3 ? 2 ? 1 ? 0 ? 104 prodint ? i Y 120 144 X 104 3 1 2 2 1 3 0 4 120 3 4 2 3 1 2 0 1 104 20 ‹nº› Possível Solução com função #define TAM 4 int main(void) { int X[TAM],y[TAM], prodint; int i; for(i=0;i<TAM;i=i+1) { printf("Valor:"); scanf("%d", &X[i]); } for(i=0;i<TAM;i=i+1) { printf("Valor:"); scanf("%d",&Y[i]); } prodint=0; for(i=0;i<TAM;i=i+1) { prodint= prodint + X[i] * Y[i]; } printf( "\n Produto interno destes vetores: %d", prodint); return 0; } FUNÇÃO PARA PREENCHER VETOR Recebe o vetor sem valores ("vazio" ) Preenche as posições com os valores capturados devolve o vetor com valores ‹nº› 68 ‹nº› Vetores Passados para Funções # define TAM 4 void preencher_vetor( ???????? ) { int i; for( i=0; i < TAM ; i=i+1) { scanf( "%d", v+i ); } return; } int main(void){ int X[TAM],Y[TAM]; preencher_vetor(X); return 0; } ? ? ? 120 ? ? ? ? 104 int * v void preencher_vetor( int v[ ]) ? ? ? ? ? ? 120 4 3 2 1 104 v X Y 104 120 Preencher o vetor Y ‹nº› 69 ‹nº› Vetores Passados para Funções # define TAM 4 void preencher_vetor( int v[] ) { int i; for( i=0; i < TAM ; i=i+1) { scanf( "%d", v+i); } return; } int main(void){ int X[TAM],Y[TAM]; preencher_vetor(X); preencher_vetor(Y); ....... return 0; } ? ? ? 120 ? ? ? ? 104 Preencher o vetor Y ? ? ? ? ? ? 120 4 3 2 1 104v X Y 104 120 v 1 2 3 4 ‹nº› 70 ‹nº› #define TAM 4 void preenche_vetor(int v[ ]) { int i; for( i=0; i<TAM ; i=i+1) { printf("Valor:"); scanf("%d", v+i); } } int main(void) { int X[TAM],y[TAM], prodint; int i; preenche_vetor( X); preenche_vetor( Y); prodint=0; for(i=0;i<TAM;i=i+1) { prodint= prodint + X[i]*Y[i]; } printf( "\n Produto interno destes vetores: %d", prodint); return 0; } Faça uma função que calcule o produto interno bruto: Recebe os vetores, e retorna o valor do produto interno Solução com função ‹nº› Solução com função #define TAM 4 void preenche_vetor(int v[ ]) { int i; for( i=0; i<TAM ; i=i+1) { printf("Valor:"); scanf("%d", &v[i]); } return; } int produto_interno( int x[], int y[]) { int i; int prodint=0; for(i=0;i<TAM;i=i+1) { prodint= prodint + X[i]*Y[i]; } return prodint; } int main(void) { int X[TAM],y[TAM], prodint; preenche_vetor( X); preenche_vetor( Y); printf("\nProduto interno destes vetores: %d", produto_interno(X,Y)); return 0; } ‹nº› ‹nº› Vetores Passados para Funções # define TAM 10 void preencher_vetor( int v[]) { int i; for( i=0; i < TAM ; i=i+1) { scanf( "%d", v+i); } return; } int main(void){ int X[TAM],Y[TAM]; preencher_vetor(X); return 0; } ? ? ? 120 ? ? ? ? 104 ? ? ? ? ? ? ? ? ? ? ? ? ? ? 104 v X 104 Y 144 Como tratar o problema da quantidade de elementos? Como a função "sabe" onde o vetor "termina"? ‹nº› 74 ‹nº› Vetores Passados para Funções Como tratar o problema da quantidade de elementos? Como a função "sabe" quando o vetor "terminou"? SOLUÇÃO: A função chamada deve receber também o número de elementos do vetor como parâmetro: void preencher_vetor(int n, int v[ ]) ‹nº› 75 ‹nº› Vetores Passados para Funções # define TAM 10 void preencher_vetor(int n , int v[]) { int i; for( i=0; i < n; i++) { scanf( "%d", v+i); } return; } int main(void) { int X[TAM],Y[TAM]; preencher_vetor(TAM, X); exibe_vetor (TAM, X); } 144 ? ? ? ? ? ? ? ? ? vet ? 104 v n 10 E SE SÃO NO MÁXIMO 10 ELEMENTOS???? ‹nº› 76 ‹nº› Vetores Passados para Funções 144 ? ? ? ? 67 56 45 34 23 X 12 104 X NO MÁXIMO 10 ELEMENTOS???? QUANTOS???? Não necessariamente TAM Depende da quantidade de elementos preenchidos pela função anterior int main(void) { preencher_vetor( TAM, X); exibir_vetor (?????, X); } ‹nº› 77 ‹nº› Vetores Passados para Funções int preencher_vetor( int n, int v[ ]) { int i, num; printf(" Qual o número?"); scanf( "%d", &num) while( i < n && num !=0) { *(v+i)=num; printf(" Qual o número?"); scanf( arq,"%d", &num) i++; } return i; } 144 ? ? ? ? 67 56 45 34 23 X 12 104 v n 10 NO MÁXIMO 10 ELEMENTOS!!! qt = preencher_vetor( TAM, X); exibir_vetor (qt, X); qt 6 ‹nº› 78 ‹nº› Exercício Uma disciplina possui 10 provas com pesos distintos. Faça uma programa que capture o peso de cada uma das 10 provas. A seguir, para cada um dos alunos, capture sua matrícula, o número da prova (NÃO NECESSARIAMENTE EM ORDEM!!!!) e a nota de cada das 10 avaliações, mostrando a média ponderada de suas notas Ex: Pesos: Aluno 1: prova: 3 5.0 5.0 * 1 4 1.0 1.0 * 4 2 10.0 10.0 * 3 1 10.0 ... 6 8.0 7 7.0 9 1.0 10 3.0 5 4.0 8 10.0 2 3 1 4 4 2 6 4 4 5 ‹nº› Exercício Uma disciplina possui NO MÁXIMO 10 provas com pesos distintos. Faça uma programa que capture o peso de cada uma das 10 provas. A seguir, para cada um dos alunos, capture sua matrícula, o número da prova (NÃO NECESSARIAMENTE EM ORDEM!!!!) e a nota de cada das 10 avaliações, mostrando a média ponderada de suas notas Ex: Pesos: Aluno 1: prova: 3 5.0 5.0 * 1 4 1.0 1.0 * 4 2 10.0 10.0 * 3 1 10.0 ... 6 8.0 7 7.0 9 1.0 10 3.0 5 4.0 8 10.0 2 3 1 4 4 2 6 4 4 5 ‹nº› int preenche_vetor(int k, float vpesos[ ], float*tot) { int i; float p; *tot = 0; printf("\nPeso: "); scanf("%f",&p]); while(i<k && p>0) { vpesos[i]=p; *tot= *tot+vpesos[i]; printf("\nPeso: ");scanf("%f",&p); } return i; } float processa_aluno(float v[],int n, float soma){ float med=0,nota; int i,npr; for(i=0;i<n;i++) { printf( "Nº da prova? "); scanf( "%d",&npr); printf( "Nota da prova %d? ",npr); scanf( "%f",¬a); med= med + nota*v[npr-1]; } return med/soma;} int main(void) { float vpesos[ TAM ],totpeso,media; int i,matr,n; n = preenche_vetor( TAM, vpesos,&tot_peso); printf("\n Matricula?"); scanf("%d",&matr); while(matr!=0) { media=processa_aluno(vpesos, n, totpeso); printf( "\nAluno %d - Media %f", matr,media); printf("\n Matricula?"); scanf("%d",&matr); } return 0; } # define TAM 10 ‹nº› Jan Fev Mar Abr Mai Jun Jul Ago Set Out Nov Dez 0.1 0.1 0.1 0.2 0.2 0.2 0.3 0.2 0.3 0.2 0.1 0.3 Exercício Valor aplicado: 100,00 Mês Aplicação: 11 100,00 *1.1 110,00 * 1.3 143,00 Faça um programa que capture o índice de reajuste de cada mês do ano anterior de uma caderneta de poupança do arquivo TAXAS.txt. A seguir, para cada investidor, capture o número da conta, o valor aplicado e o mês em que aplicou, mostrando quanto possui no final do ano. Lembre-se que o montante aplicado no segundo mês é equivalente ao montante inicial acrescido do reajuste do primeiro mês. A entrada de dados é finalizada quando for digitado o valor 0 como o número de conta. Exemplo: Reajustes ‹nº› Exercício Dada uma seqüência de 14556 números, exibir a soma dos números "simétricos em posição" isto é, 0 1º c/ último, 2º com penúltimo, 3º c/antepenúltimo, etc.. ‹nº› Exercício Faça um programa que leia o dia e mês de um evento e o dia e mês atual, mostrando quantos dias faltam para o evento ocorrer. Exemplo: Quando o evento não é no mês corrente: atual:19 04 evento: 25 08 Meses completos: 07, 06, 05 Meses incompletos: 04 ( 30 – 19 dias) 11 dias Meses incompletos: 08 25 dias Quando o evento é no mês corrente: atual:19 04 evento: 25 04 Meses incompletos: 04 ( 30 – 19 dias) 11 dias DICA p/Solução: Crie um vetor meses, com 12 posições e inicialize-o com os dias em cada mês: int meses[12] = {31,28,31,30,31,30,31,31,30,31,30,31} ‹nº› 1) Um copo cilíndrico com 4 cm de raio e 12 cm de altura, está com água até a altura de 8 cm. Foram, então, colo cadas em seu interior n bolas de gude, e o nível da água atingiu a boca do copo, sem derramamento. Qual é o volume, em cm 3 , de todas as n bolas de gude juntas? 1) 32 π 2) 48 π 3) 64 π 4) 80 π 5) 96 π 2) Uma lata de leite em pσ, em forma de um cilindro reto, possui 8 cm de altura com 3 cm de raio na base. Uma outra lata de l eite, de mesma altura e cujo raio ι o dobro da primeira lata, possui um volume 1) duas vezes maior. 2) trκs vezes maior. 3) quatro vezes maior. 4) sete vezes maior. 5) oito vezes maior. 3) Duas pessoas, partindo de um mesmo local, caminham em direηυes ortogonais. Uma pessoa caminhou 12 metros para o sul, a outra, 5 metros para o leste. Qual a distβncia que separa essas duas pessoas? 1) 7 m. 2) 13 m. 3) 17 m. 4) 60 m. 5) 119 m. 4) Um pintor dispυe de 6 cores diferentes de tinta para pintar uma casa e precisa escolher uma cor para o interior e outra diferente para o exterior, sem fazer n enhuma mistura de tintas. De quantas maneiras diferentes essa casa pode ser pintada usando - se apenas as 6 cores de tinta que ele possui? 1) 6 2) 15 3) 20 4) 30 5) 60 5) Ao passar sua mγo direita por todos os vιrtices e arestas de um poliedro, somenteuma vez, um deficiente visual percebe que passou por 8 vιrtices e 12 arestas. Conclui - se que o nϊmero de faces desse poliedro ι igual a 1) 20. 2) 12. 3) 8. 4) 6. 5) 4. 6) Um cientista descobriu que o movimento de uma partícula no espaço segue uma trajetória descrita pelo polinômio P(x) = 5x 2 + 5x – 30 . Este polinômio pode ser fatorado na seguinte forma 1) 5(x – 5) (x – 3). 2) 5(x – 2) (x + 3). 3) 5(x + 2) (x – 3). 4) 5(x – 2) (x – 3). 5) 5(x + 5) (x + 3). v 10 4 1 44 v 10 4 1 44
Compartilhar