7
respostas

Matrizes

No livro que peguei de matrizes essa é a única questão em que emperrei:

Leia uma matriz de tamanho 10x3 (diminuí pra 5x3 pra adiantar as coisas) com as notas de 10 (5) alunos em tres provas. Em seguida, calcule e escreva na tela o numero de alunos cuja pior nota foi na prova 1, o numero de alunos cuja pior nota foi na prova 2 e na 3;

O que eu fiz até agora:




#include <stdio.h>

int main(int argc, char **argv)
{

    int i,j, nota1[3]={0}, mat[5][3] = {0};


    puts ("Defina a matriz de 10 alunos com 3 notas");


    for (i=0;i<5;i++){
        for (j=0;j<3;j++){
            printf("Diga a %dª nota do %dº aluno\n",j+1,i+1);
            scanf("%d", &mat[i][j]);             

            }

        }


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



            }

        }





    return 0;
}
7 respostas

Vamos tentar, pelo menos no inicio, fazer com que vc faça o código. Minha dica é:

  • Crie variáveis relacionadas com as notas que vc quer somar a quantidade. iguaisA1, 2...
  • No segundo for do loop da matriz, faça um if para cada situação. if(matriz[i][j] == 1) ... e por aí vai.

Tenta fazer desse jeito e posta o código aqui ?

Valeu, vou tentar nesse final de semana e posto.

Ainda está errado, mas é o que eu consegui implementar:




#include <stdio.h>

int main(int argc, char **argv)
{

    int i,j, nota1=0, nota2=0, nota3=0, mat[5][3] = {0};


    puts ("Defina a matriz de 10 alunos com 3 notas");


    for (i=0;i<5;i++){
        for (j=0;j<3;j++){
            printf("Diga a %dª nota do %dº aluno\n",j+1,i+1);
            scanf("%d", &mat[i][j]);             

            }

        }

    for (i=0;i<5;i++){
        for (j=0;j<3;j++){
            if ((mat[i][0]>mat[i][1]) && (mat[i][1]>mat[i][2]))
                nota1++;
            else if ((mat[i][1]>mat[i][2]) && (mat[i][1]>mat[i][0]))
                nota2++;
            else if ((mat[i][2]>mat[i][0]) && (mat[i][2]>mat[i][1]))
                nota3++;


            }

        }

        printf ("%d alunos tiveram a 1ª nota maior\n\n%d alunos tiveram a 2ª nota maior\n\n%d alunos tiveram a 3ª nota maior", nota1, nota2, nota3);



    return 0;
int i,j, notas[3] = {0}, mat[5][3] = {0};

for (i=0;i<5;i++){
        int posicaoPiorNota = 0;
        for (j=0;j<3;j++){
        if(mat[i][j] < mat[i][posicaoPiorNota]) {
                       posicaoPiorNota = j;
                }
           }
           calculaNotas[posicaPiorNota] = calculaNotas[posicaPiorNota] + 1;

        }

Opa, fiz algumas alterações em alguns pontos do código, tenta pegar o que eu fiz e aplicar no seu. Tinha entendido errado.. Alterei a lógica do for e também guardei as piores notas num array com número de posições igual ao número de provas.

Acho que consegui fazer, cara! Veja se ficou muito tosco, mas não vale citar função pq não aprendi isso ainda:



# include <stdio.h>


int main(void){

    float a[5][3], maior[3];
    int i,j;



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

        printf ("Diga as 3 notas do %dº catarrento\n ", i+1);

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

            scanf ("%f", &a[i][j]);

            }


        }



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

        printf ("Notas do %dº Aluno:   \n ", i+1);

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

            printf ("%.2f  ", a[i][j]);
                    maior[i] = a[i][j]; // Aqui maior[i] recebe qualquer informação de a[i][j] para comparação futura;

                }
                putchar ('\n');

            }




    for (i=0;i<5;i++){    // Aqui a intenção é armazenar as maiores notas no vetor maior[]


        for (j=0;j<3;j++){
            if ((j==0) && (maior[j] < a[i][j]))
                maior[j] = a[i][j];

            if ((j==1) && (maior[j]<a[i][j]))
                maior[j] = a[i][j];

            if ((j==2) && (maior[j]<a[i][j]))
                maior[j] = a[i][j];



        }

    }


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



            printf ("A Maior nota da Unidade %d foi %.2f \n", i+1, maior[i]);




        }




        }

Opa, se funcionou, manda bala. Você ainda poderia usar a variável que eu citei, mas é como vc falou, mais para frente vc muda :).

Se entendi certo, esse código deve resolver o problema. O único caso que ele não testa é no caso de empate entre 1 ou mais nota, situação em que a primeira a ser avaliada será a pior.

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

int main () {
    int notas[5][3];
    int pioresNotas[5];
    int quantidadeAlunos[3] = {};

    // Inicializa notas com valores aleatórios entre 0 e 10
    srand(time(NULL));
    {
        int i;
        for(i = 0; i < 5; i++) {
            int j;
            for(j = 0; j < 3; j++) {
                notas[i][j] = abs(rand()) % 11;
            }
        }
    }

    // Define quais as piores notas de cada aluno, e soma o número de alunos com pior nota em cada avaliação
    {
        // Determina qual a pior nota de cada aluno
        {
            int i;
            for(i = 0; i < 5; i++) {
                int j, index;
                for(index = j = 0; j < 3; j++) {
                    // Se houver empate, permanece a atual
                    if(notas[i][j] < notas[i][index]) {
                        index = j;
                    }
                }
                pioresNotas[i] = index;
            }            
        }

        // Determina a somatória de alunos 
        {
            int i;
            for(i = 0; i < 5; i++) {
                quantidadeAlunos[pioresNotas[i]]++;
            }
        }
    }
    return 0;
}

Exemplo de saída, para visualizar, crie um arquivo html e utilize o navegador.

<style>
    table{
        width: 50%;
        margin: auto;
        padding: 0;
        border: solid black;
    }
    th{
        color: white;
        background: black;
    }
    td{
        text-align: center;
    }
    tr:nth-child(even) {
        background-color: gray;
    }
</style>

<h2>Matriz de notas</h2>
<table>
    <tr>
        <th> Prova 1 </th>
        <th> Prova 2 </th>
        <th> Prova 3 </th>
    </tr>
    <tr>
        <td>  8 </td>
        <td>  8 </td>
        <td>  1 </td>
    </tr>
    <tr>
        <td>  0 </td>
        <td>  1 </td>
        <td>  7 </td>
    </tr>
    <tr>
        <td>  7 </td>
        <td>  1 </td>
        <td>  0 </td>
    </tr>
    <tr>
        <td>  1 </td>
        <td>  6 </td>
        <td>  4 </td>
    </tr>
    <tr>
        <td>  0 </td>
        <td>  1 </td>
        <td>  5 </td>
    </tr>
</table>

<h2>Resultados apurados</h2>
<table>
    <tr>
        <th> Prova 1 </th>
        <th> Prova 2 </th>
        <th> Prova 3 </th>
    </tr>
    <tr>
        <td>  3 </td>
        <td>  0 </td>
        <td>  2 </td>
    </tr>
</table>