C++ Taschenrechner - Problem

KingLM97

Lieutenant
🎅Rätsel-Elite ’18
Registriert
Mai 2012
Beiträge
918
Hallo,

wenn ich folgenden Code Compile:
Code:
// Taschenrechner.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "stdio.h"
#include "windows.h"
#include "winuser.h"
#include "conio.h"
#include <iostream>

using namespace std;

int RechnenPlus(int Zahl1, int Zahl2, int Ergebnis){
	Ergebnis = Zahl1 + Zahl2;
	return Ergebnis;
};
int RechnenMinus(int Zahl1, int Zahl2, int Ergebnis){
	Ergebnis = Zahl1 - Zahl2;
	return Ergebnis;
};
int RechnenMal(int Zahl1, int Zahl2, int Ergebnis){
	Ergebnis = Zahl1 * Zahl2;
	return Ergebnis;
};
int RechnenGeteilt(int Zahl1, int Zahl2, int Ergebnis){
	Ergebnis = Zahl1 / Zahl2;
	return Ergebnis;
};

int _tmain(int argc, _TCHAR* argv[])
{
	int Operation;
	int ZahlA;
	int ZahlB;

	cout << "Wählen sire ihre Rechenoperation aus!" << endl;
	cout << "1. Plus" << endl << "2. Minus" << endl << "3. Mal" << endl << "4. Geteilt" << endl;
	cin >> Operation;
	if(Operation==1){ //Plus
		system("cls");
		cout << "Geben sie ihre Zahlen ein!" << endl;
		cin >> ZahlA;
		cin >> ZahlB;
		RechnenPlus(ZahlA, ZahlB, false);
		cout << RechnenPlus << endl;
		system("pause");
	}
	if(Operation==2){ //Minus
		system("cls");
		cout << "Geben sie ihre Zahlen ein!" << endl;
		cin >> ZahlA;
		cin >> ZahlB;
		RechnenMinus(ZahlA, ZahlB, false);
		cout << RechnenMinus << endl;
		system("pause");
	}
	if(Operation==3){ //Mal
		system("cls");
		cout << "Geben sie ihre Zahlen ein!" << endl;
		cin >> ZahlA;
		cin >> ZahlB;
		RechnenMal(ZahlA, ZahlB, false);
		cout << RechnenMal << endl;
		system("pause");
	}
	if(Operation==4){ //Geteilt
		system("cls");
		cout << "Geben sie ihre Zahlen ein!" << endl;
		cin >> ZahlA;
		cin >> ZahlB;
		RechnenGeteilt(ZahlA, ZahlB, false);
		cout << RechnenGeteilt << endl;
		system("pause");
	}
	
	
	_getch();
	return 0;
}
Kommt kein Fehler raus Oo.
Aber wenn ich das Programm starte, egal welche Operation, kommt immer ein Ergebnis raus wie:
00401000.
Weiß jemand Rat? Wäre allen echt dankbar.
 
Zuletzt bearbeitet: (Frage vergessen Oo)
Ich kann kein C++, aber einmal schreibst du als Variable "Zahl1", "Zahl2" und dann "ZahlA", "ZahlB"...
 
Folgende Dinge, die mir auffallen:
1. (kosmetisch) Methodennamen sollten klein anfangen: RechnenMal --> rechnenMal
2. RechnenPlus(int Zahl1, int Zahl2, int Ergebnis), wozu int Ergebnis? Und wieso dann ein Boolean bei der Übergabe? RechnenPlus(ZahlA, ZahlB, false);
3. int Ergebnis aus den Parametern entfernen und den Methodenaufruf entsprechend ändern.

quasi:

int add(num1, num2) {
return num1 + num2;
}

Aufruf: cout << add(num1, num2) << endl;

EDIT: dass eigentliche Problem ist scheinbar ein anderes. Mit "cout << RechnenGeteilt << endl;" gibts Du die Adresse (oder irgendwas anderes) der Methode aus.

EDIT2: Bitte die Grundlagen lernen. Material:
- http://openbook.galileocomputing.de/c_von_a_bis_z/
- http://www.amazon.de/C-Objektorient...73/ref=sr_1_10?ie=UTF8&qid=1349169852&sr=8-10
 
