Springen naar inhoud

[java] snoepautomaat


  • Log in om te kunnen reageren

#1

vncnt

    vncnt


  • 0 - 25 berichten
  • 5 berichten
  • Gebruiker

Geplaatst op 05 mei 2012 - 12:10

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:
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:
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!

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

Xenion

    Xenion


  • >1k berichten
  • 2606 berichten
  • Moderator

Geplaatst op 05 mei 2012 - 13:16

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:

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);
	}
}

#3

vncnt

    vncnt


  • 0 - 25 berichten
  • 5 berichten
  • Gebruiker

Geplaatst op 07 mei 2012 - 12:18

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:
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:
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 );
  }
}

#4

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 07 mei 2012 - 12:40

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:
if (voorwaarde)
statement 1
statement 2
gelijk is aan:
if (voorwaarde) {
	statement 1
}
statement 2

#5

vncnt

    vncnt


  • 0 - 25 berichten
  • 5 berichten
  • Gebruiker

Geplaatst op 07 mei 2012 - 13:37

Alle problemen zijn nu opgelost!! Bedankt!!
Zit alleen nog met het bijhouden van alle verkochte snoepjes enz..

Veranderd door vncnt, 07 mei 2012 - 13:47


#6

Xenion

    Xenion


  • >1k berichten
  • 2606 berichten
  • Moderator

Geplaatst op 07 mei 2012 - 17:41

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.

#7

vncnt

    vncnt


  • 0 - 25 berichten
  • 5 berichten
  • Gebruiker

Geplaatst op 07 mei 2012 - 18:53

Ja! Dat heb ik idd nog niet gedaan, maar daar ben ik nu mee bezig en heb al van alles gebrobeerd:
  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?

#8

Xenion

    Xenion


  • >1k berichten
  • 2606 berichten
  • Moderator

Geplaatst op 07 mei 2012 - 21:04

De fout die je maakt is de volgende:

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:
if( snoep.getCode() == code ){
    snoep.setVoorraad() = snoep.getVoorraad()-1;
}

#9

vncnt

    vncnt


  • 0 - 25 berichten
  • 5 berichten
  • Gebruiker

Geplaatst op 09 mei 2012 - 07:55

Bedankt iedereen!!
Ik ben nu helemaal klaar met de opdracht! :D

#10

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 09 mei 2012 - 08:05

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





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures