Kommazahlen im StringGrid? (war: StringGrid)



  • Ich glaube (bin mir aber nicht 100% sicher) dass ich in folgender Funktion das so umändern muß, dass es keine int verteilung mehr ist, sondern eine double oder?

    //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)];
        } 
    
        //Verteilte Stunden im StringGrid ablegen
        int tag = 0;
        for(int i=0; i<StringGrid1->ColCount-1; ++i)
        {
           AnsiString Feld = StringGrid1->Cells[i+1][2];
           if((isNumber(Feld)==true)|| (Feld == "XXX")) continue;
           StringGrid1->Cells[i+1][2] = verteilung[tag++];
        }
        delete[] verteilung;
    

    wenn ja wie soll ich das anstellen?



  • ++verteilung[random(tage)];
    

    Incrementiert um 1 also wohl Integer.



  • und?



  • Ja was und ?
    Was soll dein Programm genau machen ?
    Wie sollen die Stunden verteilt werden (Bei gleichmäßig nur durch AnzahlTage teilen.) ?
    Oder sollen die Stunden zufällig auf Tage verteilt werden ?
    Was ist
    [/cpp]
    for(int i=0; i<zuwend_h; ++i)
    [cpp]



  • Die Stunden sollen zufällig auf die Tage des Monates verteilt werden!



  • Wenn die Gesamtstundenzahl eine vorgegebene Größe ist, dann
    zieh dir doch zufällige Stundenzahl im Bereich von minStundenzahl bis maxStundenzahl.
    Diese Zahlen ziehst du solange von Gesamtstundenzahl ab bis ein Rest <= minStundenZahl erreicht ist.

    Ansonsten wenn Gesamtstundenzahl sich aus zufälligen Stundenzahlen ergeben soll einfach so viel zufällige Stundenzahlen erzeugen wie der Monat Tage hat.



  • Aber es hat doch bisher mit oben angegebenen Quellcode auch funktioniert, nur eben nicht, wenn eine Kommazahl herauskam, dann berechnet er mehr Stunden. Zum beispiel bei 13,2 Stunden verteilt er 14 h!



  • Wie gesagt:

    ++verteilung[random(tage)];
    

    ist incrementierung von Integer 1,2,3,4,5...13,14
    da kann also niemals ein 13,2 vorkommen.



  • und wie könnte ich diese Funktion abändern, dass das funktioniert?



  • Statt

    x++;
    

    einfach

    x = x + 1;
    

    verwenden.



  • So wirklich weiß ich jetzt nicht was ich damit anfangen soll!



  • Sonnenschein84 schrieb:

    Aber es hat doch bisher mit oben angegebenen Quellcode auch funktioniert, nur eben nicht, wenn eine Kommazahl herauskam, dann berechnet er mehr Stunden. Zum beispiel bei 13,2 Stunden verteilt er 14 h!

    So wie ich es verstehe, willst Du eine Zahl (Stundenanzahl dividiert durch Anzahl der Monatstage) zufällig auf die einzelnen Tage des jeweiligen Monats aufteilen (ungleichmäßig, d. h. als Beispiel mal ein Tag kann auch Null Stunden haben:
    http://www.c-plusplus.net/forum/viewtopic.php?t=54453).
    Bisher hat es mit Integerzahlen funktioniert, mit Floats aber nicht. Dein Problem liegt jetzt also an die Nachkommazahl.

    Wenn ich das richtig verstanden habe, dann: Prüfe am Anfang, ob die Stundenzahl Nachkommazahl hat oder nicht, wenn nicht dann machst Du wie bisher, wenn ja, dann extrahierst Du die Vorkommazahl und machst damit auch wie bisher. die Nachkommazahl addierst Du dann einfach "zufällig" zu irgendeinem Tag. (die Verteilung ist ja ungleichmäßig, deshalb spielt es keine Rolle, zu welchem Tag Du diese Nachkommazahl addierst)

    Dein Beispiel: 13,2
    die 13 nehmen und verteilen. Dann die 0,2 zu irgendeinem Tag addieren.

    Ansonsten gibt es noch die andere Variante mit Umwandlung der Stunden in Minuten und dann umgekehrt.

    Ich hoffe, ich habe da kein "Müll" geschrieben.
    xy



  • Also ich finde du hast erstmal mein Problem verstanden. Ich hab auch verstanden wie du das meinst, nur weiß ich nicht wie ich etwas überprüfe ob es eine Nachkommastelle hat!



  • Du prüfst, ob die Zahl überhaupt ein Komma hat, indem Du die Position ermittelst.

    if (FloatToStr(f).Pos(",") > 0)
        ShowMessage("ja");
      else
        ShowMessage("nein");
    

    wobei f die Zahl ist.
    Vielleicht geht es auch anders (eleganter).
    xy



  • Es geht ja nicht drum wie elegant es ist. Bin dir auf jeden Fall total dankbar. Allerdings hab ich jetzt noch das Problem, wie ich Nachkommastelle und das davor ermittel!
    Nachkomma vielleicht so?

    double nachkomma = FloatToStr(zuwend_h).Pos(",");
    


  • int iVor = StrToInt(FloatToStr(f).SubString(1, FloatToStr(f).Pos(',') - 1));
    ShowMessage(iVor);
    int iNach = StrToInt(FloatToStr(f).SubString(FloatToStr(f).Pos(',') + 1, FloatToStr(f).Length()));
    ShowMessage(iNach);
    

    Probiere es damit aus. (ungetestet)
    xy



  • if(int(f)-f) ShowMessage("ja");
    else ShowMessage("nein");
    

    Dein Beispiel: 13,2
    die 13 nehmen und verteilen. Dann die 0,2 zu irgendeinem Tag addieren.

    Die Verteilung der Gesamtstunden ist so allerdings ziemlich unausgewogen.(Jeweils immer nur an einem Tag wird ne angebrochene Stunde dazugezählt.)
    Zähl doch einfach in kleinerern Schritten 0,1 (nicht Integer)

    float *verteilung = new float[tage];
    
    verteilung[random(tage)]+=.1;
    


  • und nicht vergessen.

    zuwend_h*10
    


  • Sonnenschein84 schrieb:

    Allerdings hab ich jetzt noch das Problem, wie ich Nachkommastelle und das davor ermittel!

    Hab gegoogelt und folgendes gefunden:

    int integer = int(f); //Vorkommazahl
      ShowMessage(integer);
      float decimal = f - int(f); //Nachkommazahl (mit 0,)
      ShowMessage(decimal);
    

    Sieht klasse aus. Und das von franko ist auch Klasse! (zum Prüfen, ob eine Zahl Nachkommazahl hat oder nicht)

    franko schrieb:

    if(int(f)-f) ShowMessage("ja");
    else ShowMessage("nein");
    

    Ich hoffe, Du kannst damit was anfangen.
    xy



  • Ihr seit ganz klasse. Ich bin euch total dankbar. Ich bin total im Streß und soll das jetzt fix runter programmieren bzw. eben nur das Problem da heraus nehmen. Ich füge das dann morgen ein. Falls ich noch ein Problem habe, wäre ich froh wenn ich auf euch zurück greifen könnte. Ich möchte euch aber nochmal ganz sehr danken. Ihr habt mir echt geholfen!


Anmelden zum Antworten