首页 > 解决方案 > 我的程序在 for 和 if 之间来回跳动,我不知道为什么

问题描述

我正在做一些功课,有一个问题,我必须编写一个程序来告诉我用户给出的两个数字之间有多少质数。出于某种原因,当我用 F8 测试程序时,我可以看到程序在“for”和“if”之间来回跳动,没有明显的原因。是的,我必须使用这种语言。

我尝试过重新安装 IDE,希望它只是一些错误(就像它经常发生在 Android Studio 上一样)。我不知道还能尝试什么,这是我第一次使用 Lazarus 和 PASCAL。

program PrimoEntre;
var
  a, b, i, q: Integer;
begin
  write('Ingrese el primer valor: ');
  readln(a);
  write('Ingrese el segundo valor: ');
  readln(b);

  for i:=a to b do  //It starts bouncing back and forth from here...
      begin
        q:=2;
        if((b>=2)AND(b<=10)) then //...to here.
                            begin
                              while((q>=2) and (q<=b)) do
                              begin
                                if(a<>b) then
                                        begin
                                           if((a MOD b)=0) then
                                           begin;
                                            //i ES NO PRIMO
                                            if(q=b) then
                                                   begin
                                                        writeln('No existen numeros primos entre ', a, ' y ', b, '.');
                                                   end;
                                          q:=(q+1);
                                           end;

                                        end
                                else
                                           begin
                                            if(q=b) then
                                              begin
                                              //i ES PRIMO
                                              writeln(i, ' es primo.');;
                                              q:=1
                                              end;
                                            end;
                              end;
                            end

        else
                            begin
                              while((q>=2) and (b<=10)) do
                              begin
                                if(a<>b) then
                                        begin
                                           if((a MOD b)=0) then
                                           begin
                                            //i ES NO PRIMO
                                            if(q=b) then
                                                   begin
                                                        writeln('No existen numeros primos entre ', a, ' y ', b, '.');
                                                   end;
                                          q:=(q+1);
                                           end;
                                        end
                                else
                                           begin
                                            if(q=b) then
                                              begin
                                              //i ES PRIMO
                                              writeln(i, ' es primo.');
                                              q:=1
                                              end
                                           end;
                              end;
                            end;
      end;
readln();
end.

我希望输出是以下之一:
- 控制台在每次找到 a 和 b 之间的素数时写入。
- 控制台说 a 和 b 之间没有任何素数。

相反,没有结果。该程序卡住了,我必须手动终止它。

标签: pascallazarusfreepascal

解决方案


你说你试图在 a...b 范围内找到素数。问题是您正在以一种非常不必要的复杂方式执行此操作,而您的程序到处跳转的主要原因是您正在这样做,因为您正在使q变量的值到处跳转。

我认为你应该做的事情是放慢速度,想想你想要做什么:

  • 您想将范围内的整数迭代ab. 您的for循环做得很好,其价值i在于您正在测试素数。我将把它称为你的外for循环。

  • 你出错的地方是不必要地执行一个while循环来测试素数。

  • 一旦确定了要测试的i值,您要做的就是测试是否存在i除 1 或 之外的任何因子i。为此,您可以使用一个简单的内部for循环,该循环迭代一个值j(所谓的以避免与您的混淆q)来使用测试确定是否可被零余数i整除:如果是,则继续没有意义内部,循环。jmodj

  • 接下来要考虑的是循环的上限应该是多少for j := ... to ...j考虑大于平方根的值是没有意义的,i因为很明显,如果i有一个大于它的整数因子,它也必须有一个更低的值。

  • 如果j循环在没有找到因子的情况下完成,i则为素数。

尝试编写内部j循环,您将看到结果比现有代码简单得多(并且更可预测),并且编码错误的机会非常少,而且调试起来也非常简单,因为执行只是“失败”通过它的每个值i

顺便说一句,我完全同意@TomBrunberg 将结构化编码作为一个一般命题,但我认为for你在这里需要的两个嵌套循环并不需要分成不同的过程/函数,尽管你可以尝试一下,一旦你得到了代码正常工作。


推荐阅读