Archief - [PROG] Java probleem

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Mithrandix

Legacy Member
juist begonne me java ma kzit al me een probleem,

het programma moet dus een bedrag lezen en dat dan omzetten in het aantal biljetten je ervoor terugkrijgt dus 520 geeft 1 biljet van 500 & 1 van 20
tprobleem zit em bij de muntstukke (denkk toch :p)

IO is een class bestand , leest gewoon de input :p

code:
Code:
public class Oef4
{
	public static void main (String [] args)
	{
		int bedrag, brief500, brief200, brief100, brief50, brief20, brief10, brief5, munt2, munt1, munt050, munt020, munt010, munt005, munt002, munt001;
		bedrag = IO.leesInt("Bedrag = ");
		brief500 = bedrag/500;
		bedrag = bedrag-(brief500*500);
		brief200 = bedrag/200;
		bedrag = bedrag-(brief200*200);
		brief100 = bedrag/100;
		bedrag = bedrag-(brief100*100);
		brief50 = bedrag/50;
		bedrag = bedrag-(brief50*50);
		brief20 = bedrag/20;
		bedrag = bedrag-(brief20*20);
		brief10 = bedrag/10;
		bedrag = bedrag-(brief10*10);
		brief5 = bedrag/5;
		bedrag = bedrag-(brief5*5);
		munt2 = bedrag/2;
		bedrag = bedrag-(munt2*2);
		munt1 = bedrag/1;
		bedrag = bedrag-(munt1*1);
		munt050 = bedrag/0.5;
		bedrag = bedrag-(munt050*0.5);
		munt020 = bedrag/0.2;
		bedrag = bedrag-(munt020*0.2);
		munt010 = bedrag/0.1;
		bedrag = bedrag-(munt010*0.1);
		munt005 = bedrag/0.05;
		bedrag = bedrag-(munt005*0.05);
		munt002 = bedrag/0.02;
		bedrag = bedrag-(munt002*0.02);
		munt001 = bedrag/0.01;
		System.out.println("Uw bedrag wordt uitbetaald in " + brief500 + " briefjes van 500, " + brief200 + " briefjes van 200, " + brief100 + " briefjes van 100, " + brief50 + " briefjes van 50, " + brief20 + " briefjes van 20, " + brief10 + " briefjes van 10, " + brief5 + " briefjes van 5.");
		System.out.println(munt2 + " munstukken van 2, " + munt1 + " muntstukken van 1, " + munt050 + " muntstukken van 0.50, " + munt020 + " muntstukken van 0.20, " + munt010 + " muntstukken van 0.10, " + munt005 + " muntstukken van 0.05, " + munt002 + " muntstukken van 0.02, " + munt001 + " muntstukken van 0.01.");
	}
}

Errors:

Code:
--------------------Configuration: <Default>--------------------
C:\Documents and Settings\Bram\Mijn documenten\BVP\Oef4.java:25: possible loss of precision
found   : double
required: int
                munt050 = bedrag/0.5;
                                ^
C:\Documents and Settings\Bram\Mijn documenten\BVP\Oef4.java:26: possible loss of precision
found   : double
required: int
                bedrag = bedrag-(munt050*0.5);
                               ^
C:\Documents and Settings\Bram\Mijn documenten\BVP\Oef4.java:27: possible loss of precision
found   : double
required: int
                munt020 = bedrag/0.2;
                                ^
C:\Documents and Settings\Bram\Mijn documenten\BVP\Oef4.java:28: possible loss of precision
found   : double
required: int
                bedrag = bedrag-(munt020*0.2);
                               ^
C:\Documents and Settings\Bram\Mijn documenten\BVP\Oef4.java:29: possible loss of precision
found   : double
required: int
                munt010 = bedrag/0.1;
                                ^
C:\Documents and Settings\Bram\Mijn documenten\BVP\Oef4.java:30: possible loss of precision
found   : double
required: int
                bedrag = bedrag-(munt010*0.1);
                               ^
C:\Documents and Settings\Bram\Mijn documenten\BVP\Oef4.java:31: possible loss of precision
found   : double
required: int
                munt005 = bedrag/0.05;
                                ^
C:\Documents and Settings\Bram\Mijn documenten\BVP\Oef4.java:32: possible loss of precision
found   : double
required: int
                bedrag = bedrag-(munt005*0.05);
                               ^
C:\Documents and Settings\Bram\Mijn documenten\BVP\Oef4.java:33: possible loss of precision
found   : double
required: int
                munt002 = bedrag/0.02;
                                ^
C:\Documents and Settings\Bram\Mijn documenten\BVP\Oef4.java:34: possible loss of precision
found   : double
required: int
                bedrag = bedrag-(munt002*0.02);
                               ^
C:\Documents and Settings\Bram\Mijn documenten\BVP\Oef4.java:35: possible loss of precision
found   : double
required: int
                munt001 = bedrag/0.01;
                                ^
11 errors

Process completed.

killgore

