Ahojte,
rad by som sa spytal skusenejsich na moj kod.
Je funkcny avsak verzia 1) je napisana klasicky - proceduralno-funkcionalne a verzia 2) je prepisana do OOP
ale s OOP nemam vela skusenosti a velmi sa mi nezda, ze by to malo byt tak, ako som to napisal. Preto by som chcel poziadat skusenejsich, nech sa na to pozru a vytknu mi chyby, co by napisali inak a pod
a) nejako sa mi nezda ze by som mal mat tolko "self.var"
b) ako riadit beh programu?
bezne volam prvu funkciu a ta bud vola dalsiu a ta dalsiu alebo si vraciam cez return vysledok funkcie a cez if a rozne loopy riadim beh programu, no v OOP neviem ako sa to ma robit spravne
V1:
Kód:
'''
aplikacia rata vyuctovanie medzi kamaratmi po chate
zada sa pocet oslavujucich, a kto kolko platil (za co)
'''
def prerozdel_veritelov(veritelia):
dlznici_new = {}
veritelia_new = {}
for meno in veritelia.keys():
if veritelia[meno][1] > 0:
dlznici_new[meno] = veritelia[meno]
else:
veritelia_new[meno] = veritelia[meno]
return dlznici_new, veritelia_new
def zadaj_mena_sumy(i):
meno = input('Zadaj meno {} clena: '.format(i))
p_chyb = 2
while True:
if meno in mena_ludi.keys():
print('Toto meno bolo uz pouzite. Pouzi cislovku /{}{}/ alebo prezyvku'.format(meno, p_chyb))
p_chyb += 1
meno = input('Zadaj meno {} clena: '.format(i))
else:
break
suma = float(input('Zadaj sumu kolko {} zaplatil/a: '.format(meno)))
data = []
data.append(meno)
data.append(suma)
return data
pocet_ludi = int(input('Zadaj pocet ludi?: '))
mena_ludi = {}
for i in range(1, pocet_ludi+1):
#mena_ludi[data[0]][data[1]] = zadaj_mena_sumy(i)
data = zadaj_mena_sumy(i)
mena_ludi[data[0]] = data[1]
#print(mena_ludi)
print('\n{0}\nVYPLATENIE:\n{0}\n'.format('#'*25))
sucet = 0
for sumy in mena_ludi.values():
sucet = sucet + sumy
print('Celková cena výletu bola: {} €'.format(sucet))
na_hlavu = sucet / pocet_ludi
na_hlavu = round(na_hlavu, 2)
print('Každý by mal zaplatiť rovným dielom {} €'.format(na_hlavu))
na_vyradenie = []
dlznici = {}
veritelia = {}
for meno in mena_ludi.keys():
# tu treba porovnat kto platil najviac
# kto vsetko bude doplacat a komu
# edit:
# nebudem porovnavat, nema to az taky velky zmysel,
# rozdelim ludi na dlznikov a veritelov
# na nahodu vyberiem veritela ktoreho dlznici vyplatia ako prveho
if mena_ludi[meno] < na_hlavu:
doplatit = na_hlavu - mena_ludi[meno]
dlznici[meno] = [mena_ludi[meno], round(doplatit, 2)]
elif mena_ludi[meno] == na_hlavu:
doplatit = 0
#mena_ludi[meno] = {mena_ludi[meno] : round(doplatit, 2)}
# del mena_ludi[meno] ---> RuntimeError: dictionary changed size during iteration
# vyradit ho treba az po loope, preto si ho odlozim do listu na neskorsie vyradenie
na_vyradenie.append(meno)
else:
dostane = na_hlavu - mena_ludi[meno]
veritelia[meno] = [mena_ludi[meno], round(dostane, 2)]
#print(mena_ludi)
for i in range(len(na_vyradenie)):
print('Zo zoznamu vyraďujem {} lebo nikomu nič nie je dlžný ani nikto iný jemu. Je na nule.'.format(na_vyradenie[i]))
del mena_ludi[na_vyradenie[i]]
'''
print(dlznici)
print(veritelia)
print(len(veritelia))
'''
if len(dlznici) <= 0 or len(veritelia) <= 0:
print('Nikto nikomu nič nedlží, všetci ste vyrovnaní')
quit()
import random
nahodny_veritel, dana_suma = random.choice(list(veritelia.items()))
for meno in dlznici.keys():
print('{} --> {} sumu {} €'.format(meno, nahodny_veritel, round(dlznici[meno][1],2)))
veritelia[nahodny_veritel][1] = veritelia[nahodny_veritel][1] + dlznici[meno][1]
#print(veritelia)
for i in range(0, len(veritelia)):
dlznici, veritelia = prerozdel_veritelov(veritelia)
nahodny_veritel, dana_suma = random.choice(list(veritelia.items()))
for meno in dlznici.keys():
print('{} --> {} sumu {} €'.format(meno, nahodny_veritel, round(dlznici[meno][1],2)))
veritelia[nahodny_veritel][1] = veritelia[nahodny_veritel][1] + dlznici[meno][1]
print(dlznici)
print(veritelia)
V2 - OOP:
Kód:
import random
#from termcolor import colored
import os
# System call
os.system("")
# Class of different styles
class style():
BLACK = '\033[30m'
RED = '\033[31m'
CRED = '\033[91m'
GREEN = '\033[32m'
YELLOW = '\033[33m'
BLUE = '\033[34m'
MAGENTA = '\033[35m'
CYAN = '\033[36m'
WHITE = '\033[37m'
UNDERLINE = '\033[4m'
RESET = '\033[0m'
#print(style.YELLOW + "Hello, World!")
class Hlava:
def __init__(self, odpoved_meno, odpoved_suma):
self.odpoved_meno = odpoved_meno
self.odpoved_suma = odpoved_suma
def vypis(self):
print('{} {}'.format(self.odpoved_meno, self.odpoved_suma))
class Ucet:
def __init__(self):
self.sucet = 0
self.na_hlavu = 0
self.mena_ludi = {}
self.na_vyradenie = []
self.dlznici = {}
self.veritelia = {}
def vyrad(self):
for i in range(len(self.na_vyradenie)):
print('Zo zoznamu vyraďujem {} lebo nikomu nič nie je dlžný ani nikto iný jemu. Je na nule.'.format(self.na_vyradenie[i]))
del self.mena_ludi[self.na_vyradenie[i]]
def vyplat_veritelov(self):
nahodny_veritel, dana_suma = random.choice(list(self.veritelia.items()))
for meno in self.dlznici.keys():
print('{} --> {} sumu {} €'.format(meno, nahodny_veritel, round(self.dlznici[meno][1],2)))
self.veritelia[nahodny_veritel][1] += self.dlznici[meno][1] # najprv prirataj veritelovi sumu, az potom odrataj dlznikovi
# inak by si zmazal dlznikovi dlh a veritelovi by si priratal 0 (lebo dlznik uz nic nedlzi)
self.dlznici[meno][1] -= self.dlznici[meno][1] # zmaze mu evidovany dlh na nulu - len kvoli vizualnej kontrole inak nepotrebne
# v tomto momente vsetci dlznici vyplatili svoje dlhy nahodnemu veritelovi a mozu byt zmazani
# vizualna kontrola:
'''
print(f'Dlznici: {self.dlznici}')
print(f'Veritelia: {self.veritelia}')
'''
# PRASAREN
# neviem ako vytiahnut pocet zostavajucich veritelov mimo class
return len(self.veritelia)
def prerozdel_veritelov(self):
dlznici_new = {}
veritelia_new = {}
for meno in self.veritelia.keys():
if self.veritelia[meno][1] > 0:
dlznici_new[meno] = self.veritelia[meno]
else:
veritelia_new[meno] = self.veritelia[meno]
self.dlznici, self.veritelia = dlznici_new, veritelia_new
print('-'*25)
def rozdel(self):
for meno in self.mena_ludi.keys():
if self.mena_ludi[meno] < self.na_hlavu:
self.doplatit = self.na_hlavu - self.mena_ludi[meno]
self.dlznici[meno] = [self.mena_ludi[meno], round(self.doplatit, 2)]
elif self.mena_ludi[meno] == self.na_hlavu:
self.doplatit = 0
#mena_ludi[meno] = {mena_ludi[meno] : round(doplatit, 2)}
self.na_vyradenie.append(meno)
# del mena_ludi[meno] ---> RuntimeError: dictionary changed size during iteration
else:
self.dostane = self.na_hlavu - self.mena_ludi[meno]
self.veritelia[meno] = [self.mena_ludi[meno], round(self.dostane, 2)]
'''
print(f'Dlznici: {self.dlznici}')
print(f'Veritelia: {self.veritelia}')
'''
def over_meno(self, clovek, p):
if clovek.odpoved_meno in self.mena_ludi.keys():
p += 1
print('\033[91mToto meno už bolo použité. Skús prezývku alebo pridať číslicu ({}{})\033[0m'.format(clovek.odpoved_meno, p))
return False
def over_suma(self, clovek):
try:
suma_float = float(clovek.odpoved_suma)
except Exception as e:
print('\033[91mZadal si niečo divné {}, no nie je to číslo.\033[0m'.format(clovek.odpoved_suma))
return False
def pridaj(self, clovek):
self.mena_ludi[clovek.odpoved_meno] = clovek.odpoved_suma
'''
print(self.mena_ludi)
'''
def vysledny_pocet_ludi(self):
pass
def name(self):
pass
def rataj(self):
pocet_ludi = len(self.mena_ludi)
#sucet = 0
for sumy in self.mena_ludi.values():
self.sucet += sumy
self.na_hlavu = round(self.sucet / pocet_ludi, 2)
print('{}\nCelková cena výletu bola: {}€\nPriemer: {}€'.format('#'*25, self.sucet, self.na_hlavu))
ucet = Ucet()
print('Tento program slúži na rozpočítanie výdavkov za spoločný výlet.')
print('... pre ukoncenie zadavania a nasledny vypocet napis do mena "Q" ...')
p = 1
while True:
odpoved_meno = input('Zadajte meno osoby: ')
if odpoved_meno == 'Q':
break
# fake, aby som mohol spustit overenie
clovek = Hlava(odpoved_meno, 0)
# overim ci uz meno nebolo pouzite
hodnota_odpoved = ucet.over_meno(clovek, p)
if hodnota_odpoved == False:
del clovek
continue
while True:
odpoved_suma = input('Zadajte sumu koľko zaplatila osoba {}: '.format(odpoved_meno))
# fake, aby som mohol spustit overenie
clovek = Hlava(odpoved_meno, odpoved_suma)
# overim ci sa jedna o cislo skor ako to rozbehnem
hodnota_odpoved = ucet.over_suma(clovek)
if hodnota_odpoved == False:
del clovek
continue
break
odpoved_suma = float(odpoved_suma)
clovek = Hlava(odpoved_meno, odpoved_suma)
ucet.pridaj(clovek)
ucet.rataj()
ucet.rozdel()
ucet.vyrad()
zostatkovy_pocet = ucet.vyplat_veritelov()
#print(zostatkovy_pocet)
for i in range(zostatkovy_pocet):
ucet.prerozdel_veritelov()
ucet.vyplat_veritelov()
'''
if len(self.dlznici) <= 0 or len(self.veritelia) <= 0:
print('Nikto nikomu nič nedlží, všetci ste vyrovnaní')
quit()
'''