我在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]
。这意味着,对于-123C
或451F
,您只会得到-1
或4
。
如果你想在最后去掉C
或F
,可以使用切片:temp[:-1]
。或者,也可以使用temp.rstrip('CF')
使其明确。
这是你唯一一只温度为摄氏度的虫子。有很多东西你可以清理,但没有一个会导致错误。
但是华氏温度还有一些新的问题。
首先,如果未找到temp.find("C")
,它将返回-1
。-1是一个真值。除0
之外的所有数字都是真值。你想要的是if "C" in temp
——你用的东西到处都是。
一旦你这样做了,你就会得到一个异常,因为你检查了faren
,但你从未用这个名称定义过任何东西;你定义了Faren
,但那不是一回事。资本化计数。所以,改变其中一个,使它们匹配。
现在,对于华氏温度,什么都不会打印出来,因为所有打印代码都发生在else
内部。您需要取消对最后8行的凹痕,以便它们发生在if
/else
之后,无论if
/else
如何。
接下来,除了0之外,您没有任何案例可以打印solid
。newTempNum == newTempNum * -1
只有在为0时才为真。212>newTempNum>32只有当它>32时才是真的,在这种情况下,它可能已经被前面的情况捕获了。你对摄氏度的逻辑是正确的,所以在这里再次使用相同的逻辑。
现在它适用于负华氏温度。
对于正华氏度数值,对于newTempNum
,您仍然会得到一个NameError
异常。为什么?嗯,if faren in temp
,你有一个if this in temp
,但没有else
。因此,负数做了正确的事情,并将newTempNum
分配给了正确的值,但正数什么都不做,这意味着它们没有分配值,这意味着您在寻找该值时会出错。
实际上,您根本不需要if this in temp
——完全相同的代码适用于正数和负数。所以,把它取下来。
现在它对摄氏度和华氏度都有效,对正和负都有效。
但如果你给它一个既没有字母也没有的字符串,你会再次得到一个NameError
。这是因为,在else
和if 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.