Ir ao conteúdo
  • Cadastre-se

C Criar relatório com menor nota em cada prova com matrizes


jpalmeida34

Posts recomendados

Eu tava tentando resolver esse problema q foi passado em uma lista de exercícios passada pelo meu prof da facul:

 

Faça um programa que preencha uma matriz 5 x 3 com as notas de cinco alunos em três provas. O programa deverá mostrar um relatório com o número dos alunos (número da linha) e a prova em que cada aluno obteve menor nota. Ao final do relatório, deverá mostrar quantos alunos tiveram menor nota em cada uma das provas: na prova 1, na prova 2 e na prova 3.

 

Eu tentei resolver, mas eu n consigo entender porque alguns dos valores da matriz resultante tão errados. Se alguém puder me ajudar, agradeceria :)

Obs.: o programa tá anexado, o código e o compilado.

 

#include <stdio.h>

int main (){

  int num_wtests[2], i , j, tests[4][2], worst_tests[4];

  for (i=0; i<5; i++){
    for (j=0; j<3; j++){
      printf ("Insert the note for the test %i of the student %i: ", j, i);
      scanf ("%i", &tests[i][j]);
      worst_tests[j]=0;
      if (i==0 && j==0){
        worst_tests[i]=tests[i][j];
        num_wtests[j]++;
      } else if (i==0 && tests[i][j]<worst_tests[i]){
        worst_tests[i]=tests[i][j];
        num_wtests[0]--;
        num_wtests[j]++;
      }
      if (i==1 && j==0){
        worst_tests[i]=tests[i][j];
        worst_tests[j]++;
      } else if (i==1 && tests[i][j]<worst_tests[i]){
        worst_tests[i]=tests[i][j];
        num_wtests[0]--;
        num_wtests[j]++;
      }
      if (i==2 && j==0){
        worst_tests[i]=tests[i][j];
        num_wtests[j]++;
      } else if (i==2 && tests[i][j]<worst_tests[i]){
        worst_tests[i]=tests[i][j];
        num_wtests[0]--;
        num_wtests[j]++;
      }
      if (i==3 && j==0){
        worst_tests[i]=tests[i][j];
        num_wtests[j]++;
      } else if (i==3 && tests[i][j]<worst_tests[i]){
        worst_tests[i]=tests[i][j];
        num_wtests[0]--;
        num_wtests[j]++;
      }
      if (i==4 && j==0){
        worst_tests[i]=tests[i][j];
        num_wtests[j]++;
      } else if (i==4 && tests[i][j]<worst_tests[i]){
        worst_tests[i]=tests[i][j];
        num_wtests[0]--;
        num_wtests[j]++;
      }
    }
  }
  
  printf ("The number of students is 5.\n");
  for (i=0; i<5; i++){
    printf ("\nStudent %i notes (T1, T2 and T3):", i);
    for (j=0; j<3; j++){
      printf ("%i ", tests[i][j]);
    }
  }
  for (j=0; j<3; j++){
    printf ("\nNumber of worst notes on test %i: %i", j, num_wtests[j]);
  }

  return 0;
}

 

Programa testes matriz 5x3.rar

Link para o comentário
Compartilhar em outros sites

Seria algo assim que você precisa?

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

#define SEPARADOR "-------------------------------------------- \n"
#define QTD_ALUNOS 5
#define QTD_NOTAS 3

void cadastrarAlunos(int notas[QTD_ALUNOS][QTD_NOTAS]);

void menorNota(int notas[QTD_ALUNOS][QTD_NOTAS], int relacaoNotaAluno[]);

void exibirRelatorio(int notas[QTD_ALUNOS][QTD_NOTAS], int relacaoNotaAluno[]);

int main() {
    int notas[QTD_ALUNOS][QTD_NOTAS];
    int relacaoNotaAluno[QTD_ALUNOS];

    cadastrarAlunos(notas);
    menorNota(notas, relacaoNotaAluno);
    exibirRelatorio(notas, relacaoNotaAluno);

    return EXIT_SUCCESS;
}

/**
 * Realiza o cadastro automatico das notas usando valores aleatorios.
 *
 * @param notas Matriz com as notas dos alunos que sera preenchida.
 */
void cadastrarAlunos(int notas[QTD_ALUNOS][QTD_NOTAS]) {
    srand(random());

    for (int i = 0; i < QTD_ALUNOS; ++i) {
        for (int j = 0; j < QTD_NOTAS; ++j) {
            notas[i][j] = (int) random() % 11;
        }
    }
}

/**
 * Exibe o relatorio das notas dos alunos.
 *
 * @param notas Matriz com as notas dos alunos.
 * @param relacaoNotaAluno Vetor com as piores provas dos alunos.
 */
void exibirRelatorio(int notas[QTD_ALUNOS][QTD_NOTAS], int relacaoNotaAluno[]) {
    for (int i = 0; i < QTD_ALUNOS; ++i) {
        printf("%s", SEPARADOR);
        printf("Aluno: %i \n", (i + 1));

        for (int j = 0; j < QTD_NOTAS; ++j) {
            printf("Nota [ %i de %i ]: %i \n", (j + 1), QTD_NOTAS, notas[i][j]);
        }

        printf("Pior prova: %i \n", (relacaoNotaAluno[i] + 1));
        printf("%s", SEPARADOR);
    }
}

