C unterprogramm tut nicht seinen Dienst

Aljoscha.E

Ensign
Registriert
Juli 2005
Beiträge
219
Hallo!
Ich habe ein Problem mit einem C-Programm.
Ich habe in der Schule seit Schulanfang IT-Unterricht und wir lernen dort "C". Bis jetzt haben wir gelernt:
-Ein-Ausgabe, Do-Schleifen, IF-Verzweigungen, Switch, Funktionen(mit und ohne Rückgabe), Zufallsgeneratoren,... mehr fällt mir gerade nicht ein, vielleicht kommt noch was dazu ;)

Ich habe nun das Problem, dass wenn meiner Meinung nach eine richtige Eingabe gegeben wird, das Unterpgramm diese aber ignoriert und auf die Falschheit der Eingabe besteht.
Also das Problem liegt meiner Meinung nach eindeutig im Unterprogramm ("janein()").

Ich hoffe ich habe euch das Problem genau genug beschreiben wenn nicht einfach fragen. Das ist das erste mal das ich eine C-Programm Schwierigkeit schriftlich formuliere.

Code:
#include <stdio.h>    // Eta82 25.01.2009 Aljoscha E. (eta =Elektrotechnischer Assistent)
#include <time.h>
#include <stdlib.h>
/***************************************************************************************
 Zufallszahlenratespiel: 
 Vom Benutzer wird ein Bereich definiert, in dem eine Zufallszahl generiert wird.
 dieser Bereich ist von "1" bis zu der eingegebenen Zahl. 
 Nun soll man 3 Rateversuche haben, um die Zufallszahl zu finden.
 Nach erraten oder nicht erraten dieser Zahl soll mit der Eingabe von "j" das 
 Programm wiederholt werden können und bei "n" beendet werden. Desweiteren 
 soll bei Eingabe von ungültigen Zahlen die "Eingabeaufforderung" mit einer Fehler-
 meldung wiederholt werden. (im Unterprogramm "janein")
 ***************************************************************************************/



main()
{
 char janein();
 int eing, count, zufallszahl,tipp;
 char wiederh;
 do
 {
  printf("\nBitte geben Sie eine Zahl ein, bis zu der geraten werden soll.\n");
  scanf("%i",&eing);
  zufallszahl = rand()% eing +1; //Zufallszahl zischen 1 und dem Wert von "ing" erzeugen
   for(count=1; count <= 3; count=count+1)   //for(Initialisierung der Zählervariablen; Grenze der Zahl; Veränderung der Zahl beim Hochzählen)
   {
   printf("\nDies ist der %i. von 3 Rateversuchen." ,count);
   printf("\nGeben Sie Ihren Zahlentippzwischen 1 und %i ein.\n" ,eing);
   scanf("%i", &tipp);
   if(tipp==zufallszahl)
   {
    printf("\nDas war die richtige Zahl!\n");
    count=4;
   }
   else
   {
    if(count<3)
    {
    printf("\nDas war die falsche Zahl, probiers noch mal\n.");
    }
    else
    {
     printf("\nLeider habe Sie die Zufallszahl nicht erraten.");
    };
   };
  }; //For Ende, Rateversuchzähler
  wiederh = janein();

 }while(wiederh=='j');
  printf("\n Enter\t!");
  fflush(stdin);
  getchar();
}
//---------------------------------------------------------
char janein()
{
char jn='j';
do
{
  printf("\nMoechten Sie einen weiteren Rateduchgang? Dann Druecken Sie \"j\".\nWenn nicht dann druecken Sie \"n\" \n");
  fflush(stdin);
   scanf("%c",&jn);
    if((jn!='j') || (jn!='n'))
    {
    printf("Ungueltige Eingabe!");
    }
  }while((jn!='j') || (jn!='n'));
   return (jn);
}
 
Mach mal das char janein(); gleich nach Beginn des Hauptprogramms weg und stell es vor das main().

-> R@NGER war schneller...
 
Ich hoffe das war so richtig. Leider keine Besserung.


