Stunden auf mehrere Tage verteilen



  • 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??



  • Da ist noch ein Fehler drin. Falls "XXX" die Tage markiert, die keine Stunden erhalten sollen, muss in der ersten Schleife stehen:

    if( Feld != "XXX" ) ++tage;



  • Sonnenschein84 schrieb:

    Wie kann ich es nun noch hinbekommen, dass die Tage auf den gesamten Monat verteilt werden??

    weiß nicht so ganz, was du damit meinst. du wolltest doch offenbar alle felder in denen XXX vorkommt duch die Zufallsstunden ersetzen, und das macht doch der code von MFK
    also erklär mal das mit den tagen genauer

    wo die 90 herkommt können wir dir nicht sagen, wenn wir nicht deinen quellcode kennen



  • Es funktioniert jetzt. Es war der Fehler den MFK mir gerade gesagt hat. War auch gerade dabei die Tage zu testen und bin da auch immer darauf gestoßen, dass immer die Tage mit XXX gezählt wurden.

    Danke euch beiden!!!



  • würde es gehen wenn man in einzelne Felder Werte reinschreibt für die Anzahl der Stunde und den Rest dann trotzdem noch per Zufall auswählen kann???



  • ja, du musst einfach nur alle felder durchgehen und da wo zahlen drinstehen musst du dir die stunden in einer variable merken, da wo keine drinstehen, da zählst du deine tage-variable eins hoch. dann berechnest du die differenz der stunden die verteillt werden sollen mit der anzahl von stunden die du gezählt hast. die verteilung bleibt dann genauso. beim reinschreiben der zufallszahlen darfst du dann aber nur in felder schreiben die leer sind

    musst deinen code eigentlich nur geringfügig ändern



  • wie kann ich überprüfen ob da eine Zahl drin steht:

    StringGrid1->Cells[i+1][2]== ...

    Da weiß ich nicht recht weiter



  • du könntest den String parsen (zeichen für zeichen durchgehen) und mit "IsNumeric()" überprüfen, ob es ein Zeichen gibt, welches keiner zahl entspricht
    findest du solch ein zeichen, dann handelt es sich bei dem string um keine zahl
    könnte man schön als funktion schreiben

    eine andere möglichkeit wäre es, wenn du den string einfach in einen integer-wert wandelst und die exeption abfängst (try-catch-block)



  • 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;
        }
    
        int stunden;
        for (int i=0;i<StringGrid1->ColCount-1;i++)
        {
            if(StringGrid1->Cells[i+1][2]== "")
            {
               stunden = StringGrid1->Cells[i+1][2].ToIntDef(0);
            }
            else
            {
               tage+1;
            }
        }
        int zuwend_h1 = zuwend_h - stunden;
    
        // 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_h1; ++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 != "" ) continue;
          StringGrid1->Cells[i+1][2] = verteilung[tag++];
        }
        delete[] verteilung;
    

    Ich weiß auch trotz deiner guten Erklärung noch nicht wirklich wie ich den String überprüfe!! Kannst du mir vielleicht anhand meines Codes helfen????



  • ich hab dir doch den vorschlag mit IsNumeric() gegeben, die methode hast du ja garnicht verwendet

    mach's so:

    #include <IdGlobal.hpp>
    .
    .
    .
    bool isNumber(String s)
    { if(s.Length() == 0) return false;
      for(int i=1; i<=s.Length(); i++)
       if(!IsNumeric(s[i])) return false;
      return true;
    }
    

    die methode liefert dir zurück, ob es sich bei dem übergebenen string um eine zahl handelt oder nicht

    den rest solltest du jetzt aber alleine hinbekommen


Anmelden zum Antworten