Archief - [PROG]JAVA vraagske over opdracht (simpele maar geen uitleg gekregen).

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.

Pieke

Legacy Member
Heb sinds dit jaar programmeerlessen maar de uitleg laat te wensen over tijdens de lessen. Er wordt amper iets van uitleg gezegd vindt ik, enkel als je vragen stelt bij oefeningen dan leggen ze het wel uit ><

hebben domme opdracht gekregen maar de helft van de oefening hebben we nog niet gezien denk ik. Dus als iemand een beetje kan programmere in java, i need help (weet dat er van jullie dat kunnen)

opdracht:
Maak een klasse Euro overeenkomstig volgend klassediagram:
(wat onderlijnd is daar staat gewoon lijn onder in klassediagram)

Euro
int euro
int eurocent
Euro()
Euro(int euro)
Euro(int euro,int euroCent)

getEuro()
getEuroCent()

setEuro(int Euro)
setEuroCent(int EuroCent)

addEuro(Euro bedrag)
subtractEuro(Euro bedrag)

equals(Euro euro)


print()

wat er in het rood staat snap ik niet wat de bedoeling is (de rest wel en dat is in orde maja das ook zo simpel als wat xd)
want ik dacht dat als je Euro bedrag doet dat je Euro van dat type was (dus van die klasse) maar wat er hier mee bedoelt wordt is mij een raadsel :(
vermoed dat add is om iets toe te voegen en subtract om af te trekken (wat wel lukt met gewoon int bedrag, heb het proberee typecaste naar int lukt me niet (weet niet goed hoe dat moet enkel van double naar int kan ik en omgekeerd :) ).
en die equals dacht ik dat dat was om Strings te vergelijken maar ik heb geen strings :s


dank bij voorbaat :)

Tyfius

Legacy Member
Je gaat hier een kopie van een Euro object meegeven.

Dus wat die addEuro (en anderen) gaan doen is het huidige Euro object vergelijken met een 2de. Even eenvoudig in code voorstellen:
Code:
addEuro(Euro bedrag)
{
  euro += bedrag.getEuro();
  eurocent += bedrag.getEuroCent();
}

// aanroep
Euro e_1 = new Euro(12, 10);
Euro e_2 = new Euro(4, 12);

e_1.addEuro(e_2);

// e_1 is hier dus 16 euro en 22 eurocent

CyberOps

Legacy Member
iets in deze aard zekers...

Code:
public void addEuro(Euro bedrag) {
   this.getEuro += bedrag.getEuro();
   this.getEuroCent += bedrag.getEuroCent();
}

public void subtractEuro(Euro bedrag) {
   this.getEuro -= bedrag.getEuro();
   this.getEuro -= bedrag.getEuroCent();
}

public boolean equals(Euro euro) {
   boolean returnwaarde;
   if(euro.getEuro == this.getEuro && euro.getEuroCent == this.getEuroCent)
   {
      returnwaarde = true;
   }
   return returnwaarde;
}

Pieke

Legacy Member
ok wist niet dat dat kon. 20 min op dit forum kan leerijker zijn dan 2u30m les :)

bedankt allebei

Kn0t

Legacy Member
Het zit wel iets complexer in elkaar hé.

1 euro en 75 cent.
+ 2 euro en 50 cent.

Zal dan 3 euro en 125 cent geven, terwijl dit uiteraard 4 euro en 25 cent moet zijn.

killgore

Legacy Member
waarom gebruiken jullie binnen die klasse zelf expliciet de accessors :x?

CyberOps

Legacy Member
Pieke zei:
bedankt allebei
np

Kn0t zei:
Het zit wel iets complexer in elkaar hé.

klopt! schoonheidsfoutje, maar kwestie van Pieke ook nog wat werk te geven :p

killgore zei:
waarom gebruiken jullie binnen die klasse zelf expliciet de accessors :x?

