www.vorkurse.de
Ein Projekt von vorhilfe.de
Die Online-Kurse der Vorhilfe

E-Learning leicht gemacht.
Hallo Gast!einloggen | registrieren ]
Startseite · Mitglieder · Teams · Forum · Wissen · Kurse · Impressum
Forenbaum
^ Forenbaum
Status Mathe-Vorkurse
  Status Organisatorisches
  Status Schule
    Status Wiederholung Algebra
    Status Einführung Analysis
    Status Einführung Analytisc
    Status VK 21: Mathematik 6.
    Status VK 37: Kurvendiskussionen
    Status VK Abivorbereitungen
  Status Universität
    Status Lerngruppe LinAlg
    Status VK 13 Analysis I FH
    Status Algebra 2006
    Status VK 22: Algebra 2007
    Status GruMiHH 06
    Status VK 58: Algebra 1
    Status VK 59: Lineare Algebra
    Status VK 60: Analysis
    Status Wahrscheinlichkeitst

Gezeigt werden alle Foren bis zur Tiefe 2

Navigation
 Startseite...
 Neuerdings beta neu
 Forum...
 vorwissen...
 vorkurse...
 Werkzeuge...
 Nachhilfevermittlung beta...
 Online-Spiele beta
 Suchen
 Verein...
 Impressum
Das Projekt
Server und Internetanbindung werden durch Spenden finanziert.
Organisiert wird das Projekt von unserem Koordinatorenteam.
Hunderte Mitglieder helfen ehrenamtlich in unseren moderierten Foren.
Anbieter der Seite ist der gemeinnützige Verein "Vorhilfe.de e.V.".
Partnerseiten
Weitere Fächer:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
Forum "C/C++" - Hangman
Hangman < C/C++ < Programmiersprachen < Praxis < Informatik < Vorhilfe
Ansicht: [ geschachtelt ] | ^ Forum "C/C++"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien

Hangman: Korrektur, Hilfe, Tipp, Idee
Status: (Frage) beantwortet Status 
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: }


        
Bezug
Hangman: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
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?)

Bezug
        
Bezug
Hangman: Antwort
Status: (Antwort) fertig Status 
Datum: 15:22 So 13.01.2013
Autor: MathePower

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

Bezug
                
Bezug
Hangman: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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: }


Bezug
                        
Bezug
Hangman: Antwort
Status: (Antwort) fertig Status 
Datum: 17:05 So 13.01.2013
Autor: MathePower

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

Bezug
                                
Bezug
Hangman: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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: }


Bezug
                                        
Bezug
Hangman: Antwort
Status: (Antwort) fertig Status 
Datum: 18:14 So 13.01.2013
Autor: MathePower

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

Bezug
                                                
Bezug
Hangman: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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.

Bezug
                                                        
Bezug
Hangman: Antwort
Status: (Antwort) fertig Status 
Datum: 19:56 So 13.01.2013
Autor: MathePower

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

Bezug
                                                                
Bezug
Hangman: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 23:00 So 13.01.2013
Autor: Mija

Danke für die Hilfe, es funktioniert jetzt alles!! :)

Bezug
                                                                
Bezug
Hangman: Sicher?
Status: (Frage) überfällig Status 
Datum: 09:42 Mo 14.01.2013
Autor: Event_Horizon

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]

Bezug
                                                                        
Bezug
Hangman: Fälligkeit abgelaufen
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 10:20 Mi 16.01.2013
Autor: matux

$MATUXTEXT(ueberfaellige_frage)
Bezug
Ansicht: [ geschachtelt ] | ^ Forum "C/C++"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien


^ Seitenanfang ^
www.vorkurse.de
[ Startseite | Mitglieder | Teams | Forum | Wissen | Kurse | Impressum ]