TU Wien:Einführung in die Programmierung 2 VU (Puntigam)/Test 1 2018S

Aus VoWi
Zur Navigation springen Zur Suche springen

PraxisAufgabe Slot C[Bearbeiten]

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Objects;
import java.util.Scanner;

/**
Schreiben bzw. vervollständigen Sie bitte gekennzeichnete Programmteile wie in den Kommentaren beschrieben.
Verändern Sie aber nicht vorgegebene Methodenköpfe oder andere vorgegebene Programmteile.
Die erfolgreiche Ausführung der Testfälle in 'main' stellt nicht sicher, dass die Lösung korrekt ist.
*/

public class PraxisAufgabe {

    /*
    Aufgabe: Klassen und Objekte, rekursive Datenstrukturen.

        Ergänzen Sie bitte fehlende Teile der Klassen 'Number' und 'BigNumber' entsprechend den Kommentaren
        an den mit TODO gekennzeichneten Stellen.

    Punkte (in Summe maximal 75):

        20 Punkte in Summe für die Klasse 'Number'.

        55 Punkte in Summe für die Klasse 'BigNumber', aufgeteilt wie folgt:

            40 Punkte für die Implementierung einer einfach oder doppelt verketteten Liste zum
            Speichern beliebig vieler (8er-Gruppen von) Stellen der Zahl.

            15 Punkte für die korrekte Funktionalität (unabhängig von der Implementierung).

            Hinweis: Wird statt einer eigenen Implementierung der verketteten Liste eine vorgefertigte
            Java Collection Klasse oder ein Array genutzt, können für die Klasse 'BigNumber'
            maximal 15 Punkte erreicht werden.

    Die Anzahl der dargestellten führenden Nullen ist beliebig,
    d.h. Lösungen mit und ohne führende Nullen sind erlaubt.

    Auch für teilweise korrekte Lösungen werden Punkte vergeben.

    */

    // 'main' ist zum Testen verwendbar und kann beliebig geändert werden.
    // Das Testen wird nicht beurteilt.
    public static void main(String[] args) {


        // Hinweis: Die Anzahl der dargestellten führenden Nullen darf von den hier gezeigten
        // Sollausgaben abweichen.

        Number n = new Number(99999154);
        System.out.println(n.toString()); // 99999154

        for(int i = 0; i < 1000000; i++) {
            n.increment();
        }
        System.out.println(n.toString()); // 00999154

        for(int i = 0; i < 1000000; i++) {
            n.increment();
        }
        System.out.println(n.toString()); // 01999154

        BigNumber bn = new BigNumber(Long.MAX_VALUE);
        System.out.println(bn.toString());  // 000009223372036854775807

        for(int i = 0; i < 1234567; i++) {
            bn.increment();
        }
        System.out.println(bn.toString()); // 000009223372036856010374

        bn = new BigNumber("725473526600001886534325642623");
        bn.increment();
        System.out.println(bn.toString()); // 00725473526600001886534325642624
        bn.setDigit(50,2);
        System.out.println(bn.toString()); // 00000200000000000000000000725473526600001886534325642624
        bn.setDigit(50,0);
        System.out.println(bn.toString()); // 00000000000000000000000000725473526600001886534325642624
    }
}

// Diese Klasse repräsentiert eine positive ganze Zahl mit maximal 8 Stellen
// im Dezimalsystem.
class Number {

    // Anzahl der Stellen
    public final static int nDigits = 8;

    private int[] digits = new int [nDigits];

    //TODO: Variable(n) deklarieren

    // Initialisiert dieses Objekt mit dem Wert 'n'.
    // Es gilt: 0 <= n && n < Math.pow(10,nDigits).
    public Number (int n) {
    }

    // Initialisiert dieses Objekt mit dem gleichen Wert wie 'n'.
    public Number (Number n) {
    }

    // Liefert eine lesbare Respräsentation dieses Objekts.
    public String toString() {
        //TODO: Methode implementieren
        return "";
    }

    // Liefert die Ziffer an der Stelle pos.
    // Es gilt: 0 <= pos && pos < nDigits.
    public int getDigit(int pos) {
        //TODO: Methode implementieren
        return 0;
    }

    // Ersetzt die Ziffer an der Stelle 'pos' durch die Ziffer 'd'.
    // Es gilt: 0 <= pos && pos < nDigits und 0 <= d && d <= 9.
    public void setDigit(int pos, int d) {
        //TODO: Methode implementieren
    }

    // Inkrementiert die durch dieses Objekt dargestellte Zahl. Wird dabei der Wertebereich überschritten,
    // das heißt, die Zahl bekommt dadurch mehr als 8 Stellen, werden vom Ergebnis nur die ersten 8 (niederwertigsten)
    // Stellen gespeichert und durch den zurückgegebenen Wert 'true' wird signalisiert, dass es einen Überlauf
    // gegeben hat. Ohne Überlauf wird 'false' zurückgegeben.
    public boolean increment() {
        //TODO: Methode implementieren
        return false;
    }
}


// Die Klasse 'BigNumber' repräsentiert eine positive ganze Zahl mit beliebigem Betrag. Der Wertebereich beginnt
// bei 0 und kann sowohl Integer.MAX_VALUE als auch Long.MAX_VALUE überschreiten, ohne dass die Funktionalität
// beeinträchtigt wird. Dies wird dadurch erreicht, dass BigNumber intern eine verkette Liste von 'Number'-Objekten
// verwendet. z.B. wird 750000456123456789 dargestellt durch drei Knoten 23456789 -> 4561 -> 75 -> null.
class BigNumber {

    // Konstruktor: Initialisiert dieses Objekt mit 'n'.
    public BigNumber(long n) {
    }

    // Inkrementiert die Zahl.
    public void increment(){
        //TODO: Methode implementieren
    }

    // Ersetzt die Ziffer an der Stelle 'pos' durch die Ziffer 'd'.
    // Es gilt: pos >= 0 und 0 <= d && d <= 9.
    public void setDigit(int pos, int d) {
        //TODO: Methode implementieren
    }

    // Konstruktor: Initialisiert dieses Objekt mit der Zahl, die als String angegeben wird.
    // 's' sei ein String, der ausschließlich Ziffern enthält.
    public BigNumber(String s) {
        //TODO: Konstruktor implementieren
    }

    // Liefert eine lesbare Repräsentation des Objekts (siehe Beispiele in 'main').
    public String toString() {
        //TODO: Methode implementieren
        return "";
    }

    //TODO: Verkettete Liste implementieren (entweder in BigNumber oder außerhalb).
    //TODO: Diese verkettete Liste soll von BigNumber zur Speicherung von Zifferngruppen benutzt werden.
    //TODO: (Ein Knoten soll 8 Ziffern speichern.)
}