[ Príspevok: 1 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 01.07.21
Prihlásený: 01.07.21
Príspevky: 2
Témy: 1 | 1
NapísalOffline : 01.07.2021 14:56 | Uprava - Oprava Python kodu OOP

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()

'''


 [ Príspevok: 1 ] 


Uprava - Oprava Python kodu OOP



Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy.

úprava kodu

v Ostatné

0

708

09.03.2017 10:42

mio

V tomto fóre nie sú ďalšie neprečítané témy.

úprava kódu

v Backend

2

675

19.07.2012 15:40

elo

V tomto fóre nie sú ďalšie neprečítané témy.

Úprava kódu :)

v Frontend

0

785

12.07.2009 17:20

d0.0b

V tomto fóre nie sú ďalšie neprečítané témy.

GA uprava kodu

v Ostatné

0

394

27.02.2014 16:19

capricorn7

V tomto fóre nie sú ďalšie neprečítané témy.

Úprava html kódu

v Frontend

1

565

24.12.2017 17:34

BX

V tomto fóre nie sú ďalšie neprečítané témy.

oprava kodu.... pri vypisani znakov textu

v Backend

10

699

25.05.2010 23:15

Gregi555

V tomto fóre nie sú ďalšie neprečítané témy.

Úprava kódu, undefined variable

v Backend

7

538

06.03.2016 14:23

killer

V tomto fóre nie sú ďalšie neprečítané témy.

uprava kodu v iframe

v Frontend

11

617

18.08.2009 18:19

Unlink

V tomto fóre nie sú ďalšie neprečítané témy.

uprava kodu tabulky php

v Backend

0

634

25.11.2011 17:00

elo

V tomto fóre nie sú ďalšie neprečítané témy.

Uprava kodu pre vlozenie YouTube videa

v Frontend

4

789

31.03.2014 23:19

capricorn7

V tomto fóre nie sú ďalšie neprečítané témy.

OOP

v Backend

20

1504

29.02.2008 20:24

stenley

V tomto fóre nie sú ďalšie neprečítané témy.

Java OOP

v Backend

2

540

12.01.2018 14:33

camarovk19

V tomto fóre nie sú ďalšie neprečítané témy.

PHP OOP

v Backend

3

376

18.02.2013 7:20

DeiForm

V tomto fóre nie sú ďalšie neprečítané témy.

OOP PHP

v Backend

1

594

29.04.2010 17:32

stenley

V tomto fóre nie sú ďalšie neprečítané témy.

OOP, premenna

v Backend

1

692

26.10.2009 21:44

rooobertek

V tomto fóre nie sú ďalšie neprečítané témy.

OOP kniha

v Backend

3

646

02.12.2011 21:36

matwej



© 2005 - 2026 PCforum, edited by JanoF