Code:
#include <stdio.h>    // Eta82 25.01.2009 Aljoscha E. (eta =Elektrotechnischer Assistent)
#include <time.h>
#include <stdlib.h>
/***************************************************************************************
 Zufallszahlenratespiel: 
 Vom Benutzer wird ein Bereich definiert, in dem eine Zufallszahl generiert wird.
 dieser Bereich ist von "1" bis zu der eingegebenen Zahl. 
 Nun soll man 3 Rateversuche haben, um die Zufallszahl zu finden.
 Nach erraten oder nicht erraten dieser Zahl soll mit der Eingabe von "j" das 
 Programm wiederholt werden können und bei "n" beendet werden. Desweiteren 
 soll bei Eingabe von ungültigen Zahlen die "Eingabeaufforderung" mit einer Fehler-
 meldung wiederholt werden. (im Unterprogramm "janein")
 ***************************************************************************************/

char janein()
{
char jn;
do
{
  printf("\nMoechten Sie einen weiteren Rateduchgang? Dann Druecken Sie \"j\".\nWenn nicht dann druecken Sie \"n\" \n");
  fflush(stdin);
   scanf("%c",&jn);
    if((jn!='j') || (jn!='n'))
    {
    printf("Ungueltige Eingabe!");
    }
  }while((jn!='j') || (jn!='n'));
   return (jn);
}
//------------------------------------------------------------------------------------------------
main()
{
 char janein();
 int eing, count, zufallszahl,tipp;
 char wiederh;
 do
 {
  printf("\nBitte geben Sie eine Zahl ein, bis zu der geraten werden soll.\n");
  scanf("%i",&eing);
  zufallszahl = rand()% eing +1; //Zufallszahl zischen 1 und dem Wert von "ing" erzeugen
   for(count=1; count <= 3; count=count+1)   //for(Initialisierung der Zählervariablen; Grenze der Zahl; Veränderung der Zahl beim Hochzählen)
   {
   printf("\nDies ist der %i. von 3 Rateversuchen." ,count);
   printf("\nGeben Sie Ihren Zahlentippzwischen 1 und %i ein.\n" ,eing);
   scanf("%i", &tipp);
   if(tipp==zufallszahl)
   {
    printf("\nDas war die richtige Zahl!\n");
    count=4;
   }
   else
   {
    if(count<3)
    {
    printf("\nDas war die falsche Zahl, probiers noch mal\n.");
    }
    else
    {
     printf("\nLeider habe Sie die Zufallszahl nicht erraten.");
    };
   };
  }; //For Ende, Rateversuchzähler
  wiederh = janein();

 }while(wiederh=='j');
  printf("\n Enter\t!");
  fflush(stdin);
  getchar();
}
 
so geht es auch aber dann musst du immer noch char janein(); aus der main entfernen
 
Leider ohne Erfolg.
(Soll ich immer das geänderte Programm mitschicken, oder das in dem Vorherigem Post ädern?)

Code:
#include <stdio.h>    // Eta82 25.01.2009 Aljoscha E. (eta =Elektrotechnischer Assistent)
#include <time.h>
#include <stdlib.h>
/***************************************************************************************
 Zufallszahlenratespiel: 
 Vom Benutzer wird ein Bereich definiert, in dem eine Zufallszahl generiert wird.
 dieser Bereich ist von "1" bis zu der eingegebenen Zahl. 
 Nun soll man 3 Rateversuche haben, um die Zufallszahl zu finden.
 Nach erraten oder nicht erraten dieser Zahl soll mit der Eingabe von "j" das 
 Programm wiederholt werden können und bei "n" beendet werden. Desweiteren 
 soll bei Eingabe von ungültigen Zahlen die "Eingabeaufforderung" mit einer Fehler-
 meldung wiederholt werden. (im Unterprogramm "janein")
 ***************************************************************************************/

