Ir ao conteúdo
  • Cadastre-se

C MAtriz e Vetor: Comparar as respostas do aluno com o gabarito final.


UmPrograma

Posts recomendados

Boa noite, to precisando de ajuda num exercicio aqui.

 

Nao estou entendendo como deveria realizar a comparacao das respostas dos alunos com o gabarito. 

 

Por se tratar apenas de um caracter acredito que nao der para usar o strcmp da biblioteca de string, mas realizando a comparação por meio do == nao esta surtindo efeito, pois o vetor que era para guardar o resultado final das pontuacoes dos alunos parece esta sendo preenchido por lixo na memoria.

 

Segue o codigo que consegui fazer.

 

/**15. Leia uma matriz 5 x 10 que se refere respostas de 10 quest˜oes de m´ultipla escolha, referentes a 5 alunos.
Leia tamb´em um vetor de 10 posic¸˜oes contendo o gabarito de respostas que podem ser a, b, c ou d. Seu programa
dever´a comparar as respostas de cada candidato com o gabarito e emitir um vetor denominado resultado, contendo
 a pontuac¸˜ao correspondente a cada aluno.**/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main(){
    const int coluna=3;
    char mat[5][10];
    int i,j, s1=0,s2=0,s3=0,s4=0,s5=0, res[5], a=0;
    char vet[10];

    for(i=0;i<5;i++){
        for(j=0;j<10;j++){
            printf("resposta do %d aluno: ", i+1);
            scanf("%c", &mat[i][j]);
            fflush(stdin);
        }
    }

    for(j=0;j<10;j++){
        printf("Gabarito [%d]: ",j);
        scanf("%c", &vet[j]);
        fflush(stdin);
    }
    /*for(i=0;i<5;i++){
        for(j=0;j<10;j++){
            if(mat[i][j]==vet[i]){
                printf("O ")
            }
        }f
    }*/
for(i=0;i<5;i++){
    for(j=0;j<10;j++){
        if(mat[0][j]==vet[j]){
            s1++;
            res[0]=s1;
        }
        if(mat[1][j]==vet[j]){
            s2++;
            res[1]=s2;
        }
        if(mat[2][j]==vet[j]){
            s3++;
            res[2]=s3;
        }
        if(mat[3][j]==vet[j]){
            s4++;
            res[3]=s4;
        }
        if(mat[4][j]==vet[j]){
            s5++;
            res[4]=s5;
        }
    }
}
    /*res[0]=s1;
    res[1]=s2;
    res[2]=s3;
    res[3]=s4;
    res[4]=s5;*/

    for(i=0;i<5;i++){
        printf("%d ,", res[i]);
    }

system("pause");
return 0;
}

 

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Vai dar errado pois você está somando checando 5 vezes (logo, também soma 5 vezes) os mesmos valores já verificados.

 

Primeiramente, tem 2 métodos para inicializar todas as posições de um vetor com valor 0:

 

- Durante a declaração:

int res[5] = {0};

 

- Ou percorrendo o vetor:

for (i=0; i<5; i++){
    res[i] = 0;
}

 

E você também pode incrementar +1 usando a notação:

res[i]++;

Como qualquer variável.

 

 

Logo, exclua todos esses ifs do for, assim como essas variáveis s1, s2, etc, e faça algo que funciona para incrementar os contadores de todos os alunos diretamente.

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@isrnick Valeu, amigo!! :thumbsup:

Consegui resolver....:D

Segue o codigo 

 

for(i=0;i<5;i++){
        res[i]=0;
        soma=0;
        for(j=0;j<10;j++){
            if(mat[i][j]==vet[j]){
                soma++;
                res[i]=soma;
            }
        }
    }

Muito mais simples dessa forma.

Como eu estava tentando somar somente as colunas, acreditava que precisaria fixa a linha em cada if, mas me esqueci que no caso o primeiro for faria isso por mim, ja que ele teria que executar todos os J do sengundo for para poder incrementar (i++).

