Ir ao conteúdo

Posts recomendados

Postado

Como faço, em C, um código que compare se as respostas da linha de uma matriz são iguais a linha de um vetor?

Em anexo imagem da pergunta.

Segue código que tenho:

#include <stdio.h>
int main() { char ma[5][10] = {'a','b','c','d','d','c','b','a','b','b','d','a','d','c','b','a','b','b','d','a', 'd','d','c','b','a','b','b','d','a','d','b','d','a','d','c','b','a','b','b','d','c','d','d','c', 'b','a','b','b','d','a'}, letter; char gab[10] = {'a','b','c','d','a','b','c','d','b','b'}; int resultado[10], r, l, soma = 0;

//Corrigindo
for(r = 0; r < 5; r++){
    for(l = 0; l < 10; l++){
        if(ma[r][l] == gab[l]){
            soma++;
        }
        resultado[r] =  soma;
    }
}

printf("Resultados\n\n");
for(r = 0; r < 5; r++){
    printf("Aluno %d: %d\n", r+1, resultado[r]);
}

return 0;
} 

 

question.png

Postado

Seu programa não está muito bom :( 

 

O erro mesmo é essa linha
 

    resultado[r] =  soma;

 

dentro do for, fazendo com que atribua l vezes o valor ao invés de apenas no fim. E o fato de não zerar a soma para cada questão.

 

Outros problemas

 

Compare:

 

int main() { char ma[5][10] = {'a','b','c','d','d','c','b','a','b','b','d','a','d','c','b','a','b','b','d','a', 'd','d','c','b','a','b','b','d','a','d','b','d','a','d','c','b','a','b','b','d','c','d','d','c', 'b','a','b','b','d','a'}, letter; char gab[10] = {'a','b','c','d','a','b','c','d','b','b'}; int resultado[10], r, l, soma = 0;

 

 

Com isso, o normal:

 

    const char ma[][10] =
    {
        { 'a','b','c','d','d','c','b','a','b','b' },
        { 'd','a','d','c','b','a','b','b','d','a' },
        { 'd','d','c','b','a','b','b','d','a','d' },
        { 'b','d','a','d','c','b','a','b','b','d' },
        { 'c','d','d','c','b','a','b','b','d','a' }
    };
        
     const char gab[] =
        { 'a','b','c','d','a','b','c','d','b','b' }; 
        
    int resultado[10] = {0};
    int soma = 0;

 

Está muito, mas muito ruim de ler do modo como escreveu

  • declare uma variável por linha. É grátis e só ajuda você. E evite escrever linhas muito longas de qualquer modo. Em especial se for publicar como aqui. Veja o que aconteceu...
     
  • não existe matriz em C ou C++, apenas vetores de vetores de vetores e tal... Então declare como tal. Vai notar que é melhor para você...
     
  • não precisa declarar dimensões exceto a última se for inicializar
     
  • declare como const se sabe que não vai alterar. Assim o compilador trabalha por você e não vai deixar você errar e mudar um valor que não é pra mudar. Nem todos os seus programas vão ter 20 linhas.
     
  • nunca declare variáveis de controle de loop fora do for se não tiver uma boa razão para isso. Isso é um inferno e levou anos para ser corrigido em C. E foi corrigido no final dos anos 80. No seu caso por exemplo note a variável r que você usa duas vezes... NUNCA faça isso.
     
  • use nomes mais expressivos

Compare

 

#include <stdio.h>
int main()
{
    const char nota[][10] =
    {
        { 'a','b','c','d','d','c','b','a','b','b' },
        { 'd','a','d','c','b','a','b','b','d','a' },
        { 'd','d','c','b','a','b','b','d','a','d' },
        { 'b','d','a','d','c','b','a','b','b','d' },
        { 'c','d','d','c','b','a','b','b','d','a' }
    };
        
     const char gabarito[] =
        { 'a','b','c','d','a','b','c','d','b','b' }; 
        
    int resultado[10] = {0};
    int soma = 0;

    //Corrigindo
    for(int prova = 0; prova < 5; prova++)
    {
        soma = 0;
        for(int questao = 0; questao < 10; questao++)
        {
            if(nota[prova][questao] == gabarito[questao]) soma++;
        };  // for()
        resultado[prova] =  soma;
    };  // for()

    printf("Resultados\n\n");
    for(int res = 0; res < 5; res++) 
        printf(
            "Aluno %d: %d\n",
            res+1,
            resultado[res]
        );
    return 0;

} 

 

Que deve mostrar

 

PS C:\src\ifdef> gcc -o tst -Wall -std=c17 t2102.c 
PS C:\src\ifdef> ./tst
Resultados

Aluno 1: 6
Aluno 2: 0
Aluno 3: 4
Aluno 4: 3
Aluno 5: 0
PS C:\src\ifdef>

 

Postado

@arfneto Muito obrigado pela sua ajuda.

Eu tinha zerado soma, mas como não tinha funcionado, removi para tentar outra coisa; 

Cheguei a fazer a matriz assim, mas acabei mudando depois;

O const não só é algo que vejo pouco, aí nem uso, prático que vou mudar agora;

Normalmente eu uso a variável do for apenas dentro dele, deixei nesse código fora, por que pensei que fosse melhor, acabou não servindo para nada; e 

Pensei que o nome das variáveis estivesse óbvio (rs).

Porque você usou ; depois de chaves?

Novamente muito obrigado.

Postado
2 minutos atrás, Sr.Souto disse:

deixei nesse código fora, por que pensei que fosse melhor, acabou não servindo para nada

 

Isso é uma bomba relógio. Note que r por exemplo está "viva" durante todo o programa, com valores deixados do último loop. O que acontece é que isso acaba entrando em alguma expressão, ou sendo alterado por engano e mesmo em programas pequenos isso é difícil de achar...

 

4 minutos atrás, Sr.Souto disse:

Pensei que o nome das variáveis estivesse óbvio (rs).

 

 

Você deve ter razão, já que eu consegui trocar por algo ainda mais óbvio ;) 

 

Note que pode escrever também assim

#include <stdio.h>
int main()
{
    const char nota[][10] =
    {
        { 'a','b','c','d','d','c','b','a','b','b' },
        { 'd','a','d','c','b','a','b','b','d','a' },
        { 'd','d','c','b','a','b','b','d','a','d' },
        { 'b','d','a','d','c','b','a','b','b','d' },
        { 'c','d','d','c','b','a','b','b','d','a' }
    };
        
     const char gabarito[] =
        { 'a','b','c','d','a','b','c','d','b','b' }; 
        
    int resultado[10] = {0};
    int soma = 0;

    //Corrigindo
    int N = sizeof(nota)/(sizeof(char)*10);
    for(int prova = 0; prova < N; prova++)
    {
        soma = 0;
        for(int questao = 0; questao < 10; questao++)
        {
            if(nota[prova][questao] == gabarito[questao]) soma++;
        };  // for()
        resultado[prova] =  soma;
    };  // for()

    printf("\nOs %d resultados\n\n", N);
    for(int res = 0; res < N; res++) 
        printf(
            "Aluno %d: %d\n",
            res+1,
            resultado[res]
        );
    return 0;

} 

 

E deste modo pode mudar o número de notas sem ter que alterar o programa. Sugiro se acostumar com isso

6 minutos atrás, Sr.Souto disse:

Porque você usou ; depois de chaves?

 

costume de terminar os comandos por ';'. São opcionais aí.

  • Obrigado 1

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!