Untitled

 avatar
unknown
python
2 years ago
2.6 kB
3
Indexable
from random import randint

kasa_fiskalna = {
    1: 0,2: 0, 5: 0, 10: 0, 20: 0, 50: 0, 100: 0, 200: 0, 500: 0, 1000:0, 2000: 0, 5000: 0, 10000: 0, 20000: 0, 50000: 0
}

# Losowe wygenerowanie stanu kasy. Dodanie do słownika dla pewnych kluczy losowych wartości
def generowanieStanuKasy():
    for klucz in kasa_fiskalna:
        klucz_nominal = int(klucz) / 100
        kasa_fiskalna[klucz] = int(input('Podaj ilość nominału %s [zł]:' % klucz_nominal)) 
        #kasa_fiskalna[klucz] = randint(0,20)

# Stworzenie listy z nominałami ze słownika który losowo wygenerował jakieś banknoty
def generowanieTablicyZNominalamiZeStanuKasy():
    tablicaNominalow = []
    for klucz, wartosc in kasa_fiskalna.items():
        tablicaNominalow.extend([klucz] * wartosc)
    return tablicaNominalow

# Podanie kwoty do zapłaty. Aktualizacja tablicy z nominałami. Wyliczenie reszty potrzebnej do wydania
def obliczSumeDoWydania(tablicaNominalow):
    kwotaDoZaplaty = int(float(input('Kwota do zapłaty w złotówkach (grosze podaj po przecinku): '))*100) # kwota do zapłaty zamieniona na grosze
    sumaZapłacona = 0
    print("Kwota do zapłaty: %s [gr] \n\n" % kwotaDoZaplaty)
    
    print("Rozpoczynam pobieranie banknotów od klienta: \n\n")
    while sumaZapłacona <= kwotaDoZaplaty:
        nominal = int(float(input('Podaj nominal w zł (w przypadku monet groszowych podaj je po przecinku):'))*100)
        
        if nominal not in kasa_fiskalna.keys():
            print("Nieprawidłowy nominał - podaj nominał ponownie")
            continue
        
        tablicaNominalow.append(nominal)
        sumaZapłacona += int(float(nominal))

    return tablicaNominalow, sumaZapłacona - kwotaDoZaplaty
  
# Dynamiczny algorytm wydawania monet
def wydajMonety(kwota, monety):
    listaPrzedzialu = [float('inf')] * (kwota + 1)
    listaPrzedzialu[0] = 0
    wybraneMonety = [[] for _ in range(kwota + 1)]

    for i in range(1, kwota + 1):
        for moneta in monety:
            if moneta <= i:
                if 1 + listaPrzedzialu[i - moneta] < listaPrzedzialu[i]:
                    listaPrzedzialu[i] = 1 + listaPrzedzialu[i - moneta]
                    wybraneMonety[i] = (wybraneMonety[i - moneta] + [moneta])
    return wybraneMonety[kwota]

       
generowanieStanuKasy()
tablicaNominalow = generowanieTablicyZNominalamiZeStanuKasy()
tablicaNominalow, reszta = obliczSumeDoWydania(tablicaNominalow)
wydane_monety = wydajMonety(reszta, tablicaNominalow)

print("Wydana reszta:", wydane_monety)
print("Niewydana reszta:", reszta - sum(wydane_monety))