Hallo zusammen,
will einen Decoder in C programmieren, der einen bestimmten Text
decodieren kann.
Jeder Buchstabe ist darin rollierend um den Wert 15 verschoben. Nach z
fängt es wieder bei a an.
Wie würdet ihr hierbei vorgehen? Was könnte helfen?
char decode(char Buchstabe) {
switch(Buchstabe) {
case 'a': return 'o';
case 'b': return 'p';
...
}
}
Ich denke du kannst das alleine vervollständigen.
JonasR schrieb:> Wie würdet ihr hierbei vorgehen?
Ich würde erst mal selber versuchen, die Aufgabe zu lösen. Wenn ich dann
auch mit Hilfe der Lehrmaterialien nicht weiterkäme, würde ich das, was
ich habe, hier posten und nachfragen, was ich falsch mache.
> Was könnte helfen?
Sich auf den Hosenboden zu setzen und zu lernen.
JonasR schrieb:> Wie würdet ihr hierbei vorgehen?
Erstmal den Decoder Schreiben ohne dass er was tut. Also jeden
Buchstaben X als X belässt.
Damit hast Du 99% der Aufgabe schon erfüllt.
Dann jeden Buchstaben um 1 verschieben, egal in welche Richtung (+1 oder
-1). Und egal ob dabei ein Buchstabe rauskommt oder nicht.
Schauen, ob es in die richtige Richtung geht und notfalls korrigieren.
Dann Schauen, dass der Überlauf funktioniert (erstmal festlegen, wie der
Überlauf funktionieren soll: aus z wird A oder aus Z wird A?)
Wenn Du das soweit hast, dann helfe ich Dir gerne dabei, dass um 15
Zeichen zu verschieben.
JonasR schrieb:> will einen Decoder in C programmieren, der einen bestimmten Text> decodieren kann.> Wie würdet ihr hierbei vorgehen? Was könnte helfen?
Die Vorbereiteneden Voelesungen/Schulstunden zu dieser Hausaufgabe
besuchen und sich den vermittelten Stoff durch Selbststudium zu eigen
machen.
Hallo,
will einen Decoder in C programmieren, wobei jeder Buchstabe des zu
entschlüsselnden Textes rollierend um den Wert 15 verschoben ist. Nach z
fängt es wieder bei a an.
Hab folgendes bisher gemacht:
1
#include<stdio.h>
2
3
4
intmain(){
5
6
charZeichenkette[100],ch;
7
inti,key;
8
9
printf("Geben Sie eine Zeichenkette ein, die entschüsselt werden soll: \n\n");
10
gets(Zeichenkette);
11
printf("Enter key: ");
12
scanf("%d",&key);
13
14
15
for(i=0;Zeichenkette[i]!='\0';i++){
16
17
ch=Zeichenkette[i];
18
19
if(ch>='a'&&ch<='z'){
20
21
22
ch=ch-key;
23
if(ch<'a'){
24
ch=ch+'z'-'a'+1;
25
}
26
Zeichenkette[i]=ch;
27
}
28
elseif(ch>='A'&&ch<='Z'){
29
ch=ch-key;
30
if(ch<'A'){
31
ch=ch+'Z'-'A'+1;
32
}
33
Zeichenkette[i]=ch;
34
}
35
}
36
37
printf("Decodierte Nachricht: %s",Zeichenkette);
38
39
40
return0;
41
}
Irgendwie funktioniert das noch nicht so richtig, deswegen brauche ich
mal eure Expertise.
JonasR schrieb:> Hallo,> will einen Decoder in C programmieren
Warum erstellst du dafür wieder einen neuen Beitrag und schreibst nicht
in dem von gestern weiter?
Vollkommen unuebersichtlich wegen fehlender/falsche Einrueckungen,
deswegen habe ich da gar nicht weiter nachgesehen.
Die Fehlerbeschreibung ist auch arg verbesserungswuerdig.
wendelsberg
"Irgendwie funktioniert das noch nicht so richtig," ist die dümmste
Fehlerbeschreibung die es gibt.
Was passiert und was erwartest du was passieren soll.
Benutze eine vernünftige und einheitliche Einrückung:
https://de.wikipedia.org/wiki/Einr%C3%BCckungsstil
Dann schauen sich das auch mehr Leute an.
gets() geht gar nicht und wurde abgekündigt.
Benutze Funktionen - also eigene.
Liste Fehler, Warnmeldungen und Output hier.
Hat es mit festen Werten für Zeichenkette und key funktioniert? Ja? Oder
hast Du das gar nicht ausprobiert und 3 Schritte übersprungen?
printf("Geben Sie die Nachricht ein, die entschlüsselt werden soll: \n\n");
9
10
fgets(str,100,stdin);
11
12
13
14
15
16
17
18
19
printf("Die decodierte Nachricht lautet: \n\n");
20
printf("%s\n\n",str);
21
22
23
return0;
24
}
Klappt auch mit der Ausgabe. Jetzt muss ich noch jeden Buchstaben um 15
verschieben. Hier bin ich leider komplett planlos... wie stellt man das
an? For-Schleife... nur wie könnte die aussehen?
JonasR schrieb:> Jetzt muss ich noch jeden Buchstaben um 15 verschieben.A. S. schrieb:> Erstmal ... ohne dass er was tut. Also jeden> Buchstaben X als X belässt.
Done
> Dann jeden Buchstaben um 1 verschieben, egal in welche Richtung (+1 oder> -1). Und egal ob dabei ein Buchstabe rauskommt oder nicht.> Schauen, ob es in die richtige Richtung geht und notfalls korrigieren.> Dann Schauen, dass der Überlauf funktioniert (erstmal festlegen, wie der> Überlauf funktionieren soll: aus z wird A oder aus Z wird A?)> Wenn Du das soweit hast, dann helfe ich Dir gerne dabei, dass um 15> Zeichen zu verschieben.
Das meiste hast Du doch schon gehabt. Mach einfach.
printf("Geben Sie die Nachricht ein, die entschlüsselt werden soll: \n\n");
12
fgets(str,100,stdin);
13
14
printf("Geben Sie an, um welchen Wert die Buchstaben verschoben sind: \n\n");
15
scanf("%d",&k);
16
17
18
19
for(i=0;str[i]!='\0';i++){
20
if(ch>='a'&&ch<='z'){
21
22
ch=ch-k;
23
24
if(ch<'a'){
25
26
ch=ch+'z'-'a'+1;
27
28
}
29
30
str[i]=ch;
31
32
}
33
34
elseif(ch>='A'&&ch<='Z'){
35
36
ch=ch-k;
37
38
if(ch<'A'){
39
40
ch=ch+'Z'-'A'+1;
41
42
}
43
44
str[i]=ch;
45
46
}
47
48
}
49
50
51
printf("Die decodierte Nachricht lautet: \n\n");
52
printf("%s\n\n",str);
53
54
55
return0;
56
}
Klappt immer noch nicht... bekomme immer nur den verschlüsselten Code
angezeigt. Komme schon ganz durcheinander mit switch, case, if, for...
was denn nun? Kann mir niemand helfen?
JonasR schrieb:> Dirk B. schrieb:>> Was gibst du denn bei der Frage "Um welchen Wert sind die>> Buchstaben>> verschoben?" ein?>> 15...
Für 15 gibt es kein case im switch.
Demnach steht da auch Error -und das hätte dir auffallen müssen.
Du benutzt da das i leider zu oft.
Vielleicht noch ein Tip zur Fehlersuche:
Packe die decodierten Zeichen in einen eigenen String und gib am Ende
beide (Original und decodiert) aus. Dann siehst Du leichter was sich
wohin geschoben hat.
Manchmal kann es auch sinnvoll sein, Testausgaben in die Schleifen
einzubauen. Wenn dann der Eingabestring erst mal kurz ist, wird's noch
einfacher. :-)
Mich würde ja viel mehr die Aufgabenstellung interessieren???
Ist es wirklich nur für Kleinbuchstaben?
Den eigentlich rotiert es durch a-z & A-Z.
Kommt auf das Verfahren drauf an...
Was steht denn da :-P ?
Wahrscheinlich etwas wo 10000000 Dinge nicht beachtet / erwähnt
wurden...
(vom Aufgabensteller)
diesmal nur für Kleinbuchstaben (keine Zahlen, Whitespaces, etc.) und 0
<= key <= 26 (man könnte es ja auch beschränken a la key = abs(key)%27
). Und für Großbuchstaben muss man ja 'a' durch 'A' ersetzen.
Tim T. schrieb:> Meh, so doll war die Idee nicht, lieber das hier:
das Programm vorher von Dir war doch schon gut; bis auf die Eingabe key:
0 wird der Text immer verschlüsselt, bei negativen key Wert erfolgt dann
Encodierung, alles okay.
Welche Verbesserung bringt die Variation?
Robert K. schrieb:> Tim T. schrieb:>> Meh, so doll war die Idee nicht, lieber das hier:> das Programm vorher von Dir war doch schon gut; bis auf die Eingabe key:> 0 wird der Text immer verschlüsselt, bei negativen key Wert erfolgt dann> Encodierung, alles okay.> Welche Verbesserung bringt die Variation?
Bessere Erweiterbarkeit und es ist übersichtlicher.
Wenn man beispielsweise noch die Zahlen oder bestimmte Sonderzeichen mit
hinzunehmen will, wird die Eingangsabfrage noch größer und die
Nachkorrektur beim Hinauslaufen aus dem Zielbereich noch
unübersichtlicher.
So ist es nur ein weiterer logisch aufgebauter 3 Zeilen Block für jeden
zusätzlichen Bereich.
>> Contest zur kürzesten/schnellsten Caesar-Verschlüsselung> Ich biete 5 Zeilen!
Da man mindestens die Schleife auch in einer Zeile schreiben könnte,
müsste man für eine gerechte Wertung die Länge in Bytes heranziehen.
;)