Stunden auf mehrere Tage verteilen



  • Mein letztes Problem und zwar:

    Ich kriege eine Zahl geliefert und soll diese Zahl auf mehrere Zellen in meinem StringGrid verteilen. Nur weiß ich noch nicht so recht wie, also z.Bsp. 20 Stunden auf 10 Tage verteilt, so dass meinetwegen beim 1.Tag 2 Stunden stehen und so, aber das muß dann irgendwie per Zufall geschehen. Kann mir da vielleicht nochmal jemand helfen, dass wäre super lieb!!???



  • wie soll man das mit "irgendwie per zufall" verstehen?
    um bei dem beispiel zu bleiben, soll dann jeder der 10 tage mind. eine stunde bekommen oder wie soll man die verteilung verstehen?



  • es kann auch ein Tag 0 Stunden haben, also die Verteilung soll rein zufällig sein. Es müssen nur diese Stunden auf die Arbeitstage verteilt werden!!! Ich schick mal den Anfang von dem mit, wie ich mir das denke:

    Edit4->Text; //Zuwendungsfähige Stunden verteilen auf StringGrid1->Cells[i+1][2]
      (Edit5->Text)-(Edit4->Text); //Nichtzuwendungsf. Stunden verteilen auf StringGrid1->Cells[i+1][3]
       for(int i=0; i<StringGrid1->ColCount-1; i++)
       StringGrid1->Cells[i+1][6]= (StringGrid1->Cells[i+1][2])+(StringGrid1->Cells[i+1][3]);
    


  • Die Funktion Random (engl. Zufall) kennst du?

    -junix



  • nur wie wende ich das hierauf an, hab das heute morgen mal versucht, doch das hat nicht funktioniert!!!

    Also vielleicht kannst du mir ja sagen, wie ich das dann machen soll!??



  • Erinnerst du dich noch an das was ich in einem anderen Thread über die Vorgehensweise bei der Lösung solcher probleme gesagt habe?

    Spiele den Ablauf mal in deinem Kopf durch und merk dir die einzelnen Schritte. Hier ein Beispiel:

    Ich hab 45 Stunden, die muss ich auf 10 Tage verteilen, nach einem zufälligen Schema.
    Ich stelle mir folgende Frage: Wie würde _ich_ an Stelle des Programms diese Aufgabe meistern?

    Das ergibt dann z.B. Pseudo Code in dieser Art: (hier jetzt für eine lineare Verteilung)

    Pseudocode:
    rechne ich aus, wieviele Stunden pro tag ich einsetzen muss
    Während noch Stunden übrig sind
        Trage für einen Tag die oben errechnete Stundenzahl ein
        ziehe die oben errechnete Stundenzahl vom Stunden"stapel" ab
    

    Nun muss man das nur noch in Code umsetzen in C(++)... Hier kannst du ähnlich vorgehen. An dem Punkt an dem du zufällig entscheidest beziehst du einen von Random gelieferten Wert in die Rechnung der Stunden für diesen Tag mit ein.

    Wie du Random verwendest, dürfte anhand des Beispiels in der Hilfe (soweit mir war gabs da eins) klar werden.

    -junix



  • Für eine gleichmäßigere Verteilung, gerade zum Ende hin, könnte man auch so vorgehen:

    Für jede zu verteilende Stunde ermittelt man per Zufall einen Tag, und addiert sie dort dazu.



  • 1. Das Beispiel in der Hilfe habe ich mir bereits angeschaut und auch schon ausprobiert, allerdings kam kein vernünftiges Ergebnis heraus.

    2. Meine Programmierkenntnisse sind nicht so super wie deine, also wäre es nett wenn ich auch mal einen Tipp bekommen könnte, mit dem ich was mehr anfangen kann. Immerhin denke ich habe ich mir schonmal einen Kopf gemacht, weil ein Stück Quellcode ist ja schon vorhanden (siehe weiter oben), und mich interessiert nur die Verteilung!!!



  • Mittlerweile funktioniert diese Funktion:

    int zuwend_h = Edit4->Text.ToIntDef(0); //Zuwendungsfähige Stunden verteilen auf StringGrid1->Cells[i+1][2]
       for(int i=0; i<StringGrid1->ColCount-1; i++)
       {
         AnsiString Feld = StringGrid1->Cells[i+1][2];
         if( Feld == "XXX" )  continue;
         int zufall = random(10);
         StringGrid1->Cells[i+1][2] = zufall;
       }
    

    Doch mein Problem ist jetzt, dass er mehr Stunden anzeigt, als in zuwend_h drin stehen!! Wie kann ich das hinbekommen, dass er nur soviele Stunden verteilt, wie in diesen zuwend_h Stunden stehen???



  • Sonnenschein84 schrieb:

    Wie kann ich das hinbekommen, dass er nur soviele Stunden verteilt, wie in diesen zuwend_h Stunden stehen???

    Habe ich doch schon geschrieben:

    Ermittle nicht für jeden Tag zufällig die Stundenzahl, sondern für jede Stunde zufällig den Tag.



  • Und wie soll ich das machen???



  • Der Geschwindigkeit deiner Antwort nach hast du es nicht einmal selbst versucht 🙄

    Na gut...

    int zuwend_h = Edit4->Text.ToIntDef(0); //Zuwendungsfähige Stunden
    
    // Tage zählen
    int tage = 0;
    for(int i=0; i<StringGrid1->ColCount-1; ++i) 
    { 
       AnsiString Feld = StringGrid1->Cells[i+1][2]; 
       if( Feld == "XXX" )  ++tage; 
    }
    
    // Stunden auf Tage verteilen
    int* verteilung = new int[tage];
    memset(verteilung, 0, sizeof int * tage);
    
    for(int i=0; i<zuwend_h; ++i)
    {
       ++verteilung[random(tage)];
    }
    
    // Verteilte Stunden im Grid ablegen
    int tag = 0;
    for(int i=0; i<StringGrid1->ColCount-1; ++i) 
    { 
       AnsiString Feld = StringGrid1->Cells[i+1][2]; 
       if( Feld == "XXX" ) continue; 
       StringGrid1->Cells[i+1][2] = veteilung[tag++]; 
    }
    
    delete[] verteilung;
    

    Ungetestet, da kein BCB.



  • Erstmal danke. Ich habe bereits das ganze Wochenende versucht irgendwie dieses Programm zum laufen zu bekommen, doch ich habe zu Hause keine Möglichkeit hierher zukommen. Also mußte ich mich erst heute hierher wenden.

    Zweitens ich wäre nie auf die Funktion memset gekommen, weil ich nicht wußte das es sowas gibt.

    Drittens, irgendwas geht trotzdem noch nicht, denn bei der Funktion memset zeigt es mir jetzt Fehler an, hab schon in der Hilfe nachgeschaut und die fehlenden Dinge in meine Headerdatei eingebunden, doch er weigert sich immer noch. Er bringt den Fehler: Expression syntax bei sizeof int *tage!!! Wenn ich die Zeile auskommentiere läuft das Programm zeigt mir jedoch alle Stunden am Anfang des Monats an!!!



  • Schreib mal:

    sizeof(int) * tage

    Auf so etwas wie memset brauchst du nicht zu "kommen", du hättest die ints auch einfach in einer Schleife auf Null setzen können.



  • Es schreibt mir jetzt die Tage trotzdem immernoch alle an den Anfang des Monats und bevor er dann mit 0 auffüllt schreibt er mir eine 90, wo ich auch nicht weiß wo diese herkommt!!!



  • MFK schrieb:

    Auf so etwas wie memset brauchst du nicht zu "kommen", du hättest die ints auch einfach in einer Schleife auf Null setzen können.

    Wie meinst du das mit den ints auf Null setzen in einer schleife??



  • // Stunden auf Tage verteilen
    
    int *verteilung = new int[tage];
    
    for(int i=0; i<tage; ++i)
    {
        verteilung[i] = 0;
    }
    
    for(int i=0; i<zuwend_h; ++i)
    {
        ++verteilung[random(tage)];
    }
    


  • Jester2000 schrieb:

    @MFK
    Wozu benutzt du denn überhaupt memset, es reicht doch, wenn du das feld mit new initialisierst und alle werte am anfabg auf 0 setzt

    Was meinst du mit "reicht doch"?
    Hältst du memset für aufwändiger als die Schleife?



  • sorry, hab keine ahnung was memset macht (mitlerweile kann ich es mir aber denken)
    habs bis jetzt halt immer mit ner schleife gemacht
    tja, man lernt halt nie aus



  • Erstmal danke euch beiden!!

    Das Problem besteht aber nun immernoch darin, dass es alles an den Anfang des Monats schreibt und mir dann bevor es mit 0 auffült eine 90 schreibt. Ich weiß nicht wo die herkommen soll. Wie kann ich es nun noch hinbekommen, dass die Tage auf den gesamten Monat verteilt werden??


Anmelden zum Antworten