vncnt
Artikelen: 0
Berichten: 5
Lid geworden op: za 05 mei 2012, 13:07

[java] snoepautomaat

Bereid je voor op een lang bericht...

Hallo allemaal,

Op school moet ik een PO maken met BlueJ.

Alleen kom ik er niet mee verder.. Dus ik vroeg me af of jullie me misschien kunnen helpen.

Voor die PO moet ik een snoepautomaat maken in BlueJ.

Met twee klassen: een klasse Snoepautomaat, en een klasse Snoep.

De snoepautomaat kan een lijst geven van alle soorten snoep waaruit je kan kiezen.

In die lijst staan de code van het snoep, de naam, de prijs en de voorraad.

Daarbij moet ik een methode koop maken en die geeft de prijs van het product dat je wilt kopen.



Alleen dan komt voor mij het lastigste (en dat is meteen ook het laatste wat ik nog moet doen):

Ik moet nu een methode betaal maken, dat aan al deze eisen moet voldoen:

- de automaat controleert het bedrag dat wordt ingevoerd: negatieve bedragen wordren geweigerd en leiden tot een melding op het scherm;

- de automaat controleert of de klant voldoende geld heeft ingeworpen. Na de inworp geeft de automaat een melding van het resterende bedrag dat nog betaald moet worden.

- het gevraagde snoep wordt alleen weergegeven (dmv een melding op het scherm), als er genoeg geld betaald is;

- een klant krijgt het geld dat hij teveel heeft betaald, terug.

- de automaat houdt bij hoeveel snoep er verkocht is zodat je aan het eind van de dag per soort kunt laten zien hoeveel er is verkocht en wat het totaalbedrag is, dat is betaald.



Ik heb al heel veel geprobeerd alleen kom ik er maar niet uit hoe het moet, ook omdat we op school erg weinig uitleg hebben gehad.

Zou iemand me kunnen helpen?

Hier zijn de codes van de 2 klassen:

Klasse Snoepautomaat:

Code: Selecteer alles


import java.util.*;

public class Snoepautomaat {

  private ArrayList<Snoep> lijst;

//hier definieer je de overige attributen

  

  // Constructor

  public Snoepautomaat() {

lijst = new ArrayList<Snoep>();

lijst.add( new Snoep( 11, "Mars", 1.50, 10 ) );

lijst.add( new Snoep( 12, "Twix", 1.50, 10 ) );

lijst.add( new Snoep( 13, "Snickers", 1.50, 10 ) );

lijst.add( new Snoep( 14, "Zoute Drop", 1.40, 10 ) );

lijst.add( new Snoep( 15, "Zoete Drop", 1.40, 10 ) );

  }

  public void voegtoe ( Snoep snoep ) {

 lijst.add( snoep );

  }

  

  public void print() {

System.out.println( "Snoeplijst: (betekenis kolommen: code, naam, prijs en voorraad" );

for( Snoep snoep : lijst ) {

System.out.println( snoep );

  }

  }

  public Snoep koop( int code ) {

  Snoep gezochteSnoep = null;

for( Snoep snoep : lijst ) {

if( snoep.getCode() == code )

gezochteSnoep = snoep;

}

  return gezochteSnoep;

  }

  

  public void betaal(double bedrag) {

  // hier ontvangt de automaat het geld van de klant

}

}

Klasse Snoep:

Code: Selecteer alles

public class Snoep

{

  private int code;

  private String naam;

  private double prijs;

  private int voorraad;

  

  public Snoep( int code, String naam, double prijs, int voorraad ) {

 this.code = code;

 this.naam = naam;

 this.prijs = prijs;

 this.voorraad = voorraad;

  }

  public int getCode() {

return code;

  }

  public double getPrijs() {

return prijs;

  }

  public String getNaam() {

return naam;

  }

public int getVoorraad() {

return voorraad;

  }

  public String toString() {

return String.format( "%4d", code ) + ": " +

   String.format( "%-40s", naam ) +

"€ " +

String.format( "%6.2f", prijs ) +

String.format( "%4d", voorraad );

  }

}



Heeft er iemand een oplossing voor mijn probleem??