char janein()
{
char jn;
do
{
  printf("\nMoechten Sie einen weiteren Rateduchgang? Dann Druecken Sie \"j\".\nWenn nicht dann druecken Sie \"n\" \n");
  fflush(stdin);
   scanf("%c",&jn);
    if((jn!='j') || (jn!='n'))
    {
    printf("Ungueltige Eingabe!");
    }
  }while((jn!='j') || (jn!='n'));
   return (jn);
}
//------------------------------------------------------------------------------------------------
main()
{
 int eing, count, zufallszahl,tipp;
 char wiederh;
 do
 {
  printf("\nBitte geben Sie eine Zahl ein, bis zu der geraten werden soll.\n");
  scanf("%i",&eing);
  zufallszahl = rand()% eing +1; //Zufallszahl zischen 1 und dem Wert von "ing" erzeugen
   for(count=1; count <= 3; count=count+1)   //for(Initialisierung der Zählervariablen; Grenze der Zahl; Veränderung der Zahl beim Hochzählen)
   {
   printf("\nDies ist der %i. von 3 Rateversuchen." ,count);
   printf("\nGeben Sie Ihren Zahlentippzwischen 1 und %i ein.\n" ,eing);
   scanf("%i", &tipp);
   if(tipp==zufallszahl)
   {
    printf("\nDas war die richtige Zahl!\n");
    count=4;
   }
   else
   {
    if(count<3)
    {
    printf("\nDas war die falsche Zahl, probiers noch mal\n.");
    }
    else
    {
     printf("\nLeider habe Sie die Zufallszahl nicht erraten.");
    };
   };
  }; //For Ende, Rateversuchzähler
  wiederh = janein();

 }while(wiederh=='j');
  printf("\n Enter\t!");
  fflush(stdin);
  getchar();
}
 
die fehlermeldungen wären nicht schlecht

int main(void) müsste es heißen und ein return 0; an das ende der main.
 
Also so wie ich die Sache sehe, funktioniert das Ja/Nein nicht.. der eingelesene Wert wird entweder nicht richtig verarbeitet, oder kommt gar nicht erst da an wo er hin soll.

edit: Endlosschleife hallo !... mach mal aus den "||" in der ja/nein-Funktion "&&".. dann löppts.
 
Zuletzt bearbeitet:
sonst könntest du auch noch J N (großgeschrieben abfragen) ist vlt. shift gedrückt ?

Am besten einfach in

printf ungültige eingabe, jn mit ausgeben, dan siehst du was ankommt.
also printf("ungültige Eingabe %c ", jn)

wenn er aus || && macht klappt es nicht, weil ja nicht beides wahr sein kann (jn = 'j' && jn = 'n') ???

Anmerkung: unter Linux muß fflush in getchar geändert werden.
 
Zuletzt bearbeitet:
Fehlermeldungen sind ja nicht vorhanden. An sich lässt sich das Programm problemlos starten. Also keine compeilermeldungen.

Ja habt recht, aus oder muss und werden :). Vielen dank, es geht. Aber das muss ich noch verstehen.

Edit: So ich glaube ich habs verstanden, wieso da && steht und nicht ||.

Ich danke nochmal allen für eure Hilfe!

Gruß Aljoscha E.

So hier nochmal der Fertige Code:
Code:
#include <stdio.h>    // Eta82 25.01.2009 Aljoscha E. (eta =Elektrotechnischer Assistent)
#include <time.h>
#include <stdlib.h>
/***************************************************************************************
 Zufallszahlenratespiel: 
 Vom Benutzer wird ein Bereich definiert, in dem eine Zufallszahl generiert wird.
 dieser Bereich ist von "1" bis zu der eingegebenen Zahl. 
 Nun soll man 3 Rateversuche haben, um die Zufallszahl zu finden.
 Nach erraten oder nicht erraten dieser Zahl soll mit der Eingabe von "j" das 
 Programm wiederholt werden können und bei "n" beendet werden. Desweiteren 
 soll bei Eingabe von ungültigen Zahlen die "Eingabeaufforderung" mit einer Fehler-
 meldung wiederholt werden. (im Unterprogramm "janein")
 ***************************************************************************************/

