Caesar-Verschlüsselung



  • Guten Tag,

    Ich habe folgende Aufgabenstellung:

    Zunächst wird die Reihenfolge der ersten n = 5 Elemente im Feld umgekehrt (gewendet). Anschlie-
    ßend wird das gesamte Feld gewendet. Zum Abschluß werden die restlichen 26-5 Elemente gewendet.
    Danach ist der Feldinhalt um n = 5 Plätze zyklisch nach links verschoben. Diese Vorgehensweise hat
    den Vorteil, daß die Teile des Feldes, die gewendet werden müssen, stets beim Index 0 beginnen. Das
    vereinfacht die Verwendung der Funktion feld_wenden (siehe unten).

    Liste 5.1: Prototypen zu Aufgabe 5.2

    void feld_wenden ( int a[], unsigned int n );
    void feld_links_rotieren ( int a[], unsigned int n, unsigned int shift );
    void feld_rechts_rotieren ( int a[], unsigned int n, unsigned int shift );

    1. Schreiben Sie zunächst eine Funktion feld_wenden (Prototyp in Liste 5.1), die ein int-Feld a
    der Länge n in sich wendet. Ein Hilfsfeld darf nicht verwendet werden.
    2. Schreiben Sie dann eine Funktion feld_links_rotieren (Prototyp in Liste 5.1), die ein int-
    Feld a der Länge n um shift Plätze zyklisch nach links verschiebt. Diese Funktion soll durch
    drei Aufrufe der Funktion feld_wenden implementiert werden.
    3. Schreiben Sie dann eine Funktion feld_rechts_rotieren (Prototyp in Liste 5.1), die ein
    int-Feld a der Länge n um shift Plätze zyklisch nach rechts verschiebt.
    Praktikum Programmierung mit C++ 1 14 Version 2.0
    Kapitel 5. Codieren und Decodieren von Texten
    Für die beiden Funktionen feld_links_rotieren und feld_rechts_rotieren gilt: eine Verschie-
    bung um 0 Plätze ist zulässig.Die Funktionen werden dann sofort wieder verlassen. Weiterhin muß
    die Verschiebung (Parameter shift) kleiner als die Feldlänge sein, um Zugriffe außerhalb des Feldes
    durch die Funktion feld_wenden zu vermeiden. Dazu müssen alle Vielfache der Feldlänge entfernt
    werden. Beispiel: bei einer Feldlänge von n = 10 entspricht eine zyklische Verschiebung um 33 Plätze
    einer tatsächlichen Verschiebung um 3 Plätze.
    Diese Funktionen werden dann dazu verwendet, die gewünschte Anfangsbelegung des der Verschlüs-
    selungsfeldes für eine Caesar-Verschlüsselung aus der Anfangsbelegung A bis Z herzustellen.
    Ein Text, der mit einer Verschiebung n nach links verschlüsselt wurde, muß mit einer Feld mit einer
    Verschiebung --> n entschlüsselt werden (also mit einer Rechtsverschiebenung um n Plätze).

    Bis jetzt habe ich die funktion feld_wenden geschrieben:

    void
    feld_wenden ( int a[], unsigned int n )
    {
    	n = 4;
    
    	for (int i = 0; i < 5; i += 1 )
    	{
    		n -= 1;
    	}
    	return;
    }
    

    Ich würde gerne wissen ob die funktion schonmal richtig wäre und wie ich weiter vorgehen kann



  • Wo wendest du in der Funktion ein Feld?



  • mhh ja da hänge ich auch noch ein wenig, ich habe den kompletten überblick verloren



  • das einzige was ich mit sicherheit sagen kann ist, dass die leute die dir diese aufgabe mit diesen vorgegebenen funktionsprototypen gegeben haben entweder
    - selbst keine ahnung von c++ haben
    oder
    - es eigentlich selbst besser wissen und dich / euch absichtlich in die irre führen
    in beiden fällen tust du mir leid weil man dir keine richtige ausbildung gönnt.

    c++ kennt ein design pattern das sich "iterator" nennt, bei dem eine containerunabhängige datenverarbeitung möglich ist.

    back to topic:

    nein, deine funktion ist nicht richtig. was du ändern musst bei der funktion:
    -n hast nicht du zu bestimmen, das gibt der aufrufer der funktion vor (logisch, denn der kennt das array), daher "n = 4" weg
    -ich verstehe deine for-schleife nicht aber was du grundsätzlich machen musst ist:
    -für jedes element von 0 bis (floor(n/2)) muss der inhalt mit dem gespiegelten gegenstück getauscht werden (n - i)

    hilfe zu den anderen beiden funktionen gebe ich dir sobald du selbst ein wenig daran gearbeitet hast.



  • Danke für deine Antwort,

    Ich habe mir vom Studium etwas mehr erhofft.

    Ich verstehe das mit dem (floor(n/2)) grad nicht.



  • floor = abrunden auf die nächst-tiefere ganze zahl
    n = menge der elemente im array

    der ausdruck (floor(n/2)) wäre für ein array der grösse 4 also 2 (weil du die elemente immer tauscht wird die andere hälfte automatisch mitgetauscht).
    für ein array der grösse 7 wäre die grösse also 3 (nicht 3.5 da ja abgerundet wird), dabei wird das mittlere element nicht angefasst (muss es ja auch nicht).



  • Alles klar vielen dank, ich werde es versuchen



  • asdfsad schrieb:

    das einzige was ich mit sicherheit sagen kann ist, dass die leute die dir diese aufgabe mit diesen vorgegebenen funktionsprototypen gegeben haben entweder
    - selbst keine ahnung von c++ haben
    oder
    - es eigentlich selbst besser wissen und dich / euch absichtlich in die irre führen
    in beiden fällen tust du mir leid weil man dir keine richtige ausbildung gönnt.

    c++ kennt ein design pattern das sich "iterator" nennt, bei dem eine containerunabhängige datenverarbeitung möglich ist.

    Sorry für das OT, aber ...

    Das ist grober Unfug. Für diese Art von Aufgaben bei denen es darum geht überhaupt erstmal zu lernen wie man an ein Problem herangeht und wie man das dann umsetzt ist es vollkommen ausreichend mit den eingebauten Sprachmitteln zu arbeiten. Die STL und deren Konzepte wären hier nur unnötiger Ballast.

    Man fährt ja auch nicht in der ersten Fahrstunde gleich auf die Autobahn 😉



  • MichelRT schrieb:

    asdfsad schrieb:

    das einzige was ich mit sicherheit sagen kann ist, dass die leute die dir diese aufgabe mit diesen vorgegebenen funktionsprototypen gegeben haben entweder
    - selbst keine ahnung von c++ haben
    oder
    - es eigentlich selbst besser wissen und dich / euch absichtlich in die irre führen
    in beiden fällen tust du mir leid weil man dir keine richtige ausbildung gönnt.

    c++ kennt ein design pattern das sich "iterator" nennt, bei dem eine containerunabhängige datenverarbeitung möglich ist.

    Sorry für das OT, aber ...

    Das ist grober Unfug. Für diese Art von Aufgaben bei denen es darum geht überhaupt erstmal zu lernen wie man an ein Problem herangeht und wie man das dann umsetzt ist es vollkommen ausreichend mit den eingebauten Sprachmitteln zu arbeiten. Die STL und deren Konzepte wären hier nur unnötiger Ballast.

    Man fährt ja auch nicht in der ersten Fahrstunde gleich auf die Autobahn 😉

    ahja, sagst du das demnach auch zum anderen thread des te's?

    Mirofire schrieb:

    Zurzeit bin ich soweit gekommen aber hänge bisher an der stelle

    #include <iomanip>   
    #include <iostream>
    #include <cctype>
    
    using namespace std;
    
    int main ( )
    {
      int   maxstring = 256;                      
      char  text[maxstring];                      
      char  c;                                    
      int   i;
    	int 	wort = 0;
    	int	zustand = 0;											
    
      cout << "***** Wörter zählen *****\n";
      cout << "Geben Sie eine Textzeile ein: ";
      
      i = 0;
      while ( ( c = cin.get() ) != '\n' ) {       
        text[i] = c;                              
        i       = i+1;                            
      }
      text[i] = '\0';                             
    
      cout << "Der eingegebene Text lautet '" << text << "'\n";
    
      
      for ( i = 0; text[i] != '\0'; i += 1 ) {
        
    		if (zustand != 1)
    		wort = wort + 1;	
    		if ( isalpha( text[i] ) )
    			zustand = 1;
    		if (isspace	( text[i] ) )
    			zustand = 0;
    		
    
      }
      cout << setw(6) << wort << " Wörter\n"; 
       
    
      return 0;
    }
    

    Mirofire schrieb:

    Das haben wir so gelernt

    quelle: http://www.c-plusplus.net/forum/321532-full

    und noch zum teil deines posts betreffend "erstmal zu lernen wie man an ein Problem herangeht":
    du würdest also zwei separate funktionen schreiben (eine fürs links- und eine fürs rechts-shiften) die beide explizit eine unsigned-variable für die anzahl zu schiebenden stellen annimmt? das ist für mich nicht gerade die optimale art das problem zu lösen (die redunanz ist schon vorprogrammiert), ganz egal ob man es als funktion die ein array annimmt implementiert, als methode eines containers oder als template-funktion die iteratoren annimmt.


Anmelden zum Antworten