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.