char janein()
{
char jn;
do
{
  printf("\nMoechten Sie einen weiteren Rateduchgang? Dann Druecken Sie \"j\".\nWenn nicht dann druecken Sie \"n\" \n");
  fflush(stdin);
   scanf("%c",&jn);
    if((jn!='j') && (jn!='n'))
    {
    printf("Ungueltige Eingabe!\nEingabe ist:%c\n", jn);
    }
  }while((jn!='j') && (jn!='n'));
   return (jn);
}
//------------------------------------------------------------------------------------------------
main()
{
 int eing, count, zufallszahl,tipp;
 char wiederh;
 do
 {
  printf("\nBitte geben Sie eine Zahl ein, bis zu der geraten werden soll.\n");
  scanf("%i",&eing);
  zufallszahl = rand()% eing +1; //Zufallszahl zischen 1 und dem Wert von "ing" erzeugen
   for(count=1; count <= 3; count=count+1)   //for(Initialisierung der Zählervariablen; Grenze der Zahl; Veränderung der Zahl beim Hochzählen)
   {
   printf("\nDies ist der %i. von 3 Rateversuchen." ,count);
   printf("\nGeben Sie Ihren Zahlentippzwischen 1 und %i ein.\n" ,eing);
   scanf("%i", &tipp);
   if(tipp==zufallszahl)
   {
    printf("\nDas war die richtige Zahl!\n");
    count=4;
   }
   else
   {
    if(count<3)
    {
    printf("\nDas war die falsche Zahl, probiers noch mal\n.");
    }
    else
    {
     printf("\nLeider habe Sie die Zufallszahl nicht erraten.");
    };
   };
  }; //For Ende, Rateversuchzähler
  wiederh = janein();

 }while(wiederh=='j');
  printf("\n Enter\t!");
  fflush(stdin);
  getchar();
}
 
Zuletzt bearbeitet:
Du kannst das überprüfen mit sowas in der Art
Code:
int error = 1;
do{
scanf("%i", &tipp);
if(tipp > '9' || tipp < '0') printf("Es sind nur Zahlen erlaubt. Bitte nochmal eingeben!");
else error = 0;
} while (error == 1);
 
Du könntest die Zahl mit fgets anstatt von scanf einlesen und den eingelesenen String mit strtol in eine Zahl umwandeln. So wird es uns zumindest "nahegelegt".

Die Funktionen gets, scanf, fscanf, atoi und atol dürfen nicht verwendet werden (Absturzsicherheit bei falschen Eingaben!).

So wie BerniG es vorschlägt funktioniert es natürlich auch und das wäre wohl auch die einfachere Variante. Allerdings ist das ganze dann auf einstellige Zahlen begrenzt.

EDIT:
Obwohl, funktioniert das so bei scanf überhaupt? Wenn man im Format-String eine Zahl angibt, muss glaube ich auch eine kommen. Dann müsstest du wohl stattdessen mit %c einen Character einlesen. (Hab allerdings noch nie %i gesehen, haben bisher immer %d verwendet, ich nehme mal an, das steht für Integer und entspricht somit auch %d.)
 
Zuletzt bearbeitet:
Achso stimmt....bei mir gehts nur von 0-9 weil ich erst dachte, dass tipp eh nur ein char ist ;) BTW: Nimmt man für Zahlen nicht "%d" normalerweise her?
Die Sache bzgl. Absturzsicherheit bezieht sich aber wohl eher auf Strings. scanf mit einem einzelnen Char oder einer Zahl sind eigtl. nicht für BufferOverflows anfällig...man sollte evtl. noch die Rückgabe auf false überprüfen.
Sprich:
Code:
int error = 1;
do{
 if(scanf("%d", &tipp)){
  if(tipp > eing || tipp < 0) printf("Die Zufallszahl liegt nicht im korrekten Bereich! Bitte nochmal eingeben!");
  else error = 0;
 } else printf("Es sind nur Dezimalzahlen erlaubt. Bitte nochmal eingeben!");
} while (error == 1);
 
Zuletzt bearbeitet:

Ähnliche Themen

Zurück
Oben