在Free Pascal中检查一个数字是否在范围内

4

我正在尝试找出将使用Free Pascal case语句的示例转换为简单if语句的正确方法。

使用case语句的代码如下:

begin usingCaseStatements;

var
  user_age : Integer;

begin

  Writeln('Please enter your age');
  Readln(user_age);

  case user_age of
  1..12 : Writeln('You are too young');
  else
    Writeln('Invalid input');
  end;

  Writeln('Please any key to terminate the program');
  Readln();
end.

-----使用if语句--------

begin usingCaseStatements;

var
  user_age : Integer;

begin

  Writeln('Please enter your age');
  Readln(user_age);

  if user_age in 1..12 then
    Writeln('You are too young')
  else
    Writeln('Invalid input');
  Writeln('Please any key to continue');
  Readln();
end.

我曾尝试将 if 语句片段中的“in”替换掉,但完全没有成功。有一次我尝试进行 if (user_age = 1..12) then,结果却只是给了我一个错误提示,编译器表示该语句正在等待 ')',但却发现 '..'。我对 FPC 十分陌生,因此非常需要帮助和提示。


2
使用 if (user_age in [1..12]) then - TLama
4个回答

7

IN测试的是集合,而不是范围。正如TLama已经评论过的那样,您可以使用[1..12]定义一个包含该范围的集合。

大多数PC Pascal只支持最多256个元素的集合大小,因此像josifoski建议的解决方案更为实用长期。


我还没有涉及到集合,我认为它们在我使用的教程中根本没有涵盖。我正在尝试寻找书籍替代方案,目前我已经找到了一本,尽管它可能已经过时了。我会记住这种方法的,谢谢Marco。 - Alex_adl04
搜索 Marco Cantu 的《Essential Pascal》,如果你还没有它的话。 - Marco van de Voort

3

如果 (user_age >=1) 并且 (user_age <=12),那么


我意识到我必须采取这样的措施,虽然我在寻找一种更优雅的选择,但我理解我不能期望像Python等其他语言那样具有相同的语法糖。谢谢josifoski。 - Alex_adl04
Math单元中定义的inRange函数是您可能会考虑的更优雅的解决方案之一:https://www.freepascal.org/docs-html/rtl/math/inrange.html - jwdietrich

2
这个语句 if user_age in 1..12 then 非常符合 Ada 语法。 Free Pascal 则比较接近:if user_age in [1..12] then 以下是一个简单可编译的例子:
Program inRange;

var
  int1 : integer = 45;

begin
  if int1 in [4..200] then
    writeln('int1 is between 4 and 200')
  else
    writeln('int1 is not between 4 and 200')
end.

输出:

Free Pascal Compiler version 3.2.2 [2021/05/15] for i386
Copyright (c) 1993-2021 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling scratch6.pas
Linking scratch6.exe
12 lines compiled, 0.1 sec, 28288 bytes code, 1332 bytes data

int1 is between 4 and 200

1

仅供娱乐。它可以在FPC 2.7.1上运行,但我不知道它是否能在稳定的2.6.4版本上运行。

program project1;

{$modeswitch typehelpers}

type
    TIntegerHelper = type helper for Integer
        function IsInRange(const ALow, AHigh: Integer): Boolean; inline;
    end;

    function TIntegerHelper.IsInRange(const ALow, AHigh: Integer): Boolean; inline;
    begin
        Result := (Self >= ALow) and (Self <= AHigh);
    end;
var
    i: Integer;

begin
    i := 8;
    Writeln(i.IsInRange(7, 9));
    Writeln(i.IsInRange(8, 8));
    Writeln(i.IsInRange(2, 3));
    Readln;
end.

输出:

TRUE
TRUE
FALSE

非常老旧但我喜欢它。 - user3051677

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接