Hangman < C/C++ < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 23:49 Sa 12.01.2013 | Autor: | Mija |
Aufgabe | Schreiben Sie ein C-Programm, dass ein kleines Spiel "Wörter raten" implementiert. Im Programm wird ein Wort als eine Zeichenkette abgelegt. Der Benutzer kennt dieses Wort nicht und soll es im Dialog erraten. Er dann jedes Mal nur ein Zeichen eingeben. Das Programm zeigt die Antwort, in dem nur die erratenen Zeichen an der richtigen Stelle stehen, andere Zeichen werden ausgeblendet. Das geht solange der Benutzer Lust zum Raten hat oder die Anzahl der Versuche noch nicht überschritten ist. Im Dialog muss der Benutzer auch die Möglichkeit haben, den Dialog abzubrechen und die Lösung einzugeben.
Hinweise:
a) Das zu erratende Wort legen Sie in einem Array vom Typ char ab.
b) Die Größe des Arrays wird durch eine symbolische Konstante MAX_GROESSE festgelegt.
c) Für die Antwort definieren Sie ein zweites Array vom Typ char derselben Größe und initialisieren es entsprechend.
d) Schreiben Sie eine Funktion ersetze(char *wort, int wort_groesse, char *antwort, char c), die vier Parameter bekommt: einen Zeiger auf das zu erratende Wort, seine Größe, einen Zeiger auf die Antwort und das Zeichen, das gezeigt werden soll. Die Funktion soll in der Antwort das ausgeblendete Zeichen an den Stellen, entsprechend dem Wort, einblenden.
e) Schreiben Sie eine weitere Funktion vergleiche(char *wort, int wort_groesse, char *antwort), die das Wort und die Antwort vergleichen soll. Die Funktion soll eine 1 liefern, wenn das Wort und die Antwort gleich sind und 0 im Gegenfall. |
Hallo,
ich habe das obenstehende Programm bereits so gut es geht programmiert.
Nun habe ich noch folgende Probleme:
1.
Ich habe noch Probleme mit meiner Funktion 'vergleiche'.
Was läuft da schief? Ich habe schon alles mögliche ausprobiert.
Wenn man die Lösung eingeben möchte, dann hat man diese komischerweise immer richtig..
2.
Meine askAgain()-Funktion funktioniert nicht so, wie sie soll. Habe ich irgendwo einen Aufrufungsfehler oder ein Fehler beim Deklarieren von 'abbruch' gemacht? Was kann es sonst sein?
Wenn ich am Ende bei der Abbruchfrage 'n' oder 'N' eingebe, dann wird das Programm trotzdem abgebrochen.
Kann mir bitte jemand helfen? Ich würde mich sehr freuen! :)
Hier ist mein C-Code:
1: | #include <stdio.h>
| 2: | #include <string.h>
| 3: | #include <conio.h>
| 4: | #include <wchar.h>
| 5: | #include <windows.h>
| 6: | #include <time.h>
| 7: | #include <math.h>
| 8: | #define SCHWARZ 0
| 9: | #define GRAU 7
| 10: | #define MAX_GROESSE 50 //symbolische Konstante für Arrays 'wort' und 'antwort'
| 11: |
| 12: | //Funktionsdeklaration
| 13: | void farbe(int);
| 14: | int ersetze(char*,int,char*,char);
| 15: | int vergleiche(char*,int,char*);
| 16: | void clearBuffer();
| 17: | int askAgain();
| 18: |
| 19: |
| 20: | //Funktionsdefinitionen
| 21: |
| 22: | void farbe(int a)
| 23: | {
| 24: | SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
| 25: | }
| 26: |
| 27: | //richtiger Buchstabe an die richtige Stelle setzen
| 28: | int ersetze(char *wort, int wort_groesse, char *antwort, char c)
| 29: | {
| 30: | int i, versuch=0;
| 31: | for(i = 0; i < wort_groesse; i++)
| 32: | {
| 33: | if(wort[i] == c)
| 34: | {
| 35: | antwort[i] = c;
| 36: | versuch = 1;
| 37: | }
| 38: | }
| 39: | return versuch;
| 40: | }
| 41: |
| 42: | //Vergleich zwischen dem gesuchten Wort und dem Zwischenergebnis
| 43: | int vergleiche(char *wort, int wort_groesse, char *antwort)
| 44: | {
| 45: | int i;
| 46: | for(i = 0; i < wort_groesse; i++)
| 47: | {
| 48: | if ( ( wort[i]==antwort[i] ) && ( wort_groesse == strlen(antwort) ) )
| 49: | return 1;
| 50: | else
| 51: | return 0;
| 52: | }
| 53: |
| 54: | /*
| 55: | if (strcmp(antwort, wort) != 0)
| 56: | return 0;
| 57: | else
| 58: | return 1;
| 59: | */
| 60: | }
| 61: |
| 62: | //Funktion Tastaturpuffer leeren
| 63: | void clearBuffer()
| 64: | {
| 65: | char Dummy;
| 66: | do
| 67: | {
| 68: | scanf_s("%c", &Dummy);
| 69: | } while (Dummy != '\n');
| 70: |
| 71: | return;
| 72: | }
| 73: |
| 74: | //Funktion zur Frage, ob man abbrechen moechte
| 75: | int askAgain()
| 76: | {
| 77: | int abbruch=0;
| 78: | int auswahlGetroffen;
| 79: | char eingabe;
| 80: | do
| 81: | {
| 82: | printf("\n\nAbbruch? J/N ");
| 83: | auswahlGetroffen = scanf("%c", &eingabe);
| 84: |
| 85: | if (eingabe!='\n')
| 86: | clearBuffer();
| 87: | if (!auswahlGetroffen)
| 88: | printf("Sie haben nicht J oder N eingegeben!\n");
| 89: | else
| 90: | {
| 91: | switch(eingabe)
| 92: | {
| 93: | case 'j': abbruch = 1; break;
| 94: | case 'J': abbruch = 1; break;
| 95: | case 'n': abbruch = 0; break;
| 96: | case 'N': abbruch = 0; break;
| 97: | default: auswahlGetroffen = 0;
| 98: | }
| 99: | printf("\n\n\n");
| 100: | }
| 101: | } while (!auswahlGetroffen);
| 102: | return abbruch;
| 103: | }
| 104: |
| 105: |
| 106: | //Main-Programm
| 107: | int main(int argc, CHAR* argv[])
| 108: | {
| 109: | //char *wort; //das eingegebene Wort von Spieler 1
| 110: |
| 111: | //const int MAX_GROESSE = 50;
| 112: | char wort[MAX_GROESSE];
| 113: | char antwort[MAX_GROESSE]; //das Zwischenergebnis
| 114: | int i, wort_groesse;
| 115: | int punkte = 0;
| 116: | char c, wahl='w', loesung; //c - Zeichen, dass gezeigt werden soll, wahl - Ww für weiter oder Ll für loesen, loesung - vermutete Loesung
| 117: | int versuch=0;
| 118: | //int wortl;
| 119: | int abbruch = 0;
| 120: |
| 121: | do
| 122: | {
| 123: |
| 124: | printf("Spieler 1: Überlegen Sie sich ein Wort und geben Sie es ein!\n");
| 125: | fflush(stdin);
| 126: | farbe(SCHWARZ); //Farbe schwarz festlegen, damit Spieler 2 Wort nicht sieht
| 127: | scanf("%s", wort);
| 128: | clearBuffer();
| 129: | farbe(GRAU); //Farbe auf grau zuruecksetzen
| 130: |
| 131: |
| 132: | /*
| 133: | char *list[15] ={"Maschine","Dereferenzierungsoperator","Zeiger","Datentyp","Parameter", "Mittelwertsatz","Zwischenwertsatz", "Differentialgleichungen",
| 134: | "Datenbanken", "Statistik","Versicherungsmathematik", "Finanzmathematik", "Algorithmus", "Betriebswirtschaftslehre", "Volkswirtschaftslehre"};
| 135: | srand((unsigned int)time(NULL));
| 136: | wortl = rand() % 15;
| 137: | wort = list[wortl];
| 138: | */
| 139: |
| 140: |
| 141: | wort_groesse = strlen(wort);
| 142: |
| 143: | for(i = 0; i < wort_groesse; i++)
| 144: | {
| 145: | antwort[i] = '-'; //die antwort (Zwischenergebnis) wird mit - gefüllt
| 146: | wort[i] = towlower(wort[i]); //das gesuchte Wort wird in Kleinbuchstaben umgewandelt
| 147: | }
| 148: |
| 149: | antwort[i] = '\0';
| 150: | printf("\n%s\n", antwort); //das Wort wird als '---------' ausgegeben
| 151: |
| 152: |
| 153: | //Eingabe Spieler 2
| 154: | printf("\nSpieler 2: Erraten Sie das Wort nach und nach mit einzelnen Buchstaben!\n");
| 155: | while(!vergleiche) //Solange das zu findende Wort und das Zwischenergebnis nicht gleich sind
| 156: | {
| 157: | fflush(stdin); //Spieler 2 versucht das Wort zu erraten
| 158: | printf("Ihr Zeichen: ");
| 159: | scanf("%c", &c);
| 160: | clearBuffer();
| 161: | c = towlower(c);
| 162: |
| 163: | //eingegebener Buchstabe wird an die richtige Stelle gesetzt
| 164: | versuch = ersetze(wort, wort_groesse, antwort, c);
| 165: |
| 166: |
| 167: | //Ausgabe
| 168: |
| 169: | printf("%s\n", antwort); //Zwischenergebnis wird ausgegeben (also z.B. -t-t--t-- )
| 170: | if(versuch == 0) //falsch geraten
| 171: | {
| 172: | printf("Sie haben einen Strafpunkt erhalten!\n\n");
| 173: | punkte++;
| 174: | }
| 175: | printf("Strafpunkte: %d\n",punkte);
| 176: |
| 177: | printf("Ww = weiter, Ll = loesen: "); //Wahl ob Wort loesen oder nicht
| 178: | scanf("%c", &wahl);
| 179: | clearBuffer();
| 180: |
| 181: | if (wahl=='l' || wahl=='L')
| 182: | {
| 183: | printf("\n\nIhre Loesung: \n");
| 184: | scanf("%c", &loesung);
| 185: | clearBuffer();
| 186: |
| 187: | if (vergleiche)
| 188: | {
| 189: | printf("Gratulation! Sie haben es echt drauf!\n");
| 190: | printf("Das Wort war:\n");
| 191: | printf("\"%s\"\n\n\n", wort); //Ausgabe des gesuchten Wortes
| 192: | break;
| 193: | }
| 194: | else
| 195: | {
| 196: | printf("Leider nicht erraten. Versuchen Sie es noch einmal!\n");
| 197: | printf("Das Wort war:\n");
| 198: | printf("\"%s\"\n\n\n", wort); //Ausgabe des gesuchten Wortes
| 199: | break;
| 200: | }
| 201: | }
| 202: |
| 203: | if(punkte == 10) //wenn die maximal zu erreichende Strafpunktzahl erreicht ist
| 204: | {
| 205: | printf("Leider nicht erraten. Versuchen Sie es noch einmal!\n");
| 206: | printf("Das Wort war:\n");
| 207: | printf("\"%s\"\n\n\n", wort); //Ausgabe des gesuchten Wortes
| 208: | break;
| 209: | }
| 210: | }
| 211: |
| 212: | abbruch = askAgain();
| 213: |
| 214: | } while (!abbruch);
| 215: |
| 216: | return 0;
| 217: | }
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 14:24 So 13.01.2013 | Autor: | Mija |
Kann mir denn niemand weiterhelfen?
Wie muss ich denn die Zeiger in der Funktion 'vergleiche' verwenden? (Ist da vielleicht mein Fehler?)
|
|
|
|
|
Hallo Mija,
> Schreiben Sie ein C-Programm, dass ein kleines Spiel
> "Wörter raten" implementiert. Im Programm wird ein Wort
> als eine Zeichenkette abgelegt. Der Benutzer kennt dieses
> Wort nicht und soll es im Dialog erraten. Er dann jedes Mal
> nur ein Zeichen eingeben. Das Programm zeigt die Antwort,
> in dem nur die erratenen Zeichen an der richtigen Stelle
> stehen, andere Zeichen werden ausgeblendet. Das geht
> solange der Benutzer Lust zum Raten hat oder die Anzahl der
> Versuche noch nicht überschritten ist. Im Dialog muss der
> Benutzer auch die Möglichkeit haben, den Dialog
> abzubrechen und die Lösung einzugeben.
>
> Hinweise:
> a) Das zu erratende Wort legen Sie in einem Array vom Typ
> char ab.
> b) Die Größe des Arrays wird durch eine symbolische
> Konstante MAX_GROESSE festgelegt.
> c) Für die Antwort definieren Sie ein zweites Array vom
> Typ char derselben Größe und initialisieren es
> entsprechend.
> d) Schreiben Sie eine Funktion ersetze(char *wort, int
> wort_groesse, char *antwort, char c), die vier Parameter
> bekommt: einen Zeiger auf das zu erratende Wort, seine
> Größe, einen Zeiger auf die Antwort und das Zeichen, das
> gezeigt werden soll. Die Funktion soll in der Antwort das
> ausgeblendete Zeichen an den Stellen, entsprechend dem
> Wort, einblenden.
> e) Schreiben Sie eine weitere Funktion vergleiche(char
> *wort, int wort_groesse, char *antwort), die das Wort und
> die Antwort vergleichen soll. Die Funktion soll eine 1
> liefern, wenn das Wort und die Antwort gleich sind und 0 im
> Gegenfall.
> Hallo,
>
> ich habe das obenstehende Programm bereits so gut es geht
> programmiert.
>
> Nun habe ich noch folgende Probleme:
>
> 1.
> Ich habe noch Probleme mit meiner Funktion 'vergleiche'.
> Was läuft da schief? Ich habe schon alles mögliche
> ausprobiert.
> Wenn man die Lösung eingeben möchte, dann hat man diese
> komischerweise immer richtig..
>
Hier vergleichst Du immer ein Zeichen.
Es soll doch hier solange verglichen werden,
bis ein Unterschied auftritt oder das Ende der Zeichenfolge erreicht ist.
> 2.
> Meine askAgain()-Funktion funktioniert nicht so, wie sie
> soll. Habe ich irgendwo einen Aufrufungsfehler oder ein
> Fehler beim Deklarieren von 'abbruch' gemacht? Was kann es
> sonst sein?
Nun, die Funktion scanf gibt die Anzahl der übergebenen Variablen,
die erfolgreich beschrieben wurden, zurück. Hier dann immer 1. Bei der
if-Abfrage wird dann immer der else-Zweig ausgeführt.
> Wenn ich am Ende bei der Abbruchfrage 'n' oder 'N'
> eingebe, dann wird das Programm trotzdem abgebrochen.
>
> Kann mir bitte jemand helfen? Ich würde mich sehr freuen!
> :)
>
> Hier ist mein C-Code:
>
> 1: | #include <stdio.h>
| 2: | > #include <string.h>
| 3: | > #include <conio.h>
| 4: | > #include <wchar.h>
| 5: | > #include <windows.h>
| 6: | > #include <time.h>
| 7: | > #include <math.h>
| 8: | > #define SCHWARZ 0
| 9: | > #define GRAU 7
| 10: | > #define MAX_GROESSE 50 //symbolische Konstante für Arrays
| 11: | > 'wort' und 'antwort'
| 12: | >
| 13: | > //Funktionsdeklaration
| 14: | > void farbe(int);
| 15: | > int ersetze(char*,int,char*,char);
| 16: | > int vergleiche(char*,int,char*);
| 17: | > void clearBuffer();
| 18: | > int askAgain();
| 19: | >
| 20: | >
| 21: | > //Funktionsdefinitionen
| 22: | >
| 23: | > void farbe(int a)
| 24: | > {
| 25: | >
| 26: | > SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
| 27: | > }
| 28: | >
| 29: | > //richtiger Buchstabe an die richtige Stelle setzen
| 30: | > int ersetze(char *wort, int wort_groesse, char *antwort,
| 31: | > char c)
| 32: | > {
| 33: | > int i, versuch=0;
| 34: | > for(i = 0; i < wort_groesse; i++)
| 35: | > {
| 36: | > if(wort[i] == c)[/i]
| 37: | > [i] {[/i]
| 38: | > [i] antwort[i] = c;[/i][/i]
| 39: | > [i][i] versuch = 1;[/i][/i]
| 40: | > [i][i] }[/i][/i]
| 41: | > [i][i] }[/i][/i]
| 42: | > [i][i] return versuch;[/i][/i]
| 43: | > [i][i] }[/i][/i]
| 44: | > [i][i] [/i][/i]
| 45: | > [i][i]//Vergleich zwischen dem gesuchten Wort und dem [/i][/i]
| 46: | > [i][i]Zwischenergebnis[/i][/i]
| 47: | > [i][i] int vergleiche(char *wort, int wort_groesse, char [/i][/i]
| 48: | > [i][i]*antwort)[/i][/i]
| 49: | > [i][i] {[/i][/i]
| 50: | > [i][i] int i;[/i][/i]
| 51: | > [i][i] for(i = 0; i < wort_groesse; i++)[/i][/i]
| 52: | > [i][i] {[/i][/i]
| 53: | > [i][i] if ( ( wort[i]==antwort[i] ) && ( wort_groesse == [/i][/i][/i][/i]
| 54: | > [i][i][i][i]strlen(antwort) ) )[/i][/i][/i][/i]
| 55: | > [i][i][i][i] return 1;[/i][/i][/i][/i]
| 56: | > [i][i][i][i] else[/i][/i][/i][/i]
| 57: | > [i][i][i][i] return 0;[/i][/i][/i][/i]
| 58: | > [i][i][i][i] }[/i][/i][/i][/i]
| 59: | > [i][i][i][i] [/i][/i][/i][/i]
| 60: | > [i][i][i][i] /*[/i][/i][/i][/i]
| 61: | > [i][i][i][i] if (strcmp(antwort, wort) != 0)[/i][/i][/i][/i]
| 62: | > [i][i][i][i] return 0;[/i][/i][/i][/i]
| 63: | > [i][i][i][i] else[/i][/i][/i][/i]
| 64: | > [i][i][i][i] return 1;[/i][/i][/i][/i]
| 65: | > [i][i][i][i] */[/i][/i][/i][/i]
| 66: | > [i][i][i][i] }[/i][/i][/i][/i]
| 67: | > [i][i][i][i] [/i][/i][/i][/i]
| 68: | > [i][i][i][i]//Funktion Tastaturpuffer leeren[/i][/i][/i][/i]
| 69: | > [i][i][i][i] void clearBuffer()[/i][/i][/i][/i]
| 70: | > [i][i][i][i] { [/i][/i][/i][/i]
| 71: | > [i][i][i][i] char Dummy;[/i][/i][/i][/i]
| 72: | > [i][i][i][i] do[/i][/i][/i][/i]
| 73: | > [i][i][i][i] {[/i][/i][/i][/i]
| 74: | > [i][i][i][i] [mm] scanf_s("%c",[/mm] &Dummy);[/i][/i][/i][/i]
| 75: | > [i][i][i][i] } while (Dummy != [mm]'\n');[/mm][/i][/i][/i][/i]
| 76: | > [i][i][i][i] [/i][/i][/i][/i]
| 77: | > [i][i][i][i] return;[/i][/i][/i][/i]
| 78: | > [i][i][i][i] }[/i][/i][/i][/i]
| 79: | > [i][i][i][i] [/i][/i][/i][/i]
| 80: | > [i][i][i][i]//Funktion zur Frage, ob man abbrechen moechte[/i][/i][/i][/i]
| 81: | > [i][i][i][i] int askAgain()[/i][/i][/i][/i]
| 82: | > [i][i][i][i] {[/i][/i][/i][/i]
| 83: | > [i][i][i][i] int abbruch=0;[/i][/i][/i][/i]
| 84: | > [i][i][i][i] int auswahlGetroffen;[/i][/i][/i][/i]
| 85: | > [i][i][i][i] char eingabe;[/i][/i][/i][/i]
| 86: | > [i][i][i][i] do[/i][/i][/i][/i]
| 87: | > [i][i][i][i] {[/i][/i][/i][/i]
| 88: | > [i][i][i][i] [mm] printf("\n\nAbbruch?[/mm] J/N ");[/i][/i][/i][/i]
| 89: | > [i][i][i][i] auswahlGetroffen = scanf("%c", &eingabe);[/i][/i][/i][/i]
| 90: | > [i][i][i][i] [/i][/i][/i][/i]
| 91: | > [i][i][i][i] if [mm](eingabe!='\n')[/mm][/i][/i][/i][/i]
| 92: | > [i][i][i][i] clearBuffer();[/i][/i][/i][/i]
| 93: | > [i][i][i][i] if (!auswahlGetroffen)[/i][/i][/i][/i]
| 94: | > [i][i][i][i] printf("Sie haben nicht J oder N [mm]eingegeben!\n");[/mm][/i][/i][/i][/i]
| 95: | > [i][i][i][i] else[/i][/i][/i][/i]
| 96: | > [i][i][i][i] {[/i][/i][/i][/i]
| 97: | > [i][i][i][i] switch(eingabe)[/i][/i][/i][/i]
| 98: | > [i][i][i][i] {[/i][/i][/i][/i]
| 99: | > [i][i][i][i] case 'j': abbruch = 1; break;[/i][/i][/i][/i]
| 100: | > [i][i][i][i] case 'J': abbruch = 1; break;[/i][/i][/i][/i]
| 101: | > [i][i][i][i] case 'n': abbruch = 0; break;[/i][/i][/i][/i]
| 102: | > [i][i][i][i] case 'N': abbruch = 0; break;[/i][/i][/i][/i]
| 103: | > [i][i][i][i] default: auswahlGetroffen = 0;[/i][/i][/i][/i]
| 104: | > [i][i][i][i] }[/i][/i][/i][/i]
| 105: | > [i][i][i][i] [mm] printf("\n\n\n");[/mm][/i][/i][/i][/i]
| 106: | > [i][i][i][i] }[/i][/i][/i][/i]
| 107: | > [i][i][i][i] } while (!auswahlGetroffen);[/i][/i][/i][/i]
| 108: | > [i][i][i][i] return abbruch;[/i][/i][/i][/i]
| 109: | > [i][i][i][i] }[/i][/i][/i][/i]
| 110: | > [i][i][i][i] [/i][/i][/i][/i]
| 111: | > [i][i][i][i][/i][/i][/i][/i]
| 112: | > [i][i][i][i]//Main-Programm[/i][/i][/i][/i]
| 113: | > [i][i][i][i] int main(int argc, CHAR* argv[])[/i][/i][/i][/i]
| 114: | > [i][i][i][i] {[/i][/i][/i][/i]
| 115: | > [i][i][i][i] //char *wort; //das eingegebene Wort von Spieler 1[/i][/i][/i][/i]
| 116: | > [i][i][i][i] [/i][/i][/i][/i]
| 117: | > [i][i][i][i] //const int MAX_GROESSE = 50;[/i][/i][/i][/i]
| 118: | > [i][i][i][i] char wort[MAX_GROESSE];[/i][/i][/i][/i]
| 119: | > [i][i][i][i] char antwort[MAX_GROESSE]; //das Zwischenergebnis[/i][/i][/i][/i]
| 120: | > [i][i][i][i] int i, wort_groesse;[/i][/i][/i][/i]
| 121: | > [i][i][i][i] int punkte = 0;[/i][/i][/i][/i]
| 122: | > [i][i][i][i] char c, wahl='w', loesung; //c - Zeichen, dass gezeigt [/i][/i][/i][/i]
| 123: | > [i][i][i][i]werden soll, wahl - Ww für weiter oder Ll für loesen, [/i][/i][/i][/i]
| 124: | > [i][i][i][i]loesung - vermutete Loesung[/i][/i][/i][/i]
| 125: | > [i][i][i][i] int versuch=0;[/i][/i][/i][/i]
| 126: | > [i][i][i][i] //int wortl;[/i][/i][/i][/i]
| 127: | > [i][i][i][i] int abbruch = 0;[/i][/i][/i][/i]
| 128: | > [i][i][i][i] [/i][/i][/i][/i]
| 129: | > [i][i][i][i] do[/i][/i][/i][/i]
| 130: | > [i][i][i][i] {[/i][/i][/i][/i]
| 131: | > [i][i][i][i] [/i][/i][/i][/i]
| 132: | > [i][i][i][i] printf("Spieler 1: Überlegen Sie sich ein Wort und geben [/i][/i][/i][/i]
| 133: | > [i][i][i][i]Sie es [mm]ein!\n");[/mm][/i][/i][/i][/i]
| 134: | > [i][i][i][i] fflush(stdin);[/i][/i][/i][/i]
| 135: | > [i][i][i][i] farbe(SCHWARZ); //Farbe schwarz festlegen, damit Spieler [/i][/i][/i][/i]
| 136: | > [i][i][i][i]2 Wort nicht sieht[/i][/i][/i][/i]
| 137: | > [i][i][i][i] scanf("%s", wort);[/i][/i][/i][/i]
| 138: | > [i][i][i][i] clearBuffer();[/i][/i][/i][/i]
| 139: | > [i][i][i][i] farbe(GRAU); //Farbe auf grau zuruecksetzen[/i][/i][/i][/i]
| 140: | > [i][i][i][i] [/i][/i][/i][/i]
| 141: | > [i][i][i][i][/i][/i][/i][/i]
| 142: | > [i][i][i][i] /*[/i][/i][/i][/i]
| 143: | > [i][i][i][i] char *list[15] [/i][/i][/i][/i]
| 144: | > [i][i][i][i]={"Maschine","Dereferenzierungsoperator","Zeiger","Datentyp","Parameter", [/i][/i][/i][/i]
| 145: | > [i][i][i][i]"Mittelwertsatz","Zwischenwertsatz", [/i][/i][/i][/i]
| 146: | > [i][i][i][i]"Differentialgleichungen",[/i][/i][/i][/i]
| 147: | > [i][i][i][i] "Datenbanken", "Statistik","Versicherungsmathematik", [/i][/i][/i][/i]
| 148: | > [i][i][i][i]"Finanzmathematik", "Algorithmus", [/i][/i][/i][/i]
| 149: | > [i][i][i][i]"Betriebswirtschaftslehre", "Volkswirtschaftslehre"};[/i][/i][/i][/i]
| 150: | > [i][i][i][i] srand((unsigned int)time(NULL));[/i][/i][/i][/i]
| 151: | > [i][i][i][i] wortl = rand() % 15;[/i][/i][/i][/i]
| 152: | > [i][i][i][i] wort = list[wortl];[/i][/i][/i][/i]
| 153: | > [i][i][i][i] */[/i][/i][/i][/i]
| 154: | > [i][i][i][i] [/i][/i][/i][/i]
| 155: | > [i][i][i][i][/i][/i][/i][/i]
| 156: | > [i][i][i][i] wort_groesse = strlen(wort);[/i][/i][/i][/i]
| 157: | > [i][i][i][i] [/i][/i][/i][/i]
| 158: | > [i][i][i][i] for(i = 0; i < wort_groesse; i++)[/i][/i][/i][/i]
| 159: | > [i][i][i][i] {[/i][/i][/i][/i]
| 160: | > [i][i][i][i] antwort[i] = '-'; //die antwort (Zwischenergebnis) wird mit [/i][/i][/i][/i][/i]
| 161: | > [i][i][i][i][i]- gefüllt[/i][/i][/i][/i][/i]
| 162: | > [i][i][i][i][i] wort[i] = towlower(wort[i]); //das gesuchte Wort wird in [/i][/i][/i][/i][/i][/i][/i]
| 163: | > [i][i][i][i][i][i][i]Kleinbuchstaben umgewandelt[/i][/i][/i][/i][/i][/i][/i]
| 164: | > [i][i][i][i][i][i][i] }[/i][/i][/i][/i][/i][/i][/i]
| 165: | > [i][i][i][i][i][i][i] [/i][/i][/i][/i][/i][/i][/i]
| 166: | > [i][i][i][i][i][i][i] antwort[i] = [mm]'\0';[/mm][/i][/i][/i][/i][/i][/i][/i][/i]
| 167: | > [i][i][i][i][i][i][i][i] [mm] printf("\n%s\n",[/mm] antwort); //das Wort wird als [/i][/i][/i][/i][/i][/i][/i][/i]
| 168: | > [i][i][i][i][i][i][i][i]'---------' ausgegeben[/i][/i][/i][/i][/i][/i][/i][/i]
| 169: | > [i][i][i][i][i][i][i][i] [/i][/i][/i][/i][/i][/i][/i][/i]
| 170: | > [i][i][i][i][i][i][i][i][/i][/i][/i][/i][/i][/i][/i][/i]
| 171: | > [i][i][i][i][i][i][i][i] //Eingabe Spieler 2[/i][/i][/i][/i][/i][/i][/i][/i]
| 172: | > [i][i][i][i][i][i][i][i] [mm] printf("\nSpieler[/mm] 2: Erraten Sie das Wort nach und nach [/i][/i][/i][/i][/i][/i][/i][/i]
| 173: | > [i][i][i][i][i][i][i][i]mit einzelnen [mm]Buchstaben!\n");[/mm][/i][/i][/i][/i][/i][/i][/i][/i]
| 174: | > [i][i][i][i][i][i][i][i] while(!vergleiche) //Solange das zu findende Wort und [/i][/i][/i][/i][/i][/i][/i][/i]
| 175: | > [i][i][i][i][i][i][i][i]das Zwischenergebnis nicht gleich sind[/i][/i][/i][/i][/i][/i][/i][/i]
| 176: | > [i][i][i][i][i][i][i][i] {[/i][/i][/i][/i][/i][/i][/i][/i]
| 177: | > [i][i][i][i][i][i][i][i] fflush(stdin); //Spieler 2 versucht das Wort zu [/i][/i][/i][/i][/i][/i][/i][/i]
| 178: | > [i][i][i][i][i][i][i][i]erraten[/i][/i][/i][/i][/i][/i][/i][/i]
| 179: | > [i][i][i][i][i][i][i][i] printf("Ihr Zeichen: ");[/i][/i][/i][/i][/i][/i][/i][/i]
| 180: | > [i][i][i][i][i][i][i][i] scanf("%c", &c);[/i][/i][/i][/i][/i][/i][/i][/i]
| 181: | > [i][i][i][i][i][i][i][i] clearBuffer();[/i][/i][/i][/i][/i][/i][/i][/i]
| 182: | > [i][i][i][i][i][i][i][i] c = towlower(c);[/i][/i][/i][/i][/i][/i][/i][/i]
| 183: | > [i][i][i][i][i][i][i][i] [/i][/i][/i][/i][/i][/i][/i][/i]
| 184: | > [i][i][i][i][i][i][i][i] //eingegebener Buchstabe wird an die richtige Stelle [/i][/i][/i][/i][/i][/i][/i][/i]
| 185: | > [i][i][i][i][i][i][i][i]gesetzt[/i][/i][/i][/i][/i][/i][/i][/i]
| 186: | > [i][i][i][i][i][i][i][i] versuch = ersetze(wort, wort_groesse, antwort, c);[/i][/i][/i][/i][/i][/i][/i][/i]
| 187: | > [i][i][i][i][i][i][i][i] [/i][/i][/i][/i][/i][/i][/i][/i]
| 188: | > [i][i][i][i][i][i][i][i][/i][/i][/i][/i][/i][/i][/i][/i]
| 189: | > [i][i][i][i][i][i][i][i] //Ausgabe[/i][/i][/i][/i][/i][/i][/i][/i]
| 190: | > [i][i][i][i][i][i][i][i] [/i][/i][/i][/i][/i][/i][/i][/i]
| 191: | > [i][i][i][i][i][i][i][i][mm] printf("%s\n",[/mm] antwort); //Zwischenergebnis wird [/i][/i][/i][/i][/i][/i][/i][/i]
| 192: | > [i][i][i][i][i][i][i][i]ausgegeben (also z.B. -t-t--t-- ) [/i][/i][/i][/i][/i][/i][/i][/i]
| 193: | > [i][i][i][i][i][i][i][i] if(versuch == 0) //falsch geraten[/i][/i][/i][/i][/i][/i][/i][/i]
| 194: | > [i][i][i][i][i][i][i][i] { [/i][/i][/i][/i][/i][/i][/i][/i]
| 195: | > [i][i][i][i][i][i][i][i] printf("Sie haben einen Strafpunkt [mm]erhalten!\n\n");[/mm][/i][/i][/i][/i][/i][/i][/i][/i]
| 196: | > [i][i][i][i][i][i][i][i] punkte++;[/i][/i][/i][/i][/i][/i][/i][/i]
| 197: | > [i][i][i][i][i][i][i][i] }[/i][/i][/i][/i][/i][/i][/i][/i]
| 198: | > [i][i][i][i][i][i][i][i] printf("Strafpunkte: [mm]%d\n",punkte);[/mm][/i][/i][/i][/i][/i][/i][/i][/i]
| 199: | > [i][i][i][i][i][i][i][i] [/i][/i][/i][/i][/i][/i][/i][/i]
| 200: | > [i][i][i][i][i][i][i][i] printf("Ww = weiter, Ll = loesen: "); //Wahl ob Wort [/i][/i][/i][/i][/i][/i][/i][/i]
| 201: | > [i][i][i][i][i][i][i][i]loesen oder nicht[/i][/i][/i][/i][/i][/i][/i][/i]
| 202: | > [i][i][i][i][i][i][i][i] scanf("%c", &wahl);[/i][/i][/i][/i][/i][/i][/i][/i]
| 203: | > [i][i][i][i][i][i][i][i] clearBuffer();[/i][/i][/i][/i][/i][/i][/i][/i]
| 204: | > [i][i][i][i][i][i][i][i] [/i][/i][/i][/i][/i][/i][/i][/i]
| 205: | > [i][i][i][i][i][i][i][i] if (wahl=='l' || wahl=='L')[/i][/i][/i][/i][/i][/i][/i][/i]
| 206: | > [i][i][i][i][i][i][i][i] {[/i][/i][/i][/i][/i][/i][/i][/i]
| 207: | > [i][i][i][i][i][i][i][i] [mm] printf("\n\nIhre[/mm] Loesung: [mm]\n");[/mm][/i][/i][/i][/i][/i][/i][/i][/i]
| 208: | > [i][i][i][i][i][i][i][i] scanf("%c", &loesung);[/i][/i][/i][/i][/i][/i][/i][/i]
| 209: | > [i][i][i][i][i][i][i][i] clearBuffer();[/i][/i][/i][/i][/i][/i][/i][/i]
| 210: | > [i][i][i][i][i][i][i][i] [/i][/i][/i][/i][/i][/i][/i][/i]
| 211: | > [i][i][i][i][i][i][i][i] if (vergleiche)[/i][/i][/i][/i][/i][/i][/i][/i]
| 212: | > [i][i][i][i][i][i][i][i] {[/i][/i][/i][/i][/i][/i][/i][/i]
| 213: | > [i][i][i][i][i][i][i][i] printf("Gratulation! Sie haben es echt [mm]drauf!\n");[/mm][/i][/i][/i][/i][/i][/i][/i][/i]
| 214: | > [i][i][i][i][i][i][i][i] printf("Das Wort [mm]war:\n");[/mm][/i][/i][/i][/i][/i][/i][/i][/i]
| 215: | > [i][i][i][i][i][i][i][i] [mm] printf("\"%s\"\n\n\n",[/mm] wort); //Ausgabe des gesuchten [/i][/i][/i][/i][/i][/i][/i][/i]
| 216: | > [i][i][i][i][i][i][i][i]Wortes[/i][/i][/i][/i][/i][/i][/i][/i]
| 217: | > [i][i][i][i][i][i][i][i] break;[/i][/i][/i][/i][/i][/i][/i][/i]
| 218: | > [i][i][i][i][i][i][i][i] }[/i][/i][/i][/i][/i][/i][/i][/i]
| 219: | > [i][i][i][i][i][i][i][i] else[/i][/i][/i][/i][/i][/i][/i][/i]
| 220: | > [i][i][i][i][i][i][i][i] {[/i][/i][/i][/i][/i][/i][/i][/i]
| 221: | > [i][i][i][i][i][i][i][i] printf("Leider nicht erraten. Versuchen Sie es noch [/i][/i][/i][/i][/i][/i][/i][/i]
| 222: | > [i][i][i][i][i][i][i][i][mm]einmal!\n");[/mm][/i][/i][/i][/i][/i][/i][/i][/i]
| 223: | > [i][i][i][i][i][i][i][i] printf("Das Wort [mm]war:\n");[/mm][/i][/i][/i][/i][/i][/i][/i][/i]
| 224: | > [i][i][i][i][i][i][i][i] [mm] printf("\"%s\"\n\n\n",[/mm] wort); //Ausgabe des gesuchten [/i][/i][/i][/i][/i][/i][/i][/i]
| 225: | > [i][i][i][i][i][i][i][i]Wortes[/i][/i][/i][/i][/i][/i][/i][/i]
| 226: | > [i][i][i][i][i][i][i][i] break;[/i][/i][/i][/i][/i][/i][/i][/i]
| 227: | > [i][i][i][i][i][i][i][i] }[/i][/i][/i][/i][/i][/i][/i][/i]
| 228: | > [i][i][i][i][i][i][i][i] }[/i][/i][/i][/i][/i][/i][/i][/i]
| 229: | > [i][i][i][i][i][i][i][i] [/i][/i][/i][/i][/i][/i][/i][/i]
| 230: | > [i][i][i][i][i][i][i][i] if(punkte == 10) //wenn die maximal zu erreichende [/i][/i][/i][/i][/i][/i][/i][/i]
| 231: | > [i][i][i][i][i][i][i][i]Strafpunktzahl erreicht ist[/i][/i][/i][/i][/i][/i][/i][/i]
| 232: | > [i][i][i][i][i][i][i][i] {[/i][/i][/i][/i][/i][/i][/i][/i]
| 233: | > [i][i][i][i][i][i][i][i] printf("Leider nicht erraten. Versuchen Sie es noch [/i][/i][/i][/i][/i][/i][/i][/i]
| 234: | > [i][i][i][i][i][i][i][i][mm]einmal!\n");[/mm][/i][/i][/i][/i][/i][/i][/i][/i]
| 235: | > [i][i][i][i][i][i][i][i] printf("Das Wort [mm]war:\n");[/mm][/i][/i][/i][/i][/i][/i][/i][/i]
| 236: | > [i][i][i][i][i][i][i][i] [mm] printf("\"%s\"\n\n\n",[/mm] wort); //Ausgabe des gesuchten [/i][/i][/i][/i][/i][/i][/i][/i]
| 237: | > [i][i][i][i][i][i][i][i]Wortes[/i][/i][/i][/i][/i][/i][/i][/i]
| 238: | > [i][i][i][i][i][i][i][i] break;[/i][/i][/i][/i][/i][/i][/i][/i]
| 239: | > [i][i][i][i][i][i][i][i] }[/i][/i][/i][/i][/i][/i][/i][/i]
| 240: | > [i][i][i][i][i][i][i][i] }[/i][/i][/i][/i][/i][/i][/i][/i]
| 241: | > [i][i][i][i][i][i][i][i] [/i][/i][/i][/i][/i][/i][/i][/i]
| 242: | > [i][i][i][i][i][i][i][i] abbruch = askAgain();[/i][/i][/i][/i][/i][/i][/i][/i]
| 243: | > [i][i][i][i][i][i][i][i] [/i][/i][/i][/i][/i][/i][/i][/i]
| 244: | > [i][i][i][i][i][i][i][i] } while (!abbruch);[/i][/i][/i][/i][/i][/i][/i][/i]
| 245: | > [i][i][i][i][i][i][i][i] [/i][/i][/i][/i][/i][/i][/i][/i]
| 246: | > [i][i][i][i][i][i][i][i]return 0;[/i][/i][/i][/i][/i][/i][/i][/i]
| 247: | > [i][i][i][i][i][i][i][i] }[/i][/i][/i][/i][/i][/i][/i][/i]
| 248: | > [i][i][i][i][i][i][i][i] | [/i][/i][/i][/i][/i][/i][/i][/i]
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 16:52 So 13.01.2013 | Autor: | Mija |
Danke für den Tipp!
Leider kriege ich das mit der Funktion 'vergleiche' gerade nicht so hin, wie ich möchte. Könntest du mir vielleicht einen kleinen Vorschlag machen, wie ich das programmieren könnte?
(Formfehler im Code unten sind zu vernachlässigen :D )
Ich habe es momentan so:
1: | //Vergleich zwischen dem gesuchten Wort und dem Zwischenergebnis
| 2: | int vergleiche(char *wort, int wort_groesse, char *antwort)
| 3: | {
| 4: | int i;
| 5: | for(i = 0; i < wort_groesse; i++)
| 6: | {
| 7: | while (i<wort_groesse && wort[i]==antwort[i])
| 8: | {
| 9: | if ( ( wort[i]==antwort[i] ) && ( wort_groesse == strlen(antwort) ) )
| 10: | return 1;
| 11: | else
| 12: | return 0;
| 13: | }
| 14: | }
| 15: | }
|
|
|
|
|
|
Hallo Mija,
> Danke für den Tipp!
> Leider kriege ich das mit der Funktion 'vergleiche' gerade
> nicht so hin, wie ich möchte. Könntest du mir vielleicht
> einen kleinen Vorschlag machen, wie ich das programmieren
> könnte?
> (Formfehler im Code unten sind zu vernachlässigen :D )
>
> Ich habe es momentan so:
>
> 1: | //Vergleich zwischen dem gesuchten Wort und dem
| 2: | > Zwischenergebnis
| 3: | > int vergleiche(char *wort, int wort_groesse, char
| 4: | > *antwort)
| 5: | > {
| 6: | > int i;
| 7: | > for(i = 0; i < wort_groesse; i++)
| 8: | > {
| 9: | > while (i<wort_groesse && wort[i]==antwort[i])[/i][/i]
| 10: | > [i][i] {[/i][/i]
| 11: | > [i][i] if ( ( wort[i]==antwort[i] ) && ( wort_groesse [/i][/i][/i][/i]
| 12: | > [i][i][i][i]== strlen(antwort) ) )[/i][/i][/i][/i]
| 13: | > [i][i][i][i] return 1;[/i][/i][/i][/i]
| 14: | > [i][i][i][i] else[/i][/i][/i][/i]
| 15: | > [i][i][i][i] return 0;[/i][/i][/i][/i]
| 16: | > [i][i][i][i] }[/i][/i][/i][/i]
| 17: | > [i][i][i][i] }[/i][/i][/i][/i]
| 18: | > [i][i][i][i] }[/i][/i][/i][/i]
| 19: | > [i][i][i][i] | [/i][/i][/i][/i]
Vorschlag:
1: |
| 2: | //Vergleich zwischen dem gesuchten Wort und dem Zwischenergebnis
| 3: | int vergleiche(char *wort, int wort_groesse, char *antwort)
| 4: | {
| 5: | if ( wort_groesse == strlen(antwort) )
| 6: | {
| 7: | int i=0;
| 8: | while ( (i < wortgroesse) && ( wort[i] == antwort[i]) )
| 9: | {
| 10: | i++;
| 11: | }
| 12: |
| 13: | if (i < wort_groesse)
| 14: | {
| 15: | return 0;
| 16: | }
| 17: | return 1;
| 18: |
| 19: | }
| 20: | return 0;
| 21: | }
|
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 18:00 So 13.01.2013 | Autor: | Mija |
Hallo Mathepower,
ich glaube, in deine Funktion war noch etwas fehlerhaft (ich habe das ganze mal auf dem Papier ausprobiert).
Meintest du das vielleicht so:
1: | //Vergleich zwischen dem gesuchten Wort und dem Zwischenergebnis
| 2: | int vergleiche(char *wort, int wort_groesse, char *antwort)
| 3: | {
| 4: | if ( wort_groesse == strlen(antwort) )
| 5: | {
| 6: | int i=0;
| 7: | while ( (i < wort_groesse) && ( wort[i] == antwort[i]) )
| 8: | i++;
| 9: | if (i < wort_groesse)
| 10: | return 0;
| 11: | else
| 12: | return 1;
| 13: | }
| 14: | else
| 15: | return 0;
| 16: | }
|
Wenn ich mein Programm mit Dev-C++ kompliliere und ausführe, dann kommt die Warnung "the address of 'vergleiche' will always evaluate as 'true' " bzw mit Visual Studio "Ausdruck wird als Funktion ausgewertet, der eine Argumentliste fehlt". Die Warnungen kommen immer jeweils an den Stellen, wo ich meine Funktion 'vergleiche' aufrufe.
Was mache ich noch falsch? Hast das jetzt irgendwas mit den Zeigern zu tun?
Bei meinem zweiten Aufruf der Funktion 'vergleiche' in Zeile 193 geht noch immer etwas schief, denn man kann leider noch immer gewinnen, egal ob man das richtige Wort eingibt oder nicht.
1: | #include <stdio.h>
| 2: | #include <string.h>
| 3: | #include <conio.h>
| 4: | #include <wchar.h>
| 5: | #include <windows.h>
| 6: | #include <time.h>
| 7: | #include <math.h>
| 8: | #define SCHWARZ 0
| 9: | #define GRAU 7
| 10: | #define MAX_GROESSE 50 //symbolische Konstante für Arrays 'wort' und 'antwort'
| 11: |
| 12: | //Funktionsdeklaration
| 13: | void farbe(int);
| 14: | int ersetze(char*,int,char*,char);
| 15: | int vergleiche(char*,int,char*);
| 16: | void clearBuffer();
| 17: | int askAgain();
| 18: |
| 19: |
| 20: | //Funktionsdefinitionen
| 21: |
| 22: | void farbe(int a)
| 23: | {
| 24: | SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
| 25: | }
| 26: |
| 27: | //richtiger Buchstabe an die richtige Stelle setzen
| 28: | int ersetze(char *wort, int wort_groesse, char *antwort, char c)
| 29: | {
| 30: | int i, versuch=0;
| 31: | for(i = 0; i < wort_groesse; i++)
| 32: | {
| 33: | if(wort[i] == c)
| 34: | {
| 35: | antwort[i] = c;
| 36: | versuch = 1;
| 37: | }
| 38: | }
| 39: | printf("%s\n", antwort); //Zwischenergebnis wird ausgegeben (also z.B. -t-t--t-- )
| 40: | return versuch;
| 41: | }
| 42: |
| 43: | //Vergleich zwischen dem gesuchten Wort und dem Zwischenergebnis
| 44: | int vergleiche(char *wort, int wort_groesse, char *antwort)
| 45: | {
| 46: | if ( wort_groesse == strlen(antwort) )
| 47: | {
| 48: | int i=0;
| 49: | while ( (i < wort_groesse) && ( wort[i] == antwort[i]) )
| 50: | {
| 51: | i++;
| 52: | }
| 53: | if (i < wort_groesse)
| 54: | {
| 55: | return 0;
| 56: | }
| 57: | return 1;
| 58: | }
| 59: | return 0;
| 60: | }
| 61: |
| 62: | //Funktion Tastaturpuffer leeren
| 63: | void clearBuffer()
| 64: | {
| 65: | char Dummy;
| 66: | do
| 67: | {
| 68: | scanf("%c", &Dummy);
| 69: | } while (Dummy != '\n');
| 70: |
| 71: | return;
| 72: | }
| 73: |
| 74: | //Funktion zur Frage, ob man abbrechen moechte
| 75: | int askAgain()
| 76: | {
| 77: | int abbruch=0;
| 78: | int auswahlGetroffen;
| 79: | char eingabe;
| 80: | do
| 81: | {
| 82: | printf("\n\nAbbruch? J/N ");
| 83: | auswahlGetroffen = scanf("%c", &eingabe);
| 84: |
| 85: | if (eingabe!='\n')
| 86: | clearBuffer();
| 87: | if (!auswahlGetroffen)
| 88: | printf("Sie haben nicht J oder N eingegeben!\n");
| 89: | else
| 90: | {
| 91: | switch(eingabe)
| 92: | {
| 93: | case 'j': abbruch = 1; break;
| 94: | case 'J': abbruch = 1; break;
| 95: | case 'n': abbruch = 0; break;
| 96: | case 'N': abbruch = 0; break;
| 97: | default: auswahlGetroffen = 0;
| 98: | }
| 99: | printf("\n\n\n");
| 100: | }
| 101: | } while (!auswahlGetroffen);
| 102: | return abbruch;
| 103: | }
| 104: |
| 105: |
| 106: | //Main-Programm
| 107: | int main(int argc, CHAR* argv[])
| 108: | {
| 109: | //char *wort; //das eingegebene Wort von Spieler 1
| 110: |
| 111: | //const int MAX_GROESSE = 50;
| 112: | char wort[MAX_GROESSE];
| 113: | char antwort[MAX_GROESSE]; //das Zwischenergebnis
| 114: | int i, wort_groesse;
| 115: | int punkte = 0;
| 116: | char c, wahl='w', loesung; //c - Zeichen, dass gezeigt werden soll, wahl - Ww für weiter oder Ll für loesen, loesung - vermutete Loesung
| 117: | int versuch=0;
| 118: | //int ergebnis=0;
| 119: | //int wortl;
| 120: | int abbruch = 0;
| 121: |
| 122: | do
| 123: | {
| 124: |
| 125: | printf("Spieler 1: Überlegen Sie sich ein Wort und geben Sie es ein!\n");
| 126: | fflush(stdin);
| 127: | farbe(SCHWARZ); //Farbe schwarz festlegen, damit Spieler 2 Wort nicht sieht
| 128: | scanf("%s", wort);
| 129: | clearBuffer();
| 130: | farbe(GRAU); //Farbe auf grau zuruecksetzen
| 131: |
| 132: |
| 133: | /*
| 134: | char *list[15] ={"Maschine","Dereferenzierungsoperator","Zeiger","Datentyp","Parameter", "Mittelwertsatz","Zwischenwertsatz", "Differentialgleichungen",
| 135: | "Datenbanken", "Statistik","Versicherungsmathematik", "Finanzmathematik", "Algorithmus", "Betriebswirtschaftslehre", "Volkswirtschaftslehre"};
| 136: | srand((unsigned int)time(NULL));
| 137: | wortl = rand() % 15;
| 138: | wort = list[wortl];
| 139: | */
| 140: |
| 141: |
| 142: | wort_groesse = strlen(wort);
| 143: |
| 144: | for(i = 0; i < wort_groesse; i++)
| 145: | {
| 146: | antwort[i] = '-'; //die antwort (Zwischenergebnis) wird mit - gefüllt
| 147: | wort[i] = towlower(wort[i]); //das gesuchte Wort wird in Kleinbuchstaben umgewandelt
| 148: | }
| 149: |
| 150: | antwort[i] = '\0';
| 151: | printf("\n%s\n", antwort); //das Wort wird als '---------' ausgegeben
| 152: |
| 153: |
| 154: | //Eingabe Spieler 2
| 155: |
| 156: | printf("\nSpieler 2: Versuchen Sie das Wort zu erraten, indem Sie immer jeweils einen Buchstaben eingeben!\n");
| 157: | printf("Falls Sie einen Buchstaben falsch geraten haben, bekommen Sie einen Strafpunkt.\n");
| 158: | printf("Bei 10 Strafpunkten ist das Spiel beendet und gilt als verloren.\n");
| 159: | printf("Nach jedem Rateversuch koennen Sie waehlen, ob Sie weiterraten moechten oder\n");
| 160: | printf("versuchen, die richtige Loesung einzugeben.\n");
| 161: |
| 162: | //ergebnis = vergleiche(wort, wort_groesse, antwort);
| 163: | while(!vergleiche) //Solange das zu findende Wort und das Zwischenergebnis nicht gleich sind
| 164: | {
| 165: | fflush(stdin); //Spieler 2 versucht das Wort zu erraten
| 166: | printf("Ihr Zeichen: ");
| 167: | scanf("%c", &c);
| 168: | clearBuffer();
| 169: | c = towlower(c); //der eingegebene Buchstabe wird in einen Kleinbuchstaben umgewandelt
| 170: |
| 171: | //eingegebener Buchstabe wird an die richtige Stelle gesetzt
| 172: | versuch = ersetze(wort, wort_groesse, antwort, c);
| 173: |
| 174: | //Ausgabe
| 175: |
| 176: | if(versuch == 0) //falsch geraten
| 177: | {
| 178: | printf("Sie haben einen Strafpunkt erhalten!\n\n");
| 179: | punkte++;
| 180: | }
| 181: | printf("Strafpunkte: %d\n",punkte);
| 182: |
| 183: | printf("Ww = weiter, Ll = loesen: "); //Wahl ob Wort loesen oder nicht
| 184: | scanf("%c", &wahl);
| 185: | clearBuffer();
| 186: |
| 187: | if (wahl=='l' || wahl=='L')
| 188: | {
| 189: | printf("\n\nIhre Loesung: \n");
| 190: | scanf("%c", &loesung);
| 191: | clearBuffer();
| 192: |
| 193: | if (vergleiche)
| 194: | printf("Gratulation! Sie haben es echt drauf!\n");
| 195: | else
| 196: | printf("Leider nicht erraten. Versuchen Sie es noch einmal!\n");
| 197: | }
| 198: |
| 199: | if (punkte == 10) //wenn die maximal zu erreichende Strafpunktzahl erreicht ist
| 200: | printf("Leider nicht erraten. Versuchen Sie es noch einmal!\n");
| 201: |
| 202: | printf("Das Wort war:\n");
| 203: | printf("\"%s\"\n\n\n", wort); //Ausgabe des gesuchten Wortes
| 204: | break;
| 205: |
| 206: | }
| 207: |
| 208: | abbruch = askAgain();
| 209: |
| 210: | } while (!abbruch);
| 211: |
| 212: | return 0;
| 213: | }
|
|
|
|
|
|
Hallo Mija,
> Hallo Mathepower,
>
> ich glaube, in deine Funktion war noch etwas fehlerhaft
> (ich habe das ganze mal auf dem Papier ausprobiert).
> Meintest du das vielleicht so:
>
> 1: | //Vergleich zwischen dem gesuchten Wort und dem
| 2: | > Zwischenergebnis
| 3: | > int vergleiche(char *wort, int wort_groesse, char
| 4: | > *antwort)
| 5: | > {
| 6: | > if ( wort_groesse == strlen(antwort) )
| 7: | > {
| 8: | > int i=0;
| 9: | > while ( (i < wort_groesse) && ( wort[i] == antwort[i]) )[/i][/i]
| 10: | > [i][i] i++;[/i][/i]
| 11: | > [i][i] if (i < wort_groesse)[/i][/i]
| 12: | > [i][i] return 0;[/i][/i]
| 13: | > [i][i] else[/i][/i]
| 14: | > [i][i] return 1;[/i][/i]
| 15: | > [i][i] }[/i][/i]
| 16: | > [i][i] else[/i][/i]
| 17: | > [i][i] return 0;[/i][/i]
| 18: | > [i][i] }[/i][/i]
| 19: | > [i][i] | [/i][/i]
>
Vor und nach dem i++ gehören noch geschweifte Klammern.
> Wenn ich mein Programm mit Dev-C++ kompliliere und
> ausführe, dann kommt die Warnung "the address of
> 'vergleiche' will always evaluate as 'true' " bzw mit
> Visual Studio "Ausdruck wird als Funktion ausgewertet, der
> eine Argumentliste fehlt". Die Warnungen kommen immer
> jeweils an den Stellen, wo ich meine Funktion 'vergleiche'
> aufrufe.
>
> Was mache ich noch falsch? Hast das jetzt irgendwas mit den
> Zeigern zu tun?
>
> Bei meinem zweiten Aufruf der Funktion 'vergleiche' in
> Zeile 193 geht noch immer etwas schief, denn man kann
> leider noch immer gewinnen, egal ob man das richtige Wort
> eingibt oder nicht.
>
> [code]#include <stdio.h>
> #include <string.h>
> #include <conio.h>
> #include <wchar.h>
> #include <windows.h>
> #include <time.h>
> #include <math.h>
> #define SCHWARZ 0
> #define GRAU 7
> #define MAX_GROESSE 50 //symbolische Konstante für Arrays
> 'wort' und 'antwort'
>
> //Funktionsdeklaration
> void farbe(int);
> int ersetze(char*,int,char*,char);
> int vergleiche(char*,int,char*);
> void clearBuffer();
> int askAgain();
>
>
> //Funktionsdefinitionen
>
> void farbe(int a)
> {
>
> SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
> }
>
> //richtiger Buchstabe an die richtige Stelle setzen
> int ersetze(char *wort, int wort_groesse, char *antwort,
> char c)
> {
> int i, versuch=0;
> for(i = 0; i < wort_groesse; i++)
> {
> if(wort == c)
> {
> antwort = c;
> versuch = 1;
> }
> }
> [mm] printf("%s\n",[/mm] antwort); //Zwischenergebnis wird
> ausgegeben (also z.B. -t-t--t-- )
> return versuch;
> }
>
> //Vergleich zwischen dem gesuchten Wort und dem
> Zwischenergebnis
> int vergleiche(char *wort, int wort_groesse, char
> *antwort)
> {
> if ( wort_groesse == strlen(antwort) )
> {
> int i=0;
> while ( (i < wort_groesse) && ( wort == antwort) )
> {
> i++;
> }
> if (i < wort_groesse)
> {
> return 0;
> }
> return 1;
> }
> return 0;
> }
>
> //Funktion Tastaturpuffer leeren
> void clearBuffer()
> {
> char Dummy;
> do
> {
> scanf("%c", &Dummy);
> } while (Dummy != [mm]'\n');[/mm]
>
> return;
> }
>
> //Funktion zur Frage, ob man abbrechen moechte
> int askAgain()
> {
> int abbruch=0;
> int auswahlGetroffen;
> char eingabe;
> do
> {
> [mm] printf("\n\nAbbruch?[/mm] J/N ");
> auswahlGetroffen = scanf("%c", &eingabe);
>
> if [mm](eingabe!='\n')[/mm]
> clearBuffer();
> if (!auswahlGetroffen)
> printf("Sie haben nicht J oder N [mm]eingegeben!\n");[/mm]
> else
> {
> switch(eingabe)
> {
> case 'j': abbruch = 1; break;
> case 'J': abbruch = 1; break;
> case 'n': abbruch = 0; break;
> case 'N': abbruch = 0; break;
> default: auswahlGetroffen = 0;
> }
> [mm] printf("\n\n\n");[/mm]
> }
> } while (!auswahlGetroffen);
> return abbruch;
> }
>
>
> //Main-Programm
> int main(int argc, CHAR* argv[])
> {
> //char *wort; //das eingegebene Wort von Spieler 1
>
> //const int MAX_GROESSE = 50;
> char wort[MAX_GROESSE];
> char antwort[MAX_GROESSE]; //das Zwischenergebnis
> int i, wort_groesse;
> int punkte = 0;
> char c, wahl='w', loesung; //c - Zeichen, dass gezeigt
> werden soll, wahl - Ww für weiter oder Ll für loesen,
> loesung - vermutete Loesung
> int versuch=0;
> //int ergebnis=0;
> //int wortl;
> int abbruch = 0;
>
> do
> {
>
> printf("Spieler 1: Überlegen Sie sich ein Wort und geben
> Sie es [mm]ein!\n");[/mm]
> fflush(stdin);
> farbe(SCHWARZ); //Farbe schwarz festlegen, damit Spieler
> 2 Wort nicht sieht
> scanf("%s", wort);
> clearBuffer();
> farbe(GRAU); //Farbe auf grau zuruecksetzen
>
>
> /*
> char *list[15]
> ={"Maschine","Dereferenzierungsoperator","Zeiger","Datentyp","Parameter",
> "Mittelwertsatz","Zwischenwertsatz",
> "Differentialgleichungen",
> "Datenbanken", "Statistik","Versicherungsmathematik",
> "Finanzmathematik", "Algorithmus",
> "Betriebswirtschaftslehre", "Volkswirtschaftslehre"};
> srand((unsigned int)time(NULL));
> wortl = rand() % 15;
> wort = list[wortl];
> */
>
>
> wort_groesse = strlen(wort);
>
> for(i = 0; i < wort_groesse; i++)
> {
> antwort = '-'; //die antwort (Zwischenergebnis) wird mit
> - gefüllt
> wort = towlower(wort); //das gesuchte Wort wird in
> Kleinbuchstaben umgewandelt
> }
>
> antwort = [mm]'\0';[/mm]
> [mm] printf("\n%s\n",[/mm] antwort); //das Wort wird als
> '---------' ausgegeben
>
>
> //Eingabe Spieler 2
>
> [mm] printf("\nSpieler[/mm] 2: Versuchen Sie das Wort zu erraten,
> indem Sie immer jeweils einen Buchstaben [mm]eingeben!\n");[/mm]
> printf("Falls Sie einen Buchstaben falsch geraten haben,
> bekommen Sie einen [mm]Strafpunkt.\n");[/mm]
> printf("Bei 10 Strafpunkten ist das Spiel beendet und
> gilt als [mm]verloren.\n");[/mm]
> printf("Nach jedem Rateversuch koennen Sie waehlen, ob
> Sie weiterraten moechten [mm]oder\n");[/mm]
> printf("versuchen, die richtige Loesung
> [mm]einzugeben.\n");[/mm]
>
> //ergebnis = vergleiche(wort, wort_groesse, antwort);
> while(!vergleiche) //Solange das zu findende Wort und
> das Zwischenergebnis nicht gleich sind
> {
> fflush(stdin); //Spieler 2 versucht das Wort zu
> erraten
> printf("Ihr Zeichen: ");
> scanf("%c", &c);
> clearBuffer();
> c = towlower(c); //der eingegebene Buchstabe wird in
> einen Kleinbuchstaben umgewandelt
>
> //eingegebener Buchstabe wird an die richtige Stelle
> gesetzt
> versuch = ersetze(wort, wort_groesse, antwort, c);
>
> //Ausgabe
>
> if(versuch == 0) //falsch geraten
> {
> printf("Sie haben einen Strafpunkt [mm]erhalten!\n\n");[/mm]
> punkte++;
> }
> printf("Strafpunkte: [mm]%d\n",punkte);[/mm]
>
> printf("Ww = weiter, Ll = loesen: "); //Wahl ob Wort
> loesen oder nicht
> scanf("%c", &wahl);
> clearBuffer();
>
> if (wahl=='l' || wahl=='L')
> {
> [mm] printf("\n\nIhre[/mm] Loesung: [mm]\n");[/mm]
> scanf("%c", &loesung);
> clearBuffer();
>
> if (vergleiche)
> printf("Gratulation! Sie haben es echt [mm]drauf!\n");[/mm]
> else
> printf("Leider nicht erraten. Versuchen Sie es noch
> [mm]einmal!\n");[/mm]
> }
>
> if (punkte == 10) //wenn die maximal zu erreichende
> Strafpunktzahl erreicht ist
> printf("Leider nicht erraten. Versuchen Sie es noch
> [mm]einmal!\n");[/mm]
>
> printf("Das Wort [mm]war:\n");[/mm]
> [mm] printf("\"%s\"\n\n\n",[/mm] wort); //Ausgabe des gesuchten
> Wortes
> break;
>
> }
>
> abbruch = askAgain();
>
> } while (!abbruch);
>
> return 0;
> }
> [/code]
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 19:41 So 13.01.2013 | Autor: | Mija |
Die Klammern kann man in dem Fall aber auch weglassen, weil die Anweisung ja nur aus einer Zeile besteht, oder?
Kann es sein, dass die Funktion 'vergleiche' bei mir nur die Adresse von vergleiche zurückgibt? (und deshalb immer den Wert true hat)
Wie kann ich es anstellen, dass mir die Funktion 1 oder 0 zurückgibt, genau so wie ich es als Funktion haben und weiterverwenden möchte?
Ich würde mich sehr freuen, wenn mir bitte jemand weiterhelfen könnte. Ich bin mit dem Thema Zeiger noch nicht so sehr vertraut bzw. verstehe es noch nicht so sehr.
|
|
|
|
|
Hallo Mija,
> Die Klammern kann man in dem Fall aber auch weglassen, weil
> die Anweisung ja nur aus einer Zeile besteht, oder?
>
Das mag für die if-Abfrage zutreffen.
Hier handelt es sich um eine Anweisung, die in einer Schleife wiederholt wird.
Daher sind hier Klammern um diese Anweisung zu setzen.
Wenn Du keine Klammern setzt, dann wird die Anweisung nur einmal ausgeführt.
Das liefert dann in der Mehrzahl der Fälle ein falsches Ergebnis.
> Kann es sein, dass die Funktion 'vergleiche' bei mir nur
> die Adresse von vergleiche zurückgibt? (und deshalb immer
> den Wert true hat)
Die Funktion gibt einen int zurück.
> Wie kann ich es anstellen, dass mir die Funktion 1 oder 0
> zurückgibt, genau so wie ich es als Funktion haben und
> weiterverwenden möchte?
>
Das ist doch bereits geschehen.
Die Funktion vergleiche gibt einen int zurück.
> Ich würde mich sehr freuen, wenn mir bitte jemand
> weiterhelfen könnte. Ich bin mit dem Thema Zeiger noch
> nicht so sehr vertraut bzw. verstehe es noch nicht so sehr.
Gruss
MathePower
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 23:00 So 13.01.2013 | Autor: | Mija |
Danke für die Hilfe, es funktioniert jetzt alles!! :)
|
|
|
|
|
Hallo!
Bist du dir da sicher?
1: | int main() {
| 2: |
| 3: | int i=1;
| 4: |
| 5: | if(i == 1)
| 6: | printf("i = 1\n");
| 7: |
| 8: | while(i++ < 10)
| 9: | printf("i = %d\n", i);
| 10: | return 0;
| 11: | }
|
Ausgabe:
i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 9
i = 10
(mit ner FOR-Schleife gehts natürlich auch)
Es scheint also zu funktionieren, aber vielleicht gibts da noch nen anderen Grund, warum du meinst, daß das nicht geht?
ALLERDINGS kann ich nur raten, IMMER Klammern zu setzen, auch, wenn es um nur eine Zeile geht. Ein beliebter Fehler ist, später weitere Zeilen hinzuzufügen, ohne die Klammern zu setzen. Alternativ ohne Zeilenumbruch:
if(i == 1) printf("i = [mm] 1\n");
[/mm]
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 10:20 Mi 16.01.2013 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|