Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
16.12.2002, 22:00
Worldcraft Loser



Hi zusammen.

Also ich hab vor ca 4 Tagen angefangen C++ zu lernen.
Und heute wollte ich mal was eigenes machen als die Vorlagen abzutippen.
So also hab ich mir gedacht einen Taschenrechner.
Ok gesagt getan.
Aber jetzt hab ich ein problem:
Also ich habe eine Menü auswahl nach dem Prinzip:
1.Addition
2.Sub...

So aber wen ich 2 drücke kom ich trotzdem in Additions verfahren.
So poste auch mal den code womit ihr wahrscheinlich mehr anfangen könnt:

#include <iostream.h>
void main()
{
float const limit=0;
float rechenart;
float zahl1;
float zahl2;

cout<<"Bitte wähle deine Rechenart: "<<endl;
cout<<"1.Addition "<<endl;
cout<<"2.Subtraktion "<<endl;
cout<<"3.Multiplikation "<<endl;
cout<<"4.Division "<<endl;
cin>>rechenart;

if(rechenart=limit+1)
cout<<"Bitte geben Sie die erste Zahl ein: "<<endl;
cin>>zahl1;
cout<<"Bitte geben Sie die zweite Zahl ein: "<<endl;
cin>>zahl2;
cout<<"Ergebnis: "<<zahl1+zahl2<<endl;

if(rechenart=limit+2)
cout<<"Bitte geben Sie die erste Zahl ein: "<<endl;
cin>>zahl1;
cout<<"Bitte geben Sie die zweite Zahl ein: "<<endl;
cin>>zahl2;
cout<<"Ergebnis: "<<zahl1-zahl2<<endl;


if(rechenart=limit+3)
cout<<"Bitte geben Sie die erste Zahl ein: "<<endl;
cin>>zahl1;
cout<<"Bitte geben Sie die zweite Zahl ein: "<<endl;
cin>>zahl2;
cout<<"Ergebnis: "<<zahl1*zahl2<<endl;


if(rechenart=limit+4)
cout<<"Bitte geben Sie die erste Zahl ein: "<<endl;
cin>>zahl1;
cout<<"Bitte geben Sie die zweite Zahl ein: "<<endl;
cin>>zahl2;
cout<<"Ergebnis: "<<zahl1/zahl2<<endl;

};

Danke schonmal im vorraus!

Worldcraft Loser

€dit:
Das Thw board hat das alles umformatiert...

--

(\_/)
(O.o)
(> < ) This is Bunny. Copy Bunny into your signature to help him on his way to world domination!


Dieser Beitrag wurde am 16.12.2002 um 22:01 von Worldcraft Loser bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
001
16.12.2002, 22:14
gerk



Quellcode:if(rechenart=limit+1)

hoppla..

es muss Quellcode:if(rechenart==limit+1)
heißen.

-)mal abegesen davon, was soll das mit dem limit? Das kannst du weglassen und nur auf die zahl hin überprüfen.

des weiteren muss es
Quellcode:
const float limit = 0.0f;

heißen, weil du sonst einen float mit einem konstanten wert hast, den man in andre typen casten kann (,wenn ich mich nicht irre)

Das Suffix 'f' muss dahin, weil der Compiler sonst einen double draus macht.

-)Deine if-blöcke müssen in geschwungene klammern ({}) eingeschlossen sein, sonst hat das ganze wenig sinn.

-)Die klammer weglassen kannst du nur, wenn du nur eine anweisung hast.

-)Als nächstes: warum deklarierst du immer floats? für die menü-auswahl würde es (zb) ein short auch tun.

-)UND, wie man im Gameprogramming-Forum nachlesen kann, muss es laut Standard int main() heißen und demensprechend ein return 0; ans ende.

So, ich hoffe, ich habe dir ein wenig geholfen, und nicht allzu viel mist gepostet :)

Greets,
Lag

--

„Und da wir uns ja seit heute etwas näher gekommen sind, kann ich nur sagen: Mir hilft da immer Norther volle Lautstärke (so wie jetzt), sodass die ganzen unrasierten, Wasserpfeife rauchenden, alternativen Wichsstudenten aus ihren, aus Bananenschalen und Abfall gebastelten, Sitzkissen fliegen.“


