Ceasar chiffre mit Funktion



  • hallo zusammen, ich muss die folgende Aufgabe lösen:
    Schreiben Sie eine Funktion chiffriere(char*, int), die zwei Parameter besitzt. Der erste Parameter entspricht dem zu verschlusselnden Text, der zweite Parameter der Verschiebung des Code-Alphabets zum Original-Alphabet. Es soll eine Verschiebung von 0 <= versatz < 26 ermoglicht werden.
    Realisieren Sie in der Funktion chiffriere(char*, int) die Verschlusselung des ubergebenen Textes mit der Caesar-Chiffre. Sie durfen annehmen, dass der
    Text nur aus kleinen Buchstaben besteht.

    also ich soll eine Funktion schreiben die alle Buchstaben des Textes um n stellen verschiebt. Ich habe das folgende Programm geschrieben... aber es wird nur die allererste Stelle des strings verschoben, vllt kann mir jemand helfen den Fehler zu finden? Das wäre sehr nett.

    #include "stdafx.h"
    #include <iostream>
    using namespace std;

    void chiffriere (char* text, int n){
    int x=0, y=0;

    int size = (sizeof(text));
    char alphabet[27] ={'a','b', 'c', 'd','e','f', 'g', 'h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
    int z =y+n;
    while (x<size-1) {
    while (y<26) {
    if (text[x]==alphabet[y])

    text[x]=alphabet[z];

    y++;
    }
    x++;
    }

    }

    void ausgabe(char *text)
    {
    int i = 0;
    while (text[i] != '\0')
    {
    cout << text[i++];
    }
    cout << endl;}

    int main()
    {
    char text_1[] = "abcdefghijklmnopqrstuvwxyz\0";
    char text_2[] = "qvvfxrbcmnwwmrnjwhtnhcjbcnwjsjrlqknbcnuuvranabcnrwvjunrwkrna\0";

    cout << "--------------Text 1---------------" << endl;
    ausgabe(text_1);
    for (int i = 1; i < 26; i++)
    {
    cout << "Verschiebung um " << i << " Buchstaben:" << endl;
    chiffriere(text_1, i);
    ausgabe(text_1);
    }

    cout << "--------------Text 2---------------" << endl;
    ausgabe (text_2);
    for (int i = 1; i < 26; i++)
    {
    cout << "Verschiebung um " << i << " Buchstaben:" << endl;
    chiffriere(text_2, i);
    ausgabe(text_2);
    }

    system("pause");
    return 0;
    }



  • int size = (sizeof(text));
    

    Also, nachdem ich diese Zeile gesehen habe, bezweifel ich schonmal, dass der Algorithmus überhaupt funktionieren kann. Weißt du, was diese Zeile tut?



  • naja wahrscheinlich nicht das was sie soll?! ... eigentlich soll sie die Größe des strings bestimmen...



  • josite92 schrieb:

    naja wahrscheinlich nicht das was sie soll?! ... eigentlich soll sie die Größe des strings bestimmen...

    Ganz genau, das sollte es :). Wenn du allerdings ein Array an eine Funktion übergibst, "zerfällt" das Ganze zu einem Zeiger (Stichwort: array to pointer decay). "text" ist also ein Zeiger, und ein Zeiger hat überlichweise eine Größe von 4Byte oder 8Byte.

    In diesem Fall kannst du aber strlen aus cstring benutzen:

    #include <cstring>
    int size = strlen(text);
    


  • sizeof(text)
    

    wird bei dir immer 4 (oder 8 auf 64-Bit-System) ergeben, da die Größe von Pointern konastant ist.
    Aber warum sich überhaupt mit C-Strings rumschlagen?! Du bist hier im C++-Unterforum, also gehe ich davon aus, dass du auch wirklich C++ schreiben willst. Also nimm std::string.
    Den Rest richtig anzupassen sollte nicht allzu schwer sein.

    EDIT: Zu langsam... strlen geht natürlich auch, aber nimm lieber std::string



  • Wieso machst du das Ganze eig. so kompliziert? Das geht in deinem Stil auch einfacher. Am besten wäre es aber natürlich du würdest es auf C++-Art machen.

    #include <iostream>
    #include <cstring>
    using namespace std;
    
    void chiffriere(char* text, int n)
    {
        int size = strlen(text);
    
        if( n>26 )
            n = n - (n/26)*26; // edit: Ich nehme an, dass ihr die eingebauten Datentypen schon durchgenommen habt.
                               // Hier siehst du nun deutlich, dass der Audruck (n/26)*26 eben nicht n ergibt, da eine Division mit Ganzzahlen als Ergebnis auch eine Ganzzahl liefert.
                               // Wir berechnen hier also den Rest einer ganzzahligen Division. Zukünftig nimmst du dafür natürlich den Modulo-Operator: n = n%26;
    
        for(int i=0; i<size; ++i)
        {
    
            if(text[i]+n <= 'z')
            {
                text[i] = text[i] + n;
            }
            else
            {
                int d = text[i] + n - 'z' -1;
                text[i] = 'a' + d;
            }
        }
    }
    
    void ausgabe(char *text)
    {
        cout << text << '\n';
    }
    
    int main()
    {
        char text_1[] = "abcdefghijklmnopqrstuvwxyz";
        char text_2[] = "hallo welt"; 
    
        cout << "--------------Text 1---------------" << endl;
        ausgabe(text_1);
        chiffriere(text_1, 2);
        ausgabe(text_1);
    
        cout << "--------------Text 2---------------" << endl;
        ausgabe(text_2);
        chiffriere(text_2, 2);
        ausgabe(text_2);
    
        system("pause");
    }
    

    Falls was nicht verständlich ist, frag nach.



  • danke für die schnelle Antwort... ich habe es mit strlen(text)und der dazugehörigen bibliothek versucht aber es funktioniert leider immer noch nicht ...
    ehm std::string... ich habe gerade gelesen dass das eine Klasse ist? soweit sind wir noch gar nicht in der Vorlesung ... ich bin absolute Anfängerin hatte bis vor 5 wochen noch NIE etwas mit Informatik zu tun und lerne C++ gerade im Nebenfach für Elektrotechnik und Informationstechnik 1. Semester.... deswegen ist mein Stil wohl auch nicht sonderlich gut... ich weiß nicht so genau wo die grenze zwischen c und c++ ist ich denke wir machen gerade noch die grundlagen die zwar in c++ enthalten sind aber wohl auch bestandteil von c sind? Ich weiß es ehrlich gesagt nicht.

    ich sehe gerade in der zwischenZeit wurde geantwortet ich werde das jetzt auch mal ausprobieren 🙂



  • josite92 schrieb:

    ich weiß nicht so genau wo die grenze zwischen c und c++ ist ich denke wir machen gerade noch die grundlagen die zwar in c++ enthalten sind aber wohl auch bestandteil von c sind? Ich weiß es ehrlich gesagt nicht.

    😃 Das kenn ich, wurde bei uns leider auch so gemacht. 😞

    Ich habe mein Quellcode nochmals editiert, war ein Fehler drin. :p


Anmelden zum Antworten