Jump to content

Problema na variável "Dinheiro"


TJFBarreto
 Share

Recommended Posts

Boas mais uma vez, ontem abri um tópico sobre uma ajuda de uma parte deste projecto que vou por, onde me foi esclarecido pelo nunopicado, mais um vez obrigado 😁

O Código está a correr,  quando faço o método de PayPal, ele retira-me o dinheiro que é como eu quero, mas quando faço com o PaySafeCard ele não retira o valor, fica exacto como estava e depois se fizer novamente ele começa adicionar o valor do PaySafe... não sei qual será o problema..

Aguardo respostas pois, isto está-me a dar a volta à cabeça pois não consigo achar o erro..

 Program MOD4;

var Escolha, Valor, Valor2, Carregar, Carregar2, EscolhaPay, Montante,  Entidade, Referencia, Dinheiro, NIB : integer;
    Nome, Nome2, Escolha2, Escolha3 : string;

Procedure Menu;

var EscolhaCerta: Boolean;
   
Begin
  	EscolhaCerta:=False;
  		repeat
  			clrscr;
		gotoxy(21,2);textcolor(yellow);writeln('----------------------------------------');
			gotoxy(21,3);textcolor(yellow);writeln('| Pagamentos/Transfêrencias via-online |');
			gotoxy(21,4);textcolor(yellow);writeln('----------------------------------------');
          	gotoxy(21,6);textcolor(green);writeln('Escolha o método que vai utilizar:');
  	     	gotoxy(21,9);textcolor(yellow);writeln('1 - PayPal');
  	     	gotoxy(21,10); writeln('2 - Cartao de Credito');
  	     	gotoxy(21,11); writeln('3 - PaySafeCard');
  	     	gotoxy(21,12); writeln('4 - Multibanco'); 
  	     	gotoxy(21,15);textcolor(red);writeln('5 - Sair ');
  	     	gotoxy(21,17);textcolor(white); write('Insira o numero do método que vai utilizar: ');
		readln(Escolha); 
		if (Escolha=1) or (Escolha=2) or (Escolha=3) or (Escolha=4) or (Escolha=5) then
  	EscolhaCerta:=true
  	     		else
  	     			begin
  	      				clrscr;
  	      				gotoxy(21,15);textcolor(red); writeln('Escolheu um método de pagamento não previsto na via-online.');
  	      				readln;
  	     			end
  		until EscolhaCerta=true;
End;

Function MostraDinheiro(a:integer;b:integer):integer;

  Begin

   MostraDinheiro:=a-b;

  End;

Procedure PayPal;
  Begin
    clrscr;
    textcolor(green); 
    write('Escreva o nome da sua conta PayPal: ');
    readln(Nome);
    
    clrscr;
    write(Nome,' digite o nome da conta para quem deseja efectuar a transferência: ');
    readln(Nome2);
                                                                                                                  
    clrscr;
    write('Quanto deseja transferir para a conta ',Nome2,': ');
    readln(Valor);
    
    Carregar:=0;

  			repeat
      			clrscr;
 			textcolor(11);writeln('A transferência está a ser processada ',carregar,'%');     			
	 		Carregar:=Carregar + random(10);
			delay(300)
   			until Carregar>100;
   			
    delay(1000);
    		
    clrscr;
    textcolor(green);
    write('Transferência concluida de ');
    textcolor(yellow);
    write(Valor);
    textcolor(green);
    write(' euros, ficou com ');
    textcolor(yellow);
    write(MostraDinheiro(Dinheiro,Valor));
    textcolor(green);
    write(' euros na sua conta. ');
    gotoxy(5,3);
    textcolor(yellow);
    writeln('Prime qualquer tecla para continuar...');
    readln; 
  End;
  
Function MostraDinheiro2(a:integer;b:integer):integer;

  Begin

   MostraDinheiro2:=a-b;

  End;
  
