Aufgabe: Würfel-Statistik



  • Hallo,
    im Geocaching gibt es eine Aufgabe, die ich gern lösen möchte, aber als absoluter Anfänger habe ich keine Chance, weiter in die Tiefen dieses Rätsels zu kommen. Daher brauche ich eure Hilfe, um nachvollziehen zu können, wie ich vorgehen muss, das Rätsel zu lösen.
    Hier die Aufgabe:
    Der Cache liegt nicht an der oben genannten Koordinate!

    Ein Kollege von mir benötigte Nachhilfe zum Thema Fehlersuche beim Programmieren, also habe ich Ihm ein kleines Programm geschrieben, in das sich leider ein paar Fehler eingeschlichen hatten.
    Könnt Ihr helfen alle Fehler zu finden?

    Und hier findet ihr den Programmcode: http://www.mattwien.de/geocaching/code/fragen.php

    Wenn ihr alles Richtig gemacht habt dann sieht das Ergebnis ungefähr so aus:
    zu sehen in http://www.geocaching.com/seek/cache_details.aspx?wp=GC1RMRT&log=y
    Hier die fehlerhafte Programmierung:

    Die ersten 3 Zeilen habe ich lösen können, aber bei dem Rest konnte mir selbst google nicht helfen.
    Vielleicht hilt eine Schritt für Schritt Hilfe,
    z.B. was ist an "int wuerfel(){" falsch?
    ist das int selber schon falsch? erkennt das Programm überhaupt "wuerfel"? was hat es da mit den beiden Klammern () auf sich? Muss da was rein? und "{"?

    VG mash

    Editiert, um die google-suche etwas zu erschweren



  • Das hast du compiliert bekommen?
    Ist ziemlich viel Schrott dabei,
    - wo ist count in getCount definiert
    - return count in void Funktion
    - runden := getCount();
    ... weiter habe ich jetzt mal nicht geschaut.
    Ich als Compiler würde mich jedenfalls weigern.



  • Da sind mindestens 17 Fehler drin, die gefunden werden sollen. 3 davon hab ich nun gefunden (die ersten 3 Zeilen), aber bei dem Rest hab ich kein Anhaltspunkt.
    Klar hat google bei einigen Sachen was ausgegeben in der Suche, aber diese Varianten ausprobiert brachte absolut nix im Lösungsprogramm.



  • #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int wuerfel(){
      return rand() % 6 + 1;
    }
    
    int getCount(){ /* Funktion braucht Rückgabewert */
      char instring [80];
      /* i unnötig */
      int count; /* Variable deklarieren */
    
      do {
        /* gets ist pauschal ein Bug */
        fgets(instring, 80, stdin);
        count = atoi(instring);
      } while(count == 0); /* = ist Zuweisung */
    
      return count;
    }
    
    void printbar(int nr, int val, int wuerfe, int max){
      int len;
      int i; /* C ist case-sensitive */
      double prozentbalken, prozent;
    
      /* Casten, um Integer-Division zu vermeiden */
      prozentbalken = (double) val / max;
      prozent       = (double) val / wuerfe;
    
      len = prozentbalken * 50.0;
    
      printf ("%02i: ",nr);
    
      for(i = 0; i < len; ++i) { /* i + 1 verändert i nicht */
        putchar('*'); /* "*" ist ein String, kein Zeichen */
      }
    
      printf(" - %f%% \n", prozent * 100);
    }
    
    int main(void) {
      int runden;
      int i;
      int ergebnis[13] = { }; /* Statt Schleife */
      int maxwert = 0; /* Variable initialisieren*/
      int wurfsumme;
    
      srand((unsigned) time(NULL));
    
      printf("Bitte geben Sie die Anzahl der Würfe ein: ");
      runden = getCount();  /* := ist Pascal */
    
      for(i = 0; i < runden; ++i) { /* >= ergibt hier einfach keinen Sinn */
        wurfsumme = wuerfel() + wuerfel(); /* Funktion auch aufrufen! */
        ++ergebnis[wurfsumme];
    
        /* gecachtes Ergebnis verwenden */
        if (ergebnis[wurfsumme] > maxwert) {
          maxwert = ergebnis[wurfsumme];
        }
      }
    
      printf ("\nErgebnis:\n\n");
    
      for (i = 2; i <= 12; ++i){
        printbar(i, ergebnis[i], runden, maxwert);
      }
    
      return 0; /* return nicht vergessen! */
    }
    


  • seldon schrieb:

    #include <stdio.h> RICHTIG
    #include <stdlib.h> RICHTIG
    #include <time.h> RICHTIG
    
    int wuerfel(){
      return rand() % 6 + 1;
    }
    
    int getCount(){ /* Funktion braucht Rückgabewert */ RICHTIG
      char instring [80];
      /* i unnötig */
      int count; /* Variable deklarieren */ RICHTIG
    
      do {
        /* gets ist pauschal ein Bug */
        fgets(instring, 80, stdin);
        count = atoi(instring);
      } while(count == 0); /* = ist Zuweisung */ RICHTIG
    
      return count;
    }
    
    void printbar(int nr, int val, int wuerfe, int max){
      int len;
      int i; /* C ist case-sensitive */ 	RICHTIG
      double prozentbalken, prozent;
    
      /* Casten, um Integer-Division zu vermeiden */
      prozentbalken = (double) val / max;  	RICHTIG
      prozent       = (double) val / wuerfe; RICHTIG
    
      len = prozentbalken * 50.0;
    
      printf ("%02i: ",nr);
    
      for(i = 0; i < len; ++i) { /* i + 1 verändert i nicht */ RICHTIG
        putchar('*'); /* "*" ist ein String, kein Zeichen */ RICHTIG
      }
    
      printf(" - %f%% \n", prozent * 100);
    }
    
    int main(void) {
      int runden;
      int i;
      int ergebnis[13] = { }; /* Statt Schleife */
      int maxwert = 0; /* Variable initialisieren*/ RICHTIG
      int wurfsumme;
    
      srand((unsigned) time(NULL));
    
      printf("Bitte geben Sie die Anzahl der Würfe ein: ");
      runden = getCount();  /* := ist Pascal */ RICHTIG 
    
      for(i = 0; i < runden; ++i) { /* >= ergibt hier einfach keinen Sinn */
        wurfsumme = wuerfel() + wuerfel(); /* Funktion auch aufrufen! */ RICHTIG
        ++ergebnis[wurfsumme];
    
        /* gecachtes Ergebnis verwenden */
        if (ergebnis[wurfsumme] > maxwert) { RICHTIG
          maxwert = ergebnis[wurfsumme];
        }
      }
    
      printf ("\nErgebnis:\n\n");
    
      for (i = 2; i <= 12; ++i){
        printbar(i, ergebnis[i], runden, maxwert); RICHTIG
      }
    
      return 0; /* return nicht vergessen! */
    }
    

    Vielen vielen Dank seldon!!!
    Nun habe ich die einzelnen Schritte in http://www.mattwien.de/geocaching/code/fragen.php reinkopiert und habe nun 15/17 Fehlern richtig.
    Nun habe ich im geocaching-Forum selber gelesen, dass mehrere Wege zur richtigen Lösung führen können, was das ganze schwieriger macht.
    Das, was als Lösung richtig erkannt wurde, habe ich oben markiert. Nun fehlen noch 3 Fehler, wobei wie ich eben herausgefunden habe, ein Leerzeichen zu viel oder zu wenig, das auch schon als Fehler gilt, wobei ich keine Ahnung habe, was das für eine Bedeutung im Programm hat.



  • Ah, da geht's um zeilenweise Korrektur. Ich hatte jetzt Teile umgeschrieben, um es sauberer zu machen, aber gut.

    Gewollt ist

    #include <stdio.h>                                       /* <-- */
    #include <stdlib.h>                                      /* <-- */
    #include <time.h>                                        /* <-- */
    int wuerfel(){   
        return  (rand() %6)+1;   
    }   
    int getCount(){                                          /* <-- */
      char instring [80];   
      int count;                                             /* <-- */
      do{   
        gets(instring);   
        count = atoi(instring);   
      } while(count==0);                                     /* <-- */
      return count;   
    }   
    void printbar(int nr,int val, int wuerfe, int max){   
      int len;   
      int I;  int i;     /* <-- */
      double prozentbalken, prozent;   
      prozentbalken = (double) val / max;                    /* <-- */
      prozent = (double) val / wuerfe;                       /* <-- */
      len = prozentbalken * 50.0;   
      printf ("\n%02i: ",nr);   
      for (i=1;i<=len;i++){                                  /* <-- */
        putchar('*');                                        /* <-- */
      }   
      printf(" - %f%% ",prozent*100);   
    }   
    int main (){   
      int runden;   
      int i;   
      int ergebnis[13];   
      int maxwert = 0;                                       /* <-- */
      int wurfsumme;   
      srand( (unsigned)time( NULL ) );   
      printf ("Bitte geben Sie die Anzahl der Würfe ein: ");   
      runden = getCount();                                   /* <-- */
      for (i=1;i<=12;i++){   
        ergebnis[i]=0;   
      }   
      for (i=0;i<runden;i++){                                /* <-- */
      wurfsumme = wuerfel() + wuerfel() ;                    /* <-- */
        ergebnis[wurfsumme]++;   
        if (ergebnis[wurfsumme] > maxwert){                  /* <-- */
          maxwert = ergebnis[wurfsumme];   
        }   
      }   
      printf ("\nErgebnis:\n");   
      for (i=2;i<=12;i++){   
        printbar (i,ergebnis[i],runden,maxwert);             /* <-- */
      }   
    }
    

    Da fehlt für sauberes C zwar immer noch mindestens die Rückgabe aus main und der Ersatz von gets durch fgets, aber so frisst er das.



  • hast du das auch mit dem Link ausprobiert?
    Nun komme ich jetzt auf 16/17 Richtige. Einer fehlt noch. Du bist klasse!!
    Aber einen brauche ich noch... Entweder der richtige ist da und ich hab den noch nicht gefunden mit der richtigen Anzahl Leerstellen oder es muss noch andere Möglichkeiten geben, was da hin kommen kann.



  • Das wird vermutlich das hier sein:

    int I;  int i;     /* <-- */
    

    das muss natürlich einfach

    int i;
    

    sein - da hab ich beim Aufräumen nicht aufgepasst.



  • das "int i", was du meinst, hatte ich bereits als richtig markiert.
    es muss irgendwas anderes sein. hast du die sachen auch mal über den link ausprobiert?
    Immerhin brauchst sowohl du als auch das Programm nur 52 Zeilen.
    Ich glaub, ich geh jetzt schlafen. Ich gebs für heute Nacht auf.
    Schon ärgerlich, dass der eine Fehler, der noch fehlt, nicht auftaucht.
    Ich hab jetzt alle 16 vom Programm als richtig erkannten Änderungen markiert (einer fehlte ja vorhin noch)



  • Mir hat er das so abgekauft. Tipfeeler?



  • sorry, ich hatte übersehen, dass du "for (i=0;i<runden;i++){" noch extra markiert hattest. Nun hab ich endlich die Lösung.
    Du kannst den Cache finden... in einem Waldstück in Köln-Dellbrück
    Ähm, nun kann wahrscheinlich unser Forumgespräch über google gefunden werden.
    Daher werd ich die genauen Koordinaten des Cache nicht hier verraten.

    Kannst du mir noch verraten, was die ganzen Befehle zu bedeuten haben? teilweise hab ich die bei google gefunden, manche blieben trotzdem ein Rätsel, auch die versetzten Zeilenanfänge, haben die eine Bedeutung?

    Und vielleicht könnte dieser Thread mit Ausnahme dem folgenden wieder gelöscht werden. Google findet diesen hier bei Suchanfragen speziell für das geocaching gleich als allerersten Eintrag.


Anmelden zum Antworten