Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » fehlerhafter Zugriff auf String-Vector[i]

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] [ 2 ] > 3 <
020
02.11.2016, 23:15 Uhr
ao

(Operator)


Nochn Tipp: Um auf einfache und übersichtliche Weise größere Mengen Datensätze zu generieren, schau dir mal diesen Schnipsel an:


C++:

#include <string>

struct AusgabeQuelle
{
    std::string monat;
    std::string kategorie;
    double betrag;
};

const std::string ende = "XXX";

AusgabeQuelle ausgabeQuellen [] =
{
    {    "Januar",    "Miete",    200    }
    , {    "Januar",     "Essen",    50    }
    , {    "Januar",     "Essen",    80    }
    , {    "Januar",     "Essen",    35    }
    , {    "Januar",     "Kino",        12    }
    , {    "Januar",     "Urlaub",    150    }
    
    //    Letztes Element
    , {    ende,        ende,        0    }
};

void ListeAufbauen (AusgabeQuelle * quellen)
{
    AusgabeQuelle * q = quellen;
    while (q->kategorie != ende)
    {
        Ausgaben a;
        a.kategorie = q->kategorie;
        a.monat = q->monat;
        a.betrag = q->betrag;
        a.nummer = wasauchimmer();
        
        ausgabene.hinzufuegen (a);
    
        q++;
    }
}


Dieser Post wurde am 02.11.2016 um 23:15 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
021
02.11.2016, 23:48 Uhr
~BlueCobold
Gast


Oh man, so ein Schwachsinn.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
022
03.11.2016, 08:59 Uhr
ao

(Operator)


Wenn du näher ausführen willst, was du damit meinst, bitte sehr.

Bei der Bewertung bitte ich dich, im Auge zu behalten, dass wir uns hier auf dem Niveau eines Einführungskurses bewegen. Das Umsichwerfen mit fortgeschrittenen STL-Techniken mag zwar "cool" aussehen und beeindruckt sicher die Mädels (mindestens so sehr wie Gitarrespielen), hilft aber den Lernenden (noch) nicht weiter.

Im übrigen gehört es in diesem Forum zu den guten Sitten, immer den gleichen Usernamen zu verwenden. Entscheide dich bitte für somebody oder BlueCobold (im Sinne von "exclusiv-oder").

Dieser Post wurde am 03.11.2016 um 09:04 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
023
03.11.2016, 20:20 Uhr
~Julia_w
Gast


ich habe es jetzt so gelöst. es schaut zwar scheisse aus, erfüllt aber den Zweck. Komischerweise wiederholen sich die Kosten zu Kategorien:
Monat: Januar 10 Miete
Monat: Januar 40.39 Tanken
Monat: Januar 10 Miete ???
Monat: Januar 40.39 Tanken
Monat: Februar 100 Kleidung
Monat: Februar 150.02 Tanken ???
Monat: Februar 100 Kleidung ???
Monat: Februar 150.02 Tanken ???
könte das bitte jemand im Code korrigieren?


C++:
.....

