Ir ao conteúdo
  • Cadastre-se
Gustavo Malheiro

C Matrizes e estruturas de repetição

Recommended Posts

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>




int main(void) {

    setlocale(LC_ALL, "Portuguese");
    float media;
    float nota[3][10];
    int i, j;

    for(i=0; i<10; i++){
            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);
            }
        }



    system("pause");
	return 0;
}

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:

Deu pra entender mais ou menos?

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só colocar o printf fora do segundo for:

for(i=0; i<10; i++){
  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);
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@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:

 

#include <stdio.h>

#define TAM 5

int main() {

    float notas[TAM];
    float media = 0.0, soma = 0.0;
    int i, j;

    for (i = 0; i < TAM; i++) {
        printf("Digite a nota %d da prova: ", i + 1);
        scanf("%f", &notas[i]);
        fflush(stdin);

        soma += notas[i];
    }

    media = (soma / i); // i nesse momento está valendo 5, que é a qtde de notas

    printf("\nMedia das notas: %.2f\n", media);

    return 0;
}

 

adicionado 25 minutos depois

@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:

 

#include <stdio.h>


int main() {

    float notas[10][3];
    float media = 0.0, soma = 0.0;
    int i, j;

    for (i = 0; i < 10; i++) {
        media = 0; soma = 0;
        for (j = 0; j < 3; j++) {
            printf("\nDigite a nota da prova %d: ", j + 1);
            scanf("%f", &notas[i][j]);
            fflush(stdin);

            soma += notas[i][j];
        }

        media = (soma / 3);
        printf("\nMedia do aluno: %.2f\n", media);
    }

    return 0;
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

só q ainda a melhor abordagem para esse exercício é criar uma matriz unidimensional para armazenas as notas:

 

float notas[10];

Fazer a leitura das notas dessa forma:

printf("Digite a nota da prova %d: ", j + 1);
scanf("%f", &notas[i]);

 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

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá a todos.

 

1#

Sobre:

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:

9 horas atrás, iHollyZinhO disse:

Só colocar o printf fora do segundo for:

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:

9 horas atrás, giu_d disse:

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 <stdio.h>
//#include <stdlib.h>   NÃO ESTÁ SENDO UTILIZADA
#include <locale.h>
int main(void) {
    setlocale(LC_ALL,"Portuguese_Brazil");
    //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);
    }
    system("pause");
    return 0;
}

Código enxuto:

#include <stdio.h>
#include <locale.h>
int main(void) {
    setlocale(LC_ALL,"Portuguese_Brazil");
    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=0; j<3; j++) { //para cada uma das notas do aluno
            printf("Digite a nota da %dª prova: ",j+1);
            scanf("%f",&notas[j][i]);
            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);
    }
    system("pause");
    return 0;
}

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).

 

 

 

2#

Sobre:

8 horas atrás, giu_d disse:

só q ainda a melhor abordagem para esse exercício é criar uma matriz unidimensional para armazenas as notas:


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".

 

O código poderia ficar assim:

#include <stdio.h>
#include <locale.h>
int main(void) {
    setlocale(LC_ALL,"Portuguese_Brazil");
    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
    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=0; j<3; j++) { //para cada uma das notas do aluno
            printf("Digite a nota da %dª prova: ",j+1);
            scanf("%f",&nota);
            soma = soma+nota; //vai acumulando as notas do aluno
        }
        media = soma/j; //calcula a média
        printf("\nMedia das notas: %.2f\n",media);
    }
    system("pause");
    return 0;
}

 

RESUMINDO:
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!

 

 

***

 

No aguardo.

 

 

 

 

 

 

 

 

 

 

 

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

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:

setlocale(LC_ALL,"Portuguese_Brazil");

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

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, giu_d disse:

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:


setlocale(LC_ALL,"Portuguese_Brazil");

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

adicionado 0 minutos depois

E sobre o fflush(stdin)? por que usar ele?

adicionado 3 minutos depois

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 :exorcize:

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Simon Viegas 

- 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.

  • Curtir 3
  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
33 minutos atrás, Simon Viegas disse:

E sobre o fflush(stdin)? por que usar ele?

 

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:

 

void fflush_stdin() {

    int ch;

    while ((ch = getchar()) != '\n' && ch != EOF);
}

Outra delas, q tem o mesmo objetivo de limpar a sujeira do buffer, seria essa:

 

void limpa_linha() {
    scanf("%*[^\n]");
    scanf("%*c");
}

 

adicionado 17 minutos depois

Essas funções são usadas geralmente após a leitura de um valor pelo teclado. Ou seja, depois de um scanf()

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
7 minutos atrás, isrnick disse:

@Simon Viegas 

- 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.

 

 

setlocale(LC_CTYPE,"Portugue");

Não funcionou... :P. Não consegui achar como usar...

 

Como o fica a linha?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito estranho estranho. Lembro de só trocado o primeiro parâmetro. kkkkkkkkkkk

 

Usei assim e funcionou também:

setlocale(LC_CTYPE,"Portuguese_Brazil");

 

valeu

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

 @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.

 

Citação

"For input streams (and for update streams on which the last operation was input), the behavior is undefined."
  
"Para streams de entrada (e para streams de atualização cuja última operação foi uma entrada), o comportamento é indefinido."

Fonte: http://en.cppreference.com/w/c/io/fflush

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@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!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×