# Uni Aufgabe - AsciiBild einlesen,spiegeln, ausgeben



## R4xx4r (23. Nov 2009)

Hallo an alle!

Ich habe bei meiner nächsten Uni Aufgabe wieder ein Problem und hoffe auf eure Hilfe 

Also meine Probleme sind folgende:
1) das mit dem spiegeln hab ich null plan wie ich das anstellen soll
2) Bis jetzt gibt er mir das bild normal aus nur habe ich am Anfang ein null stehen und hab keine ahnung woher das kommt
3) nach meinem bild sollte er mir die breite und die hoehe ausgeben. es funktioniert hier aber nur die hoehe und nicht die breite. kann mir wer sagen warum ?



Aufgabenstellung ist folgende:
-----------------------------------------------------------------------------------------------
Es soll ein ASCII Bild eingelesen und validiert werden. Die Validierung besteht diesmal darin, zu überprüfen, ob die Zeilenlänge in allen Zeilen die gleiche ist. Weiters soll das Bild nicht grösser als 100 Zeilen und 100 Spalten sein. Das Bild soll dann auf den Kopf gestellt (Letzte Zeile als erstes) ausgegeben werden. Sie sollen 2 Klassen programmieren:
    * AsciiReader
    * AsciiImage
AsciiReader: Die Klasse AsciiReader ist die ausführbare Klasse, welche die main-Methode beinhaltet. Diese Methode liest das Ascii-Bild Zeile für Zeile ein.
Die Gültigkeit soll beim Einlesen überprüft werden und das Programm bei einem Fehler mit FALSCHE EINGABE beendet werden. Alternativ kann die Methode addLine() der Klasse AsciiImage die Überpüfung durchführen und einen boolean Wert liefern, der false ist wenn ein Fehler aufgetreten ist (hier gibt es auch andere Möglichkeiten, die auch akzeptiert werden).

AsciiImage: Die Klasse AsciiImage repräsentiert ein ASCII Bild. Die Klasse AsciiReader erstellt ein Objekt der Klasse AsciiImage um das Bild auf den Kopf gestellt 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.

Datenkapselung:
Die Datenelemente von AsciiImage sollen nicht direkt von fremden Klassen zugreifbar sein. Verwenden Sie hier den Modifier private. Stattdessen soll die Klasse AsciiImage die benötigten Methoden zum Lesen und (wo sinnvoll) zum Schreiben der Datenelemente zur Verfügung stellen. So soll es z.B. eine spezielle Methode addLine(String line) geben, die die übergebene Zeile dem Bild hinzufügt. addLine(String) ist also eine Methode mit der der Bildinhalt in kontrollierter Weise geändert werden kann. Beachten Sie, dass addLine(String) die Höhe des Bildes verändert (d.h. der Wert des entsprechenden Datenelements muss neu gesetzt werden). Vor dem ersten Hinzufügen einer Zeile ist die Hö,he des Bildes 0. Die Methode soll die Zeile nur dann hinzufügen, wenn diese die richtige Länge hat (Die richtige Länge der Zeile kann mit einem entsprechenden Konstrukturparameter festgelegt werden, oder durch die Länge der ersten eingelesenen Zeile bestimmt werden). Die Methode kann einen boolean-Wert zurückliefern, der angibt, ob die Zeile hinzugefügt wurde, oder ob es einen Fehler gegeben hat (falsche Länge der Zeile).

Weiters soll es die Methode toString() geben, mit der der Bildinhalt gelesen werden kann. Ebenso soll es Auskunftsmethoden (Getter) für Höhe und Breite des Bildes geben. Methoden zum Setzen (Setter) von Höhe und Breite sind in diesem Beispiel nicht notwendig, da die Bilddimension beim Einlesen festgelegt wird (z.B. ändert sich die Höhe des Bildes nur durch das Hinzufügen von Zeilen mit addLine).

