Die Logik ener Schleifenaufgabe in C/C++



  • Hallo,

    Ich habe 50 Kundennummern.
    Pro Knr gibt es 8 Datums.
    Ich möchte jetzt eine Schleife realisieren, die alle Knr ihre 8 Datums zuordnet.
    Also in Etwa soll das Ergenis so aussehen:

    Knr1: Datum1, Datum2....Datum8
    Knr2: Datum1,Datum2.....Datum8
    u.s.w

    Kann mir hier jemand eine Lösung dazu anbieten.
    vielen Dank im Voraus.

    LG
    Eliza



  • BOOST_FOREACH(Knr* kn, kunden) {
        BOOST_FOREACH(Datum* date, kn->dates) {
            date = create_new_date(random_date_initializer());
        }
    }
    


  • Welche Daten sind der Input Deines Programms (die 8 Daten pro Kunde?)
    Wie sieht die Datenstruktur aus, in der Kundennummer und die 8 Daten gespeichert sind?
    Was ist die Ausgabe Deines Programms; ist es das was Du als 'Ergebnis' bezeichnest?



  • Hallo,

    also boostforeach sagt mir jetzt überhaupt nichts.

    Ich habe mir die Lösung in etwa mit einer while Schleife gedacht, auch schon versucht bekomme es aber irgendwie nicht hin

    also in etwa

    *while(i<50)

    Knr = ....
    NextKnr =....

    if(Knr == NextKnr){
    for(j=0;j<=8;j++)
    datum= "datum+i"*

    Das ist natürlich nicht richtig, dass ist nur in etwa so wie ich die Lösung brauche, ein reines durchlaufen wahrscheinlich mit mehrer schleifen.

    Ich hoffe es versteht jemand wie ich das meine 🙄



  • Naja, deine Kundennummern stecken aller Wahrscheinlichkeit halber in einem Container... da kannst du einfach drüberiterieren, mit oder ohne foreach.
    Ohne Details zu kennen, kann man schlecht spezifischere Ratschläge geben.



  • Also gut hier der code, er funktioniert nicht so wie ich will, ein logischer Fehler in der Schleife. Der Code wurde mit C++Builder geschrieben

    int i=0;int j=0;
    String Datum, NextDatum;
    String KNR, NextKNR,LastKNR;
    
    ////*************Rauslesen 1. Knr,1.  1.Datum aus DBGrid ************////
    KNR = DBGridVER->DataSource->DataSet->FieldByName("KNr")->AsString;
    MemoKundenNR->Lines->Add(KNR);
    Datum = DBGridVER->DataSource->DataSet->FieldByName("Datum1")->AsString;
    MemoDATUM->Lines->Add(Datum);
    
    ////*********Schleifendurchlauf Kundennummer************************////
    //  while(!DBGridKUH->DataSource->DataSet->Eof)
    
     while(i<15)
     {
            DBGridKUH->DataSource->DataSet->Next();
            DBGridVER->DataSource->DataSet->Next();
    
           if (KNR==NextKNR)
           {
            int x;
            String DatumVer;
            for(x=2;x<8;x++)
            {
             DatumVer=DBGridVER->DataSource->DataSet->FieldByName("Datum"+AnsiString(x))->AsString;
             MemoDATUM->Lines->Add(DatumVer);
            }
           }
            NextKNR = DBGridVER->DataSource->DataSet->FieldByName("KNr")->AsString;
            KNR=NextKNR;
            MemoKundenNR->Lines->Add(KNR);
            i++;
     }
    

    LG
    Eliza



  • Eliza* schrieb:

    .. er funktioniert nicht so wie ich will ..

    .. und wie funktioniert er? und wie soll er funktionieren? Wie soll Dir jemand darauf antworten, ohne dass das jemand weiß? 😉

    Ich habe den Code etwas angepasst, so dass man besser durchblickt:

    ?? DBGridVER, DBGridKUH, MemoKundenNR, MemoDATUM;
    
        ////*************Rauslesen 1. Knr,1.  1.Datum aus DBGrid ************////
        String KNR = DBGridVER->DataSource->DataSet->FieldByName("KNr")->AsString;
        MemoKundenNR->Lines->Add(KNR);
        String Datum = DBGridVER->DataSource->DataSet->FieldByName("Datum1")->AsString;
        MemoDATUM->Lines->Add(Datum);
    
        ////*********Schleifendurchlauf Kundennummer************************////
        //  while(!DBGridKUH->DataSource->DataSet->Eof)
    
        String NextKNR;
        for( int i=0; i<15; ++i )
        {
            DBGridKUH->DataSource->DataSet->Next();
            DBGridVER->DataSource->DataSet->Next();
    
            if (KNR==NextKNR)
            {
                for( int x=2; x<8; ++x )
                {
                    String DatumVer = DBGridVER->DataSource->DataSet->FieldByName("Datum"+AnsiString(x))->AsString;
                    MemoDATUM->Lines->Add(DatumVer);
                }
            }
            NextKNR = DBGridVER->DataSource->DataSet->FieldByName("KNr")->AsString;
            KNR = NextKNR;
            MemoKundenNR->Lines->Add(KNR);
        }
    

    Ein offensichtlicher Fehler ist mir nicht aufgfallen. Es sind 6 Daten (2-7) und nicht 8. Und es ist unklar, was 'DBGridVER, DBGridKUH, MemoKundenNR, MemoDATUM;' sind. Mir fällt noch auf, dass 'MemoDATUM->Lines->Add(..)' einmal am Anfang und 6x innerhalb der Schleife aufgerufen wird, ohne das so etwas wie 'nächste Zeile' bzw. 'nächster Datensatz' aufgerufen wird.

    und sonst: wo genau ist das Problem?



  • Was das Einlesen der ersten Datensätze außerhalb der Schleife bewirken soll, ist mir rätselhaft, die Funktion von NextKNR ebenfalls.
    Ansonsten, siehe Werners Betrag.



  • Hallo,

    @Nanyuik,

    ich weiß die Daten vor der Schleife sind so nicht richtig.
    Ich habe viel ausprobiert deshalb halt auch mal eine Variable NextKnr.

    @Werner,

    naja der Code gibt irgendwie nicht die zu jeder Knr gehörigen Datumswerte aus wie oben erklärt.
    Funktioniert nicht. Ich vermute einen logischer Fehler.

    Aber danke für das anpassen.

    Falls du dich mit C++Bilder etwas auskennst, weißt du wie man es einrichtet dass automatisch Einrückungen vorgenommen werden nach jeder geschweiften klammer. Wäre echt hilfreich.
    Danke



  • Eliza* schrieb:

    Falls du dich mit C++Bilder etwas auskennst, weißt du wie man es einrichtet dass automatisch Einrückungen vorgenommen werden nach jeder geschweiften klammer.

    Ich wüsste nicht wo im Builder eine wirklich sinnvolle Programmierunterstützung existiert [Das betrifft nicht nur einrücken sondern auch funktionierende Refactoring-Werkzeuge usw.], und wenn die IDE nicht wirklich hervorragende Unterstützung anbietet, ist das händische Einrücken meist erfolgsversprechender (Zumal es gerade in C++ extrem viele verbreitete Einrückstile gibt).

    Aber davon abgesehen: Sofern dies jetzt nicht durch ein Addin (GExperts) im Builder hinzugekommen ist, gibt es die Tastenkombinationen [STRG]+[Shift]+[I]/[U] die man auf einen markierten Bereich anwenden kann (Mit I markierten Bereich eine Ebene tiefer setzen, mit U eine Ebene höher rücken).

    P.S: Und dein Code ist mir schon so Builder-Abhängig das ich es im allgemeinen C++ Forum falsch aufgehoben finde. Mit ANSI C++ hat dein Code jedenfalls fast nichts zu tun, es gibt ein VCL (C++ Builder)-Unterforum. Wäre schön wenn ein Moderator es verschieben würde.


Anmelden zum Antworten