我正在学习有关编程基础知识的互联网课程。制作图表后,我将其转换为代码,现在这是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');
答案 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
写入屏幕,然后等待输入。这有惹恼用户的倾向。