Briefmarkenautomat - Fehler
-
Kann mir jemand sagen warum er mir am Ende nur "müll" ausgiebt
?!VIELEN DANK !!!
#include<conio.h>
#include<iomanip.h>
#include<iostream.h>
#include<math.h>class automat
{
public:
int b[10],i;
int geld,zahl,x,a[5];
float rueck;
void markentyp_auswaehlen();
void anzahl_der_verfuegbaren_2_eu_stuecke_eingeben();
void anzahl_der_marken_berechnen_und_ausgeben();
void rueckgeld_auszahlen();
};void automat::markentyp_auswaehlen()
{
int b[]={1,2,3,4,5};
int a[]={45,55,90,145,220};cout << " 1 = 45 ct (Postkarte)" << endl
<< " 2 = 55 ct (Standardbrief)" << endl
<< " 3 = 90 ct (Kompaktbrief)" << endl
<< " 4 = 145 ct (Grossbrief)" << endl
<< " 5 = 220 ct (Maxibrief)" << endl << endl;cout<<endl<<endl;
cout<<"Ihre Wahl bitte: ";cin>>i;
b[i]=a[i];
}void automat::anzahl_der_verfuegbaren_2_eu_stuecke_eingeben()
{
cout<<"\nDer Automat nimmt heute leider nur 2-Euro_stuecke entegegen.\nBitte die Anzahl ihrer verfuegbaren 2-Euro-Stuecke eingeben: ";
cin>>x;
}void automat::anzahl_der_marken_berechnen_und_ausgeben()
{
geld=x*2*100;
b[i]=a[i];
zahl=geld/b[i];
cout<<"\n\nSie erhalten "<<zahl<<" Marke(n) zu "<<b[i]<<" ct.";
}void automat::rueckgeld_auszahlen()
{
cout.precision(2);cout.setf(ios::fixed);
rueck=(geld-(zahl*a[i]))*0.01;
cout<<"\n\nIhr Rueckgeld betraegt "<<rueck<<" Euro.";}
int main()
{
automat briefmarken;
briefmarken.markentyp_auswaehlen();
briefmarken.anzahl_der_verfuegbaren_2_eu_stuecke_eingeben();
briefmarken.anzahl_der_marken_berechnen_und_ausgeben();
briefmarken.rueckgeld_auszahlen();cout<<"\n\nProgrammende...";
cin.get();cin.get();return(0);
}
-
Da das ganze kein Mensch lesen kann, mache ich es für dich nochmal ordentlich, dann kann dir vielleicht auch jemand helfen. Man kann aber auf den ersten Blick schon sagen: Wie oder womit auch immer du C++ gelernt hast: Vergiss es und zerstöre das Lehrmaterial. Dann fängst du besser noch einmal mit einem guten Lehrbuch von vorne an. Ok, ganz so krass ist es doch nicht, aber ich vermute mal, dass dein Lehrmaterial vor 15+ Jahren von einem C Programmierer geschrieben wurde.
edit: Und es würde helfen, wenn du sagst, was am Ende für Müll ausgegeben wird, denn viele Leser dürften Schwierigkeiten haben diesen Code mit einem standardkonformen Compiler selber zu testen. Aber wenn man die Ausgabe kennt, kann man vielleicht auch so schon den Fehler finden.
#include<conio.h> #include<iomanip.h> #include<iostream.h> #include<math.h> class automat { public: int b[10], i; int geld, zahl, x, a[5]; float rueck; void markentyp_auswaehlen(); void anzahl_der_verfuegbaren_2_eu_stuecke_eingeben(); void anzahl_der_marken_berechnen_und_ausgeben(); void rueckgeld_auszahlen(); }; void automat::markentyp_auswaehlen() { int b[] = { 1, 2, 3, 4, 5 }; int a[] = { 45, 55, 90, 145, 220 }; cout << " 1 = 45 ct (Postkarte)" << endl << " 2 = 55 ct (Standardbrief)" << endl << " 3 = 90 ct (Kompaktbrief)" << endl << " 4 = 145 ct (Grossbrief)" << endl << " 5 = 220 ct (Maxibrief)" << endl << endl; cout << endl << endl; cout << "Ihre Wahl bitte: "; cin >> i; b[i] = a[i]; } void automat::anzahl_der_verfuegbaren_2_eu_stuecke_eingeben() { cout << "\nDer Automat nimmt heute leider nur 2-Euro_stuecke entegegen.\nBitte die Anzahl ihrer verfuegbaren 2-Euro-Stuecke eingeben: "; cin >> x; } void automat::anzahl_der_marken_berechnen_und_ausgeben() { geld = x * 2 * 100; b[i] = a[i]; zahl = geld / b[i]; cout << "\n\nSie erhalten " << zahl << " Marke(n) zu " << b[i] << " ct."; } void automat::rueckgeld_auszahlen() { cout.precision(2); cout.setf(ios::fixed); rueck = (geld - (zahl * a[i])) * 0.01; cout << "\n\nIhr Rueckgeld betraegt " << rueck << " Euro."; } int main() { automat briefmarken; briefmarken.markentyp_auswaehlen(); briefmarken.anzahl_der_verfuegbaren_2_eu_stuecke_eingeben(); briefmarken.anzahl_der_marken_berechnen_und_ausgeben(); briefmarken.rueckgeld_auszahlen(); cout << "\n\nProgrammende..."; cin.get(); cin.get(); return (0); }
-
JeyJey1779 schrieb:
Kann mir jemand sagen warum er mir am Ende nur "müll" ausgiebt
?!@SeppJ: Die richtige Antwort wäre gewesen: "weil du die cpp-Tags vergessen hast"

-
Einen Fehler habe ich schon gefunden:
Zeilen 19 und 20: Diese Zeilen legen neue Variablen a und b an, welche nur innerhalb der Funktion markentyp_auswaehlen() existieren. Wenn du später in anderen Funktionen auf die Membervariablen a und b zugreifst, sind diese noch uninitialisiert, d.h. in der Regel mit zufälligen Zahlen gefüllt.
-
Uninitialisierte Variablen werden da schuld sein, speziell deine a, b-arrays.
Deine Variablennamen sind auch optimierungsbedürftig (sprechende Namen wären nicht schlecht!)
Auch greifst du bei Maxibrief auf ungültige Indezes zu.
Gibt sicher noch mehr, bin aber zu müde zum Suchen...
-
Hmm das habe ich mir auch schon gedacht, aber wie mache ich das denn richtig??
Denn unser Prof gibt immer nur so dämlich Aufgaben raus ohne Lösung....
-
JeyJey schrieb:
Hmm das habe ich mir auch schon gedacht, aber wie mache ich das denn richtig??
Denn unser Prof gibt immer nur so dämlich Aufgaben raus ohne Lösung....Welche Mittel darf man denn anwenden? Wenn man das nämlich in C++ schreibt sähe das ganz anders aus. Du (und das heißt wahrscheinlich auch dein Prof) machst eher so etwas wie C mit "ich habe mal gehört wenn man das Wort class verwendet ist es C++". Das ändert aber im Prinzip nichts daran, dass wir es hier ganz klar mit einem C Programm zu tun haben, bloß dass die Funktionen komische Namen haben.
Und was ist denn überhaupt die Aufgabe?
-
entweder die arrays raus aus der klasse, oder im konstruktor initialisieren.