Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

LagMaster

Dúvida Conversor | INICIANTE

Mensagens Recomendadas

LagMaster

Boas People

Registei-me há cerca de 1 mês mas devido a escola 👎 , não tenho tido tempo (sinceramente nem me lembrava) de vir ao forum (tinha comprometido comigo mesmo de tentar aprender a programar ). E hoje voltei e recomecei a ler uns tópicos de Pascal.

Estava a ler um tutorial de 2005 e fiquei um pouco "à nora" então percebi que ao ler o codigo fonte era mais facil entender.

Codigo Original Presente no Tutorial 2005

Program Conversão(input,output);

USES CRT;
CONST
KLMILHA=1.6;
VAR
KILOMETROS, MILHAS: real;

BEGIN
writeln('Escreva uma distancia em milhas');
readln(MILHAS);
KILOMETROS:=KLMILHA*MILHA;
writeln('A distância é de ',KILOMETROS, 'Quilómetros');
END.

Esse programa é então um conversor de milhas (nao sei se terrestres ou maritimas , mas isso agora nao importa lol ) para KM..

E logo no inicio não percebi para que servia o: USES CRT

Depois se bem intendi pelo Tutorial o Const são as constantes e o Var as variaveis, mas o que significa o real ?? Estava no texto do tutorial mas não entendi la muito bem..

Depois quando executei esse código ( estou a usar o IDE FPS ) aparecia a parte para por as milhas mas após eu clicar enter para ver quanto dava em KM , aquilo passava muito rápido e não dava para ver o resultado, será do IDE  ???

E por ultimo (muitas duvidas em pouco tempo xD ) eu tentei "converter" o conversor para ser um conversor de Libras para Euros ( basicamente estava a trocar os nomes ) e acabei com este código:

Program Conversão(input,output);
CONST
Libra=1.2;
VAR
Libras, Euros: real;

BEGIN
writeln('Escreva a quantia em euros');
readln(Euros);
Euro:=Libras*Euros;
writeln('A quantia é de ',Euro, 'euros');
END.program Noname0;

Que erro é que cometi ?? É  que aquilo empata sempre na parte: Euro:=Libras*Euros; 😡

Agradeço se me puderem ajudar.. a maioria das duvidas devem parecer provenientes de um nabo mas isso não há nada a fazer xD

Cumprimentos e agradecido

LagMaster


YOU SHALL NOT PASS !!!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Nao definiste (o compilador nao conhece nem sabe de que tipo é) a variavel Euro.

Além disso, definiste a variavel Libras mas nao lhe deste valor nenhum.

Para converter de euros a libras, multiplica os euros introduzidos pelo utiilzador por uma constante ... e atribui esse resultado a uma variavel (provavelmente chamada Libras).


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
LagMaster

Ahh LoL não tinha pensado bem . Obrigado :D

Estive a ver o código e :

Alterei a parte: Euro:=Libra*Euros; de forma a que fosse o numero que se escreve x libras ..

Mas após isso que faço ?? (Ja coloquei nas Variaveis o Euro )..

Basicamente ficou assim:

Program Conversão(input,output);
USES CRT;
CONST
Libra=1.2;
VAR
Euro,Euros: real;

BEGIN
writeln('Escreva a quantia em Euros');
readln(Euros);
Euro:=Libra*Euros;
writeln('A quantia é de ',Euro, 'euros');
END.program Noname0;

E desta forma já deu para compilar  :cheesygrin:

Mas quando escrevo o nº ( escreva a quantia em euros ) apos clicar enter aquilo passa muito rapido e desaparece.. que erro é que cometi ??

Cumpz

LagMaster


YOU SHALL NOT PASS !!!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nunopicado

O motivo de passar muito depressa é o seguinte:

1. Quando começa o programa, ele escreve uma frase.

2. De seguida, espera pelo utilizador para receber um valor.

3. Faz um calculo e guarda o resultado numa variável

4. Escreve uma frase

5. Termina

Se reparares, entre o 4 e o 5 não há nada. Ou seja, ele escreve, e termina imediatamente.

O que tens de fazer é colocar uma instrução qualquer depois do ultimo writeln que obrigue o programa a esperar para dar tempo ao utilizador de ver o resultado.

