Zeichen aus Strings auslesen und in zweidimensionalen Reihungen positionieren.

Sophie

Bekanntes Mitglied
Hallo Zusammen

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)

Danke und Gruss
Sophie
 
Also ich möchte, dass der eingegebene Text in eine Reihung mit 7 Zeilen und 4 Spalten umgewandelt wird.
Was verstehst Du unter Reihung? Willst Du die einzelnen Buchstaben des Textes in einem [7][4] Array ablegen?
Ich möchte eine Reihung mit 7 Zeilen und 4 Spalten verschlüsseln, indem ich die Reihung "spiegle".
Du möchtest das Array spiegeln? Horizontal? Vertikal? Diagonal?

Was hast Du denn bereits bzw. woran hängt's? Den Text in eine "Reihung" zu wandeln? Zu spiegeln?
 
Guten Abend!

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
		  			
		  	       
		  			}}}}}}}
 
Hi Sophie,

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;
    }    
}

Nun, viel Erfolg mit dem Rest...

Grüße,
Maik
 
zu dem hier 🙂

Code:
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  {

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 😉

also ungefair so

Code:
String[][] meinText = {{"L","o","e","s"},{"u",....

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 🙂

mfg Cem
 
Hallo Maik

Dank Dir!

Ich habe noch eine Frage zu Deinem Code

Java:
matrix[i][j] =  new String(text.charAt(i*4+j)+"");

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.

Gruss
Sophie
 
Hi Sophie,

Ich habe noch eine Frage zu Deinem Code
Java:
matrix[i][j] =  new String(text.charAt(i*4+j)+"");

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.

ich versuche es mal schrittweise zu erklären.

Also Du hast 2 Arten von Speicher
  • ein 28 Zeichen langen String (eindimensional),
  • ein 4*7 Felder großes Array (zweidimensional).
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
Code:
text = text+"X";
erledigen. Hierbei werden nun X'e aufgefüllt; möchtest Du das
mit zufälligen Zeichen machen, solltest Du mit Math.random() arbeiten... Schau am
besten mal auf der Insel nach Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 5.6 Die Random-Klasse.

Viele Grüße,
Maik
 
Hallo Maik

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;
      }

}
 
Hi Sophie,

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 ;-)

Schöne Grüße
Maik
 
Hallo Maik

Ich bin gerade einfach nur zu verwirrt ...
Ich wollte eigentlich nur die "" ersetzen. Also char in String umwandeln.

Java:
matrix[i][j] = new String (String.valueOf(klartext.charAt(i*4+j)));

Jetzt funktioniert aber alles, wie ich es möchte. Hab jetzt auch die zufälligen Zeichen mit eingebaut.
Vielen Dank für Deine Hilfe!


Sophie
 
Hi Sophie,

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:!

Grüße,
Maik
 

Neue Themen


Zurück
Oben