我在基之间转换数字的python代码有几个错误。有什么不对劲,我怎样才能找到他们?

2024-10-03 09:13:27 发布

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

我的程序是一个将数字从一个基转换为另一个基的函数。它有三个参数:初始值,初始值的基,然后是要转换的基。你知道吗

这东西有几个错误。首先,它不会接受任何包含cnum字母的值。我不知道为什么。我似乎不知道如何强制对象在函数调用中将参数'cnum'识别为字符串。我必须把它转换成代码本身的函数。你知道吗

另外,我不能让后半部分,也就是把数字转换成最终基数的部分,发挥作用。要么它给了我一个无限循环(出于某种原因我无法理解),要么它没有完成完整的计算。这个,如果我输入fconbase(100,10,12),应该把100从10进制转换成12进制。它只吐出8个。答案应该是84。你知道吗

这是我的全部功能。你知道吗

    #delcaring variables

cnum=0 #number to be converted
cbase1=0 #base the number is written in
cbase2=0 #base the number will be converted to
cnumlen=0 #number of digits
digitNum=0 #used to fetch out each digit one by one in order
exp=0 #used to calculate position in result
currentDigit="blank" #stores the digit that's been pulled from the string
result=0 #stores the result of internal calculations
decimalResult=0 #stores cnum as a base 10 number
finalResult=0 #the final result of the conversion

def fconbase(cnum, cbase1, cbase2):
    #converts number into base 10, because the math must be done in base 10
    #resets variables used in calculations
    exp=0
    result=0
    decimalResult=0
    currentDigit="blank"
    cnumlen=len(str(cnum)) #finds length of cnum, stays constant
    digitNum=cnumlen #sets starting placement
    while exp<cnumlen:
        currentDigit=str(cnum)[digitNum-1:digitNum]
        #the following converts letters into their corresponding integers
        if currentDigit=="a" or currentDigit=="A":
            currentDigit="10"
        if currentDigit=="b" or currentDigit=="B":
            currentDigit="11"
        if currentDigit=="c" or currentDigit=="C":
            currentDigit="12"
        if currentDigit=="d" or currentDigit=="D":
            currentDigit="13"
        if currentDigit=="e" or currentDigit=="E":
            currentdigit="14"
        if currentDigit=="f" or currentDigit=="F":
            currentDigit="15"
        result=int(currentDigit)
        decimalResult=decimalResult+result*(cbase1**exp)
        exp=exp+1
        digitNum=digitNum-1
    #this part converts the decimal number into the target base
    #resetting variables again
    exp=0
    result=0
    finalResult=""
    while int(decimalResult)>(cbase2**exp):
        exp=exp+1
    exp=exp-1
    while int(decimalResult)/cbase2**exp!=int(decimalResult):
        result=int(decimalResult/(cbase2**exp))
        if result==10:
            result="a"
        if result==11:
            result="b"
        if result==12:
            result="c"
        if result==13:
            result="d"
        if result==14:
            result="e"
        if result==15:
            result="f"
        finalResult=str(finalResult)+str(result)
        decimalResult=decimalResult%cbase2**exp
        exp=exp+1
    print(finalResult)

下面是方程后半部分应该发生的情况:

程序求解cbase2^exp。exp从0开始。如果该数字小于decimalResult,则它将exp(onent)增加1,然后重试,直到得到一个大于decimalResult的数字。你知道吗

然后,它将小数结果除以cbase2^exp。它将10到15之间的数字转换为字母(对于大于10的基数),然后将结果附加到最终结果。它应该把结果串联在一起,形成最终的结果,然后打印出来。我不明白为什么不这么做。你知道吗

为什么它不能生成正确的结果,为什么我不能在函数调用中输入字符串?你知道吗


Tags: ortheinnumberbaseif数字result
3条回答

您应该使用在第一步中找到的exp:

while int(decimalResult)>=(cbase2**exp):
    exp=exp+1
exp -= 1
while exp >= 0:
    ...
    finalResult=str(finalResult)+str(result)
    decimalResult=decimalResult%cbase2**exp
    exp -= 1

首先,不需要整个代码的第一部分,因为int函数为您完成了这项工作。而不是所有这些,你可以这样做。你知道吗

int(cnum, base=cbase1)

这将cnum从cbase1转换为基数10。你知道吗

第二部分可能是无限循环,因为在底部,它说

exp = exp + 1

应该说什么时候

exp = exp - 1

因为你想从(例如)5^2到5^0。你知道吗

结果没有最后一个数字是因为它在exp=0时中断了循环。 它实际上并没有把数字加到结果中。一个简单的解决方法是

finalResult = str(finalResult) + str(decimalResult)

在不讨论代码的具体问题的情况下,正如您所说的那样,我将对标题中的实际问题给出一个简短的回答

What could be wrong and how can I find [the errors in my code]?

与其把你的代码当作一个大而复杂的函数,你必须一次盯着它看并理解它(我很少能一次在自己的内部大脑缓存中保存超过10行的代码),不如试着把它分解成更小的部分“首先,我这样做并期望得到这样的结果。然后我得到这个结果,对它做这个,并期待另一个结果。”

从您对问题的描述来看,您似乎已经这样想了,但是您仍然丢弃了这一大块代码,并且似乎正在努力找出问题的确切位置。很多初学者会编写一大堆代码,然后在测试时将其视为黑盒。比如“我没有得到正确的答案,我不知道问题从哪里开始。”这就是学习良好的调试技能的关键所在。你知道吗

我首先将事情分解成更小的部分,在交互式Python提示符下进行尝试。为不同的变量输入虚拟值,并确保小的代码片段(1到5行左右,小到很容易推理)与您期望的对不同变量值的处理完全一致。你知道吗

如果这样做没有帮助,那么对于初学者和高级开发人员来说,一种行之有效的方法就是用print语句来迷惑代码。在您认为必要的地方,放置一个语句来打印一个或多个变量的值。就像print("exp = %s; result = %s" % (exp, result)。在执行过程中跟踪某些变量的值时,尽可能多地放一些这样的东西。看看它从哪里开始给出毫无意义的答案。你知道吗

但有时这很难做到。您可能猜不到放置print语句的最有效位置,甚至猜不到要打印的重要内容。在这种情况下(大多数情况下是IMO),使用像Python内置的pdb这样的交互式调试器更有效。有很多很好的资源可以学习pdb,但是基础知识不应该花费太长的时间,而且可以帮你省去很多麻烦。你知道吗

pdb将逐行运行代码,在每一行之后停止(在循环中,它将通过循环遍历每一个循环),允许您在前进到下一行之前检查每个变量的内容。这使您完全有能力检查代码的每个部分是否做了您期望的事情,并且应该帮助您确定许多问题区域。你知道吗

相关问题 更多 >