Texte kodieren

Status
Nicht offen für weitere Antworten.

wusel81

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

Top Contributor
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.
 

mic_checker

Top Contributor
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

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

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

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

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

Top Contributor
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

Mitglied
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

Top Contributor
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

Mitglied
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
Code:
reihe [zeile] [spalte] = text.charAt(valueOf(char i));
oder
reihe [zeile] [spalte] = valueOf(text.charAt(i));

Klappt nicht.
Wie soll ich valueOf denn anwenden ?
 

wusel81

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

wusel81

Mitglied
@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

Top Contributor
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

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

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

Top Contributor
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

Mitglied
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

Top Contributor
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

Mitglied
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

Top Contributor
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

Mitglied
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

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

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

Mitglied
Ich bin zu blöd... ehrlich...
Code:
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

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

In diesem Fall [7][4]
 

wusel81

Mitglied
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

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

Post mal deinen ganzen Code...
 

wusel81

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

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

Top Contributor
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

Top Contributor
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

Mitglied
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

Top Contributor
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

Mitglied
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.

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

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

Code:
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
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben