我程序中的while循环有多个ifs,但从未到达底部的ifs?

时间:2016-11-30 20:26:26

标签: python if-statement while-loop

我正处于一个非常难以掌握的学校任务中​​。我已经尝试了几天,我想我终于差不多完成了,但是......我再次陷入困境,不知道为什么。

我应该让用户填写一个号码发件人(荷兰语)/输入。该数字应该小于或等于50.这个数字决定了用户可以做多少输入 - 这些新输入是测试用例。 每个测试用例应该是一个大于0的数字,但是等于或低于100.不需要非常深入地处理错误的输入,所以我只使用一些基本处理。

然后需要针对每个测试用例进行测试的是,最小数字是可被测试用例整除的数字,但是该最小数字的单独数字的总和应该等于您的测试用例本身。因此在示例中他们声明:input = 1,(这意味着1个测试用例,但他们没有说明),输入2 = 10(这意味着你唯一的测试用例是数字10,但他们没有说明)。它发出的数字是190(这是因为190/10 = 19,所以这是一个正确的结果,但是1 + 9 + 0 = 10,所以它通过了第二次测试,但是再次,他们没有说明。我不得不自己解决这个问题,这就是为什么这个分配花了我很长时间......这个问题本身就是荷兰语,几乎没有给你任何信息。

那么我的程序要测试的是,如果我输入数字25作为测试用例,例如25/25 = 1,那么有效且2 + 5 = 7.但是,在计算这个数字7之后,它似乎永远不会检查第二个条件。数字的总和需要为25,而不是7.程序现在被抛入无限循环,我看不出有什么问题。

我将在下面发布我的代码。我为变量名称和印刷文本道歉,因为它们是荷兰语。我希望我能够清楚地解释这一切的含义。

let retryAction = UIAlertAction(title: returnTitle(), style: UIAlertActionStyle.Default) { action in
switch action.title {
        case "OK":
        okFunc()
        case "cancel":
        cancelFunc()
        default:
        defaultFunc()
        }
      }

我希望你们能帮助我。非常感谢您提前一段时间,我知道这完全是文本之墙。

3 个答案:

答案 0 :(得分:1)

while doorgaan == True:
getal = testgevallen[t] * vermenigvuldiging

if testgevallen[t] % getal == 0:
    print(getal, ' - Dit getal is deelbaar door ', testgevallen[t])

    som = sum(map(int, str(getal)))
    print(som)

    if som == testgevallen[t]:
        print('Output moet zijn: ', som)
        doorgaan = False

    else:
        doorgaan = True

else:
    doorgaan = True
    vermenigvuldiging += 1

在此while循环t永远不会被修改,因此som == testgevallen[t]将是常量,从而导致无限循环。

答案 1 :(得分:1)

手头有很多问题:

在第二次测试的内循环中(如果数字的总和匹配),否则你忘记增加vermenigvuldiging,所以当它"找到"第一个满足模数条件的getal,它将永远循环。

模数测试中getal的处理也被破坏,仅在vermenigvuldiging为1时匹配,否则testgevallen[t] % getal将始终等于testgevallen[t],因为getal }更大。这也将导致无限循环。实际上整个

getal = testgevallen[t] * vermenigvuldiging

似乎意味着以递增的顺序快速迭代testgevallen[t]可被for tv in testgevallen: print('Opgegeven nummer ', t + 1, ' is ', tv) vermenigvuldiging = 1 while True: getal = tv * vermenigvuldiging # I've no idea what this says, but probably something along the lines # of "is divisible by" and can be removed. Do print `getal` though # when `som` is a match. print(getal, ' - Dit getal is deelbaar door ', tv) som = sum(map(int, str(getal))) print(som) if som == tv: print('Output moet zijn: ', som) break # This is going to take a loooooong time for tv == 100 vermenigvuldiging += 1 整除的数字。这使得整个模数测试变得多余。

至少输入 10 的工作解决方案可以是:

for vermenigvuldiging in count(1):
    ...

请注意,我已使用索引变量删除了迭代列表的值。只是直接迭代它。你也可以"增强"您的解决方案进一步使用itertools.count,在这种情况下,您可以用以下内容替换while循环:

public async Task Invoke(HttpContext ctx, 
                         IHostingEnvironment host,
                         ISomethingElse service)
{
    // ...
}

答案 2 :(得分:0)

首先,您应该在docs here上查找sys.exit()的用法。该命令将在调用时退出程序,因此如果在第一个while循环结束时调用它,则第二个while循环将无法运行。您应该用来打破while循环的命令是

下面使用的break
while t < invoer:

invoer2 = int(input('Vul een testgeval in groter dan 0 en kleiner of gelijk aan 100: '))
if 0 < invoer2 <= 100:
    print('Testgeval ', t + 1, 'is: ', invoer2)
    testgevallen.append(invoer2)
    t += 1
    print('Array is ', testgevallen)
else:
    print('Het getal moet groter zijn dan 0 en kleiner of gelijk aan 100!!')
    break.

我怀疑第二个while循环永远不会运行,因为你使用的是sys.exit(),而不是仅仅从循环中断开。此外,在第二个while循环中,您需要更改t变量,否则Output moet zijn: ', som将不断打印并卡在此循环中。