Seite 1 von 1

Skytale in C

Verfasst: Mi Jun 10, 2015 10:13 pm
von Bumblebe3
Hallo Leute,

habt ihr schon mal ein Programm bzw eine Funktion codiert zur Simulierung einer Skytale? Ich sitze hier an einer Aufgabe und weiß gar nicht was ich machen soll :shock:

Folgende Schnittstelle:

Code: Alles auswählen

void skytale (char * in , int n , char  *out);
Bedeutung der Parameter:
in : Der zu chiffrierende String
n: Die Anzahl der Buchstaben auf einer Skytalenumdrehung (Schlüssel)
out: Der chiffrierte String

Es muss nicht abgeprüft werden, ob für den Ausgabestring genügend Hauptspeicher reserviert wurde, das ist Aufgabe des Hauptprogramms. Der String wird auch nicht in Großbuchstaben transformiert oder Leerzeichen entfernt (wie im Beispiel der TU Freiberg durchgeführt)!

Die gesamte Kommunikation der Funktion muss über die Schnittstelle erfolgen.

Innerhalb der Funktion sind keine Ein- und Ausgaben erlaubt.

Es sind keine globalen Variablen erlaubt.

Ein Prototyp der Funktion ist Pficht.

Es werden keine Leerzeichen eingefügt, auch nicht wenn die Länge des Eingabetextes nicht durch n teilbar ist!

Verändern Sie ein zu chiffrierenden Text nicht!!!!!!

Der chiffrierte Text muss die gleiche Länge haben wie der zu chiffrierende Text!!

Auch wenn es in dem obigen Beispiel danach aussieht, es werden keine zweidimensionalen Felder benötigt!

Tip: Der eigentliche Chiffrier-Teil Ihres Programms ist in drei bis fünf Zeilen codierbar.
Anmerkung: Wenn n die Schlüssellänge ist und l die Länge des Strings und l mod n = 0, also l ein ganzzahliges Vielfaches von n ist, so kann mit einem Dechiffrierungs-Schlüssel nd = l/n mit
demselben Algorithmus dechiffriert werden. Dies kann zum Testen des Programms genutzt werden.

Folgenden Code hab ich bisher:

Code: Alles auswählen

#include <stdio.h>
#include <string.h>
void skytale(char * in, int n, char * out);
void skytale(char * in, int n, char * out) {
// ...
}
int main() {
	char s1[1000] = "DIESERKLARTEXTISTJETZTZUVERSCHLUESSELN12",s2[1000],s3[1000];
    int n = 20, 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");
    }
	system ("PAUSE");
    return 0;
	
}
Aber wie gehts weiter? Ich hoffe ihr könnt mir wieder helfen :)

Re: Skytale in C

Verfasst: Mi Jun 10, 2015 10:24 pm
von cloidnerux
Du sollst eine Funktion schreiben, die einen Text "in" in einen Text "out" konvertiert und dabei eine bestimmte Verschlüsselung anwendet.
Die Skytale ist, wie auch im Wikipedia-Artikel geschrieben, ein Umsortierungsverfahren. Du musst also die Buchstaben aus dem String "in" nur Umsortiert in den String "out" schreiben. Out hat damit immer die selbe Länge wie in.

Dein n ist der "Durchmesser" deiner Skytale. Besser ausgedrückt als: Wie viele Zeichen liegen zwischen zwei zusammenhängenden Zeichen.
Für ein n von 2 würde ja sowas heraus kommen:

Code: Alles auswählen

in = "abcd"
skytale(in, 2, out)
out => "acbd
Du musst doch jetzt nur noch diese Funktionalität implementieren.

Re: Skytale in C

Verfasst: Mi Jun 10, 2015 10:32 pm
von Bumblebe3
Und das schreibe ich dann in die Schnittstelle?

Also:

Code: Alles auswählen

void skytale(char * in, int n, char * out);
void skytale(char * in, int n, char * out)
{
in = "abcd"
skytale(in, 2, out)
out => "acbd
}

Re: Skytale in C

Verfasst: Mi Jun 10, 2015 10:53 pm
von cloidnerux
Und das schreibe ich dann in die Schnittstelle?
Ja, da aber dann deinen eigenen Code und nicht mein Pseudo-code.

Re: Skytale in C

Verfasst: Mi Jun 10, 2015 10:58 pm
von Bumblebe3
Kann ich das echt so schreiben?

in = "dasganzemacheichalstestumeszuverstehen";
skytale(in, 2, out);
out = ...;

Re: Skytale in C

Verfasst: Do Jun 11, 2015 11:54 am
von Bumblebe3
Ok das war Quatsch was ich gepostet habe! Nach einer langen Nacht durch probieren und nachlesen hab ich jetzt folgendes:

Code: Alles auswählen

void skytale(char * in, int n, char * out)
{
 
  int i,j,index=0;
  int l = strlen(in);
  printf("%d\n",l);
  
 
  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+1]='\0';
}
Mein Compiler meldet keine Fehler und spuckt das was in der Main-Methode steht aus :D