Implementieren sie eine Klass Statistics mit den privaten Feldern count sum and max.Mit der methode process(x) kann eine Zahl x übergeben werden,welche die Statistiken aktuelisiert.Folgende public methoden sind zu implementieren.
process(x) nimmt die int-Zahl in Statistik auf
sum() liefert die Summe aller mit process übergebene Zahlen als int-Wert.Wenn keine Zahl übergeben wurden soll sum den Wert 0 liefern.
mean() liefert den Mittelwert aller mit process übergebene Zahlen als double-Wert.Wenn keine Zahl übergeben wurden soll eine Exception mit der Meldung "no values" geworfen werden.
max() liefert das Maximum aller mit process übergebene Zahlen als int-Wert.Wenn keine Zahl übergeben wurden soll eine Exception mit der Meldung "no values" geworfen werden.
Java:
publicclassStatistics{privatestaticint sum;privatestaticint count;privatestaticint max;publicstaticintprocess(int x){Out.println(x);return x;}publicstaticintsum(){if(x >0){
sum = sum + x;}else{
sum =0;}Out.println(sum);return sum;}publicstaticvoidmain(String[] args){process(5);process(25);
Also was mich hier verwirt ist das "aller mit process übergebene Werte". Ich bin mir nicht sicher wie ich das in die methoden mean und sum implementieren soll.Ich hab die Felder global gemacht (static) und ich hab bei der methode process ein Rückgabe typ (int) aber wenn ich probiere in summ int x zu einsetzen oder process() passiert da nichts.Wie soll ich hier vorgehen.
Du musst in process(int x) die Felder sum, count und max aktualisieren. sum() liefert dann einfach den Wert des Feldes sum, max() den Wert des Feldes max und mean() gibt den Wert der Formel für Mittelwert zurück oder löst ggf. die Exception aus.
Du musst in process(int x) die Felder sum, count und max aktualisieren. sum() liefert dann einfach den Wert des Feldes sum, max() den Wert des Feldes max und mean() gibt den Wert der Formel für Mittelwert zurück oder löst ggf. die Exception aus.
Asoo also ich denk I habs jezt. Ich muss alles in process machen und dann halt nur mit dem methoden sum und max ausgeben? Ich dachte ich muss der methoden sum und max etwas übergeben und dann halt rechnen. Okay jezt habe ich einen guten Ansatz.
Das mit static hast du sicher recht,aber wenn ich es entferne kriege ich immer das mit "cannot be referenced from nonstatic context".
Okay,also ich habe es teilweise gelöst; namlich es funktioniet ohne die Exceptions.
Java:
publicclassStatistics{privateint sum;privateint count;privateint max;publicintprocess(int x){Out.println("The input values are"+x);
sum = sum + x;
max =0;if(x>max){
max = x;}
count++;return x;}publicvoidsum(){Out.println("The sum is"+sum);}publicvoidmean(){double mean =0.0;
mean = sum/count;Out.println("The mean is"+mean);}publicvoidmax(){Out.println("The maximum value is "+max);}publicstaticvoidmain(String[] args){Statistics stats =newStatistics();
stats.process(5);
stats.process(25);
stats.process(22);
stats.process(44);
stats.sum();
stats.mean();
stats.max();}}
Alles passt aber wenn ich versuche mit exceptions in den methoden max und mean bekomme ich diese fehler meldung "unreported exception Exception; must be caught or declared to be thrown" So sieht mein Code aus;
Java:
publicclassStatistics{privateint sum;privateint count;privateint max;publicintprocess(int x){Out.println("The input values are"+x);
sum = sum + x;
max =0;if(x>max){
max = x;}
count++;return x;}publicvoidsum(){Out.println("The sum is"+sum);}publicvoidmean()throwsException{double mean =0.0;try{
mean = sum/count;Out.println("The mean is"+mean);}catch(Exception e){Out.println("No values");}}publicvoidmax()throwsException{try{Out.println("The maximum value is "+max);}catch(Exception e){Out.println("No values");}}publicstaticvoidmain(String[] args){Statistics stats =newStatistics();
stats.process(5);
stats.process(25);
stats.process(22);
stats.process(44);
stats.sum();
stats.mean();
stats.max();}}
Aktuell gibt nur die process-Methode etwas zurück – der Aufgabenstellung nach soll das aber genau andersrum sein, alle anderen Methoden sollen etwas zurückgeben.
Außerdem soll vermutlich keine der Methoden etwas ausgeben.
Wie man generell exceptions wirft, weißt du doch sicher schon?
Okay das habe ich nicht gemerkt.Wurde alles noch funktioniern wenn ich die process Methode als void bezeichnen wurde? Das sollte ich mal probieren.
Na ja soweit ich weiss exceptions wirft man so; Man muss throws exception (exception name) in dem Methodenkopf schreiben. Dann ein try catch,wo innerhalb des try catches die exception geworfen werden soll (throw new Exception...) und dann mit catch abgefangen.Die exception muss immer abgefangen werden.
Man muss throws exception (exception name) in dem Methodenkopf schreiben. Dann ein try catch,wo innerhalb des try catches die exception geworfen werden soll (throw new Exception...) und dann mit catch abgefangen.
Okay das habe ich nicht gemerkt.Wurde alles noch funktioniern wenn ich die process Methode als void bezeichnen wurde? Das sollte ich mal probieren.
Na ja soweit ich weiss exceptions wirft man so; Man muss throws exception (exception name) in dem Methodenkopf schreiben. Dann ein try catch,wo innerhalb des try catches die exception geworfen werden soll (throw new Exception...) und dann mit catch abgefangen.Die exception muss immer abgefangen werden.
wenn du public void met1 throws Exception hast heißt das für diese methode
" interessiert mich persönlich nicht ich gebs mal weiter and die methdoe die mich aufgerufen hat "
und das geht solange bis du wieder bei der main bist bzw sobald eine übermethode ein try und catch hat das sagt sich dann
"mir ist zwar egal was es im hintergrund für zeug macht aber wenn was schief läuft geb ich es aus bzw kann darauf reagieren"
du kannst natürlich auch sofort einen try catch block machen dann sagt sich die methode
" ich berechne das zeug udn mich interessiert auch wenn was falsch läuft"
Okay,ich denk ich verstehe jezt,ich kann nicht in der selben methode die exception werfen und abfangen,Ich muss sie bei der methoden dekleration werfen und dann bei wieder aufruf abfangen.Ich probiers, und auch das was MrBrown erwahnt hat.
Okay,ich denk ich verstehe jezt,ich kann nicht in der selben methode die exception werfen und abfangen,Ich muss sie bei der methoden dekleration werfen und dann bei wieder aufruf abfangen.Ich probiers, und auch das was MrBrown erwahnt hat.
Okay,ich denk ich verstehe jezt,ich kann nicht in der selben methode die exception werfen und abfangen,Ich muss sie bei der methoden dekleration werfen und dann bei wieder aufruf abfangen
Noch ein Wort zur eigentlichen Aufgabe, so wie ich sie interpretiere.
Du hast ein Klasse mit drei Instanzvariablen und zu den Instanzvariablen "max" und "sum" passende Getter-Methoden (auch, wenn deren Name nicht mit "get" beginnt), mit denen du die dazu gehörigen Werte auslesen kannst. Zusätzlich gibt es noch eine Methode process(), die Werte in die Klasse (bzw. deren Instanz) hineingeben kannst und eine weitere Methode, die aus den Werten der Instanzvariablen etwas berechnet.
Einfaches Beispiel dazu, nach dem Erzeugen einer Instanz liefert der Aufruf von sum() den Wert 0 zurück. Der Aufruf von max() führt zu einer Ausnahme.
Nach process(5) liefert sum() den Wert 5 zurück und max() den Wert 5.
Nach process(3) liefert sum() den Wert 8 zurück und max() weiterhin den Wert 5.
Nach process(9) liefert sum() den Wert 17 zurück und max() den Wert 9.
Noch ein Wort zur eigentlichen Aufgabe, so wie ich sie interpretiere.
Du hast ein Klasse mit drei Instanzvariablen und zu den Instanzvariablen "max" und "sum" passende Getter-Methoden (auch, wenn deren Name nicht mit "get" beginnt), mit denen du die dazu gehörigen Werte auslesen kannst. Zusätzlich gibt es noch eine Methode process(), die Werte in die Klasse (bzw. deren Instanz) hineingeben kannst und eine weitere Methode, die aus den Werten der Instanzvariablen etwas berechnet.
Einfaches Beispiel dazu, nach dem Erzeugen einer Instanz liefert der Aufruf von sum() den Wert 0 zurück. Der Aufruf von max() führt zu einer Ausnahme.
Nach process(5) liefert sum() den Wert 5 zurück und max() den Wert 5.
Nach process(3) liefert sum() den Wert 8 zurück und max() weiterhin den Wert 5.
Nach process(9) liefert sum() den Wert 17 zurück und max() den Wert 9.
Ja so in der Art sollte es sein. Ich denk ich hab jetzt alles fertig gebastellt.So sieht es aus;
Java:
publicclassStatistics{privateint sum;privateint count;privateint max;publicintprocess(int x){Out.println("The input values are"+" "+x);
sum = sum + x;
max =0;if(x>max){
max = x;}
count++;return x;}publicvoidsum()throwsIllegalArgumentException{if( count ==0|| sum ==0){thrownewIllegalArgumentException("No values for sum");}else{Out.println("The sum is"+" "+sum);}}publicvoidmean(){double mean =0.0;
mean = sum/count;Out.println("The mean is"+" "+mean);}publicvoidmax()throwsIllegalArgumentException{if( count ==0|| max ==0){thrownewIllegalArgumentException("No values for max");}else{Out.println("The maximum value is "+" "+max);}}publicstaticvoidmain(String[] args)throwsIllegalArgumentException{Statistics stats =newStatistics();
stats.process(0);try{
stats.sum();}catch(IllegalArgumentException e1){Out.println(e1.getMessage());}
stats.mean();try{
stats.max();}catch(IllegalArgumentException e2){Out.println(e2.getMessage());}}}
Der Code funktioniert wie ich es wollte,und ich denke die Aufgabenstellung ist erfüllt.Allerdings wollte ich nochmal darauf eingehen was mrBrown mit dem rückgabe typ sagen wollte.Auch Temi hat mich zum denken gebracht mit dem getter methoden.Sollte es umgekehrt mit dem rückgabetypen sein,damit meine ich soll die methode process void sein und sum bzw. max ein rückgabetyp haben,da es um getter methoden handelt.Was denkt ihr?
Ich denke nein, die Aufgabe ist nicht erfüllt. Die Methoden sum(), mean() und max() sollen nichts ausgeben, sondern den jeweiligen Wert als Rückgabewert liefern. Die Ausgabe erfolgt nicht in dieser Klasse.
[CODE lang="java" title="Beispiel: Ausgabe der Summe"]System.out.println(statistic.sum());[/CODE]
Sollte es umgekehrt mit dem rückgabetypen sein,damit meine ich soll die methode process void sein und sum bzw. max ein rückgabetyp haben,da es um getter methoden handelt.Was denkt ihr?
Das ist leider gleich doppelt falsch: public void sum() throws IllegalArgumentException -> sum() liefert die Summe aller mit process übergebene Zahlen als int-Wert.Wenn keine Zahl übergeben wurden soll sum den Wert 0 liefern.
Das ist leider gleich doppelt falsch: public void sum() throws IllegalArgumentException -> sum() liefert die Summe aller mit process übergebene Zahlen als int-Wert.Wenn keine Zahl übergeben wurden soll sum den Wert 0 liefern.
Damit hast du recht, dafür soll mean() eine Ausnahme werfen, wenn noch keine Zahl übergeben wurde. Und "IllegalArgumentException" ist irgendwie der falsche Typ, denn die Methode hat ja gar keine Argumente (= Parameter).
publicclassStatistics{privateint sum;privateint count;privateint max;publicvoidprocess(int x){
sum = sum + x;
count++;if(x>max){
max = x;}}publicintsum(){if(count ==0){return0;}else{return sum;}}publicdoublemean()throwsException{double mean =0.0;if(count ==0){thrownewException("No values for sum");}else{
mean = sum/count;}return mean;}publicintmax()throwsException{if( count ==0){thrownewException("No values for max");}else{return max;}}}
Allerdings weiss ich jetzt nicht was ich bei der Main methode schreiben soll.Wie bekomme ich die Ausgaben für sum max... wenn nicht wie ich es vorher gemacht habe? Auch das das ich max falsch behandle verstehe ich nicht;
Nachtrag: weil ich es gerade sehe, der Test in Deiner sum()-Methode ist überflüssig. Wenn process() noch nicht aufgerufen wurde, dann ist sum sowieso 0.
Na, jetzt stimmt es ja. Vorher hast du max immer zuerst auf 0 gesetzt und danach verglichen, ob der neue Wert größer ist. Im Endeffekt hast du damit immer nur verglichen, ob der Wert x größer ist als 0.
Indem du die Methoden aufrufst und deren Rückgabewert ausgibst, wie in #19 gezeigt.
Und noch ein Tipp, der den Code etwas übersichtlicher macht. Mit dem Werfen einer Ausnahme, wird die Methode an dieser Stelle sowieso beendet, du kannst also auf den else-Zweig verzichten:
Java:
// anstatt vonpublicintmax()throwsException{if( count ==0){thrownewException("No values for max");}else{return max;}}// sopublicintmax()throwsException{if( count ==0){thrownewException("No values for max");}return max;}// oder so, wobei es eine gute Idee ist, die Klammerung bei if generell immer zu machen.// Das vermeidet Fehler, wenn man später weitere Anweisungen ergänzt.publicintmax()throwsException{if( count ==0)thrownewException("No values for max");return max;}
Ah okay jetzt sehe ich es,bei mean hab ich keinen anderen weg gefunden ausser die berechenung in der methode zu machen weil ja die variable nicht in der klasse deklariert ist.Funktioniert alles,vielen dank.