从右到左获取输入
我正在写一个简单的程序,它会随机生成一个加法题,然后让用户输入答案。
当用户输入答案时,电脑是从左到右输入的。我想要的正好相反:从右到左输入。
http://euclidmagazine.com/2010/12/why-do-we-carry-in-addition/
当然,加法的计算方式是先从最右边的那一列开始加,也就是个位数,然后是十位数、百位数,依此类推。
举个例子,如果我输入上面这个加法题的答案(635),我想按照这个顺序输入(先输入6,再输入3,最后输入5),我希望6能出现在9 + 6的下面,然后当我输入3时,6会移动到5 + 7的下面,而3会出现在9 + 6的下面,最后当我输入5时,6会在3 + 2的下面,3会在5 + 7的下面,5会在9 + 6的下面。
有没有什么其他的输入函数或者模块可以用来实现这个?或者你有没有什么特别的技巧?谢谢。
这是我的代码:
# MAIN
def main():
keepGoing = "Y"
while keepGoing == "Y":
keepGoing = "N"
entranceMessage()
number1, number2 = calculateProblem()
userInput = getInput(number1, number2)
calculateResults(userInput, number1, number2)
keepGoing = input("Would you like to try another problem? \
(Enter \"Y\" for \"Yes\", or any other key for \"No\".): ")
exitMessage()
# DISPLAY OPENING MESSAGE
def entranceMessage():
print()
print("2. Math Quiz (Page 235)")
print("This program will prompt you to answer a series of random mathematical problems.")
# INPUT
def getInput(number1, number2):
print("Answer the following math problem: ")
print("")
if (number1 < 10):
print(" ", number1)
else:
print(" ", number1)
if (number2 < 10):
print("+ ", number2)
else:
print("+", number2)
print("_____")
print(" ")
result = (number1 + number2)
if (result >= 100):
userInput = float(input(" "))
elif ((result >= 10) and (result < 100)):
userInput = float(input(" "))
elif ((result >= 0) and (result < 10)):
userInput = float(input(" "))
return userInput
# PROCESS
def calculateProblem():
import random
number1 = random.randint(1, 100)
number2 = random.randint(1, 100)
return number1, number2
# OUTPUT
def calculateResults(userInput, number1, number2):
result = (number1 + number2)
if (userInput == result):
print()
print("Correct!")
else:
print()
print("Sorry, the answer is:", result)
# DISPLAY CLOSING MESSAGE
def exitMessage():
print("Thank you. Exiting the program..")
# CALL THE MAIN FUNCTION
main()
如果你注意到我代码中的“getInput”函数(最后的If-elif),在最后我有一个方法可以把初始光标放在正确的位置,以对应答案,但(A)这有点暗示了答案是什么,(B)这并不是我想要的。
2 个回答
在我的UNIX系统上,这个方法有效,我用getch从这个回答中读取单个字符。
import sys
def cursor_left():
"""Print control characters to move the cursor left one column."""
sys.stdout.write(chr(27) + '[D') # 27 is ESC
def print_blank(number):
"""Print blank character a given number of times."""
for i in range(0, number):
sys.stdout.write(" ")
def right_to_left_input(number_of_digits):
"""Have user input a number from right to left, digit by digit."""
print_blank(number_of_digits)
digits = ""
while (1):
cursor_left()
userInput = getch()
sys.stdout.write(userInput)
digits = userInput + digits # string concatenation, not addition
if (len(digits) >= number_of_digits):
break
cursor_left()
return(digits)
你可以查看这个页面,了解在xterm中移动光标的控制序列。
或者,根据你使用的操作系统或命令行,你可以删除最后几个字符,然后每次重新打印它们吗?
还可以查看这个控制字符表。试试ASCII 8(退格);ASCII 127(删除);或者ASCII 10(换行;如果你只换行而不换页,有些系统可能允许你在同一行重新输入)。
你可以打印chr(8)
,例如,这样可以打印ASCII字符8(退格)。
想了解如何一次读取一个字符,可以参考这个回答。
如果你在运行getch时遇到错误,下面的代码可能仍然有效;在我的UNIX系统上是有效的;但它要求用户在每输入一个数字后按回车。它假设用户每次只输入一个数字。
def cursor_up():
"""Print control characters to move the cursor up one line."""
sys.stdout.write(chr(27)) # ESC
sys.stdout.write(chr(91)) # [
sys.stdout.write(chr(65)) # A
def backspace(number):
"""Print backspace character a given number of times."""
for i in range(0, number):
sys.stdout.write(chr(8))
def print_blank(number):
"""Print blank character a given number of times."""
for i in range(0, number):
sys.stdout.write(" ")
def print_cursor():
sys.stdout.write("_") # use as cursor
def right_to_left_input(number_of_digits):
digits = ""
print ""
cursor_up()
while(1):
have_digits = len(digits)
if(have_digits >= number_of_digits):
break
print_blank(number_of_digits - have_digits)
print_cursor()
sys.stdout.write(digits)
print_blank(1) # overwrite the user's previous input
backspace(have_digits + 2) # move back to cursor position
userInput = sys.stdin.readline()
cursor_up() # undo the carriage-return entered by the user.
digit = userInput[0] # first character in string
digits = digit + digits # string concatenation, not addition
return(digits)