Alvast bedankt!
Gebruikersavatar
Xenion
Artikelen: 0
Berichten: 2.609
Lid geworden op: za 21 jun 2008, 10:41

Re: [java] snoepautomaat

Om te beginnen heb ik even de naam van je topic aangepast, naar iets dat meer zegt dan 'Ik kan niet verder'.

Je bent al goed op weg, hier zijn een paar hints:

Je zou ergens moeten bijhouden hoeveel geld er is ingeworpen (variabele in automaat). In je betaal methode kan je dan die waarde aanpassen (controleer zeker dat er geen negatieve bedragen ingeworpen worden).

(Je kan ook nog een methode maken die al het ingeworpen geld teruggeeft.)

Je koop methode zou ik gewoon als void maken (geen return waarde).

Zet die output gewoon in print-statements. bv: "Je hebt niet genoeg geld ingeworpen.", "Je hebt <snoepnaam> gekocht.", "Je krijgt €x terug."

Je zoekt het snoep op aan de hand van de code, dat is al goed maar je moet daar dus wel nog controleren of er genoeg geld of evt teveel geld is ingeworpen.

Je moet ook nog ergens bijhouden hoeveel er van een bepaald snoep verkocht is. Het is vrij eenvoudig om dat bij te houden in de snoepklasse (net zoals je de voorraad daar bijhoudt).

Het zou helpen als je methodes had als voegToe(int snoepcode, int aantal) en verkoop(int snoepcode, int aantal) die dan de voorraad en het aantalverkocht op een gepaste manier aanpassen in het juiste Snoep object.

Je kan je automaat testen door een scenario te programmeren en dan te zien wat er gebeurt.

bv:

Code: Selecteer alles


class Test{

void main(){

// maak een nieuwe automaat aan en zorg dat er snoep inzit

SnoepAutomaat mijnAutomaat();

// programmeer hier een mogelijk scenario, bv:

mijnAutomaat.betaal(1.00);

mijnAutomaat.betaal(0.50);

mijnAutomaat.koop(11);

}

}

vncnt
Artikelen: 0
Berichten: 5
Lid geworden op: za 05 mei 2012, 13:07

Re: [java] snoepautomaat

Haaarrtelijk bedankt!! :)

Het heeft me heel wat verder geholpen! Het enige wat ik nog moet doen is het bijhouden van de hoeveelheid snoep dat er is verkocht en hoeveel geld er is opgebracht.

Heeft iemand daar nog tips voor?

Ik heb ondertussen ook twee andere problemen opgelopen:

- Het geld rond die af op €0.09999999999999987, is daar een oplossing voor? Ik zou graag willen dat het gewoon op €0.10 wordt afgerond.

- Als ik bij koop of bij betaal de code van bijv. de Mars invoer, geeft hij de gegevens van de Zoete Drop! Niet van de Mars! Zo is dat ook bij de Twix, Snickers en Zoute Drop, hij geeft de gegevens van de Zoete Drop! En daar vraag ik helemaal niet om!

Heeft iemand een oplossing voor deze problemen??

Klasse Snoepautomaat:

Code: Selecteer alles

import java.util.*;

public class Snoepautomaat {

  private ArrayList<Snoep> lijst;

  private String code;

  private String naam;

  private double prijs;

  private int voorraad;

  private double bedrag;

  //hier definieer je de overige attributen

   

  // Constructor

  public Snoepautomaat() {

    lijst = new ArrayList<Snoep>();

    lijst.add( new Snoep( "A11", "Mars", 1.50, 10 ) );

    lijst.add( new Snoep( "A12", "Twix", 1.50, 10 ) );

    lijst.add( new Snoep( "A13", "Snickers", 1.50, 10 ) );

    lijst.add( new Snoep( "A14", "Zoute Drop", 1.40, 10 ) );

    lijst.add( new Snoep( "A15", "Zoete Drop", 1.40, 10 ) );

  }

 

  public void voegtoe ( Snoep snoep ) {

    lijst.add( snoep );

  }

   

  public void print() {

    System.out.println( "Snoeplijst: (betekenis kolommen: code, naam, prijs en voorraad)" );

    for( Snoep snoep : lijst ) {

  System.out.println( snoep );

    }

  }

 

