如果陈述:我的逻辑错了

时间:2013-11-21 00:16:58

标签: python

我在CS 1,正在学习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")

2 个答案:

答案 0 :(得分:2)

你有一系列的错误,你需要修复所有这些错误才能使其工作。让我们一个接一个地浏览它们。 Here是解决所有问题的最终结果(并尽可能少地改变)。


您需要修复的第一件事就是将字符串转换为数字的所有位置。您使用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如何。


接下来,您没有任何可以打印solid的案例,除了0. newTempNum == newTempNum * -1只有在它是0时才会为真。且212&gt; newTempNum&gt; 32只有在它是&lt; 32&gt;时才是真的。 32,在这种情况下,它已经被早先的案件抓住了。你有了Celsius的逻辑,所以在这里再次使用相同的逻辑。

现在它适用于负华氏度数字。


对于正华氏数字,NameError仍会获得newTempNum个例外。为什么?好吧,if faren in temp,您有if this in temp,但没有else。因此,负数做正确的事并将newTempNum分配给正确的值,但正数根本不做任何操作,这意味着它们没有赋值,这意味着当您查找该值时会出错。 / p>

实际上,您根本不需要if this in temp - 完全相同的代码适用于正数和负数。所以,只需删除它。

现在它适用于Celsius和Fahrenheit,正面和负面。


但是如果你给它一个字母,里面没有任何字母,你就会再次获得NameError。这是因为,在与else一起的if faren in temp内,您已获得if faren in tempelse仅在faren 不是的情况下才会发生,因此if永远不会发生。无论如何,我不确定你想做什么。也许是print("Sorry, that has neither a C nor an F, so I don't know what to do with it")。在打印之后,您仍会收到错误,但至少它会明显表明用户有错,而不是您的代码。

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

答案 1 :(得分:0)

您的代码中存在一些逻辑错误。例如,当您尝试从输入中删除F或C时,可以将其转换为int。如果输入为10F或100F或1000F,则执行此操作时总是会得到“1”:newTemp = temp[0]一种表达方式是newTemp = temp[:-1]。这是在temp中获取的东西,从索引0处的字符开始(0表示在:)之前,并且在倒数第二个字符处结束。您可以阅读更多相关信息here

如果你的输入确实有一个F,它看起来好像永远不会得到将打印事物状态的代码。打印状态的部分如果位于if的其他地方,则测试F。

如果我是你,我会重新开始,首先用伪代码来思考。我就是这样做的:

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.