Projekt 1 : "Geheime Nachrichten" (Teil 2)

Website: Lerne ELEKTROTECHNIK und PROGRAMMIEREN
Kurs: Kurs zum Buch "Lerne Programmieren mit Projekten: C++"
Buch: Projekt 1 : "Geheime Nachrichten" (Teil 2)
Gedruckt von: Guest user
Datum: Saturday, 2. November 2024, 15:07

Beschreibung



1. Worum geht es?

Im ersten Teil des Projekts haben wir mit Hilfe von if-else den Programmfluss so verzweigt, dass in Abhängigkeit von einer Benutzereingabe entweder der Verschlüsselungs- (Taste "v") oder der Entschlüsselungsmodus (Taste "e") ausgewählt wird. 

Im zweiten Teil werden wir jetzt mit Hilfe einer while-Schleife den zu verschlüsselnden Text einlesen und Zeichen für Zeichen verarbeiten. Die eigentliche Verschlüsselung folgt dann im dritten und letzten Teil.

Das Ablaufdiagramm für den zweiten Teil findest du im Lernheft zum Kurs.


2. Beispiel "cin" vs. "getline"

In vielen Kursen zu C++ werden Benutzereingaben mit cin >> text durchgeführt. Das sieht zwar weniger kompliziert aus als die Variante mit getline(cin,text), hat aber einen entscheidenden Nachteil: Der eingegebene Text wird beim ersten Leerzeichen abgeschnitten.

Probiere es einfach mal aus, indem du in diesem Code-Beispiel die Varianten 1 oder 2 wechselweise auskommentierst und einen Satz mit und ohne Leerzeichen eingibst.
  
Beliebigen Text eingeben
#include <iostream>
#include <string>

using namespace std;

int main()
{
    string text;
    
    // Variante 1: Text einlesen mit cin >>
    cout << "Einen beliebigen Text eingeben: "; 
    cin >> text; // Variante 1 oder
    // getline(cin, text); // ... Variante 2

    // Text wieder ausgeben
    cout << endl << endl << "Diesen Text hast du eingegeben: " << endl;
    cout << text << endl;

    return 0;
}
    

3. Zeichenweiser Zugriff auf Text mit WHILE

In der Praxis kommt es häufig vor, dass auf jedes Element einer String-Variablen zugegriffen werden muss. Würde für jedes dieser Zeichen eine eigene, separate Code-Zeile genutzt, dann wäre dies nicht wirklich elegant: 

Der Code wäre bis auf den Index des jeweiligen Zeichens identisch und die Operation würde nur funktionieren nur, wenn der eingegebene Text auch wirklich aus der immer gleichen Menge von Zeichen bestünde. Wäre er länger, dann könnten nicht alle Zeichen verarbeitet werden und wäre er kürzer, dann könnte eventuell dein Programm wegen eines ungültigen Zugriffs abstürzen.

Mit einer Schleife lässt sich dieses Problem viel eleganter lösen, wie der Code in diesem Beispiel zeigt.


#include <iostream>
#include <string>
using namespace std;

int main()
{
    string text = "Hallo";
    
    // Textzeichen untereinander ausgeben
    int cnt = 0; // Zählvariable
    while(cnt<text.size())
    {
        cout << text[cnt] << endl;    
        cnt++; // identisch zu cnt=cnt+1
    }
    cout << endl; // Finaler Zeilenumbruch

    return 0;
}

4. Text in Zahlen konvertieren mit ASCII-Codes

Im letzten Beispiel haben wir schon erfolgreich mit Hilfe einer Schleife auf die einzelnen Zeichen eines Textes zugegriffen. Um aber in Teil 3 in Kürze die eigentliche Verschlüsselung durchführen zu können, müssen wir hier noch eine wichtige Vorbereitung treffen: Die Zeichen des Texts müssen in Zahlenwerte konvertiert werden, damit diese später von einer Berechnungsformel verändert werden können. Glücklicherweise müssen wir hierfür nicht viel tun, denn der Computer speichert und verarbeitet alle Zeichen bereits als Zahlen - wir müssen diese nur noch sichtbar machen.

Die Basis hierfür ist die ASCII-Tabelle. Diese Abkürzung steht für American Standard Code for Information Interchange und bezeichnet einen Standard zur numerischen Darstellung von Text, der in den 60er Jahren des letzten Jahrhunderts eingeführt wurde und es sogar schon ins Kino geschafft hat (The Martian, 2015}). Hierin wird jedem Zeichen des Alphabets sowie zahlreichen Sonderzeichen eine eindeutige Zahl im Bereich von 0 bis 127 zugeordnet. 

Um den ASCII-Code eines Zeichens in C++ sichtbar zu machen und auszugeben, muss dieses in den Datentyp int umgewandelt (”ge-castet") werden. Dieser Datentyp ist zur Speicherung von ganzen Zahlen vorgesehen und zwingt den Computer, ein Textzeichen als Zahl zu behandeln. 

Der nachfolgende Code schließt den zweiten Teil des Projekts ab und gibt die ASCII-Code der Zeichen eines Beispiel-Texts aus (Hinweis: An erster Stelle ist ein Leerzeichen). 

Zeile 1 : 'v' oder 'e'
Zeile 2 : Text zum Verschlüsseln
#include <iostream>
#include <string>

using namespace std;

int main()
{
    // TEIL 1: Ver- oder Entschlüsselung auswählen
    string input;
    cout << "Ver- oder Entschlüsseln? (v/e): " << endl;
    getline(cin, input);

    bool encode = false; // später ENTschlüsseln
    if (input == "v")
    {
        cout << "Text zum VERschlüsseln: " << endl;
        encode = true;
    }
    else if (input == "e")
    {
        cout << "Text zum ENTschlüsseln: " << endl;
    }
    else
    {
        cout << "Ungültige Eingabe!" << endl;
        exit(EXIT_FAILURE); // Fehlercode melden
    }

    // TEIL 2: Textzeichen nacheinander verarbeiten
    string text;
    getline(cin, text);

    int cnt = 0;
    while(cnt<text.size())
    {
        // Zeichen und ASCII-Code ausgeben
        cout << text[cnt] << ": "; // Zeichen
        cout << (int)text[cnt] << endl; // Code
        cnt++; 
    }
    cout << endl;



    return EXIT_SUCCESS; // wahlweise auch 0
}