Wieso funktioniert der C++-Code nicht richtig?

FlyingDanger

Neues Mitglied
Thread Starter
Dabei seit
16.05.2007
Beiträge
8
Reaktionspunkte
0
Hallo,
falls das das falsche Forum ist, bitte ich um entschuldigung.

Ich habe aus Spass angefangen zu programmieren und bin an eine Stelle gelangt an der icht nicht weiter weis, das Programm macht nicht das, was es sollte.

Es wäre nett, wenn ihr euch kurz den Code anschauen könntet und mir dann den Fehler nennen könntet. Ich vermute ich sehe des Wald vor lauter Bäumen nicht.

Die Einnahmen werden später nicht ausgegeben, bzw. der Wert "0". Bei "trinken" z.B. funktioniert es aber einwandfrei.
Die Werte werden in einem Array aus Structs, welche wiederrum aus Arrays bestehen, gespeichtert. Das Struct besteht komplett aus floats.

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

//Datentyp wird festgelegt
struct kategorie
{
float einnahmen[32];
float trinken[32];
float billard[32];
float kino[32];
float sonstiges[32];
};

kategorie month[12];

float single_month[12];

//Initialisierung
int init()
{
int a=0;
int b=0;
int c=0;
while (a<13)
{
single_month[a]=0;
a=a+1;
}
while (b<13)
{
while (c<33)
{
month.einnahmen[c]=0;
month.trinken[c]=0;
month.billard[c]=0;
month.kino[c]=0;
month.sonstiges[c]=0;
c=c+1;
}
b=b+1;
}
}

//Verrechnung der Eingabe
int work(int a,int b,int c,float d)
{
if (c==1)
{
month[a].einnahmen=month[a].einnahmen+d;
month[a].einnahmen[0]=month[a].einnahmen[0]+d;
}
if (c==2)
{
month[a].trinken=month[a].trinken+d;
month[a].trinken[0]=month[a].trinken[0]+d;
}
if (c==3)
{
month[a].billard=month[a].billard+d;
month[a].billard[0]=month[a].billard[0]+d;
}
if (c==4)
{
month[a].kino=month[a].kino+d;
month[a].kino[0]=month[a].kino[0]+d;
}
if (c==5)
{
month[a].sonstiges=month[a].sonstiges+d;
month[a].sonstiges[0]=month[a].sonstiges[0]+d;
}
}

//Monatsauswertung
int show_month()
{
int month_numb=0;
float gesamt=0;
cout<< "Monat: ";
cin>> month_numb;
if (month_numb<1||month_numb>12)
{
cout<< "\nFalsche Eingabe!\n\n";
show_month();
}
cout<< "\n"<< change_month(month_numb)<< "\n\n";
cout<< "Einnahmen: "<< month[month_numb].einnahmen[0]<< "\n";
cout<< "Trinken : "<< month[month_numb].trinken[0]<< "\n";
cout<< "Billard : "<< month[month_numb].billard[0]<< "\n";
cout<< "Kino : "<< month[month_numb].kino[0]<< "\n";
cout<< "Sonstiges: "<< month[month_numb].sonstiges[0]<< "\n\n";
gesamt=month[month_numb].einnahmen[0]-month[month_numb].trinken[0]-month[month_numb].billard[0]-month[month_numb].kino[0]-month[month_numb].sonstiges[0];
cout<< "Gesamt: "<< gesamt<< "\n";
single_month[month_numb]=single_month[month_numb-1]+gesamt;
cout<< "Ende : "<< single_month[month_numb]<< "\n\n";
}

//Eingabefunktion
int input()
{
int month_numb=0;
int day=0;
int kat_numb=0;
float money=0.0;
cout<< "Monat: ";
cin>> month_numb;
if (month_numb<1||month_numb>12)
{
cout<< "Falsche Eingabe!\n";
input();
}
cout<< "\nTag: ";
cin>> day;
if (day<1||day>32)
{
cout<< "Falsche Eingabe!\n";
input();
}
cout<< "\nKategorie:\n"
<< "1 Einnahmen\n"
<< "2 Trinken\n"
<< "3 Billard\n"
<< "4 Kino\n"
<< "5 Sonstiges\n";
cin>> kat_numb;
if (kat_numb<1||kat_numb>5)
{
cout<< "Falsche Eingabe!\n";
input();
}
cout<< "\nBetrag: ";
cin>> money;
work(month_numb, day, kat_numb, money);
}

