einmal ganz java :)


julia123

Erfahrenes Mitglied
hi,

wie ihr wisst bin ich noch in der Vorbereitungsphase, für meine anstehende Klausur.
Ich hab mehrer Fragen:

1)Welche wichtigen Interfaces und Klassen der Standardbibliothek sind als generische Datentypen
deniert? Nennen Sie als Beispiel ein Interface und eine implementierende Klasse.

->Da bin ich mir ganz unsicher was gemeint ist ->compareTo, equals, clone,toString
2)
Code:
1 package funktionen ;

 /**
 * Eine mathematische Funktion verwendet reelle Zahlen fuer die Definitions -
 * und Zielmenge .
 */
 public interface MathematischeFunktion {
 /**
 * Liefert auf Basis eines Elements "x" der Definitionsmenge
 * dieser mathematischen Funktion ein Element der Zielmenge zurueck .
 * @param x Element der Definitionsmenge .
 * @return ein Element der Zielmenge .
 */
 double apply ( double x);
 }
Frage 7-1: Welche Modizierer besitzt die Methode apply()?
->Garnicht gewusst
3)
Frage 3-3: Schreiben Sie die main-Methode so um, dass diese Fehler abgefangen werden und nicht zum Programmabsturz
führen:
1 public static void main ( final String [] args ) {
2 double r = 0.0; // Radius
3 double h = 0.0; // Hoehe
4
5
6
7
8
9 r = Double . parseDouble ( args [0]);
10 h = Double . parseDouble ( args [1]);
11
12
13
14
15
16 System . out . println ( " Das Volumen ist : " + vol ( r, h ));

->
Würdet ihr dass auch so machen oder muss noch die Methode hin wo ich thowe ... und die Bedingung rein scheibe.
Es ist ja die rede von abgefangen also würde ich dass so machen:
->
Code:
public static void main(final String[] args) {
		double r = 0.0; // Radius
		double h = 0.0; // Hoehe

		try{
		r = Double.parseDouble(args[0]);
		h = Double.parseDouble(args[1]);
		
		
		}catch(IllegalArgumentException e){
			JOptionPane.showMessageDialog(null, "Ungeeignete Arumente");
		}
		System.out.println(" Das   Volumen   ist : " + vol(r, h));

	}
4)
Eine Methode soll die Summe aller ungeraden Zahlen bis zu der natürlichen Zahl n berechnen. Die Spezifikation
lautet:
1 /**
2 * Berechnet die Summe aller ungeraden Zahlen von 0 bis n
3 *
4 * @param n int maximale ungerade Zahl , bis zu der summiert werden soll
5 * @pre n muss eine ungerade natürliche Zahl , größer Null sein
6 * @return summe
7 */

1. Vervollständigen Sie die folgende Tabelle:
n Ergebnis von ungeradeSumme()
1
2
3
4
5



2. Implementieren Sie die Methode ungeradeSumme(). Verwenden Sie einen rekursiven Algorithmus:
1 public int ungeradeSumme ( int n) {

-> zum 1 Punkt:

n Ergebnis von ungeradeSumme()
1 1
2 1
3 2
4 2
5 3
-> zum 2 Punkt:
Code:
public static int rek(int n){
          if(n%2==0){
                return rek(n-1);
           }else if (n%2!=0){
                return rek(n-1)+n;

hier noch mal die Schleifenvariante:
Code:
public static(int n){
         int erg = 0;
      for(int i = 0; n<=i; i++){
           if(i%2!=0){
           erg = erg+1;
           }
      }
      return erg;
}

vielen Dank für alles!:)
 

sheel

I love Asm
1)
Das hat mit equals und so nichts zu tun.
Antwort wäre zB. ArrayList für die Klasse und List fürs Interface.
Wenn man zwei Klssen A und B hat macht man mit "new ArrayList<A>" eine Liste von As
und mit "new ArrayList<B>" eine Liste von Bs. Das ist mit Generics gemeint.
Einen Typ mitgeben.

2)
Naja, apply besitzt keine konkreten Modifizierer (wie public, protected, private, static...)
Falls man beschreiben soll wie es denn jetzt ist:
Nicht statisch und public (weil Interface->alles public)

