Stunden auf mehrere Tage verteilen



  • 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;
    


  • 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



  • @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 gemacht

    also: 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???


Anmelden zum Antworten