/**
 * Descobre qual foi a prova com a menor nota de cada aluno.
 *
 * @param notas Matriz com as notas dos alunos.
 * @param relacaoNotaAluno Vetor com as piores provas para ser preenchido.
 */
void menorNota(int notas[QTD_ALUNOS][QTD_NOTAS], int relacaoNotaAluno[]) {
    for (int i = 0; i < QTD_ALUNOS; ++i) {
        int notaAtual = INT_MAX;
        int posicao = INT_MIN;

        for (int j = 0; j < QTD_NOTAS; ++j) {
            if (notas[i][j] < notaAtual) {
                notaAtual = notas[i][j];
                posicao = j;
            }
        }

        relacaoNotaAluno[i] = posicao;
    }
}

 

Link para o comentário
Compartilhar em outros sites

Quebre o exercício em partes menores.

 

Exemplo:

2 horas atrás, jpalmeida34 disse:

Faça um programa que preencha uma matriz 5 x 3 com as notas de cinco alunos em três provas.

#include <stdio.h>

/* Constantes */
#define Q_ALUNOS 5
#define Q_NOTAS 3

int main(void)
{
  int notas[Q_ALUNOS][Q_NOTAS];
  int contador1,contador2;
  /* Pega as notas */
  for(contador1=0; contador1<Q_ALUNOS; contador1++)
  {
    for(contador2=0; contador2<Q_NOTAS; contador2++)
    {
      printf("\nColoque a nota %i do aluno %i:\t",contador1+1,contador2+1);
      scanf("%i%*c",&notas[contador1][contador2]);
    }
  }
  /* Mostra as notas */
  for(contador1=0; contador1<Q_ALUNOS; contador1++)
  {
    printf("\nNotas do aluno %i\n",contador1+1);
    for(contador2=0; contador2<Q_NOTAS; contador2++)
    {
      printf("%i ",notas[contador1][contador2]);
    }
  }
  return(0);
}

Isso seria o mínimo que você deveria fazer antes de começar a fazer todo o programa de uma vez só.

 

uma dica de ouro é "Don't use english if it isn't your language"

 

Agora vamos ao seu programa.

2 horas atrás, jpalmeida34 disse:

for (i=0; i<5; i++){ for (j=0; j<3; j++)

você está contando de 0...4 e o seu vetor só vai de 0..3 no primeiro índice e o segundo só vai de 0...2

2 horas atrás, jpalmeida34 disse:

tests[4][2]

A primeira posição de um vetor em C é sempre 0, então você tem disponível as seguintes posições

testes[0][0]   1

testes[1][0]   2

testes[2][0]   3

testes[3][0]   4

Spoiler

worst_tests[j]=0;
      if (i==0 && j==0){
        worst_tests[i]=tests[i][j];
        num_wtests[j]++;
      } else if (i==0 && tests[i][j]<worst_tests[i]){
        worst_tests[i]=tests[i][j];
        num_wtests[0]--;
        num_wtests[j]++;
      }
      if (i==1 && j==0){
        worst_tests[i]=tests[i][j];
        worst_tests[j]++;
      } else if (i==1 && tests[i][j]<worst_tests[i]){
        worst_tests[i]=tests[i][j];
        num_wtests[0]--;
        num_wtests[j]++;
      }
      if (i==2 && j==0){
        worst_tests[i]=tests[i][j];
        num_wtests[j]++;
      } else if (i==2 && tests[i][j]<worst_tests[i]){
        worst_tests[i]=tests[i][j];
        num_wtests[0]--;
        num_wtests[j]++;
      }
      if (i==3 && j==0){
        worst_tests[i]=tests[i][j];
        num_wtests[j]++;
      } else if (i==3 && tests[i][j]<worst_tests[i]){
        worst_tests[i]=tests[i][j];
        num_wtests[0]--;
        num_wtests[j]++;
      }
      if (i==4 && j==0){
        worst_tests[i]=tests[i][j];
        num_wtests[j]++;
      } else if (i==4 && tests[i][j]<worst_tests[i]){
        worst_tests[i]=tests[i][j];
        num_wtests[0]--;
        num_wtests[j]++;
      }

 

Eu acho que essa parte deveria está fora do código que você está pegando as notas, e que também deveria ser simplificado.

 

Exemplo:

#include <stdio.h>

/* Constantes */
#define Q_NOTAS 3

int main(void)
{
  int notas[Q_NOTAS],melhor_nota=0,pior_nota=999,contador;
  /* Pega as notas */
  for(contador=0; contador<Q_NOTAS; contador++)
  {
    printf("\nDigite a %i nota:\t",contador+1);
    scanf("%i%*c",&notas[contador]);
  }
  /* Testa a melhor nota */
  for(contador=0; contador<Q_NOTAS; contador++)
  {
    if(notas[contador]<pior_nota)
    {
      pior_nota=notas[contador];
    }
    else if(notas[contador]>melhor_nota)
    {
      melhor_nota=notas[contador];
    }
  }
  /* Mostra as notas */
  printf("\nNotas.\n");
  for(contador=0; contador<Q_NOTAS; contador++)
  {
    printf("%i ",notas[contador]);
  }
  printf("\nMelhor nota:\t%i\nPior nota:\t%i",melhor_nota,pior_nota);
  getchar();    /* Pausa */
  return(0);
}

Qualquer duvida estamos aqui.

 

Good luck.

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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

×
×
  • Criar novo...