Uma forma básica é colocares um readln; antes do END. (o readln; sem parentesis nem variável irá simplesmente aguardar que lhe seja dado um <enter>)

Podias elaborar isto, é claro, por exemplo escrevendo uma indicação a dizer ao utilizador para dar enter para terminar o programa, mas basicamente só precisas mesmo do readln.

Isto resolve-te o problema de não mostrar o resultado.

Perguntaste também para que serve o Uses Crt;

Dividindo isto em partes:

Uses - Serve para indicar units, ou seja, bibliotecas de rotinas que, não pertencendo ao núcleo do pascal, ficam disponíveis para ti assim que as chames no programa. Basta colocar no inicio (depois da linha program xpto;) a palavra uses seguida dos nomes dessas units, que se separam por virgulas caso haja mais do que uma a declarar.

Existem montanhas de units que podes usar, umas pertencentes ao proprio pascal, outras criadas por terceiros. Podes ainda criar as tuas proprias units (por exemplo, se criares uma ou mais funções que precises de usar em vários programas, para não as estares sempre a escrever, inserias numa unit, e depois no programa só dizias uses crt, minhaunit;).

Mas isto de criar units aguarda um pouco mais lá pra frente na tua aprendizagem! :D

Crt - É uma dessas units, e possivelmente a principal unit de pascal. Contém rotinas de comunicação com a consola (monitor+teclado) que permitem fazer coisas como mudar a cor do texto, ler caracteres directamente sem precisar de dar enter, mudar o cursor de local sem ter de escrever, etc.

No caso, uses crt; serve para indicares ao teu programa que vais usar rotinas da unit crt.

No caso também, é desnecessária esta linha, pois não estás a usar nada que não pertença ao núcleo do pascal (writeln, readln, constantes e variáveis). Podias tirar a linha que o programa funcionaria da mesma maneira.

Podes também é começar a usar essas rotinas.

Por exemplo, logo a seguir ao begin, se colocares o comando ClrScr; estás a dizer ao programa para limpar o ecrã no inicio do programa.

Se usares TextColor(Blue); estás a dizer para escrever em azul, etc...

Quanto ao Real, é um dos muitos tipos de dados do pascal.

Um tipo de dados é uma maneira de dizer ao compilador que tipo de valores vais atribuir a uma variável.

Neste caso, estás a dizer que as tuas variáveis vão ser do tipo Real, ou seja, números reais (que é como quem diz, qualquer numero*, com ou sem casas decimais)

* Qualquer número é relativo. Há um limite do maior e menor numero que o tipo real pode guardar, que tem a ver com o numero de bytes que ele ocupa em memoria. Não interessa muito dizer qual é, porque varia de compilador para compilador, mas posso dizer-te que é grande.

Há outros tipos de dados muito usados:

Integer - Numeros inteiros (sem casa decimal)

Char - Caracteres (apenas um)

String - Caracteres (vários. dependendo do compilador, pode ter até 255 caracteres, ou mais)

Boolean - Binário - Só aceita dois valores, verdadeiro (true) ou falso (false).

Há muitos mais, e inclusivamente podes criar tipos teus, e subtipos. Mas isso é mais à frente, se começares agora com estes já é excelente.

Se vires o tutorial do Thoga31, cá no forum (aqui), tens um excelente ponto de partida para aprender esta linguagem.

E qualquer duvida, aparece. Estamos por aqui para ajudar!


"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
nunopicado

Já agora, no teu segundo programa está a falhar o "português".

Estas a pedir euros, e depois multiplicas por 1.2 e dizer que são xx euros...

:) Não quererás dizer para inserir as libras, e depois mostrar os euros? Ouvi dizer que isso dá jeito para compras no ebay! :D

PS: Já agora:

O (input,output) podes tirar do programa. Usava-se em pascal standard, há muitos e muitos anos, mas agora, ainda que não dê erro se lá estiver, é completamente inútil. O compilador não lhe passa cartão!


"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
LagMaster

Ah ok Thanks  :)

Finalmente deu :)

Esse erro do portugues foi mesmo uma fail  😳

Program Conversão;
USES CRT;
CONST
Libra=1.19875;
VAR
Euro,Euros: real;

