当特定条件无法循环时的函数

2024-04-29 01:07:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我是建立在一个简单的毕达哥拉斯定理计算器,我写了一段时间回来,使一个更先进的版本作为介绍类和函数。我已经成功地将其编程为求解c,或者a或b,如果用户需要进行另一个计算,则返回计算函数。你知道吗

我最近尝试添加一个主菜单函数,因此如果用户需要解c,现在需要解b,他/她可以返回主菜单选择他们需要的选项。有点困难,我已经设法把它编码到它想去的地方

  1. 返回主菜单
  2. 用户选择另一个选项
  3. 用户根据需要执行计算
  4. 1-3次重复成功

但是如果他们试图返回并选择另一个选项,它只会返回python提示符。我很难用语言来描述这个问题,因为其他事情也会出错。例如,如果执行的计算少于2次并尝试返回,则当前使用的方法将继续循环。我不知道为什么会发生这样的事,看来我做的一切都是对的。我试过排除故障,但如上所述,我的特殊情况很难描述。我确信我做得不对,我想知道怎么做。我的代码和截图附在下面。你知道吗

代码

    ' A Pythagoren Therom Calculator (v.2.0)
By: Anon_104'''
#imports
import time, math
#Welcome statement (Welcomes the user)
print("Welcome to the pythagorean theorem calculator!")
time.sleep(1)
#a class to organize and keep everything in order ;)
class pytha:
    #custom function for solving for c
    def cal():
        global ques1
        a = int(input('Please enter the "A" value: '))
        b = int(input('Please enter the "B" value: '))
        print("Calculating...")
        time.sleep(1)
        print('The "C" value is ')
        c = math.sqrt(a*a + b*b)
        print(c)
        ques1 = str(input("Another Calculation? (y/n) Or return to main menu? (back)"))
    #function for solving for a or b, given c
    def cal2():
        global ques2
        var = input('Please input either the "A" or "B" value: ')
        c = input('Please input the "C" value: ')
        var2 = float(c)**2 - float(var)**2
        ans = math.sqrt(var2)
        print('The "A"/"B" value is {0}'.format(ans))
        ques2 = str(input("Another Calculation? (y/n) Or return to main menu? (back)"))
    def mainmenu():
        global query1
        query1 = input('Welcome to the main menu! Solve for "C" or "A"/"B"? (opt1/opt2)')
pytha.mainmenu()

#The loop and break code for function 1      
if query1 == 'opt1':
    pytha.cal()
    while ques1 == 'y':
        pytha.cal()
        if ques1 == 'back':
            pytha.mainmenu()
            while query1 == 'opt1':
                pytha.cal()
        elif ques1 == 'n':
            print("Quitting... ")
            time.sleep(1.6)
            quit



#The loop and break code for function 2
if query1 == 'opt2':
    pytha.cal2()
    while ques2 == 'y':
        pytha.cal2()
        if ques2 == 'back':
            pytha.mainmenu()
            while query1 == 'opt2':
                pytha.opt2
        elif ques2 == 'n':
            print("Quitting... ")
            time.sleep(1.6)
            quit

截图 It doesn't loop again

这是我第一次在帮助板上问任何问题,所以如果我做得不对的话,请别客气。你知道吗


Tags: theto用户forinputtimevaluefunction
1条回答
网友
1楼 · 发布于 2024-04-29 01:07:02

您不需要在末尾使用查询语句。在方法中包含对方法的调用,或者创建一个新的方法以返回主菜单。我还建议在处理可能的小数时使用float()而不是int(),但我没有改变这一点。你知道吗

class Pytha(object):
    def __init__(self):
        import time, math
        self.math = math
        self.time = time
        print("Welcome to the pythagorean theorem calculator!\n")
        self.time.sleep(1)
        self.mainmenu()

    #custom function for solving for c
    def cal(self):
        try:
            a = int(input('\nPlease enter the "A" value: '))
            b = int(input('Please enter the "B" value: '))
            print("Calculating...")
            self.time.sleep(1)
            print('The "C" value is ')
            c = self.math.sqrt(a*a + b*b)
            print(c)
        except ValueError:
            print("\nError: Please enter a number\n")
            self.cal()
        self.rerun()

    #function for solving for a or b, given c
    def cal2(self):
        try:
            var = int(input('\nPlease input either the "A" or "B" value: '))
            c = int(input('Please input the "C" value: '))
            var2 = float(c)**2 - float(var)**2
            ans = self.math.sqrt(var2)
            print('The "A"/"B" value is {0}'.format(ans))
        except ValueError:
            print("\nError: Please enter a number\n")
            self.cal2()
        self.rerun()

    def mainmenu(self):
        query1 = str(input('Welcome to the main menu! Solve for "C" or "A"/"B" or quit program? (opt1/opt2/q)\n'))
        if query1.lower() == "opt1":
            self.cal()
        elif query1.lower() == "opt2":
            self.cal2()
        elif query1.lower() == 'q':
            quit()
        else:
            print("Error: Please type 'opt1' or 'opt2' or 'q'\n")
            self.mainmenu()

    def rerun(self):
        query1 = str(input('\nAnother Calculation? Solve for "C" or "A"/"B" or quit program? (opt1/opt2/q)\n'))
        if query1.lower() == "opt1":
            self.cal()
        elif query1.lower() == "opt2":
            self.cal2()
        elif query1.lower() == 'q':
            quit()
        else:
            print("Error: Please type 'opt1' or 'opt2' or 'q'\n")
            self.rerun()

app = Pytha()           

你可以做更多的事情来清理这个。我把所有的东西都放在课堂上,把所有的东西都叫做自我什么的(). 你知道吗

我添加了.lower(),以备用户执行OPT1或OPT1时使用。你知道吗

我创建了一个在每次操作后调用的重新运行函数。它在第一次运行后自动转到这个位置。你知道吗

我还使用try/except作为输入,因为在调用int()时输入非数字字符会导致ValueError。相反,它现在将告诉用户输入一个数字并重试。你知道吗

对于quit,需要将其称为quit()。你知道吗

init在调用类时立即加载,这允许您执行一些操作来初始化它,例如包括导入、设置变量、打印消息和运行函数。这样就包罗万象了。你知道吗

最后,标准的做法是用大写字母开头类名(尽管不是必需的)。你知道吗

希望这能帮助您更好地了解如何使用类。你知道吗

编辑:

如果您想为您的工具构建一个自定义导入,以便在没有直接用户交互的情况下使用,您可以这样构建它:

class Pythag(object):
    #custom function for solving for c
    def solve_C(a, b):
            from math import sqrt
            a = int(a)
            b = int(b)
            c = sqrt(a*a + b*b)
            return (c)

    #function for solving for a or b, given c
    def solveAB(var, c):
            from math import sqrt
            var = int(var)
            c = int(c)
            var2 = float(c)**2 - float(var)**2
            ans = sqrt(var2)
            return(ans)

然后可以将其导入另一个脚本。如果你的毕达格手稿毕达格,则将其导入为

from pythag import Pythag

然后像这样调用模块:

Pythag.solve_C(4,5)

相关问题 更多 >