【问题标题】:Get Input From Right To Left从右到左获取输入
【发布时间】:2014-06-14 20:15:24
【问题描述】:

我正在编写一个简单的程序来计算一个随机加法数学问题,并要求用户输入答案。

当用户输入答案时,计算机从左到右输入输入的键。我希望输入做相反的事情:从右到左。

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)这不是我想要的。

【问题讨论】:

  • 只是为了清楚起见。你是单独读一个整数还是每个数字?如果您有 wohle 数字,则问题只是反转数字并右对齐输出文本。
  • 不,我要求用户输入,我希望它实时做我想做的事情。
  • 如果您注意到在我的代码中的函数“getInput”(最后一个 If-elif)中,最后我有一种方法可以将初始光标置于与什么有关的正确对齐位置答案是,但是(A)这种提供了答案的线索,(B)这不是我想要的。
  • 您的格式需要一个额外的缩进或 4 个空格 ;)
  • 你的意思是第三条 elif 线?不,我的随机数生成器每个最多只能生成 100 个。另外它们是整数,所以没有小数。

标签: python input


【解决方案1】:

如果您使用的是基于 Unix 的系统,一种方法是使用 curses 库。 Curses 通常用于高级终端操作,可以在终端的任何位置编写文本、更改字体颜色等,并且变体也可用于 Python 以外的语言(包括 C)。它也常用于 Rogue 等基于文本的游戏。

Here's a link to the official documentation.

Here's a good tutorial.

【讨论】:

    【解决方案2】:

    这在 UNIX 系统上对我有用,使用来自 this answer 的 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 上移动光标的控制序列,请参阅 this page

    或者,根据您使用的操作系统或 shell,您可以在最后几个字符上退格并每次都重新打印?

    另见this chart of control characters。尝试 ASCII 8(退格); ASCII 127(删除);或 ASCII 10(换行;如果您执行换行但没有换页,则可能允许您在某些系统上再次在同一行上重新键入。)

    您可以打印chr(8),例如,打印 ASCII 字符 8(退格)。

    请参阅this answer,了解如何一次从用户那里读取一个字符。

    如果您在尝试运行 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-28
      • 1970-01-01
      相关资源
      最近更新 更多