Procedure CartaoDeCredito;
Begin
     
     clrscr;
     textcolor(green);
     writeln('Escreva o NIB para quem deseja transferir: ');
     readln(NIB);

     
     clrscr;
     textcolor(green);
     write('Qual o montante que deseja transferir: ');
     readln(Valor2);
     clrscr;

     
     textcolor(green);
     write('Deseja confirmar a tranferência de ');
     textcolor(yellow);
     write(Valor2);
     textcolor(green);
     write(' euros para o NIB ');
     textcolor(yellow);
     write(NIB);
     textcolor(green);
     write(' ? | Sim/Nao |   ');
     readln(Escolha2);

     
     If (Escolha2='Sim') or (Escolha2='sim')
        then Begin
                  Carregar:=0;

                  repeat
                        clrscr;
                        textcolor(11);
                        writeln('A transferência está a ser processada ',carregar,'%');

                        Carregar:=Carregar + random(10);
                        delay(400)
                  until Carregar>100;

                  delay(1000);
                  
                  clrscr;
                  textcolor(green);
                  write('Transferência concluida de ');
                  textcolor(yellow);
		   write(Valor2);
		   textcolor(green);
		   write(' euros, ficou com ');
		   textcolor(yellow);
		   write(MostraDinheiro2(Dinheiro,Valor2));
		   textcolor(green);
		   write(' euros na sua conta. ');
                  readln;
                  
              end  
        else begin
             clrscr;  
                  textcolor(red);
                  writeln('A OPERAÇÂO FOI CANCELADA!!!');
                  readln;
             End;
End;

Function MostraDinheiroPay10(a:integer):integer;

  Begin

   MostraDinheiroPay10:=a-10;

  End;
  
  Function MostraDinheiroPay25(a:integer):integer;

  Begin

  MostraDinheiroPay25:=a-25;

  End;
  
  Function MostraDinheiroPay50(a:integer):integer;

  Begin

   MostraDinheiroPay50:=a-50;

  End;
  
  Function MostraDinheiroPay100(a:integer):integer;

  Begin

  MostraDinheiroPay100:=a-100;

  End;
  
Procedure PaySafeCard;                   
Begin
   repeat
	clrscr;
	gotoxy(21,3);textcolor(green); writeln('Escolha a opção de valor que vai utilizar:');
	gotoxy(21,6);textcolor(yellow);writeln('1 - 10 Euros');
	gotoxy(21,7);writeln('2 - 25 Euros');
  	gotoxy(21,8);writeln('3 - 50 Euros');
  	gotoxy(21,9);writeln('4 - 100 Euros');
  	writeln('');
  	gotoxy(21,11);textcolor(white);write('Escolha o numero da opção: ');
readln(EscolhaPay);

   textcolor(white);
   gotoxy(15,5);
   
   Until (EscolhaPay>0) and (EscolhaPay<5);
   
   clrscr;
   case EscolhaPay of 
    	1:writeln('O seu código: H245-HJYL-87G9-HTT0, ficou com ',MostraDinheiroPay10(Dinheiro));
    	2:writeln('O seu código: 8HJ2-I2A8-0194-21QW, ficou com ',MostraDinheiroPay25(Dinheiro));
    	3:writeln('O seu código: QWER-TY12-00XL-PLO3, ficou com ',MostraDinheiroPay50(Dinheiro));
    	4:writeln('O seu código: HJ1S-S20A-I7EQ-QS58, ficou com ',MostraDinheiroPay100(Dinheiro));
    	
   end;

   gotoxy(5,3);textcolor(yellow);writeln('Prime qualquer tecla para continuar...');
   readln; 
   
End;

  Function MostraDinheiro3(a:integer;b:integer):integer;

  Begin

   MostraDinheiro3:=a-b;

  End;

Procedure Multibanco;
Begin

     clrscr;
     textcolor(green);
     writeln('Digite a Entidade: ');
     readln(Entidade);


writeln('');
     textcolor(green);
     writeln('Digite a Referência: ');
     readln(Referencia);
    
     writeln('');
     textcolor(green);
     writeln('Qual o montante: ');
     readln(Montante);
     
     clrscr;
     textcolor(green);
     write('Deseja confirmar a tranferência com a entidade: ');
     textcolor(yellow);
     write(Entidade);
     textcolor(green);
     write(' Referência: ');
     textcolor(yellow);
     write(Referencia);
     textcolor(green);
     write(' com o valor de: ');
     textcolor(yellow);
     write(Montante);
     textcolor(green);
     write(' ? | Sim/Nao |   ');
     readln(Escolha3);

     
     If (Escolha3='Sim') or (Escolha3='sim')
        then Begin
                  Carregar:=0;

                  repeat
                        clrscr;
                        textcolor(11);
                        writeln('A transferência está a ser processada ',carregar,'%');

                        Carregar:=Carregar + random(10);
                        delay(400)
                  until Carregar>100;

                  delay(1000);

     clrscr;
                  textcolor(green);
                  write('Transferência concluida de ');
                  textcolor(yellow);
		   write(Montante);
		   textcolor(green);
		   write(' euros, ficou com ');
		   textcolor(yellow);
		   write(MostraDinheiro3(Dinheiro,Montante));
		   textcolor(green);
		   write(' euros na sua conta. ');
                  
                  gotoxy(5,3);textcolor(yellow);writeln('Prime qualquer tecla para continuar...');
   			   readln; 
                  
          end
          else
          begin
          
          clrscr;  
                  textcolor(red);
                  writeln('A OPERAÇÂO FOI CANCELADA!!!');
                  readln;
             End;
