Błąd z kalkulatorem

0

Mam problem z kalkulatorem. Po podaniu ilości składników i działania, jakie chcę wykonać, nie dziej się nic:

# Zadanie kalkulator

# Dodawanie
def add(x, y, *args):
    return x + y 
# Odejmowanie

def subtract(x, y, *args):
    return x - y
# Mnożenie

def multiply(x, y, *args):
    return x * y
# Dzielenie

def divide(x, y, *args):
    return x / y


def get_data():
    choice = input("Wybierz działanie(1/2/3/4): ")
    x = float(input("Podaj składnik 1: "))
    y = float(input("Podaj składnik 2: "))
    args = []
    if choice in "13":
        while True:
            num = input("Podaj kolejną liczbę lub q aby wyjść: ")
            if num  == 'q':
                break
            args.append(float(num))
    
    return x, y, args, choice, 

print("Podaj działanie, posługując się odpowiednią liczbą:")
print("1.Dodawanie")
print("2.Odejmowanie")
print("3.Mnożenie")
print("4.Dzielenie")

operations = {
    '1': add,
    '2': subtract,
    '3': multiply,
    '4': divide,
}



x, y, args, choice = get_data()
result = operations[choice](x, y, *args)

Efekt po podaniu dwóch liczb i chęci dodawania jest taki:

Podaj działanie, posługując się odpowiednią liczbą:
1.Dodawanie
2.Odejmowanie
3.Mnożenie
4.Dzielenie
Wybierz działanie(1/2/3/4): 1
Podaj składnik 1: 5
Podaj składnik 2: 5
Podaj kolejną liczbę lub q aby wyjść: q

Program nie liczy podanych liczb

Czego nie ma, czego nie widzę co powinno być aby to działało? Pozdrawiam

1

No wypisania na ekran nie ma.

1

Jak wyżej, a oprócz tego pełno bugów:) Nie zabezpieczasz się przed podaniem błędnego działania, co powoduje na końcu KeyError, ta pętla w środku funkcji get_data jest bezsensowna, bo funkcje i tak olewają *args. "Podaj kolejną liczbę lub q aby wyjść" WTF? Biedny user:)
Jak Chcesz zastosować operatory do więcej niż jednego elementu, to jakieś reduce, albo pętla.

from functools import reduce
import operator
def apply_operator(oper, *args):
    return reduce(oper, args)
    
apply_operator(operator.add, 1, 2, 3, 4)  # -> 10
0

@lion137: Generalnie to są moje początki i ja zrobiłem działający kalkulator, na dodatek moim zdaniem całkiem prosty:

# Zadanie kalkulator

# Dodawanie
def add(x, y):
    return x + y
# Odejmowanie

def subtract(x, y):
    return x - y
# Mnożenie

def multiply(x, y):
    return x * y
# Dzielenie

def divide(x, y):
    return x / y


print("Podaj działanie, posługując się odpowiednią liczbą:")
print("1.Dodawanie")
print("2.Odejmowanie")
print("3.Mnożenie")
print("4.Dzielenie")

while True:
    # Take input from the user
    choice = input("Wybierz działanie(1/2/3/4): ")

    # Check if choice is one of the four options
    if choice in ('1', '2', '3', '4'):
        num1 = float(input("Podaj składnik 1: "))
        num2 = float(input("Podaj składnik 2: "))

        if choice == '1':
            print(num1, "+", num2, "=", "Wynik to", add(num1, num2))

        elif choice == '2':
            print(num1, "-", num2, "=", "Wynik to", subtract(num1, num2))

        elif choice == '3':
            print(num1, "*", num2, "=", "Wynik to", multiply(num1, num2))

        elif choice == '4':
            print(num1, "/", num2, "=", "Wynik to", divide(num1, num2))
        break
    else:
        print("Błąd")

Na razie zakładamy, że wpisujący wie co ma wpisać i błędów nie będzie. Kalkulator jest ok ale ktoś sobie ubzdurał żeby zrobić więcej niż dwa składniki, i wyszło to co na górze łącznie z tym get_data. Trochę tego nie ogarniam bo cały kod jest dla mnie trochę zbyt przekombinowany w stosunku do tego co sam napisałem

0

Nie jest przekombinowany, tylko błędny, można go naprawić na tyle, że będzie działać, zabezpiecxzenie przed KeyError dalej do zrobienia.

import operator
from functools import reduce
# Dodawanie
def add(numbers):
    return reduce(operator.add, numbers) 
# Odejmowanie

def subtract(x, y, *args):
    return x - y
# Mnożenie

def multiply(x, y, *args):
    return x * y
# Dzielenie

def divide(x, y, *args):
    return x / y

def get_data():
    choice = input("Wybierz działanie(1/2/3/4): ")
    args = []
    if choice in "13":
        while True:
            num = input("Podaj kolejną liczbę lub q aby wyjść: ")
            if num  == 'q':
                break
            args.append(float(num))
    return args, choice

print("Podaj działanie, posługując się odpowiednią liczbą:")
print("1.Dodawanie")
print("2.Odejmowanie")
print("3.Mnożenie")
print("4.Dzielenie")

operations = {
    '1': add,
    '2': subtract,
    '3': multiply,
    '4': divide,
}

numbers, choice = get_data()
result = operations[choice](numbers)
print(result)
0

@lion137: dziękować dobry człowieku

1 użytkowników online, w tym zalogowanych: 0, gości: 1