Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/103: Рейтинг темы: голосов - 103, средняя оценка - 5.00
19 / 5 / 1
Регистрация: 28.03.2015
Сообщений: 74

Задача: создать программу-кальулятор

21.03.2019, 19:41. Показов 19722. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть задача:
Создайте программу-калькулятор, которая поддерживает четыре операции: сложение, вычитание, умножение, деление. Все данные должны вводиться в цикле, пока пользователь не укажет, что хочет завершить выполнение программы. Каждая операция должна быть реализована в виде отдельной функции. Функция деления должна проверять данные на корректность и выдавать сообщение об ошибке в случае попытки деления на ноль.

Помогите пожалуйста НЕ решить данную задачу, а понять, что я делаю не так и разъяснить это
Я понимаю, что всё это можно сделать через глобальные переменные (но я этого еще не проходил) поэтому нужно обойтись без них чисто через функции

Например я хочу создать тот же калькулятор, но на одну операцию сложения

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
def main(a, b, operation):
 
    a = float(input('Введите первое число: '))
    b = float(input('Введите второе число: '))
    operation = input('Введите знак операции: ')
    return a, b, operation
 
def operation_plus(a, b, operation):
    if operation == '+':
        rezult = a + b
        print(rezult)
 
main(a, b, operation)
operation_plus(a, b, operation)
выдает ошибку
Traceback (most recent call last):
File "Z:/Project python/test.py", line 13, in <module>
main(a, b, operation)
NameError: name 'a' is not defined


Я же назначил аргументы этим переменным в функции main, я запутался, помогите кто-нибудь более подробно разъясните мне, весь интернет перерыл, чтобы понять, везде про тему функции пишут одно и то же, не совсем то, чего бы мне хотелось узнать
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.03.2019, 19:41
Ответы с готовыми решениями:

КАЛЬУЛЯТОР
Здравствуйте, помогите пожалуйста с написанием калькулятора выполняющего простые операции (+,-,*,/,=), ибо сам языка не знаю, а могу только...

Одностроковый кальулятор!
Киньте пожалуйста код однострокового калькулятора с подробными пояснениями//комментариями! Не могу найти нигде понятный код, заранее...

задача: создать программу работающую с базой данных
Помогите советом plz. Передо мной стоит задача создать программу работающую с базой данных, а именно чтобы конечный пользователь мог из...

14
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
21.03.2019, 19:54
Цитата Сообщение от bozzly Посмотреть сообщение
main(a, b, operation)
а что, собственно, за значения в этих переменных Вы передаёте?
0
19 / 5 / 1
Регистрация: 28.03.2015
Сообщений: 74
21.03.2019, 19:57  [ТС]
Ну я обращаюсь к этой функции, где значения вводятся с клавиатуры и возвращаются в эту функцию
0
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
21.03.2019, 20:08
bozzly, вы не ответили на вопрос.
Какие значения хранятся в переменных, что передаются в функцию main?

Добавлено через 45 секунд
Цитата Сообщение от bozzly Посмотреть сообщение
Ну я обращаюсь к этой функции, где значения вводятся с клавиатуры и возвращаются в эту функцию
набор слов.
0
19 / 5 / 1
Регистрация: 28.03.2015
Сообщений: 74
21.03.2019, 20:18  [ТС]
Я понял, что из-за того, что нету значений этих переменных, у меня выскакивает данная ошибка
Но я просто не знаю, как по другому вызвать функцию,
Если я напишу просто main(), у меня тоже будет ошибка, т.к. я не написал никаких аргументов, а как быть я даже не представляю
0
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
21.03.2019, 20:18
Лучший ответ Сообщение было отмечено bozzly как решение

Решение

bozzly, так лучше?
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
def main():
    a = float(input('Введите первое число: '))
    b = float(input('Введите второе число: '))
    operation = input('Введите знак операции: ')
    return a, b, operation
 
def operation_plus(a, b, operation):
    if operation == '+':
        rezult = a + b
        print(rezult)
 
