Ir para conteúdo
Alasca

Erros Programa em C

Recommended Posts

Olá!

Gostaria de ajuda para encontrar e consertar os erros do código a seguir.

O programa lê um numero X e uma matriz M(5x5) e informa quantas vezes esse número aparece na matriz.

int main()
{
int num, int M[5][5] ;
Le_valores(&num,&M);
cont= Contavalores(num, M[5][5]) ;
return 0 ;
}
Le_valores (int *p, N[5][5])
{ int i,j;
scanf(”%d”, &p) ;
for(j=0; j<=4; j++)
{ for(i=0;i<=4; i++)
scanf(“%d”, N[j][i]);
}
}
int Contavalores(int M,int num[5][5])
{ int i,j;
cont=0;
for(i=0;i<5;i++){
for(j=-1;j<5;j++)
{ if (M[i][j+1]==num)
cont=cont + 1; }
}
printf(“O numero aparece %d vezes na matriz.”,cont); }

Não fui eu quem fiz o código, por isso estou achando muito confuso. Se alguém puder ajudar, indicando os erros, agradeço muito.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se não for erro de lógica o compilador ajuda. Basta usar as opções.

Se for erro de lógica,existe depurador.

É interessante aprender a usar os dois pois faz parte do fluxo de trabalho de um desenvolvedor.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

Gostaria de ajuda para encontrar e consertar os erros do código a seguir.

O programa lê um numero X e uma matriz M(5x5) e informa quantas vezes esse número aparece na matriz.

int main()
{
int num, int M[5][5] ;
Le_valores(&num,&M);
cont= Contavalores(num, M[5][5]) ;
return 0 ;
}
Le_valores (int *p, N[5][5])
{ int i,j;
scanf(”%d”, &p) ;
for(j=0; j<=4; j++)
{ for(i=0;i<=4; i++)
scanf(“%d”, N[j][i]);
}
}
int Contavalores(int M,int num[5][5])
{ int i,j;
cont=0;
for(i=0;i<5;i++){
for(j=-1;j<5;j++)
{ if (M[i][j+1]==num)
cont=cont + 1; }
}
printf(“O numero aparece %d vezes na matriz.”,cont); }

Não fui eu quem fiz o código, por isso estou achando muito confuso. Se alguém puder ajudar, indicando os erros, agradeço muito.

Uma boa maneira de evitar confusões e depurar o código de forma mais clara é identando o mesmo de maneira correta. Dê uma olhada nos scanf.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na primeira linha de código abaixo da chave que inicia o bloco da função main você declara duas váriáveis inteiras porém você erra em usar a palavra int duas vezes antes do ponto e vírgula. Quando declaramos variáveis de qualquer tipo em C só podemos voltar a usar um especificador de tipo de variável após o ponto e vírgula, e não antes. 

int num , int M [ 5 ][ 5 ] ;

Essa linha está errada pelo motivo dito por mim acima. O certo é fazer da seguinte forma como também explicado por mim:

int num , M [ 5 ][ 5 ] ;

Agora sim a linha está certa pois declara o especificador de tipo de variável somente uma única vez. O compilador não precisa ser informado sobre o tipo da variável mais de uma vez pois ele sabe que todas as variáveis que forem declaradas após informado o tipo e antes do ponto e vírgula são daquele mesmo tipo. Portanto informar ao compilador o tipo das variáveis mais de uma vez na mesma linha de código antes do ponto e vírgula é um erro de programação. Para evitar o erro devemos informar apenas uma.

A variável cont usada na função main não está sendo declarada antes do uso o que também é um erro de programação. Se não declarar a variável antes de usá-la o compilador não sabe o tipo dessa variável e não pode manipulá-la. Para consertar esse erro devemos informar ao compilador o tipo da variável e declará-la antes de a utilizar no restante do código. Como nesse caso a variável cont irá armazenar um valor inteiro contando quantas vezes um determinado número ocorre em uma matriz então a declaramos assim:

int cont;

Dessa forma o compilador sabe que cont é uma variável do tipo inteiro.

Há também um erro em seu programa na declaração dos argumentos da função Le_valores. Não está sendo especificado o tipo do argumento matriz N[5][5]. Ao declarar variáveis que são argumentos de funções devemos sempre informar ao compilador o tipo desses argumentos, independente de quantos argumentos tenha. Diferentemente das variáveis que não são argumentos os argumentos necessitam que seu tipo seja especificado na mesma linha de código quantas vezes for o número de argumentos. Como a função Le_valores possui dois argumentos inteiros então é preciso se utilizar a palavra int duas vezes dentro dos parênteses da declaração da função. No seu programa está assim :

Le_valores ( int * p , N [ 5 ][ 5 ])

Esse é o jeito errado e o compilador não aceita. A maneira correta é:

Le_valores ( int * p , int N [ 5 ][ 5 ])

Agora o compilador permite.
Há outro erro em seu programa. Na seguinte linha de código: 