BEGIN
writeln('Escreva a quantia em Libras');
readln(Euros);
Euro:=Libra*Euros;
writeln('A quantia é de ',Euro,'.');
readln;
writeln ('Obrigado por usar este conversor ');
readln;
writeln ('Clique ENTER para sair');
readln;
END.program Noname0;

Acabei por fazer uma mensagem para sair , após tentar muitas vezes  :cheesygrin:

Eu sei que não escrevi o programa original mas estou mesmo muito contente  :D

A seguir vou ler esse tut ( acho que quando me registei ja tinha começado , mas como disse já não venho cá há muito tempo )..

Cumpz

LagMaster 😎

Ps- Está é com um erro que parece que o resultado vem em notação cientifica ( o problema portanto só começa a aparecer em numeros acima de 10 ).


YOU SHALL NOT PASS !!!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nunopicado

Já agora, podes mudar o nome da variável Euros para Libras.

Faz mais sentido, visto que a estás a usar para ler as libras que o utilizador insere.

Quanto à notação científica, é normal, porque o tipo Real é tão grande que só lá vai com notação cientifica.

Para que isso não suceda, deves indicar ao compilador que te basta um número mais pequeno.

Por exemplo, para os euros, só precisas de duas casas decimais. Então fazes o seguinte:

writeln('A quantia é de ',Euro:3:2,'.');

Aquele :3:2 à frente da variável, irá fazer com que o número mostrado tenha um mínimo de 3 caracteres, e um máximo de 2 casa decimais.

Tem de estar encostado à variável, sem espaços entre a variavel e os dois pontos, tal como no exemplo em cima.

Se quisesses, podias por :10:2, e o valor aparecia com espaços antes do número

Ex.:  A quantia é de        2.25.

Isto só é preciso nos numeros reais. Uma variável integer, por exemplo, como não tem casas decimais, não precisa de nada disto.


"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
nunopicado

Já agora, pareces estar interessado em aprender, sugiro-te fazer um exercicio:

Fazes o mesmo conversor, mas com possibilidade de converter de euros para libras, ou de libras para euros.

Para tal, deves perguntar primeiro ao utilizador qual a opção, e conforme a resposta, executar o cálculo correcto.

Se tiveres dúvidas, tens o tuturial ou então aqui no forum! :D


"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
LagMaster

transferirb.jpg:)

Vou tentar , tb estava a pensar , no final  dar a opção de voltar a converter um nº ou sair.. mas isso fica para o fim ..

Vou ler o tut e depois tentar (ou entao ao contrario)

Cumpz

LagMaster :D


YOU SHALL NOT PASS !!!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
LagMaster

Vou ter então de colocar euros como constante , certo ??

Program Conversão;
USES CRT;
CONST
Libra=1.19875;Euro=0.83320

Acrescentar as libras às variaveis:

Program Conversão;
USES CRT;
CONST
Libra=1.19875;Euro=0.83320
VAR
Euro,Libra,Libras: real,Euros: real;

Após isso fazer um frase que dê ambas as opções:

 Program Conversão;
USES CRT;
CONST
Libra=1.19875;Euro=0.83320
VAR
Euro,Libra,Libras: real,Euros: real;

BEGIN
writeln('Quer converter £>€ ou €>£ ?'); 

E depois por o readln para ambas as opções:

Program Conversão;
USES CRT;
CONST
Libra=1.19875;Euro=0.83320
VAR
Euro,Libra,Libras: real,Euros: real;

BEGIN
writeln('Quer converter £>€ ou €>£ ?');
readln(£>€,€>£);

Penso que isto deva ser o inicio do programa, agora vou ter de por aqueles "if's,thens, etc.." por isso vou ver se leio essa parte do tut..

Agradeço a ajuda xd

Cumpz

LagMaster:D


YOU SHALL NOT PASS !!!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nunopicado

Sim, isso é excelente, porque fazendo isso, usas já muitas das bases do Pascal.

Gosto de ver essa vontade! :) Cá estaremos para apoiar!

Se lês antes ou depois o tutorial...

Um professor dir-te-ia para ler primeiro.

