Ir para o conteúdo
nunopicado

Mini-Exercicio: Conversão de valores

Mensagens Recomendadas

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

Editado por 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Editado por thoga31

Knowledge is free!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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) );

Editado por thoga31

Knowledge is free!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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...

Editado por 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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á! ;)

Editado por 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.