sexta-feira, 29 de abril de 2011

Algoritmo: leia 3 valores e escreva em ordem crescente.

Não sei quantos colegas conseguiram fazer as combinações da tarefa do prof. Jonatas. A tarefa consiste no seguinte:

- leia três valores e escreva-os em ordem crescente.

É fácil? Sim é fácil. É rápido? Não, não é rápido, afinal você deve fazer e testar todas as possíveis posições dos números. Para facilitar o trabalho, antes de iniciar eu procurei saber as posições dos números, e se não errei, estas são as posições possíveis:

123 e 132;

213 e 231;

312 e 321

Para ordenar 123.

Ainda que os números já estejam na ordem crescente, é necessário fazer a comparação. Eu fiz assim:

se(a<b) e (b<c) e (c>a) e (c>b) entao
        escreval(a,b,c)
fimse

Para ordenar 132:

Nesta combinação, o número 1=a; 3=c; 2=b. Assim, fiz a comparação para determinar quem é maior, e quem é menor:

se(a<b) e (a<c) e (b>a) e (b>c) entao
        escreval(a,c,b)
fimse

Para ordenar 213

Nesta ordem o valor 1=b; 2=a; 3=c. Assim fiz a comparação para determinar a posição de cada um e escrever na ordem exigida:

se(a>b) e (a<c) e (b<c) e (c>a) entao
        escreval(b,a,c)
fimse

Para ordenar 231

Nesta ordem, o valor menor 1 foi digitado como terceiro número, ou seja, está em c. O valor 2 está em a. E e o número 3 está em b. Reorganizando:

se(c<a) e (c<b) e (b>c) e (b>a) entao
         escreval(c,a,b)
fimse

Assim fui  testando cada uma das posições. O algoritmo em Portugol ficou assim:

algoritmo "3 número na crescente"
// Função : VERIFICA A POSIÇAO DOS NÚMEROS
// Autor :  ADAO BRAGA
// Data : 28/04/2011
// Seção de Declarações
var
a,b,c:inteiro
inicio
// Seção de Comandos
repita
escreva("PRIMEIRO Nº ")
leia(a)
escreva("SEGUNDO Nº ")
leia(b)
escreva("TERCEIRO Nº ")
leia(c)

//111 – ok
se(a=b) e (a=c) e (b=c) entao
        escreval("Todos são iguais")
fimse
//123 - ok
     se(a<b) e (b<c) e (c>a) e (c>b) entao
        escreval(a,b,c)
     fimse
//132 - ok
    se(a<b) e (a<c) e (b>a) e (b>c) entao
        escreval(a,c,b)
    fimse
//213 - ok
    se(a>b) e (a<c) e (b<c) e (c>a) entao
        escreval(b,a,c)
    fimse
//231 - ok
      se(c<a) e (c<b) e (b>c) e (b>a) entao
         escreval(c,a,b)
      fimse

//321 - ok
     se(c<a) e (c<b) e (b<a) e (b>c) entao
        escreval(c,b,a)
    fimse
//312 - ok
     se(a>b) e (a>c) e (b<c) e (c<a) entao
        escreval(b,c,a)
    fimse
fimrepita
fimalgoritmo

Fiz várias comparações com SE, e não usei nenhum SENÃO, bem como, nenhum SE aninhado. Testei todas as opções, e todas ordenaram os números corretamente.

A boa noticia é que existem funções nas linguagens de programação em que esta tarefa é facilitada. Como por exemplo o uso de Vetor, matriz, conjunto, e uma série de meios para que dado não apenas 3 números, mas, centenas, milhares, milhões de números, de registros, … e há comandos que realiza a tarefa.

E por que e para que este exercício?  Para exercitar oras! Eu passei pelo menos 4 horas para testar todas as possíveis posições, e para comparar todas as posições.

Inserir esta condição também:

se(a=b) e (a=c) e (b=c) entao
        escreval("Todos são iguais")
fimse

Só para incrementar o código e a função. Como você fez o seu?

4 comentários:

  1. E se ocorrer uma situação do tipo 112 223 331,

    ResponderExcluir
  2. Foi solicitado na atividade para fazer testando todas as possibilidades, e assim foi feito. Mas, existe outros métodos mais rápidos e eficiente de realizar a tarefa. E foi feita com o uso de variável auxiliar!

    ResponderExcluir
  3. O código pode ser mais simples assim:
    se(a=b) e (b=c) entao
    escreval("Todos são iguais")
    fimse

    ResponderExcluir
  4. boa pergunta anonimo, e vou fazer outra, nao tem outra forma de fazer dem fazer esse monte de "se" , tipo eele reconhecer o menor e colocar ele sempre na frente?

    ResponderExcluir