Mas confesso que sempre preferi por as mãos na massa, e ir lendo à medida que me fazia falta algo! :D

Quanto ao teu ultimo post:

Não precisas fazer essa segunda constante. O factor é o mesmo, só precisas de decidir se multiplicas (como fizeste até agora) ou divides.

Basicamente, o teu programa precisará de:

1. Perguntar o que a pessoa quer fazer (euros para libras ou libras para euros)

2. Ler a opção

3. Testar a opção:

  Se for libras para euros:

      a. Pergunta um valor em libras

      b. Le um valor

      c. Multiplica o valor lido pelo factor de conversão (constante)

      d. Mostra o resultado em euros

  Se for euros para libras:

      a. Pergunta um valor em euros

      b. Le um valor

      c. Divide o valor lido pelo factor de conversão (constante)

      d. Mostra o resultado em libras


"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
LagMaster

Então acabei por só ler aquilos dos "if's" e parece facil..

Program Conversão;
USES CRT;
CONST
Libra=1.19875;
VAR
Euro,Libra,Libras: real,Euros: real;

BEGIN
writeln('Quer converter £>€ ou €>£ ?');
readln(£>€,€>£);
if (£>€)then begin
writeln('Escreva a quantia em Libras');
readln(Euros);
Euro:=Libra*Euros;
writeln('A quantia é de ',Euro:3:2,'.');
end
else begin
writeln('Escreva a quantia em Euros');
readln(Libras);
Libra:=Libra/Euros;
writeln('A quantia é de ',Libra:3:2,'.');
end
readln;
END.program Noname0;

Está a dar-me erro nas variaveis :/

Pode ser que existam mais erros em baixo , mas eu faço isto aos poucos portanto :) (o erro estara na parte Libra:=Libra/Euros; )..

Poderia ajudar-me ??

Cumpz

LagMaster :D


YOU SHALL NOT PASS !!!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nunopicado

Claro que sim...

Bem, para começar, não podes por selecções de cor do forum dentro das tags de code. :D

Quanto ao programa mesmo, tu estás a ler a opção incorrectamente.

Dentro do readln deves por um variável, e como estás a ler caracteres, tem de ser do tipo char (se te bastar ler um) ou string (se quiseres ler varios). Como não faz sentido o utilizador estar a escrever tudo, uma variavel do tipo char chega-te perfeitamente.

Detás de a declarar junto com as outras. Como já lá tens o VAR, não precisas de repetir, basta meter o nomedavariavel : tipodedados;

Quando fores ler a opção, fazes readln(nomedavariavel); como fizeste para ler o valor. Claro que convém que na mensagem em que perguntas a opção, sejas claro para o utilizador saber o que deve inserir (ex.: Insira € para converter em euros e £ para converter em libras).

De seguida podes testar a variável da opção.

A tua estruturação do IF está correcta, mas a condição que usaste não.

Nesta fase tu já tens a opção do utilizador numa variável (chamada por exemplo, opcao).

O que precisas agora é ver que caracter é que lá está guardado. Portanto a condição será:

if opcao = '€' then begin

as pelicas ( '€' ) à volta do simbolo € é uma exigencia do pascal. Quando estás a lidar com valores alfanumericos (char ou string), esses valores têm de estar sempre envoltos em pelicas: Ex.:  'valor qualquer'

Outra sugestão que te dou é dar nomes melhor pensados aos identificadores (variáveis e constantes, e claro ao proprio programa).

1. Os identificadores não podem ter acentos, espaços ou cedilhas, têm de começar por uma letra ou um _. Também não podem ser repetidos dentro da mesma zona do programa (no teu programa só tens uma zona pelo que não podes mesmo repetir).

2. Se criares identificadores muito parecidos (libra e libras) corres o risco de os trocar, como estás a fazer no ultimo writeln, em que estás a escrever a constante, ou no calculo antes do writeln, onde tentas atribuir um valor à contante.

Recomendo-te portanto que à constante chames algo como EurosPorLibra. Assim nesse já não te enganas. :)

Depois, duas variáveis te chegam, uma chamada euros e outra chamada libras. (mais, é claro, a variável da opção).

Depois lês na variável que foi decidido (euros ou libras, conforma a opção) e calculas com a outra:

