[ Foro de Pascal ]

Novato, ayuda. Programa sencillo

10-Sep-2008 11:47
Glass Ramiro
7 Respuestas

Hola,
Ante todo Gracias Anticipadas. No logro conseguir que funcione esta aplicacion. Concretamente no realiza una sencilla operacion de Resta. Me he pasado todo el dia y no encuentro el error. Es como si el procedimiento Test_Operacion no procesara el procedimiento Nuevo_Saldo. Lenguaje de programacion Pascal. Utilizo Free Pascal IDE. Un saludo. Gracias Nacho Cabanes por tu generosidad.
Codigo:

program CuentaBanco;
uses crt;

var

SaldoActual, ImporteCheque : Real;
Mensaje : string;

procedure Introducir(var Saldo : real; Importe : real);
begin
Write ('Introduce el Saldo actual de la cuenta: ');
Readln (Saldo);
Write ('Introduce Importe del Cheque: ');
Readln (Importe);
end;

procedure Fondos_Insuficientes(var Mensaje : string);
begin
Mensaje := 'Fondos Insuficientes'
end;

procedure Nuevo_Saldo(var Saldo : real; Importe : real; Mensaje : string);
begin
Mensaje := 'Cantidad descontada en cuenta';
Saldo := Saldo - Importe
end;

procedure Test_Operacion(var Saldo : real; Importe : real; Mensaje : string);
begin

if Importe < Saldo Then
Nuevo_Saldo(Saldo, Importe, Mensaje)
else
Fondos_Insuficientes(Mensaje)
end;

procedure Visualizar(var Saldo : real; Mensaje : string);
begin
Write ('Saldo actual = ',Saldo:4:2,' ',Mensaje);
end;

BEGIN (* programa principal *)
ClrScr;
Introducir(SaldoActual, ImporteCheque);
Test_Operacion(SaldoActual, ImporteCheque, Mensaje);
Visualizar(SaldoActual, Mensaje);
Writeln;
Readln

END.
10-Sep-2008 14:48
MyName1 MySurname1

Muy buenas,

El programa está muy bien. Pero no te funciona por un simple detalle.

En la cabecera de introducir del procedimiento introducir:

procedure Introducir(var Saldo : real; Importe : real);

No estás pasando la variable Importe por referencia, ésto es con el VAR delante, por tanto al terminar de ejecutar el procedimiento, el valor original de Importe no se ha modificado. La razón de por qué no reste nada es que Pascal inicializa las variables numéricas NO inicializadas, a 0. Al no modificarse, Resta 0. Eso te pasa.

Saludos, espero haberte servido de gran ayuda.

David.

10-Sep-2008 15:02
alfredo mercado

mira solo tenes que ver eso de pasar los valores por referencia en los parametros de los procedimientos,cuando queres que los combios hechos en tus procedimientos repercutan en el programa principal solo le tenes que agregar la palabra var antes de tus parametros.aca va tu programa modificado.espero te sea de ayuda!

program CuentaBanco;

uses crt;

 

var

 

SaldoActual, ImporteCheque : Real;

Mensaje : string;

 

procedure Introducir(var Saldo : real;var Importe : real);

begin

Write ('Introduce el Saldo actual de la cuenta: ');

Readln (Saldo);

Write ('Introduce Importe del Cheque: ');

Readln (Importe);

end;

procedure Fondos_Insuficientes(var Mensaje : string);

begin

Mensaje := 'Fondos Insuficientes'

end;

procedure Nuevo_Saldo(var Saldo : real; var Importe : real;var Mensaje : string);

begin

Mensaje := 'Cantidad descontada en cuenta';

Saldo := Saldo - Importe

end;

procedure Test_Operacion(var Saldo : real; Importe : real; var Mensaje : string);

begin

if Importe < Saldo Then

Nuevo_Saldo(Saldo, Importe, Mensaje)

else

Fondos_Insuficientes(Mensaje)

end;

 

procedure Visualizar(var Saldo : real; Mensaje : string);

begin

Write ('Saldo actual = ',Saldo:4:2,' ',Mensaje);

end;

 

BEGIN (* programa principal *)

ClrScr;

Introducir(SaldoActual, ImporteCheque);

Test_Operacion(SaldoActual, ImporteCheque, Mensaje);

Visualizar(SaldoActual, Mensaje);

Writeln;

Readln

 

END.

 

 


10-Sep-2008 15:14
Glass Ramiro

Solucionado. Gracias David.
10-Sep-2008 15:15
Glass Ramiro

Muy agradecido. Un saludo. Gracias Alfredo.
10-Sep-2008 15:35
MyName1 MySurname1

No hay de qué. Para eso estamos sonrisa
11-Sep-2008 01:18
Nacho Cabanes (+83)

Por mi parte, nada que objetar a las respuestas que te han dado, las veo perfectas.

Eso sí, en tu planteamiento sí corregiría una cosa: un procedimiento como este que se limita a modificar un valor y devolverlo:

procedure Fondos_Insuficientes(var Mensaje : string);
begin
Mensaje := 'Fondos Insuficientes'
end;

suena "mal". Conceptualmente parece más razonable considerar que si devuelve un valor, se trata de una función:

function Fondos_Insuficientes: string

y entonces no llamarías con

Fondos_Insuficientes(texto);

sino con

texto := Fondos_Insuficientes;

¿No te suena "más natural"? Debería serlo incluso a la vista: lo segundo se podría leer "el texto es el de fondos-insuficientes" mientras que tu planteamiento habría que leerlo con algo como "fondos-insuficienteame este texto". Raro, raro, raro... ;-)

(Sólo como detalle para mejorar la legibilidad, nada grave).






11-Sep-2008 15:00
Glass Ramiro

De acuerdo. Gracias






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)