Zuletzt bearbeitet:
Die Variablen Zahl1 und Zahl2 sind oben in der Funktion deklariert (oder wie man das auch immer nennt). Die ZahlA und ZahlB sind die Zahlen, die über "cin" Eingegeben werden, und dann als Variable benutzt werden.

@sasdensas
Das int Ergebnis ist da, weil das Ergebnis aus Zahl1 und Zahl2 besteht. Was wäre es dann, wenn Zahl1 + Zahl2; da steht?
Das false steht da (so kenne ich das ein wenig aus Java), dass Ergebnis nicht mitgewertet wird, oder sowas
 
Zuletzt bearbeitet:
Du musst das Ergebnis von Rechnen*** auch irgendwo zwischenspeichern oder direkt ausgeben.

Du bekommst jetzt nur die Adresse der Funktion ausgegeben.

Also entweder

PHP:
int Ergebnis = RechnenPlus( ZahlA, ZahlB, 0 );
cout << Ergebnis << endl;

Oder

PHP:
cout << RechnenPlus( ZahlA, ZahlB, 0 ) << endl;

Für die anderen natürlich genauso.

Weiterhin, kannst du Variablen in deiner Funktion deklarieren, du brauchst Variablen die du in der Funktion nutzen willst nicht im Funktionskopf angeben, da gehören nur die Eingabeparameter für die Funktion hin.

Also

PHP:
int RechnenPlus(int Zahl1, int Zahl2){
	int Ergebnis = Zahl1 + Zahl2;
	return Ergebnis;
};
 
Ergebnis ist nicht deklariert?

Und übergeben werden nur die Zahlen wie mein Vorredner schon sagt. Einfach komplett raus damit und dann Ergebnis in der Methode direkt als int deklarieren.
 
Du gibst die Adresse der Funktion aus, nicht aber dessen Ergebnis.

Mach mal aus:

RechnenMinus(ZahlA, ZahlB, false);
cout << RechnenMinus << endl;


cout << RechnenMinus(ZahlA, ZahlB, false) << endl;


Noch was:

Der jeweils 3. Parameter deiner Rechen-Funktionen ist Unfug.
Mach daraus:

int RechnenMinus(int Zahl1, int Zahl2)
{
return (Zahl1 - Zahl2);
};

Pass die anderen 3 Funkionen entsprechend an.
 
KnolleJupp schrieb:
Ich kann kein C++, aber einmal schreibst du als Variable "Zahl1", "Zahl2" und dann "ZahlA", "ZahlB"...

Man kann auch Zahl1 Zahl2 - Zahl2 Zahl1 schreiben.

Dann würde anschließend die Zahl1 auf der Variable Zahl2 liegen.
Die Reihenfolge der Variablen bleibt erhalten und der Typ sollte am Besten auch passen ^^ aber der name der übernommen wird ist schlicht egal.
 
Dass er einmal Zahl1 und Zahl2 und einmal ZahlA und ZahlB ist vollkommen egal, da es unterschiedliche Scopes sind in denen die Variablen stehen, die sind für sich und interessieren sich nicht gegenseitig.
Er nutzt ja nicht die Variablen die er oben im Funktionskopf angibt unten als Eingabe (was auch nicht ginge so wie es jetzt steht) :rolleyes:
 
Zuletzt bearbeitet:
Das ist mein jetziger überarbeiteter Code:
Code:
// Taschenrechner.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "stdio.h"
#include "windows.h"
#include "winuser.h"
#include "conio.h"
#include <iostream>

using namespace std;

int RechnenPlus(int Zahl1, int Zahl2){
	int Ergebnis = Zahl1 + Zahl2;
	return Ergebnis;
};
int RechnenMinus(int Zahl1, int Zahl2){
	int Ergebnis = Zahl1 - Zahl2;
	return Ergebnis;
};
int RechnenMal(int Zahl1, int Zahl2){
	int Ergebnis = Zahl1 * Zahl2;
	return Ergebnis;
};
int RechnenGeteilt(int Zahl1, int Zahl2){
	int Ergebnis = Zahl1 / Zahl2;
	return Ergebnis;
};

