Foros del Web » Programación para mayores de 30 ;) » Programación General »

Pascal, funciones y otras cosillas

Estas en el tema de Pascal, funciones y otras cosillas en el foro de Programación General en Foros del Web. Hola Os comento, para las practicas de la universidad me han mando que haga un programa que haga varios calculos introduciendo un radio y una ...
  #1 (permalink)  
Antiguo 25/04/2005, 12:38
 
Fecha de Ingreso: agosto-2003
Ubicación: Zaragoza
Mensajes: 25
Antigüedad: 20 años, 8 meses
Puntos: 0
Pascal, funciones y otras cosillas

Hola
Os comento, para las practicas de la universidad me han mando que haga un programa que haga varios calculos introduciendo un radio y una altura. Los calculos los realizo con funciones asi como dar valores al radio y la altura.
Os coloco el codigo para que lo veais:

program Calculos;
const
pi=3.1415926;
function cambiarRadio:real;
var
r:real;
begin
{$I-}
Repeat
writeln('');
writeln('Nuevo Radio');
readln(r);
UNtil (IOResult=0) and (r>0);
cambiarRadio:=r;
End;
function cambiarAltura:real;
var
al:real;
begin
{$I-}
Repeat
writeln('');
writeln('Nueva Altura');
readln(al);
Until (IOResult=0) and (al>0);
cambiarAltura:=al;
End;
function mensaje:integer;
var
n:integer;
Begin
{$I-}
Repeat
writeln('');
writeln('Elige la opcion');
writeln('1.Cambiar el radio considerado para los calculos');
writeln('2.Modificar el valor de la altura');
writeln('3.Calcular el perimetro de la circunferencia');
writeln('4.Calcular el area de la circulo');
writeln('5.Calcular el volumen de la esfera');
writeln('6.Calcular el volumen del cilindro');
writeln('7.Calcular todos los valores anteriores a la vez');
writeln('8.Salir del programa');
readln(n);
Until (IOResult=0) or (n<>0) or (n=1) or (n=2) or (n=3) or (n=4) or (n=5) or (n=6) or (n=7) or (n=8);
mensaje:=n;
End;
function perimetro(r:real):real;
var
pe : real;
begin
pe:= 2*pi*r;
perimetro:=pe;
end;
function area(r:real):real;
var
a : real;
begin
a:= pi*sqr(r);
area:=a;
end;
function vole(r:real):real;
var
voe : real;
begin
voe:= 4/3*pi*(r*r*r);
vole:=voe;
end;
function cili(r:real;al:real):real;
var
cil : real;
begin
cil:=(2*pi*r)*al;
cili:=cil;
end;
var

n :integer;
ra, al, per, ar, vo, ci: real;
Begin
Repeat
n:=mensaje;
Case n of
1: ra:=cambiarRadio;

2: al:=cambiarAltura;
3: begin

per:=perimetro(ra);
writeln('');
writeln('El perimetro es ',per:2:2);
writeln('');


end;
4: begin
ar:=area(ra);
writeln('');
writeln('El area es ',ar:2:2);
writeln('');
end;
5: begin
vo:=vole(ra);
writeln('');
writeln('El volumen es ',vo:2:2);
writeln('');
end;
6: begin
ci:=cili(ra,al);
writeln('');
writeln('El volumen es ',ci:2:2);
writeln('');
end;
7: begin
ra:=cambiarRadio;
al:=cambiarAltura;
writeln('');
per:=perimetro(ra);
writeln('El perimetro de la circunferencia es ',per:2:2);
ar:=area(ra);
writeln('El area del circulo es ',ar:2:2);
vo:=vole(ra);
writeln('El volumen de la esfera es ',vo:2:2);
ci:=cili(ra,al);
writeln('El volumen del cilindro es ',ci:2:2);
writeln('');
end;
End;
Until n=8;
End.

El problema viene con unos de los requisitos, se recalculara el valor solicitado en caso de haber cambiado el radio y/o la altura desde la ultima vez que se calculo. Eso es lo que me resulta complicado, he probado colocando una variable auxiliar, contadores pero no he conseguido nada

¿Me podeis ayudar?

Gracias
  #2 (permalink)  
Antiguo 25/04/2005, 13:32
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por Rikimaru
El problema viene con unos de los requisitos, se recalculara el valor solicitado en caso de haber cambiado el radio y/o la altura desde la ultima vez que se calculo. Eso es lo que me resulta complicado, he probado colocando una variable auxiliar, contadores pero no he conseguido nada
Explica eso de nuevo... O pon un ejemplo de las salidas, porque exactamente no se que se prentende.
  #3 (permalink)  
Antiguo 26/04/2005, 07:08
 
Fecha de Ingreso: agosto-2003
Ubicación: Zaragoza
Mensajes: 25
Antigüedad: 20 años, 8 meses
Puntos: 0
Te explico esto con un ejemplo:
Inicio el programa y selecciona la opcion 1. Me pide un valor para el radio entonces yo le introduzco 5. Vuelvo al menu y le selecciona la opcion 3, y me calcula el perimetro. Y ahora viene el tema, si vuelvo a escoger la opcion 3 y tiene el mismo radio, no debe calcular el perimetro debe sacar por pantalla el valor que tiene en memoria del perimetro.

Lo has entendido?
  #4 (permalink)  
Antiguo 26/04/2005, 08:36
 
