Kommazahlen im StringGrid? (war: StringGrid)
-
Mein Problem liegt darin, dass ich eine Stundenzahl eingebe und diese
dann aufteilen soll, dazu muß ich noch Stunden die zuwendungsfähig sind
angeben, diese können auch in Prozent angegeben werden, danach wird das
ganze auf einen kompletten Monat verteilt.//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; //nichtzuwendungsfähige Stunden berechnen for(int i=0; i<StringGrid1->ColCount-1; i++) { AnsiString Feld = StringGrid1->Cells[i+1][3]; if( Feld == "XXX" ) continue; StringGrid1->Cells[i+1][3]= (StringGrid1->Cells[i+1][6].ToDouble())-(StringGrid1->Cells[i+1][2].ToDouble()); if(StringGrid1->Cells[i+1][3]<0) { berechnung(); } } }
und da weiß ich nicht, wie ich jetzt in dem StringGrid die Stunden
angebe, wenn ich beispielsweise auf 42,6 zuwendungsfähige Stunden komme!
-
Also hast du wohl das Problem, das du nicht weißt, wie du 42,6 Stunden als "42 Stunden und 36 Minuten" anzeigen lassen kannst.
Tip: Bedenke, das 1 Stunde 60 min hat. Also rechnest du einfach 42,6 * 60 machst eine Modulo Division. Der Rest, der übrigbleibt, liefert dir die Minuten zurück.
-
Ich möchte einfach nur zum Beispiel bei Montag 3.Juli 3,6 stehen haben und das soll es aus einer gesamtstundenanzahl ausrechnen und anzeigen!
-
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;