Forum
Tipps
News
Menu-Icon

C++ - Kein Verständnis

Hallo. Könnte mir vielleicht jemand diesen Quellcode erklären? Besonders die  Dickgedruckten Abschnitte... Wäre echt nett, weil ich steig da überhaupt nicht durch.






#include <iostream>
#include <ctype.h>
#include <conio.h>

using namespace std;


void rot13 (char s[]);


int main (int argc, char* argv[])
{
    char slogan[] = "eine Insel mit 2 Bergen...";

     [b]cout << slogan << endl;
    rot13(slogan);
    cout << slogan << endl;
    rot13(slogan);
    cout << slogan << endl;[/b]
    return 0;
}


void rot13 (char s[])
 

{
     [b]for (int i = 0; s[i] != '\0'; i++) {
if (isupper(s[i])) {
    s[i] += 13;
    if (!isupper(s[i])) {
s[i] -= 26;
    }
} else if (islower(s[i])) {
    s[i] += 13;
    if (!islower(s[i])) {
s[i] -= 26;[/b]
    }
}
    }
     getch();
}

Antworten zu C++ - Kein Verständnis:

Keine Hilfe?! :o

Nagut, mal sehen obs diesmal klappt ;)
Das Programm nimmt den Slogan (eine Insel mit 2 Bergen...) und gibt ihn insgesamt drei mal aus. einmal unveraendert und zwei mal etwas veraendert. Kann leider im Moment nicht ausprobieren, was da genau rauskommt, aber vor dem zweiten und dritten Mal wird jeweils die Funktion rot13 darauf angewendet, die ihn etwas veraendert.
rot13 ist ein recht bekannter "Verschluesselungsalgorithmus". Wenn beim 2. Mal "rvar Vafry zvg 2 Oretra..." und beim dritten Mal wieder das Original ausgegeben wird, handelt es sich um eine Implementierung dieses Algorithmus. Zur Grundlegenden Funktionsweise:
http://de.wikipedia.org/wiki/ROT13
Fuer konkretere Fragen einfach nochmal melden...

Ohooo... Das höre ich gerne.
Fragen habe ich immer reichlich auf Lager.
 