End;
     

Procedure Escolhas;
Begin

	Case Escolha of

	1:PayPal;
	2:CartaoDeCredito;
	3:PaySafeCard;
	4:Multibanco;
	{
	5:Sair;}

	end;
end;

Begin
Dinheiro:=300;
	Repeat
  		Menu;
  		Escolhas;
	until Escolha=5;
End.
Link to comment
Share on other sites

Bem, com tantas funções para fazer basicamente a mesma coisa, parece-me que de espantar seria se trabalhasse bem!  :dontgetit:

Conta lá qual é a ideia do programa:

Tens uma conta inicial com 300€. Depois tens vários métodos de pagamento.

1. Todos esses métodos vão abater nos 300€?

2. A conta é contínua? (se tirares 70 por paypal e a seguir 30 por cartão de crédito, a ideia é ficarem 200, ou é independente por método?)

Vou aqui dar uma olhada a isto, mas convinha que explicasses isto melhor, porque se a ideia for fazer correctamente o programa, tens aqui muita coisa para alterar...  😁

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

Link to comment
Share on other sites

A ideia é fazer um programa tipo Pagamentos e Serviços, onde escolhias vários métodos, e todos esses estavam ligados à variável do dinheiro, que só tem a opção de extrair.., por exemplo escolhia PayPal e pagava 50€ era suposto ficar com 250€, mas depois quando vou ao PaySafeCard ou outro ele não me retira o dinheiro e se voltar a fazer no mesmo método ele adiciona o valor que era suposto retirar...

1. Sim todos os métodos estão interligados com a variável "Dinheiro", pois só faço pagamentos menos que isso.. para ver se dá certo.

2. Pois, ai é onde eu quero chegar, é para ser usada em todos os métodos..

Isto é um exercício, onde é para ser avaliado as Funções e Procedimentos, por isso as tal tantas funções para fazer a mesma coisa  :bored:

Link to comment
Share on other sites

Isto é um exercício, onde é para ser avaliado as Funções e Procedimentos, por isso as tal tantas funções para fazer a mesma coisa  :bored:

Na minha ideia, avaliar um aluno em funções e procedimentos é verificar se ele consegue fazer funções e procedimentos que resolvam os problemas do programa... Não adicionar mais problemas repetindo código (até porque as funções e procedimentos existem exactamente para não ter de repetir código). Ter duas funções repetidas não é sinal que o aluno consiga fazer duas funções. É sinal que ele sabe fazer Copy-Paste.

Vê se percebeste bem a ideia do teu professor, ou se é mesmo ele que não percebe nada de programação.    :dontgetit: 😁

À parte disso, e não tendo ainda visto tudo, estás em alguns locais a usar as funções para mostrar o resultado, mas não estás efectivamente a alterar o valor da variável dinheiro.

Quanto ao que te queixas em concreto, de ele não subtrair à primeira vez e nas seguintes ainda aumentar, aqui não está a fazer. E nem poderia:

.
.
.
case EscolhaPay of
      1:
        writeln('O seu código: H245-HJYL-87G9-HTT0, ficou com ',
          MostraDinheiroPay10(Dinheiro));
      2:
        writeln('O seu código: 8HJ2-I2A8-0194-21QW, ficou com ',
          MostraDinheiroPay25(Dinheiro));
      3:
        writeln('O seu código: QWER-TY12-00XL-PLO3, ficou com ',
          MostraDinheiroPay50(Dinheiro));
      4:
        writeln('O seu código: HJ1S-S20A-I7EQ-QS58, ficou com ',
          MostraDinheiroPay100(Dinheiro));

    end;
.
.
.

Tu não estás a atribuir o resultado das várias funções MostraDinheiroPayXXX a lado nenhum. Só estás a mandar para o ecrã.

Para isto funcionar, tens de ter a variavel dinheiro com um valor inicial, e depois, a cada operação, tens de pensar em duas coisas:

1. Antes da efectivar a operação, verificar se tem dinheiro que chegue

2. Depois de efectivar a operação, substrair à variável dinheiro o valor da transferencia

Só no fim é que mostras o resultado, e basicamente o que tens de mostrar é o valor que está em "Dinheiro"

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

Link to comment
Share on other sites