void auswerten1(void)
    {
              
                 // aktueller Knoten
        Listenelement *p = kopf;
        int i=0;
             while(p != NULL)
        {
            // ...Inhalt an globale Variabellen zuweisen,...
    if(p->ausgaben.monat=="Januar") {auswerten3(p->ausgaben.monat); monatsbetrag[0]=monatsbetrag[0]+ p->ausgaben.betrag;}
    else if(p->ausgaben.monat=="Februar") {auswerten3(p->ausgaben.monat); monatsbetrag[1]=monatsbetrag[1]+ p->ausgaben.betrag;}
    else if(p->ausgaben.monat=="März") {auswerten3(p->ausgaben.monat); monatsbetrag[2]=monatsbetrag[2]+ p->ausgaben.betrag;}
    else if(p->ausgaben.monat=="April") {auswerten3(p->ausgaben.monat); monatsbetrag[3]=monatsbetrag[3]+ p->ausgaben.betrag;}
    else if(p->ausgaben.monat=="Mai") {auswerten3(p->ausgaben.monat); monatsbetrag[4]=monatsbetrag[4]+ p->ausgaben.betrag;}
    else if(p->ausgaben.monat=="Juni") {auswerten3(p->ausgaben.monat); monatsbetrag[5]=monatsbetrag[5]+ p->ausgaben.betrag;}
    else if(p->ausgaben.monat=="Juli") {auswerten3(p->ausgaben.monat); monatsbetrag[6]=monatsbetrag[6]+ p->ausgaben.betrag;}
    else if(p->ausgaben.monat=="August") {auswerten3(p->ausgaben.monat); monatsbetrag[7]=monatsbetrag[7]+ p->ausgaben.betrag;}
    else if(p->ausgaben.monat=="September") {auswerten3(p->ausgaben.monat); monatsbetrag[8]=monatsbetrag[8]+ p->ausgaben.betrag;}
    else if(p->ausgaben.monat=="Oktober") {auswerten3(p->ausgaben.monat); monatsbetrag[9]=monatsbetrag[9]+ p->ausgaben.betrag;}
    else if(p->ausgaben.monat=="November"){auswerten3(p->ausgaben.monat); monatsbetrag[10]=monatsbetrag[10]+ p->ausgaben.betrag;}
    else if(p->ausgaben.monat=="Dezember"){auswerten3(p->ausgaben.monat); monatsbetrag[11]=monatsbetrag[11]+ p->ausgaben.betrag;}
                
          // der Nachfolger wird zum aktuellen Knoten
            p = p->nachfolger;
            i++;
        }
         // .... Ausgabe der zuvor zugewiesenen Inhalte via der globalen Variabellen
         std::cout<<" \n\n Ausgabe der Gesamtkosten je Monat \n";
        for(int i=0; i<=11; i++)
        {
        printf("im Monat %d: \n Gesamt: %2.2lf \n", monate[i], monatsbetrag[i]);
        if(monatsbetrag[i]>500) printf("!!!!!!!!!!! Monatsbudget ueberschritten\n"); // Prüfen ob monatsbetrag grösser als 500 ist
        }
    }
                 //auswerten der Datensätze aus den Listenelement [Kosten zu Kategorie]
        void auswerten2(void)
    {
               std::cout<<" \n\n Ausgabe der Gesamtkosten je Kategorie \n";
                 // aktueller Knoten
        Listenelement *p = kopf;    
        while(p != NULL)
        {
            // ...Inhalt an globale Variabellen zuweisen... (zuvor muss entsprechenden Elemente in den Vector einfügen worden sein!!!!)
    if(p->ausgaben.kategorie=="Urlaub"){ kategoriebetrag[0]=kategoriebetrag[0] +p->ausgaben.betrag;  kategorie.at(0)=("Urlaub");}  
    else if(p->ausgaben.kategorie=="Tanken"){ kategoriebetrag[1]=kategoriebetrag[1] +p->ausgaben.betrag;  kategorie.at(1)=("Tanken");}
    else if(p->ausgaben.kategorie=="Miete"){ kategoriebetrag[2]=kategoriebetrag[2] +p->ausgaben.betrag;  kategorie.at(2)=("Miete");}
    else if(p->ausgaben.kategorie=="Kleidung"){ kategoriebetrag[3]=kategoriebetrag[3] +p->ausgaben.betrag;  kategorie.at(3)=("Kleidung");}
    else if(p->ausgaben.kategorie=="Sex"){ kategoriebetrag[4]=kategoriebetrag[4] +p->ausgaben.betrag;  kategorie.at(4)=("Sex");}
    else if(p->ausgaben.kategorie=="Kino"){ kategoriebetrag[5]=kategoriebetrag[5] +p->ausgaben.betrag; kategorie.at(5)=("Kino");}
    else if(p->ausgaben.kategorie=="Lernen"){ kategoriebetrag[6]=kategoriebetrag[6] +p->ausgaben.betrag; kategorie.at(5)=("Lernen");}
    else if(p->ausgaben.kategorie=="Essen"){ kategoriebetrag[7]=kategoriebetrag[7] +p->ausgaben.betrag; kategorie.at(5)=("Essen");}
            // der Nachfolger wird zum aktuellen Knoten
               p = p->nachfolger;
       }      
              //.... Ausgabe der zuvor zugewiesenen Inhalte via der globalen Variabellen
        for(int i=0; i<kategorie.size(); i++)
        {
       std::cout<<kategorie.at(i) <<" ";
       std::cout<<kategoriebetrag[i]<<"\n";
       }
     }
     void auswerten3(const std::string monat)
     {
     // aktueller Knoten
        Listenelement *p = kopf;    
        while(p != NULL)
        {
        // ...Inhalt an globale Variabellen zuweisen... (zuvor muss entsprechenden Elemente in den Vector einfügen worden sein!!!!)
        if(p->ausgaben.monat==monat) {std::cout<<"Monat:  "<<p->ausgaben.monat ; std::cout<<" "<<p->ausgaben.betrag<<" "<<p->ausgaben.kategorie<<std::endl;}
             // der Nachfolger wird zum aktuellen Knoten
               p = p->nachfolger;
        }
        //std::cout<<"auswerten3 ende \n";
     }
};

