C: Zahlen einlesen, wenn Zeichen oder doppelt zurück

Schnelle objektorientierte, kompilierende Programmiersprache.
Lone
Beiträge: 26
Registriert: Do Sep 19, 2013 2:38 pm

Re: C: Zahlen einlesen, wenn Zeichen oder doppelt zurück

Beitrag von Lone » Di Okt 01, 2013 11:11 pm

for( unsigned int i=0; i<size; i++) ich muss bei mir das i vorher deklarieren sonst kann ich nicht kompilieren.
Aber ich benutze auch Visual Studio Express. Wahrscheinlich liegt das daran.

Das Programm erzeugt aber bei Eingabe von Zeichen eine Endlosschleife und du verwendest auch scanf.

Lone
Beiträge: 26
Registriert: Do Sep 19, 2013 2:38 pm

Re: C: Zahlen einlesen, wenn Zeichen oder doppelt zurück

Beitrag von Lone » Mi Okt 02, 2013 12:08 pm

Danke für den Tipp mit den Guards. SO ist das wesentlich übersichtlicher.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C: Zahlen einlesen, wenn Zeichen oder doppelt zurück

Beitrag von Xin » Mi Okt 02, 2013 12:25 pm

Lone hat geschrieben:for( unsigned int i=0; i<size; i++) ich muss bei mir das i vorher deklarieren sonst kann ich nicht kompilieren.
Aber ich benutze auch Visual Studio Express. Wahrscheinlich liegt das daran.
Das kommt auf die Version an... eigentlich sollte das jede Version können, die man als "Express" herunterladen kann. Mit Visual Studio 2005 ging's jedenfalls.
Lone hat geschrieben:Das Programm erzeugt aber bei Eingabe von Zeichen eine Endlosschleife und du verwendest auch scanf.
Das stimmt. Dein Programm erzeugt ein Segmentation Fault, wenn Du eine Zahl eingibst, die mehr als 20 Ziffern hat. ^^

Ich habe scanf weiter benutzt, weil ich Dein Programm nicht komplett auf den Kopf stellen wollte.
Hätte ich das Programm selbst geschrieben, hätte ich wohl die Programmparameter benutzt: Übergabeparameter.

Du benutzt das Tutorial auf dieser Seite nicht, oder?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Lone
Beiträge: 26
Registriert: Do Sep 19, 2013 2:38 pm

Re: C: Zahlen einlesen, wenn Zeichen oder doppelt zurück

Beitrag von Lone » Mi Okt 02, 2013 1:03 pm

Das kommt auf die Version an... eigentlich sollte das jede Version können, die man als "Express" herunterladen kann. Mit Visual Studio 2005 ging's jedenfalls.
Ich benutze Visual Studio Express 2012.
Weiß garnicht was der für einen Compiler benutzt. Ich habe zwar mal cygwin installiert aber da gab es nur Fehler. VS ist mir da angenehmer.
Das ist zwar nicht das VS Forum aber kann ich da einen anderen Compiler auswählen?
Hätte ich das Programm selbst geschrieben, hätte ich wohl die Programmparameter benutzt
Ich möchte solche Anwenungen ja so schreiben das sie dem Benutzer sagen was er zu tun hat. Wenn ich Parameter benutze entfällt doch die EIngabe die für den Anwender bestimmt ist, oder nicht ?

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C: Zahlen einlesen, wenn Zeichen oder doppelt zurück

Beitrag von Xin » Mi Okt 02, 2013 1:25 pm

Lone hat geschrieben:
Das kommt auf die Version an... eigentlich sollte das jede Version können, die man als "Express" herunterladen kann. Mit Visual Studio 2005 ging's jedenfalls.
Ich benutze Visual Studio Express 2012.
VC 2012 unterstützt die Notation garantiert. Ich benutze sie aktuell mit VC 2010, der das auch kann.
Lone hat geschrieben:Weiß garnicht was der für einen Compiler benutzt. Ich habe zwar mal cygwin installiert aber da gab es nur Fehler. VS ist mir da angenehmer.
Visual Studio nutzt in der Regel den Compiler mit dem Du die Express Version runtergeladen hast. Du wirst Visual C++ Express runtergeladen haben, also nutzt Du auch den Microsoft-Compiler.
Lone hat geschrieben:Das ist zwar nicht das VS Forum aber kann ich da einen anderen Compiler auswählen?
Keine Ahnung, ob die Expressversion das kann.
Grundsätzlich geht es wohl.
Lone hat geschrieben:
Hätte ich das Programm selbst geschrieben, hätte ich wohl die Programmparameter benutzt
Ich möchte solche Anwenungen ja so schreiben das sie dem Benutzer sagen was er zu tun hat. Wenn ich Parameter benutze entfällt doch die EIngabe die für den Anwender bestimmt ist, oder nicht ?
Richtig. Du würdest das Programm dann

