Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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
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.
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.
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
Code:
> 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.
Im eindimensionalen verstehe ich das ganze auch mit Einlesen
von Arrays, was mir aber Probleme bereitet ist unter anderem
der Zeilenumbruch bzw "\n".
Code:
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 ...
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).
"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 .
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:
Write.Line("es kann weiter gearbeitet werden") ;
könnte ich doch
Code:
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
So denn, nach reger Hilfe und Beiträgen is das wohl ein Lösungsweg ...
Code:
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;
}