Prosty kalkulator w Pythonie, typy zmiennych

0

Witam.

Zacząłem naukę programowania i jako pierwszy język wybrałem Pythona. Próbuję napisać prosty kalkulator, który będzie wykrywał czy wprowadzone zostały odpowiednie dane, a mianowicie liczby. Natknąłem się jednak na problem. Pisząc warunek biorę pod uwagę, że jeśli osoba poda wartości liczbowe (liczby całkowite) to zostaną one uznane za wartości typu int jednak za każdym razem podane za pomocą polecenia input() wartości są traktowane od razu jako stringi. Konwertowanie ich nie ma sensu. Gdy użytkownik poda wartości int to program zadziała jednak gdy poda wartość str to wtedy nastąpi błąd braku możliwości konwersji stringa na integer. Kod wygląda tak:

a = (input ("PODAJ PIERWSZA WATOSC: "))
b = (input ("PODAJ DRUGA WARTOSC: "))

if type(a) == int and type(b) == int:
    x = (int(a) + int(b))
    print("SUMA = " + str(x))
    y = (int(a) - int(b))
    print("ROZNICA = " + str(y))
    z = (int(a) * int(b))
    print("ILOCZYN = " + str(z))
    v = (int(a) / int(b))
    print("ILORAZ = " + str(v))
else:
    print ("Podane wartości nie są liczbami!")

Czy Python zawsze nadaje typ str wartości wprowadzonej za pomocą polecenia input()? Jeżeli tak to w takim razie jak napisać program, który zweryfikuje czy użytkownik podaje odpowiednie dane?
Dziękuję za wyrozumiałość.

0

Możesz użyć funkcji pomocniczej:

def get_integer(prompt=""):
    while True:
        a = input(prompt)

        if a.isnumeric():
            break

    return int(a)

Wtedy zamiast a = input("Podaj...") używasz a = get_integer("Podaj ...")

Jak ta funkcja działa? Jest pętla teoretycznie nieskończona. W niej wczytujemy tekst i sprawdzamy, czy jest liczbą. Jeśli tak, to przerywamy pętlę i zwracamy liczbę jako int. W przeciwnym wypadku wczytujemy nowy tekst.

0

Na pierwsze pytanie odpowiedź znajdziesz w dokumentacji (przyzwyczaj się do zaglądania do niej):
https://docs.python.org/3/library/functions.html#input
Co do drugiego - nic sensownego nie przychodzi mi do głowy poza

if int(a) and int(b):

W razie nieliczbowej wartości rzuci wyjątkiem, który wypadałoby obsłużyć.
https://docs.python.org/3/tutorial/errors.html?highlight=errors

Edit:
Tego ifa olej i zrób na wyjątku (czyli nie if - else, a try - except ValueError (bez ostatniego członu też powinno ruszyć)

0

Zrobiłęś to bez pętli, to raczej bez sensu sprawdzać input, jak program i tak się zakończy. W pętli można spróbować z try catch:

while True:
    try:
        a = input("give my badziew1")
        b = input("give my badziew2")
        print("Suma badziewia = " + str(int(a) + int(b)))
        break
    except ValueError:
        print("give me badziew not string ")
        continue

To samo mozna też bez pętli, oczywiście:

try:
    a = input("give my badziew1")
    b = input("give my badziew2")
    print("Suma badziewia = " + str(int(a) + int(b)))
except ValueError:
    print("it was suppose to be a badziew, bye ")
0

@andijaw:
Tak mnie jeszcze naszło - dlaczego dałeś int, a nie float. Co w sytuacji gdy użytkownik będzie wpisze np. 2.74 oraz 6.63? Wykonane działania nie dadzą wówczas pożądanego wyniku.
Proponowałbym coś w tym stylu:

try:
  a = float((input ("PODAJ PIERWSZA WATOSC: "))) #można tutaj tego dokonać
  b = float((input ("PODAJ DRUGA WARTOSC: ")))
 
  print("SUMA = " + str(a+b))
  print("ROZNICA = " + str((a-b)))
  print("ILOCZYN = " + str(a*b))
  print("ILORAZ = " + str(a/b))
except ZeroDivisionError: #na wypadek gdyby użytkownik wpisał 0 jako drugą wartość
  print ("Przez zero nie dzielę!")
except ValueError:
    print ("Obie wartosci miały być liczbami!")
0

Dziękuję wszystkim za zainteresowanie. Widzę, że koncepcji jest wiele, a żadna nie ma nic wspólnego z moją czyli jeszcze dużo przede mną. Spróbuję przeanalizować podpowiedzi i stworzyć coś działającego. Co do pytania dlaczego użyłem int a nie float to dlatego, że na początku chciałem tylko uzyskać w jakikolwiek sposób reagowanie na wpisanie znaków innych niż cyfry i zarówno z int jak i float mi nie wychodziło. Potrafię napisać kod, który zadziała jeśli użytkownik poda całkowitą czy to zmiennoprzecinkową liczbę. Problem miałem właśnie z innymi znakami.

0
andijaw napisał(a):

Dziękuję wszystkim za zainteresowanie. Widzę, że koncepcji jest wiele, a żadna nie ma nic wspólnego z moją czyli jeszcze dużo przede mną. Spróbuję przeanalizować podpowiedzi i stworzyć coś działającego. Co do pytania dlaczego użyłem int a nie float to dlatego, że na początku chciałem tylko uzyskać w jakikolwiek sposób reagowanie na wpisanie znaków innych niż cyfry i zarówno z int jak i float mi nie wychodziło. Potrafię napisać kod, który zadziała jeśli użytkownik poda całkowitą czy to zmiennoprzecinkową liczbę. Problem miałem właśnie z innymi znakami.

Dziekuję, że Dziekujesz:). Ale na poważnie, pocieszę Cie, koncepcja kalkulatora jest jedna:), użytkownik wpisuje w konsoli, czy gui, string, np.:
3 * 5 + (9.9 / 4)
klika enter i wyświetla mu sie wynik.

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