Obsah fóra
PravidláRegistrovaťPrihlásenie




Odpovedať na tému [ 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
Príspevok NapísalOffline : 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()

'''


Odpovedať na tému [ Príspevok: 1 ] 


Podobné témy

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

v PHP, ASP

2

480

19.07.2012 15:40

elo Zobrazenie posledných príspevkov

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

v Ostatné

0

465

09.03.2017 10:42

mio Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Úprava kódu :)

v JavaScript, VBScript, Ajax

0

525

12.07.2009 17:20

d0.0b Zobrazenie posledných príspevkov

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

v HTML, XHTML, XML, CSS

1

433

24.12.2017 17:34

BX Zobrazenie posledných príspevkov

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

v Ostatné

0

313

27.02.2014 16:19

capricorn7 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. oprava kodu.... pri vypisani znakov textu

v Assembler, C, C++, Pascal, Java

10

611

25.05.2010 23:15

Gregi555 Zobrazenie posledných príspevkov

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

v JavaScript, VBScript, Ajax

11

524

18.08.2009 18:19

Unlink Zobrazenie posledných príspevkov

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

v PHP, ASP

0

529

25.11.2011 17:00

elo Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Úprava kódu, undefined variable

v PHP, ASP

7

454

06.03.2016 14:23

killer Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Uprava kodu pre vlozenie YouTube videa

v HTML, XHTML, XML, CSS

4

695

31.03.2014 23:19

capricorn7 Zobrazenie posledných príspevkov

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

v PHP, ASP

20

1378

29.02.2008 20:24

stenley Zobrazenie posledných príspevkov

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

v PHP, ASP

3

290

18.02.2013 7:20

DeiForm Zobrazenie posledných príspevkov

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

v PHP, ASP

1

487

29.04.2010 17:32

stenley Zobrazenie posledných príspevkov

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

v PHP, ASP

1

617

26.10.2009 21:44

rooobertek Zobrazenie posledných príspevkov

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

v Assembler, C, C++, Pascal, Java

3

534

02.12.2011 21:36

matwej Zobrazenie posledných príspevkov

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

v Assembler, C, C++, Pascal, Java

2

428

12.01.2018 14:33

camarovk19 Zobrazenie posledných príspevkov


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

Skočiť na:  

Powered by phpBB Jarvis © 2005 - 2024 PCforum, webhosting by WebSupport, secured by GeoTrust, edited by JanoF
Ako väčšina webových stránok aj my používame cookies. Zotrvaním na webovej stránke súhlasíte, že ich môžeme používať.
Všeobecné podmienky, spracovanie osobných údajov a pravidlá fóra