gewoonte. Als je gewend bent om met grote klassen te werken in vb. NetBeans en je typt "this." dan krijg je meteen een lijstje te zien met de mogelijke attributen en methoden van die klasse... Dit bespaart vaak veel typwerk... :)

BartDP

Legacy Member
killgore zei:
waarom gebruiken jullie binnen die klasse zelf expliciet de accessors :x?

voor eventuele andere actie bij het setten te kunnen uitvoeren, bvb bij iedere set een controle op de eurocenten dat het een correcte waarde geeft en dus logisch dat je dan ook de getter gaat gebruiken ipv variabele rechtstreeks

edit: CyberOps als je met een degelijke editor werkt (oa IntelliJ of eclipse) kan je ctrl + spatiebalk gebruiken voor lijstjes te zien met opties (functies, variabelen etc)

Pieke

Legacy Member
Kn0t zei:
Het zit wel iets complexer in elkaar hé.

1 euro en 75 cent.
+ 2 euro en 50 cent.

Zal dan 3 euro en 125 cent geven, terwijl dit uiteraard 4 euro en 25 cent moet zijn.

a ja niet aan gedacht :)

en als er ne snoodaard 500 cent ingeeft moet ik daar ook nog mee rekening houde :applause:
zal best bij het ingeven dan al meteen veranderen zeker als je het opvraagt. :)

MilM

Legacy Member
Pieke zei:
a ja niet aan gedacht :)

en als er ne snoodaard 500 cent ingeeft moet ik daar ook nog mee rekening houde :applause:
zal best bij het ingeven dan al meteen veranderen zeker als je het opvraagt. :)

Ik weet niet of je de operator '%' kent ?
Dat geeft de rest terug bij gehele deling en is handig bij zo'n acties.

Bv 156 / 100 = 1
en 156 % 100 = 56

de uitkomst van de '/' operatie tel je dan op bij uw euro's en de uitkomst van uw '%' is dan uw cent

killgore

Legacy Member
CyberOps zei:
gewoonte. Als je gewend bent om met grote klassen te werken in vb. NetBeans en je typt "this." dan krijg je meteen een lijstje te zien met de mogelijke attributen en methoden van die klasse... Dit bespaart vaak veel typwerk... :)
ik werk in eclipse en daar krijg je ook aanvullingen hoor

Ik bedoelde eerder dat ik dit:
Tyfius zei:
Code:
addEuro(Euro bedrag)
{
  euro += bedrag.getEuro();
  eurocent += bedrag.getEuroCent();
}

toch wel zou schrijven als
Code:
addEuro(Euro bedrag)
{
  eurocent += bedrag.eurocent;
  euro += bedrag.euro + eurocent/100;
  eurcent %=100;
}

Acessor methoden zijn voor buiten uw klasse. Binnen uw klasse die gebruiken is nogal lomp, traag & meestal useless.

MilM

Legacy Member
Mja, ik heb dat in feite nog niet vaak gezien in java killgore.
Ik kan mis zijn, maar ik denk dat het zo is dat je getters en setter smoet gebruiken op andere objecten, zelfs al zijn die van dezelfde klasse. (van andere klassen is dit zoiezo het geval natuurlijk)

Dus enkel rechtreeks aanspreken in uw klasse als het betrekking heeft tot het object zelf.

Maar zoals ik al zei, ik ben niet 100% zeker.

killgore

Legacy Member
ben er vrij zeker van dat dit in elke deftige oo-taal zo kan hoor :p.

edit:
Code:
class Euro {

	private int eurocent;
	private int euro;
	
	public Euro(int euro, int eurocent)
	{
		this.eurocent = eurocent%100;
		this.euro = euro+eurocent/100;
	}
	
	public Euro addEuro(Euro bedrag)
	{
		this.eurocent += bedrag.eurocent;
		this.euro += bedrag.euro + this.eurocent/100;
		this.eurocent %= 100;
		return this;
	}
	
	public void printBedrag()
	{
		System.out.println("Bedrag: "+euro+" euro " +eurocent+ "eurocent");
	}
	
