If语句:我的逻辑有问题

  • 本文关键字:有问题 语句 If python
  • 更新时间 :
  • 英文 :


我在CS1学习python。我们刚刚完成了if语句和布尔数据类型的学习。我必须编写一个程序,读取温度值,C表示摄氏度,F表示华氏度,然后打印输入的数字是固体液体还是气体。这是我的代码,但我似乎无法让它工作得很好

temp = input("Temp in C or F(like 5C or 5F): ")
this = ("-")
Faren = ("F")
if temp.find ("C") :
    if this in temp:
       len(temp)
       newTemp = temp[0] + temp[1]
       newTempOne = int(newTemp)
       tempOne =((newTempOne * 9) / 5 + 32)
    else:
        len(temp)
        newTemp = temp[0]
        newTempOne = int(newTemp)
        tempOne =((newTempOne * 9) / 5 + 32)
    if tempOne >= 212:
        print("gaseous")
    elif tempOne <= 32 or tempOne == tempOne * -1 :
        print("solid")
    elif 212 > tempOne > 32:
        print("liquid")
else:
    if faren in temp :
        if this in temp:
            len(temp)
            tempNum = temp[0] + temp[1]
            newTempNum = int(tempNum)
    else:
        if faren in temp :
            len(temp)
            tempNum = temp[1]
            newTempNum = int(tempNum)
        if newTempNum  >= 212:
            print("gaseous")
        elif newTempNum > 32:
            print("solid")
        elif newTempNum == newTempNum * -1:
            print("solid")
        elif 212 > newTempNum > 32 :
            print("liquid")

您有一系列的错误,需要修复所有这些错误才能正常工作。让我们逐一复习一下。以下是修复所有这些问题(并尽可能少地更改其他内容)的最终结果。


首先需要修复的是将字符串转换为数字的所有位置。负数使用temp[0] + temp[1],负数则使用temp[0]。这意味着,对于-123C451F,您只会得到-14

如果你想在最后去掉CF,可以使用切片:temp[:-1]。或者,也可以使用temp.rstrip('CF')使其明确。

这是你唯一一只温度为摄氏度的虫子。有很多东西你可以清理,但没有一个会导致错误。


但是华氏温度还有一些新的问题。

首先,如果未找到temp.find("C"),它将返回-1。-1是一个真值。除0之外的所有数字都是真值。你想要的是if "C" in temp——你用的东西到处都是。


一旦你这样做了,你就会得到一个异常,因为你检查了faren,但你从未用这个名称定义过任何东西;你定义了Faren,但那不是一回事。资本化计数。所以,改变其中一个,使它们匹配。


现在,对于华氏温度,什么都不会打印出来,因为所有打印代码都发生在else内部。您需要取消对最后8行的凹痕,以便它们发生在if/else之后,无论if/else如何。


接下来,除了0之外,您没有任何案例可以打印solidnewTempNum == newTempNum * -1只有在为0时才为真。212>newTempNum>32只有当它>32时才是真的,在这种情况下,它可能已经被前面的情况捕获了。你对摄氏度的逻辑是正确的,所以在这里再次使用相同的逻辑。

现在它适用于负华氏温度。


对于正华氏度数值,对于newTempNum,您仍然会得到一个NameError异常。为什么?嗯,if faren in temp,你有一个if this in temp,但没有else。因此,负数做了正确的事情,并将newTempNum分配给了正确的值,但正数什么都不做,这意味着它们没有分配值,这意味着您在寻找该值时会出错。

实际上,您根本不需要if this in temp——完全相同的代码适用于正数和负数。所以,把它取下来。

现在它对摄氏度和华氏度都有效,对正和负都有效。


但如果你给它一个既没有字母也没有的字符串,你会再次得到一个NameError。这是因为,在elseif faren in temp中,有一个if faren in temp。只有当faren在temp中不时,才会发生else,因此if永远不会发生。我不确定你到底想在这里做什么。也许是print("Sorry, that has neither a C nor an F, so I don't know what to do with it")。在打印后,您仍然会收到一个错误,但至少它会让用户明显有错,而不是您的代码。

现在,它对每个有效输入都做了正确的事情,对每个无效输入都会出现错误。如果你想清理并简化它,添加更好的错误处理或输入验证等,你可以,但基本功已经完成。

您的代码中有一些逻辑错误。例如,当你试图从输入中去掉F或C,以便将其转换为int时。如果输入是10F、100F或1000F,那么当你这样做时,你总是会得到"1":newTemp = temp[0]实现你的意思的一种方法是newTemp = temp[:-1]。这是在temp中获取内容,从索引0处的字符开始(0隐含在:之前),到最后一个字符的下一个结束。你可以在这里阅读更多关于

如果你的输入中确实有一个F,那么它看起来永远不会到达打印物质状态的代码。打印状态if的部分在测试F.的if的其他部分下

如果我是你,我会重新开始,首先用伪代码思考。以下是我的做法:

Get input
Check for an F with an if statement.
If it has an F, strip the F and convert the number to an int and store for later use.
Check for a C with an if statement.
If it has a C, strip the C and convert the number to an int and store.
Convert Celsius to Fahrenheit and store the answer.
Do the tests to check what state  and print appropriate state. 

最新更新