我现在的问题卡在如果要抓取链表里面的数据并且显示出来,我可能需要创建一个三维的数组用来分别输入月份(Monat),支出类别(Kategorie)还有花费金额(Betrag),同时我要判断每次抓取的数据输入月份以及支出类别是否相同。想请问下有没有更好的思路解决这个问题。题目要求如下:
我的代码还没写完,大概整体如下:
谢谢各位!
```#include
#include
#include
using namespace std;
class Artikel
{
// friend Deklaration
friend class Rechnungsliste;
private:
int Monat;
string Kategorie;
float Betrag;
int Nummer;
Artikel *nachfolger;
public:
Artikel(int m, string k, float b,int n) : Monat(m), Kategorie(k), Betrag(b),Nummer(n)
{
nachfolger = 0;
}
string get_Kategorie () { return Kategorie; }
float get_Betrag () { return Betrag; }
int get_Monat () { return Monat; }
int get_Nummer(){return Nummer;}
void set_Kategorie (string k) { Kategorie = k; }
void set_Betrag (float b) { Betrag = b; }
void set_Monat (int m) { Monat = m; }
Artikel *next () { return nachfolger; }
void datenausgeben()
{
cout<<get_Monat()<<endl;
cout<<"--------------------------------------------------------------------"<<endl;
cout<<"\t"<<get_Kategorie()<<":\t"<<"\t\t\t"<<get_Betrag()<<"\t"<<"\t"<<get_Nummer()<<endl;
}
};
void Kategorieanzeige()
{
cout<<"[1]\t"<<"Tank"<<endl;
cout<<"[2]\t"<<"Kleidung"<<endl;
cout<<"[3]\t"<<"Urlaub"<<endl;
cout<<"[4]\t"<<"Essen"<<endl;
cout<<"[5]\t"<<"Bus"<<endl;
cout<<"[6]\t"<<"Bahn"<<endl;
cout<<"[7]\t"<<"Schule"<<endl;
cout<<"[8]\t"<<"Fitniss"<<endl;
}
class Rechnungsliste
{
private:
Artikel *anfang;
public:
Rechnungsliste ()
{
anfang = 0;
}
Artikel *begin () { return anfang; }
void einfuegen(Artikel *k)
{
k->nachfolger = anfang;
anfang = k;
}
Artikel* finde(int nm)
{
Artikel *kp;
for (kp = begin(); kp != 0; kp = kp->next())
if (kp->get_Monat() == nm)
break;
return kp;
}
Artikel* finde(string zl)
{
Artikel *kp;
for (kp = begin(); kp != 0; kp = kp->next())
if (kp->get_Kategorie() == zl)
break;
return kp;
}
void remove(int yue)
{
if(anfang!=NULL)
{
if(anfang->get_Monat() == yue) //prüfe ob Anfang unser Satz ist, da es sein kann, dass wir keinen Nachfolger haben
{
anfang = anfang->next(); //falls ja, dann ist unser neuer Anfang der Nachfolger
}
else if(anfang->get_Monat() != yue && anfang->next() == NULL) //prüfe ob Anfang ungleich Satz ist und ob nächster Datensatz NULL ist
{
return;
}
else
{
Artikel *kp;
for (kp = begin(); kp != 0; kp = kp->next())
{
if(kp->next()->get_Monat() != yue && kp->next()->next() == NULL) //prüfe ob Nachfolger-Satz ungleich meinem Satz und ob Nachfolger vom Nachfolger gleich NULL
break; //wird benötigt, falls wir beim vorletzten sind & letzter ungleich ist, da letzter keine Daten liefert
else if (kp->next()->get_Monat() == yue) //prüfe ob Nachfolger unser Satz ist
{
kp->nachfolger = kp->next()->next(); //falls ja, dann ist unser neuer Nachfolger der Nachfolger vom Nachfolger des aktuellen Objekts
break;
}
}
}
}
}
bool empty() { return anfang == 0; }
Artikel *clear()
{
// Entfernen eines Knotens vom Anfang der Liste
Artikel * kp = anfang;
if (kp != 0)
{
cout << kp->get_Monat() << " entfernt." << endl;
anfang = kp->nachfolger;
kp->nachfolger = 0;
}
return kp;
}
};
Rechnungsliste liste;
v/*oid display_by_month()
{
Artikel*kp=NULL;
float display_month[12][8];
for(int i=0;i
{
for(int j=0;j
{
display_month[i][j]=0.0;
}
}
for(kp=liste.begin();kp!=0;kp=kp->next())
switch(kp->get_Monat())
{
case 1:
int index_month=kp->get_Monat();
display_month[index_month][0]+=kp->get_Betrag();
break;
case 2:
int index_month=kp.get_Monat();
display_month[index_month][1]+=kp->get_Betrag();
break;
case 'Urlaub':
int index_month=kp.get_Monat();
display_month[index_month][2]+=kp->get_Betrag();
break;
case 'Essen':
int index_month=kp.get_Monat();
display_month[index_month][3]+=kp->get_Betrag();
break;
case 'Bus':
int index_month=kp.get_Monat();
display_month[index_month][4]+=kp->get_Betrag();
break;
case 'Bahn':
int index_month=kp.get_Monat();
display_month[index_month][5]+=kp->get_Betrag();
break;
case 'Schule':
int index_month=kp.get_Monat();
display_month[index_month][6]+=kp->get_Betrag();
break;
case 'Fitniss':
int index_month=kp.get_Monat();
display_month[index_month][7]+=kp->get_Betrag();
break;
default:
break;
}
}
*/
void erfassen() // Artikel erfassen
{
int Monat;
float Betrag;
string Kategorie;
int Nummer;
int nr=0;
cout<<"Nummer: "<<endl;
cin>>Nummer;
Artikel *tmpArtikel = NULL;
tmpArtikel = liste.finde(Nummer);
if (tmpArtikel == 0)
{
cout<<"Monat: "<<endl;
cin>>Monat;
Kategorieanzeige();
cout<<"Nummer von Kategorie: "<<endl;
cin>>nr;
switch(nr)
{
case 1:
{
Kategorie="Tank";
break;
}
case 2:
{
Kategorie="Kleidung";
break;
}
case 3:
{
Kategorie="Urlaub";
break;
}
case 4:
{
Kategorie="Essen";
break;
}
case 5:
{
Kategorie="Bus";
break;
}
case 6:
{
Kategorie="Bahn";
break;
}
case 7:
{
Kategorie="Schule";
break;
}
case 8:
{
Kategorie="Fitniss";
break;
}
default:
{
cout<<"Falsche auswahl."<<endl;
system("pause");
break;
}
}
cout<<"Betrag: "<<endl;
cin>>Betrag;
cout<<"Monat: "<<Monat<<" "<<"Kategorie: "<<Kategorie<<" "<<"Betrag: "<<Betrag<<"Euro"<<" "<<"Rechnungsnummer: "<<Nummer<<endl;
Artikel *objekt = new Artikel(Monat,Kategorie,Betrag,Nummer); //neues Objekt mit neu zugewiesener Adresse erstellen
liste.einfuegen(objekt);
cout << "Artikel hinzugef\201gt." << endl;
}
else
{
cout << "Artikel " << Nummer << " bereits vorhanden. " << endl;
}
}
void aendern() // Artikel ändern
{
int Monat;
float Betrag;
string Kategorie;
int nr=1,auswahl;
Artikel *objekt;
cout<<"Monat\t Kategorie\t Betrag\t"<<endl;
for (objekt=liste.begin(); objekt != 0; objekt = objekt->next())
{
cout << "[" << nr << "]\t";
objekt->datenausgeben();
cout << endl;
nr++;
}
cout << "Welcher Artikel soll geaendert werden?" << endl << "Nummer eingeben: ";
do
{
cin >> auswahl;
}while(auswahl <= 0 || auswahl >= nr);
nr = 1;
for (objekt=liste.begin(); objekt != 0; objekt = objekt->next())
{
if(auswahl==nr)
break;
nr++;
}
system("cls");
cout << "Was soll abgeaendert werden?" << endl << "[1] Monat: " << objekt->get_Monat() << endl << "[2] Kategorie: " << objekt->get_Kategorie() << endl << "[3] Betrag: " << objekt->get_Betrag() << endl << "Nummer eingeben: ";
do
{
cin >> auswahl;
}while(auswahl <= 0 || auswahl >= 4);
if(auswahl==1)
{
cout << "Neue Monat: ";
cin >> Monat;
objekt->set_Monat(Monat);
}
else if(auswahl==2)
{
cout << "Neue Kategorie: ";
cin >> Kategorie;
objekt->set_Kategorie(Kategorie);
}
else if(auswahl==3)
{
cout << "Neuer Betrag: ";
cin >> Betrag;
if(Betrag<=0)
throw (string)"Betrag";
objekt->set_Betrag(Betrag);
}
cout << "Artikel ge\204ndert." << endl;
}
void ausgabe() // Alle Artikel mit Gesamtpreis ausgeben
{
float gesamtbetrag=0;
Artikel *objekt;
int i=0;
int j=0;
float gesamtbetrag1=0;
int nr=0;
string a[8];
int b[12];
int c[100];
string tmp;
float bb;
cout<<"Monat\t Kategorie\t\t\t Betrag\t Rechnungsnummer"<<endl;
for(objekt=liste.begin();objekt!=0;objekt=objekt->next())
{
if(objekt=liste.begin())
{
b[0]=objekt->get_Monat();
a[0]=objekt->get_Kategori();
c[0]=objekt->get_Betrag();
}
else
{
break;
}
if(objekt!=liste.begin())
{
for(i=0;i<12;i++)
{
if(objekt->get_Monat()==b[i])
{
}
else{
b[objekt->get_Monat()-1]==objekt->get_Monat();
a[0]=get_Kategorie();
c[0]=get_Betrag();
for(j=0;j<8;j++)
{
a[j]=objekt->get_Kategorie();
if(objekt->get_Kategorie()==a[j])
{
}else{}
}
}
}
}
else
{
b[i+1]=objekt->get_Monat();
}
}
}
for(j=0;j<8;j++)
{
a[j]=objekt->get_Kategorie();
for(c=0;c<100;c++)
{
c[j]=objekt->get_Betrag();
}
}
}
cout<<"\t\t\t\t\t"<<objekt->get_Betrag()<<"Euro"<<endl;
gesamtbetrag+=objekt->get_Betrag();
nr++;
}
if(nr>=2)
{
cout<<"--------------------------------------------------------------"<<endl;
cout<<"Gesamtbetrag: "<<"\t\t\t\t"<<gesamtbetrag<<"Euro"<<endl;
}
}
/*void ausgabe2()//Rechnunslistesbetrag zusammenausgeben
{
string Kategorie;
float Betrag;
int Monat;
float gesamtbetrag2=0;
Artikel *objekt;
Artikel *tmpArtikel;
tmpArtikel=liste.finde(Kategorie);
for(objekt=liste.begin();objekt!=0;objekt=objekt->next())
{
if(tmpArtikel==0)
{
cout<<"\t"<get_Kategorie()<<": "<get_Betrag()<<"Euro."<<endl;
}
else
{
gesamtbetrag2+=objekt->get_Betrag()+tmpArtikel->get_Betrag();
cout<<"\t"<<objekt->get_Kategorie()<<": "<<gesamtbetrag2<<"Euro."<<endl;
}
}
}*/
void loeschen() // Artikel löschen
{
int Monat;
float Betrag;
string Kategorie;
int nr=1,auswahl;
Artikel *objekt;
cout<<"Monat\t Kategorie\t Betrag\t"<<endl;
for (objekt=liste.begin(); objekt != 0; objekt = objekt->next())
{
cout << "[" << nr << "]\t";
objekt->datenausgeben();
cout << endl;
nr++;
}
cout << "Welcher Artikel soll geloescht werden?" << endl << "Nummer eingeben: ";
do
{
cin >> auswahl;
}while(auswahl <= 0 || auswahl >= nr);
nr = 1;
for (objekt=liste.begin(); objekt != 0; objekt = objekt->next())
{
if(auswahl==nr)
break;
nr++;
}
liste.remove(objekt->get_Monat());
cout << "Artikel geloescht." << endl;
}
void leeren()// Einkaufsliste leeren
{
while(!liste.empty())
liste.clear();
cout << endl << "Rechnungslist ist leer!" << endl;
}
int main()
{
int auswahl = 1;
Artikel *tmpObjekt = NULL;
Rechnungsliste list;
do
{
system("cls");
cout<<"---- Rechnungsliste ----"<
cout
cout
cout
cout
cout
cout
cout
cout
cin>>auswahl;
cout<<endl<<endl;
try
{
switch(auswahl)
{
case 0: //End
cout << "Auf Wiedersehen!" << endl;
break;
case 1://Rechnung hinzuguegen
system("cls");
erfassen();
system("pause");
break;
case 2://Rechnungsliste Ausgabe
if(liste.begin()!=0)
{
system("cls");
ausgabe();
}
else
cout<<"List ist leer."<<endl;
system("pause");
break;
case 3://Rechnunslistesbetrag zusammenausgeben
if(liste.begin()!=0)
{
system("cls");
void display_by_month();
}
else
cout<<"List ist leer."<<endl;
system("pause");
break;
case 4://Daten von Rechnunsliste aendern
if(liste.begin()!=0)
{
system("cls");
void aendern();
}
else
cout << "Liste ist leer." << endl;
system("pause");
break;
case 5://Rechnungslist loeschen
if(liste.begin()!=0)
{
system("cls");
void loeschen();
}
else
cout<<"List ist leer."<<endl;
system("pause");
break;
case 6://Rechnungslist leeren
if(liste.begin()!=0)
{
system("cls");
void leeren();
}
else
cout << "Liste ist leer." << endl;
system("pause");
break;
default:
cout<<"Falsche auswahl."<<endl;
system("pause");
break;
}
}
catch(string msg)
{
cout << msg << " darf nicht negativ oder Null sein!" << endl << "Vorgang abgebrochen." << endl;
system("pause");
}
}while(auswahl!=0);
system("pause");
return 0;
}