Legacy Member
ge deelt door een komma-getal (float) terwijl uw variabele een geheel getal is:

bv. ((float)bedrag)/0.5 is al "correcter"

maar ipc zijn dit geen fouten.

Kn0t

Legacy Member
Nee, het probleem is niet de deling "bedrag/0.5" op zich. Want daar gebeurt er numeric promotion, waardoor bedrag automatisch naar een double zal geconverteerd worden, alvorens de deling te doen.

Het probleem is dat je het resultaat van deze deling, wat dus een double zal hebben als datatype, wilt toekennen aan een variabele van het type integer. Hierdoor zou er informatie verloren kunnen gaan (alles na de komma), en daarom krijg je die error.

Als je het resultaat toch wilt toekennen aan een int, dan zal je expliciet moeten casten.

(int) (bedrag/0.5)

Mithrandix

Legacy Member
ok ik moest dus gewoon casten naar integer bedankt :applause:

forloRn_

Legacy Member
En als je 't mooi wilt maken, doe je het recursief en heb je maar een tiende van de code nodig.

Krueger

Legacy Member
forloRn_ zei:
En als je 't mooi wilt maken, doe je het recursief en heb je maar een tiende van de code nodig.
Hoe zou je die code recursief maken? Iteratief tot daar aan toe, maar recursief zie ik niet onmiddellijk.

MilM

Legacy Member
Krueger zei:
Hoe zou je die code recursief maken? Iteratief tot daar aan toe, maar recursief zie ik niet onmiddellijk.
Waarom zou da nie mogelijk zijn? :p
Je hebt een tabel waarin je uw munteenheden stopt.
Daarna een resursieve methode die de hoogste munteenheid neemt en dan het nieuwe bedrag recursief doorgeeft. (en de teller van de tabel incrementeert of decrementeert (afhankelijk van of u hoogste eenheid vanvoor of vanachteren zit) tot je bij positie 0 of positie lengte - 1 zit)

jodeman

Legacy Member
gewoon ne array met waarden en dan altijd volgende waarde in tabel nemen en delen tot het niet meer gaat ;).

Krueger

Legacy Member
MilM zei:
Waarom zou da nie mogelijk zijn? :p
Je hebt een tabel waarin je uw munteenheden stopt.
Daarna een resursieve methode die de hoogste munteenheid neemt en dan het nieuwe bedrag recursief doorgeeft. (en de teller van de tabel incrementeert of decrementeert (afhankelijk van of u hoogste eenheid vanvoor of vanachteren zit) tot je bij positie 0 of positie lengte - 1 zit)
Ik zeg niet dat het niet mogelijk is, ik zie het gewoon niet onmiddellijk :)
Het lijkt me iets dat makkelijker iteratief dan recursief op te lossen is.

Als je je geroepen voelt, mag je gerust een stukje pseudo-code schrijven hoor :)

(het ligt wel beetje aan mij hoor, ik heb recursieve methodes nooit als echt natuurlijk aangevoeld, het is een andere manier van denken, die niet zo vanzelfsprekend is vind ik)

MilM

Legacy Member
Krueger zei:
Ik zeg niet dat het niet mogelijk is, ik zie het gewoon niet onmiddellijk :)
Het lijkt me iets dat makkelijker iteratief dan recursief op te lossen is.

Als je je geroepen voelt, mag je gerust een stukje pseudo-code schrijven hoor :)

(het ligt wel beetje aan mij hoor, ik heb recursieve methodes nooit als echt natuurlijk aangevoeld, het is een andere manier van denken, die niet zo vanzelfsprekend is vind ik)
iteratief is hier idd gemakkelijker
maar iteratief en recursief liggen dicht bij elkaar

en in mijn uitleg staat toch een recursief voorbeeld? :p

Dus je hebt bv een methode met argumenten bedrag en index.
Die index haalt de grootte van het briefje uit de tabel en berekent hoeveel dit er zijn voor het bedrag.
En dan return je een string van "aantal briefjes 500 + (recursieve aanroep (overschot bedrag, volgende index))"

Pseudocode zou mss duidelijker zijn maar ik ben te lui :p
Mocht je nog nie mee zijn zal ik het eens in code schrijven
Maar dit kun je natuurlijk ook gewoon met een for lus doen ipv recursief.

Yngwie

Legacy Member
lijkt wel sterk op één van de eerste oefeningen uit het eerste jaar TI int rega precies

dJeez

Legacy Member
Je kan uiteraard ook het bedrag zelf promoveren naar het totaalbedrag in centen (* 100 dus) en vervolgens de logica omzetten en verder rekenen in centen. Dan heb je totaal geen typecasting nodig.

Anderzijds het lijkt mij ook vrij logisch dat je wisselgeld (bedrag) zelf al een floating point getal kan zijn, tenzij de opgave daar anders over oordeelde?

wlibaers

