Stunden auf mehrere Tage verteilen
-
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 setztWas 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 genauerwo 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