Ir ao conteúdo

Posts recomendados

Postado

O código é para achar o maior e menor número de uma matriz, quando eu compilo tem vezes que o código consegue achar o maior mas não acha o menor, ou então ele acha o menor mas não acha o maior,alguém pode ver onde errei? Segue o código:

void main()
{
    int m[4][4],i,j,menor,maior,pma,pme;
    menor=m[0][0];
    maior=m[0][0];
    for(i=0;i<4;i++){
        for(j=0;j<4;j++){
           scanf("%d",&m[i][j]);
           if(m[i][j]<menor){
            menor=m[i][j];
           }
           if(m[i][j]>maior){
            maior=m[i][j];
           }
        }
    }
    printf("O menor numero e: [%d]",menor);
    printf("O maior numero e: [%d]",maior);


}

 

 

matriz.PNG

  • Curtir 1
Postado

Para postar códigos no fórum sempre use a tag CODE apertando o botão <> no topo do campo de respostas, assim você preserva a formatação do código e evita que o fórum faça alterações nele.

 

Por exemplo, o fórum "comeu" todos os [ i ] (sem espaços) do seu código, pois no fórum isso é a tag para deixar o texto em itálico, então o texto do seu código está em itálico a partir do primeiro que foi encontrado (os demais apenas somem porque o texto já tá em itálico).

  • Curtir 2
Postado
3 minutos atrás, isrnick disse:

Para postar códigos no fórum sempre use a tag CODE apertando o botão <> no topo do campo de respostas, assim você preserva a formatação do código e evita que o fórum faça alterações nele.

 

Por exemplo, o fórum "comeu" todos os [ i ] (sem espaços) do seu código, pois no fórum isso é a tag para deixar o texto em itálico, então o texto do seu código está em itálico a partir do primeiro que foi encontrado (os demais apenas somem porque o texto já tá em itálico).

 

adicionado 0 minutos depois
4 minutos atrás, isrnick disse:

Para postar códigos no fórum sempre use a tag CODE apertando o botão <> no topo do campo de respostas, assim você preserva a formatação do código e evita que o fórum faça alterações nele.

 

Por exemplo, o fórum "comeu" todos os [ i ] (sem espaços) do seu código, pois no fórum isso é a tag para deixar o texto em itálico, então o texto do seu código está em itálico a partir do primeiro que foi encontrado (os demais apenas somem porque o texto já tá em itálico).

Arrumei, obrigado

  • Curtir 2
Postado

O problema esta na inicialização dos valores de maior e menor.

 

No começo do programa você faz:

menor=m[0][0];
maior=m[0][0];

Mas nesse ponto ainda não foi atribuído nenhum valor para m[0][0], então o valor armazenado em "maior" e em "menor" é algum valor lixo que está lá nessa posição da memória.

 

E se esse valor for maior que todos os números da matriz ele ficará armazenado como sendo o maior valor.

 

Uma maneira de corrigir isso seria assim:

int main()
{
    int m[4][4],i,j,menor,maior,pma,pme;
    for(i=0;i<4;i++){
        for(j=0;j<4;j++){
           scanf("%d",&m[i][j]);
           if (i == 0 && j == 0){
               menor=m[0][0];
               maior=m[0][0];
           }
           if(m[i][j]<menor){
            menor=m[i][j];
           }
           if(m[i][j]>maior){
            maior=m[i][j];
           }
        }
    }
    printf("O menor numero e: [%d]\n",menor);
    printf("O maior numero e: [%d]\n",maior);
    return 0;
}

 

  • Curtir 2
  • 3 anos depois...
Postado
    int m[4][4],i,j,menor,maior,pma,pme;
    menor=m[0][0];
    maior=m[0][0];

 

Como dito acima,

 

Em 19/07/2017 às 19:35, isrnick disse:

Mas nesse ponto ainda não foi atribuído nenhum valor para m[0][0], então o valor armazenado em "maior" e em "menor"


não sabe o que tem nesses valores. E se acha que são zero também não resolveria. Qualquer int pode ser negativo. Se sua matriz tivesse valores de -1 a - 16 como seria?

 

Sobre essa construção 

Em 19/07/2017 às 19:35, isrnick disse:
nt main()
{
    int m[4][4],i,j,menor,maior,pma,pme;
    for(i=0;i<4;i++){
        for(j=0;j<4;j++){
           scanf("%d",&m[i][j]);
           if (i == 0 && j == 0){
               menor=m[0][0];
               maior=m[0][0];
           }
 


Sugiro evitar sempre. Seria como ter uma fila e perguntar pra cada cliente se ele é o primeiro. Depois do primeiro nenhum mais vai ser o primeiro. Mesmo nesse exemplo são 16 perguntas para ver se é o elemento [0][0].

 

E mantem i e j como globais. Má ideia. Proibido em toda parte, empresas e escolas. Declare i e j DENTRO dos comandos for, como é possível desde os anos 70.

 

E C tem os valores INT_MIN e INT_MAX que resolvem isso: o maior valor e o menor valor que cabe em um int, disponível com outras constantes em limits.h.

 

Prefira
 

    const int dim = 4; 
    int     maior = INT_MIN;    
    int     menor = INT_MAX;
    for(int i=0;i<dim;i+=1)
        for(int j=0;j<dim;j+=1)
            scanf("%d",&m[i][j]);
            if ( m[i][j] < menor )
                menor = m[i][j];
             else
                if ( m[i][j] > maior )
                    maior = m[i][j];
  

 

Teste SEMPRE o retorno de scanf(). É ingênuo seguir se não leu nada.

30 minutos atrás, arfneto disse:

Sugiro evitar sempre. Seria como ter uma fila e perguntar pra cada cliente se ele é o primeiro. Depois do primeiro nenhum mais vai ser o primeiro. Mesmo nesse exemplo são 16 perguntas para ver se é o elemento [0][0].

 

 

Talvez não tenha ficado claro: testando DENTRO do loop todo o tempo para ver se o elemento é o primeiro de 16 implica em 15 testes a toa....

  • 2 anos depois...
Postado
Em 19/07/2017 às 18:43, Leo_92 disse:

O código é para achar o maior e menor número de uma matriz

Porém, fez um que insinua produzir e talvez ler uma matriz enquanto determina o maior e o menor valor entre as leituras. Assim, faz com que o serviço da matriz bi fique abaixo do enunciado, quase inútil. Interprete, ipo — Entrada, processamento e Saída. 

 

Verá que o processo excluiu a matriz.

Corrija: Invés do valor, memorize o índice de maior...

 

***

Postado

Por exemplo:

 

C'11 - gcc'11.4

#include <stdio.h>
int main (void){
  int i ,j ,m[4][4]= {0} ,menor[2]= {0} ,maior[2]= {0};
  printf ("%s","Informe até 16 valores como inteiro: ");
  for (i= 0 ; i<4 ; i++) {
    for(j= 0 ; j<4 ; j++) {
      int c= scanf ("%i",&m[i][j]);
      if (c==EOF || c!=0x1) i= 4 , j= 4;
          else {
         if (m[i][j]<m[menor[0]][menor[1]]) menor[0]= i , menor[1]= j;
         if (m[i][j]>m[maior[0]][maior[1]]) maior[0]= i , maior[1]= j;
         }}}
  printf ("%s%d%c%c","O menor valor é: {",m[menor[0]][menor[1]],'}','\n');
  printf ("%s%d%c%c","O maior valor é: {",m[maior[0]][maior[1]],'}','\n');
  return 0;
  }

Se há algum refinamento de código, então, aplique-o, porque para mim esse código confere com enuciados.

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!