Jump to content
nunopicado

Mini-Exercicio: Conversão de valores

Recommended Posts

nunopicado

Este é um mini exercício, só para abanar um pouco o quadro...

Problema:

Temos de um lado 2 valores: 'P' e 'S' por exemplo

De outro, temos outros 2: 0 e 1

O desafio é, da forma mais simples e direta, saber o número quando temos uma das letras; e saber a letra quando temos um dos números.

Obs.:

- Qualquer estrutura é aceite. Se acharem que a melhor maneira é vestir um palhaço com uma toga da antiga Grécia em homenagem ao nome Delphi, vocês é que sabem, desde que a conversão seja feita (bolas, já contei a solução :cheesygrin: )

- Não há necessidade de usar o mesmo método para as duas conversões.

- A equivalência é direta: P = 0, S = 1

- Só são considerados inválidos os métodos que não consigam a conversão, pelo que não há muito que saber

Não há apenas uma forma de fazer isto, ou não estivéssemos nós a falar de Pascal/Delphi.

A ideia é só mesmo ver que tipo de soluções saem das vossas cabeças

Para tentar uniformizar a estrutura das respostas, criem-se as soluções a partir deste pressuposto:

var
  ch:Char;
  nm:Byte;

Venham as soluções...

Edited by nunopicado

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
thoga31

A mais fácil é a de nº para letra, pois os nºs são consecutivos:

const nm2ch : array [0..1] of char = ('P', 'S');

// teste:
writeln(nm2ch[0], ' | ', nm2ch[1]);

A minha solução para o reverso foi esta:

function ch2nm(c : char) : byte;
begin
   ch2nm := Pos(c, 'PS') - 1;
end;

// teste:
writeln(ch2nm('P'), ' | ', ch2nm('S'));

Contudo, a chamada de um método é com parêntesis rectos e outro com curvos. Vamos então criar um outro método para que o 1º também tenha parêntesis curvos:

function nm2ch(b : byte) : char;
const c : array [0..1] of char = ('P', 'S');
begin
   nm2ch := c[b];
end;

// teste:
writeln(nm2ch(0), ' | ', nm2ch(1));

Pode-se ainda utilizar estruturas Case Of, mas pessoalmente prefiro estas soluções mais compactas.

Chega, @nuno? :D

Edited by thoga31

Knowledge is free!

Share this post


Link to post
Share on other sites
nunopicado

Hehehe

Aqui estão duas excelentes soluções.

A primeira, array de constantes, imaginei que fosse a tua solução...

A segunda confesso que nem me passou pela cabeça quando o problema me surgiu recentemente.

De qualquer forma está excelente, e no caso de haver mais do que 2 numeros/letras, a tua solução é superior à minha, que só prevê mesmo 2 numeros!

Muito bem...

E superaste com isto o objectivo secreto do exercicio, que era ver se o primeiro impacto era usar ifs ou cases...

Venham mais soluções...


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
thoga31

Venham mais soluções...

Duvido que venham mais soluções...

Aproveito para deixar uma curiosidade. Em certas linguagens não há um conceito de Booleano propriamente dito. Utiliza-se o valor 0 e o 1, ou o 0 e outro qualquer, para definir True e False.

Em Pascal/Delphi conseguimos uma conversão deste género assim:

const bool2bin : array [boolean] of byte = (0, 1);
     bin2bool : array [0..1] of boolean = (false, true);

Acho que é bonito de se ver. :D

Ou, mais simples ainda, com type casting:

writeln( byte(false) , byte(true) );
writeln( boolean(0)  , boolean(1) );

Edited by thoga31

Knowledge is free!

Share this post


Link to post
Share on other sites
nunopicado

hehehe Estás quase lá... :)

Então e sabendo que podes converter tipos de dados directamente, aplica isso para converter P em 0 e S em 1...


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
thoga31

Se queres com char, a história não é fácil. Se puder criar um tipo que não seja Char, teremos isto:

type Tps = (P, S);

const ch2nm : array [Tps] of byte = (0, 1);
     nm2ch : array [0..1] of Tps = (P, S);

Se queres pegar nos caracteres 'P' e 'S', não podes fazer isto:

ch2nm : array['P'..'S'] of byte = (0, 1);

Nem isto:

type Tps = ('P', 'S');

Está-me a escapar algo?


Knowledge is free!

Share this post


Link to post
Share on other sites
nunopicado

Não, estás a acertar em tudo.

Só te estás a esquecer de um detalhe:

Tens uma qualquer variável de origem, do tipo Char, e tens uma qualquer variável de destino, do tipo Byte, por exemplo.

Queres portanto converter o 'P' e o 'S', presentes na variável de origem, num 0 e 1, respectivamente, na variável de destino.

Tudo isto é académico. Na tua primeira resposta já deste uma excelente solução para isto, com o uso da função POS.

De qualquer maneira, adiante:

Tens CH = 'P' ou CH = 'S'

Como disseste e bem, não podes brincar com novos tipos para o caso dos Char.

Como também disseste, em jeito de curiosidade, o 0 e 1 necessários como output são equivalentes a valores Boolean.

Então, de que forma podes converter um P em 0 e um S em 1, ou se preferires, um P em False e um S em True? ;)

Lembra-te que tanto o P como o S estão guardados numa variável com, neste caso, duas condições...

Edited by nunopicado

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
thoga31

Tens noção que, em Pascal, isto não funciona como seria esperado:

program conv;  // teste
var c:char;
begin
   for c in ['P', 'S'] do begin
       writeln(c);
       writeln(boolean(ord(c)-ord('P')));
       writeln(byte(boolean(ord(c)-ord('P'))));
   end;
   readln;
end.

O Boolean guarda em si o valor numérico que lhe deu origem. Assim, em vez de 1, obtenho 3.

Posso obter o Boolean, mas não o Byte, por type casting.

Não consigo ver mais hipóteses, @nuno...


Knowledge is free!

Share this post


Link to post
Share on other sites
nunopicado

KIS

program conv;  // teste
var c:char;
begin
   for c in ['P', 'S'] do
       writeln(c,' = ',Integer(c<>'P'));
   readln;
end.

A condição c<>'P' converte automaticamente o 'P' em 0 (Se c for 'P', a condição é falsa, o que com TypeCasting, se transforma em 0).

Em qualquer outra situação, a condição é verdadeira, pelo que se c for 'S', o resultado será True, e portanto, 1

Voilá! ;)

Edited by nunopicado

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
thoga31

Ihh, que burrice... como me fui esquecer disso?

Mas agora faço um pequeno reparo. Dado o tamanho dos dados pretendidos, não aconselho Integer, mas sim Byte. Tem os mesmos bits que um Char, e torna-se a solução óptima:

byte(c<>'P')

Está porreiro... venham mais exercícios :D


Knowledge is free!

Share this post


Link to post
Share on other sites
nunopicado

ehhehe vicios do Delphi... A gestão de memória é automática! ;)


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
thoga31

ehhehe vicios do Delphi... A gestão de memória é automática! ;)

Não sei se o Free Pascal faz isso a esse nível. Uma boa questão... :D


Knowledge is free!

Share this post


Link to post
Share on other sites
nunopicado

A melhor resposta é nem saber...

Assim não se ganham vícios! ;)


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

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.   Restore formatting

  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.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.