a, b, operation = main()
operation_plus(a, b, operation)
1
19 / 5 / 1
Регистрация: 28.03.2015
Сообщений: 74
21.03.2019, 20:22  [ТС]
Цитата Сообщение от m0nte-cr1st0 Посмотреть сообщение
bozzly, так лучше?
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
def main():
    a = float(input('Введите первое число: '))
    b = float(input('Введите второе число: '))
    operation = input('Введите знак операции: ')
    return a, b, operation
 
def operation_plus(a, b, operation):
    if operation == '+':
        rezult = a + b
        print(rezult)
 
a, b, operation = main()
operation_plus(a, b, operation)

"a, b, operation = main()" - этой строкой мы передаем аргументы функции main?
Не совсем понимаю, почему функция main без аргументов
Python
1
def main():
0
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
21.03.2019, 20:28
Цитата Сообщение от bozzly Посмотреть сообщение
"a, b, operation = main()" - этой строкой мы передаем аргументы функции main?
этой строкой мы присваиваем переменным это
Цитата Сообщение от bozzly Посмотреть сообщение
значения вводятся с клавиатуры и возвращаются в эту функцию
Цитата Сообщение от bozzly Посмотреть сообщение
Не совсем понимаю, почему функция main без аргументов
а вы в неё передаёте какие-то параметры, чтобы записывать её с аргументами?
0
19 / 5 / 1
Регистрация: 28.03.2015
Сообщений: 74
21.03.2019, 20:40  [ТС]
Цитата Сообщение от m0nte-cr1st0 Посмотреть сообщение
этой строкой мы присваиваем переменным это



а вы в неё передаёте какие-то параметры, чтобы записывать её с аргументами?
Нет, я просто думал, что я присвоил значения функции main(), которые человек бы вводил с клавиатуры
и с помощью return вернул бы эти значения в эти переменные
И уже обращаясь к функции, думал эти значения можно достать оттуда
НО теперь я понял, что
имея функция например main(a, b, operation)
можно просто присвоить им значения типа main(a=20, b=30, operation = "+")
0
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
21.03.2019, 21:00
Цитата Сообщение от bozzly Посмотреть сообщение
main(a=20, b=30, operation = "+")
можно. если в этом есть смысл (в данном случае - нет).
1
19 / 5 / 1
Регистрация: 28.03.2015
Сообщений: 74
21.03.2019, 21:11  [ТС]
Немного поразбиравшись, немного поняв суть, сделал вот так
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
def main():
    while True:
        a = float(input('Введите первое число: '))
 
        if a:
            b = float(input('Введите второе число: '))
 
            if b:
                operation = input('Введите знак операции: ')
 
                if operation == '+':
                    operation_plus(a, b, operation)
 
                elif operation == '-':
                    operatin_minus(a, b, operation)
 
                else:
                    print('Вы не указали знак операции')
            else:
                print('Вы не указали число')
 
        else:
            print('Вы не указали число')
 
def operation_plus(a, b, operation):
    if operation == '+':
        rezult = a + b
        print(a, '+', b, '=', rezult)
 
def operatin_minus(a, b, operation):
    if operation == '-':
        rezult = a - b
        print('{} - {} = {}'.format(a, b, rezult))
main()
0
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
21.03.2019, 21:46
Цитата Сообщение от bozzly Посмотреть сообщение
if a:
это зачем? у вас а в любом случае будет, если вы, конечно, не закроете программу. Тут не нужны эти проверки. Нужны разве что if/elif, rогда знак операции вводите.
Цитата Сообщение от bozzly Посмотреть сообщение
if operation == '+':
эти проверки тоже не нужны. Вы их в функции main() сделали ведь.
0
19 / 5 / 1
Регистрация: 28.03.2015
Сообщений: 74
21.03.2019, 22:51  [ТС]
Цитата Сообщение от m0nte-cr1st0 Посмотреть сообщение
это зачем? у вас а в любом случае будет, если вы, конечно, не закроете программу. Тут не нужны эти проверки. Нужны разве что if/elif, rогда знак операции вводите.

эти проверки тоже не нужны. Вы их в функции main() сделали ведь.
На счет проверки совпадения операции, да, увидел потом
А на счет проверки if a:
хотел добиться того, что если число не было введено, чтобы перенаправлялось на else
Но почему-то мне выдает ошибку
0
Эксперт Pascal/Delphi
 Аватар для droider
4888 / 2822 / 865
Регистрация: 04.10.2012
Сообщений: 10,264
22.03.2019, 11:33
bozzly,

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
def operation_plus(a, b):
    return a + b
 
def operation_minus(a, b):
    return a - b
 
def operation_proizvedenie(a, b):
    return a * b
 
def operation_delenie(a, b):
    return a / b
 
 
print('Ноль в качестве знака операции завершит работу программы')
while True:
    oper = input('Введите знак операции (+,-,*,/): ')
    if oper == '0': break
    if oper in ('+','-','*','/'):
        x = float(input('Введите 1-е число x = '))
        y = float(input('Введите 2-е число y = '))
    if oper == '+':
        print('Сумма =  %.2f' % operation_plus(x, y))
    elif oper == '-':
        print('Разность =  %.2f' % operation_minus(x, y))
    elif oper == '*':
        print('Произведение =  %.2f' % operation_proizvedenie(x, y))
    elif oper == '/':
            if y != 0:
                print('Деление =  %.2f' % operation_delenie(x, y))
            else:
                print('Деление на ноль.')
    else:
        print('Вы ввели неверный знак операции!')
1
0 / 0 / 0
Регистрация: 18.02.2014
Сообщений: 12
14.06.2022, 13:52
Столкнулся с аналогичной задачей, и варианты предложенные в этой теме и на других форумах мне не понравились. Если кратко, то:
- предложенные решения работают только с integer (или float), а по хорошему должны воспринимать оба типа;
- логика не совсем соответствует обычному калькулятору. Мы вводим 'n' значений, а потом выбираем операцию. По хорошему мы должны ввести первое значение 'a', потом задать операцию, а потом ввести значение 'b'. После этого выполняется указанная операция, и ее значение возвращается переменной 'a' и выводится пользователю. Потом запрос операции и нового значения 'b', и так до бесконечности или до ввода '=' (пока пользователь не укажет, что хочет завершить выполнение программы).

В итоге набросал такой код:
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import operator
a = None
oper = None
ops = {
    '+': operator.add,
    '-': operator.sub,
    '*': operator.mul,
    '/': operator.truediv
}
 
def calc(a, oper):
    global answer
    try:
        b = input(': ')
        try:
            int(b)
            b = int(b)
        except ValueError:
            try:
                float(b)
                b = float(b)
            except ValueError:
                print('Error')
        if b == 0 and oper == '/':
            print('Division by zero')
            answer = 'Error'
        else:
            answer = ops[oper](a, b)
    except ValueError:
        raise Warning('Error')
    print(answer, ' ', end='')
 
while oper != '=':
    if a == None:
        a = input(': ')
        try:
            int(a)
            a = int(a)
        except ValueError:
            try:
                float(a)
                a = float(a)
            except ValueError:
                print('Error')
    else:
        a = answer
        if a == 'Error':
            break
    try:
        oper = input('operation: ')
        if oper == '=':
            break
        elif oper == 'c':
            a = None
        elif oper in ('+','-','*','/'):
            calc(a, oper)
        else:
            print('Error, try again')
    except ValueError:
        raise Warning('Error')
Что-то слегка намудрил с while, но в целом работает. Дальше можно оптимизировать и приводить в красивый вид.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.06.2022, 13:52
Помогаю со студенческими работами здесь

Задача: создать программу, подключающуюся к прокси с именем пользователя и паролем и создающую виртуальное прямое соединение с интернетом
Язык С++. Какие нужны библиотеки, команды. Желательно сворачивание в трей, горячие клавиши.

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

Надо создать программу на языке паскаль турбо или абц серавно задача такова нужно к буквам прикреплены цифры Т это 1 М это 4 и что б программа выполня
Надо создать программу на языке паскаль турбо или абц серавно задача такова нужно к буквам прикреплены цифры Т это 1 М это 4 и что б...

Создать программу,которая находит минимальное из 3х чисел. Для нахождения минимального числа создать функцию
Создать функцию - double mini (double a, double b, double c), где a,b,c - задание числа. Спасибо за помощь!

Создать программу, в которой можно создать папку
Всем привет, Подскажите плиз как можно осуществить такое: 1. Есть форма1. 2. В ней мы можем создать какой-то объект с принадлежащей...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
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