Erstellen Sie den (die) zu Ihrem Entwurf passenden Konstruktor(en).

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. 
-----------------------------------------------------------------------------------------------

und hier mein code:

AsciiReader:

```
import java.util.Scanner;

class AsciiReader{
    
	public static void main (String [] args){

        AsciiImage ai = new AsciiImage();
        
        Scanner reader = new Scanner(System.in);
        String input = reader.nextLine();
        
        int FirstLineBreite = input.length();
        
        int LineBreite;
        int LineHoehe = 0;

        while (reader.hasNextLine()){

            input = reader.nextLine();
            LineBreite = input.length();
            LineHoehe++;
            ai.addLine(input);
            
            ai.setBreite(LineBreite);
            
            if (LineBreite != FirstLineBreite || LineBreite > 100 || LineBreite == 0){
                break;   
            }
        }
   
        if (LineHoehe > 100 || LineHoehe < 0) {
        	System.out.println("FALSCHE EINGABE");
		}
        else {
        	ai.setHoehe(LineHoehe);
        	System.out.println(ai.getPicture());
            System.out.println(ai.getHoehe() + " " + ai.getBreite());	
        }   
    }
}
```

AsciiImage:

```
public class AsciiImage {
	
	private int hoehe;
	private int breite;
	private String picture;
	    
    void addLine(String line){
    	picture += line + "\n" ;
    }


    public String getPicture(){
    	return picture;
    }

    
    public void setHoehe(int hoehe){
    	this.hoehe = hoehe;
	}


    public void setBreite(int breite){
    	this.breite = breite;
	}
    
    
    public int getHoehe(){
    	return hoehe;
	}


    public int getBreite(){
    	return breite;
	}
}
```

Vielen Dank an alle die sich die Mühe machen meinen Text zu lesen und mir zu helfen!!!

mfg,
R4xx4r


----------



## SlaterB (23. Nov 2009)

> es funktioniert hier aber nur die hoehe und nicht die breite.
was heißt denn funktionieren in diesem Zusammenhang?
du verrätst weder die Maße des eingegebenen 'Bildes' noch die Ausgabe, ganz schön knauserig



die Breite setzt du nach jeder Zeile neu, also bis zu 100x, nur der letzte Wert wird letztlich gemerkt

> while (reader.hasNextLine()){
> 
>            input = reader.nextLine();
>            LineBreite = input.length();

gib hier doch die Breite von jeder Zeile aus, vielleicht ist die letzte anders als erwartet


> Die Validierung besteht diesmal darin, zu überprüfen, ob die Zeilenlänge in allen Zeilen die gleiche ist.

das musst du eh noch machen, passt gut dazu

------

Spiegeln:
die Zeilen dürfen natürlich nicht in einen großen String, da kann man dann nichts mehr damit machen,
wenn sie aber in einer Liste oder in einem Array stehen, dann musst du die Zeilen austauschen,

richtig was dazu sagen kann man kaum, die Lösung hat kaum mehr als 5 Zeilen,
ne Schleife über alle Zeilen ist natürlich nötig,
und dann offensichtlich Zeilen in ihrer Position verschieben


----------



## R4xx4r (23. Nov 2009)

Hallo,

Danke für deine Antwort und deine Tipps!

Also das mit dem Spiegeln hab ich jetzt schon geschafft. Habe es aber nicht mit arrays gemacht sondern einfach "nur" mit der Zeile bei der Klasse AsciiImage in der Methode addLine

```
picture = line + "\n" + picture;
```



> was heißt denn funktionieren in diesem Zusammenhang?


Also mit funktionieren meinte ich, dass es angezeigt wird nach dem das Bild gespiegelt wurde.


> du verrätst weder die Maße des eingegebenen 'Bildes' noch die Ausgabe, ganz schön knauserig


Ich soll ja auch nichts verraten, es soll nach dem gespiegelten Bild stehen wie breit und hoch das gepiegelte Bild ist


> gib hier doch die Breite von jeder Zeile aus, vielleicht ist die letzte anders als erwartet
> 
> 
> > Die Validierung besteht diesmal darin, zu überprüfen, ob die Zeilenlänge in allen Zeilen die gleiche ist.
> ...



Also ich dachte mir eigentlich, dass ich das schon drin habe mit:

```
int FirstLineBreite = input.length();
input = reader.nextLine();
LineBreite = input.length();
           
ai.setBreite(LineBreite);
            
// Überprüfung ob die gerade eingelesene Zeile die gleiche Länge von der ersten Zeile hat
if (LineBreite != FirstLineBreite || LineBreite > 100 || LineBreite == 0){
        break;   
}
```

Und mit dem ai.setBreite(LineBreite) setz ich doch für die Ausgabe die Breite oder?
Weil immer nur 0 erscheint

Sry, dass ich so dumme Fragen stelle.
Als Erklärung:
Ich mach diesen Kurs auf der Uni nicht als richtiger Student sondern im Zuge meiner Lehre.
Wir brauchen in der Arbeit Java un daher soll ich es lernen. Besuche aber keine Vorlesung sondern bekomme die Aufgaben nach Hause, versuche sie hier alleine mit Büchern und API usw und shcicke sie dann an die Uni zurück.

Bin also eig nicht wirklich an der Uni sondern mache nur diesen einen Kurs. Nur das ihr wisst warum ich vlt grundlegendes nicht kann ( was man vlt in ner Vorlesung lernt)

also echt sry und vielen dank für eure geduld!!

mfg,
R4xx4r


----------



## SlaterB (23. Nov 2009)

>  String input = reader.nextLine();

>        while (reader.hasNextLine()){
>            input = reader.nextLine();
>            ai.addLine(input);

die erste Zeile wird übrigens nicht zu ai hinzugefügt, oder?


> if (LineBreite != FirstLineBreite || LineBreite > 100 || LineBreite == 0){
>        break;   

tja, was bringt dir das? nach der Schleife führt keine Prüfung der Breite zu einer Ausgabe oder so, wie bei der Höhe,
ich denke nach wie vor dass die letzte Zeile die Länge 0 hat während alle anderen vorher gut waren,
mit einfachsten System.out.println zu prüfen

was bringt es überhaupt in der Schleife 100x die Breite zu setzen, wenn alle gleich sind,
dann reicht es doch vorher oder am Ende 1x die Breite zu setzen,
jede Aktion muss einen Sinn haben


----------



## R4xx4r (23. Nov 2009)

Hallo,



> die erste Zeile wird übrigens nicht zu ai hinzugefügt, oder?



Jop hast du recht. werd ich gleich mal ändern 




> > if (LineBreite != FirstLineBreite || LineBreite > 100 || LineBreite == 0){
> > break;
> 
> tja, was bringt dir das? nach der Schleife führt keine Prüfung der Breite zu einer Ausgabe oder so, wie bei der Höhe,



naja ichdachte es mir hier so, dass ich die Schleife abbreche sobald etwas hier schon nicht psst und gleich FALSCHE EINGABE ausgebe, darum hier die if-abfrage und das break



> ich denke nach wie vor dass die letzte Zeile die Länge 0 hat während alle anderen vorher gut waren,
> mit einfachsten System.out.println zu prüfen



Jap hast recht. 


> was bringt es überhaupt in der Schleife 100x die Breite zu setzen, wenn alle gleich sind,
> dann reicht es doch vorher oder am Ende 1x die Breite zu setzen,
> jede Aktion muss einen Sinn haben



AAhhh verstehe was du meinst. Habe total falsch gedacht. Ja hast natürlich recht das es sinnfrei ist es jedes mal neu zusetzen, dachte irgendwie das ich es setzen muss um zu überprüfen  sry

Vielen Dank!

mfg,R4xx4r


----------

