Ir ao conteúdo

Posts recomendados

Postado

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
Postado

Consertei o erro em relação a matriz ser do tipo float passando para char, entretanto, continua dando erro em relação a comparar a coluna de respostas do aluno com o gabarito.

(A pontuacao aparece errada)

Vou continuar tentando aqui, mando noticias se conseguir resolver.

  • Obrigado 1
Postado

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
Postado

@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
  • 3 anos depois...
Postado

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
Postado

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

@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

 

 

 

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

  • 2 semanas depois...
Postado
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.

Postado

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

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

  • Haha 1
  • 2 anos depois...
Postado

@Geraldo Cavalcante

Boa Noite!

 

Aquilo que descreveu como problema é a função scanf fazendo seu trabalho, espaços em branco também são caracteres, é necessário sinalizar para não quando não; faz assim, acrescenta um espaço no início da corda de formato.

 

" %c"


Seu programinha compilou, deste jeitinho aqui:


#include <stdio.h>

#define ALUNO	5
#define questão	10

int main () 
{
 char matrizNotas[ALUNO][questão], vetorGabarito[questão];
 int resultado[ALUNO], i, j;
 for (i = 0; i < questão; i++)
   {
    printf("\n Informe a resposta correta da %dº questão: ",i);
    scanf(" %c", &vetorGabarito[i]);
   }
 for (i = 0; i < ALUNO; i++)
 for (j = 0; j < questão; j++)
   {
    printf(" Informe a resposta do %dº aluno para a questão %d: ",i,j);
    scanf(" %c", &matrizNotas[i][j]);
   }
 for (i = 0; i < ALUNO; i++)
 for (j = 0; j < questão; j++)
   {
    if (matrizNotas[i][j]==vetorGabarito[j])
       resultado[i]++;
   }
 for (int aluno= 0 ; aluno<ALUNO ; ++aluno)
    printf ("%d ",resultado[aluno]);
}

***

 

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