//Hauptmenü
int main()
{
int act_numb=0;
init();
cout<< "Aktion:\n";
cout<< "1 Monatsanszeige\n"
<< "2 Gesamtanzeige\n"
<< "3 Eingabe\n"
<< "4 Beenden\n";
cin>> act_numb;
if (act_numb<1||act_numb>4)
{
cout<< "Falsche Eingabe!\n\n";
main();
}
if (act_numb==1)
{
show_month();
cout<< "\n";
main();
}
if (act_numb==3)
{
input();
cout<< "\n";
main();
}
if (act_numb==4);
{
}
}
 
Zuletzt bearbeitet:
Hallo,

nö, ich glaube ist schon das richtige Forum. Aber poste doch mal den kompletten Code, so dass ich ihn hier übersetzen kann.

Alex
 
is geändert. hab eine, für das problem unwichtige sequenz weggelassen, da dort nur der monat berechnet wurde.
 
Bei mir beendet das Programm, wenn ich ein "Item" Eingegeben haben (Abfolge: 3 (Monat), 1, 1, 1 (Kategorie: Einnahmen), 5). Wenn ich dann 2 (Gesamtanzeige) drücke, beendet das Programm.

Ist das der Fehler?

Alex
 
nein, das ist leider nicht der fehler. das programm beendet, da es nicht weis, was es bei zwei amchen soll.

mein problem liegt darin, dass ich, wenn ich einnahmen eintrage, und dann auf "1 - monatsauswertung" gehe, dass sie da nicht aufgeführt werden.
 
Gib mal einen Fehlerreport für Dumme, d.h.:
* Mach dieses und jenes
* Erwartet wird folgendes Ergebnis
* Es kommt aber dieses Ergebnis

Alex
 
also main rekursiv aufrufen geht ja wohl gar nicht. Auch wenn der compiler da nicht zickt solltest Du das anders lösen. Kannst ja z.B. ne while(1) drumrum machen und exceptions einführen.
 
Hi,

also ich habe dein Programm auch mal kompiliert und drübergeschaut.
Du arbeitest ja mit Funktionen, die keinen Rückgabewert haben und deshalb kommen beim GCC-Compiler Warnungen, da du die Funktion als int deklariert hast.
Also solltest du entweder ' return 0; ' hinzufügen, oder am besten einfach als Funktionstyp ' void ' nehmen.

Du rufst außerdem die Main-Funktion des öfteren auf, wodurch auch die ' init() ' Funktion aufgerufen wird. Eigentlich dürfte dann nie was in den Arrays stehen, da diese immer wieder auf 0 gesetzt werden!
Außerdem hat diese Variante einen sehr heftigen Nachteil, denn du bei jedem Funktionsaufruf verzweigst du über den "Stack" und je länger dein Programm läuft desto voller wird dein Stack bei der Variante und es kann bzw. kommt zu einem Stack-Overflow.

Die saubere Variante wäre:
int main(){
int act_numb=0;
int ok=0;
while(ok==0){
init();
cout << "Aktion:\n";
cout << "1 Monatsanszeige\n"
<< "2 Gesamtanzeige\n"
<< "3 Eingabe\n"
<< "4 Beenden\n";
cin>> act_numb;
if (act_numb<1||act_numb>4){
cout<< "Falsche Eingabe!\n\n";
}
if (act_numb==1){
show_month();
cout<< "\n";
}
if (act_numb==3){
input();
cout<< "\n";
}
if (act_numb==4){
ok=1;
}
}
}

So läuft das Programm bei mir so weit ich das beurteilen kann einbandfrei und dein Fehler tritt auch nicht mehr auf.

Grüße,
Steffen
 
So das Problem ist gelöst. Ich möchte mich bei euch allen für eure Hilfe bedanken.
Ich habe die ints durch voids erstetzt und statt eine rekursion eine while schleife eingefügt.
Danke für eure Mühe!
 
Zurück
Oben Unten