-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtask6a.py
More file actions
234 lines (186 loc) · 6.63 KB
/
task6a.py
File metadata and controls
234 lines (186 loc) · 6.63 KB
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
# -*- coding: utf-8 -*-
"""
Created on Sun Jan 13 21:35:49 2019
@author: Ola
Python challenge by kodolamacz.pl
Task 6: Exceptions in mathematical expressions
"""
from abc import ABC, abstractmethod
import math
class Wezel(ABC):
@abstractmethod
def nazwa(self):
pass
@abstractmethod
def oblicz_wartosc(self):
pass
def informacje(self):
print(f"Wynikiem operacji {self.nazwa()} jest wartosc {self.oblicz_wartosc()} \n")
class Wartosc(Wezel):
def __init__(self, czynnik):
self.czynnik = czynnik
def nazwa(self):
return "wartosc"
def oblicz_wartosc(self):
return float(self.czynnik)
class Suma(Wezel):
def __init__(self, czynnik1, czynnik2):
self.czynnik1 = czynnik1.oblicz_wartosc()
self.czynnik2 = czynnik2.oblicz_wartosc()
def nazwa(self):
return "sumowania"
def oblicz_wartosc(self):
return self.czynnik1 + self.czynnik2
def informacje(self):
print(f"Liczby do operacji matematycznej: {self.czynnik1}, {self.czynnik2}")
super().informacje()
class Roznica(Wezel):
def __init__(self, czynnik1, czynnik2):
self.czynnik1 = czynnik1.oblicz_wartosc()
self.czynnik2 = czynnik2.oblicz_wartosc()
def nazwa(self):
return "odejmowania"
def oblicz_wartosc(self):
return self.czynnik1 - self.czynnik2
def informacje(self):
print(f"Liczby do operacji matematycznej: {self.czynnik1}, {self.czynnik2}")
super().informacje()
class Iloczyn(Wezel):
def __init__(self, czynnik1, czynnik2):
self.czynnik1 = czynnik1.oblicz_wartosc()
self.czynnik2 = czynnik2.oblicz_wartosc()
def nazwa(self):
return "mnozenia"
def oblicz_wartosc(self):
return self.czynnik1*self.czynnik2
def informacje(self):
print(f"Liczby do operacji matematycznej: {self.czynnik1}, {self.czynnik2}")
super().informacje()
class Iloraz(Wezel):
def __init__(self, czynnik1, czynnik2):
self.czynnik1 = czynnik1.oblicz_wartosc()
if czynnik2.oblicz_wartosc == 0:
raise ZeroDivisionError("Dzielnik jest zerem. Nie mozna zrealizowac operacji.")
else:
self.czynnik2 = czynnik2.oblicz_wartosc()
def nazwa(self):
return "dzielenia"
def oblicz_wartosc(self):
return self.czynnik1/self.czynnik2
def informacje(self):
print(f"Liczby do operacji matematycznej: {self.czynnik1}, {self.czynnik2}")
super().informacje()
class Silnia(Wezel):
def __init__(self, czynnik):
if czynnik.oblicz_wartosc() < 0:
raise ValueError("Operacja silni nie moze zostac wykonana na liczbach mniejszych od zera.")
else:
self.czynnik = czynnik.oblicz_wartosc()
def nazwa(self):
return "silni"
def oblicz_wartosc(self):
return math.factorial(self.czynnik)
def informacje(self):
print(f"Liczby do operacji matematycznej: {self.czynnik}")
super().informacje()
class Ulamek:
def __init__(self, licznik, mianownik):
self.licznik = licznik
if mianownik == 0:
raise ZeroDivisionError("Nie mozna utworzyc ulamka o mianowniku 0.")
else:
self.mianownik = mianownik
def __repr__(self):
return f'{self.licznik}/{self.mianownik}'
def skroc(self):
if self.licznik == 0:
self.mianownik = 1
else:
#Poszukiwanie najwiekszego wspolnego mianownika metoda Euklidesa
a = max(self.licznik, self.mianownik)
b = min(self.licznik, self.mianownik)
c = a - b
lista = [a, b, c]
while c!=0:
lista.sort()
c = lista[1]-lista[0]
lista.append(c)
nwd = lista[0]
self.licznik //= nwd
self.mianownik //= nwd
return self
@staticmethod
def dodaj(ulamek1, ulamek2):
return Ulamek(ulamek1.licznik * ulamek2.mianownik + ulamek2.licznik*ulamek1.mianownik, ulamek1.mianownik*ulamek2.mianownik)
@staticmethod
def odejmij(ulamek1, ulamek2):
return Ulamek(ulamek1.licznik * ulamek2.mianownik - ulamek2.licznik*ulamek1.mianownik, ulamek1.mianownik*ulamek2.mianownik)
@staticmethod
def mnoz(ulamek1, ulamek2):
return Ulamek(ulamek1.licznik*ulamek2.licznik, ulamek1.mianownik*ulamek2.mianownik)
@staticmethod
def dziel(ulamek1, ulamek2):
if ulamek2.licznik == 0:
raise ZeroDivisionError("Dzielnik jest rowny zero. Nie mozna zrealizowac operacji.")
return Ulamek(ulamek1.licznik*ulamek2.mianownik, ulamek1.mianownik*ulamek2.licznik)
def calculator():
decision = "t"
while decision=="t":
# Show the calculator's instruction
print("Podaj w oddzielnych wierszach liczbę, operację matematyczną: +,-,*,/,%, następnie kolejną liczbę:")
# Get the inout data
try:
number1 = float(input())
operator = input()
number2 = float(input())
except ValueError:
print("Zamiast liczby podano inny znak")
break
# Interpretation of the operator
if operator is "+":
wynik = number1 + number2
elif operator is "-":
wynik = number1 - number2
elif operator is "*":
wynik = number1 * number2
elif operator is "/":
try:
wynik = number1 / number2
except ZeroDivisionError:
print("Nie mozna wykonac dzielenia przez zero")
break
elif operator is "%":
try:
wynik = number1 % number2
except ZeroDivisionError:
print("Nie mozna wykonac operacji modulo przez zero")
break
# Print the result
print("Twój wynik to: ", wynik)
# End or continue the calculations?
print("Chcesz wynikać kolejne działanie? Wpisz literę t lub n.")
decision = input()
if decision=="t":
continue
elif decision=="n":
break
if __name__ == "__main__":
liczba1 = Wartosc(-1)
liczba2 = Wartosc(2)
suma = Suma(liczba1, liczba2)
suma.informacje()
roznica = Roznica(liczba1, liczba2)
roznica.informacje()
iloczyn = Iloczyn(liczba1, liczba2)
iloczyn.informacje()
iloraz = Iloraz(liczba1, liczba2)
iloraz.informacje()
silnia = Silnia(liczba1)
silnia.informacje()
# ulamek = Ulamek(0, 5)
# ulamek.skroc()
# print(ulamek)
# zly_ulamek = Ulamek(2, 3)
# print(zly_ulamek)
# Ulamek.dziel(zly_ulamek, ulamek)
# calculator()