Valeu mesmo.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

  • 3 anos depois...

Estou fazendo o mesmo exercício, porém fiz de uma forma um pouco diferente.
Não estou conseguindo finalizar, há um erro inesperado:
- ao invés de uma linha solicitando a primeira nota do gabarito está vindo duas ao mesmo tempo (pulando os números pares (2,4, etc)).

Vou deixar aqui pro caso de alguém conseguir identificar o(s) erro(s).

PS.: A forma do algorítimo é porque sou iniciante e gosto de visualizar bem as variáveis para facilitar meu aprendizado (penso eu):

 

Vou deixar uma cópia abaixo e um link para ele no site onlinegbd, caso prefiram.

 

https://onlinegdb.com/cShCoWW9V

 

 

#include <stdio.h>

int main(){
    
    char matrizNotas[5][10], vetorGabarito[10];
    int notaFinal[10], i, j, contadorNotas = 1, contadorAluno = 1, contadorGabarito = 1, corretas = 0, nota = 0;
    
    for(i = 0; i < 10; i++){
        printf("\n Informe a resposta correta da %dº questão: ", contadorGabarito);
        scanf("%c", &vetorGabarito[i]);
        contadorGabarito++;
    }
    
    contadorGabarito = 1;
    
    for(i = 0; i < 5; i++){
        for(j = 0; j < 10; j++){
            printf(" Informe a resposta do %dº aluno para a questão %d: ", contadorAluno, contadorGabarito);
            scanf("%c", &matrizNotas[i][j]);
            if(matrizNotas[i][j] == vetorGabarito[nota]){
                corretas++;
            }
            contadorGabarito++;
            nota++;
            notaFinal[i] = corretas;
        }
        
        corretas = 0;
        contadorAluno++;
    }
    
    contadorGabarito = 1;
    
    printf("\n");
    
    for(i = 0; i < 10; i++){
            printf(" \n Gabarito da Questão %d é a alternativa %c).", contadorGabarito, vetorGabarito[i]);
            contadorGabarito++;
        }
      
    contadorAluno = 1;  
        
    for(i = 0; i < 5; i++){
        printf("\n A nota final do %dº aluno foi: %d", contadorAluno, notaFinal[i]);
    }
    
    return 0;

}

 

 

 

 

Desde já agradeço.

 

 

 

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Geraldo Cavalcante Use o tal botão code como explicado no forum. Veja a diferença

 

#include <stdio.h>

int main(){
    
    char matrizNotas[5][10], vetorGabarito[10];
    int notaFinal[10], i, j, contadorNotas = 1, contadorAluno = 1, contadorGabarito = 1, corretas = 0, nota = 0;
    
    for(i = 0; i < 10; i++){
        printf("\n Informe a resposta correta da %dº questão: ", contadorGabarito);
        scanf("%c", &vetorGabarito[i]);
        contadorGabarito++;
    }
    
    contadorGabarito = 1;
    
    for(i = 0; i < 5; i++){
        for(j = 0; j < 10; j++){
            printf(" Informe a resposta do %dº aluno para a questão %d: ", contadorAluno, contadorGabarito);
            scanf("%c", &matrizNotas[i][j]);
            if(matrizNotas[i][j] == vetorGabarito[nota]){
                corretas++;
            }
            contadorGabarito++;
            nota++;
            notaFinal[i] = corretas;
        }
        
        corretas = 0;
        contadorAluno++;
    }
    
    contadorGabarito = 1;
    
    printf("\n");
    
    for(i = 0; i < 10; i++){
            printf(" \n Gabarito da Questão %d é a alternativa %c).", contadorGabarito, vetorGabarito[i]);
            contadorGabarito++;
        }
      
    contadorAluno = 1;  
        
    for(i = 0; i < 5; i++){
        printf("\n A nota final do %dº aluno foi: %d", contadorAluno, notaFinal[i]);
    }
    
    return 0;

}

 