3)
Was sind "diese Fehler"?
Bei deiner Codeversion sollte die Ausgabe vom Volumen noch ins try rein
(soll nur gemacht werden, wenn die Argumente passen,
weil sonst ja keine sinnvollen Werte in den Variablen sind).

4)a)
Unsinn.
Ungerade Zahlen sind 1 3 5 7 9 11 13...
Die Summe aller ungeraden Zahlen kleiner gleich 1: 1
2: 1
3: 1+3=4
4: 1+3=4
5: 1+3+5=9

4)b)
Schaut nicht schlecht aus, aber.
Wenn bis zu 0 runtergezählt wurde muss dafür ein if rein,
dass nicht für -1, -2... weitergemacht wird.
 

HonniCilest

Erfahrenes Mitglied
3) Du musst mindestens 2 Fehler abfangen:
1. Du hast keine 2 Argument im Array
--> Hier kannst du die Länge von args[] im Vorfeld prüfen oder auch eine entsprechende Exception abfangen.
2. Eins oder beide Argumente können nicht geparsed werden.
--> Hier würde ich aber spezifischer die NumberFormatException verwenden

4) Es macht kein Sinn erst eine Zahl auf Teilbarkeit durch 2 zu prüfen und dann noch auf eine Nichtteilbarkeit durch 2. Eins von beiden reicht aus, d.h if-else statt if-elseif, außerdem brauchst du in rekursiven Funktionen immer eine Abbruchbedingung, welche hier in dem Beispiel m.E. n selbst zurückgeben sollte. Und noch etwas: Es wurde eine pre definiert, darauf gehst du garnicht ein. Ich würde zudem nicht n-1 für den rekursiven Aufruf verwenden, sondern n-2, sonst hast du wieder unnötige zusätzliche Rechenoperationen drin.
 

julia123

Erfahrenes Mitglied
3)
Also die 3 hab ich nicht verstanden. Für eine Lösung wäre ich echt dankbar.
4)
so sieht jetzt mein Quellcode aus:
Code:
public static int rek(int n) {
      if(n<0 ||n%2==0)thow new IllegaleArgumentExeption();
      
      if(n==1){
         return 1;
      }else if (n%2!=0){
          return (n-2)+n;

     }
:
Jetzt die Schleife
Code:
public static int schleife(int n) thows new IllegaleArgumentExeption{// hier hätte ich ja den  vorgegeben Methodenkpf verändert
                                                                                                            // wie würdet ihr die @ pre implementieren.
         if(n<0 ||n%2==0)thow new IllegaleArgumentExeption();
          
         int erg = 0;
         for(int i = 0; i<=n;i++){
             if(i%2!= 0){
                erg = erg +i
             }
          }
          return erg;
 
Zuletzt bearbeitet:

sheel

I love Asm
Zu Punkt 3:

Zuerst das, was ich mit der Ausgabe meinte: Sowas:
Java:
try{
    r = Double.parseDouble(args[0]);
    h = Double.parseDouble(args[1]);
    System.out.println(" Das   Volumen   ist : " + vol(r, h));
} catch(Exception e) {
    JOptionPane.showMessageDialog(null, "Ungeeignete Argumente");
}
(dass das catch keine generelle Exception war hab ich oben übersehen,
danke Honni fürs Aufmerksammachen)

So würde alle Fehler, mit denen man rechnen muss, ohne Unterscheidung zur Fehlermeldung führen.
Also wenn zu wenig args da sind und/oder wenn die args keine Nummernstrings sind.


Was HonniCilest vorschlägt:
Dass du für die zwei Fehlerarten getrennte Behandlungen einführst

Wenn nicht genung args da sind:
Das kann man entweder vor dem Code selbst mit einem if(args.length<2) prüfen
oder beim catch-zeug eine NullPointerException abfangen.

Wenn die Nummern nicht passen:
Wie schon oben steht, ein (ggf. weiteres) catch für eine NumberFormatException



Zum Punkt 4:
(die Schleifenvariante schau ich mir mal nicht gründlich an, wenn ja nur Rekursion gefordert ist...)

Das, was du bei der Schleifenvariante mit
"hier hätte ich ja den vorgegeben Methodenkpf verändert"
bemängelst muss man auch bei der rekuriven Variante machen.
Es heißt übrigens throws statt thows und IllegalArgumentException statt IllegaleArgumentException.
Auch weiter unten throw statt thow. Und bei dem im Methodenkopf gehört kein new hin.

Aber: Muss eine Exception überhaupt sein? (Du darfst ja anscheinend sowieso keine machen.)
Wenn n%2 == 0 dann kann man mit diesem n nicht mit -2 usw. unten arbeiten, stimmt.
Aber: Das kann man ganz eifnach beheben, in dem man statt Exceptionwerfen
n einfach um 1 rutnerzählt. Die alte gerade Zahl war für die Ungeradensumme sowieso
unwichtig, und nach dem Dekrementieren hat man wieder eine ungerade Zahl.
Wenn n<0 kann man ja einfach die Summe 0 zurückgeben. Mathematisch kein Problem.

Das if-return unten ist ok.
Das else if ist aber umsonst. Oben wurde ja schon geprüft, ob es wohl eine ungerade Zahl ist,
muss man nicht noch einmal. Einfach die Anweisung direkt nach das return:
Wenn das if nicht ausgeführt wurde (und damit die Funktion aus ist) wird das eben gemacht.

Und bei (n-2)+n hast du den Funktionsaufruf rek(n-2)+n vergessen.
 

julia123

Erfahrenes Mitglied
ok die 3) hab ich verstanden.Danke!

Zur4)
danke schon mal für die Verbesserung der Syntaxfehler!

