Prosty kalkulator w Pythonie, typy zmiennych

Prosty kalkulator w Pythonie, typy zmiennych
andijaw
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: NML
  • Postów: 23
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:

Kopiuj
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ść.

JA
  • Rejestracja: dni
  • Ostatnio: dni
0

Możesz użyć funkcji pomocniczej:

Kopiuj
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.

SE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 318
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

Kopiuj
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ć)

lion137
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5025
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:

Kopiuj
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:

Kopiuj
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 ")
SE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 318
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:

Kopiuj
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!")
andijaw
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: NML
  • Postów: 23
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.

lion137
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5025
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.