int main()
{
    int i=0;
    // Beispielsätze
    Ausgaben ausgaben, ausgaben1, ausgaben2, ausgaben3, ausgaben4, ausgaben5, ausgaben6, ausgaben7, ausgaben8, ausgaben9, ausgaben10, ausgaben11, ausgaben12;
    ausgaben.kategorie = "Miete";
    ausgaben.monat = "Januar";
    ausgaben.nummer = 10;
    ausgaben.betrag= 10;

    ausgaben1.kategorie = "Tanken";
    ausgaben1.monat = "Januar";
    ausgaben1.nummer = 1;
    ausgaben1.betrag= 40.39;

    ausgaben2.kategorie = "Kleidung";
    ausgaben2.monat = "Februar";
    ausgaben2.nummer = 4;
    ausgaben2.betrag= 100;
    
    ausgaben3.kategorie = "Tanken";
    ausgaben3.monat = "Februar";
    ausgaben3.nummer = 2;
    ausgaben3.betrag= 150.02;
    
    ausgaben4.kategorie = "Urlaub";
    ausgaben4.monat = "April";
    ausgaben4.nummer = 5;
    ausgaben4.betrag= 503.99;
    
    ausgaben5.kategorie = "Miete";
    ausgaben5.monat = "Mai";
    ausgaben5.nummer = 6;
    ausgaben5.betrag= 10;

    ausgaben6.kategorie = "Tanken";
    ausgaben6.monat = "April";
    ausgaben6.nummer = 7;
    ausgaben6.betrag= 40;

    ausgaben7.kategorie = "Kleidung";
    ausgaben7.monat = "April";
    ausgaben7.nummer = 3;
    ausgaben7.betrag= 100;
    
    ausgaben8.kategorie = "Tanken";
    ausgaben8.monat = "Juli";
    ausgaben8.nummer = 8;
    ausgaben8.betrag= 130;
    
    ausgaben9.kategorie = "Urlaub";
    ausgaben9.monat = "April";
    ausgaben9.nummer = 9;
    ausgaben9.betrag= 106;
    
    ausgaben10.kategorie = "Urlaub";
    ausgaben10.monat = "Dezember";
    ausgaben10.nummer = 11;
    ausgaben10.betrag= 56;
    
    ausgaben11.kategorie = "Sex";
    ausgaben11.monat = "November";
    ausgaben11.nummer =13;
    ausgaben11.betrag= 56.87;
    
    ausgaben12.kategorie = "Essen";
    ausgaben12.monat = "August";
    ausgaben12.nummer =12;
    ausgaben12.betrag= 87.22;
    
    
// entsprechenden Elemente in den Vector einfügen
        kategorie.push_back("Urlaub");
        kategorie.push_back("Tanken");
        kategorie.push_back("Miete");
        kategorie.push_back("Kleidung");    
        kategorie.push_back("Sex");
        kategorie.push_back("Kino");
        kategorie.push_back("Lernen");
        kategorie.push_back("Essen");

    AusgabenListe ausgabene;
    ausgabene.hinzufuegen(ausgaben);
    ausgabene.hinzufuegen(ausgaben1);
    ausgabene.hinzufuegen(ausgaben2);
    ausgabene.hinzufuegen(ausgaben3);
    ausgabene.hinzufuegen(ausgaben4);
    ausgabene.hinzufuegen(ausgaben5);
    ausgabene.hinzufuegen(ausgaben6);
    ausgabene.hinzufuegen(ausgaben7);
    ausgabene.hinzufuegen(ausgaben8);
    ausgabene.hinzufuegen(ausgaben9);
    ausgabene.hinzufuegen(ausgaben10);
    ausgabene.hinzufuegen(ausgaben11);
    ausgabene.hinzufuegen(ausgaben12);
    ausgabene.elementeAnzeigen();
    
    ausgabene.auswerten1(); //Auswerten und Ausgabe Kosten zu Monat
    
    ausgabene.auswerten2(); //Auswerten und Ausgabe Kosten zu Kategorie
    ausgabene.loeschen(); //Löschen der Datensätze

    //std::cin.get();
    system("PAUSE");
    return EXIT_SUCCESS;
    return 0;
}


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
024
04.11.2016, 11:52 Uhr
ao