int _tmain(int argc, _TCHAR* argv[])
{
	int Operation;
	int ZahlA;
	int ZahlB;

	cout << "Wählen sire ihre Rechenoperation aus!" << endl;
	cout << "1. Plus" << endl << "2. Minus" << endl << "3. Mal" << endl << "4. Geteilt" << endl;
	cin >> Operation;
	if(Operation==1){ //Plus
		system("cls");
		cin >> ZahlA;
		cin >> ZahlB;
		int Ergebnis = RechnenPlus(ZahlA, ZahlB);
		cout << RechnenPlus << endl;
		system("pause");
	}
	if(Operation==2){ //Minus
		system("cls");
		cin >> ZahlA;
		cin >> ZahlB;
		int Ergebnis = RechnenMinus(ZahlA, ZahlB);
		cout << RechnenMinus << endl;
		system("pause");
	}
	if(Operation==3){ //Mal
		system("cls");
		cin >> ZahlA;
		cin >> ZahlB;
		int Ergebnis = RechnenMal(ZahlA, ZahlB);
		cout << RechnenMal << endl;
		system("pause");
	}
	if(Operation==4){ //Geteilt
		system("cls");
		cin >> ZahlA;
		cin >> ZahlB;
		int Ergebnis = RechnenGeteilt(ZahlA, ZahlB);
		cout << RechnenGeteilt << endl;
		system("pause");
	}
	
	
	_getch();
	return 0;
}
Es kommt immernoch das selbe raus. Oder bin ich einfach nur zu blöd abzutippen? Oo
 
Bitte nochmal alle Posts durchlesen, es steht gefühlte 10 mal drin. Hast das wichtigste nicht umgesetzt.
 
Auf

PHP:
	if(Operation==1){ //Plus
		system("cls");
		cin >> ZahlA;
		cin >> ZahlB;
		int Ergebnis = RechnenPlus(ZahlA, ZahlB);
		cout << RechnenPlus << endl;
		system("pause");
	}

Das anwenden was ich schrieb ->

PHP:
int Ergebnis = RechnenPlus( ZahlA, ZahlB, 0 );
cout << Ergebnis << endl;

Oder

PHP:
cout << RechnenPlus( ZahlA, ZahlB, 0 ) << endl;

Bisschen lesen und mitdenken ist schon gefragt.
 
ich würd versuche ganz schnell das programmieren mit java zu vergessen. Da geht vieles einfacher oder anders. schau dir lieber mal erst die grundlagen von c/c++ an.

mfg
 
hi,

bei der Division noch auf divison durch Null abchecken, sonst gibst ne böse Überraschung.

mfg martem
 
Okey, danke, hat geklappt.
@dracki
Nee, ich habe Java fast 4 Jahre gelernt...
 
Und dabei scheinbar keinerlei allgemeine Grundlagen gelernt oder wie man Programme selbst debuggt...
Ein Funktionsaufruf sieht auch in Java nicht anders aus, abgesehen davon, dass es immer eine Methode ist(static oder nicht), aber trotzdem rufst du sie von selbst ohne Parameter auf.
Das würdest du in Java doch eigentlich genauso wenig tun, wenn du das 4 Jahre lang gelernt hast.
 
Also ich kann nur betonen, Grundlagen lernen! Besorge dir ein Buch, oder schau dir Tutorials im Internet an!

Zu deinem Problem: Du gibst nach wie vor die Adresse der Funktion aus.

PHP:
int Ergebnis = RechnenGeteilt(ZahlA, ZahlB);
cout << RechnenGeteilt << endl;

RechenGeteilt ist die Funktion. Ohne Angabe von Parametern bekommst du die Adresse an der die Funktion im Speicher liegt. (Ich werde das nicht weiter ausführen, da das den Rahmen des Posts und des Themas bei weitem sprengen würde).

Was du also tun musst ist entweder das Ergebnis, wie du es ja dort eigentlich schon hast, in eine Variable speichern und diese Variable dann ausgeben, nicht die Funktion.

