Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Psych0

[Resolvido] Problema com matrizes

Recommended Posts

Eu comecei a programar agora e estou com dificultades nesse exercício:

 

P10. Numa matriz M(30×2) de elementos inteiros, encontram-se registradas as notas dos 30 alunos de cada uma das turmas práticas de Métodos de Programação. Sabendo que todos os elementos de M são valores entre 0 e 20, escreva um programa que:

a) Determine e escreva o número de alunos aprovados (nota >= 10);

b) Determine e escreva a melhor nota em cada uma das turmas;

c) Identifique a turma com maior número de alunos aprovados.

 

OS ítens a) e c) eu resolvi sem problemas, mas o ítem b) não quer funcionar.

 

aqui está o código que eu fiz:

 

#include <stdio.h>
#include <conio.h>

int main(void)
{
 float turmas[2][30]={{0.5,2,11,19.9,19.5,5.7,7.62,5.56,12.7,0.44,9,0.38,12,0.22,2.33,1.066,1.333,2.93,3,1.66,15,11,1.12,4.1,6.9,18.5,19.2,16.9,18,13},{5.0,2,13,10,19.5,7.5,6.7,5.5,7.2,4.4,19,3.8,18,2.2,3.3,1.67,3.33,9.3,3.3,6.6,5,14,1.2,4.9,9.9,18.1,1.2,1.6,1.8,17}};
 float temp;
 int aprov1=0,aprov2=0,aprovt,aprovm,i,j=0;


 /* Descobre o número de aprovados na turma 1 */
 for (j=0; j <= 30; j++)
   {
     if (turmas[0][j] >= 10)
{
  aprov1++;                
}
   }

 /* Descobre o número de aprovados na turma 2 */
 for (j=0; j <= 30; j++)
   {
     if (turmas[1][j] >= 10)
{
  aprov2++;                
}
   }

 /* Descobre a turma com mais alunos aprovados */     
 if (aprov1>aprov2)
   {
     aprovm=aprov1;
   }
 else
   {
     aprovm=aprov2;
   }

 /* Totoal de anulos aprovados */     
 aprovt=aprov1+aprov2;

 /* Ordena e descobre qual a maior nota da turma 1 */
 for (j=0; j<30; j++)
   {
     if (turmas[0][j]>turmas[0][j+1])
{
  temp=turmas[0][j];
  turmas[0][j]=turmas[0][j+1];
  turmas[0][j+1]=temp;
}
   }

 /* Ordena e descobre qual a maior nota da turma 2 */
 for (j=0; j<30; j++)
   {
     if (turmas[1][j]>turmas[1][j+1])
{
  temp=turmas[1][j];
  turmas[1][j]=turmas[1][j+1];
  turmas[1][j+1]=temp;
}
   }

 printf("\nNumero de aprovados nas duas turmas = %d", aprovt);
 printf("\nA melhor nota na turma 1 foi: %2.2f",turmas[0][30]);
 printf("\nA melhor nota na turma 2 foi: %2.2f",turmas[1][30]);
 printf("\nA turma com maior numero de aprovados foi: %d",aprovm);

 getch();
 return 0;
}

 

Detalhes adicionais: Se eu retirar a parte do código:

 

  /* Ordena e descobre qual a maior nota da turma 2 */
 for (j=0; j<30; j++)
   {
     if (turmas[1][j]>turmas[1][j+1])
{
  temp=turmas[1][j];
  turmas[1][j]=turmas[1][j+1];
  turmas[1][j+1]=temp;
}
   } 

 

e retirar

 

printf("\nA melhor nota na turma 2 foi: %2.2f",turmas[1][30]);

 

o programa retorna a maior nota da turma 1 corretamente, mas com a parte para descobrir a maior nota da turma 2 dá tudo errado.

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se você declara um vetor/matriz de tamanho 30, ele terá 30 posições, de 0 a 29, portanto não existe posição 30. Mesmo que não acuse erro, não faça isso pois pode dar pau uma hora ou outra.

E seu método não é bem uma ordenação... ele só empurra o maior valor pro final, seria um passo dentro de um algoritmo de ordenação. Mas nesse caso funciona muito bem.

Sabendo disso, faça as seguintes alterações:

 

 

O for deve ir até 29, pois como você compara com j+1 ele vai comparar com a ultima posição mesmo só indo até j = 28.

  /* Ordena e descobre qual a maior nota da turma 1 */
 for (j=0; j<29; j++)
   {
     if (turmas[0][j]>turmas[0][j+1])
       {
         temp=turmas[0][j];
         turmas[0][j]=turmas[0][j+1];
         turmas[0][j+1]=temp;
       }
   }

 /* Ordena e descobre qual a maior nota da turma 2 */
 for (j=0; j<29; j++)
   {
     if (turmas[1][j]>turmas[1][j+1])
       {
         temp=turmas[1][j];
         turmas[1][j]=turmas[1][j+1];
         turmas[1][j+1]=temp;
       }
   }

 

E na hora de mostrar a ultima posição é 29 e não 30, como mencionei no começo do tópico

  printf("\nA melhor nota na turma 1 foi: %2.2f",turmas[0][29]);
 printf("\nA melhor nota na turma 2 foi: %2.2f",turmas[1][29]);

 

Fazendo isso o resultado que obtive foi:

Numero de aprovados nas duas turmas = 21

A melhor nota na turma 1 foi: 19.90

A melhor nota na turma 2 foi: 19.50

A turma com maior numero de aprovados foi: 12

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.