(Operator)


Es scheint, dass manche Ausgaben mehrfach in der Liste enthalten sind. Wie das passiert ist - keine Ahnung. Ich glaube, ich hatte dir schonmal empfohlen, den Umgang mit dem Debugger zu lernen. Das wäre jetzt eine Gelegenheit, das anzuwenden. Programmieren heißt nämlich nicht nur "Code eintippen und dann beten", sondern auch, mit Testwerkzeugen umgehen zu können, und der Debugger ist eins der wichtigsten davon, wenn nicht das wichtigste.

Leider wird das von vielen Kursen und Tutorials hartnäckig vernachlässigt, vermutlich deshalb, weil es etwas mühsamer zu beschreiben ist als die bloße Syntax der Sprache. Aus der Sicht des praktischen Anwenders sind solche Kurskonzepte leider nur als unvollständig und mangelhaft zu bezeichnen, weil sie die Studenten mit dem (immer wiederkehrenden) Problem der Fehlersuche allein lassen.


Zitat von ~Julia_w:
könnte das bitte jemand im Code korrigieren?

Tut mir leid, diesmal nicht. Dein Programm ist dafür, dass es nur ein paar relativ einfache Sachen macht, reichlich chaotisch. Dass du den Überblick verloren hast, ist keine Überraschung.

Schmeiß es weg und schreib es neu.

Dieser Post wurde am 04.11.2016 um 11:53 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
025
04.11.2016, 13:35 Uhr
ao

(Operator)


Ach, jetzt sehe ich es. Die Liste ist schon richtig. Der Fehler ist hier:

In auswerten1 loopst du über die Liste, extrahierst aus jedem Item den Monat und rufst dann auswerten3 für diesen Monat. Das passiert für den Januar zweimal, für den Februar zweimal, für den April sogar viermal usw., entsprechend der Anzahl der Ausgabenposten für den Monat.

Auswerten3 loopt bei jedem dieser Aufrufe nochmal über die Liste und wirft alle Einträge für diesen Monat aus. So kommen die Mehrfachnennungen zustande.

Du musst einfach über die Monate loopen (von "Januar" bis "Dezember") und auswerten3 aufrufen.

Aber ich bin nicht sicher, ob das das ist, was du willst. Wenn du (wie ich verstanden habe) für den Januar alle Mietausgaben in einer Zahl, alle Essensausgaben in einer weiteren Zahl, alle Urlaubsausgaben in einer dritten Zahl und so weiter haben willst, und dasselbe für die anderen Monate, dann musst du - ich sagte es schon - eine komplett neue Auswertung schreiben. Du musst eine Art Tabelle aufbauen, 12 Zeilen für 12 Monate, 6 Spalten für 6 Kategorien, und in allen 72 Feldern die passenden Daten aufsummieren.

Wenn du dich wirklich fürs Programmieren interessierst, dann lass diese Drauflosschreiberei. Überleg dir zuerst, welche Datenstrukturen du brauchst, um die Informationen darstellen zu können.

Dieser Post wurde am 04.11.2016 um 13:39 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] [ 2 ] > 3 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: