MENÜ

Honlap címe

Előző - #36 Fordított karakterlánc | Tartalomjegyzék | Következő - #38 Random Shuffle

37. GYAKORLAT: CHANGE MAKER

makeChange(30)  →  {'quarters': 1, 'nickels': 1}

Az amerikai pénznemben 1 (penny), 5 (nikkel), 10 (dimes) és 25 cent (negyed) címletű érmék találhatók. Képzelje el, hogy egy pénztárgépet programozunk a megfelelő aprópénz kiadására. Ebben a gyakorlatban ki kell számítanunk az egyes érmék számát adott mennyiségű változáshoz.

Gyakorlat leírása

Írjon makeChange()függvényt összeg paraméterrel. A amount paraméter a módosítandó centek számának egész számát tartalmazza. Például 30a 30 centet, a 125 pedig 1,25 dollárt jelentene. Ennek a függvénynek egy szótárt kell visszaadnia kulcsokkal 'quarters', 'dimes' , 'nickels', és 'pennies' , ahol a kulcs értéke az ilyen típusú érme számának egész szám.

Az érme kulcsának értéke soha nem lehet 0. Ehelyett a kulcs ne legyen jelen a szótárban. Például a makeChange(5) a {'nickels': 1} értéket adja vissza, és nem a {'quarters': 0, 'dimes': 0, 'nickels': 1, 'pennies': 0} értéket .

Például makeChange(30)visszaadja a szótárt {'quarters': 1, 'nickels': 5} , amely a 30 centes váltáshoz használt érméket ábrázolja. A függvénynek a minimális számú érmét kell használnia. Például makeChange(10) vissza kell térnie {'dimes': 1}, nem pedig {'nickels': 2} , bár mindkettő 10 centet tesz ki.

Ezek a Python- assertutasítások leállítják a programot, ha feltételük False. Másolja őket a megoldási program aljára. Az Ön megoldása akkor helyes, ha a következő assertállítások feltételei mind igazak :

assert makeChange(30) == {'quarters': 1, 'nickels': 1}

assert makeChange(10) == {'dimes': 1}

assert makeChange(57) == {'quarters': 2, 'nickels': 1, 'pennies': 2}

assert makeChange(100) == {'quarters': 4}

assert makeChange(125) == {'quarters': 5}

Próbáljon megoldást írni a leírásban szereplő információk alapján. Ha továbbra is problémái vannak ennek a gyakorlatnak a megoldásával, további tippekért olvassa el a Megoldástervezés és a Különleges esetek és Gotchák című részt.

Előfeltétel fogalmak: modulo operátor, egész osztás

Megoldás tervezése

Először is, makeChange()a függvényünknek létre kell hoznia egy üres szótárt egy nevű változóban, change amely tárolja a visszaküldendő eredményeket. Ezután meg kell határoznunk az egyes érmetípusok mennyiségét, kezdve a legnagyobb címletektől (25 centes negyedek) a legkisebbekig (1 centes fillérekig). Így véletlenül sem használunk fel a minimálisnál több érmét, ha például meghatározzuk, hogy egy 10 centes helyett két 5 centes nikkelre van szükségünk.

Kezdjük a negyedekkel. Bármilyen számítás elvégzése előtt, ha a végrehajtandó változtatás mértéke kisebb, mint 25, akkor ezt a számítást teljesen kihagyhatjuk, mivel nulla negyed van. Ellenkező esetben, ha a végrehajtandó változtatás mértéke osztható 25-tel, mondjuk a amountparaméter értéke 125, akkor a negyedek számát úgy határozhatjuk meg, hogy elosztjuk amount-val 25: 125 / 25 kiértékeli -re 5.0.

Ha azonban nem osztható 25-tel, eredményünknek tört része lesz: 5,4-135 / 25 re értékeli ki . Változásunkhoz csak egész számokat adhatunk hozzá, 0,4 negyedet nem. Az egész osztás operátor használatával biztosíthatjuk, hogy csak egész számú érmét helyezzünk el a változásszótárunkba: mindkettő és 135 // 25 értékét .//125 // 255

A negyedévek által birtokolt pénzösszeg levonásához a 25 centes lépések eltávolítása után fennmaradó összeget állíthatjuk% be. A „maradék” szó arra utal, hogy a modulo operátort kell használnunk . Például, ha 135 centet kell cserélnünk, és 125 centhez 5 negyedet kell használnunk, akkor más érméket kell használnunk a 135% 25 vagy 10a fennmaradó centhez.

Ez kezeli a módosításhoz felhasznált negyedévek számának kiszámítását. Ezután másoljuk és illesszük be ezt a kódot, és módosítjuk a centeket, nikkeleket és filléreket (ebben a sorrendben). Amikor befejeztük a fillérek számának feldolgozását, a paraméter 0amount lesz , és a szótár minden érméből a megfelelő mennyiséget tartalmazza.change

Különleges esetek és Gotchák

Mivel ez a gyakorlat azt írja elő, hogy a változtatást a minimális számú érméből kell végrehajtani, egy adott pénzösszegre csak egy helyes válasz létezik. Ebben az algoritmusban a legfontosabb az, hogy az érméket a legnagyobbtól a legkisebbig számítsuk ki, különben olyan helyzetbe kerülünk, hogy mondjuk két nikkelt használunk egy fillér helyett.

Also, be sure to use the // integer division operator instead of the / division operator to calculate the number of coins. Python’s regular division operator evaluates to floating-point numbers, which may contain a fractional part. (Even if it doesn’t, Python still evaluates the result to a float: 125 / 25 evaluates to the float 5.0 and not the integer 5.) Integer division always evaluates to integers and doesn’t have this potential problem.

Because pennies represent 1 cent, you can set the number of pennies in change to whatever the amount parameter is at the end of the function as long as it is greater than zero.

Now try to write a solution based on the information in the previous sections. If you still have trouble solving this exercise, read the Solution Template section for additional hints.

Solution Template

Try to first write a solution from scratch. But if you have difficulty, you can use the following partial program as a starting place. Copy the following code from https://invpy.com/makechange-template.py and paste it into your code editor. Replace the underscores with code to make a working program:

def makeChange(amount):

    # Create a dictionary to keep track of how many of each coin:

    change = ____

 

    # If the amount is enough to add quarters, add them:

    if amount >= ____:

        change['quarters'] = amount // ____

        # Reduce the amount by the value of the quarters added:

        amount = amount % ____

    # If the amount is enough to add dimes, add them:

    if amount >= ____:

        change['dimes'] = ____ // ____

        # Reduce the amount by the value of the dimes added:

        amount = ____ % ____

    # If the amount is enough to add nickels, add them:

    if amount >= ____:

        change['nickels'] = ____ // ____

        # Reduce the amount by the value of the nickels added:

        amount = ____ % ____

    # If the amount is enough to add pennies, add them:

    if amount >= 1:

        change[____] = amount

 

    return change

The complete solution for this exercise is given in Appendix A and https://invpy.com/makechange.py. You can view each step of this program as it runs under a debugger at https://invpy.com/makechange-debug/.

Prev - #36 Reverse String | Table of Contents | Next - #38 Random Shuffle

 

Asztali nézet