Legacy Member
OK, ik gebruik geen Java, en ik ken de Java standaard functies niet, maar als ik dit zie:
int bedrag (andere spullen)
bedrag = IO.leesInt("Bedrag = ");
Dan veronderstel ik dat je bedrag een int is. Het is me niet meteen duidelijk hoe je daaruit de centen gaat halen (tenzij het bedrag in centen staat, maar dan gebruik je overal in je code getallen die een factor 100 te klein zijn).

Floating point getallen gebruiken voor geld is trouwens geen goed idee, en ze zijn er ook niet voor bedoeld, en al evenmin nodig. Reken gewoon in cent, of gebruik BCD, of eender wat dat je in je taal hebt dat kommagetallen in het tiendelig stelsel exact kan voorstellen.

jodeman

Legacy Member
Code:
public class Change {
	public static void main(String[] args) {
		double values[] = { 500.0,200.0,100.0,50.0,20.0,10.0,5.0,2.0,1.0,0.5,0.2,0.1,0.05,0.02,0.01 };
		int amount[] = new int[values.length];
		
		double getal = 354131.21;
		
		int teller = 0;
		
		while (teller < values.length) {
			amount[teller] = (int) (getal / values[teller]);
			getal -= values[teller] * amount[teller];
			teller++;
		}
		
		for (int i = 0; i < amount.length; i++) {
			System.out.println("Bedrag " + values[i] + " komt " + amount[i] + " maal voor.");
		}
	}
}

Sorry alst nie perfect is ;), maar zoals gij het deed gebruikt ge beter een rekenmachine, das sneller :)

MilM

Legacy Member
wlibaers zei:
of gebruik BCD
Ik denk niet dat dat bestaat in java
Ik versta ook niet echt waarom hij BCD zou moeten gebruiken om dit te runnen ?
Dit is toch gewoon een voorstelling ?

edit: ik vermoed dat u bezig bent over zaken die buiten deze code vallen.
Ik weet ook niet precies wat bedrag = IO.leesInt("Bedrag = ") doet, maar gezien de aard van de oefening denk ik niet dat ze zich bezig moeten houden met de opslag van gegevens (en het lezen ervan dus)

ik vermoed dan eerder dat IO een klasse is die beschikbaar gesteld werd door de prof en daar een statische methode inzit die gewoon een int retourneert en dat hij dus gewoon de uitkomst op het scherm moet brengen.

Maw, dat hij zich niets moet aantrekken van interne voorstellingen van getallen.

Maar dan nog versta ik niet goed waarom hij BCD zou moeten gebruiken ipv gewone vaste komma :p

Mithrandix

Legacy Member
was eerste les java, da moet allemaal ni zo ingewikkeld zijn ze :p

Massis

Legacy Member
idd, da mag in de eerste les nog zonder for en while loopkes enzo :D

'k herinner me dees oefening nog (duh, is nog maar een goei half jaar geleden :p )

gewoon casten naar int en uw delingen doen volstaat hier denk'k wel

wlibaers

Legacy Member
MilM zei:
Ik denk niet dat dat bestaat in java
Ik versta ook niet echt waarom hij BCD zou moeten gebruiken om dit te runnen ?
Dit is toch gewoon een voorstelling ?

Om precies te zijn, een manier om in binaire opslag kommagetallen van het tiendelig stelsel exact te kunnen weergeven.

edit: ik vermoed dat u bezig bent over zaken die buiten deze code vallen.
Ik weet ook niet precies wat bedrag = IO.leesInt("Bedrag = ") doet, maar gezien de aard van de oefening denk ik niet dat ze zich bezig moeten houden met de opslag van gegevens (en het lezen ervan dus)

ik vermoed dan eerder dat IO een klasse is die beschikbaar gesteld werd door de prof en daar een statische methode inzit die gewoon een int retourneert en dat hij dus gewoon de uitkomst op het scherm moet brengen.

Maw, dat hij zich niets moet aantrekken van interne voorstellingen van getallen.

Wel indien die interne voorstelling geen kommagetallen toelaat, maar hij wel bezig is met pogingen om het deel achter de komma eruit te halen...

Maar dan nog versta ik niet goed waarom hij BCD zou moeten gebruiken ipv gewone vaste komma :p

Dat hangt af van het type vaste komma dat beschikbaar is. Sommige types slaan tiendelige kommagetallen niet exact op.

dJeez

Legacy Member
Mithrandix zei:
was eerste les java, da moet allemaal ni zo ingewikkeld zijn ze :p
Als het dan toch van een int moest starten (met het bedrag in EUR) moet je eens aan de prof vragen hoe je daar ooit wisselgeld in centen op kan teruggeven.

Kn0t

Legacy Member
Je zal inderdaad wel in centen moeten rekenen, ofwel met BigDecimals moeten werken indien je wil dat je programma juist werkt.

Laat het programma van Jodeman maar eens het wisselgeld voor 1.2 berekenen, en hij zal je slechts 1.19 teruggeven.

Oorzaak van het probleem is dat 1.2 - 1.0 niet 0.2 maar 0.19999999999999996 geeft.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan