-

Программист (Фиговый)

Новичок
Пользователь
Май 19, 2021
4
0
1
-
 
Последнее редактирование:

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 599
464
83
Крч сделал калькулятор,
код писал вроде правильно (если не считать типичных синтаксических ошибок), но на 81 строке List.insert(List[ScanIndex],ListPart) выдает ошибку TypeError: 'str' object cannot be interpreted as an integer
Программа:
Python:
List = ["null"]
Example = ( 10 + ( 7 * ( 2 * 2 ) - ( 6 / 3 ) ) ) / ( 18 / 6 ) =#input("Пример:")
ListPart = " "
ScanIndex = 0
while (Example[ScanIndex] != "=") :
    ListPart = " "
    while (Example[ScanIndex] != " ") :
        ListPart += Example[ScanIndex]
        print(ListPart)
        ScanIndex += 1
        print(ScanIndex)
    List.append(ListPart)
    if (Example[ScanIndex] == " ") :
        ScanIndex += 1
    print (List)
List.remove("null")
List.append("=")
print (List)
ScanIndex = 0
Brackets = ["100"]
while (List[ScanIndex] != "=") :
    if (List[ScanIndex] == " (") :
        Brackets.append(ScanIndex)
        print (Brackets)
    ScanIndex += 1
Brackets.remove("100")
Brackets.reverse()
BarcketsRemove = len(Brackets)
print (BarcketsRemove)
Sum = False
while (len(Brackets) < 0) :
    ScanIndex = Brackets[0]
    print (len(Barckets))
    while True :
        print (Sum)
        while (List[ScanIndex] != " )") :
            if (List[ScanIndex] == " *" or " /" or " +" or " -") :
                if Sum == False :
                    if (List[ScanIndex] == " *") :
                        ListPart = str(float(List[ScanIndex-1]) * float(List[ScanIndex+1]))
                    if (List[ScanIndex] == " /") :
                        ListPart = str(float(List[ScanIndex-1]) / float(List[ScanIndex+1]))
                else :
                    if (List[ScanIndex] == " +") :
                        ListPart = str(float(List[ScanIndex-1]) + float(List[ScanIndex+1]))
                    else :
                        ListPart = str(float(List[ScanIndex-1]) - float(List[ScanIndex+1]))
                print (ListPart)
                print (List)
                List.insert([ScanIndex],ListPart)
                List.remove([ScanIndex+1])
                List.remove([ScanIndex-1])
                print (List)
            ScanIndex += 1
        if Sum == True :
            break
        if Sum == False :
            Sum = True
    Brackets.remove([0])
while (BarcketsRemove > 0) :
    print (List)
    List.remove(" (")
    List.remove(" )")
    print (List)
    BarcketsRemove -= 1
Sum = False
ScanIndex = 0
while True :
    while (List[ScanIndex] != "=") :
        if (List[ScanIndex] == " *" or " /" or " +" or " -") :
            if Sum == False :
                if (List[ScanIndex] == " *") :
                      ListPart = str(float(List[ScanIndex-1]) * float(List[ScanIndex+1]))
                if (List[ScanIndex] == " /") :
                       ListPart = str(float(List[ScanIndex-1]) / float(List[ScanIndex+1]))
            else :
                if (List[ScanIndex] == " +") :
                    ListPart = str(float(List[ScanIndex-1]) + float(List[ScanIndex+1]))
                else :
                       ListPart = str(float(List[ScanIndex-1]) - float(List[ScanIndex+1]))
            List.insert(List[ScanIndex],ListPart)
            List.remove([ScanIndex+1])
            List.remove([ScanIndex-1])
        ScanIndex += 1
    if Sum == True :
         break
    if Sum == False :
         Sum = True
print (List)
почему так много правил...
если в вашем коде заменить строку Example = ( 10 + ( 7 * ( 2 * 2 ) - ( 6 / 3 ) ) ) / ( 18 / 6 ) =#input("Пример:")
на строку Example = '(10 + (7 * (2 * 2) - (6 / 3))) / (18 / 6)', то он работает, ругается только на цикл while, что выходим за пределы строки...
ошибку, которую вы описали, я не смог добиться...
ну и что он делает, я тоже не понял...
 

Ципихович Эндрю

Активный пользователь
Пользователь
Мар 27, 2021
490
25
28
1 вставьте код по правилам форума
а вообще админу нужно задуматься почему многие не вставляют код как нужно - я знаю
потому, что не так как на других форумах...............
2
Код:
Example = input("Пример:")
# замените на
Example = ( 10 + ( 7 * ( 2 * 2 ) - ( 6 / 3 ) ) ) / ( 18 / 6 )
 
  • Мне нравится
Реакции: Vershitel_sudeb

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
933
208
43
20
Москва
а хотите я напишу ваш код в одну строку?
print(eval(input()))
 

Ципихович Эндрю

Активный пользователь
Пользователь
Мар 27, 2021
490
25
28
Код:
# eval=оценка
print(eval(( 10 + ( 7 * ( 2 * 2 ) - ( 6 / 3 ) ) ) / ( 18 / 6 )))
выдало ошибку TypeError: eval() arg 1 must be a string, bytes or code object
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 599
464
83
1 вставьте код по правилам форума
а вообще админу нужно задуматься почему многие не вставляют код как нужно - я знаю
потому, что не так как на других форумах...............
2
Код:
Example = input("Пример:")
# замените на
Example = ( 10 + ( 7 * ( 2 * 2 ) - ( 6 / 3 ) ) ) / ( 18 / 6 )
прежде чем писать сообщение или создавать тему, нужно почитать правила, и там написано как вставлять код, и это на любом форуме...
так же есть предпросмотр сообщения, и там можно увидеть что код вставился не правильно, и так же почитать правила как вставлять код...
 