Não, porque isso continuava a não abater na variavel dinheiro.

Teria de ficar assim:

   case EscolhaPay of
      1: Begin
        Dinheiro:=MostraDinheiroPay10(Dinheiro);
        writeln('O seu código: H245-HJYL-87G9-HTT0, ficou com ',Dinheiro); 
           End;   
      2:

Assim, na proxima operação, a variável dinheiro já não terá 300, mas sim 290, e a operação será feita com base nisso...

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

Link to comment
Share on other sites

De facto, para quê tanta função? ?

Basta isto que se segue...

function MostraDinheiro(inicial, retirar : integer) : integer;
begin
     MostraDinheiro := inicial - retirar;
end;

E isto só mostra a diferença, não altera o valor em qualquer variável global. É esta a intenção?

Knowledge is free!

Link to comment
Share on other sites

Não. Aparentemente a ideia é abater o valor global.  😁

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

Link to comment
Share on other sites

E, olha lá, oh @TJFBarreto, trata de melhorar a indentação. Já te dissemos isto vezes sem conta, e não atinas com isso de uma vez! Não consigo ver esse código, e nem me vou esforçar a isso. Para isso é que existe indentação e os IDEs até têm ferramentas de suporte à aplicação dessa mesma indentação, como tabulações inteligentes...

E se a ideia é abater, então a função deve abater na variável global e depois fazer MostrarResultado := VariavelGlobal

Knowledge is free!

Link to comment
Share on other sites

Eu ainda só pôs 4 tópicos de perguntas em relações a códigos, e só o Nuno é que me disse isso de tratar melhor a indentação hoje, estou a ser ensinado com o compilador "Pascalzim" pois o mesmo não tem essas tal ferramentas... ninguém nasce a saber tudo e vamos melhorado com o tempo, e com prática de outros que já tem experiência na "matéria"

😁

Link to comment
Share on other sites

O teu professor tem mesmo um problema qualquer...

PascalZIM? Se não houvesse outro ainda compreendia. Mas com o excelente freepascal, gratuito e tudo, usar o pascalzim é coisa que não encaixa com quem quer realmente ensinar!

Ah, e já agora, o PascalZIM não é um compilador. É um interpretador, com qualidade abaixo (quanto a mim) dos compiladores de pascal originais dos anos 70.

😁

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

Link to comment
Share on other sites

(...) e o melhor para agora para aprender o básico é o Pascalzim...

O mal é mesmo achar isto... Mas ainda ninguém me deu um único motivo que validasse esta ideia.

O PZim é além de mais um engano, e um dos motivos de haver tanta gente a pensar que Pascal é uma linguagem limitada.

É que ainda não houve professor nenhum que ensinasse em PZim e dissesse: eh pá, vamos aprender neste por este ou aquele motivo, mas isto é fraco como o diabo, e há bem melhor.

E não dizem isto porque não teriam como justificar então o porque de usar isto.

Nunca é boa política trabalhar, seja no que for, com a ferramenta errada.

Nem o trabalho sai bem, nem se aprende a trabalhar como deve ser.

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

Link to comment
Share on other sites

Eu ainda só pôs 4 tópicos de perguntas em relações a códigos, e só o Nuno é que me disse isso de tratar melhor a indentação hoje, estou a ser ensinado com o compilador "Pascalzim" pois o mesmo não tem essas tal ferramentas... ninguém nasce a saber tudo e vamos melhorado com o tempo, e com prática de outros que já tem experiência na "matéria"

Desculpa. Isto já são tantos a aparecer aqui sem indentar nada que vos confundo. 🙂

Mas já sabes, começa a indentar bem o teu código.

E não utilizes mais o PascalZIM. Mal por mal utiliza o Dev-Pascal, e mesmo bem é utilizares o Free Pascal.

Pois, nisso também tens razão, mas estamos no primeiro ano e como tal, e o melhor para agora para aprender o básico é o Pascalzim...

De pequenino é que se torce o pepino, já diz o ditado popular.

Ou seja, a começar, começa-se bem. Se não habituaste de tal modo ao mau que nunca mais fazes bem. Vara nascida torta nunca se endireita.

E só uma cena, o PascalZIM não é o básico, é uma valente porcaria que nem aos calcanhares do Dev-Pascal chega, e é porque o Dev-Pascal já é velho e desactualizado!...

Em suma, um conselho de bom amigo: Free Pascal nesse PC e toca a programar lá. Sim? 😉

Quanto ao problema que tinhas no início deste tópico, como estão a evoluir as coisas?

Knowledge is free!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

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