Code: Alles auswählen

lotto 1 2 3 4 5 6
rufen. Du müsstest wissen, wie Du die Zahlen eingibst, dafür musst Du beim Testen nicht laufend die Zahlen eingeben.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Lone
Beiträge: 26
Registriert: Do Sep 19, 2013 2:38 pm

Re: C: Zahlen einlesen, wenn Zeichen oder doppelt zurück

Beitrag von Lone » Mi Okt 02, 2013 2:35 pm

VC 2012 unterstützt die Notation garantiert. Ich benutze sie aktuell mit VC 2010, der das auch kann.
Nope. Bei mir muss ich es wie gesagt anders schreiben ansonsten startet der Debugger nicht.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: C: Zahlen einlesen, wenn Zeichen oder doppelt zurück

Beitrag von cloidnerux » Mi Okt 02, 2013 8:20 pm

Nope. Bei mir muss ich es wie gesagt anders schreiben ansonsten startet der Debugger nicht.
Das liegt daran, dass deine Projekteinstellungen falsch sind und dein Compiler angewiesen wird irgendeinen uralten C-Standard zu nutzen.
Unter Projekt->Eigenschaften->Compiler müsste irgendwo was von C99 oder Ansi-C99 stehen und da muss dann was geändert werden, was weiß ich aber nicht genau, da ich gerade keinen Zugriff auf ein VS habe.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Lone
Beiträge: 26
Registriert: Do Sep 19, 2013 2:38 pm

Re: C: Zahlen einlesen, wenn Zeichen oder doppelt zurück

Beitrag von Lone » Do Okt 03, 2013 11:10 am

Das liegt daran, dass deine Projekteinstellungen falsch sind und dein Compiler angewiesen wird irgendeinen uralten C-Standard zu nutzen.
Unter Projekt->Eigenschaften->Compiler müsste irgendwo was von C99 oder Ansi-C99 stehen und da muss dann was geändert werden, was weiß ich aber nicht genau, da ich gerade keinen Zugriff auf ein VS habe.
Ich hab dort die möglichkeit zwischen c und c++ zu wechseln aber von c99 o.ä. steht da nichts und auch google hat mir nichts genaueres sagen können. Im Moment ist es auch nicht so schlimm.

Ich habe dem Programm noch ein paar Sachen hinzugefügt.
Zum Schluss wollte ich noch wissen wieviele Spiele es braucht bis ich mit denselben Zahlen gewinne.
Ich habe zur Sicherheit geprüft ob bei jedem neuen Durchlauf auch andere Zufallszahlen kommen. Trotzdem läuft es ohne Unterbrechung. Da bin ich mir jetzt nicht sicher ob es eine Endlosschleife ist oder wirklich so lange dauert :D

Code: Alles auswählen

#define TRUE 1
#define FALSE 0

/*  Function compares Arrays*/
void CompareArrays(int *str1,
				   int *str2)
{
}
/*  Function prints an array  */
void printArray(int *x)
{
   int j;

   printf("\n\n");
      for(j=0; j<6; j++)
         printf("  %2d",x[j]);
      printf("\n");
   }

/*  Function checks if the number was already entered  */
int valueAlreadyEntered(int *x, 
						int value, 
						unsigned int maxIndex) 
{
	unsigned int i;

    for (i = 0; i < maxIndex; i++)
        if (x[i] == value)
            return TRUE;

    return FALSE;
}

/*  Function creates 6 random numbers  */
void getWinningnumbers (int *y)
{
       int j,randvalue;

       //for(i=0; i<1; i++) { 
	   for(j=0; j<6; j++) {
	    while(1) {
         
			  randvalue = rand() % 49 + 1;
			  if(valueAlreadyEntered(y, randvalue, 6))
			  {
			  continue;
			  }
			  y[j] = randvalue;
			  break;
		  }
	   }
}

