Was mach ich diesmal falsch?



  • //Programm zur Bestandsübersicht

    #include <iostream>
    #include <iomanip>
    using namespace std;

    struct Daten
    {
    string SpaltName;
    int ArtNr;
    string Bez;
    float IstBest;
    float HoeBest;
    float EinPreis;
    float TagVerbr;
    float BestDauer;
    float MeldBest;
    float BestVorschlag;
    };

    int main()
    {
    Daten Tabelle[6][9];
    float Lagerwert;
    int i;

    cout << "Geben sie die Spaltenbezeichnungen ein:" << endl;
    for(i=0; i<9; i++)
    {
        cin >> Tabelle[0][i].SpaltName;
    }
    
    cout << "Tragen sie nun die Werte in die Tabelle ein:" << endl;
    for(i=1; i<=5; i++)
    {
        cin >> Tabelle[i][0].ArtNr;
        cin >> Tabelle[i][1].Bez;
        cin >> Tabelle[i][2].IstBest;
        cin >> Tabelle[i][3].HoeBest;
        cin >> Tabelle[i][4].EinPreis;
        cin >> Tabelle[i][5].TagVerbr;
        cin >> Tabelle[i][6].BestDauer;
        Tabelle[i][7].MeldBest = Tabelle[i][3].HoeBest - Tabelle[i][6].TagVerbr*(Tabelle[i][7].BestDauer - 2); //Meldebestand berechnen (die Werte kennt er ja, da sie davor eingegeben wurden.)
    
    }
    
    for(i=1; i<=5; i++)
    {
        if(Tabelle[i][7].MeldBest <= Tabelle[i][2].IstBest)
        {
            Tabelle[i][8].BestVorschlag = Tabelle[i][7].MeldBest - Tabelle[i][2].IstBest; //Bestellvorschlag ausrechnen (auch hier alle Werte auf der rechten Seite bekannt)
        }
    
        else
        {
            Tabelle[i][8].BestVorschlag = 0;
        }
    }
    
    for(i=0; i<9; i++)
    {
        cout << setw(25) << left << Tabelle[0][i].SpaltName;
    }
    cout << endl;
    
    for(i=1; i<=5; i++)
    {
        cout << setw(25) << left << Tabelle[i][0].ArtNr;
        cout << setw(25) << left << Tabelle[i][1].Bez;
        cout << setw(25) << left << Tabelle[i][2].IstBest;
        cout << setw(25) << left << Tabelle[i][3].HoeBest;
        cout << setw(25) << left << setprecision(2) << fixed << Tabelle[i][4].EinPreis;
        cout << setw(25) << left << Tabelle[i][5].TagVerbr;
        cout << setw(25) << left << Tabelle[i][6].BestDauer;
        cout << setw(25) << left << Tabelle[i][7].MeldBest;
        cout << setw(25) << left << Tabelle[i][8].BestVorschlag;
        cout << endl;
    }
    
    for(i=1; i<=5; i++)
    {
        Lagerwert += Tabelle[i][2].IstBest * Tabelle[i][4].EinPreis;
    }
    cout << setw(80) << right << "Lagerwert:" << setw(20) << right << setprecision(2) << fixed << Lagerwert << endl;
    
    return 0;
    

    }

    Jetzt meine Frage:
    Warum kann er die Meldebestellung und die Bestellvorschläge nicht richtig berechnen?
    Der gibt an den Stellen nur völlig komische Werte aus, mit denen ich nichts anfangen kann... (Overflow an der Stelle vielleicht? Aber ich hab doch die Array-Größe vorher deklariert!...)



  • Was mach ich diesmal falsch?

    1. Du hast deinen Quelltext nicht richtig formatiert, sodass er hier im Forum nicht korrekt erscheint.
    2. Einfacher nachzuvollziehen wäre ein MINIMAL-Beispiel deines Problems.
    3. Du benutzt ein 2d-Array. Wozu?
    4. Was soll das "SpaltName"?


  • @wob
    2D Array, weil am Ende ne Tabelle ausgegeben werden soll
    Ich Frage mich halt, warum er mit den Werten die ich vorher mit cin egegeben habe, vor der Ausgabe nicht rechnen kann



  • @JTR666 sagte in Was mach ich diesmal falsch?:

    @wob
    2D Array, weil am Ende ne Tabelle ausgegeben werden soll

    Blödsinn. Das eine hat mit dem anderen nichts zu tun. Du hast so viele uninitialisierte Variablen bei deinen 54 Daten, von denen du aber nur Teile nutzt. Du brauchst kein 2d-Array, das ergibt keinen Sinn.



  • @JTR666 Du benutzt doch schon eine struct.

    Ist dir selber noch nicht aufgefallen, dass du beim Index 2 immer den Member .IstBest benutzt



  • @DirkB Ja klar, weil das immer in dieser Spalte stehen soll!



  • Dieser Beitrag wurde gelöscht!


  • @wob
    Und das SpaltName ist für die Namen der Spalten



  • @wob
    Und man hätte jetzt auch ein 1D-Array mit 54 Feldern nehmen und das dann bei der Ausgabe passend formatieren können, schon klar.
    Also falls du das meintest 🙂🙂



  • Was die Sportfreunde dir sagen wollen:

    Das Struct ist bereits deine Zeile, also deine zweite Dimension sozusagen.
    Außerdem mischst du hier Datenhaltung und Visualisierung.

    Deine Daten sind eigentlich nur diese hier:

    struct Daten
    {
    int ArtNr;
    string Bez;
    float IstBest;
    float HoeBest;
    float EinPreis;
    float TagVerbr;
    float BestDauer;
    float MeldBest;
    float BestVorschlag;
    };
    
    std::vector<Daten> MeineDaten;
    

    Deine Spaltennamen würdest du dann extra halten, weil die zur Visualisierung gehören, aber nicht zur Datenhaltung.

    std::vector<std::string> Spaltennamen { "ArtNr", "Bez", "IstBest", "HoeBest", "EinPreis", "TagVerbr", "BestDauer", "MeldBest" };
    

    Bzw. wenn du halt willst, dass der Nutzer die Spaltennamen jedesmal eingibt, geht das natürlich auch. Man kann sie aber auch fest definieren, was eher üblich ist.
    D.h. du hast zu jedem Element deiner Daten-Struktur genau einen Spaltennamen ( und noch einen mehr, weil du irgendwas berechnest ).

    Was du gebaut hast, ist eigentlich nicht zwei Dimensional sondern eher schon drei-dimensional, wovon du 88% aber nicht nutzt.

    Letztendlich brauchst du aber nur eine 1-dimensionale Datenstruktur, weil du 5 Datensätze hast. Das "struct" bildet dabei deinen Datensatz ab.



  • @JTR666 Es gibt auch die Felder

    Tabelle[i][0].ArtNr;
    Tabelle[i][1].ArtNr;
    Tabelle[i][2].ArtNr;  // und nur diese werden genutzt
    Tabelle[i][3].ArtNr;
    Tabelle[i][4].ArtNr;
    Tabelle[i][5].ArtNr;
    Tabelle[i][6].ArtNr;
    Tabelle[i][7].ArtNr;
    Tabelle[i][8].ArtNr;
    


  • @It0101 Also jede Spalte bekommt einen Datensatz aus der Struct.
    Somit steht jede Spalte aus der Tabelle für eine Variable aus der Struct.
    Und diese bekommen dann halt in jeder Zeile neue Werte zugewiesen.
    6 Werte für ArtNr, 6 für Bez (Bezeichnung), usw.
    Diese Werte geb ich dann ein.
    Ergo sie werden in den Feldern abgelegt.
    (Die Ausgabe ist korrekt, weswegen ich mal davon ausgehen, dass mein Vorgehen so weit nicht falsch ist. Ebenfalls ein Zeichen dafür, dass es die Variablen aus der Struct nicht überschrieben werden...)
    Jetzt haben die letzten beiden Spalten noch keine Werte zugewiesen bekommen.
    Diese werden dann jeweils mit Werten aus den schon belegten Feldern berechnet.
    Denn die Rechnungen kommen ja erst NACH der Werteingabe in die ersten 6 Spalten, womit die Werte zur Berechnung allesamt bekannt sein sollten...



  • @DirkB Wo siehst du das denn bitte?
    Das i steht ja nur in der ersten Klammer, womit du mit ArtNr nur die Felder [1][0], [2][0], [3][0], [4][0] & [5][0] belegst... Denn dadurch bleibt die Spalte für ArtNr immer die selbe...



  • @JTR666 sagte in Was mach ich diesmal falsch?:

    Der gibt an den Stellen nur völlig komische Werte aus, mit denen ich nichts anfangen kann.

    Dann gib dir doch mal die eingegebenen Werte wieder aus.
    Mit cout oder schau sie dir im Debugger an.
    Dann weißt du erstmal, ob es auch die erwarteten Werte sind.



  • @DirkB Ich habe sie ausgegeben und die stimmten alle...



  • @JTR666 sagte in Was mach ich diesmal falsch?:

    @DirkB Wo siehst du das denn bitte?
    Das i steht ja nur in der ersten Klammer, womit du mit ArtNr nur die Felder [1][1], [2][1], [3][1], [4][1] & [5][1] belegst... Denn dadurch bleibt die Spalte für ArtNr immer die selbe...

    Ja aber das Element [1][1] ist eine komplette struct genauso wie [1][2], [1][3], ...
    jedes dieser Elemente enthält alle Member ( von SpaltName bis BestVorschlag )



  • @DirkB Aaahhh, okay...
    Ich dachte dass man das mit der Zuweisung .ArtNr als Beispiel verhindern und man sich nur die angegebene Variable der Struct rauspicken würde...



  • @DirkB Wieso klappt dann die Ausgabe so gut?
    Das, wundert mich jetzt. Denn dann muss der das doch so machen, dass jedes Feld im Array 9 Plätze (für jede Variable aus der Struct eins) hat und nur den belegten Platz nimmt...
    Aber das müsste er doch bei der Berechnung hinterher doch auch machen können...



  • @JTR666 Soll jetzt nicht so klingen, dass ich dir nicht glaube - im Gegenteil!
    Ich frag mich nur was er macht, wenn er es ganz offensichtlich so macht wie du es sagst



  • @JTR666 sagte in Was mach ich diesmal falsch?:

    Aber das müsste er doch bei der Berechnung hinterher doch auch machen können...

    Ja.

        cin >> Tabelle[i][5].TagVerbr;
        cin >> Tabelle[i][6].BestDauer;
        Tabelle[i][7].MeldBest = Tabelle[i][3].HoeBest - Tabelle[i][6].TagVerbr*(Tabelle[i][7].BestDauer - 2); //Meldebestand berechnen (die Werte kennt er ja, da sie davor eingegeben wurden.)
    
    

    wenn du immer den gleichen Index verwenden würdest. Für z.B. TagVerbr nimmst du aber einmal 5 und ein anderes mal 6.