如何在PASCAL中以正确的方式从过程中获取变量?
我正在学习一门关于编程基础的网络课程。在做了一个图表之后,我把它转换成代码,现在这是PASCAL语言。 我在程序上遇到了问题,找不到答案,在课程中也找不到,在谷歌上也找不到答案。 我想从一个过程中得到一个变量。现在我有一个工作代码,但我认为这不是一个好的工作方式。下面是代码的摘录:如何在PASCAL中以正确的方式从过程中获取变量?,pascal,procedure,Pascal,Procedure,我正在学习一门关于编程基础的网络课程。在做了一个图表之后,我把它转换成代码,现在这是PASCAL语言。 我在程序上遇到了问题,找不到答案,在课程中也找不到,在谷歌上也找不到答案。 我想从一个过程中得到一个变量。现在我有一个工作代码,但我认为这不是一个好的工作方式。下面是代码的摘录: program WELKEWAGEN; // declare your variables here var T, N, KM, vari, prijsDW, prijsBW, jrenGEBR,
program WELKEWAGEN;
// declare your variables here
var T, N, KM, vari, prijsDW, prijsBW, jrenGEBR, taksDW, taksBW, prijsB, verbrBW, prijsD, verbrDW : real;
procedure OPHALEN(para : string);
begin
repeat
writeln('geef de ', para , ' op');
readln(vari);
until (vari > 0);
end;
begin
//this is the main program but there is more code ofcourse
OPHALEN('prijs benzinewagen');
prijsBW := vari;
//...
end.
现在网络课程说我应该这样编程:
begin
//...
prijsBW := OPHALEN('prijs benzinewagen');
//...
end.
但这是行不通的。
我发现以下错误:
WELKEWAGEN.pas(24,14) Error: Incompatible types: got "untyped" expected "Real"
WELKEWAGEN.pas(50) Fatal: There were 1 errors compiling module, stopping
pas(24,14)
这一行:prijsBW:=OPHALEN('prijsbenzinewagen')代码>过程不返回值,因此语法
prijsBW := OPHALEN('prijs benzinewagen');
这是无效的
如果要返回值,则需要定义一个函数
:
function OPHALEN(para : string): Real;
var
Res: Real;
begin
Res := 0;
repeat
writeln('geef de ', para , ' op');
readln(Res);
until (Res > 0);
OPHALEN := Res;
end;
请注意,您使用的(坏)全局变量意味着您根本不必返回任何内容,因为过程可以直接访问和更改该全局变量(但您无法知道过程何时完成):
现代Pascal方言(如Delphi和FreePascal)允许使用适合您的自动声明函数结果变量(名为result
)为函数返回值提供更清晰的语法(因为这就是函数的结果):
如果需要返回多个值,可以使用var
参数,允许在函数内部更改这些参数
procedure OPHALEN(para: string; var RetVal: Real);
begin
RetVal := 0;
repeat
writeln('geef de ', para , ' op');
readln(RetVal);
until (RetVal > 0);
end;
您的原始代码(以及我上面提供的示例)都无法允许用户取消,顺便说一句,应该有一些方法可以让用户退出循环;否则,您的代码就会无休止地循环,将para
写入屏幕,然后等待输入。这会让用户感到烦恼 如果要获取返回值,必须定义函数
,而不是过程
。若要从函数返回值,请指定函数名。看见
function OPHALEN(para : string): Real;
begin
Result := 0;
repeat
writeln('geef de ', para , ' op');
readln(Result);
until (Result > 0);
end;
procedure OPHALEN(para: string; var RetVal: Real);
begin
RetVal := 0;
repeat
writeln('geef de ', para , ' op');
readln(RetVal);
until (RetVal > 0);
end;