我的程序是一个将数字从一个基转换为另一个基的函数。它有三个参数:初始值,初始值的基,然后是要转换的基。你知道吗
这东西有几个错误。首先,它不会接受任何包含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的基数),然后将结果附加到最终结果。它应该把结果串联在一起,形成最终的结果,然后打印出来。我不明白为什么不这么做。你知道吗
为什么它不能生成正确的结果,为什么我不能在函数调用中输入字符串?你知道吗
您应该使用在第一步中找到的exp:
首先,不需要整个代码的第一部分,因为int函数为您完成了这项工作。而不是所有这些,你可以这样做。你知道吗
这将cnum从cbase1转换为基数10。你知道吗
第二部分可能是无限循环,因为在底部,它说
应该说什么时候
因为你想从(例如)5^2到5^0。你知道吗
结果没有最后一个数字是因为它在exp=0时中断了循环。 它实际上并没有把数字加到结果中。一个简单的解决方法是
在不讨论代码的具体问题的情况下,正如您所说的那样,我将对标题中的实际问题给出一个简短的回答
与其把你的代码当作一个大而复杂的函数,你必须一次盯着它看并理解它(我很少能一次在自己的内部大脑缓存中保存超过10行的代码),不如试着把它分解成更小的部分“首先,我这样做并期望得到这样的结果。然后我得到这个结果,对它做这个,并期待另一个结果。”
从您对问题的描述来看,您似乎已经这样想了,但是您仍然丢弃了这一大块代码,并且似乎正在努力找出问题的确切位置。很多初学者会编写一大堆代码,然后在测试时将其视为黑盒。比如“我没有得到正确的答案,我不知道问题从哪里开始。”这就是学习良好的调试技能的关键所在。你知道吗
我首先将事情分解成更小的部分,在交互式Python提示符下进行尝试。为不同的变量输入虚拟值,并确保小的代码片段(1到5行左右,小到很容易推理)与您期望的对不同变量值的处理完全一致。你知道吗
如果这样做没有帮助,那么对于初学者和高级开发人员来说,一种行之有效的方法就是用print语句来迷惑代码。在您认为必要的地方,放置一个语句来打印一个或多个变量的值。就像
print("exp = %s; result = %s" % (exp, result)
。在执行过程中跟踪某些变量的值时,尽可能多地放一些这样的东西。看看它从哪里开始给出毫无意义的答案。你知道吗但有时这很难做到。您可能猜不到放置
print
语句的最有效位置,甚至猜不到要打印的重要内容。在这种情况下(大多数情况下是IMO),使用像Python内置的pdb
这样的交互式调试器更有效。有很多很好的资源可以学习pdb
,但是基础知识不应该花费太长的时间,而且可以帮你省去很多麻烦。你知道吗pdb
将逐行运行代码,在每一行之后停止(在循环中,它将通过循环遍历每一个循环),允许您在前进到下一行之前检查每个变量的内容。这使您完全有能力检查代码的每个部分是否做了您期望的事情,并且应该帮助您确定许多问题区域。你知道吗相关问题 更多 >
编程相关推荐