Dieser Beitrag wurde am 16.12.2002 um 22:15 von Lag of death bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
002
16.12.2002, 22:18
Tron



= ist zuweisung, das sollte == heissen

zudem:
- den header iostream verwenden (ohne .h)
- main als int main() deklarieren
- was soll limit?
- die variable fuer die auswahl sollte int sein und nicht float
- statt if ... if ... if ... switch verwenden
- die zu dem jeweiligen if gehoerenden befehle in { } einschliesen, sonst gehoert nur der befehl unmittelbar nach dem if zum if und alles weitere wird immer ausgefuehrt

<edit>
arg... ich hab hatte mehr lag als lag (;

btw: es gibt das <code></code> tag, natuerlich mit eckigen klammern

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett


Dieser Beitrag wurde am 16.12.2002 um 22:19 von Tron bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
003
16.12.2002, 22:19
Worldcraft Loser



Ja hab bisher nur von void main() gehört.

Aber danke mus ich morgen mal schaun mus jetzt pennen schreib morgen ne arbeit.

Aber danke

--

(\_/)
(O.o)
(> < ) This is Bunny. Copy Bunny into your signature to help him on his way to world domination!

zum Seitenanfang zum Seitenende Profil || Suche
004
17.12.2002, 00:30
CorDharel



Das ist kein "void main" sondern ein "void" und ein "main" :)

Ne will heissen, main ist der Name der Funktion, und void der Rückgabewert der Funktion. main kommt nur einmal pro Programm vor, da jede Funktion einen eigenen Namen hat, aber einen Rückgabewert hat jede Funktion, darum auch "int main", d.h. die Funktion hat eine Variable vom Typ "int" als Rückgabewert.

--

Greetz CorDharel

Leader der HolyShitBastards


Dieser Beitrag wurde am 17.12.2002 um 00:31 von CorDharel bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
005
17.12.2002, 05:59
K-Putt



@Tron: Was für ein unterschied besteht denn zwischen
Quellcode:
#include <iostream.h>
und
#include <iostream>

--

Rambo Engineer @ Drippy's 2fort - finest TFC 1.5 || Bild Upload || The world's most advanced open source database

zum Seitenanfang zum Seitenende Profil || Suche
006
17.12.2002, 06:40
Tron



Zitat:
CorDharel postete
Das ist kein "void main" sondern ein "void" und ein "main" :)

Ne will heissen, main ist der Name der Funktion, und void der Rückgabewert der Funktion. main kommt nur einmal pro Programm vor, da jede Funktion einen eigenen Namen hat, aber einen Rückgabewert hat jede Funktion, darum auch "int main", d.h. die Funktion hat eine Variable vom Typ "int" als Rückgabewert.

hae?
natuerlich ist es auch erlaubt funktionen mit dem void, also keiner rueckgabe, zu deklarieren. frueher war das auch bei main erlaubt, ist aber, zumindest in c++ misbilligt (engl.: deprecated).

Zitat:
K-Putt postete
@Tron: Was für ein unterschied besteht denn zwischen
Quellcode:
#include <iostream.h>
und
#include <iostream>

die alten standardheader sind in c++ ebenfalls misbilligt, immer die .h-lose version verwenden.
allerdings habe ich versaeumt zu erwaehnen, dass sich dann die zur verfueugung gestellten symbole (funktionen/klassen/...) im namespace std befinden, also statt z.b. cout muss es dann std::cout heissen, falls es keine namenskonflikte (name clash) mit eigenen symbolen gibt, kann man per using namespace std auch alle symbole aus std dem eigenen namespace hinzufuegen.

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
007
17.12.2002, 09:07
the_viking



wofür sind eigendlich namespaces gut bzw. wie kann man eigene machen??

--

thx, cu, MfG the_viking

(( My =]=H=O=M=E=> Page! ))
Coder bei Brainshock-Interactive und bei Z-Software
My ICQ: #160959446

zum Seitenanfang zum Seitenende Profil || Suche
008
17.12.2002, 09:25
Hessie J.



Wenn man mehrere Klassenbibliotheken benutzt, kann es ja sein, dass darin gleiche Namen verwendet werden, deshalb "packt" man jede Bibliothek in ihren eigenen Namespace (die Standard-C-Library eben in std).

Eigene namespaces kann man per

namespace mein_namespace { eigene_deklarationen; }

