Java Aufgabe

FlyP

Mitglied
Hallo zusammen

Ich bin ein absoluter Java-Anfänger und muss nun folgende Aufgabe lösen:


Die Klasse StringInteger stellt eine rudimentäre Implementierung eines Datentyps für beliebig
grosse nicht-negative ganze Zahlen dar. Ergänzen Sie die Klasse um eine Methode für die Addition.
Tipp: Schriftliches Addieren zweier Zahlen, von rechts beginnend. Erstellen Sie weitere Testfälle.

Java:
public class StringInteger {
   private String internal;

   public StringInteger( int n ) {
     if( n<0 )
       throw new IllegalArgumentException("Negative Zahlen sind nicht erlaubt.");
     this.internal = String.valueOf( n );
   }
   
   public StringInteger( String s ) {
     if( s==null || s.length()==0 || ( s.charAt(0)=='0' && s.length()>1 ))
       throw new NumberFormatException("Unzulässiges Format: " + s);
     for(int i=0; i<s.length(); i++) { //nur Ziffern?
       char c = s.charAt(i);
       if( c<'0' || c>'9' )
         throw new NumberFormatException("Unzulässiges Format: " + s);
     }
     this.internal = s;
   }
   
   public String toString(){
     return internal;
   }
   
   public StringInteger add( StringInteger that ){
     //t.b.i.
   }
}

Kann mir jemand weiterhelfen?

Besten Dank im Voraus

Freundliche Grüsse
FlyP
 
Zuletzt bearbeitet von einem Moderator:
Mhm ja, gleiche Länge wäre hilfreich, muss aber nicht unbedingt.
Java:
        String s1 = "999", s2 = "98765", s3 = "";
        int i = s1.length() - 1, j = s2.length() - 1, z = 0;
        while (i >= 0 || j >= 0 || z > 0) {
            int x = 0, y = 0;
            if (i >= 0) {
                x = s1.charAt(i) - '0';
            }
            if (j >= 0) {
                y = s2.charAt(j) - '0';
            }
            s3 = (x + y + z) % 10 + s3;
            z  = (x + y + z) / 10;
            i--;j--;
        }
        System.out.println("s3 = " + s3);

Bin mir nicht so sicher, ob es nicht vereinfacht werden kann. Getestet ist es auch noch nicht. So ähnlich macht das auch der Prozessor.
 
Also beim Addieren nimmt man ja Ziffer für Ziffer, Stelle Stelle.
while (i >= 0 || j >= 0 || z > 0) {
DAS gefällt mir natürlich noch nicht, aber wenigsten kurzschließend, wenn auch kompliziert.

Jetzt hast du this.internal und that.internal, mit denen du den Spaß machen kannst. Anschließend noch schnell das neue StringInteger zurückgeben.
 
Kein Problem. Aber du musst es ja auch verstehen und in die bestehende Methode in deiner Klassen einbauen können.

Was hab ich? Was brauch ich? Was muss ich tun? Was kann weg?

Poste doch noch mal (alles) innerhalb von [code=Java]....[/code]-Tags! Jetzt hab ich "Blut" geleckt. 😀

Edit: Und nimm den Nicht-reichen-Texteditor.
 
Es handelt sich hierbei lediglich um einen Teilaufgabe an der ich angestanden bin, dass ganze stütz sich auf folgende Aufgaben:

04.05 Zeigen Sie, dass die folgenden (int) Operationen in Java nicht überlaufsicher sind, indem Sie
nachweisen, dass für bestimmte Werte das Ergebnis nicht mit dem mathematisch korrekten Wert
übereinstimmt:

z = x + y;
z = x * y;
z = x - y;
z = x / y;
z = -x;

Tipp: Verwenden Sie die Konstanten Integer.MAX_VALUE bzw. Integer.MIN_VALUE. Beachten Sie, dass
der Wertbereich des int-Datentyps nicht symmetrisch um den Wert 0 liegt.
Anmerkung: Bei der Division, etwa 7/3 = 2 entsteht keine Überlaufsituation. Das Ergebnis ist

aufgrund der Definition von „ganzzahliger Division“ mathematisch korrekt.

04.06: Aus Übung 04.05 ist bekannt, dass in Java Überlaufsituationen unbemerkt auftreten können.
Erstellen Sie statische Methoden für die problematischen Operationen, die im Überlaufsfall – und nur
dann – eine ArithmeticException auslösen und im Normalfall das gewünschte Ergebnis liefern.

Java:
public static int add( int x, int y ) {
   if( ... )
     throw new IllegalArgumentException("Überlauf: " + x + " + " + y + " nicht korrekt.");
   //Normalfall
   return x + y;
}
//analog: subtract( int, int), mult( int, int), divide(int, int), negate( int )

Tipp: Es ist zwar verlockend, einen möglichen Überlauf in der Form
if( x + y > Integer.MAX_VALUE )
zu überprüfen, aber nicht korrekt. Verwenden Sie einen mathematisch gleichwertigen Ausdruck, der
keinen Überlauf generiert.
 
Zuletzt bearbeitet von einem Moderator:
Hier noch die Lösung zu 4.05 als Nachtrag:

Java:
public static void main(String[] args) {
   int x = Integer.MAX_VALUE;
   int y = 10;
   int z;

   System.out.println("x = " + x + " (Integer.MAX_VALUE)");
   System.out.println("y = " + y);

   System.out.println();
   System.out.println("***** Addition *****");
   z = x + y;
   System.out.println("x + y = " + z + " | korrekt: +2147483649");
   System.out.println();
   System.out.println("***** Multiplikation *****");
   z = x * y;
   System.out.println("x * y = " + z + " | korrekt: 4294967294");
   System.out.println();
   System.out.println("***** Division *****");
   z = x / 3;
   System.out.println("x / 3 = " + z + " | korrekt: 715827882.33... > Division mit int gibt Ganzzahl");

   System.out.println();
   System.out.println("***** Subtraktion *****");   
   x = Integer.MIN_VALUE;
   y = 2;
   System.out.println("x = " + x + " (Integer.MIN_VALUE)");
   System.out.println("y = " + y );

   z = x - y;
   System.out.println("x - y = " + z + " | korrekt: -2147483650");
   System.out.println();

   System.out.println("***** Negation *****");
   x = Integer.MAX_VALUE;
   z = -x;
   System.out.println("Wenn x = Integer.MAX_VALUE (" + x + ")");
   System.out.println("-x = " + z + " | korrekt!");

   x = Integer.MIN_VALUE;
   y = 2;
   System.out.println("Wenn x = Integer.MIN_VALUE (" + x + ")");
   z = -x;
   System.out.println("-x = " + z + " | korrekt: +2147483648");
   System.out.println();

   System.out.println();
}
 
Zuletzt bearbeitet von einem Moderator:
Selbstverständlich ist int nicht überlaufsicher. int hat lediglich 32 Bit s. Aber genau definiert/spezifiziert.

Es kann selbstverständlich getestet werden, ob ein Überlauf stattfand. Aber das ist ein bisschen schlecht.

Du hast oben 'nen immutable "int"-Wrapper, für natürliche Zahlen >= 0.

Da findet kein Überlauf statt, lediglich die Performance leidet etwas.

Wie es auch sei, der Algo ist korrekt. Ich bin Experte für Algos, muss das also können. 🙂
 

Zurück
Oben