	public static void main(String[] args) {
		Euro a = new Euro(5,35);
		Euro b = new Euro(5,99);
		a.printBedrag();
		b.printBedrag();
		a.addEuro(b).printBedrag();
		return;
	}
}

werkt perfect :p.

MilM

Legacy Member
Ik bedoel dat het mij nog nooit opgevallen is in voorbeeld code ofzo dat men ze rechtreeks aanspreken.

Als ik mij nie vergis heeft encapsulatie toch betrekking op objecten en niet op klassen ? (alhoewel de code zich natuurlijk wel in een klasse bevindt)

Persoonlijk gebruik ik altijd getters en setters voor andere objecten en spreek ik enkel velden rechtreeks aan als het om het object zelf gaat.

Maar ik heb geen ervaring met code waarin optimalisatie zo belangrijk is dat de tijdsvertragin dat acessors met zich meebrengen belangrijk wordt om bij stil te staan. (ik ken maw de invloed ervan dus niet)

killgore

Legacy Member
Encapsulatie speelt zich af op klassenniveau dus :).

Tja, ik ben het al genoeg tegengekomen in situaties dat het kan tellen en vind het daarbij nog eens duidelijkere code ook.

En qua snelheid is het vooral in c/c++ waar ik er op let, functieoverhead vermijden in tijdkritische toepassingen is nogal essentieel. Ik denk dat functieoverhead een van de grootste bottlenecks is in veel applicaties.

Daarnaast, gezien dit echt geen slechtere of onduidelijkere code geeft pas ik altijd het zo toe, vond het gewoon raar dat iedereen hier met accessors werkte :/.

Twilkie

Legacy Member
killgore zei:
i
toch wel zou schrijven als
Code:
addEuro(Euro bedrag)
{
  eurocent += bedrag.eurocent;
  euro += bedrag.euro + eurocent/100;
  eurcent %=100;
}

Acessor methoden zijn voor buiten uw klasse. Binnen uw klasse die gebruiken is nogal lomp, traag & meestal useless.

Je ziet iets over het hoofd. De instance bedrag is een ANDERE klasse, niet de klasse die een add doet. Bedrag komt binnen en is dus een parameter variable. Dus het is wel degelijke een beter idee om bedrag.getEuroCent() te gebruiken.

Tyfius

Legacy Member
Twilkie zei:
Je ziet iets over het hoofd. De instance bedrag is een ANDERE klasse, niet de klasse die een add doet. Bedrag komt binnen en is dus een parameter variable. Dus het is wel degelijke een beter idee om bedrag.getEuroCent() te gebruiken.
Het werkt hoor. Zijn code is niet fout. Het blijkt namelijk ook te werken in C# (zelf getest).

Of het beter of slechter is hangt vooral af van wat er met die private variabele gebeurt voor die met de get() functie wordt teruggegeven. Indien het een eenvoudige get() is die alleen de waarde teruggeeft zoals in dit voorbeeld is het qua tijd misschien aangeraden om rechtstreeks de private variabele aan te spreken.

killgore

Legacy Member
Twilkie zei:
Je ziet iets over het hoofd. De instance bedrag is een ANDERE klasse, niet de klasse die een add doet. Bedrag komt binnen en is dus een parameter variable. Dus het is wel degelijke een beter idee om bedrag.getEuroCent() te gebruiken.

neen, de instantie bedrag is een ander OBJECT. En in de meeste talen speelt encapsulatie zich af op klasse-niveau, niet op object-niveau.

Moest bedrag niet van de klasse Euro zijn, dan heb je gelijk.

En zelfs als het reference-variabelen zijn kan je beter rechtstreeks werken tyfius :). Je kan er toch vanuit gaan dat je binnen 1 klasse je je klassenvariabelen "goed" behandelt he, anders zit je zelfs met accessors in de problemen :/.
Het enige waar ik nut zie van binnen de klasse met die methoden te werken is bv. als je set echt "ingewikkeld" is en je die code anders toch maar zou herhalen, maar 2 lijntjes of zo zou ik direct inlinen ipv aan te roepen.