int Contavalores( int M , int num
[ 5 ][ 5 ])

você declara a variável M como sendo do tipo inteiro e num como sendo uma matriz de inteiros porém mais abaixo nessa mesma função Contavalores você compara M com num porém utilizando M como matriz e num como inteiro ou seja você troca os tipos dessas duas variáveis e o compilador não permite a criação do programa. Não é permitido permuta de tipos de variáveis durante o código em C e por isso o seu programa não compila. Há duas coisas diferentes que você pode fazer para consertar esse erro. A primeira é usar as variáveis como elas sendo do tipo que estão declaradas. Nesse caso, M como inteiro e num como matriz de inteiros e não o contrário. 
A segunda é modificar o tipo dessas duas variáveis para que elas fiquem do mesmo tipo que estão sendo usadas no código trocando as palavras M por num e vice-versa na declaração dos argumentos da função Contavalores. Caso você opte pela primeira o seu código está assim: 

if ( M [ i ][ j + 1 ]== num )
cont= cont + 1 ;

vai ficar assim:

if ( num [ i ][ j + 1 ]== M )
cont= cont + 1 ;

mas se optar pela segunda está assim:

int Contavalores( int M , int num
[ 5 ][ 5 ])

e vai ficar assim: 

int Contavalores( int num , int M
[ 5 ][ 5 ])

e nesse caso não será necessário alterar o restante do código da função Contavalores, somente a declaração dos argumentos mesmo.

Mais um erro identificado em seu programa é o seguinte: 

cont= Contavalores( num , M [ 5 ][ 5 ]) ;

Nessa linha você está mandando a função Contavalores iniciar a contagem das ocorrências na matriz a partir das posições 5 e 5 quando na verdade isso está errado pois se eu quero percorrer uma matriz para saber quantas vezes há um determinado valor nela eu devo começar a leitura da matriz a partir das posições 0 e 0 para que toda a matriz seja percorrida. Então nesse caso devo mudar a chamada de função para: 

cont= Contavalores( num , M [0][0]);

ou até mesmo:

cont= Contavalores( num , M );

já que quando eu passo uma matriz sem índice para uma função por argumento eu estou indicando dessa forma que essa matriz inicia-se nas posições 0. Fazendo como está no seu código passando a matriz para a função como argumento com os índices 5 e 5 vai dar errado o seu programa pois a função Contavalores irá percorrer a matriz a partir das posições 5 e 5 e irá incrementar esses índices fazendo com que valores fora do tamanho real da matriz sejam lidos como por exemplo M[6][6] ou então M[7][7] ou seja valores que não existem realmente nessa matriz sendo então lixo de memória e dessa forma o seu programa não funcionará. A própria posição [5][5] da matriz é lixo de memória pois em C o índice de matrizes começa em zero.

Há mais um erro em seu programa. Ele contém diversos.

for ( j =- 1 ; j < 5 ; j ++)
{ if ( M [ i ][ j + 1 ]== num )

Nessas linhas de código a variável j irá assumir 6 valores diferentes durante as comparações e isso fará com que a matriz M tenha o seu limite extrapolado durante a leitura pois irá acontecer o seguinte:

if(M[0][5]==num)

e também: 

if(M[1][5]==num)
if(M[2][5]==num)
if(M[3][5]==num)
if(M[4][5]==num)

Isso irá ler a matriz M uma posição além do seu limite 5 vezes e resultará em valores comparados com o lixo de memória que existe além do limite da matriz M e o seu programa irá mostrar na tela um valor incorreto de ocorrências de um determinado número na matriz por que ele está verificando se esse determinado número é igual ao lixo de memória e se for vai incrementar o contador de ocorrências. Em uma matriz 5 por 5 as posições máximas são 4 e 4 por que o índice de matrizes em linguagem C começa em zero portanto seu programa está comparando aquele determinado número com a posição 5 da matriz o que irá resultar em resultados incorretos em seu programa.

Abaixo está o programa funcionando corretamente. É o mesmo porém com todos esses erros corrigidos. Nele eu reaproveito o seu código e por esse motivo ele está quase igual ao seu.

int cont;
int main ()
{
int num ,M [ 5 ][ 5 ];
Le_valores (&num ,M );
cont= Contavalores( num , M) ;
return 0 ;
}
Le_valores ( int * p ,int N [ 5 ][ 5 ])
{ int i , j ;
scanf ("%d", p ) ;
for ( j = 0 ; j <=4 ; j ++)
{ for ( i = 0 ; i <=4 ; i ++)
scanf ("%d", &N [ j ][ i ]);
}
}
int Contavalores( int num , int M
[ 5 ][ 5 ])
{ int i , j ;
cont= 0 ;
for ( i = 0 ; i < 5 ; i ++){
for ( j = 0 ; j < 5 ; j ++)
{ if ( M [ i ][ j ]== num )
cont= cont + 1 ; }
}
printf("O numero aparece % d vezes na matriz .", cont); 
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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

×

Informação importante

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