So:

PHP:
int ergebnis = RechnenGeteilt(ZahlA, ZahlB);
cout << ergebnis << endl;

Oder, du speicherst das Ergebnis gar nicht erst zwischen und gibst den Rückgabewert der Funktion gleich aus.

So:

PHP:
count << RechnenGeteilt(ZahlA,ZahlB) << endl;

@sasdensas: Zum "Kosmetik"-Kommentar. Ist völliger Quatsch. Es gibt Richtlinien in Firmen, ja, aber was wie gut aussieht ist äußerst subjektiv. Es gibt keinen wirklichen Vorteil zwischen "rechnenGeteilt" gegenüber "RechnenGeteilt". In C++ wird in der Regel ersteres genommen, während in C# z.B. zweiteres eher Verwendung findet. Ich würde allerdings auch hier die C# Variante bevorzugen, aber auch nur deshalb weil es mein ePräferenz ist und ich es durch C# gewohnt bin.
Aber so etwas bei einem Anfänger zu bemängeln ist wirklich unnötig und sorgt eher noch für Verwirrung. Am Ende glaubt er noch, dass es einen Unterschied macht und deshlab alles nicht geht.
Will dich da nun nicht persönlich angreifen. Ich wollte nur klarstellen, dass das Aussheen des Codes absolut subjektiv ist.

Edit: Oh, bisschen zu langsam getippt. Aber Tatsache. 4 Jahre eine Programmiersprache sollte ausreichen um diese Fehler oben gar nicht erst zu begehen. Da müsste man wirklich schnell verstehen können, wie etwas funktioniert. Ist ja schließlich kein heftiger Unterscheid zwischen Java und C++. Wäre es Haskell zu C++ oder C++ zu F#, okay. Aber so...
 
Zuletzt bearbeitet:
@Lukas97: will dir da nicht zu nahe treten, aber wenn man 4 Jahre Java gelernt hat, sollten die Grundlagen locker sitzen. Davon sieht man leider nichts. Auch wenn es ne andere Programmiersprache ist, die Grundlagen und Konzepte sind nahezu identisch. Besorg Dir am besten ne gute Literatur und fang nochmal von Vorne an.
Ergänzung ()

@Qudeid: mir ist schon klar, dass man den Code nach belieben ausschmücken kann. Man kann auch den gesamten Code in eine Zeile packen. Sobald jemand anderes den Code warten muss, ist spätestens dann Schluss. Konventionen sind da, damit sich möglichst alle dran halten. Jede Sprache und meinetwegen jede Firma hat seine Eigenen. Wenn ich aber sowas lese wie "RechnenPlus( ZahlA, ZahlB, 0 )" dann gehe ich davon aus, dass dies eine Objektinstanz und kein Methodenaufruf ist. Sind Methoden klein geschrieben mit Camelcase, so kann jeder dies auch sofort erkennen, dass es sich um eine Methode handelt. Klassen und Objekte sollten groß anfangen. Konstanten sollten komplett uppercase sein (da gibts aber sehr unterschiedliche Konventionen). Usw..
 
@sasdensas: Deine Präferenzen, das meinte ich ja :). Wobei sehr vieles heutzutage völlig überflüssig geworden ist. Allen voran ungarische Notation.
Aber für mich war dieser Aufruf zum Beispiel vollkomen klar eine Funktion, keine Objektinstanz. Kontext und Benennung machen auch viel aus. Aber es war kein Kritikpunkt dir gegenüber. Du erkennst es halt anders als ich. Aber genau darauf wollte ich hinaus. ;)

Wünsche noch einen schönen Tag!

Qudeid
 
Sorry, dass ich dir das mal sagen muss aber das ist heute schon der zweite Thread, den du erstellt hast, der mit einem absolut grundlegenden Problem im Verständnis von Programmiersprachen zu tun hat und darüberhinaus schonmal in einem anderen Thread beantwortet wurden. Erschwerend kommt noch hinzu, dass das erst vor ein paar Tagen war.

Denkst du wirklich, dass das der richtige Weg ist programmieren zu lernen?
 
Zurück
Oben