  public void koop( String code ) {

    Snoep gezochteSnoep = null;

    for( Snoep snoep : lijst ) {

  if( snoep.getCode() == code )

  gezochteSnoep = snoep;

  prijs = snoep.getPrijs();

  naam = snoep.getNaam();

  voorraad = snoep.getVoorraad();

    }

    if ( voorraad <= 0 ){

  System.out.printf( "U hebt gekozen voor %1s", naam );

  System.out.printf( ", die kost € %1f", prijs );

  System.out.print( ". Alleen jammer genoeg is dit snoepje niet meer op voorraad..." );	 

    }

    else {

  if ( voorraad > 0 ){

    System.out.printf( "U hebt gekozen voor %1s", naam );

    System.out.printf( ", die kost € %1f", prijs );

    System.out.printf( " en is nog %1d", voorraad );

    System.out.print( "x aanwezig." );

  }

    }

  }

 

  public void betaal( double bedrag, String code ) {

 Snoep gezochteSnoep = null;

 for( Snoep snoep : lijst ) {

  if( snoep.getCode() == code )

  gezochteSnoep = snoep;

  prijs = snoep.getPrijs();

  naam = snoep.getNaam();

  voorraad = snoep.getVoorraad();

    }

 if ( bedrag < 0 )

 System.out.println("FOUTMELDING: Negatief Bedrag!!");

 else {

 if ( bedrag < prijs ){

 System.out.print( "Uw moet nog €" );

 System.out.print( prijs - bedrag );

 System.out.print( " betalen." );

 }

 if ( bedrag > prijs ){

 System.out.print( "Hier is uw wisselgeld: €" );

 System.out.print( bedrag - prijs );

    }   

 if ( bedrag == prijs ){

 System.out.print( "Gefeliciteerd!! Uw " );

 System.out.print( naam );

 System.out.print( " valt nu uit de snoepautomaat!" );

    }

    }

  }

}

Klasse Snoep:

Code: Selecteer alles

public class Snoep

{

  private String code;

  private String naam;

  private double prijs;

  private int voorraad;

   

  public Snoep( String code, String naam, double prijs, int voorraad ) {

 this.code = code;

 this.naam = naam;

 this.prijs = prijs;

 this.voorraad = voorraad;

  }

 

  public String getCode() {

    return code;

  }

 

  public double getPrijs() {

    return prijs;

  }

 

  public String getNaam() {

    return naam;

  }

 

    public int getVoorraad() {

    return voorraad;

  }

 

  public String toString() {

    return String.format( "%4s", code ) + ": " +

   String.format( "%-40s", naam ) +

    "€ " +

    String.format( "%5f", prijs ) +

    String.format( "%6d", voorraad );

  }

}

EvilBro
Artikelen: 0
Berichten: 7.081
Lid geworden op: vr 30 dec 2005, 09:45

Re: [java] snoepautomaat

Het geld rond die af op €0.09999999999999987, is daar een oplossing voor? Ik zou graag willen dat het gewoon op €0.10 wordt afgerond.
Je zou alle bedragen in centen kunnen bewaren. Dan heb je nooit afrondproblemen.
Als ik bij koop of bij betaal de code van bijv. de Mars invoer, geeft hij de gegevens van de Zoete Drop! Niet van de Mars! Zo is dat ook bij de Twix, Snickers en Zoute Drop, hij geeft de gegevens van de Zoete Drop! En daar vraag ik helemaal niet om!
Heb je een debugger waarmee je stap voor stap door de code kan? Verder moet je even bedenken dat het volgende:

Code: Selecteer alles


if (voorwaarde)

statement 1

statement 2

gelijk is aan:

Code: Selecteer alles


if (voorwaarde) {

statement 1

}

statement 2

vncnt
Artikelen: 0
Berichten: 5
Lid geworden op: za 05 mei 2012, 13:07

Re: [java] snoepautomaat

Alle problemen zijn nu opgelost!! Bedankt!!

Zit alleen nog met het bijhouden van alle verkochte snoepjes enz..
Gebruikersavatar
Xenion
Artikelen: 0
Berichten: 2.609
Lid geworden op: za 21 jun 2008, 10:41

Re: [java] snoepautomaat