for (int i = 0; s[i] != '\0'; i++) {
if (isupper(s[i])) {
    s[i] += 13;
    if (!isupper(s[i])) {
s[i] -= 26;
    }
} else if (islower(s[i])) {
    s[i] += 13;
    if (!islower(s[i])) {
s[i] -= 26;[/b]

Dieser Teil... Ich verstehe die IF- und FORKlammern nicht.
z.B.: Was bringt:
  islower(s[i]

oder

s[i] != '\0';

oder

 s[i] -= 26;

 oder

rot13(slogan); ???

 
« Letzte Änderung: 21.05.07, 13:49:20 von Speedy_92 »
islower(s[i])
Ueberprueft, ob das i-te Zeichen in s ein Kleinbuchstabe ist (lower case)

s[i] != '\0';
Ueberprueft, ob das i-te Zeichen das Ende der Zeichenkette ist. Zeichenketten in C sind Null-terminiert, d.h. das letzte Zeichen ist \0.

s[i] -= 26;
Das Zeichen an der i-ten Stelle in s wird in ein anderes Zeichen umgewandelt. In welches, das haengt davon ab, welches Zeichen s gerade darstellt. Zeichen in C sind ASCII-codiert, d.h. man kann damit rechnen. Ein 'a' hat z.B. den ASCII-code 97, ein 'U' 85. -> http://www.torsten-horn.de/techdocs/ascii.htm

rot13(slogan);
Ein simpler Funktionsaufruf. Es wird die Funktion rot13 aufgerufen und als Argument slogan uebergeben.

Noch Fragen, Kienzle^W Speedy?

Danke. Einfach suuuper erklärt.  :-*

Eine allerletzte Frage hätte ich noch zu diesem Thema:
Was bewirkt dieses an der Stelle:
 

if (!isupper(s[i])) {
 s[i] -= 26;

 ??? ??? ???

Wenn ich das in Worte fassen sollte würde ich es so interpretieren:
Wenn s kein Großbuchstabe ist, dann mach ihn zu einer(wegen s -= 26;)!!!


*Edit:

OK! Es sind doch 2 Fragen:
Wenn der Buchstabe zwischen "a" und "m" ist soll er durch den Buchstaben erstetzt werden, der im Alphabet 13 Stellen weiter ist. Zwischen "n" und "z" ist es genau das gleiche nur anders herum...
WO steht das in dem Quelltext ??? Ich sehe dort nichts, was dieses Bewirkt, also das mit "a, m, n, z"...


 
« Letzte Änderung: 21.05.07, 17:48:31 von Speedy_92 »

Jein, nicht ganz. Vorher wird ja zu dem Buchstaben 13 dazugezaehlt, d.h. um 13 Eintraege in der ASCII-Tabelle verschoben. Dabei kann es natuerlich passieren, dass man hinten aus dem Alphabet rauslaeuft, z.B. 'P' +13 ist ']'. Das will man aber nicht, daher zieht man mal 26 ab, wenn der Buchstabe kein Grossbuchstabe ist (d.h. irgendein Zeichen halt). Das wird ja auch nur dann ausgefuehrt, wenn der Buchstabe vorher ein Grossbuchstabe war, d.h. wenn man wirklich "rausgelaufen" ist. Danach ist man dann wieder drin: 'P' +13 -26 ist 'C'.

ich glaub den Nachtrag hab ich auch schon mit erwischt oder?

Dankeschön, jetzt verstehe ich den kompletten Quelltext...
Könnte man denn anstatt "isupper(s)" auch "isupper()=s" schreiben?

Ich habe jetzt versucht, das ganze einmal aus dem Kopf zu schreiben... Aber er meckert immer so dumme Sachen... Aber ich habe es mit dem Original verglichen und keinen Fehler gefunden.

 

#include <conio.h>
#include <iostream>
#include <ctype.h>

using namespace std;

void ROT13(char letter[]);

int main()
{
    char text[]= "Tears in Heaven";
   
    cout<<""<<text<<""<<endl<<endl;
    ROT13(text);
    cout<<""<<text<<""<<endl<<endl;
    ROT13(text);
    cout<<""<<text<<""<<endl<<endl;
   
   
    void ROT13(char letter[]){
   
         for(int i=0; letter[i]!='\0'; ++i){
         if(islower(letter[i])){
         letter[i]+=13;
         }
         if(!islower(letter[i])){
         letter[i]-=26;
         }
         else if(isupper(letter[i])){
         letter[i]+=13;
         }
         if(!isuppter(letter[i])){
         letter[i]-=26;
         }
         }
         }
    getch();
}
 
 
« Letzte Änderung: 21.05.07, 18:34:27 von Speedy_92 »

Was meckert der denn für komische Sachen? Dass du ne Funktion in ner Funktion definierst?
Kleiner Tipp: Überprüfe mal die geschweiften Klammern und vergleiche mit dem Original. Da sind ziemlich viele falsch gesetzt...

Beim ersten umwandeln des Textes geht alles in Ordnung, doch beim zweiten umwandeln machen zwei Buchstaben nicht das, was sie machen sollen.




Ich habe die Klammern jetzt mal so gestellt, wie im Original:
 

Zitat

#include <conio.h>
#include <iostream>
#include <ctype.h>

using namespace std;

void ROT13(char letter[]);

int main()
{
    char text[]= "Eine Insel mit 2 Bergen...";
   
    cout<<text<<"\n\n";
    ROT13(text);
    cout<<text<<"\n\n"<<endl<<endl;
    ROT13(text);
    cout<<text<<"";
    getch();
}
    void ROT13(char letter[]){
   
         for(int i=0; letter!='\0'; i++){
         if(islower(letter)){
         letter+=13;
         if(!islower(letter)){
         letter-=26;
         }
         }
         else if(isupper(letter)){
         letter+=13;
         if(!isupper(letter)){
         letter-=26;
         }
         }
         }
         getch();
         }



   
« Letzte Änderung: 22.05.07, 14:49:15 von Speedy_92 »

Welche und was?

Eine Insel mit 2 Bergen...

Rvar Vafry zvg 2 Oretra...

Eâne Insel çât 2 Bergen...
   

« Letzte Änderung: 22.05.07, 16:09:07 von Speedy_92 »

OK, der ist tricky. Du verwendest wahrscheinlich Windows? Der ASCII-Zeichensatz wird dort um einige Zeichen erweitert. Zum Beispiel um ç und â und so. Die zaehlen aber fuer islower() auch als Kleinbuchstaben, daher wird da dann nicht 26 abgezogen. Man laeuft quasi raus aus dem Alphabet, ohne es zu merken...

RIIIICHTIG!!!  8)

 

2 Sachen!!!

1. Wie kann ich es denn hinbekommen, dass â und so etwas nicht mehr zu den Kleinbuchstaben gehört?

2. Ich habe versucht, dort einzubauen, dass man erst mal einen text eingeben muss und der dann zur umwandelung benutzt wird. Nur er nimmt immer nur das 1. Wort von dem Text.

1. statt dem 2. islower sowas wie

if( letter[i] > 122 ) letter[i] -= 26;
Für das isupper dann entsprechend mit letter > 90

2. Keine Ahnung. Quellcode?

1. Klappt nicht... Da kommen immer noch so komische Buchstaben.

2.
 


char text[]= "";
cin>>text;
cout<<text<<"\n\n";
    .
    .
    .

1. Keine Ahnung. Lass dir was einfallen...
2. Probier mal getline( cin, text ); statt cin<<text;

1. Hab eine gefunden *höhö*  8)
2.
 In function `int main()':
no matching function for call to `getline(std::istream&,
char[1])'
 ??? ??? ??? Kommt immer,wenn ich das hinter
 

Zitat
char text[]= ""; 
einsetze...
Dafür brauche ich doch so einen String... Aber so weit bin ich noch nicht mit C++...   
« Letzte Änderung: 24.05.07, 15:32:16 von Speedy_92 »

Kann sein, ich dachte aber das geht auch mit ohne strings. Das Problem ist wahrscheinlich das char[1] aus der Fehlermeldung. Was passiert, wenn du text einfach mal so deklarierst:
char *text;
oder
char text[100];

Ich wuerde an deiner Stelle ruhig mal nen Blick auf Strings riskieren, die sind IMHO deutlich einfacher zu verwenden als diese .....eligen char*, die hab ich nie so richtig verstanden.

PS: Was mir grad so auffaellt: wenn du char* verwendest, musst du darauf achten, dass du immer den Speicher auch allokiert hast. D.h. entweder ne konstante Groesse (z.B. char x[100] in dem Fall ist Platz fuer 100 Zeichen) angeben, oder mit malloc reservieren. Sonst gibts wahrscheinlich irgendwann nen Segfault oder Memory fault oder sowas in der Art...

das is ja mal ne geile autozensur hier  ;D

Jup! Jup! Na denn mal wieder ein RIESEN Dankeschön an dich...

PS: Ich habe ja noch genug Zeit im meinem Leben um dieses verdammte C++ in meinen Kopf reinzubekommen...  :P


« Suche Programm/SpracheAssembler-com »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
Quellcode
Ein Quellcode, auch als Quelltext bekannt, bezeichnet den unkompilierten Programm-Code einer Software. Quell- oder Programm-Code ist der auch für Menschen lesbare Co...

Unicode
Unicode ist ein international anerkannter Standard, der als universeller Zeichencode ("Universal Code") dient und durch das Unicode-Konsortium entwickelt und verwaltet wi...

QR-Code
QR-Codes, die Abkürzung für "Quick Response Codes", sind eine Form von zweidimensionalen Barcodes. Damit lassen sich Informationen schnell und effizient speiche...