aufbauen.

--


Dieser Beitrag wurde am 17.12.2002 um 09:25 von Hessie J. bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
009
17.12.2002, 10:08
Kriz



@Tron: Naja, ob man nun die normalen Headers nimmt oder die C++ Varianten ist doch vollkommen wurscht. Nur bei merkwürdigsten Projekten, wo irgendein hodenkrebsverseuchter Spacko gemeint hat, er müßte seine eigene iostream Klassenhierarchie entwickeln, wäre es ratsam, die C++ Variante mit dem std Namensraum zu verwenden (außer dieser Spacko hat sein iostream ebenfalls in den std namensraum gepackt)...

Die meisten Gesichtsmutanten dieser Welt wissen ja noch nicht mal, daß es neben den ANSI-C Headers auch C++ konforme Gegenstücke gibt, die ebenfalls ohne das .h eingebunden werden können:

<stdlib.h> === <cstdlib>
<stdef.h> === <cstddef>
usw.

Nur bei solchen Dingelchens wie <string.h> gibt es <string> als Klassenimplementierung. Soviel dazu.

--------------------------------------------------------------------------

Nun gut, für 4 Tage C++ nicht übel. Aber aus den Kommentaren kannst du entnehmen, daß man vieles anders machen und verbessern kann. Ich bin mal so frei und bastel dir mal eine kompakte und effizientere Version deines Programms. Und damit Trönelchen (muhahaha *ggg*, hört sich an wie Träne oso =) keinen Gehirnkrampf bekommt, nehme ich mal die reine C++ Variante und verzichte mal auf das cpp-Tag wegen den fehlenden Linefeeds (möge DP in der Linefeed-Hölle schmoren!!!):

#include <iostream>
using namespace std;

void eingabeOperanten(double &refOperant1, double &refOperant2);
double addieren(double operant1, double operant2);
double subtrahieren(double operant1, double operant2);
double multiplizieren(double operant1, double operant2);
double dividieren(double operant1, double operant2);

int main()
{
short auswahl;
double operant1 = 0.0, operant2 = 0.0;
double ergebnis = 0.0;
bool beenden = false;

do
{
cout << "\n\nTaschenrechner"
<< "\n\nBitte waehle deine Rechenart:"
<< "\n\n(1) Addition"
<< "\n(2) Subtraktion"
<< "\n(3) Multiplikation"
<< "\n(4) Division"
<< "\n(0) BEENDEN";
<< "\n\nAuswahl (0-4)? ";

cin >> auswahl;

switch(auswahl)
{
case 1:
eingabeOperanten(operator1, operator2);
ergebnis = addieren(operator1, operator2);
break;
case 2:
eingabeOperanten(operator1, operator2);
ergebnis = subtrahieren(operator1, operator2);
break;
case 3:
eingabeOperanten(operator1, operator2);
ergebnis = multiplizieren(operator1, operator2);
break;
case 4:
eingabeOperanten(operator1, operator2);
ergebnis = dividieren(operator1, operator2);
break;
default:
beenden++;
break;
}

cout << "\n\nErgebnis = " << ergebnis << flush;

}while(!beenden);

return 0;
}

void eingabeOperanten(double &refOperant1, double &refOperant2)
{
cout << flush << "\n\nErster Operant? ";
cin >> refOperant1;
cout << flush << "\nZweiter Operant? ";
cin >> refOperant2;
}

double addieren(double operant1, double operant2)
{
return (operant1 + operant2);
}

double subtrahieren(double operant1, double operant2)
{
return (operant1 - operant2);
}

double multiplizieren(double operant1, double operant2)
{
return (operant1 * operant2);
}

double dividieren(double operant1, double operant2)
{
if(operant2==0.0L)
{
cerr << flush << "\a\n\nFEHLER: Zweiter Operator ist 0!";
return 0.0;
}
else return (operant1 / operant2);
}

-------------------------------------------------------------------------

Funktionen dürften klar sein. Sie werden VOR main() deklariert und meistens erst nach dem main()-Block implementiert.

