[Python] Błąd prostego skryptu


(MacGregor) #1
#Sprzedawca samochodu
#Program dodaje do wczytanej ceny samochodu szereg dodatkowych opłat

print("Podaj cenę samochodu a program podliczy wszystkie dodatkowe koszty")

cena_samochodu = int(input("Podaj cenę samochodu. "))
podatek = "23"
oplata_rejestracyjna = "12"
prowizja = "400"
dostawa = "600"
suma = cena_samochodu * podatek / 100 + cena_samochodu * oplata_rejestracyjna / 100 + prowizja + dostawa

print("Podatek wynosi: ", podatek + "%" \
"\nOpłata rejestracyjna: ", oplata_rejestracyjna + "%" \
"\nProwizja: ", prowizja + "zł" \
"\nDostawa: ", dostawa + "zł" \
"\n\nSuma: ", suma )

Zacząłem zabawę z tym językiem. Jednak próbując uruchomić ten skrypt otrzymuję błędy. Próbowałem wiele rozwiązań ale już nie mam na to żadnego pomysłu. Czekam na jakieś rady.


(Kamatori) #2

Nie dziwne że masz błędy skoro: 

  1. Wykonujesz operacje matematyczne na stringach

  2. Próbujesz wklejać inta do stringa. 

Masz dwa rozwiązania: 

  1. Albo formatujesz wszystkie inty do stringów (co jest niewygodne i nie polecane)

 

#Sprzedawca samochodu
#Program dodaje do wczytanej ceny samochodu szereg dodatkowych opłat
print("Podaj cenę samochodu a program podliczy wszystkie dodatkowe koszty")
cena_samochodu = int(input("Podaj cenę samochodu. "))
podatek = 23
oplata_rejestracyjna = 12
prowizja = 400
dostawa = 600
suma = cena_samochodu * podatek / 100 + cena_samochodu * oplata_rejestracyjna / 100 + prowizja + dostawa
print("Podatek wynosi: ", str(podatek) + "%" \
"\nOpłata rejestracyjna: ", str(oplata_rejestracyjna) + "%" \
"\nProwizja: ", str(prowizja) + "zł" \
"\nDostawa: ", str(dostawa) + "zł" \
"\n\nSuma: ", str(suma) )

2) Albo używasz typowego formatowania:

#Sprzedawca samochodu
#Program dodaje do wczytanej ceny samochodu szereg dodatkowych opłat
print("Podaj cenę samochodu a program podliczy wszystkie dodatkowe koszty")
cena_samochodu = int(input("Podaj cenę samochodu. "))
podatek = 23
oplata_rejestracyjna = 12
prowizja = 400
dostawa = 600
suma = cena_samochodu * podatek / 100 + cena_samochodu * oplata_rejestracyjna / 100 + prowizja + dostawa
print("Podatek wynosi: {0} %" \
"\nOpłata rejestracyjna: {1} %" \
"\nProwizja: {2} zł" \
"\nDostawa: {3} zł" \
"\n\nSuma: {4}".format(podatek, oplata_rejestracyjna, prowizja, dostawa, suma) )

 


(nintyfan) #3

Mógłbyś też napisać, o którą wersję Pythona Ci chodzi. O ile znawca to rozszyfruje z kodu źródłowego, to ktoś mniej obeznany może pomyśleć, że chodzi o Python2, który wciąż jest w użyciu.


(MacGregor) #4

Jest to python 3 (dokładnie 3.5)

@Kamatori Mógłbyś mi jakoś szybko wyjaśnić w jaki sposób odwołałeś się do zmiennych za pomocą liczb i co to ten “int”, “string”? Dopiero zaczynam przygodę z Pythonem a w książce jeszcze nie było wzmianki o tym o czym ty wspomniałeś :wink:


(nintyfan) #5

Python ma twarde typowanie, co oznacza, że zmienne nie są automatycznie konwertowane.

W matematyce możesz dodać liczbę rzeczywistą i całkowita i otrzymasz wynik. W programowaniu nie zawsze tak jest - przedtem musisz jedną zmienną zamienić na typ drugiej, a typ docelowy jest zależny od oczekiwanego rezultatu.

 

Jeżeli w wyniku chcesz otrzymać liczbę całkowitą(ang. integer, czyli int), a masz liczbę całkowitą i ciąg znaków, to musisz ciąg znaków zamienić na liczbę. Jeżeli chcesz coś dokleić do liczby, czyli żeby powstał ciąg znaków, to musisz liczbę zamienić na string(str). Mała dygresja. By dokleić cyfrę do liczby, czyli przemnożyć razy 10 i dodać cyfrę, to robisz: liczba = liczba * 10 + cyfra, a jeżeli cyfra jest znakiem, to liczba = liczba * 10 + int(cyfra).

 

Dlaczego tak to wygląda? W komputerze liczby nie są przechowywane w postaci tekstów, poza paroma wyjątkami. Są przechowywane w komórkach pamięci, jako liczby. Natomiast tekst też jest przechowywany w postaci liczby, z tą jednak różnicą, że np. by móc zapisać dowolnie długą liczbę poszczególne cyfry są kodowane, a więc następuje dzielenie przez 10 liczby i do reszty jest dodawany matematycznie kod cyfry 0. Następna cyfra jest zapisywana na pozycji o jeden w prawo. Tak się zamienia int na string. Oczywiście napis Ala ma kota też jest zapisywany w postaci ciągu liczb, ale znak ‘A’ nie jest z zakresu ‘0’ … ‘9’. To tak w skrócie.


(MacGregor) #6

Sądziłem że chodzi o konwersje łańcuchów na liczby i odwrotnie jednak nie umiałem tego zaimplementować. Dzięki za obszerne wyjaśnienie. Jeszcze tylko pasuje dowiedzieć się jak to działa w drugim przykładzie bo jest to o niebo lepsze rozwiązanie.


(Kamatori) #7

Bardzo prosto. W Pythonie2 żeby sformatować stringa dawało się:

wynik = 123
print "Twój wynik to: %s" % wynik
--> "Twój wynik to 123"

W Pythonie3 zmieniono zapis z % na formułkę .format o której możesz poczytać tutaj: https://pyformat.info/

Takie formatowanie stringa jest o wiele lepsze niż stosowanie +, ponieważ nigdy nie musisz myśleć nad typem swojej zmiennej. 

 

 


(MacGregor) #8

Dzięki za pomoc i wyjaśnienie jak uprościć sobie formatowanie. Mam tylko jeszcze jedno pytanie. Jak to jest z tym odwołaniem do zmiennych w postaci liczb? Jest to po prostu numer do danej zmiennej utworzonej w programie, czy są do tego jakieś dodatkowe reguły?


(nintyfan) #9

Zmienne liczbowe są oczywiście obiektami, jednak ich wartości są kopiowane. W Pythonie da się zaimplementować takie rzeczy - czy ma wartość zostać skopiowana, a może utworzona ma zostać referencja.