Sobre o programa

 

  • Use funções. É muito mais fácil.
  • Leia de arquivos. É muito mais fácil. Você não merece ficar digitando 55 letrinhas e 55 enter a cada vez que vai testar seu programa. Ou pior, cada vez que for usar. E quem usar também não merece
  • Use strings. É muito mais fácil
  • teste o retorno de scanf(). SEMPRE. É ingênuo não testar.
  • declare as variáveis dentro do loop e no próprio for sempre que possível
  • não use nomes de 15 letras para variáveis que acessa toda hora. vetorGabarito não é assim muito melhor que gabarito apenas

 

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@arfneto Boa noite

Obrigado pelas dicas, algumas eu até conhecia.

Como estou aprendendo agora, procuro usar nomes de variáveis bem fáceis de visualizar e entender para que eu consiga ter uma visão melhor do programa.

Na verdade, estou fazendo um curso que é fornecido por uma plataforma. Linguagem C do básico ao avançado.
Cada matéria tem uma bateria de exercícios e estou focando apenas no que pede por questões de didática.
Ainda não sei usar bem funções, não cheguei lá ainda, o que estou focando é a lógica e o que já foi ensinado apenas (uso de estruturas de repetição).

Quanto as 55 era só mudar pra 2 e 4, por exemplo. Eu até deveria ter feito isso antes.

Mas obrigado pelas dicas mesmo que ainda não tenha informado o problema.

 

Em 25/11/2021 às 12:38, arfneto disse:

@Geraldo Cavalcante Use o tal botão code como explicado no forum. Veja a diferença

 

Em 25/11/2021 às 12:38, arfneto disse:

@Geraldo Cavalcante Use o tal botão code como explicado no forum. Veja a diferença

 

#include <stdio.h>

int main(){
    
    char matrizNotas[5][10], vetorGabarito[10];
    int notaFinal[10], i, j, contadorNotas = 1, contadorAluno = 1, contadorGabarito = 1, corretas = 0, nota = 0;
    
    for(i = 0; i < 10; i++){
        printf("\n Informe a resposta correta da %dº questão: ", contadorGabarito);
        scanf("%c", &vetorGabarito[i]);
        contadorGabarito++;
    }
    
    contadorGabarito = 1;
    
    for(i = 0; i < 5; i++){
        for(j = 0; j < 10; j++){
            printf(" Informe a resposta do %dº aluno para a questão %d: ", contadorAluno, contadorGabarito);
            scanf("%c", &matrizNotas[i][j]);
            if(matrizNotas[i][j] == vetorGabarito[nota]){
                corretas++;
            }
            contadorGabarito++;
            nota++;
            notaFinal[i] = corretas;
        }
        
        corretas = 0;
        contadorAluno++;
    }
    
    contadorGabarito = 1;
    
    printf("\n");
    
    for(i = 0; i < 10; i++){
            printf(" \n Gabarito da Questão %d é a alternativa %c).", contadorGabarito, vetorGabarito[i]);
            contadorGabarito++;
        }
      
    contadorAluno = 1;  
        
    for(i = 0; i < 5; i++){
        printf("\n A nota final do %dº aluno foi: %d", contadorAluno, notaFinal[i]);
    }
    
    return 0;

}

 

Sobre o programa

 

  • Use funções. É muito mais fácil.
  • Leia de arquivos. É muito mais fácil. Você não merece ficar digitando 55 letrinhas e 55 enter a cada vez que vai testar seu programa. Ou pior, cada vez que for usar. E quem usar também não merece
  • Use strings. É muito mais fácil
  • teste o retorno de scanf(). SEMPRE. É ingênuo não testar.
  • declare as variáveis dentro do loop e no próprio for sempre que possível
  • não use nomes de 15 letras para variáveis que acessa toda hora. vetorGabarito não é assim muito melhor que gabarito apenas

 

 

 

