[C++] v erschlüsselung nach hebräischer methode

WhiteShark

Admiral
Registriert
Mai 2002
Beiträge
9.949
also wir sollen in der schule ein programm schreiben was nach der hebräiscen methode verschlüsselt.

dazu wird die zeichenkette in eine 4x7 matrix spaltenweise geschrieben und zeilenweise ausgelesen.

soll heißen bei hallowelt z.B.:
Zeile1: hallowe
Zeile2: lt

ausgelesen wird hieraus dann hlatllowe


ich hab nun folgenden quellcode:

Code:
#include <iostream.h>

void main()
{

	// Deklaration der Varibalen und Arrays
	char string[30];
	char string2[30];
	char array1[6][3];
	int z=0;
	int s=0;


	// Ausgabe der Beschreibung und Eingabe des Strings
	cout << "Dieses Programm verschluesselt eine Zeichenkette nach dem hebraeischen Verfahren.\n\nBitte geben sie die zu verschluesselnde Zeichekette ohne Lerrzeichen ein.\n";
	cin >> string;



	// Verschlüsselung
	for (int x=0;x>30;x++)
	{
		array1[s][z]=string[x];
		if (s==6)
		{
			s=0;
			z++;
		}
		else
			s++;

	}

	// Auslesen des Verschlüsseltem Arrays
	s=0;
	z=0;
	for (x=0;x>30;x++)
	{
		string2[x]=array1[s][z];
		if (z==3)
		{
			s++;
			z=0;
		}
		else
			z++;

	}
	cout << "Verschluesselte Zeichenkette:\t" << string2 << "\n\n";


}

das problem nun ist das anstatt der verschlüsselten zeichenkette nur ein paar komische zeichen und danach die unverschlüsselte zeichenkette ausgegeben wird.

hat einer ne ahnung woran das liegen kann ?

und hat jemand ne idee wie sich das ganze wieder entschlüsseln lässt ?
 
Re: [c++] v erschlüsselung nach hebräischer methode

sag mal, was bezweckst du den mit
x>30
in der for schleife? das hat doch logisch zur folge, das sie niemals aufgerufen wird.
probier mal x<28.

ausserdem kannst du aus effektivitätsgründen alle deine postinkrements in preinkrements umwandeln, obwohl das für dein programm unwesentlich ist.
 
Re: [c++] v erschlüsselung nach hebräischer methode

Die Bedingungen bei deinen for Schleifen sind falsch herum. Die for-schleifen laufen keine einziges mal durch.
 
Re: [c++] v erschlüsselung nach hebräischer methode

das sind so fehler, die man selber ewig suchen kann und doch nie findet! :D
kennt wohl jeder der schonmal sowas geschrieben hat! *G*
 
Re: [c++] v erschlüsselung nach hebräischer methode

oh danke, man wie dämlich :-)

nur des funzt irgendwie noch immernet so ganz.

er verschlüsselt zwar nun, aber auch nur teilweise. an manchen stellen kommen weiterhin so komische zeichen, anstatt buchstaben.
liegt das eventuell an leeren spalten im array ? wie kann ich abfragen ob die spalte im array leer ist ?
 
Re: [c++] v erschlüsselung nach hebräischer methode

So... ich hab das mal ohne die 7x4-Matrix (btw: du brauchst "char array1[7][4];", nicht 6-3) aufgebaut... allerdings in PHP...
Sobald du weisst, wie lang (in Zeichen) dein verschlüsselter String ist, kannst du ihn entschlüsseln. Du bist dabei auch nicht auf 28 Zeichen beschränkt.
Hier der Code:
PHP:
<?PHP
function dump_array($x) {
  for ($i=0; $i<strlen($x); $i++) {
    if (!($i%7)) echo "\n+".str_repeat('---+',7)."\n|";
    echo ' '.$x[$i].' |';
  }
  for (;$i<28 || ($i%7!=0);$i++) {
    if (!($i%7)) echo "\n+".str_repeat('---+',7)."\n|";
    echo 'XXX|';
  }
  echo "\n+".str_repeat('---+',7)."\n";
}

$txt1 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ12345';
dump_array($txt1);

$txt2 = '';
for ($i=0; $i<7; $i++) for ($j=$i; $j<strlen($txt1); $j+=7) $txt2 .= $txt1[$j];
dump_array($txt2);

$len = strlen($txt2); $lap = $len%7; $split = floor($len / 7);
$txt3 = '';
for ($i=0; $i<=$split; $i++) {
  $p = $i;
  for ($j=0; $j<$lap; $j++,$p+=$split+1) $txt3 .= $txt2[$p];
  if ($i<$split) for (; $j<=7; $j++,$p+=$split) $txt3 .= $txt2[$p];
}
dump_array($txt3);
 
Re: [c++] v erschlüsselung nach hebräischer methode

Code:
for (int x=0;x>30;x++)
{
	array1[s][z]=string[x];
	[B][COLOR=Red]if (s==6)[/COLOR][/B]
	{
		s=0;
		z++;
	}
	else
		s++;

}


