从右到左获取输入

4 投票
2 回答
1557 浏览
提问于 2025-04-18 09:48

我正在写一个简单的程序,它会随机生成一个加法题,然后让用户输入答案。

当用户输入答案时,电脑是从左到右输入的。我想要的正好相反:从右到左输入。

img

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 个回答

1

如果你在使用Unix系统,有一种方法可以做到这一点,那就是使用curses库。curses库通常用于高级终端操作,它可以让你在终端的任何地方写文字、改变字体颜色等等。此外,除了Python,还有其他语言(比如C语言)也有类似的库可用。这个库也常被用在像Rogue这样的文字游戏中。

这是官方文档的链接

这是一个不错的教程

1

在我的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)

撰写回答