Sobre o programa

 

  • Use funções. É muito mais fácil.
  • Leia de arquivos. É muito mais fácil. Você não merece ficar digitando 55 letrinhas e 55 enter a cada vez que vai testar seu programa. Ou pior, cada vez que for usar. E quem usar também não merece
  • Use strings. É muito mais fácil
  • teste o retorno de scanf(). SEMPRE. É ingênuo não testar.
  • declare as variáveis dentro do loop e no próprio for sempre que possível
  • não use nomes de 15 letras para variáveis que acessa toda hora. vetorGabarito não é assim muito melhor que gabarito apenas

 

 

 

Link para o comentário
Compartilhar em outros sites

2 horas atrás, Geraldo Cavalcante disse:

Mas obrigado pelas dicas mesmo que ainda não tenha informado o problema

 

Acho que haviam problemas no programa original e que devia corrigir no mínimo o  que expliquei na ocasião, ANTES de prosseguir com o programa. Isso porque --- minha opinião claro --- muitas vezes não compensa o trabalho de insistir num caminho quando há problemas como os que citei. Eu tentava ajudar.

 

Poste o código atual.

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...
Em 02/12/2021 às 23:23, arfneto disse:

 

Acho que haviam problemas no programa original e que devia corrigir no mínimo o  que expliquei na ocasião, ANTES de prosseguir com o programa. Isso porque --- minha opinião claro --- muitas vezes não compensa o trabalho de insistir num caminho quando há problemas como os que citei. Eu tentava ajudar.

 

Poste o código atual.


Tranquilo!

Estou com sobrecarga das matérias das faculdades que faço - final de ano corrido.

De qualquer forma vou continuar os estudos fazendo uns 5 algoritmos dos testes por dia (inclusive já estou nos exercícios de funções, são "apenas" 73 exercícios práticos, rs).

Quando esfriar a cabeça eu retorno nesse algoritmo, dou uma revisada com mais tranquilidade e posto as atualizações, tomando mais cuidado, claro, com os pontos que você indicou.

Novamente obrigado!
 

Feliz natal e ano novo pra todos vocês.

Link para o comentário
Compartilhar em outros sites

@Geraldo Cavalcante Quando você digita um número e pressiona enter, scanf lê o número, mas deixa o byte código 10 no buffer do teclado, então na próxima leitura esse byte é lido como se você tivesse digitado o número 10.

 

Para resolver isso mude essas linhas:

scanf("%c", &vetorGabarito[i]);
e
scanf("%c", &matrizNotas[i][j]);

Para

scanf("%c%*c", &vetorGabarito[i]);
e
scanf("%c%*c", &matrizNotas[i][j]);

Assim %*c vai comer esse caractere.

Link para o comentário
Compartilhar em outros sites

2 horas atrás, Geraldo Cavalcante disse:

Estou com sobrecarga das matérias das faculdades que faço - final de ano corrido.

De qualquer forma vou continuar os estudos fazendo uns 5 algoritmos dos testes por dia (inclusive já estou nos exercícios de funções, são "apenas" 73 exercícios práticos, rs).

Quando esfriar a cabeça eu retorno nesse algoritmo, dou uma revisada com mais tranquilidade e posto as atualizações, tomando mais cuidado, claro, com os pontos que você indicou

 

🤔

 

Considere a seguinte hipótese:

 

o programa original tinha vários problemas, alguns bem comuns e que eu listei.

 

Se você resolver aqueles problemas no exercício original e, através disso, entender que é melhor escrever como eu estava tentando te explicar, pode tornar TODO o seu trabalho a partir desse programa muito mais produtivo. Programas escritos do modo como tentei explicar geralmente rodam ok já na primeira execução. 

 

Isso quer dizer --- se eu tiver razão --- que os 5 exercícios que está resolvendo todo dia poderiam ser resolvidos de maneira muito mais rápida e produtiva.

 

Deixar para depois retornar a isso seria como se preparar para o próximo emprego. E perder o de agora. Se eu estiver certo :D 

 

Bom Natal.

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