Denkanstoss zu kleiner Optimierung
-
Nabend.
Wie vielleicht schon bekannt, ackere ich mich durch das Buch von Ulrich Kaiser mit seinen gesammten Aufgaben.
Nun habe ich Aufgabe 6.11 bearbeitet. Man sollte ein kleines Hangman-Spiel schreiben. Der Code ist trivial. Doch irgendwie finde ich ihn nicht wirklich elegant. Vor allem meine Methode um herauszufinden ob das Spiel gelöst wurde, erscheint mir mehr als merkwürdig.Der Code funktioniert einwandfrei, aber wenn jemand Lust und Muße hätte, könnte man mir vielleicht einen Denkanstoss geben wie man das ganze "eleganter" angeht.
// Aufgabe A6.11 #include <stdio.h> #include <stdlib.h> // Galgenmännchen int main() { char eingabe[80]; char hilf[80]; char rate[10]; int i, j, k; printf("\n ----- Galgenmaennchen ------\n\n"); printf("Bitte den zu erratenden String eingeben:\n"); gets(eingabe); // Bildschirm "löschen", sprich: 30 zeilen scrollen for(i = 1; i <= 30; i++) printf("\n"); // eingabe-array zu lowercase wandeln for(i = 0; eingabe[i]; i++) { if(eingabe[i] >= 'A' && eingabe[i] <= 'Z') eingabe[i] = eingabe[i] + 'a' - 'A'; } // hilf-array mit '-' initialisieren (nur für Buchstaben) for(i = 0; eingabe[i]; i++) { if(eingabe[i] >= 'a' && eingabe[i] <= 'z') hilf[i] = '-'; else hilf[i] = ' '; } hilf[i] = '\0'; // string nullterminieren for(i = 1; ;i++) { printf("%s\n", hilf); // überprüfen ob alles gelöst wurde for(j = 0; j < 80; j++) { if(hilf[j] >= 'a' && hilf[j] <= 'z' || hilf[j] == ' ') continue; if(hilf[j] == '-') break; else exit(0); } printf("%d. Versuch: ", i); gets(rate); // überprüfen ob buchstaben aus dem rate-string in eingabe vorkommen for(j = 0; rate[j]; j++) { for(k = 0; eingabe[k]; k++) { if(eingabe[k] == rate[j]) hilf[k] = eingabe[k]; } } } return 0; }
greez
Ike
-
Moinsen.
Eine Möglichkeit der Optimierung ist eventuell, das man den String nicht selbst eingibt, sondern per Zufallsgenerator aus einer Datei holt, in der vieeleee Strings drin stehen.
Denn es ist ja nicht ganz so schwer, einen selbst eingegebenen String zu erraten.
Oder ist das ein Proggi für Alzheimerkandidaten.
Grützi, p.
-
schmeiss' das 'hilf[]' array raus, dann wird es auf jeden fall kürzer...
-
proggingmania:
ja, dachte ich mir auch
es ist ja nur für anschauungszwecke
einer gibt nen string ein, und der andere darf die aufen aufmachen und ihn erraten *g*pale dog:
hmmm... wenn ich hilf[] raushaue... wie soll ich dann überprüfen und ausgeben was schon geraten wurde, und was nicht? mir fehlt da jetzt die idee zu.
-
Die Anzahl der Versuche würde ich einschränken.
Die Anzahl der Versuche darf ruhig kleiner sein, als die Anzahl der Buchstaben im Alphabet.
-
Das entspricht einem Komfort-Galgen mit vielen extra Stützbalken.
-
Soviel ich weiß, gibt man auch nur einen Buchstaben ein.
-
#include <stdio.h> #include <string.h> #define GALGENBAU 10 // Rückgabewerte // 1 Überlebt // 0 Schade int Galgenmaennchen( char* pcGesucht ) { char c; unsigned i = 0, n = 0; char Puffer[50] = "0"; memset( Puffer, '-', strlen ( pcGesucht ) ); while( n++ < GALGENBAU ) { printf("Versuch %d von %d ", n, GALGENBAU ); c = getch( stdin ); for ( i = 0; i < strlen ( pcGesucht ); i++ ) { if ( pcGesucht[i] == c ) { Puffer[i] = c; } } while ((c = getchar()) != EOF && c != '\n'); // Eingabepuffer leeren. if ( strcmp( Puffer, pcGesucht ) == 0 ) { return 1; } printf("%s\n", Puffer ); } return 0; } int main() { char* pcGesucht = "Galgenmaennekieken"; // Nicht gucken! if ( Galgenmaennchen( pcGesucht ) ) { printf("%s %s\n", pcGesucht, "nochmal Glueck gehabt."); } else { puts("Hehe, Du hast dich erhaengt."); } return 0; }
-
Generell ist die Definition von Galgenmaennchen() Schrott, da in dieser Funktion niemand weiss, wie gross der Buffer pcGesucht ist weil eben nur eine Adresse bekannt ist.
Besser wäre es, und ein solches Verhalten kann man sich gleich angewöhnen, einen zusätzlichen Parameter zu übergeben, der zeigt wie gross der Speicher von pcGesucht wirklich ist.
-
burzum schrieb:
Generell ist die Definition von Galgenmaennchen() Schrott, da in dieser Funktion niemand weiss, wie gross der Buffer pcGesucht ist weil eben nur eine Adresse bekannt ist.
Besser wäre es, und ein solches Verhalten kann man sich gleich angewöhnen, einen zusätzlichen Parameter zu übergeben, der zeigt wie gross der Speicher von pcGesucht wirklich ist.
Die for-Schleife in Zeile 24 ist über die Größe des Puffers pcGesucht ganz gut informiert.
-
in diesem konkreten Beispiel schon. Die wirkliche Größe eines Buffers mit strlen() festzustellen ist aber im seltesten Fall richtig.
Beispiel:
int func(char *p) { printf("%d\n",strlen(p)); } int main() { char buf[1024]; func(buf); }
Auch wenn du vorher buf[] initialisierst, bekommst du falsche Ergebnisse.
Darum lieber gleich so:int func(char *p,unsigned int len) { } int main() { char buf[1024]; func(buf,sizeof(buf)); }
-
In diesem Fall ist der String korrekt Null-Terminiert und daher ist hier strlen die
einzig vernünftige Wahl.
Besides wird hier kein Char-Array übergeben. Schliesslich wären bei einem z.B.
10 Zeichen langen String in einem 1024 großem Array genau 1010 redundante Durchläufe in der Forschleife die Folge, verliesse man sich auf len = sizeof(buf)