我用了很多“如果”,我想知道我是否可以用“case”代替一些

I have used so many "if" and I would like to know if I can substitute some by "case"

提问人:Ya1000 提问时间:8/24/2023 最后编辑:Karl KnechtelYa1000 更新时间:8/31/2023 访问量:103

问:

我有这个代码:

program Coordenadas;
var
    x,z : integer;
begin
  writeln('Ingresa la coordenada en X.');
  readln(x);
  writeln('Ingresa la coordenada en Z.');
  readln(z);
  if (x=0) and (z=0) then 
    writeLn('La coordenada 0 0 es el centro del mundo.')
  else if abs(x)=abs(z) then
    if x>0 then 
      if z>0 then 
        writeln(x,' ', z,' se ubica en el Sureste') 
      else 
        writeln(x,' ', z,' se ubica en el Noreste')
    else if z>0 then 
      writeln(x,' ', z,' se ubica en el Suroeste') 
    else 
      writeln(x,' ', z,' se ubica en el Noroeste')
  else if abs(x)>abs(z) then
    if x>0 then 
      writeln(x,' ', z, ' se ubica en el Este.')
    else 
      writeln(x,' ', z, ' se ubica en el Oeste.')
    else if z>0 then 
      writeln(x,' ', z, ' se ubica en el Sur.')
    else 
      writeln(x,' ', z, ' se ubica en el Norte.')
end.

这似乎太重复了。我可以缩短它吗,也许通过使用?case

弗里帕斯卡

评论

0赞 linuxfan says Reinstate Monica 8/24/2023
您不能使用“case of”,因为与固定整数值相比,它适用于整数。您可以使用一些开始/结束来简化这个复杂的测试,但这就是您所能做的,测试的结构非常单一。
0赞 Marco van de Voort 8/24/2023
有时你可以用 sign(x)+factor*sign(z) 之类的东西线性化所有可能性,但这里有多个检查同时使用 abs() 和 not ,所以这将是困难的。
0赞 Karl Knechtel 8/26/2023
这回答了你的问题吗?如何将多个语句用于一个案例语句?

答:

0赞 Kai Burghardt 8/24/2023 #1

[...]我想知道如何用“案例”缩短它 [...]

Pascal – 根据 ISO 标准 7185 “Standard Pascal” 和 10206 “Extended Pascal” 的定义 – 具有数据类型 。 值是 范围内的整数值。 因此integerinteger−maxInt‥+maxInt

case myIntegerExpression of
    −maxInt‥+maxInt:
        writeLn('Ya1k');
end;

始终打印,而不管 的具体值如何(假设它被定义)。 在您的例子中,您可以编写多个不重叠的 -label,以匹配非正值和 。Ya1kmyIntegerExpressioncase−maxInt‥0integer1‥maxInt

但是,这不一定会减少代码的长度,但可能会变得更可读。 请记住,是为人类编写代码的。 人类应该能够阅读和理解您的代码。 这是一个很小的、(几乎)可以忽略不计的问题,一台机器,一台计算机,也需要能够处理你的代码。


[...]我测试了它并且已经工作了,但我觉得它太重复了。[...]

一般来说,您使用例程来执行重复性任务。 在您的特定情况下,您不使用(最终没有)是很了不起的。 您可以打印一个通用前缀,并用 写出最后一个单词。writeLnwritewriteLn


writeln('Ingresa la coordenada en X.');
readln(x);
writeln('Ingresa la coordenada en Z.');
readln(z);

read/readLn接受多个变量。 您可以将两个提示合并为一个提示。 建议您的提示消息告诉用户所有详细信息。 特别是,您的提示应强调只有值(无值)是有效的,因为离散坐标系不太常见(= 预期值较低)。 同样,人类编写程序。integerreal


用 Pascal 代替写作

if (x=0) and (z=0) then

它(顺便说一句,更简洁,)更习惯地写

if [x, z] = [0] then

至少数学家经常使用集合。 (但请记住,Pascal 仅支持具有序数基类型的集合。

1赞 Chris 8/31/2023 #2

您的计划有九个不同的结果。在不跳过换行符的情况下,只有如此简洁,您才能做到。冒着实际增加重复的风险,您可以减少缩进,这可能使遵循程序的逻辑变得更加容易。

if A then
  if B then
    V
  else
    W
else if C then
  if D then
    X
  else
    Y
else
  Z

等同于:

if A and B then
  V
else if A then
  W
else if C and D then
  X
else if C then
  Y
else
  Z