Jump to content
jaozinpnk

Problema em laço for

 Read less than a minute

Recommended Posts

 Read less than a minute

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);


} 

Share this post


Link to post
Share on other sites
 Read 1 minute
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!

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...