Программист (Фиговый)

Новичок
Пользователь
Май 19, 2021
4
0
1
Код:
# eval=оценка
print(eval(( 10 + ( 7 * ( 2 * 2 ) - ( 6 / 3 ) ) ) / ( 18 / 6 )))
выдало ошибку TypeError: eval() arg 1 must be a string, bytes or code object
А так?
print(eval("( 10 + ( 7 * ( 2 * 2 ) - ( 6 / 3 ) ) ) / ( 18 / 6 )"))
 

Ципихович Эндрю

Активный пользователь
Пользователь
Мар 27, 2021
490
25
28
Код:
print(eval('( 10 + ( 7 * ( 2 * 2 ) - ( 6 / 3 ) ) ) / ( 18 / 6 )'))
print((10 + ( 7 * ( 2 * 2 ) - ( 6 / 3 ) ) ) / ( 18 / 6 ))
смысл в eval не понятен, если в обоих случаях ответ
12.0
12.0
???
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
933
208
43
20
Москва
Код:
print(eval('( 10 + ( 7 * ( 2 * 2 ) - ( 6 / 3 ) ) ) / ( 18 / 6 )'))
print((10 + ( 7 * ( 2 * 2 ) - ( 6 / 3 ) ) ) / ( 18 / 6 ))
смысл в eval не понятен, если в обоих случаях ответ
12.0
12.0
???
смысл в том, чтобы можно было ввести уравнение в консоль а не в код программы
без evel вам придется вручную определять порядок действий и сами действия
 

Программист (Фиговый)

Новичок
Пользователь
Май 19, 2021
4
0
1
смысл в том, чтобы можно было ввести уравнение в консоль а не в код программы
без evel вам придется вручную определять порядок действий и сами действия
А может вы о другом поговорите?
Тип решение я так и не нашел
 

Программист (Фиговый)

Новичок
Пользователь
Май 19, 2021
4
0
1
если в вашем коде заменить строку Example = ( 10 + ( 7 * ( 2 * 2 ) - ( 6 / 3 ) ) ) / ( 18 / 6 ) =#input("Пример:")
на строку Example = '(10 + (7 * (2 * 2) - (6 / 3))) / (18 / 6)', то он работает, ругается только на цикл while, что выходим за пределы строки...
ошибку, которую вы описали, я не смог добиться...
ну и что он делает, я тоже не понял...
Потому, что я случайно указал числовой пример вместо текстового и вы правильно взяли кавычки, но почему-то забыли" =", который служит для остановки "сканирования"
По поводу функции:
1-18) Разбивает пример на сегменты и загружает их в список List, знак окончания сегмента - пробел, а примера - равно
19-29) Проверяет сегменты на наличие открытых скобок и при нахождении таковых загружает их порядковый номер в список
27) Тут стоит пояснить: дальнейшие вычисления идут от открытой до первой попавшейся закрытой скобки и если попадутся скобки в скобках логических ошибок, связанных с порядком вычисления не избежать, но вместо лишних строк кода я решил просто перевернуть список с координатами скобок.
30-59) Здесь основные вычисления: берем первую координату скобки и начинаем вычисления от нее, сперва ищем умножение и деление, когда находим берем число слева и справа и выполняем
действие, полученное число ставим на место знака заменяя его, а соседние числа удаляем, дошли до конца - ищем сложение и вычитание, опять дошли до конца - переходим к другой скобке.
60-65) удаляем скобки
66-89)Теперь решаем оставшийся пример, но на моменте с заменой(81 строка) теперь выдает ошибку.
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 599
464
83
Потому, что я случайно указал числовой пример вместо текстового и вы правильно взяли кавычки, но почему-то забыли" =", который служит для остановки "сканирования"
По поводу функции:
1-18) Разбивает пример на сегменты и загружает их в список List, знак окончания сегмента - пробел, а примера - равно
19-29) Проверяет сегменты на наличие открытых скобок и при нахождении таковых загружает их порядковый номер в список
27) Тут стоит пояснить: дальнейшие вычисления идут от открытой до первой попавшейся закрытой скобки и если попадутся скобки в скобках логических ошибок, связанных с порядком вычисления не избежать, но вместо лишних строк кода я решил просто перевернуть список с координатами скобок.
30-59) Здесь основные вычисления: берем первую координату скобки и начинаем вычисления от нее, сперва ищем умножение и деление, когда находим берем число слева и справа и выполняем
действие, полученное число ставим на место знака заменяя его, а соседние числа удаляем, дошли до конца - ищем сложение и вычитание, опять дошли до конца - переходим к другой скобке.
60-65) удаляем скобки
66-89)Теперь решаем оставшийся пример, но на моменте с заменой(81 строка) теперь выдает ошибку.
а это какая то задача?
просто в питоне есть приоритет математических операторов, и если правильно расставить скобки, то он все решит правильно без ваших списков...
 

Форум IT Специалистов