Ex.:

writeln('Escreva a quantia em Libras');
readln(libras);
Euros:=Libras*EurosPorLibra;
writeln('A quantia é de ',Euro:3:2,' euros.');
end

Qualquer coisa avisa...


"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
LagMaster

Não percebi isso  bem  :wallbash:

Estou a tentar alterar tudo o que posso e que deveria por a dar..

Program Conversão;
USES CRT;
CONST
EurosPorLibra=1.19875;
VAR
opcao,Euro,Libra,Libras,Euros: real;

BEGIN
writeln('Insira Euros para converter em euros e Libras para converter em libras');
readln(Euros,Libras);
if opcao = 'Euros' then begin
writeln('Escreva a quantia em Libras');
readln(Euros);
Euro:=EurosPorLibra*Euros;
writeln('A quantia é de ',Euro:3:2,'.');
end
else begin
writeln('Escreva a quantia em Euros');
readln(Libras);
Libra:=Libras/EurosPorLibra;
writeln('A quantia é de ',Libra:3:2,'.');
end

END.program Noname0;

Não estou a perceber o que faço mal  :D

Cumpz

LagMaster


YOU SHALL NOT PASS !!!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nunopicado

O que estás a fazer mal é que não estás ainda a ver o conceito de leitura de variáveis.

Mas não te preocupes, isso já lá vai! :D

O readln lê-te um valor do teclado para uma variável. Portanto, não faz sentido usares readln(Euros,Libras);  porque isto seria tentar ler duas variáveis.

Neste ponto, tudo o que precisas é que o utilizador decida o que quer fazer. Se ele escrever 'Euros' e der enter, vai fazer uma coisa. Se escrever 'Libras' e der enter, vai fazer outra coisa.

Ou seja, precisas de ler uma variável apenas, que é a variavel opcao.

Ficaria por isso:

writeln('Insira Euros para converter em euros e Libras para converter em libras');
readln(opcao);

Falando nisso, como vais ler palavras (as opções que o utilizador pode inseri são 'Euros' ou 'Libras'), a tua variavel opcao tem de ser declarada com o tipo certo. No teu programa, estás a declara-la como sendo do tipo real, o que te daria erro ao ler o valor.

Teria portanto de ficar assim:

var
   opcao: String;   // String é um tipo de dados que serve para guardar texto, independentemente de serem numericos ou não
   Euros,Libras: Real;  // Como eu tinha dito antes, só precisas das variáveis opcao, euros e libras. O resto não é necessário

A nivel do IF já acertaste. Falta só agora veres o porquê de só precisares de duas variáveis do tipo Real.

Tens duas declaradas: Euros e Libras. Só precisas mesmo dessas, porque das duas uma: Ou tens euros e queres libras ou tens libras e queres euros. Só tens necessidade de guardar dois valores, pelo que não precisas de 4 variáveis.

Assim, no primeiro cáluclo poderias fazer:

writeln('Escreva a quantia em Libras');
readln(Libras);  // repara, se estás a pedir libras ao utilizador, deves usar a variável libras, e não euros como fizeste. Não faz sentido e acaba por te baralhar
Euros:=EurosPorLibra*Libras;
writeln('A quantia é de ',Euros:3:2,'€.');

No segundo bloco é igual. Deves ler o valor em euros para a variável Euros e depois atribuir a conta à variável Libras, já que é isso que estás a calcular.

Tenta agora... :)

PS: Convém notares bem a diferença entre os nomes das variáveis, que no caso são Euros, Libras e Opcao, dos valores que o utilizador insere, que no caso são 'Euros' ou 'Libras' (entre pelicas).

Outra coisa que tens de ter em atenção é que A é diferente de a. Ou seja, Se no IF tens opcao = 'Euros' e o utilizador inserir 'euros' (com o E minúsculo), o programa não irá fazer correctamente o serviço.


"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
LagMaster

Obrigado  :D

Program Conversão;
USES CRT;
CONST
EurosPorLibra=1.19875;
var
   opcao: String;
   euro,libra,Euros,Libras: Real;

