Stunden auf mehrere Tage verteilen
-
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
-
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 schreibeneine 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
-
Die Include-Datei kann ich nicht einbinden und isNumber gibts bei BCB 3 laut Hilfe noch nicht, deswegen konnte ich das nicht einbinden!!
-
bool isNumber(String s) { Set <char, '0', '9'> number; number << '0' << '1' << '2' << '3' << '4' << '5' << '6' << '7' << '8' << '9'; if(s.Length() == 0) return false; for(int i=1; i<=s.Length(); i++) if(!number.Contains(s[i])) return false; return true; }
-
Ich kann die Funktion isNumber nicht einbinden!!!
-
und warum nicht????
falls er meckert, dass er die funktion nicht kennt, dann solltest du sie im quelltext über die methode, die als erstes diese funktion aufruft plazieren
-
hab ich gemacht, aber ich kann schon die Include-Datei nicht einbinden und laut Hilfe gibt es die Funktion im BCB3 auch nicht
-
ich hab doch die funktion umgeschrieben, sodass du die include-datei und IsNumeric nicht mehr brauchst!!!
du solltest dir wenigstens die mühe machen und dir mal den code anschauen den dir andere leute zu füßen legen, da wäre dir dass aufgefallen
-
ZUfällig ist mir das aufgefallen, trotzdem hat er immer den Code angemeckert, jetzt hab ich den Code in die HeaderDatei geschrieben und nun funktioniert das.
Wie kann ich eine Variable übergeben, wenn ich das habe:int stunden; for (int i=0;i<StringGrid1->ColCount-1;i++) { if(isNumber(StringGrid1->Cells[i+1][2])==true) { stunden = StringGrid1->Cells[i+1][2].ToIntDef(0); }
Und ich will stunden jetzt außerhalb der funktion benutzen??
-
Sonnenschein84 schrieb:
Und ich will stunden jetzt außerhalb der funktion benutzen??
Du hast die Variable in der Funktion definiert und du willst sie außerhalb der Funktion benutzen. Habe ich dich richtig verstanden?
Die Variable stunden ist nur innerhalb dieser Funktion bekannt.
Du mußt die Variable in der Header-Datei deklarieren (Stichwort: globale Variable)
-
Ja du hattest Recht.
Trotzdem komme ich nicht voran, denn irgendwie rechnet das teil immernoch falsch.
Kann mir nochmal jemand helfen?//Zuwendungsfähige Stunden 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; if(isNumber(StringGrid1->Cells[i+1][2])==true) { stunden = StringGrid1->Cells[i+1][2].ToInt(); } else { tage++; //tage=tage+1; } } //zuwend_h = 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_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] = verteilung[tag++]; } delete[] verteilung;