Zerlegung in Funktionen



  • Servus,

    habe da ein paar Probleme mit C++. Und zwar haben wir folgende Aufgabe:

    "Nachrichten verschlüsseln"

    Original: ABCDEF.....
    Kodierung: XYZABC.....
    Zur Kodierung wird um ein fester Wert (Schlüssel) verschobenes Alphabet verwendet. Alle anderen Zeichen bleiben unverändert.

    So wird aus: "Hello World" -> EBIIL TLOIA

    Jeder Buchstabe des Alphabet bekommt also ein neuen Buchstaben zugeordnet.

    Soweit so gut, dass Problem:

    Jetzt sollen wir eine (zwei) Funktionen: encrypt und (decrypt) und ein Testprogramm, dass nach Abfrage des Schlüssels einen eingegebenen Text verschlüsselt (entschlüsselt) entwickeln.

    Die Funktion encrypt soll dabei folgenden Prototypen haben:

    int encrypt (const char Klartext[ ], char Geheimtext [ ], int key);

    und dabei den klartext als char Array erhalten und den verschlüsselten Text als char Array zurückgeben.
    Der Aufrufer soll dafür sorgen, dass Rückgabe-Array genügend Platz hat.

    Also das einfache "Kodierungsprogramm sieht so aus, aber mit den oben genannten Punkten komm ich irgendwie nicht klar. Wenn möglich mit einer Erklärung hinter den Zeilen. Danke

    #include <iostream.h>

    //
    // Zur Verinfachung alles im Hauptprogramm
    //
    void main()
    {
    unsigned int key; // Schlüssel zur Verscheibung
    cout <<"Bitte Key eingeben :";
    cin >> key;

    key = key %26; // Normieren auf die 26 Buchstaben A-Z

    unsigned char Klartext[256]; // Maximal 256 Buchstaben
    cout << endl << "Bitte Klartext eingeben :";
    cin >> Klartext; // cin setzt automatisch 0 als letzten Wert
    // Kraltext[n] = 0
    //
    // Hierbegint die Hauptschleife
    //
    unsigned char c = Klartext[0]; // Ersten Buchstaben holen
    int j = 0; // Index setzten

    cout << "Hier ist der Geheimtext :";

    while (c) // Bei letztem Feldwert == 0 (s.o.)
    {
    if ( c >= 'A' && c <= 'Z' ) // Grossbuchstaben
    {
    c = c +key;
    if (c > 'Z') c = c - 26; // Überläufer abfangen
    }

    if ( c >= 'a' && c <= 'z' ) // Kleibuchstaben
    {
    c = c +key;
    if (c > 'z') c = c - 26; // Überläufer abfangen
    }

    cout << c; // Ausgabe des Buchstabens

    j++; // index erhöhen
    c = Klartext[j]; // nächsten Buchstaben lesen
    }

    cout << endl;

    }



  • Hat niemand eine Idee? 😞



  • Aemord schrieb:

    Servus,

    Die Funktion encrypt soll dabei folgenden Prototypen haben:

    int encrypt (const char Klartext[ ], char Geheimtext [ ], int key);

    }

    WOW einen Prototypen 🙂

    Also erstmal zum einlesen

    bei cin wird bei einem " " Leerzeichen abgetrennt. nimm deshalt eine get line fkt

    also

    Schau dir ASCII an
    http://www.asciitable.com/

    Da erkennst du das z.b.

    65 = "A" ist

    sprich dein char c = "A" hat den int wert 65
    wenn du also
    c++ machst muesstest du "B" erhalten

    wenn Key also 5 ist, wird es um 5 verschoben ( die buchstaben )

    Damit ist das "Rätsel" voll gelöst.

    was aber

    int encrypt (const char Klartext[ ], char Geheimtext [ ], int key);

    sein soll ist mir ein Rätsel. warum nicht einfach

    int encrypt (const char Klartext[ ], int key);
    

    z.b. dann

    encrypt( str, 5 );  // str wurde vorher natuerlich eingegeben mit get line fkt.
    

    Warum sollst du auch gleich den Geheimtext mitübergeben????
    Du kannst aber auch gleich ( wenn du beide nicht gleichzeitig brauchst

    str als referenz übergeben, dann wird dein feld gleich verändert. naja das nur noch als anmerkung am rande



  • Danke, für den prof. Rat.

    Leider versteh ich von dem ganzen noch nicht wirklich viel.

    Könntest du das alles bitte für einen Anfänger erklären, was du da geschrieben hast?

    Danke



  • weiss jetzt nicht was so schwer war, an meinem text

    aber schau hier mal

    char c = 'A';           // hier sagst du ja c = A
    	cout << c << endl;
    	cout << int(c) << endl;     // das ist ein cast( google hilft wenn du "casten c++" eingibst ;)
    	c = c+1;                 // hier nimmst du den nächsten buchstaben sozusagen
    	cout << endl;
    	cout << c << endl;         // ausgabe den "nächsten" buchstabe
    	cout << int(c) << endl;     // wieder ein cast
    

    mit int(c) gibst du nicht den character wert aus sondern den int wert

    man hat die buchstaben kodiert! z.b. für die 65 hat man gesagt, wenn ein char den zahlenwert 65 hat, wird ein "A" gedruckt.

    ist zwar bissle lame meine erklärung, musst ja nicht den ganzen sachverhalt kenne.

    wie du maybe weisst, kennt ein PC nur "0" und "1"
    deswegen gibts es im speicher ( im ram oder auf der cpu ) keine "speicherzellen" welche buchstaben beinhalten, sondern nur zahlen ( binär )
    deswegen einigt man sich

    schau echt nochmal GANZ GENAU die ascii tablelle an

    mit meinen codespipsel sollten KEINE fragen mehr aufkommen, was das thema

    65 = A

    anbelangt.

    wenn du dein programm schon fast hast, kannst du immer noch posten


Anmelden zum Antworten