BEGIN
writeln('Digite Euros para converter em euros e Libras para converter em libras');
readln(opcao);
if opcao = 'Euros' then begin
writeln('Escreva a quantia em Libras');
readln(Libras);
euro:= EurosPorLibra*Libras;
writeln('A quantia é de ',euro:3:2,' Obrigado por usar este conversor ;D');
readln;

end
else begin
writeln('Escreva a quantia em Euros');
readln(Euros);
libra:=Euros/EurosPorLibra;
writeln('A quantia é de ',Libra:3:2,'Obrigado por usar este conversor ;D');
readln;
end

END.program Noname0;

Aquilo dava Erro no Euro e Libra portanto acrescenteios às variaveis reais..

E funciona :)

Agora vou tentar pesquisar para depois apos converter perguntar se quer converter mais alguma coisa ou sair.. vou ver se tá no tut  :)

Cumpz

LagMaster 😎


YOU SHALL NOT PASS !!!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nunopicado

:D

Dava erro no Euro e Libra porque não estavam essas declaradas. Se tinhas só declaradas Euros e Libras (plural) eram essas a usar. Bastava-te acrescentar um s em cada uma.

Mas força. vê agora a repetição como deves fazer. No tutorial do Thoga está tudo explicadinho! :)


"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
LagMaster

Vou agora ler..

Realmente sinto-me estranhamente orgulhoso com o programa xD

A versao actual é esta:

Program Conversão;
USES CRT;
CONST
EurosPorLibra=1.19875;
var
   opcao: String;
   euro,libra,Euros,Libras: Real;

BEGIN
writeln('Digite 1 para converter libras em euros e 2 para converter euros em libras');
readln(opcao);
if opcao = '1' then begin
writeln('Escreva a quantia em Libras');
readln(Libras);
euro:= EurosPorLibra*Libras;
writeln('A quantia é de ',euro:3:2,' euros  Obrigado por usar este conversor ;D');
readln;

end
else begin
writeln('Escreva a quantia em Euros');
readln(Euros);
libra:=Euros/EurosPorLibra;
writeln('A quantia é de ',Libra:3:2,'libras Obrigado por usar este conversor ;D');
readln;
end

END.program Noname0;

Agora vou ver isso da repetição e talvez ainda hoje tenha um conversor de jeito pessoal  :D

Cumpz

LagMaster


YOU SHALL NOT PASS !!!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
LagMaster

Isto do repeat não percebi..

Como é que o uso neste caso ??

Program Conversão;
USES CRT;
CONST
EurosPorLibra=1.19875;
var
   opcao: String;
   euro,libra,Euros,Libras: Real;

BEGIN
writeln('Digite 1 para converter libras em euros e 2 para converter euros em libras');
readln(opcao);
if opcao = '1' then begin
writeln('Escreva a quantia em Libras');
readln(Libras);
euro:= EurosPorLibra*Libras;
writeln('A quantia é de ',euro:3:2,' euros  Obrigado por usar este conversor ;D');
readln;

end
else begin
writeln('Escreva a quantia em Euros');
readln(Euros);
libra:=Euros/EurosPorLibra;
writeln('A quantia é de ',Libra:3:2,'libras Obrigado por usar este conversor ;D');
readln;
end
END.program Noname0;

Devia por repeat e no fim until ate que alguem escrevesse sair..

Portanto no inicio adicionava a opçao 3 para sair...

Mas acho que para isso precisava de mais um if :/


YOU SHALL NOT PASS !!!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nunopicado

Muito bem...

Agora com essa alteração podes mudar a variavel opcao para o tipo char (apenas um caracter) - Tudo o resto é igual.

Agora enquanto ves como fazer a repetição, aproveita e ve o funcionamento da estrututa Case ... Of...

Estás no inicio, e é natural que te orgulhes por estares a conseguir fazer este exercicio.  Se continuares a tua aprendizagem em breve poderás fazer programas que te darão muito mais orgulho... :D

Sobre o repeat until, é mesmo isso que deves usar.

O repeat é antes da primeira instrução a repetir, e o until no final.

Em vez de mais um IF, podes perguntar no fim se quer repetir.

Depois no until colocas:

Until Opcao = 'N'

Tenta isso...


"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
LagMaster