Fecha de Ingreso: abril-2005
Ubicación: Buenos Aires, Argentina
Mensajes: 1
Antigüedad: 19 años
Puntos: 0
Una solución rápida pero no muy elegante sería que guardaras por cada función donde haces cálculos una variable booleana (podría llamarse algo como per_cambio, para el caso del calculo de perímetro) donde tendrías que asignarles true cuando pases por las funciones de cambio de altura y radio. De esta manera deberías chequear estas variables antes de realizar alguna operación. Si está en false solo muestras el valor guardado, sino recalculas y pones la booleana en false.

Espero haber ayudado un poco :)
  #5 (permalink)  
Antiguo 28/04/2005, 07:37
 
Fecha de Ingreso: agosto-2003
Ubicación: Zaragoza
Mensajes: 25
Antigüedad: 20 años, 8 meses
Puntos: 0
Finalmente entregue el programa, pero esta mal a causa de que utilce la sentencia goto:

program Calculos;
Label 1;
const
pi=3.1415926;
function cambiarRadio:real;
var
r:real;
begin
{$I-}
Repeat
writeln('');
writeln('Nuevo Radio');
readln(r);
Until (IOResult=0) and (r>0);
cambiarRadio:=r;
End;
function cambiarAltura:real;
var
al:real;
begin
{$I-}
Repeat
writeln('');
writeln('Nueva Altura');
readln(al);
Until (IOResult=0) and (al>0);
cambiarAltura:=al;
End;
function mensaje:integer;
var
n:integer;
Begin
{$I-}
Repeat
writeln('');
writeln('Elige la opcion');
writeln('1.Cambiar el radio considerado para los calculos');
writeln('2.Modificar el valor de la altura');
writeln('3.Calcular el perimetro de la circunferencia');
writeln('4.Calcular el area de la circulo');
writeln('5.Calcular el volumen de la esfera');
writeln('6.Calcular el volumen del cilindro');
writeln('7.Calcular todos los valores anteriores a la vez');
writeln('8.Salir del programa');
readln(n);
Until (IOResult=0) and (n=1) or (n=2) or (n=3) or (n=4) or (n=5) or (n=6) or (n=7) or (n=8);
{$I+}
mensaje:=n;
End;
function perimetro(r:real):real;
var
pe : real;
begin
pe:= 2*pi*r;
perimetro:=pe;
end;
function area(r:real):real;
var
a : real;
begin
a:= pi*r*r;
area:=a;
end;
function vole(r:real):real;
var
voe : real;
begin
voe:= 4/3*area(r)*r;
vole:=voe;
end;
function cili(r:real;al:real):real;
var
cil : real;
begin
cil:=area(r)*al;
cili:=cil;
end;

var
n :integer;
ra, al, per, ar, vo, ci, a1, a2, a3, a4, a5, l1, l2: real;

Begin

1:begin
n:=mensaje;
If n= 1 then
begin
ra:=cambiarRadio;
goto 1;
end;
If n=2 then
begin
al:=cambiarAltura;
goto 1;
end;
If n=3 then
begin
If (a1<>ra) then
begin
per:=perimetro(ra);
writeln('');
writeln('El perimetro es ',per:2:2);
writeln('');
a1:=ra;
goto 1;
end;
If a1=ra then
begin
writeln('');
writeln('El perimetro es ',per:2:2);
writeln('');
goto 1;
end;
end;
If n=4 then
begin
if a2<>ra then
begin
ar:=area(ra);
writeln('');
writeln('El area es ',ar:2:2);
writeln('');
a2:=ra;
goto 1;
end;
if a2=ra then
begin
writeln('');
writeln('El area es ',ar:2:2);
writeln('');
goto 1;
end;
end;
If n=5 then
begin
if a3<>ra then
begin
vo:=vole(ra);
writeln('');
writeln('El volumen es ',vo:2:2);
writeln('');
a3:=ra;
goto 1;
end;
If a3=ra then
begin
writeln('');
writeln('El volumen es ',vo:2:2);
writeln('');
goto 1;
end;
end;
If n=6 then
begin
if (a4<>ra) or (a1<>al) then
begin
ci:=cili(ra,al);
writeln('');
writeln('El volumen es ',ci:2:2);
writeln('');
a4:=ra;
l1:=al;
goto 1;
end;
If a4=ra then
begin
writeln('');
writeln('El volumen es ',ci:2:2);
writeln('');
end;
end;
If n=7 then
begin
ra:=cambiarRadio;
al:=cambiarAltura;
if ((a5<>ra) and (l2<>al)) or ((a5<>ra) and (l2=al)) then
begin
writeln('');
per:=perimetro(ra);
writeln('El perimetro de la circunferencia es ',per:2:2);
ar:=area(ra);
writeln('El area del circulo es ',ar:2:2);
vo:=vole(ra);
writeln('El volumen de la esfera es ',vo:2:2);
ci:=cili(ra,al);
writeln('El volumen del cilindro es ',ci:2:2);
writeln('');
a5:=ra;
l2:=al;
goto 1;
end;
IF (a5=ra) and (l2=al) then
begin
writeln('');
writeln('El perimetro de la circunferencia es ',per:2:2);
writeln('El area del circulo es ',ar:2:2);
writeln('El volumen de la esfera es ',vo:2:2);
writeln('El volumen del cilindro es ',ci:2:2);
writeln('');
goto 1;
end;
if (a5=ra) and (l2<>al) then
begin
writeln('');
writeln('El perimetro de la circunferencia es ',per:2:2);
writeln('El area del circulo es ',ar:2:2);
writeln('El volumen de la esfera es ',vo:2:2);
ci:=cili(ra,al);
writeln('El volumen del cilindro es ',ci:2:2);
writeln('');
goto 1;
end;
end;
end;
end.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:07.