# Matrix einlesen



## Guest (14. Apr 2006)

Guten Abend, ich hab folgendes Problem; 
einer beliebige n x m Matrix (n=4, m=3)
soll durch Benutzereingabe eingelesen werden;
und danach soll die transponierte Matrix ausgegeben werden. 
Wie aber lese ich eine Matrix ein? 
Genaue Aufgabenstellung findet ihr unter 

http://www.mathematik.uni-ulm.de/sai/ws05/ai1/misc/klausur.pdf 
Aufgabe 6

Danke mal im Voraus


----------



## byte (14. Apr 2006)

Offensichtlich soll die Eingabe über den Aufruf der Main-Methode passieren. Also alle n x m int Werte werden beim Programmaufruf über die Konsole mitgegeben. Du musst also entsprechend die String[] args auslesen und damit das 2D Array initialisieren.


----------



## Guest (14. Apr 2006)

Und genau darin liegt mein Problem, ... 
ich habe keinen Plan wie ich da ran gehen soll. 
Ne, Musterlösung für den Einlesevorgang 
mit der ein oder anderen Erklärung wäre sehr hilfreich.


----------



## bygones (14. Apr 2006)

joh dann viel erfolg... eine grundregel des Forums ist leider keine hausaufgaben komplett zu loesen...

aber warten wir... jedenfalls verschoben


----------



## byte (14. Apr 2006)

Die Main-Methode hat als Parameter ein String-Array. Wenn Du nun eine Java Klasse per Konsole aufrufst, kannst Du ihr Parameter mitgeben, z.B. für eine Klasse MainClass.java


```
> java MainClass Frohe Ostern
```

Du kannst nun in der Main Methode diese Parameter auslesen und verarbeiten. Also in diesem Fall wäre args[0] -> "Frohe" und args[1] -> "Ostern". In Deinem Fall könntest Du auf diese Weise die Werte für Deine Matrix übergeben. Du musst halt nur aus diesen Werten, die ja als Strings reinkommen, dann ints machen und damit Deine Matrix (2D Array) füllen.


----------



## Guest (14. Apr 2006)

Im eindimensionalen verstehe ich das ganze auch mit Einlesen 
von Arrays, was mir aber Probleme bereitet ist unter anderem 
der Zeilenumbruch bzw "\n".  

```
import IOulm.*;

public class matr {
	
	public static final int cols = 4;
	public static final int rows = 3;
	
	
	public static void main(String[] args) {
		
	
		char eingabe;
		int enter=0;
		
		Write.Line("Bitte geben Sie eine Matrix ein:");
		while(Urc.readChar()){                          //Urc.readChar ist eine Vereinfachung zum Einlesen für uns Noobs
			eingabe = Urc.getChar();              // Urc.getChar ebenfalls 
			if(eingabe == '\n'){
				enter = enter+1;
			}
			if (enter == rows){                    // beim 3. Mal Enter wird die Aufgabe bearbeitet
				Write.Line("Aufgabe wird bearbeitet");

			}
		}
	}
}
```

Wenn ich jetzt nen anstelle Char eben String einlesen lasse, kann ich in meiner Dos-Umgebung so viele Enter drücken 
wie ich will, ... es wird immer weiter eingelesen ...


----------



## Beni (14. Apr 2006)

Wenn das "Urc"-Dingsbums ein String einliest, wird das "Enter" vielleicht abgeschnitten? Es wäre interessant zu wissen ob "String einlesen" bis zum nächsten Leerzeichen liest, oder ob das die ganze Linie ist (dann müsstest du einfach row-mal einen String lesen).


----------



## Guest (14. Apr 2006)

"einfach" hört sich schon mal gut an ... 
String einlesen ist bis zum Ende der Zeile.
Heißt das, dass jede neue Zeile ein neuer String ist? ... 
damit lässt sich dann wohl arbeiten. 
Thx bis dahin .


----------



## Guest (15. Apr 2006)

Wo hab ich hier denn meinen Fehler? 


```
import IOulm.*;

public class matr {
	
	public static final int cols = 4;                           //Zeilenlänge
	public static final int rows = 3;                         // Zeilenanzahl
	
	
	
	public static void main(String[] args) {
		
	
		int i=0;
		int j=0;
		String[][] eingabeArray = new String[rows][cols]; 
	
		
		Write.Line("Bitte geben Sie eine Matrix ein:");
		
		while(Urc.readString()){
			
	 		eingabeArray[i][j] = Urc.getString();
			
				if(eingabeArray[i].length==cols){            //wenn das array der Reihe i die Länge cols hat
				i++;                                                     // wird die Reihe gezählt;
				if (i==rows) {                                       // wenn 3 Reihen vorhanden sind, verlässt er die Schleife
					break;
				}
			}
		}Write.Line("Es kann weiter gearbeitet werden");    // Kontrollausgabe ...... 
	}
}
```

Ausgabe lautet: 
1234
2345
3456
Es kann weiter gearbeitet werden

Allerdings ist auch möglich:
12345678
23456789
34567890
Es kann weiter gearbeitet werden

Dachte da müsste ein "Stack Overflow" erscheinen, weil das array ja maximal die Größe "cols=4" hat. 
Oder is das mal wieder n dummer Zufall dass das Programm läuft? 
Wie kann ich denn jetzt das Zeichen an der Stelle_[j] ausgeben? 
anstelle von 


		Code:In die Zwischenablage kopieren


Write.Line("es kann weiter gearbeitet werden") ;

könnte ich doch 


		Code:In die Zwischenablage kopieren


Write.Line(""+eingabeArray[1][2]);

schreiben ... 
Als Ergebnis liefert er mir dann

1234
2345
3456
4567
null

Ich hab echt keinen Plan, ... und falls ich zur Belustigung beitrage mit dem Quelltext
macht das auch nix. Dann er wenigstens überhaupt einen Sinn _


----------



## Guest (17. Apr 2006)

So denn, nach reger Hilfe und Beiträgen is das wohl ein Lösungsweg ... 


```
int [][] TransposeMatrix(int [][] m){

        //neue matrix vertauscht
        int [][] neu = int[cols][rows];
        //zwei for schleifen und werte kopieren
        for(int x=0;x<cols;x++)
                for(int y=0;y<rows;y++)
                        neu[x][y]=m[y][x];
        return neu;

}

void PrintMatrix(int [][] m){

        //zwei for schleifen und werte ausgeben

}

int [][] ReadInput(){

        //neue matrix erstellen
        int [][] m= int[rows][cols];

        //spalten und zeilen durchgehen und mit werten füllen
        for(int y=0;y<rows;y++)
        {
                for(int x=0;x<cols;x++){

                        int i einlesen;
                        m[y][x]=i;
                }
                //nach cols eingaben wieder von vorne anfangen
                System.out.Write("\n");

        }
        return m;
}
```


----------

