Munten uitrekenen in een bedrag

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Sietsko Bos

Sietsko Bos

13/10/2016 14:07:45
Quote Anchor link
Hoi ik ben met een script bezig en die moet ook uitrekenen welke munten er in een bedrag zitten.
Voorbeeld:

1.50 = 1 x 100 en 1 x 50
3.65 = 1 x 200 en 1 x 100 en 1 x 50 en 1 x 10 en 1 x 5
4.95 = 2 x 200 en 1 x 50 en 2 x 20 en 1 x 5

De gebruikte munten moeten dan opgeslagen worden in een array?

Er moeten dus weinig mogelijk munten gebruikt worden om het bedrag op 0 te krijgen.
Heeft iemand een idee hoe dit zou moeten?
 
PHP hulp

PHP hulp

08/11/2024 10:53:49
 
Thomas van den Heuvel

Thomas van den Heuvel

13/10/2016 14:36:11
Quote Anchor link
Dit lijkt mij gewoon een herhalende deling met rest?

Initieel is de rest gelijk aan het bedrag.

Herhaal
- Zoek de grootste valuta kleiner dan of gelijk aan de rest.
- Trek deze valuta (of een veelvoud) af van deze rest en onthoud hoeveel dit was.
Zolang de rest groter is dan (ongelijk is aan) 0.

Hierbij kun je ofwel aannemen dat het oorspronkelijke bedrag splitsbaar is of hier op controleren.
Gewijzigd op 13/10/2016 14:37:28 door Thomas van den Heuvel
 
Sietsko Bos

Sietsko Bos

13/10/2016 14:43:04
Quote Anchor link
Ik heb een poging gedaan en kwam hierop uit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        $reken_prijs = 480;
        
        $munten_array = array("200", "100", "50", "20", "10", "5");
        
        $teller = 1;
        
        do {
            
            if ($teller > 50) { exit; }
            
            foreach ($munten_array as $munt) {
                
                if ($munt < $reken_prijs) {
                    
                    $reken_prijs = $reken_prijs - $munt;
                    $gebruikte_munten = $gebruikte_munten . $munt."-";
                }
            }
            
            $teller++;
            
        } while ($reken_prijs == 0);


Dit geeft die dan als uitkomst:

200-100-50-20-10-5-5-

Hoe kan ik zorgen dat die weer begint aan het begin van de array want ga ervan uit dat het daar fout gaat?
Gewijzigd op 13/10/2016 14:43:32 door Sietsko Bos
 
- SanThe -

- SanThe -

13/10/2016 15:10:24
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$WisselBedrag
        = 1.95;
$EuroCenten            = array(10000,5000,2000,1000,500,200,100,50,20,10,5,2,1);
$MuntenArray        = array();

echo $WisselBedrag.'<br/><br/>';

$WisselBedrag *= 100;
foreach($EuroCenten as $key => $value)
{
    while($WisselBedrag >= $value)
    {
    $MuntenArray[$value] += 1;
        $WisselBedrag -= $value;
    }
}


foreach($MuntenArray as $key => $value)
{
    echo $value.' x '.number_format($key/100, 2, ',', '').'<br/>';
}

?>
 
Thomas van den Heuvel

Thomas van den Heuvel

13/10/2016 15:14:25
Quote Anchor link
Wat ontbreekt in bovenstaande oplossing is dat je meervouden van een hoeveelheid kunt hebben.

Je hoeft niet meerdere iteraties uit te voeren om eenzelfde bedrag meerdere keren af te trekken. In elke iteratie kun je zo'n veelvoud in één keer verwerken.

De oplossing voor 480 zou 2x200 + 1x50 + 1x20 + 1x10 moeten zijn lijkt mij.

Omdat je elke hoeveelheid maar 1x inspecteert zou je in principe kunnen volstaan met enkel een for-loop mits het beginbedrag een veelvoud is van (de som van) de beschikbare valutagroottes.

@SanThe: waarom die extra while? Dit kan ook met mod en div? En $MuntenArray[$value] wordt nergens geinitialiseerd?
Gewijzigd op 13/10/2016 15:17:06 door Thomas van den Heuvel
 
Sietsko Bos

Sietsko Bos

13/10/2016 15:26:45
Quote Anchor link
Het stukje script van @SanThe werkt goed.
Dank je.

Toevoeging op 14/10/2016 09:56:36:

@- SanThe -

Ik kwam nog iets tegen wat niet goed gaat, op prijzen als:

4.85
1.15

4.60 (geeft die ook aan als 4.6)

gaat het niet goed, misschien meer maar deze kwam ik tegen.
Zou je nog eens kunnen kijken hoe dit op te lossen is dat het wel goed gaat want verder werkt alles zoals ik graag wil.

Dit is uit de errorlog, en blijkbaar gaat het soms ook mis bij de 10?

Backend log: PHP Notice:

Undefined offset: 10
Undefined offset: 5

P.S.
aangepast: $EuroCenten = array(200,100,50,20,10,5);

Sietsko

Toevoeging op 14/10/2016 13:57:15:

Ik weet niet als het een nette manier is, maar ik heb het opgelost door het bedrag af te ronden naar boven

$WisselBedrag = round($WisselBedrag);

Blijkbaar gaat het dus ergens mis met het eraf halen van een bedrag.
Gewijzigd op 14/10/2016 10:12:10 door Sietsko Bos
 
Paul Ulje

Paul Ulje

15/10/2016 15:55:15
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$rBedrag = 99999.99;
$aMunt = [100000, 50000, 20000, 10000, 5000, 2000, 1000, 500, 200, 100, 50, 20, 10, 5, 2, 1];

$aResultaat = array();
$teller = $rBedrag * 100;
$i = 0;
$noemer = $aMunt[$i];

print "<br/>Bedrag van $rBedrag ontbinden in zijn muntwaarden<br/><br/>";
while ($teller > 0) {
    while ($teller < $aMunt[$i])
        $i++;
    $noemer = $aMunt[$i];
    $aResultaat[] = [$noemer / 100, floor($teller/$noemer)];
    $teller = $teller % $noemer;
}

foreach ($aResultaat as $row) {
    print "$row[0] : $row[1]<br/>";
}


Toevoeging op 16/10/2016 12:58:34:

Vraag aan Thomas:
"Dit kan ook met mod en div"

De modules operator MOD vind ik in PHP als "%".
Maar de divide operator DIV kan ik niet vinden.

In plaats daarvan wordt aangeraden de realdivide "/" (float in PHP) te gebruiken.
Dus om zeker te zijn van een integer als resultaat: floor($teller/$noemer).

Vraag is dus: hoe te DIV?
Gewijzigd op 15/10/2016 16:11:00 door Paul Ulje
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.