das läuft dann so ab:

durchlauf -> "speicheradresse"
#1 -> arrayl[0][0]
#2 -> arrayl[1][0]
#3 -> arrayl[2][0]
#4 -> arrayl[3][0]
#5 -> arrayl[4][0]
#6 -> arrayl[5][0]
#7 -> arrayl[6][0]
#8 -> arrayl[0][1]
#9 -> arrayl[1][1]
...

und hier liegt der fehler. dein array hat nur 6 felder ( in s richtung), du bist heir aber im 7. feld (0 zählt mit!), sprich außerhalb des arrays.

genau das gleiche problem hast du beim auslesen. da lässt du auch z=3 zu.
 
Re: [c++] v erschlüsselung nach hebräischer methode

ausserdem würde ich noch die klasse string.h einbinden.
Dann kannst du mit strlen die länge deines Strings auslesen und die Forschleife nur genau solange durchlaufen wie nötig.

int length = 0;

length = string.strlen();

for(x=0;x<length;x++){}
...

MfG

Matthias
 
Re: [c++] v erschlüsselung nach hebräischer methode

Öhm... string issn basic_string<wasweissich>... und der wiederum issn rope<wasweissich>....
Folglich hast du Iterator und kannst auf den for(x=0;x<length;x++) verzichten ;)
 
Re: [c++] v erschlüsselung nach hebräischer methode

das musst du mal genauer erkären.
Es ist doch nur logisch das die Schleife nur so oft durchlaufen wrd wie nötig. Wenn ic aber 30 zeichen vorgebe wird die schleife 30x durchlaufen egal ob was drin steht oder nicht.
 
Re: [c++] v erschlüsselung nach hebräischer methode

Also ich hätte das ganze in etwa so gelöst:
Was mich ein bissal Wurmt ist die begrenzte Stringlänge.
Was muss ich ändern, um nen unbegrenzt langen String benutzen zu können?

Sorry für die doofe Frage, aber ich kann C++ ned so wirklich und so wie ich das immer im Borland gemacht hab, gibt der DevCpp nen Fehler aus.

Und warum darf die Funktion nicht den Rückgabewert shortstring haben?

Code:
#include <stdio.h>
#include <conio.h>
#include <string.h>
typedef char shortstring[256];

int crypt(shortstring &eingabe)
{
  //Matrix erstellen
  shortstring matrix[7];
  int x=0;
  int j=0;
  for(int i=0;i<strlen(eingabe);i++)
  {
    matrix[j][x]=eingabe[i];
    //String terminieren
    matrix[j][x+1]=char(0);
    if(j<6)
    {
      j++;
    }
    else
    {
      j=0;
      x++;
    }
  }
  //Matrix auslesen
  strcpy(eingabe,"");
  for(int i=0;i<7;i++)
  {
    strcat(eingabe,matrix[i]);
  }
  return 0;
}

int main()
{
  shortstring eingabe;
  printf("Bitte geben Sie eine Zeichenkette ein.\nEingabe: ");
  scanf("%[^\n]",&eingabe);
  crypt(eingabe);
  printf("Verschluesselt: %s\n",eingabe);
  getch();
  return 0;
}

Achso: Ich hab das mal so gemacht, dass man auch Leerzeichen eingeben darf.
Sonst isses ja nur halb so schön ;)
 
Zuletzt bearbeitet:
Re: [c++] v erschlüsselung nach hebräischer methode

Code:
Also wenn du das ganze variabel gestalten willst sollte das so aussehen:


[INDENT]#include <stdio.h>
#include <conio.h>
#include <string.h>
//typedef char shortstring[256];

int crypt(string &eingabe)
{
  int length = 0;
  length = strlen(eingabe).c_str();
  int x_matrix = length-2;
  int y_matrix = lenght/2;
  //Matrix erstellen
  char temp_zeichen[1];
  char matrix[x_matrix][y_matrix];
  int x=0;
  int j=0;
  for(int i=0;i<length;i++)
  {
    strncpy(temp_zeichen, eingabe, i+1)
    matrix[j][x]= temp_zeichen;
    //String terminieren
    //matrix[j][x+1]=char(0);
    matrix[j][x+1]="\0";
    if(j<6)
    {
      j++;
    }
    else
    {
      j=0;
      x++;
    }
  }
  //Matrix auslesen
  //strcpy(eingabe,"");
  eingabe = "\0"
  for(int i=0;i<7;i++)
  {
    strcat(eingabe,matrix[i]).c_str();
  }
  return 0;
}

int main()
{
  string eingabe;
  printf("Bitte geben Sie eine Zeichenkette ein.\nEingabe: ");
  //scanf("%[^\n]",&eingabe);
  cin >> eingabe;
  crypt(eingabe);
  //printf("Verschluesselt:"eingabe);
  cout << "Verschlüsselt: " << eingabe <<endl;
  getch();
  return 0;
}[/INDENT]

durch die dynamischen x und y werte erhält die Matix eine dynamische größe. Statt -2 und /2 kann man natürlich auch beliebige werte einsetzen.
Allerdings macht es so denke ich am meisten sinn.
Was noch fehlt ist eine rundungsfunktion damit zum Beispiel bei 7 nicht 3,5 rasukommt. Passt nämlich icht ganz in nen Integer und würde wahrscheinlich nen fehler geben!


wer fehler findet darf sie korrigieren, mir mitteilen und dann behalten. :)
 
Re: [c++] v erschlüsselung nach hebräischer methode

O_o ROFL
Das geht aber so nicht, die Array-Grössen müssen in C(++) konstant sein.
Andernfalls musst du mit new char[x][y] arbeiten...
 
Re: [c++] v erschlüsselung nach hebräischer methode

deinen array kannst du nicht mittels vorher unbekannter variablen definieren. leider. das musst du über malloc machen. findet man glaube ich in der stdlib.h
 
Re: [c++] v erschlüsselung nach hebräischer methode

13thAngel schrieb:
das musst du mal genauer erkären.
Du kannst einen sog. Iterator (Typ: std::string::iterator) anlegen, den du auf das erste Zeichen setzt.
Wenn du dann ++dein_iterator; aufrufst zeigt er aufs nächste Zeichen, usw...:
Code:
// Gibt "Hallo, Welt!" aus.
std::string str("Hallo, Welt!");
for (std::string::iterator it=str.begin(); it!=str.end(); ++it) std::cout << *it;
std::cout.flush();


@ jbJOGI:
Siehe auch: https://www.computerbase.de/forum/t...-dynamischem-speicherplatz.71337/#post-725773 ;)
 
Zuletzt bearbeitet:
Re: [c++] v erschlüsselung nach hebräischer methode

jbJOGI schrieb:
Code:
for (int x=0;x>30;x++)
{
	array1[s][z]=string[x];
	[B][COLOR=Red]if (s==6)[/COLOR][/B]
	{
		s=0;
		z++;
	}
	else
		s++;

}


das läuft dann so ab:

durchlauf -> "speicheradresse"
#1 -> arrayl[0][0]
#2 -> arrayl[1][0]
#3 -> arrayl[2][0]
#4 -> arrayl[3][0]
#5 -> arrayl[4][0]
#6 -> arrayl[5][0]
#7 -> arrayl[6][0]
#8 -> arrayl[0][1]
#9 -> arrayl[1][1]
...

und hier liegt der fehler. dein array hat nur 6 felder ( in s richtung), du bist heir aber im 7. feld (0 zählt mit!), sprich außerhalb des arrays.

genau das gleiche problem hast du beim auslesen. da lässt du auch z=3 zu.

oh man danke. darauf hätt ich selbst kommen müssen.
aber das prob ist jetzt das es zwar soweit funktioniert, er also verschlüsselt, aber es werden auch die leeren spalten dann ausgegeben. und das sind dann so komische zeichen. ich bräuchte och eine abfrage ob das feld leer ist.
 
Re: [c++] v erschlüsselung nach hebräischer methode

.oO( Ich komme mir überlesen vor... )
 
@life

nein, ich glaube wir reden eineinander vorbei.

folgendes geht:
Code:
int laenge=2;
char laber[laenge];
das auch:
Code:
int laenge;
laenge=2;
char laber[laenge];
folgendes aber nicht:
Code:
int laenge;
scanf("%d", &laenge);
char laber[laenge];

die ersten 2 beispiele funzen, weil die länge immer 2 ist. sobald die länge zum zeitpunkt des compilierens aber nicht bekannt ist, gibts fehlermeldungen.
wenn du solche "dynamischen felder" haben möchtest, musst du das so machen:

Code:
int laenge, *laber;    //laber wird zum zeiger
scanf("%d", &laenge);
laber = (int *) malloc(laenge*sizeof(char));
if(laber== NULL){   //nur zur kontrolle ob speicher reserviert, sonst abbruch
   printf("\nFEHLER: Kein Speicher konnte reserviert werden!\n");
   return 1; 
}
....
 
jbJOGI schrieb:
@life

nein, ich glaube wir reden eineinander vorbei.
Ich glaube, du meintest jemand anders :)

jbJOGI schrieb:
folgendes geht:
Code:
int laenge=2;
char laber[laenge];
das auch:
Code:
int laenge;
laenge=2;
char laber[laenge];
Nein, das geht erstmal nicht, es muss eine Konstante in den Array-Klammern stehen.
Es kann jedoch sein, dass der Compiler dort schon optimiert, bevor er compiliert... das MUSS er aber nicht und wenn er es nicht tut gibts nen Fehler.
-> Auch wenn es zu funktionieren scheint: Finger weg!
 
also unser proff hats uns so gezeigt und Dev-C++ kann das auch. theoretisch hast du natürlich recht.
und ich meinte schon dich, aber vielleicht habe ich bei dem link einfach nicht das gesehen, was du mir zeigen wolltest! :D
 
Zurück
Oben