# Uni Aufgabe - Ascii einlesen,überprüfen, ausgeben



## R4xx4r (10. Nov 2009)

Hallo an alle,

Also folgende Aufgabe:

Es soll ein ASCII Bild eingelesen und validiert werden. Die Validierung besteht darin, zu überprüfen, ob die Zeilenlänge und die Anzahl der Zeilen des eingelesenen Bildes korrekt sind.

Sie sollen 2 Klassen programmieren:

    * AsciiReader
    * AsciiImage

AsciiReader: Die Klasse AsciiReader ist die ausführbare Klasse, welche die main-Methode beinhaltet. Diese Methode liest zunächst die Höhe und die Breite des Bildes und anschließend das Ascii-Bild selbst ein.
Die Gültigkeit soll beim Einlesen überprüft werden und das Programm bei einem Fehler mit FALSCHE EINGABE beendet werden.

AsciiImage: Die Klasse AsciiImage repräsentiert ein ASCII Bild. Die Klasse AsciiReader erstellt ein Objekt der Klasse AsciiImage um das Bild zu speichern. Diese Klasse soll Datenelemente zum speichern der Höhe des Bildes, der Breite des Bildes und der Zeilen des Bildes beinhalten. Sie können die einzelnen Zeilen des Bildes in einer einzigen Zeichenkette (Datenelement vom Typ String) speichern, indem Sie die Zeilen verketten. Die einzelnen Bildzeilen werden dabei mit "\n" getrennt. Andere Lösungen werden auch akzeptiert.
Die Klasse AsciiImage soll auch eine Methode zum Ausgeben (z.B. Methode void print()) des Bildes am Bildschirm besitzen. Diese Methode wird von AsciiReader aufgerufen um die verlangte Ausgabe zu erzeugen, wenn das Bild fehlerfrei eingelesen wurde.
Eine Methode
void addLine(String line)
soll die übergebene Zeile dem Bild hinzufügen.

Nebenbedingungen für Anzahl der Zeilen/Spalten des Bildes:
Die Höhe des Bildes darf 100 nicht überschreiten und muss größer 0 sein.
Die Breite des Bildes darf 100 nicht überschreiten und muss größer 0 sein. Jede Zeile muss die gleiche Breite haben. 

AsciiReader

```
import java.util.Scanner;

class AsciiReader {
    
    public static void main (String[] args) {
        
        // Eingabe der Breite des Bildes = Zeichenanzahl
        Scanner eingabeHoehe = new Scanner(System.in);
        int h = eingabeHoehe.nextInt();
        
        // Eingabe der Hoehe = Zeilenanzahl
        Scanner eingabeBreite = new Scanner(System.in);
        int b = eingabeBreite.nextInt();
        
        // Anlegen eines Objektes der Klasse AsciiImage mit den Werten (Breite,Hoehe)
        AsciiImage ai = new AsciiImage(h, b);
        
        //Einlesen des Bildes
        Scanner reader = new Scanner(System.in);
        
        /* Abfrage für Nebenbedingungen
         * Hoehe muss groesser 0 und kleiner,gleich 100 sein
         * Breite muss groesser 0 und kleiner gleich 100 sein. Jede Zeile muss die gleiche Breite haben
        */
        if(((h > 0) && (h <= 100)) && ((b > 0) && (b <= 100))) {
	        int counter = 0;
	        
	        // Überprüfung des Bildes
	        while(reader.hasNextLine()){
	            String input = reader.nextLine();
	            int inputLen = input.length();
	            
	            if(inputLen < b || inputLen > b){
	                break;
	            }
	           
	            counter++;
	            ai.addLine(input);
	        }
	        if(counter == h)
	            ai.print();
	        else
	            System.out.println("FALSCHE EINGABE"); 
        }
        else
        	System.out.println("FALSCHE EINGABE");
    }
}
```

AsciiImage