Code:
public static int rek(int n) throws IllegalArgumentExeption{
   
   if(n<0 || n%2==0)
      throw new IllegalArgumentExeption();

      if(n==1){
         return 1;
      }else{
          return rek (n-2)+n;
 
     }


Aber: Muss eine Exception überhaupt sein? (Du darfst ja anscheinend sowieso keine machen.)
Wenn n%2 == 0 dann kann man mit diesem n nicht mit -2 usw. unten arbeiten, stimmt.
Aber: Das kann man ganz eifnach beheben, in dem man statt Exceptionwerfen
n einfach um 1 rutnerzählt. Die alte gerade Zahl war für die Ungeradensumme sowieso
unwichtig, und nach dem Dekrementieren hat man wieder eine ungerade Zahl.
Wenn n<0 kann man ja einfach die Summe 0 zurückgeben. Mathematisch kein Problem.

Hier diesen Teil hab ich nicht ganz verstanden.
Was heißt Dekrementieren.?
Was meinst du mit " n einfach runterzählen"?
Ich glaub ich versteh das besser wenn ich das in Quellcode sehe...

Ich hab es trotzdem mal versucht:

Code:
public static int rek(int n) {
   
      if(n%2==0){
         return rek(n-1);
      }else if(n<0){
        return 0;
      }else{
          return rek (n-2)+n;
      }
 

sheel

I love Asm
Der untere Code schaut sehr gut aus
Sollte so passen.

Was man eventuell ändern kann (aber nicht muss):

Zeile 4: Da würde auch ein "n -= 1;" reichen.
Du rufst einen neuen Funktionsdurchgang für das n-1 auf,
aber man könnte auch einfach in diesem Durchgang damit arbeiten.
Also
Java:
public static int rek(int n) {
   
      if(n%2==0){
         n -= 1;
      }

      if(n<0){
        return 0;
      }else{
          return rek (n-2)+n;
      }
}

Und bei den if/else kann man etwas aufräumen
Java:
public static int rek(int n) {
    if(n % 2 == 0)
         n -= 1;
    if (n < 0)
        return 0;
    return (rek(n-2) + n);
}
 

Neue Beiträge