我在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")
答案 0 :(得分:2)
你有一系列的错误,你需要修复所有这些错误才能使其工作。让我们一个接一个地浏览它们。 Here是解决所有问题的最终结果(并尽可能少地改变)。
您需要修复的第一件事就是将字符串转换为数字的所有位置。您使用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
如何。
接下来,您没有任何可以打印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 temp
。 else
仅在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.