```
public class AsciiImage {
    
    int hoehe;
    int breite;
    String picture = "";
    
    AsciiImage (int hoehe, int breite){
        this.hoehe = hoehe;
        this.breite = breite;
    }
    
    public void addLine(String line){
        // Diese Methode soll die übergebene Zeile dem Bild hinzufügen
    	picture += line + "\n";

    }
    
    public void print(){
        /* Methode zur Ausgabe des Bildes
         * Diese Methode wird von AsciiReader aufgerufen um die verlangte Ausgabe zu erzeugen, wenn das Bild fehlerfrei eingelesen wurde.
         */
    	System.out.println(picture);
    }
}
```

Im Eclipse funktioniert es auch ohne Probleme, wenn ich es aber abgeben will und es automatisch kontrolliert wird kommt folgende Meldung bei jedem Test:

Exception in thread "main" java.util.NoSuchElementException
	at java.util.Scanner.throwFor(Scanner.java:838)
	at java.util.Scanner.next(Scanner.java:1461)
	at java.util.Scanner.nextInt(Scanner.java:2091)
	at java.util.Scanner.nextInt(Scanner.java:2050)
	at AsciiReader.main(AsciiReader.java:13)


Ich versteh nicht ganz warum es bei mir im Eclipse geht, aber sobald ich es abgegeben habe es nicht funktioniert.

Vielen Dank für eure Hilfen!
mfg R4xx4r


----------



## SlaterB (11. Nov 2009)

was genau passiert weiß ich auch nicht, hängt ja von dem Test und dessen Umgebung ab, 
vielleicht ist die Eingabe dort anders, alle Parameter werden auf einmal übergeben statt mit 5 sec Abstand und vielen Einzeln-Returns

du begehst jedenfalls einen vermeidbaren Fehler, du eröffnest mehrere Scanner,
jeder Scanner liest gleich eine ganze Menge Daten, mindestens eine komplette Zeile, vielleicht gar mehrere, falls so schnell verfügbar durch automatische Eingabe

der Scanner eingabeHoehe hat also alle werweißwieviel Daten in sich gebunkert, aber du fragst nur die ersten ab,
danach kommt ein neuer Scanner, aber System.in ist 'ausgelutscht', der Scanner eingabeHoehe gibt nicht automatisch seinen Vorrat ab

-> immer nur genau einen Scanner auf System.in verwenden, daraus alles lesen


----------



## R4xx4r (11. Nov 2009)

Hallo SlaterB,

Vielen Dank für deine Antwort und sry für meine späte Antwort, ich habe gestern am Abend dann ziemlich bald aufgegeben und den pc abgedreht 

Nun aber zu deiner Atwort 

VIELEN VIELEN DANK!! Jetzt funktioniert das ganze 
Ich habe jetzt nur einen Scanner mit dem ich alles einlese und es funktioniert einwandfrei.

Für alle die es sehen wollen:

```
.......
        // Eingabe der Breite des Bildes = Zeichenanzahl
        Scanner eingabe = new Scanner(System.in);
        int h = eingabe.nextInt();
        
        // Eingabe der Hoehe = Zeilenanzahl
        int b = eingabe.nextInt();
        
        // Anlegen eines Objektes der Klasse AsciiImage mit den Werten (Breite,Hoehe)
        AsciiImage ai = new AsciiImage(h, b);
        
        // Einlesen des Bildes
        String input = eingabe.nextLine();
  
        
        /* Abfrage für Nebenbedingungen
         * Hoehe muss groesser 0 und kleiner,gleich 100 sein
         * Breite muss groesser 0 und kleiner gleich 100 sein. Jede Zeile muss die gleiche Breite haben
        */
        if(((h > 0) && (h <= 100)) && ((b > 0) && (b <= 100))) {
            int counter = 0;
            
            // Überprüfung des Bildes
            while(eingabe.hasNextLine()){
            ....
```

Und was genau bei dem Test auf der Uni passiert weiß ich auch nicht ich weiß nur das es automatisch getestet wird 

So aber ich hör schon auf euch zuzutexten.

Also nochmals Danke und vlt nerv ich euch demnächst wieder mal 

mg,
R4xx4r


----------