Pieke

Legacy Member
dit is wat ik heb voor alles:

Code:
public class Euro {

    private int euro ;
    private int eurocent ;
            
            //constructors 
    public Euro () {
        euro=0;
        eurocent=0 ;
    }
    
    public Euro (int euro) {
        this.setEuro(euro) ;
        eurocent=0 ;
    }

    public Euro (int euro, int eurocent) {
        this.setEuro(euro) ;
        this.setEurocent(eurocent) ;
    }
    
            //getters
    public int getEuro () {
        return euro ;
    }
        
     public int getEurocent () {
         return eurocent ;
    }
    
            //setters
     public void setEuro (int euro) {
         this.euro=euro ;
     }
     
     public void setEurocent (int eurocent) {
         while (eurocent > 99) {
             eurocent = eurocent-100 ;
             euro ++ ; }
         this.eurocent=eurocent ;
     }
   
   
            //rekenen met 2 objecten
     public void addEuro (Euro bedrag) {
         int hulpv ;
         euro = euro + bedrag.getEuro() ;
         eurocent= eurocent + bedrag.getEurocent () ;
         if (eurocent > 99) {
               hulpv = eurocent/100 ;
               euro=euro+hulpv ;
               eurocent=eurocent % 100 ;  
         }       
     }
     
     public void subtractEuro (Euro bedrag) {
         euro = euro-bedrag.getEuro() ;
         eurocent = eurocent-bedrag.getEurocent () ;
         if (eurocent < 0 && euro>=0) {
             eurocent = eurocent + 100 ;
             euro -- ;
            }             
     }
     
            //vergelijken van 2 objecten
     public boolean equals (Euro euro) {
        if(euro.getEuro() == this.getEuro() && euro.getEurocent() == this.getEurocent()) {
            return true; 
            }
        else 
            return false ; 
        }
     
            //print aantal euro's en eurocenten in dit object
      public void print () {
          System.out.println("Aantal euro's: " +euro) ;
          System.out.println("Aantal eurocent: " +eurocent) ;
      }
}

maar mijn subtract klopt nog niet voor alle gevallen
zo krijg ik ipv -2 cent -1 euro en 99 cent, of -109 cent ipv -1 euro en -9cent
zal er morgen wel eens naar zoeken als ik wat helderder ben van geest dan nu :)
(ook de plus klopt niet als je + een negatief getal doet zoals 5 euro + -90 cent ><)

daigon

Legacy Member
killgore zei:
ben er vrij zeker van dat dit in elke deftige oo-taal zo kan hoor :p.

edit:
Code:
class Euro {

	private int eurocent;
	private int euro;
	
	public Euro(int euro, int eurocent)
	{
		this.eurocent = eurocent%100;
		this.euro = euro+eurocent/100;
	}
	
	public Euro addEuro(Euro bedrag)
	{
		this.eurocent += bedrag.eurocent;
		this.euro += bedrag.euro + this.eurocent/100;
		this.eurocent %= 100;
		return this;
	}
	
	public void printBedrag()
	{
		System.out.println("Bedrag: "+euro+" euro " +eurocent+ "eurocent");
	}
	
	public static void main(String[] args) {
		Euro a = new Euro(5,35);
		Euro b = new Euro(5,99);
		a.printBedrag();
		b.printBedrag();
		a.addEuro(b).printBedrag();
		return;
	}
}

werkt perfect :p.

Raar dat het werkt volgens de private definitie zou het niet mogen, want private mag niet rechtreeks uitgelezen worden dit zijn OO encapsulation voorwaarden. Private is enkel gekend door de klasse zelf en kan door niemand aan de klasse gevraagd worden hiervoor dienen de getter en setters.

ook al is het op klasse en niet op object niveau, het is ook duidelijker als je getters gebruikt.
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