Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805

Простой калькулятор

30.01.2022, 15:12. Показов 1147. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Стоит задача написать простой калькулятор.

Входные данные:
Вводится произвольное количество строк, оканчивающееся строкой с точкой - формулы калькулятора.
Затем вводится произвольное количество строк, оканчивающееся строкой с точкой - команды калькулятору.
Команда !<индекс> <формула> заменяет формулу в ячейке с индексом <индекс> на формулу <формула>.
Команда ?<индекс> выводит на печать значение в ячейке с индексом <индекс>.

Выходные данные:
Результаты выполнения команд ?<индекс>.

Тест 1
Ввод:
Code
1
2
3
4
5
6
7
1
2
$0 + $1
.
!0 1 + 1 + 1
?2
.
Вывод:
Code
1
5

Тест 2
Ввод:
Code
1
2
3
4
5
6
$1 + $2
1
2
.
?0
.
Вывод:
Code
1
3


Мое решение валится на втором тесте. Как исправить?

Код:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import re
cells = list(iter(input, '.'))
n = len(cells)
values = [0] * n
formulas = [re.sub(r'\$(\d+)', rf'values[\1]', formula) for formula in cells]
commands = list(iter(input, '.'))
for command in commands:
    tokens = command.split(maxsplit=1)
    operation = tokens[0][0]
    index = int(tokens[0][1:])
    if operation == '!':
        formulas[index] = re.sub(r'\$(\d+)', rf'values[\1]', tokens[1])
    elif operation == '?':
        for i in range(len(values)):
            values[i] = eval(formulas[i])
        print(values[index])
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.01.2022, 15:12
Ответы с готовыми решениями:

Написать простой калькулятор по формуле
Летом пытался вникнуть в питон, но не получалось из-за школы и дополнительных. Помогите чайнику, люди добрые. Если ближе к делу, то как я...

Реализуйте простой калькулятор. Напишите, пожалуйста, программу
Реализуйте простой калькулятор следующим образом: сначала просят ввести первое число, а затем второе. После этого на ответ на сообщение...

Простой калькулятор
Напишите простой калькулятор, который считывает с пользовательского ввода три строки: первое число, второе число и операцию, после чего...

13
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
30.01.2022, 15:36
только сложение? скобок нет?
0
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
30.01.2022, 15:44  [ТС]
Сложение, умножение, вычитание (деления нет). Скобок нет.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,711
Записей в блоге: 14
30.01.2022, 15:51
eaa, вы чего-то поняли из постановки и примеров? Что такое $?
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
30.01.2022, 15:55
Цитата Сообщение от Catstail Посмотреть сообщение
Что такое $
номер ячейки в памяти калькулятора.
0
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
30.01.2022, 16:02  [ТС]
Цитата Сообщение от eaa Посмотреть сообщение
номер ячейки в памяти калькулятора.
Да, то что следует после $ - номер ячейки в памяти калькулятора.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,711
Записей в блоге: 14
30.01.2022, 16:03
eaa,

Code
1
2
3
4
5
6
7
1  - что это? Это не команда
2  - аналогично
$0 + $1 - это формула. ладно
.
!0 1 + 1 + 1 - это занесение в первую ячейку суммы?
?2
.
0
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
30.01.2022, 18:10  [ТС]
В первом тесте:

Первая строка инициализирует ячейку $0 тривиальной формулой =1
Вторая строка инициализирует ячейку $1 тривиальной формулой =2
Третья строка инициализирует ячейку $2 формулой =$0 + $1

Первая строка команд меняет формулу в ячейке $0 на =1 + 1 + 1
Вторая строка выводит на печать значение в ячейке $2, при этом его надо предварительно вычислить по формулам.

Добавлено через 1 час 57 минут
Исправил мое решение относительно второго теста:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import re
from collections import deque
 
def get_refs(formula):
    return list(map(int, re.findall(r'(?<=\$)\d+', formula)))
 
cells = list(iter(input, '.'))
n = len(cells)
values = [None] * n
visited = [False] * n
for command in iter(input, '.'):
    tokens = command.split(maxsplit=1)
    operation = tokens[0][0]
    index = int(tokens[0][1:])
    if operation == '!':
        cells[index] = tokens[1]
    elif operation == '?':
        for i in range(n):
            if len(get_refs(cells[i])):
                values[i] = None
                visited[i] = False
            else:
                values[i] = eval(cells[i])
                visited[i] = True
        if values[index] is None: 
            deferred_calculations = [(index, cells[index])]
            queue = deque(get_refs(cells[index]))
            while len(queue):
                index = queue.popleft()
                if not visited[index]:
                    visited[index] = True
                    deferred_calculations.append((index, cells[index]))
                    for reference in get_refs(cells[index]):
                        queue.append(reference)
            for index, formula in reversed(deferred_calculations):
                values[index] = eval(re.sub('\$(\d+)', rf'values[\1]', formula))
        print(values[index])
Но все равно проходит не все тесты.

P. S. Не спрашивайте, что в остальных тестах: мне известны только первые два.
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,706
30.01.2022, 19:59
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
def calc( formula, formulas ):
    while '$' in formula:
        L, doll, R = formula.partition('$')
        i = len(R)
        while not R[:i].isdigit():
            i -= 1
        form_ind = int(R[:i])
        R = R[i:]
        formula = L + formulas[form_ind] + R
    return eval( formula )
#==============================================================================
def exec_commands(commands, formulas):
    for c in commands:
        match c[0]:
            case '!':
                L, sep, R = c.partition(' ')
                ind = int( L[1:] )
                formulas[ind] = R
            case '?':
                ind = int(c[1:])
                print( calc( formulas[ind], formulas ) )
#==============================================================================
formulas = []
commands = []
while True:
    f = input( 'формула: ' )
    if '.' in f:
        break
    formulas.append(f)
while True:
    c = input( 'команда: ' )
    if '.' in c:
        break
    commands.append(c)
exec_commands( commands, formulas )
0
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
30.01.2022, 22:08  [ТС]
idealist, не проходит тесты .
Например, этот:
Code
1
2
3
4
5
6
7
8
9
10
$1 + $2
1
$1 - 1 + 33 * $3
3
100 - $0
.
?4
!2 99
?4
.
Добавлено через 1 минуту
В выводе должно быть 0 и 0.
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,706
30.01.2022, 22:51
Цитата Сообщение от КулХацкеръ Посмотреть сообщение
не проходит тесты .
Например, этот:

Python
1
2
3
4
5
6
7
8
9
10
$1 + $2
1
$1 - 1 + 33 * $3
3
100 - $0
.
?4
!2 99
?4
.
Добавлено через 1 минуту
В выводе должно быть 0 и 0.
Да, скобки забыл.
Вот так вроде бы проходит:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
def calc( formula, formulas ):
    while '$' in formula:
        L, doll, R = formula.partition('$')
        i = len(R)
        while not R[:i].isdigit():
            i -= 1
        form_ind = int(R[:i])
        R = R[i:]
        formula = L +'(' + formulas[form_ind]+ ')' + R
    return eval( formula )
#==============================================================================
def exec_commands(commands, formulas):
    for c in commands:
        match c[0]:
            case '!':
                L, sep, R = c.partition(' ')
                ind = int( L[1:] )
                formulas[ind] = R
            case '?':
                ind = int(c[1:])
                print( calc( formulas[ind], formulas ) )
#==============================================================================
formulas = []
commands = []
while True:
    f = input( 'формула: ' )
    if '.' in f:
        break
    formulas.append(f)
while True:
    c = input( 'команда: ' )
    if '.' in c:
        break
    commands.append(c)
exec_commands( commands, formulas )
1
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
30.01.2022, 23:42  [ТС]
Не проходит по времени, видимо конструирование строк у тебя много времени отнимает.
Но все равно спасибо.

P. S. Задачу в конце концов решил.
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,706
31.01.2022, 00:54
Цитата Сообщение от КулХацкеръ Посмотреть сообщение
Не проходит по времени
Ну, за скорость я не заморачивался. Подозреваю, что это из-за кода в строках 4 - 6.
Думаю, что такой вариант будет побыстрее:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
def calc( formula, formulas ):
    while '$' in formula:
        L, doll, R = formula.partition('$')
        form_ind = 0
        if R.isdigit():
            form_ind = int(R)
            R = ''
        else:
            i = 0
            while i < len(R) and R[i].isdigit():
                i += 1
            form_ind = int(R[:i])
            R = R[i:]
        formula = L +'(' + formulas[form_ind] + ')' + R
    return eval( formula )
#==============================================================================
def exec_commands(commands, formulas):
    for c in commands:
        match c[0]:
            case '!':
                L, sep, R = c.partition(' ')
                ind = int( L[1:] )
                formulas[ind] = R
            case '?':
                ind = int(c[1:])
                print( calc( formulas[ind], formulas ) )
#==============================================================================
formulas = []
commands = []
while True:
    f = input( 'формула: ' )
    if '.' in f:
        break
    formulas.append(f)
while True:
    c = input( 'команда: ' )
    if '.' in c:
        break
    commands.append(c)
exec_commands( commands, formulas )
1
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
31.01.2022, 00:59  [ТС]
Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.01.2022, 00:59
Помогаю со студенческими работами здесь

Простой калькулятор
import sys from PyQt5.QtWidgets import QWidget, QLabel, QPushButton, QLineEdit, QApplication class Example(QWidget): def...

Простой калькулятор
Когда я указываю операцию которой нету оно пишет: результат 0, а я хочу вывести: неверная операция! a =...

Простой калькулятор
# калькулятор what = input( &quot;Что делаем? (+, -, *, /): &quot; ) a = float( input(&quot;Сколько 1 типа: &quot;) ) b = float(...

Простой калькулятор
У меня просьба к людям которые знают, как это можно доработать. Я пока-что только начинающий в python и хотел написать простой...

Простой же калькулятор
Шёл третий день изучения Пайтона. На лицо явное непонимание синтаксиса. В условиях: Напишите простой калькулятор, который считывает с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru