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.
Zeichen aus Strings auslesen und in zweidimensionalen Reihungen positionieren.
Ich komme mal wieder mit einer Aufgabe nicht weiter. Ich möchte eine Reihung mit 7 Zeilen und 4 Spalten verschlüsseln, indem ich die Reihung "spiegle".
Also ich möchte, dass der eingegebene Text in eine Reihung mit 7 Zeilen und 4 Spalten umgewandelt wird.
Diese Reihung moechte ich dann wiederrum in eine andere Reihung mit 4 Zeilen und 7 Spalten umgewandeln.
So dass am Ende ein verschlüsselter Text ausgegeben wird.
Kann mir jemand einen Tip geben, wie ich das am Besten angehe?
(mir ist klar, dass ich so nur eine begrenzte Anzahl von Zeichen eingeben kann, das ist ok)
Hab mich hier wohl etwas kompliziert ausgedrückt. Ich wollte nur nicht den Eindruck erwecken, dass ich hier meine Aufgaben von anderen gelöst haben möchte. Ich weiss hier nur absolut nicht, wie ich anfangen soll.
Das ist die Aufgabe:
Programmieren Sie ein Verschlüsselungsverfahren zur Kodierung von Texten. Sender und Empfänger vereinbaren einen Schlüssel der geheim bleiben soll und nicht mit übertragen wird. Dieser Schlüssel legt die Anzahl von Zeilen und Spalten einer zweidimensionalen Reihung fest.
Für Ihre Aufgabe sei der Schlüssel (7, 4), Sender und Empfänger benutzen also eine Reihung mit 7 Zeilen und 4 Spalten.
Der Sender schreibt seinen Klartext unter Auslassung der Leerzeichen zeilenweise in eine solche Reihung. Ist die Reihung nicht voll, so wird sie durch willkürliche Zeichen aufgefüllt.
Beispiel:
Klartext:
Loesung Einsendeaufgabe 16-02!
Kodierung:
L o e s
u n g E
i n s e
n d e a
u f g a
b e 1 6
- 0 2 !
Verschlüsselter Text:
Luinub-onndfe0egseg12sEeaa6!
Das ist mein Quellcode, den ich mir bis jetzt zusammengeflickt habe, ohne wirklich zu wissen, was ich tatsaechlich mache
Java:
import vfh.prog1.bib.Konsole;
public class Codierung {
public static void main (String[]args){
String[][] klartext = new String[7][4];
int auffuellen = 0;
int textlänge = 28;
int count = 0;
String code;
}
//Methode zum einlesen
public void einlesen() {
String klartext = Konsole.getInputString("Bitte Text ohne Leerzeichen eingeben: ");
int auffuellen = 28 - klartext.length();
if (auffuellen<0){
System.out.println ("Der Text darf maximal 28 Zeichen enthalten");
}
else {
//text verschlüsseln
for(int j = 0; j < 7; j++) { // zeilen
for(int n = 0; n < 4; n++) { // spalten
int count;
klartext[j][n] = klartext.charAt(count);
count++;
// den text aus dem array nehmen und umwandeln
for(int m = 0; m < 4; m++) {
// spalten
for(int o = 0; o < 7; o++) {
//zeilen
}}}}}}}
also im Prinzip warst Du schon auf dem richtigen Weg... Ich hab hier mal 'ne kleine
Musterloesung für Dich, jedoch habe ich darin das Einlesen und das Auffüllen des
Arrays mit beliebigen Zeichen ausgelassen. Das solltest Du denke ich als kleine
Übung mal selbst zu Ende schreiben.
Also hier ist der Snippet:
Java:
public class Codierung {
public static void main (String[]args) {
String klartext = "LoesungEinsendeaufgabe16-02!";
System.out.println(codierung(klartext));
}
public static String codierung(String text) {
// Varieble zur Speicherung des Ergebnisses
String code = new String();
// Das 28 Felder Array
String[][] matrix = new String[7][4];
if (text.length()>28) {
System.out.println("String zu lang!!!");
} else {
// Matrix aufbauen
for (int i=0; i<7; i++) {
for (int j=0; j<4;j++) {
// +"" benutze ich, um das char in String umzuwandeln
matrix[i][j] = new String(text.charAt(i*4+j)+"");
}
}
// Code berechnen
for (int i=0; i<4; i++) {
for (int j=0; j<7;j++) {
code = code.concat(matrix[j][i]);
}
}
}
return code;
}
}
wieso probierst du nicht einfach mal ein 2D Array ganz normal zu füllen also einfach von hand in den code eingeben ?
so machst du es dir einfacher für den anfang
und wenn ich so weit wäre würde ich mir ein blatt papier zur hand nehmen und das Array in eine art achsenkreuz einzeichnen und schaun (je nach dem welche spiegelung du machen willst sprich horizontal, vertikal oder diagonal) welche Koordinaten Ausdem Array vertauscht werden müssen
so kann ich mir sowas immer besser vorstellen
charAt habe ich schon kennengelernt: "·Gibt das Zeichen an der Indexposition zurück"
Bedeuted dann i*4, dass in dem neuen String das 4. Zeigen des 1.Arrays an erster Position steht?
das +j kann ich mir leider überhaupt nicht erklären.
Für das auffüllen, wenn weniger Zeigen als 28 eingegeben werden dachte ich ich könnte strBuild.append verwenden, das funktioniert leider nicht meinst Du, dass liegt an meinen Schleifen oder ist das einfach ungeeignet um den String aufzufüllen.
Ich hab bei den Schleifen
Das sieht gerade so aus (Die Klammern sind bei mir immer so wild, die werden zum Schluss geordnet)
Java:
import vfh.prog1.bib.Konsole;
public class Codierung {
public static void main (String[]args) {
String klartext = Konsole.getInputString("Bitte Text ohne Leerzeichen eingeben: ");
System.out.println(codierung(klartext));
}
public static String codierung(String text) {
// Varieble zur Speicherung des Ergebnisses
String code = new String();
// Das 28 Felder Array
String[][] matrix = new String[7][4];
if (text.length()>28) {
System.out.println("String zu lang!!!");}
else if (text.length()< 28) {
StringBuilder str = new StringBuilder();
for (int a = 0; a < 28; a++) {
str.append(a);
// Matrix aufbauen
for (int i=0; i<7; i++) {
for (int j=0; j<4;j++) {
// +"" benutze ich, um das char in String umzuwandeln
matrix[i][j] = new String(text.charAt(i*4+j)+"");
}}}}
else{
// Matrix aufbauen
for (int i=0; i<7; i++) {
for (int j=0; j<4;j++) {
// +"" benutze ich, um das char in String umzuwandeln
matrix[i][j] = new String(text.charAt(i*4+j)+"");
}
}
}
// Code berechnen
for (int i=0; i<4; i++) {
for (int j=0; j<7;j++) {
code = code.concat(matrix[j][i]);
}
}
return code;}}
@ Cem
Auch ganz vielen Dank!
So fange ich auch normalerweise an, bei der letzten Übung hat das auch wunderbar funktioniert, aber hier hat es mich nicht weitergebracht.
Die Frage ist nun, wie Du es schaffst, gleichzeitig durch beide zu laufen; und zwar
den String Zeichen für Zeichen (0-27),
das Array bzw. Feldeintrag für Feldeintrag (erst die erste Zeile, dann die zweite, usw.).
Am einfachsten ist es, wenn Du zwei Schleifen nimmst mit 2 Indexen (hier i,j) jeweils für
die Zeilen, bzw. Spalten (soweit warst Du ja selbst schon).
Nun musst Du einen Trick anwenden, um Dir aus den 2 Indexen die eindimensionale Position
im String zu berechnen. Dieser Trick ist gerade (i*Zeilenlänge + j): und zwar sorgt dieser
dafür, dass wenn i=0 ist, Du mit j durch die erste Zeile läufst (0*Zeilenlänge = 0 und j geht
von 0 bis 3). Die äußere Schleife erhöht nun i auf 1 und i*Zeilenlänge ist somit 4; mit der
inneren Schleife läufst Du nun also von 4 bis 7. Und dies wiederholt sich dann für das
gesamte Feld... Am besten steigst Du da durch, wenn Du dir Bleistift und Papier nimmst und
jeden einzelnen Schritt selbst durchrechnest... So hatte ich es mir mal veranschaulicht.
Für das auffüllen, wenn weniger Zeigen als 28 eingegeben werden dachte ich ich könnte
strBuild.append verwenden, das funktioniert leider nicht meinst Du, dass liegt an meinen Schleifen oder ist das einfach ungeeignet um den String aufzufüllen.
Java:
if (text.length()< 28) {
StringBuilder str = new StringBuilder();
for (int a = 0; a < 28; a++) {
str.append(a);
}
}
Du erzeugst hier einen neuen StringBuilder str, den Du mit Werten von 0-27 füllst.
Und dann verwendest Du ihn nirgends ???:L... Macht irgendwie keinen Sinn...
Was Du doch eigentlich willst, ist, dass wenn der String in Variable text < 28 ist, Du
diesen mit Zeichen füllst... Und zwar mit genau (28 - text.length) vielen Zeichen. Also
sollte Deine Schleife von 0 bis (28-text.length) gehen, und darin solltest Du beliebige
Zeichen an das Ende der Variable text anhängen. Ein String hat im Gegensatz zu
StringBuffer oder StringBuilder keine append Methode, also kannst Du es rudimentär mit
Danke für die super Erklärung, jetzt hab´s sogar ich verstanden.
Hab das Ganze jetzt mal etwas kommentiert und versuche mich gerade daran deen String in Char umzuwandeln mit toCharArray(). "" ist mit sicherheit die schönere Lösung, aber wir sind in der Uni gerade bei diesem Thema.
Es will aber wie immer nicht funktionieren. Hast Du einen Tip, was ich falsch mache?
Ich hab das versucht an ganz unterschiedlichen Stellen zu positionieren, aber nutzt alles nichts...
Java:
public class Codierung {
public static void main (String[]args) {
String klartext = Konsole.getInputString("Bitte Text ohne Leerzeichen eingeben: "); //der Benutzer gibt den Text ein
System.out.println(codierung(klartext)); //der codierte Text wird ausgegeben
}
public static String codierung(String klartext) {
String code = new String(); // Variable zur Speicherung des Ergebnisses
String[][] matrix = new String[7][4]; // Ein Array mit 28 Feldern wird erstellt (7 Zeilen, 4 Spalten)
if (klartext.length()>28) { //falls mehr als 28 Zeichen eingegeben werden wird
System.out.println("String zu lang!!!");} //der Benutzer darauf hingewiesen
while (klartext.length()<28){ //falls weniger als 28 Zeichen eingegeben werden,
klartext = klartext +"X"; //wird der Rest mit "X" aufgefüllt
}
// Kodierung
// Der String und das Array sollen gleichzeitig durchlaufen werden
for (int i=0; i<7; i++) { //i = Zeilen
for (int j=0; j<4;j++) { //j = Spalten
// +"" benutze ich, um das char in String umzuwandeln
char c[];
c = klartext.toCharArray();
matrix[i][j] = new String(c.charAt(i*4+j)); //Zeilen * Zeilenlänge + Spalten
/*(i=0, 0 * 4 = 0, j durchläuft 0-3
* i=1, 1 * 4 = 4, j durchläuft 4-7
* i=2, 2 * 4 = 8, j durchláuft 8-11)
*/
}
}
// Verschlüsselung
for (int i=0; i<4; i++) { // Es werden zunächst die Buchstaben der 1. Spalte, dann der 2., 3., und 4. ausgegeben
for (int j=0; j<7;j++) { // dann der 2., 3., und 4. ausgegeben. (Zeilen -> Spalten, Spalten -> Zeilen)
code = code.concat(matrix[j][i]); // code wird in die "umgekehrte" Matrix eingefügt
}
}
return code;
}
}
also Du hast ein char-Array c deklariert und auf die Elemente eines Arrays greifen wir mit [] zu.
Hier also c[i*4+j]...
Der Konstruktor für den String erwartet einen String als Parameter; also
wirst Du noch einen kleinen Trick anwenden müssen, um aus dem Char
in c einen String zu machen...
Als Hinweis: ich hatte es in meinem ersten Post bereits drin ;-)
sorry, wollte Dich nicht verwirren. Im Prinzip kann man aus einem char ein String machen,
indem man an das char einfach ein +"" anhängt. Sieht zunächst unsauber aus, ist aber
eine gängige Methode. Mit String.valueOf() hast Du aber eine schönere Alternative gefunden.
Das freut mich :toll:!