Das & in der Funktion eingabeOperanten() bedeutet, daß eine REFERENZ der beiden double-Werte an die Funktion übergeben werden ("Call by reference"). Dadurch wird innerhalb der Funktion nicht mit Kopien von operant1 und operant2 gearbeitet, sondern direkt mit den Variablen. Somit können beide Variablen verändert werden. Bei Kopien geht das nicht, dort werden nur die Kopien verändert und nicht das Original. Alternativ hätte man auch anstatt Referenzen auch mit Zeigern arbeiten können:

void eingabeOperanten(double *ptrOperant1, double *ptrOperant2) {...}

Dann hätte man aber etwas mehr Arbeit, denn die Zeiger müssten erstmal dereferenziert werden, um an deren Werte ranzukommen (Zeiger beinhalten in erster Linie Variablenadressen und keine Werte!). Daher die Referenzvariante!

Den logische Wert beenden kann man, sofern er auf false gesetzt ist, mit dem Postinkrement-Operator ++ auf true setzen: beenden++;. Alternativ hätte man auch schreiben können: beenden = true; Allerdings kann man ihn nicht mit beenden--; von true wieder auf false dekrementieren!!!

cout << flush bedeutet, daß der Zeichenpuffer des Streams geleert wird. Damit umgehe ich das Problem, daß nach einem cin >> Variable das zwischengepufferte Linefeed ('\n') des Returntasten-Drucks im Stream verbleibt und beim nächsten cin >> Variable automatisch verwendet wird. Alternativ hätte man nach jedem cin >> Variable auch sofort den nachfolgenden Befehl cin.get(); setzen können. Die Variante mit flush ist aber irgendwie eleganter.

Zur Auswahl der Funktion habe ich anstatt der if()-Abfragen eine gemeinsame switch()-Auswahl genommen. Jeder case-Eintrag bedeutet dabei einen Prüfpunkt, wo das Programm prüft, ob auswahl mit dem Wert hinter case übereinstimmt. Ist dies der Fall, führt das Programm die Anweisungen hinter case aus, ansonsten wird zum nächsten case-Prüfpunkt gesprungen. Das abschließende default bedeutet, daß switch immer dorthin springt, wenn alle vorhergehenden case-Prüfpunkte keinen Treffer liefern konnten. In unserem Falle würde das für auswahl == 0 zutreffen, also BEENDEN. Dann wird die Statusvariable beenden auf true gesetzt. Die break's in den case-Abschnitten bedeutet, daß definitiv aus switch() rausgesprungen wird, falls ein case (oder manchmal auch default) Prüfpunkt zutrifft. Würde das break fehlen in jedem case Prüfpunkt, dann würde switch() einfach immer weiter bis zum Ende von switch() alle case's durchgehen.

Alles ist eingepackt in einer dicken do-while() Schleife, die als Abbruchsbedingung die logische Variable beenden besitzt. Solange beenden immer false ist, wird die Schleife wiederholt. Erst wenn man 0 eingibt, wird beenden auf true gesetzt und die Schleife bricht ab.

Naja, viel Spaß beim Erlernen von C++. Geh alles Schritt für Schritt durch und versuche auch ernsthaft zu verstehen, was wie warum geht. Später bei der objektorientierten Programmierung mit Klassen, Objekten und Instanzen solltest du die C++ Grundwerkzeuge annähernd perfekt beherrschen!

Cu

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)


Dieser Beitrag wurde am 17.12.2002 um 10:13 von Kriz bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
010
17.12.2002, 15:17
Ornest



[ot]
Hahaha, von wegen "Agraarbiologe schreibt man mit einem 'a' du Bauer" ...
Operand schreibt man mit D, Opa ;)

http://www.fremdwoerter.de
[/ot]

--

zum Seitenanfang zum Seitenende Profil || Suche
011
17.12.2002, 18:15
Fraghunter



@Kriz
übertreiben muss man's aber nicht :D
Du bruachst den armen jungen, der einen Rechner machen will doch nicht gleich mit Funktionen überhäufen. Ich glaube kaum, dass er da so viel von hat. Wie hast du doch selber gesagt?
"Naja, viel Spaß beim Erlernen von C++. Geh alles Schritt für Schritt durch"

--

Nihil timeo, nulla re opprimor, nulli periculo cedo.
www.TheDoenerKing.de

zum Seitenanfang zum Seitenende Profil || Suche
012
17.12.2002, 20:26
mani



ich glaube er meinte damit seinen code

--

zum Seitenanfang zum Seitenende Profil || Suche