如何在PASCAL中以正确的方式从程序中获取变量?

时间:2014-06-03 08:11:09

标签: pascal procedure

我正在学习有关编程基础知识的互联网课程。制作图表后,我将其转换为代码,现在这是PASCAL语言。 我在处理过程中遇到问题,无法找到答案,也无法在课程中找到答案,也无法使用某些google。 我希望从程序中获得可变的背面。现在我有一段工作代码,但我认为这不是一个好的工作方式。这是代码的摘录:

   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('prijs benzinewagen');

1 个答案:

答案 0 :(得分:1)

程序不会返回值,因此语法

prijsBW := OPHALEN('prijs benzinewagen');

无效。

如果要返回值,则需要定义function

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;

请注意,您使用的(坏)全局变量意味着您根本不必返回任何内容,因为过程可以直接访问和更改该全局变量(但您无法知道程序结束时):

procedure OPHALEN(para : string);
begin
  vari := 0;
  repeat
    writeln('geef de ', para , ' op');
    readln(vari);
  until (vari > 0);
end;

现代Pascal方言(例如Delphi和FreePascal)通过使用适当类型的自动声明的函数结果变量(名为Result)来为函数的返回值提供更清晰的语法(因为'它是什么 - 功能的结果):

function OPHALEN(para : string): Real;
begin
  Result := 0;
  repeat
    writeln('geef de ', para , ' op');
    readln(Result);
  until (Result > 0);
end;

如果您需要返回多个值,可以使用var参数,这些参数允许在函数内部进行更改。

procedure OPHALEN(para: string; var RetVal: Real);
begin
  RetVal := 0;
  repeat
    writeln('geef de ', para , ' op');
    readln(RetVal);
  until (RetVal > 0);
end;

您的原始代码(以及我上面提供的示例)都无法让用户取消,BTW。应该有一些方法来退出用户的循环;否则,你的代码只是无休止地循环,将para写入屏幕,然后等待输入。这有惹恼用户的倾向。