Skytale in C



  • 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

    Folgende Schnittstelle:

    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:

    #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;
    
    }
    

    Und jetzt? Wie mache ich jetzt weiter? Ich hoffe ihr könnt mir helfen!


  • Mod

    Jetzt nimmst du diesen Code, der ja offensichtlich Teil der Vorlage war, und füllst den Teil, wo "// ..." steht, richtig aus.



  • Und wie?

    Ich weiß ja, dass mein in der zu verschlüsselnde Text und mein out der verschlüsselte Text ist! n ist dann die Anzahl der Zeichen die zwischen den zusammenhängenden Zeichen liegt.

    So in der Art?

    in = "abcd"
    skytale(in, 2, out)
    out => "acbd



  • Bist Du derjenige, der auch diesen Thread eröffnet hat? Oder ist das Zufall?
    Evtl. sitzt Ihr ja im gleichen Kurs... 🙂

    Beginner15 schrieb:

    So in der Art?

    in = "abcd"
    skytale(in, 2, out)
    out => "acbd

    Ich denke schon...



  • Ne hab ich nicht eröffnet 🙂

    Kann ich das wirklich so reinschreiben wie ich es oben gepostet habe? Und das ist dann alles? 😕


  • Mod

    Probier's doch mal aus.



  • Also ich habs mal so reingeschrieben!

    Ein Fehler meldet mein Compiler nicht, allerdings kommt nur das heraus was auch in der Main-Methode steht. Am Ende hängt sich dann mein cmd-Fenster auf 😮


  • Mod

    Dann war es wohl doch nicht so ganz richtig.



  • Und wie wäre es dann richtig 😉 ?


  • Mod

    Um das mal klar zu stellen: Im Moment nimmt niemand diesen Thread ernst. Du postest eine Hausaufgabe und erwartest, dass sie dir jemand löst, ohne dass du die geringste Eigeninitative zeigst. Dann schreibst du, dass du irgendwie, irgendwas gemacht hättest, aber es würde nicht funktionieren. Wir wissen weder, was du gemacht hast, noch was da dran nicht funktioniert. Nach allem, was wir wissen, hast du womöglich einfach gar nichts gemacht. Erwartest du wirklich ernsthaft Hilfe bei solch einer Vorgabe?

    Vielleicht hilft:
    Warum dir keiner helfen will
    oder
    Du brauchst Hilfe?
    oder
    Wie man Fragen richtig stellt

    Wir helfen gerne, aber du machst es einem zu schwer, dir zu helfen.



  • Im Moment werden wohl auch nicht mehr so viele wach sein 😉

    Das habe ich gemacht:

    #include <stdio.h>
    #include <string.h>
    void skytale(char * in, int n, char * out);
    void skytale(char * in, int n, char * out)
    {
        in = "abcd";
        skytale (in, 2, out);
        out = "acbd";
    }
    
    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;
    
    }
    


  • Beginner15 schrieb:

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

    Eventuell haben wir uns mißverstanden?! Das ist unterirdisch...

    Da gahört natürlich ein Algorithmus hin, der das was Du jetzt im Kopf gemacht hast, um von "abcd" nach "acbd" zu kommen, durchführt. Und zwar für beliebige Zeichenketten in und beliebige n .

    Ich leg mich wieder hin...


  • Mod

    Furble Wurble schrieb:

    Beginner15 schrieb:

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

    Eventuell haben wir uns mißverstanden?! Das ist unterirdisch...

    Sag nicht, dass du das nicht erwartet hättest.

    PS: Fragt sich eigentlich noch jemand anderes, ob in der Aufgabenstellung wirklich 6 Ausrufzeichen in Folge stehen? 🙂



  • SeppJ schrieb:

    Sag nicht, dass du das nicht erwartet hättest.

    Doch. Und wahrscheinlich schlief ich deswegen auch so miserabel... 😞


  • Mod

    Um mal produktiv zu sein: An den Threadersteller: Das war wohl nichts. Absolut unterirdisch, wie Furble Wurble richtig feststellte. Auf einem Niveau, wo man dir weder Hilfe noch eine Lösung geben könnte, du würdest nichts davon verstehen. Beziehungsweise du hast ja bereits die gegebene Hilfestellung nicht verstanden, denn

    in = "abcd"
    skytale(in, 2, out)
    out => "acbd
    

    sieht aus wie ein Beispiel, das ihr vorgegeben bekommen habt. Du warst nicht einmal in der Lage, zu erkennen, was dieses Beispiel bedeutet oder dass es nur ein Beispiel ist.

    Ich sehe derzeit drei Möglichkeiten, was für eine Art von Person du bist:

    a) Du verarscht uns bloß, indem du dich doof stellst. Kommt immerhin häufig genug vor, dass es ein eigenes Wort dafür gibt und auch in diesem Forum soll das schon vorgekommen sein. Daher nicht auszuschließen.

    b) Du hast dich das ganze Semester irgendwie durchgemogelt. Niemals irgendwie aufgepasst, alle Lösungen irgendwo abgeschrieben. Und nun bekommst du die verdiente Rechnung, weil du nirgendwo eine Lösung gefunden hast und dir ganz sicher niemand eine (ernstgemeinte) Komplettlösung geben wird.

    c) So wie b, aber mit dem Unterschied, dass du dich nun hinsetzt, die 4-6 Wochen verpassten Stoffs nachholt und dann in 3-4 Tagen entweder diese Aufgabe ganz leicht selber löst (denn sie ist mit der Vorgabe sehr, sehr einfach) oder aber zumindest in der Lage bist, brauchbare Fragen zu stellen oder Hilfestellungen insoweit verstehen kann, dass man das Gefühl hat, dass das Gegenüber schon einmal einen Computer gesehen und vielleicht sogar ein wenig programmiert hat.

    Zeig uns, was du bist.


Anmelden zum Antworten