| | |
| Stránka: 1 z 1
| [ Príspevok: 1 ] | |
Autor | Správa |
---|
Registrovaný: 01.07.21 Prihlásený: 01.07.21 Príspevky: 2 Témy: 1 | Napísal 8020: 01.07.2021 14:56 | |
|
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()
'''
|
|
| Stránka: 1 z 1
| [ Príspevok: 1 ] | |
Podobné témy | Témy | Odpovede | Zobrazenia | Posledný príspevok |
---|
| úprava kódu v PHP, ASP | 2 | 480 | 19.07.2012 15:40 elo | | úprava kodu v Ostatné | 0 | 465 | 09.03.2017 10:42 mio | | Úprava kódu :) v JavaScript, VBScript, Ajax | 0 | 525 | 12.07.2009 17:20 d0.0b | | Úprava html kódu v HTML, XHTML, XML, CSS | 1 | 433 | 24.12.2017 17:34 BX | | GA uprava kodu v Ostatné | 0 | 313 | 27.02.2014 16:19 capricorn7 | | oprava kodu.... pri vypisani znakov textu v Assembler, C, C++, Pascal, Java | 10 | 611 | 25.05.2010 23:15 Gregi555 | | uprava kodu v iframe v JavaScript, VBScript, Ajax | 11 | 524 | 18.08.2009 18:19 Unlink | | uprava kodu tabulky php v PHP, ASP | 0 | 529 | 25.11.2011 17:00 elo | | Úprava kódu, undefined variable v PHP, ASP | 7 | 454 | 06.03.2016 14:23 killer | | Uprava kodu pre vlozenie YouTube videa v HTML, XHTML, XML, CSS | 4 | 695 | 31.03.2014 23:19 capricorn7 | | OOP v PHP, ASP | 20 | 1378 | 29.02.2008 20:24 stenley | | PHP OOP v PHP, ASP | 3 | 290 | 18.02.2013 7:20 DeiForm | | OOP PHP v PHP, ASP | 1 | 487 | 29.04.2010 17:32 stenley | | OOP, premenna v PHP, ASP | 1 | 617 | 26.10.2009 21:44 rooobertek | | OOP kniha v Assembler, C, C++, Pascal, Java | 3 | 534 | 02.12.2011 21:36 matwej | | Java OOP v Assembler, C, C++, Pascal, Java | 2 | 428 | 12.01.2018 14:33 camarovk19 |
| Nemôžete zakladať nové témy v tomto fóre Nemôžete odpovedať na témy v tomto fóre Nemôžete upravovať svoje príspevky v tomto fóre Nemôžete mazať svoje príspevky v tomto fóre
|
|