Jump to content

Problema em laço for


jaozinpnk

Recommended Posts

Boa tarde, Foi proposto um exercício sobre vetores (imagem abaixo), que pede para sinalizarmos, respectivamente qual o maior e o menor valor recebido do usuário. O código escrito consegue identificar qual o maior valor dentre os 20 digitados e a sua posição, porém quando ele deve sinalizar qual o menor valor presente no vetor e a sua posição, ele só retorna 0.

image.png.9eedda6998686ee353c74aae516042fa.png

Segue o código:

#include <stdio.h>

#define TAM 3

int main()
{

    int vetor[TAM];
    int i, j;
    int maior=0, menor = 0;
    int posmaior = 0, posmenor = 0;


    //LEIURA
    for(j=0; j <TAM; j++)   
    {   
    printf("Digite um numero para o indice [%d]: ", j);
    scanf("%d", &vetor[j]);
    }


    //MAIOR
    for(j=0; j <TAM; j++)
    if(vetor[j] > maior)
    {
        maior = vetor[j];
        posmaior = j;
    }

    //MENOR
    for(j=0; j < TAM; j++)
    if(vetor[j] < menor)
    {
        menor = vetor[j];
        posmenor = j;
    }




    //FINAL 
    printf("\nMaior valor: %d", maior);
    printf("\nPosicao: %d", posmaior);

    printf("\n");

    printf("\nMenor valor: %d", menor);
    printf("\nPosicao: %d", posmenor);


} 
Link to comment
Share on other sites

  • Supporter - Byte
On 6/9/2020 at 10:08 AM, jaozinpnk said:

Boa tarde, Foi proposto um exercício sobre vetores (imagem abaixo), que pede para sinalizarmos, respectivamente qual o maior e o menor valor recebido do usuário. O código escrito consegue identificar qual o maior valor dentre os 20 digitados e a sua posição, porém quando ele deve sinalizar qual o menor valor presente no vetor e a sua posição, ele só retorna 0.

image.png.9eedda6998686ee353c74aae516042fa.png

Segue o código:


#include <stdio.h>

#define TAM 3

int main()
{
    int vetor[TAM];
    int i, j;
    int maior=0, menor = 0;
    int posmaior = 0, posmenor = 0;

    //LEIURA
    for(j=0; j <TAM; j++)   
    {   
    printf("Digite um numero para o indice [%d]: ", j);
    scanf("%d", &vetor[j]);
    }
    //MAIOR
    for(j=0; j <TAM; j++)
    if(vetor[j] > maior)
    {
        maior = vetor[j];
        posmaior = j;
    }

    //MENOR
    for(j=0; j < TAM; j++)
    if(vetor[j] < menor)
    {
        menor = vetor[j];
        posmenor = j;
    }

    //FINAL 
    printf("\nMaior valor: %d", maior);
    printf("\nPosicao: %d", posmaior);

    printf("\n");

    printf("\nMenor valor: %d", menor);
    printf("\nPosicao: %d", posmenor);


} 

Opa, bom dia!


Acredito que o problema esteja mais na lógica e entendimento do exercício proposto. Abordando inicialmente o problema apresentado que o menor retorna o valor 0.

A variável menor é inicializada com o valor 0. Considerando os seguintes valores aleatórios do seu vetor:

int vetor[3] = { 30, 10, 15 };

A expressão que está sendo testada if(vetor[j] < menor) produziria as seguintes verificações:

if (30 < 0) 
if (10 < 0)
if (15 < 0)

E como nenhum dos valores são menores que 0, tanto a variavel menor quanto posmenor retornariam zero (valores previamente inicializados).

O mesmo problema ocorreria com a variável maior caso tivesse utilizado números negativos.

int vetor[3] = { -20, -10, -15 }

Pois as seguintes expressões nunca seriam verdadeiras:

if (-20 > 0)
if (-10 > 0)
if (-15 > 0)

Algumas considerações e sugestões adicionais.

Quando voce fizer o for loop pelo vetor, você pode verificar as duas condições maior ou menor sem a necessidade de fazer 2 loops separados.
Você declarou int main() portanto a função espera um int como retorno e boas práticas sugerem que coloque um valor, exemplo:

return 0; 

Isso fica mais claro quando voce começa a trabalhar com funções.

Outro ponto na questão de otimização é que as seguintes linhas podem ser simplificadas:

printf("\nPosicao: %d", posmaior);
printf("\n");

Por:

printf("\nPosicao: %d\n", posmaior);

E por último, eu sempre gosto de trabalhar com os laços e condições dentro de { } tanto para facilidade de leitura quanto para delimitação de escopo.

for ( .. ; .. ; .. ) {
   if ( .. ) {
     ...
   }
}

Um típico exemplo de como isso pode ser um problemão e as vezes não mostrar o resultado desejado segue:

#include <stdio.h>

int main()
{
 int val = 0;

 for (int temp=1; temp < 5; temp++)
        if (val < temp)
           printf("%d ", val);
           val++;

 printf("\nval: %d\n", val);

 return 0;
}

$ ./for-if
0 0 0 0
val: 1

 

No mais é isso e espero que tenha ajudado, um grande abraço!

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...