/*    Function sorts an Array   */
void ArraySort(int *x,
			   int size) 
{                             
   int i, temp, minIndex;                                     
   for(i=0; i<size-1; i++) {                                   
      minIndex = ArrayMinIndex(x, i, size);  
      if(i != minIndex) {                            
         temp = x[i];
         x[i] = x[minIndex];
         x[minIndex] = temp;
         }
   }
}

/*   Function gets minimum Index from an Array   */
int ArrayMinIndex(int *x, 
				  int start, 
				  int size) 
{
   int minIndex=start, i;
   for(i=start; i<size; i++) {
      if(x[i] < x[minIndex]) {
         minIndex = i;                 
      }
   }
   return minIndex;
}


/*     Function lets the User input 6 Numbers.   */
int getyournumbers(int *x)
{
    char buffer[20];
    char *ep;
	unsigned int value,i;
    
	for(i=0;i<6;i++) {
      
      while (1) {
         printf("\n %d. Zahl: ",i+1);
         scanf( "%s", buffer );             
         errno = 0;
         value = strtol( buffer, &ep, 10);
		 if( valueAlreadyEntered( x, value, i ))
		 {
		 printf( "Value allready exists! Please enter a different value." );
		 continue;
		 }
		 if ((errno != 0) || (*ep != '\0' ))  
		 {
		 printf( "Input was not a number!\n" );
		 continue;
		 }
	     if (value < 0 || value > 49) 
		 {
		 printf( "Input has to be a value between 1 and 49!\n" );
		 continue;
		 }
		 x[i] = value;
		 break;
		 }
	}
}

/*     Main program     */
int main (void) {
	int yournumbers[6];
	int winningnumbers[6];
	int n;
	
	unsigned long int Games=0;
	unsigned int seed = time(NULL);
    srand(seed);

	printf("\n\t\t\t Lotto");

	getyournumbers(&yournumbers[0]);
	ArraySort(&yournumbers[0],6);
	printf("\nYour Numbers are:");
	printArray(&yournumbers[0]);
	while(1) {
		getWinningnumbers(&winningnumbers[0]);
		ArraySort(&winningnumbers[0],6);
		printf("\nThe winning numbers are:");
		printArray(&winningnumbers[0]);

	
		n=memcmp ( yournumbers, winningnumbers, sizeof(yournumbers) );
		if(n != 0)
		{
			Games++;
			continue;
		}
		else
			break;
	}

	
	printf("\nIt took %i Games to win.",Games);
	printf("\n");


	printf("\n\nPress any key...");
	_getch();
	return 0;
}

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C: Zahlen einlesen, wenn Zeichen oder doppelt zurück

Beitrag von Xin » Do Okt 03, 2013 11:26 am

Lone hat geschrieben:Zum Schluss wollte ich noch wissen wieviele Spiele es braucht bis ich mit denselben Zahlen gewinne.
Statistisch gesehen 10'068'347'520 Versuche, wenn mich nicht alles täuscht. :-)
10 Milliarden Iterationen dauern auch auf einem modernen Rechner einen Moment.

Ich habe zur Sicherheit geprüft ob bei jedem neuen Durchlauf auch andere Zufallszahlen kommen. Trotzdem läuft es ohne Unterbrechung. Da bin ich mir jetzt nicht sicher ob es eine Endlosschleife ist oder wirklich so lange dauert :D

Mach doch einen Test. Programmiere eine zweite getWinningnumbers, die nicht Zufallszahlen zurück gibt, sondern 10 unterschiedliche Versionen von 6 Zahlen zurück gibt, aber eben nicht zufällig. Gibst Du eine dieser Zahlen ein, musst Du ja bald gewinnen. ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Lone
Beiträge: 26
Registriert: Do Sep 19, 2013 2:38 pm

Re: C: Zahlen einlesen, wenn Zeichen oder doppelt zurück

Beitrag von Lone » Do Okt 03, 2013 11:35 am

Werde ich mal versuchen.

Danke für die ganze Hilfe :)

MfG Lone

Antworten