Мой код Python, который конвертирует числа между базами, имеет несколько ошибок.Что может быть не так и как я могу их найти? - PullRequest
0 голосов
/ 16 сентября 2018

Моя программа - это функция, которая конвертирует числа из одной базы в другую. Он принимает три аргумента: начальное значение, основание начального значения, затем основание, в которое оно должно быть преобразовано.

У вещи есть несколько ошибок. Во-первых, вещь не примет значение, содержащее букву для 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), а затем добавляет результат к окончательному результату. Следует объединить результаты вместе, чтобы сформировать окончательный результат, который будет напечатан. Я не понимаю, почему он этого не делает.

Почему он не генерирует правильный результат и почему я не могу ввести строку в вызов функции?

Ответы [ 3 ]

0 голосов
/ 16 сентября 2018

Прежде всего, вся первая часть кода не нужна, так как функция 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)
0 голосов
/ 16 сентября 2018

Не вдаваясь в конкретные проблемы с вашим кодом, которых, как вы сказали, много, я дам краткий ответ на актуальный вопрос в заголовке

Что может быть не так и как я могу найти [ошибки в моем коде]?

Вместо того, чтобы рассматривать ваш код как одну большую сложную функцию, на которую вы должны смотреть и понимать все сразу (я редко могу хранить более 10 строк кода в своем собственном внутреннем кеше мозга одновременно), попробуйте разбить его на части на маленькие кусочки: «Сначала я делаю это и ожидаю этого результата. Затем я беру этот результат и делаю это с ним, и ожидаю другого результата».

Из вашего описания проблемы кажется, что вы уже так думаете, но вы все равно выбросили этот большой кусок кода и, похоже, изо всех сил пытались выяснить, где именно проблема. Многие новички напишут большую кучу кода, а затем при тестировании будут рассматривать его как черный ящик. Например: «Я не получаю правильный ответ и не знаю, где начинается проблема». Это где обучение хорошим навыкам отладки имеет решающее значение.

Сначала я разбил бы вещи на мелкие кусочки, чтобы просто попробовать в интерактивном приглашении Python. Вставьте фиктивные значения для различных переменных и убедитесь, что небольшие фрагменты кода (от 1 до 5 строк или около того, достаточно малые, чтобы их можно было легко рассуждать) делают именно то, что вы ожидаете сделать с различными значениями переменных.

Если это не поможет, то для начала проверенный и надежный метод, часто как для начинающих, так и для опытных разработчиков, состоит в том, чтобы загадать ваш код с помощью операторов print. В таком количестве мест, которое, по вашему мнению, необходимо, поместите оператор для вывода значений одной или нескольких переменных. Как print("exp = %s; result = %s" % (exp, result). Поместите это в столько мест, сколько вам нужно, чтобы отслеживать значения некоторых переменных в процессе выполнения. Посмотрите, где он начинает давать ответы, которые не имеют смысла.

Иногда это трудно сделать, хотя. Возможно, вы не сможете угадать наиболее эффективные места для размещения операторов print или даже то, что важно напечатать. В подобных случаях (и IMO в большинстве случаев) более эффективно использовать интерактивный отладчик, такой как встроенный в Python pdb. Есть много хороших ресурсов для изучения pdb, но основы не должны занимать слишком много времени, чтобы спуститься и избавят вас от головной боли.

pdb будет запускать ваш код построчно, останавливаясь после каждой строки (и в циклах он будет проходить через каждый цикл в цикле), позволяя вам проверять содержимое каждой переменной перед переходом к следующей строке , Это дает вам полную возможность проверить, что каждая часть вашего кода выполняет или не выполняет то, что вы ожидаете, и должно помочь вам определить многочисленные проблемные области.

0 голосов
/ 16 сентября 2018

Вы должны использовать опыт, который вы найдете на первом шаге:

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