[C] Matrizes e estruturas de repetição - C/C#/C++ - Clube do Hardware
Matrizes e estruturas de repetição
C Matrizes e estruturas de repetição
float nota[3][10];
for (j=1; j<=3; j++) {
printf("Digite a nota da %dª prova:\n", j);
scanf("%f", &nota[j][i]);
media = nota[j][i] + media;
printf("\n%.2f\n", media);
Como eu posso fazer com que a media de cada aluno seja exibida logo depois de digitar as notas? Ex: Digite a nota da 1ª prova: 10/ Digite a nota da 2ª prova: 10/ Digite a nota da 3ª prova: 10/ A media do aluno é igual a: 10 / Digite a nota da 1ª prova:
Só colocar o printf fora do segundo for:
@iHollyZinhO Olá. Talvez por descuido você está fazendo o cálculo da média de forma errônea. O q você está calculando é na verdade o soma das notas.
Segue uma maneira de fazer essa operação:
float notas[TAM];
float media = 0.0, soma = 0.0;
printf("Digite a nota %d da prova: ", i + 1);
media = (soma / i); // i nesse momento está valendo 5, que é a qtde de notas
printf("\nMedia das notas: %.2f\n", media);
@Gustavo Malheiro Só colocando o cálculo da média tal como você quis dizer, seu código ficaria assim:
Vê se é isso q você quer:
float notas[10][3];
media = 0; soma = 0;
printf("\nDigite a nota da prova %d: ", j + 1);
scanf("%f", &notas[i][j]);
soma += notas[i][j];
media = (soma / 3);
printf("\nMedia do aluno: %.2f\n", media);
só q ainda a melhor abordagem para esse exercício é criar uma matriz unidimensional para armazenas as notas:
Fazer a leitura das notas dessa forma:
printf("Digite a nota da prova %d: ", j + 1);
A soma dessa forma:
soma += notas[i]; // aqui é o mesmo que fazer soma = soma + notas[i];
E usar o segundo for apenas para controlar a quantidade de notas lidas, no caso, de 3 em 3
10 horas atrás, Gustavo Malheiro disse:
Como eu posso fazer com que a media de cada aluno seja exibida logo depois de digitar as notas?
Resumidamente seria basicamente o que sugere o @iHollyZinhO:
Só com uma observação na frase... o correto a dizer seria "fora do primeiro for", já que ainda está dentro do segundo.
Mas ai também entra o relatado por @giu_d:
Talvez por descuido você está fazendo o cálculo da média de forma errônea
Ou seja, um pequeno ajuste na hora de calcular a média... ou seja, primeiro acumula as notas, depois calcula a média dividindo pela quantidade de notas.
Resumidamente poderia ser algo assim:
//#include <stdlib.h>   NÃO ESTÁ SENDO UTILIZADA
//float nota[3][10];   SUGIRO USAR A NOMENCLATURA NO PLURAL
float notas[3][10]; //3 notas para cada um dos 10 alunos
float soma;         //soma das notas do aluno atual
float media;        //media do aluno atual
int i, j;           //auxiliares para percorrer o vetor
for (i=0; i<10; i++) { //para cada um dos alunos
soma = 0; //inicializa a variável (para não ficar com as somas anteriores)
//for (j=1; j<=3; j++) { O ÍNDICE COMEÇA DE 0
for (j=0; j<3; j++) { //para cada uma das notas do aluno
//printf("Digite a nota da %dª prova:\n", j);   SUGIRO TIRAR A QUEBRA DE LINHA PARA LER NA MESMA LINHA
//printf("Digite a nota da %dª prova: ",j);   COMPENSAR O J, JÁ QUE COMEÇA COM 0
printf("Digite a nota da %dª prova: ",j+1);
scanf("%f",&notas[j][i]);
//media = media + nota[j][i]; //a média é calculada posteriormente
soma = soma+notas[j][i]; //vai acumulando as notas do aluno
media = soma/j; //calcula a média
printf("\nMedia das notas: %.2f\n",media);
Código enxuto:
Obs.: não sei em relação ao uso do fflush(stdin). Como não sei como funciona, deixo com o mais experientes com o C. As minhas sugestões é sobre a lógica, ai já entra na questão da sintaxe (característica da linguagem).
Creio que não... na verdade tudo depende do enunciado e contexto. Dá tanto para fazer com uma matriz bidimensional, tanto com uma unidimensional... assim como pode ser feito sem matriz... vejam, a matriz (da forma que o código está funcionando) não tem utilidade alguma... talvez "gasto de memória".
float nota; //nota atual do aluno
float soma;  //soma das notas do aluno atual
float media; //media do aluno atual
int i, j;    //auxiliares para percorrer o vetor
soma = soma+nota; //vai acumulando as notas do aluno
Como sugerido, vai depender do enunciado... se foi pedido para fazer com matriz bidimensionais, tem que ser feito com 2 dimensões... se foi com uma, faz com uma... se não foi citado.. "faz da forma que quiser". Mas vejam também: outro fator que pode influenciar em como vai fazer é o contexto, ou seja, se ele estiver estudando matrizes de 2 dimensões, faz todo sentido fazer com 2 dimensões (apesar de não ter utilidade no contexto). O uso de matrizes seria útil se fosse calcular os dados posteriormente, algo como primeiro apenas leria as notas, depois percorria novamente a matriz e ia fazendo os cálculos... da forma que foi feita, já calculando junto, não precisa de matriz (como demonstrado no código acima).
Enunciado (e contexto) é quem manda!
Só gostaria de frisar uma questão. Se nesse exercício for usado a biblioteca <locale.h> e depois a localização sendo definida da forma como está sendo:
para a média seja calculada de forma correta, se for inserir uma nota com casas decimais como 7.5, nesse caso, seria preciso fazer o uso da vírgula e não do ponto ao informar a nota, q é o de acordo como o padrão brasileiro
Para a nota mostrada como exemplo, teria q ser digitado 7,5 para que o cálculo da média seja feito de maneira correta
Viuge!! Usando setlocale(LC_ALL,"Portuguese"); também aconteceu a mesma coisa. Então, como fazer para aceitar os acentos e ao mesmo tempo deixar usando "." para separar as casas decimais? (já que é o padrão)
obs.: claro que se o desejo for usar ",", o problema está resolvido! rs
E sobre o fflush(stdin)? por que usar ele?
PS: vi que sem ele, ao usar "." o programa buga.. como se fizesse um monte de leitura, mas em compensação, usando não dá erro, ou seja, não fica visível o problema do uso incorreto da separação das casas decimais
- A função system() pertence a biblioteca <stdlib.h>.
- Use LC_CTYPE ao invés de LC_ALL no setlocale() para mudar apenas o comportamento dos caracteres.
33 minutos atrás, Simon Viegas disse:
O comando fflush(stdin) é usado para limpar o buffer de entrada. Evitando com isso q valores 'sujos' interfiram nas leituras seguintes e até mesmo interfira no resultado de alguma operação.
Não sei dizer da eficácia exata desse comando. Devido a isso já tem duas outras soluções, 1 delas encontrei aqui mesmo nesse fórum q é uma função q foi criada pelo @isrnick Já fazia uso da lógica dessa função ao usar o comando fgets() para ler uma string. Seria isso:
Outra delas, q tem o mesmo objetivo de limpar a sujeira do buffer, seria essa:
Essas funções são usadas geralmente após a leitura de um valor pelo teclado. Ou seja, depois de um scanf()
setlocale(LC_CTYPE,"Portugue");
Não funcionou... . Não consegui achar como usar...
Como o fica a linha?
@Simon Viegas Você escreveu "Portugue" na string mude para "Portuguese".
Muito estranho estranho. Lembro de só trocado o primeiro parâmetro. kkkkkkkkkkk
Usei assim e funcionou também:
@Simon Viegas Sobre limpeza do stream de entrada stdin...
Ao usarmos funções como scanf, fgets, fgetc, getchar, para ler dados digitados pelo usuário no terminal o comando espera que um conjunto específico de dados seja lido, seja uma quantidade de caracteres em geral, ou apenas caracteres que compõem um número válido (dígitos, sinal, ponto, etc), ou...
Mas ele não captura o que não foi especificado, ou seja, se o usuário digitar algo muito longo, ou algo que não seja válido (digitar letras quando espera-se números por exemplo), ou até digitar outras coisas além do que aquilo que o comando pretende capturar, isso vai ficar sobrando na entrada padrão sem ser lido.
Mesmo em uma situação normal em que o usuário digitou exatamente o que é esperado pelo menos 1 caractere costuma ficar sobrando na entrada padrão, o caractere nova linha '\n', que é inserido quando o usuário aperta Enter após digitar a entrada a ser capturada.
O que resulta que o próximo scanf, fgets, etc, no programa pode capturar esses caracteres que sobraram na entrada, ao invés de esperar que o usuário digite algo, o que gera erros.
Por isso precisamos limpar o que fica no stdin para evitar esse problema.
@giu_d A função fflush é para streams de saída apenas, e tem comportamento indefinido para streams de entrada, coincidentemente ela funciona para limpar o stdin em alguns compiladores, mas como o comportamento é indefinido pode não funcionar da mesma maneira em outros compiladores, por isso não é recomendado usar com stdin.
@isrnick É. Eu já havia mencionado acima q não sabia ao certo da eficácia do comando fflush(stdin); , por isso estou fazendo uso das funções q passei acima. Valeu pela explicação!