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:
publicclassStringInteger{privateString internal;publicStringInteger(int n ){if( n<0)thrownewIllegalArgumentException("Negative Zahlen sind nicht erlaubt.");this.internal =String.valueOf( n );}publicStringInteger(String s ){if( s==null|| s.length()==0||( s.charAt(0)=='0'&& s.length()>1))thrownewNumberFormatException("Unzulässiges Format: "+ s);for(int i=0; i<s.length(); i++){//nur Ziffern?char c = s.charAt(i);if( c<'0'|| c>'9')thrownewNumberFormatException("Unzulässiges Format: "+ s);}this.internal = s;}publicStringtoString(){return internal;}publicStringIntegeradd(StringInteger that ){//t.b.i.}}
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.
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:
publicstaticintadd(int x,int y ){if(...)thrownewIllegalArgumentException("Überlauf: "+ x +" + "+ y +" nicht korrekt.");//Normalfallreturn x + y;}
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.
publicstaticvoidmain(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();}