Stunden auf mehrere Tage verteilen
-
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;
-
ich hab dir im quelltext ein paar hinweise rangeschrieben
//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; // wieso zählst du hier die tage hoch?? // ich denk du willst nur die tage in den leeren feldern zählen if(isNumber(StringGrid1->Cells[i+1][2])==true) // Wieso benutzt du hier nicht deine Variable Feld // wäre doch gleich viel übersichtlicher { stunden = StringGrid1->Cells[i+1][2].ToInt(); // hier genauso // und du willst doch die gesamtstundenzahl haben, // überschreibst "stunden" aber immer wieder // du solltest "stunden" hier hochzälen lassen } else { tage++; //tage=tage+1; } } //zuwend_h = zuwend_h - stunden; // das kann ruhig wieder rein // tip: kürzere schreibweise wäre "zuwend_h -= stunden"; // und was ist eigentlich wenn stunden > zuwend_h??? //Stunden auf Tage verteilen . . . // der Rest ist OK
-
Danke hab das jetzt so umgeschrieben:
//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(Feld)==true) { stunden = Feld.ToInt(); stunden1 += stunden; Edit7->Text= stunden1; } else { tage++; } } zuwend_h = zuwend_h - stunden1; Edit8->Text=zuwend_h; Edit9->Text=tage; //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((isNumber(StringGrid1->Cells[i+1][2])==true)|| (Feld == "XXX")) continue; StringGrid1->Cells[i+1][2] = verteilung[tag++]; } delete[] verteilung;
Doch jetzt ist noch das Problem wenn ich meine Stundenzahl ändere, dann rechnet er wieder falsch. Wie könnte ich das in einer Schleife machen, so dass er bei Änderung der Stundenanzahl zuwend_h wieder richtig rechnet??
-
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]; // diese Zeile raus if( (Feld != "XXX") ) //++tage; // die auch raus if(isNumber(Feld)==true) { stunden = Feld.ToInt(); stunden1 += stunden; // wozu ein stunden1 (schmeiß stunden1 raus) // warum nicht einfach "stunden += Feld.ToInt();" // und nicht vergessen stunden vor der Schleife auf 0 zu setzen Edit7->Text= stunden1; // hier stunden1 wieder zu stunden } else { tage++; } } zuwend_h = zuwend_h - stunden1; // kürzer: "zuwend_h -= stunden";
-
AnsiString Feld = StringGrid1->Cells[i+1][2]; // diese Zeile raus if( (Feld != "XXX") ) //++tage; // die auch raus
Die kann ich nicht raus lassen.
-
ups, stimmt, war mal wieder zu voreilig
-
schon ok, trotzdem funktioniert das richtige rechnen dann noch nicht, aber das liegt daran, dass er die alten Werte die ich bevor ich das erneute Mal auf "Berechnen" drücke, die übernimmt er beim zweiten Mal drücken, also müßte ich irgendwie diese Werte löschen!!!!
-
Du könntest es doch einfach so lösen:
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); if (zufall > zuwend_h) { zufall = zuwend_h; } if (zuwend_h - zufall > 0) { zuwend_h -= zufall; } else { zufall = 0; } StringGrid1->Cells[i+1][2] = zufall; } if (zuwend_h > 0) { StringGrid1->Cells[i+1][2] = zuwend_h; }
Gruß Burkhard
-
bevor du das nächste mal auf einen Beitrag antwortest, solltest du dir vorher mal den komplettet tread durchlesen, dann hätten dir drei dinge auffallen müssen:
1. er will nur felder auffüllen die leer sind
2. er will bereits per hand eingetragene stunden berücksichtigen
3. es wurde von MFK bereits ein besserer vorschlag zwecks der verteilung gemachtalso: erst lesen, dann schreiben. nicht andersrum!!!
und erklär mir mal wozu du dich selber zitierst!!!!
-
Die Verteilung funktioniert ja auch soweit, hab auch jetzt die Änderung der zuwend_h Stunden hineinbekommen, hab einfach wenn sich das Edit4->Text ändert die Reihe leer gemacht!!! Aber was ist wenn der Nutzer einfach während der Laufzeit in dem StringGrid ändern will, da stehen ja dann aber schon alle stunden drin, also kann er keine hinzufügen!?
Noch ne Frage zu einer Fehlermeldung:
if(stunden>zuwend_h) { Application->MessageBox("Ihr Eingabe ist falsch, bitte korrigieren sie ihre Eingabe","Fehlermeldung",MB_OK); }
Wenn der Nutzer dann auf OK klickt müßte die Reihe wieder leer erscheinen, dürfte dann aber nicht weiterrechnen, sondern auf eine erneute Eingabe gehen, wie mach ich das??
-
leere das feld nach der messagebox und mach die berechnug in dem else-zweig deiner if-bedingung
-
if(stunden>zuwend_h) { if((Application->MessageBox("Ihre eingegebene Stundenzahl ist größer als die Zahl der zuwendungsfähigen Stunden! ","Fehlermeldung",MB_OK)==IDOK)) { for(int i=0;i<StringGrid1->ColCount-1;i++) { AnsiString Feld = StringGrid1->Cells[i+1][2]; if(isNumber(Feld)==true) { Feld=""; } } } } else { zuwend_h -= stunden; }
Wieso leert es mir trotzdem nicht die Felder wo etwas die Zahlen drin stehen???
-
Hallo,
du löscht leider nur die Variable "Feld" aber nicht den Inhalt deiner Zelle !
Jetzt überleg mal selbst wie du die Zelle löschen kannst.mit copy und paste lernste nix !
mfg
VergissEs
-
Sorry wenn ich frage wie ich das machen kann, immerhin wurde mir heute schon oft eine Anleitung gegeben wie ich was machen kann und ich habs selbst hinbekommen!!! Weiß selbst das ich durch Copy und Paste nichts lerne, aber falls es dir noch nicht aufgefallen ist, ich mach mir Gedanken über meine Probleme!!!
-
so funktionierts jetzt:
if(stunden>zuwend_h) { if((Application->MessageBox("Ihre eingegebene Stundenzahl ist größer als die Zahl der zuwendungsfähigen Stunden! ","Fehlermeldung",MB_OK)==IDOK)) { for(int i=0;i<StringGrid1->ColCount-1;i++) { AnsiString Feld = StringGrid1->Cells[i+1][2]; if(isNumber(Feld)==true) { tage++; StringGrid1->Cells[i+1][2]=""; } } } } else { zuwend_h -= stunden; }
Wie könnte ich jetzt aber noch während der Laufzeit wenn der Benutzer seine eigenen Angaben in der Zeile 2 ändert, die bisher verteilten Werte löschen bzw. die ganze Zeile löschen und nochmal neu eingeben?