Solicitação de algoritmo 9 – verificar ordenação de valores

Nessa solicitação de algoritmo foi solicitado para verificar se uma sequência numérica está em ordem crescente. Segue o enunciado.

Enunciado: Elabore um algoritmo para determinar se uma sequência de valores está ou não em ordem crescente. A entrada é um número n, que indica quantos valores constituem a sequência a ser verificada. A sequência será dada a seguir, com números separados por espaço (não usar vetores).

Essa questão foi enviada como solicitação de algoritmo pelo Jean. Ele tinha uma pequena dúvida em relação à entrada dos dados (ter que ler a sequência dos valores separados por um espaço). O algoritmo enviado por ele parecia correto, mas encontrei um pequeno erro. Segue o algoritmo que ele me enviou.

#include <stdio.h>

int main(void) {
    int qtdNumeros=0, numeroAtual =0, numeroAnterior=0, i=0, status=0;
    printf("Digite quantos numeros serão inseridos: ");
    scanf("%d", &qtdNumeros);

    printf("Digite os numeros: ");
    scanf("%d", &numeroAnterior);

    for (i=0; i<(qtdNumeros - 1); i++){
        scanf("%d", &numeroAtual);
        if (numeroAtual >= numeroAnterior) {
            status = 1;
        } else {
            status = 0;
            break;
        }
    }

    if (status == 1) {
        printf("SIM");
    } else {
        printf("NAO");
    }

    return 0;
}

Na entrada tradicional para um algoritmo, o usuário costuma indicar os valores e pressionar o enter. No prompt de comando, não existe uma diferença na entrada de valores numéricos separados por enter ou espaço. Ou seja, o algoritmo irá funcionar tanto se o usuário informar os valores dando um enter a cada valor, ou simplesmente colocando espaços entre os valores. Até é possível fazer com que isso não aconteça (não aceitar o espaço como separador), mas o padrão é aceitar.

A solução enviada pelo Jean pode parece correta. Isso porque em diversos testes o algoritmo vai funcionar. Considerando o seguintes conjuntos de sequência, os valores informados obterão a resposta esperada:

0 1 2 3

5 4 3

0 50 3 10

O utilização de entradas como as indicadas gerará a ilusão de que o algoritmo está correto, mas não está. Por isso a importância de pensar bem o conjunto de entrada, não apenas colocando entradas ordenadas e desordenadas, mas também modificando a ordem dos valores de entrada.

Observe que, com a entrada da sequência 3 8 5 9, que deveria resultar em NAO (pois os valores não estão em ordem), a saída do algoritmo será um SIM. É fácil de perceber o motivo fazendo um rápido teste de mesa, onde será percebido que os testes do if dentro do for são realizados apenas comparando o valor atual com o primeiro valor informado e não com o valor anterior, como deveria ser feito.

Para resolver isso, basta atualizar o valor anterior com o novo valor, fazendo isso logo depois da estrutura condicional. O código abaixo adiciona essa instrução, que pode ser vista na linha 19.

#include <stdio.h>

int main(void) {
    int qtdNumeros=0, numeroAtual =0, numeroAnterior=0, i=0, status=0;
    printf("Digite quantos numeros serão inseridos: ");
    scanf("%d", &qtdNumeros);

    printf("Digite os numeros: ");
    scanf("%d", &numeroAnterior);

    for (i=0; i<(qtdNumeros - 1); i++){
        scanf("%d", &numeroAtual);
        if (numeroAtual >= numeroAnterior) {
            status = 1;
        } else {
            status = 0;
            break;
        }
        numeroAnterior = numeroAtual;
    }

    if (status == 1) {
        printf("SIM");
    } else {
        printf("NAO");
    }

    return 0;
}

Uma última consideração: como a solução pede para fazer a leitura de um conjunto de valores, é comum pensar no uso de vetores para resolver esse problema (para alunos que já conhecem essa estrutura). Embora uma solução utilizando vetores seja possível, ela é totalmente desnecessária, sendo que ela também ocuparia mais memória e mais processamento para alcançar o mesmo resultado.

Share

Uma opinião sobre “Solicitação de algoritmo 9 – verificar ordenação de valores

  1. Jean Vitor Vieira

    Muito obrigado pela dica, professor! Eu fiz o código já pensando em fazer dessa forma, mas acabei esquecendo de colocar essa atribuição de valores antes que o laço acabe. E nos meus testes usei ou uma sequência crescente ou descrescente, então ele funcionou bem, pois ou as entradas depois da primeira eram sempre ou maiores ou menores que a inicial, não aprensetando erros. Obrigado, novamente, pela correção!

     
    Reply

Deixe um comentário para Jean Vitor Vieira Cancelar resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.