# Texte kodieren



## wusel81 (5. Jan 2005)

So kaum ein mit der tollen Hilfe hier gelöst das nächste was ich nach stundemlangem probieren nicht peile...

Ziel: Zeichen aus Strings auslesen und in zweidimensionalen Reihungen positionieren.

Ein Schlüssel legt die Anzahl von Zeilen und Spalten einer zweidimensionalen Reihung fest. 
Der Schlüssel sei (7, 4) (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.

Beliebig lange Texte sollen kodiert werden können...
aber erstmal...

Klartext:
 Loesung dieser kniffligen Aufga


Kodierung:
L o e s 
u n g d
i e s e
r k n i
f f l i
g e n A
u f g a


Verschlüsselter Text:
 LuirfguonekfefegsningsdeiiAa

Hab folgendermaßen angefangen:

```
import vfh.prog1.bib.Konsole;

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

	  String text;
	  String[][] reihe;
	  System.out.println("Geben Sie bitte den zu verschluesselnden Text ein:");

// Text wird über die Konsole eingegeben
	  text = Konsole.getInputString();

reihe = new String[7][4];    // hier soll jetzt eigentlich die Tabelle entstehen...

System.out.println(reihe);
}
}
```

Bekomme diesen Fehler: [[Ljava.lang.String;@77d134


----------



## mic_checker (5. Jan 2005)

Hi,
also wenn ich mich nicht täusche handelt es sich dabei nicht um einen Fehler.

Du gibst reihe aus, bei reihe handelt es sich um ein zweidimensionales array. Bei der Ausgabe müsste es sich um etwas wie die Speicheradresse handeln - bitte korrigieren wenn ich mich täusche.
Außerdem tritt ja auch keine Exception auf.


----------



## wusel81 (5. Jan 2005)

ja also ich ab da glaub ich am wenigsten Ahnung  :roll:  :lol:


----------



## mic_checker (5. Jan 2005)

hi,
also unabhängig davon:

zum "rausschneiden" der leerzeichen aus strings , kannst mal nach StringTokenizer / bzw. StreamTokenizer schauen.

Ansonsten ist zur Lösung noch die Methode charAt(..) ganz sinnvoll.

Geh einfach das zweidimensionale Array durch und speichere den Character in dem entsp. Feld.

Probier einfach mal bissl rum, falls du probleme hast, kannst ja immer noch schreiben.

lösung ist recht einfach...


greets
mic_checker


----------



## wusel81 (6. Jan 2005)

Also ich habs jetzt den ganzen Tag probiert... bin glaub ich einfach zu dumm dazu...


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

// Stringobjekt text wird initialisiert
	String text;
	int a;
	int anzahl;
	String[][] reihe;

	System.out.println("Geben Sie bitte den zu verschluesselnden Text ein:");

// Text wird über die Konsole eingegeben
	text = Konsole.getInputString();

anzahl = text.length();		//Textlänge wird bestimmt

for (a=0; a < anzahl; a++)
System.out.println(text.charAt(a));

reihe = new String [7][4];

reihe = {
	{text.charAt(a)},
	{text.charAt(a)},
	{text.charAt(a)}
};

}
}
```

Hab jetzt zwar den text mit charAt umgewandelt, jedoch weiterhin mit leerzeichen. 
Muss doch jetzt möglich sein, dass er die leerzeichen auslässt oder?

Und dann müssen die einzelnen zeichen ja in die reihe übertragen werden. Nur wie ?


----------



## wusel81 (7. Jan 2005)

Also ich habs jetzt schon fast. 
nur beim schreiben in die zeilen/spalten meckert er...


```
import vfh.prog1.bib.Konsole;

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

	String text;

	System.out.println("Geben Sie bitte den zu verschluesselnden Text ein:");

// Text wird über die Konsole eingegeben
	text = Konsole.getInputString();

String[][] reihe;
int i;
int zeile = 0;
int spalte = 0;
for (i=0; i<text.length(); i++){
     if (text.charAt(i) != ' ') {
         reihe [zeile] [spalte] = text.charAt(i);
         if (spalte == 4) {
                 zeile = zeile +1;
                 spalte = 0;
          				  }
     						    }
							   }
										}
						}
```

Folgender Fehler....

Codierung.java:26: incompatible types
found   : char
required: java.lang.String
         reihe [zeile] [spalte] = text.charAt(i);
                                             ^
1 error


----------



## mic_checker (7. Jan 2005)

Hi,
hab jetzt den restlichen Code nicht auf Korrektheit überprüft, aber der Fehler hat ne ganz einfache Ursache:

charAt(int index) liefert dir ein char zurück, reihe ist ein zweidimensionales feld von strings. mit der zuweisung versuchst du dem string ein char zuzuweisen. Damit der Compiler keine Fehler mehr meldet musst du char in String umwandeln. Kleiner Hinweis -> schau mal in valueOf(...) von String nach...

edit:
ps. ich dachte du wolltest die leerzeichen vorher "rausschneiden", so dass im "verschlüsselten" Text keine Leerzeichen mehr vorkommen?


----------



## wusel81 (7. Jan 2005)

Das hab ich doch hierrüber gelöst:
if (text.charAt(i) != ' ')
er übergeht die leerzeichen beim schreiben in die reihe.

Ja das string kein char ist weiß ich ja. werde mal versuchen das hinzubekommen... thx


----------



## mic_checker (7. Jan 2005)

Dadurch ist es nicht gelöst, wenn du dein Array mit 7 x 4 angibst. Der String ist inklusive Leerzeichen länger als die 28 Zeichen, so packt er nicht alle Zeichen in das zweidimensionale Array. Oder du musst die for etwas umschreiben.


----------



## wusel81 (7. Jan 2005)

Wieso, so macht er doch 4 Spalten und soviel zeilen wie der string lang ist oder?


Ich komm einfach nicht drauf... hab jetzt so probiert

```
reihe [zeile] [spalte] = text.charAt(valueOf(char i));
oder
reihe [zeile] [spalte] = valueOf(text.charAt(i));
```

Klappt nicht.
Wie soll ich valueOf denn anwenden ?


----------



## mic_checker (7. Jan 2005)

Achso, dachte du wolltest unbedingt 7 x 4.

wie wärs mit String.valueOf(ch) ? bzw. bei dir String.valueOf(i)?


----------



## wusel81 (7. Jan 2005)

Na erstmal sollen es nur 7 sein, abr da sbekomm ich hin mit der schleife umprogrammieren.
es sollen ja später beliebig lange texte zu kodieren sein.

habe jetzt so gemacht:
reihe [zeile] [spalte] = String.valueOf(text.charAt(i));

kommt aber prompt der nächste fehler...
Codierung.java:27: variable reihe might not have been initialized
       reihe [zeile] [spalte] = String.valueOf(text.charAt(i));
       ^

reihe hab ich so initilisiert:
String[][] reihe;


----------



## Sky (7. Jan 2005)

```
reihe = new String[...
```


----------



## wusel81 (7. Jan 2005)

@sky: Das will so aber auch nich funzen...


Hab es jetzt so gemacht

String [][] reihe = new String[zeile][spalte];

Compilieren geht, doch beim ausführen kommt folgendes:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException
        at Codierung.main(Codierung.java:29)


----------



## mic_checker (7. Jan 2005)

Du initialisierst das Array mit der Größe zeile x spalte. In der Schleife versuchst du auf das Element [zeile][spalte] zuzugreifen, allerdings fangen arrays bei 0 an zu zählen, so dass dieser Zugriff eine Exception auslöst.
Je nachdem wo du Reihe deklarierst...gibst du ein mehrdimensionales array mit 0 x 0 größe an...was sicher nicht sinn u. zweck des ganzen ist...

Kleiner Tipp:
Machs mit zwei verschachtelten for Schleifen, die eine ist dann für die Zeilen, die andere für die Spalten zuständig.

ps. kannst ja nochmal deinen neuen kompletten source posten


----------



## wusel81 (7. Jan 2005)

wieder gehts kompilieren aber das ausführen bringt dne selben fehler..


```
int i;
int j;
int zeile = 0;
int spalte = 0;
String [][] reihe = new String[zeile][spalte];
         for (i = 0; i < text.length(); i++) {
		       for (j = 0; j < text.length(); j++) {
        reihe[i][j] = String.valueOf(text.charAt(i));

         if (spalte == 4) {
                 zeile = zeile +1;
                 spalte = 0;
```


----------



## mic_checker (7. Jan 2005)

beachte meinen editierten beitrag -> zeile und spalte sind 0. du deklarierst somit ein mehrdimensionales array mit den dimensionen 0 und 0.

lies meinen beitrag nochmal durch. die verschachtelten schleifen sollen nicht beide bis text.length() gehen....sondern eine für zeile , eine für spalte...


----------



## wusel81 (7. Jan 2005)

ja hab ich gelesen, aber zeile und spalte werden doch in er schleife erhöht. 0 ist doch nur der ausgangswert.

ja aber wie lang soll die zeile denn sein wenns je nacht textlänge gehen soll?

ich krieg das echt nich hin... ich bin die ganze zeit am nachlesen aber ich schnalls einfach nicht.


----------



## mic_checker (7. Jan 2005)

Also das hängt jetzt davon ab wie genau du es implementieren willst.

Willst du immer 4 Spalten, bzw. immer 7 Zeilen oder wie genau soll das Array nach Textlänge eingeteilt werden?


----------



## wusel81 (7. Jan 2005)

Der genaue Wortlaut der Aufgabenstellung ist folgender:
Für Ihre Aufgabe sei der Schlüssel (7, 4), Sender und Empfänger benutzen also eine Reihung mit 7 Zeilen und 4 Spalten.

Wie müsste man das Programm erweitern, um beliebig lange Texte zu verschlüsseln?

Dann also würd ich sagen für beliebig lange Texte mit 4 Spalten und x Zeilen...


----------



## mic_checker (7. Jan 2005)

Für den ersten Fall ist es einfach. Du gehst davon aus das 7 Zeilen und 4 Spalten exisitieren und kannst in einer for bis 7 in der anderen bis 4 "zählen".

Für den andern Fall kannst du ja scheinbar selber entscheiden wie du es erweitern willst. Beispielsweise könntest du sagen: Ich will jetzt immer 4 Spalten haben, wenn der Text länger als 28 Zeichen ist, erweiterst du dementsprechend um die Anzahl an Zeilen.

Z.B. 

Textlänge = 32:
Spalten = 4
Zeilen = 8

Textlänge = 30:
Spalten = 4
Zeilen = 8

Textlänge = 100:
Spalten = 4
Zeilen = 25

etc. pp. Welche Operationen dabei ausgeführt werden sollte leicht herauszufinden sein....mach einfach paar beispiele.


Oder du machst eine quadratische Anordnung, d.h. soviele Zeilen wie Spalten....Das musst du dir dann selber überlegen....


----------



## wusel81 (7. Jan 2005)

Ja das ja alles schön und gut aber ich bekomm das einfach nicht in eine form gebracht, sprich ich weiß nicht wie ich diese schleifen programmieren soll...


----------



## mic_checker (7. Jan 2005)

Also, für den Fall der Text ist 28 Zeichen lang:


```
char ch;
		int count = 0;

		for(int i = 0;i < 7;i++)
		{
			for(int c = 0;c < 4;c++)
			{
				ch = text.charAt(count);			
				reihe[i][c] = String.valueOf(ch);			
				count++;	
			}		
		}
```


----------



## wusel81 (7. Jan 2005)

Ich bin zu blöd... ehrlich...

```
String [][] reihe = new String[][];
char ch;
int count = 0;
for(int i = 0;i < 7;i++)
{
for(int c = 0;c < 4;c++)
{
ch = text.charAt(count);
reihe[i][c] = String.valueOf(ch);
count++;
					            }
					         }
```

es geht nicht.


----------



## mic_checker (7. Jan 2005)

Überleg mal, so wie du es da geschrieben hast, kann es nicht funktionieren, du gibst keine Dimensionen an.

In diesem Fall [7][4]


----------



## wusel81 (7. Jan 2005)

es geht trotzdem nicht auch mit 

String [][] reihe = new String[7][4];

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String ind
ex out of range: 4
        at java.lang.String.charAt(String.java:582)
        at Codierung.main(Codierung.java:28)


----------



## mic_checker (7. Jan 2005)

Arg,das war natürlich nicht der komplette code, du sollst ja schon noch bissl selber überlegen   

Post mal deinen ganzen Code...


----------



## wusel81 (7. Jan 2005)

ich sag ja das wird nix mehr mit mir. Mein hirn ist wie leergefegt...


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

	String text;

	System.out.println("Geben Sie bitte den zu verschluesselnden Text ein:");

// Text wird über die Konsole eingegeben
	text = Konsole.getInputString();


String [][] reihe = new String[7][4];
char ch;
int count = 0;
for(int i = 0;i < 7;i++)
{
for(int c = 0;c < 4;c++)
{
ch = text.charAt(count);
reihe[i][c] = String.valueOf(ch);
count++;
                           }
                        }
										}
						}
```


----------



## mic_checker (7. Jan 2005)

Du musst in der inneren for noch was kontrollieren : und zwar ob du mit count über die grenzen von deinem eingegebenen string hinaus gehst (stichwort: length() von Klasse String). Falls der String kürzer als 28 Zeichen, wird das array so mit null "aufgefüllt" (bzw. ist der default-wert wenn du mit nichts initialisierst).


----------



## mic_checker (7. Jan 2005)

Falls dir dieser Ansatz nicht gefällt gibts noch nen anderen, der aber wohl nicht leichter ist (aber weniger zeilen umfasst).

Du könntest mit count solange (z.B. in ner for ) von 0 bis text.length() - 1 zählen, dabei berechnest du anhand von count die Spalten und Zeilen. Stichwort: MODULO Operator.

Beispiel:

count = 0 -> zeile 0 spalte 0
count = 4 -> zeile 1 spalte 0
count = 9 -> zeile 2 spalte 1

Idee???


----------



## wusel81 (7. Jan 2005)

es ist zwecklos ich peils nicht.  
diese ganze java logik geht in mein hirn einfach nicht rein.

ich sitz da jetzt schon 3 tage dran, wobei es nur 3 stunden dauern sollte.
das sagt doch wohl alles !

wäre nett wenn du mir den code einfach hinschreibst. 

den count befehl kenn ich gar nicht, der kam in meinen unterlagen nicht vor (so wie vieles andere auch nicht)


----------



## mic_checker (7. Jan 2005)

Bei count handelt es sich nicht um einen Befehl, sondern lediglich um eine Zählvariable.

Das problem ist, es bringt dir nichts wenn ich dir jetzt den Code schicke. Ich habe schon oft tagelang an irgendwelchen Problemen gesessen. Nachher hätte es mir fast peinlich sein können was für blöde Fehler ich gemacht habe. Aber nur so lernst du es....

Sagt dir der MODULO Befehl überhaupt was?

Falls nicht:  es gibt den Rest der ganzzahligen Division zurück:

% = MODULO

7 % 4 = 3 
4 % 4 = 0
9 % 4 = 1
10 % 4 = 2


Aber zum ersten Ansatz:
Mit dem Code den du bisher hast ist es fast gelöst, du musst nur in die innere for noch ein Bedingung hinzufügen u. zwar musst du gucken ob count kleiner als die textlänge ist. Das ganze jetzt nur noch von Deutsch in Java übersetzen


----------



## wusel81 (7. Jan 2005)

aha...

ja das weiß ich auch aber ich hab nur noch bis Sonntag Zeit und morgen bin ich den ganzen tag unterwegs, d.h. ich schaffe das nie. und ich weiß, ich komm mir immer völlig blöd vor und es ist mor oberpeinlich weils so simpel ist.

MODULO habe ich noch nie in meinem Leben gehört!

Ich bekommsnich hin ist echt zwecklos.


```
text = Konsole.getInputString();
String [][] reihe = new String[7][4];
char ch;
int count = 0;
for(int i = 0;i < 7;i++)
	{

	for(int c = 0;c < 4;c++)
if count < text.length()
	{
ch = text.charAt(count);
reihe[i][c] = String.valueOf(ch);
count++;
                           }
                        }
						}
```


----------



## mic_checker (7. Jan 2005)

Hast du schonmal was von Klammersetzung bei Schleifen/If gehört?


```
if (count < text.length())
```

Außerdem muss hinter die zweite for ne geschweifte Klammer und ans Ende vom Block natürlich nochmal ne geschlossene.

Btw. check your pm eingang


----------