Program Conversão;
USES CRT;
CONST
EurosPorLibra=1.19875;
var
   opcao: String;
   euro,libra,Euros,Libras: Real;

BEGIN
repeat
writeln('Digite 1 para converter libras em euros ou 2 para converter euros em libras');
readln(opcao);
if opcao = '1' then begin
writeln('Escreva a quantia em Libras');
readln(Libras);
euro:= EurosPorLibra*Libras;
writeln(euro:3:2,'Quer Repetir ?');
readln;

end
else begin
writeln('Escreva a quantia em Euros');
readln(Euros);
libra:=Euros/EurosPorLibra;
writeln(Libra:3:2,'Quer repetir ?');
readln;
end
until opcao='Nao';
writeln ('Obrigado por utilizar este conversor LagMaster ;D');
readln;
END.program Noname0;

Thanks :cheesygrin: Começo a intender 

So que quando aparece quer repetir ? Eu escrevo Nao e nada...  volta a aparecer : Escolha 1 ou 2...

Porque será ??

Cumpz

LagMaster :D


YOU SHALL NOT PASS !!!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nunopicado

Não faz nada porque tu não estás a ler a variável... :D

Tu tens:

writeln(euro:3:2,'Quer Repetir ?');
readln;

A pessoa escreve 'Nao' mas o programa não o guarda em lado nenhum. Por isso o 'Nao' não irá estar na variável Opcao, que é a que estás a testar no Until.

De qualquer maneira, essa pergunta não tem que estar dentro do IF. O programa tem de fazer a pergunta independentemente de estar a converter de libras para euros ou de eruros para libras.

Por isso, apresenta o valor que tens a apresentar dentro dos blocos do IF, e depois, já a seguir ao ultimo end; é que metes um writeln('Quer repetir'); e o readln(opcao);


"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

Aproveito para referir que, se escreveres "nao", o programa repetirá na mesma - na condição, para terminar, deve ser dada a instrução "Nao", ou seja, o N maiúsculo e o A e o O minúsculos.

Para que o programa considere TODAS as hipóteses de maiúsculas e minúsculas (Nao, nAo, NAo... ...), utiliza a função especial para Strings e Chars UpCase. Esta função converte toda a String em maiúsculas. Por exemplo, a frase "Ola, eu sou o thoga31." passa a ser "OLA, EU SOU O THOGA31".

repeat
      // código
      write('Deseja repetir? (Sim / Nao) ');
      readln(opcao);
until (UpCase(opcao) = 'NAO');

E é bom ver um entusiasta do Pascal. É sempre bom ver pessoal novo. :D

Cumps.


Knowledge is free! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
LagMaster

Obrigado pelas ajuda :)

Eu agora coloquei tudo como dito.. até fiz um belo copy paste disso do UpCase :D

MMas infelizmente nao deixa compilar pois diz que no local onde está write deveria estar until..

Program Conversão;
USES CRT;
CONST
EurosPorLibra=1.19875;
var
   opcao: String;
   euro,libra,Euros,Libras: Real;

BEGIN
repeat
writeln('Digite 1 para converter libras em euros ou 2 para converter euros em libras');
readln(opcao);
if opcao = '1' then begin
writeln('Escreva a quantia em Libras');
readln(Libras);
euro:= EurosPorLibra*Libras;
writeln(euro:3:2, '   Euros');
readln;
writeln('Quer repetir ?');
readln;
end
else begin
writeln('Escreva a quantia em Euros');
readln(Euros);
libra:=Euros/EurosPorLibra;
writeln (Libra:3:2, '       Libras');
readln;
writeln('Quer repetir ?');
readln;
end
write('Deseja repetir? (Sim / Nao) ');
      readln(opcao);
      until (UpCase(opcao) = 'NAO');

END.program Noname0;

Alguem tem ideia de qual é o erro ??

Cumpz

LagMaster :)


YOU SHALL NOT PASS !!!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nunopicado

Falta-te o ponto e virgula no end depois do else.

readln;
end; // <-- aqui, falta o ;
write('Deseja repetir? (Sim / Nao) ');
      readln(opcao);

Ainda tens de tirar as linhas seguintes de dentro do then e do else

readln;
writeln('Quer repetir ?');
readln;


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