Misschien lees ik er over, maar ik zie zo direct niet dat de voorraad verminderd wordt als er een snoepje verkocht wordt? Zo raakt je automaat nooit leeg.

Als je in snoep ook een variabele 'verkocht' maakt, dan kan je deze gewoon verhogen telkens een snoepje gekocht wordt. Op dezelfde manier als je 'voorraad' vermindert.
vncnt
Artikelen: 0
Berichten: 5
Lid geworden op: za 05 mei 2012, 13:07

Re: [java] snoepautomaat

Ja! Dat heb ik idd nog niet gedaan, maar daar ben ik nu mee bezig en heb al van alles gebrobeerd:

Code: Selecteer alles


  public void betaal( int bedrag, String code ) {

	 Snoep gezochteSnoep = null;

	 for( Snoep snoep : lijst ){

	  if( snoep.getCode() == code ){

	    gezochteSnoep = snoep;

	    prijs = snoep.getPrijs();

	    naam = snoep.getNaam();

	    voorraad = snoep.getVoorraad();

	  }

    }

	 if ( bedrag < 0 ){

	 System.out.println("FOUTMELDING: Negatief Bedrag!!");

	 }

	 else {

	 if ( bedrag < prijs ){

		 System.out.print( "FOUTMELDING: Uw moet nog " );

		 System.out.print( prijs - bedrag );

		 System.out.print( " cent betalen." );

	 }

	 if ( bedrag > prijs ){

		 System.out.print( "Gefeliciteerd!! Uw " );

		 System.out.print( naam );

		 System.out.println( " valt nu uit de snoepautomaat!" );

		 System.out.print( "En u krijgt " );

		 System.out.print( bedrag - prijs );

		 System.out.print( " cent terug." );

		 //Hier wou ik het dan neerzetten, ik heb nu al een aantal dingen geprobeerd zoals:

//voorraad = voorraad - 1

//verkocht = verkocht + 1



//voorraad = (int)(voorraad - 1)

//verkocht = (int)(verkocht + 1)

	 }

	 if ( bedrag == prijs ){

		 System.out.print( "Gefeliciteerd!! Uw " );

		 System.out.print( naam );

		 System.out.print( " valt nu uit de snoepautomaat!" );

		 //En hier wou ik het dan ook neerzetten.	 }	

    }

  }



In de code heb ik een aantal dingen aangegeven wat ik wou proberen, alleen dat werkte allemaal niet!

Als ik naar mijn print scherm kijk voordat ik dit uitvoer, is die precies hetzelfde als ik na het uitvoeren erop kijk!

Waarschijnlijk maakt ik een hele domme fout of denk ik te makkelijk, maar heeft iemand een idee hoe dit wel zou kunnen werken?
Gebruikersavatar
Xenion
Artikelen: 0
Berichten: 2.609
Lid geworden op: za 21 jun 2008, 10:41

Re: [java] snoepautomaat

De fout die je maakt is de volgende:

Code: Selecteer alles


for( Snoep snoep : lijst ){

  if( snoep.getCode() == code ){

    gezochteSnoep = snoep;

    prijs = snoep.getPrijs();

    naam = snoep.getNaam();

    voorraad = snoep.getVoorraad();

  }

Hier loop je door alle snoep in je automaat en wanneer je het juiste gevonden hebt vraag je daar alle attributen van op.

Wat er nu gebeurt is dat die waarden gekopieerd worden naar de globale variabelen die je gebruikt. Als je dan later de globale variabele gaat aanpassen, wordt die aanpassing niet doorgevoerd in het snoep object.

Je moet iets doen zoals hier:

Code: Selecteer alles


if( snoep.getCode() == code ){

    snoep.setVoorraad() = snoep.getVoorraad()-1;

}

vncnt
Artikelen: 0
Berichten: 5
Lid geworden op: za 05 mei 2012, 13:07

Re: [java] snoepautomaat

Bedankt iedereen!!

Ik ben nu helemaal klaar met de opdracht! :D
EvilBro
Artikelen: 0
Berichten: 7.081
Lid geworden op: vr 30 dec 2005, 09:45

Re: [java] snoepautomaat

Wat gebeurt er als je een code probeert te kopen die niet bestaat?

Terug naar “Informatica en programmeren”