bin derzeit am Studieren, in der Richtung Informatik.
Beim Programmieren hab ich derzeit keine Probleme gehabt, nur diese Aufgabe lässt mich einfach nicht los.
Das bereits geschriebene Programm funktioniert, nur es gibt einen Fehler den ich einfach nicht lösen kann, entweder denk ich zu kompliziert oder übersehe etwas.
Nun genug davon, hier die Aufgabe:
Es geht um die Programmierung einer Skytale.
Was eine Skytale ist: http://www.mathe.tu-freiberg.de/~hebisc ... ytale.html
Hier die Main Funktion die Vorgegeben ist:
Code: Alles auswählen
void skytale(char * in, int n, char * out);
int main() {
char s1[1000] = "DIESERKLARTEXTISTJETZTZUVERSCHLUESSELN12",
s2[1000]="***bereits*verwendete*zeichenkette*mit*inhalt***", // Verschlüsseln hier hinein
s3[1000]; // Entschlüsseln in diese Variable
int n = 3, l = strlen(s1);
printf("%s\n", s1);
printf("Laenge: %d\n", l);
skytale(s1, n, s2); // Chiffriere s1 zu s2 mit 8 Buchstaben pro Umdrehung
printf("%s\n", s2);
if (l % n == 0) {
skytale(s2, l / n , s3); // Chiffriere zurueck
printf("%s\n", s3);
if (!strcmp(s1, s3)) {
printf("In diesem Fall OK\n");
}
else {
printf("Problem!\n");
}
}
return 0;
}
Code: Alles auswählen
void skytale(char * in, int n, char * out) {
int l = strlen(in);
int index = 0;
int i, j;
int mod = l%n;
if (mod == 0){
for (j = 0; j < n; j++){ //Hier wird Der zu verschlüsselnde Text eingelesen und wieder ausgelesen
//l ist hierbei die Länge vom eingegebenen Wert in
for (i = 0; i < (l/n); i++){ //Index wird benötigt um zuerst bei out auf sie Stelle 0 zu kommen
//und dann byte für byte den Text einlesen
if(j == 0){ //Wird nur einmal ausgeführt damit der erste Wert im
//String ausgelesen werden kann
out[index] = in [i*n];
index++;
//printf("In = %s\n", in);
//printf("Out = %s\n", out);
}else{
out[index] = in [i*n+j];
index++;
}
}
}
}else{
for (j = 0; j < n; j++){
for (i = 0; i < (l/n); i++){
if(j == 0){
out[index] = in [i*n];
index++;
}else{
out[index] = in [i*n+j];
index++;
}
}
}
}
out [l] = '\0';
}
nur ganze Zahlen werden mit einander berechnen, deswegen "int" Werte
"n" ist der Schüssel der Skytale und der Durchmesser.
"s1" ist "in"
"s2" ist "out"
"s3" wird dann mit "out" beschrieben in der Main Funktion für das Ergebnis.
"l" ist die String länge von "in" also 40
"mod" ist die modulo Rechnung von "l" und "n"
Das Programm liest den String "in" ein und schreibt in direkt in "out".
Dies wird gemacht bei den 2 "for" Schleifen.
Der erste Block mit den 2 "for" Schleifen macht bisher das selbe wie der zweite unter "else". Nur beim ersten werden die Strings durchgegangen wenn l%n=0 ist.
Im zweiten Block sollte dann der Andere Fall auftreten, wenn l%n =! 0 ist.
Nun das Problem:
Bei l%n=0 läuft das Programm problemlos und gibt die richtigen Ausgaben.
Folgende Ausgabe bei n=2:
DIESERKLARTEXTISTJETZTZUVERSCHLUESSELN12
Laenge: 40
DEEKATXITEZZVRCLESL1ISRLRETSJTTUESHUSEN2
DIESERKLARTEXTISTJETZTZUVERSCHLUESSELN12
In diesem Fall OK
Nun die Ausgabe für n=3:
DIESERKLARTEXTISTJETZTZUVERSCHLUESSELN12
Laenge: 40
DSKRXSETVSLSLIELTTTTZECUSNERAEIJZURHEE1i
Wie man sieht steht nun hinten ein "i", was der Fehler ist.
Es ist ein Rundungsfehler.
Bei n=3 wird folgendes berechnet:
40/3=13,33...
40%3=1 und genau die Ausgabe des mod rechners gibt dann die Anzahl der Buchstaben die Falsch sind.
Z.B. bei n=9 werden l%n viele Fehler auftreten also 4 Fehler.
Nochmal zu n=3:
Die richtige Ausgabe hierbei wäre -> "DSKRXSETVSLSL" und dann die 2 also "DSKRXSETVSLSL2..."
Also der 14te Wert soll die 2 sein.
Nun wie bekomme ich z.B. die 2 (bei n=3), bei dem ersten Durchlaufen der Schleifen auf den 14ten platz?
Ich weis es ist meine Aufgabe dies zu lösen und ich habe jegliches versucht und ich komme einfach nicht drauf.
Vielleicht übersehe ich etwas oder habe einen Fehler eingebaut.