Problem mit Variablen in einem einfachen Programm.
-
Hallo

ich arbeite mich ktuell in C++ ein und habe bei einem kleinen Rechenprogramm einige kleine Probleme

Der Code:#include <iostream> using namespace std; const int MwstSatz = 19; int main() { float Netto, Steuer, Brutto; cout << "Geben sie einen Nettopreis ein: " << endl; cin >> Netto; Steuer = Netto * MwstSatz / 100; cout << "Der Bruttopreis ist wiefolgt: " << Brutto << endl; cin >> Brutto; // das ist nur ein Nutzloser Dummy, damit sich das Konsolenfenster nicht sofaor schließt. }also: 1. der Compiler (microsoft visual 2010) gibt mir diesen Fehler aus: Run-Time Check Failure #3 - The variable 'Brutto' is being used without being initialized.
Soviel ich weiß heißt das , dass sie keinem Wert zugewiesen ist aber ich verstehe nicht wieso das ein Fehler ist, da sie ja ausgegeben wird und außerdem auch in einer Eingabe Vorkommt...
2. wenn ich das Programm trotzdem starte bekomme ich bei einem eingegebenen Nettopreis von 100 einen Bruttopreis von -1.07374e+008 als ergebnis angegeben

waru ist das so? naja hoffentlich könnt ihr mir helfen...

-
An welcher Stelle weist du "Brutto" einen Wert zu?
-
Du musst der Variable 'Brutto' einen Startwert geben, das heisst initialisieren. Ansonsten hat die Variable irgend einen (oftmals sehr merkwuerdigen) Wert. Deshalb bekommst du dann auch ein so merkwuerdiges Ergebnis.
-
Wie immer: float ist der ungeeignetste Datentyp für Geld. Die vermeintliche Ähnlichkeit ist rein optisch, logisch ist ein sehr großer Unterschied.
-
SeppJ schrieb:
Wie immer: float ist der ungeeignetste Datentyp für Geld. Die vermeintliche Ähnlichkeit ist rein optisch, logisch ist ein sehr großer Unterschied.
Und welcher typ wäre passender?

-
int/unsigned int
-
icarus2 schrieb:
Du musst der Variable 'Brutto' einen Startwert geben, das heisst initialisieren. Ansonsten hat die Variable irgend einen (oftmals sehr merkwuerdigen) Wert. Deshalb bekommst du dann auch ein so merkwuerdiges Ergebnis.
Jo danke

-
benimus schrieb:
SeppJ schrieb:
Wie immer: float ist der ungeeignetste Datentyp für Geld. Die vermeintliche Ähnlichkeit ist rein optisch, logisch ist ein sehr großer Unterschied.
Und welcher typ wäre passender?

Man sollte auf cent-Basis rechnen (nicht einlesen umbedingt). Macht bei Programmierergehaelten sowieso mehr sinn

std::size_t cent;// Ein typedef auf einen vorzeichenlosen Skalar, definiert in <cstring> float eur; std::cin >> eur; cent = eur * 100;Edit: Rechtschreibfehler korrigiert

-
ich hätte erwähnen sollen, dass ich ein blutiger anfänger bin
bei so einem codebeispiel:std::size_t cent;// Ein typedef auf einen vorzeichenlosen Skalar, definiert in <cstring> float eur; std::cin >> eur; cent = eur * 100;saß ich so vor dem Rechner
ok, das meiste habe ich verstanden aber "size_t" und "<cstring>" ist mir nicht geläufig :P... egal
der überarbeitete Quellcode:#include <iostream> using namespace std; const int MwstSatz = 19; int main() { unsigned int Netto; unsigned int Brutto; unsigned int Steuer; cout << "Geben sie einen (positiven) Nettobetrag in Cent ein: " << endl; cin >> Netto; Steuer = MwstSatz * Netto / 100; Brutto = Netto + Steuer; cout << "Der Bruttopreis betraegt (bei " << MwstSatz << "% Mwst): " << Brutto << endl; cin >> Brutto; }funktioniert auch alles wie gewollt

-
benimus schrieb:
"size_t"
Anfaenger? Ich formuliere es mal so: **Ist dasselbe wie
unsigned int**benimus schrieb:
und "<cstring>" ist mir nicht geläufig

#include <cstring>
-
Sone schrieb:
benimus schrieb:
"size_t"
Anfaenger? Ich formuliere es mal so: **Ist dasselbe wie
unsigned int**benimus schrieb:
und "<cstring>" ist mir nicht geläufig

#include <cstring>size_t ist aus <cstddef>, nicht aus <cstring>
-
Sone schrieb:
std::size_t cent;// Ein typedef auf einen vorzeichenlosen Skalar, definiert in <cstring>Wie kommst du denn bitte auf size_t für Geld?
@benimus: cstring ist ein Header, der Deklarationen und Definitionen (hauptsächlich) zur Nutzung der Stringoperationen der C-Standardlibrary enthält. Unter anderem eben auch den Typ size_t. Dieser wird meist für Größenangaben von Speicherbereichen genutzt (z.B. eben bei memcpy aus cstring) und ist auch der Ergebnistyp des sizeof-Operators.
Brauchst du hier aber imho alles nicht.
-
IrgendeinName schrieb:
Sone schrieb:
benimus schrieb:
"size_t"
Anfaenger? Ich formuliere es mal so: **Ist dasselbe wie
unsigned int**benimus schrieb:
und "<cstring>" ist mir nicht geläufig

#include <cstring>size_t ist aus <cstdlib>, nicht aus <cstring>
Nein, es ist aus cstring!
size_t ist ein Groessentyp. Die Anzahl von Cents ist eine Groesse.

Edit: Ausserdem braucht man
<cstring>fuersize_tfast nie einzubinden, da das die meisten anderen Header schon machen...
-
IrgendeinName schrieb:
size_t ist aus <cstdlib>, nicht aus <cstring>
Zumindest meine POSIX-Manpage sagt dazu:
The <string.h> header shall define the following: NULL Null pointer constant. size_t As described in <stddef.h> .Bezweifle, dass sich C++ hier unterscheidet. Tatsächlich müssen aber sowohl stdlib.h, als auch string.h (neben stddef.h) den size_t-Typedef verfügbar machen.
-
Sone schrieb:
benimus schrieb:
"size_t"
Anfaenger? Ich formuliere es mal so: **Ist dasselbe wie
unsigned int**benimus schrieb:
und "<cstring>" ist mir nicht geläufig

#include <cstring>ok, und das mit <cstring> war mir klar, ich weiß nur nicht, was das bewirkt :p
-
Wenn du Zeit hast, studiere folgenden Code (dein Code sollte so aussehen):
#include <iostream> #include <limits> #include <iomanip> #include <complex> const float MwstSatz = 0.19; const size_t CentsInEur = 100; int main() { size_t Nettoct, Steuerct, Bruttoct; std::cout << "Geben sie einen Nettopreis ein: \n"; {//Eingabe float ct; while(!(std::cin >> ct)) { std::cout << "Bitte richtig machen, doedel!\n"; std::cin.clear(); //Stream zuruecksetzen std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' ); } Nettoct = ct * CentsInEur; } Steuerct = Nettoct * MwstSatz; // Muss das gepuffert werden... ? Bruttoct = Nettoct + Steuerct; float BruttoEur = static_cast<float>(Bruttoct) / CentsInEur;//Hier wird Brutto in Cent wieder in Euro umgewandelt std::cout << "Der Bruttopreis ist wiefolgt: " //Ausgabe << std::setprecision( std::log10(BruttoEur) + 1 + std::log10(CentsInEur) ) //Wir wollen 2 Nachkommastellen, also sagen wir das << BruttoEur << '\n'; std::cin.get(); }Wenn du besonders viel Zeit hast, bastele noch ein/zwei Klassen, die das alles koennen!
Schoener gingen die globalen Konstanten natuerlich mit
std::ratio.
-
Sone schrieb:
Wenn du Zeit hast, studiere folgenden Code (dein Code sollte so aussehen):
#include <iostream> #include <limits> #include <iomanip> #include <complex> const float MwstSatz = 0.19; const size_t CentsInEur = 100; int main() { size_t Nettoct, Steuerct, Bruttoct; std::cout << "Geben sie einen Nettopreis ein: \n"; {//Eingabe float ct; while(!(std::cin >> ct)) { std::cout << "Bitte richtig machen, doedel!\n"; std::cin.clear(); //Stream zuruecksetzen std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' ); } Nettoct = ct * CentsInEur; } Steuerct = Nettoct * MwstSatz; // Muss das gepuffert werden... ? Bruttoct = Nettoct + Steuerct; float BruttoEur = static_cast<float>(Bruttoct) / CentsInEur;//Hier wird Brutto in Cent wieder in Euro umgewandelt std::cout << "Der Bruttopreis ist wiefolgt: " //Ausgabe << std::setprecision( std::log10(BruttoEur) + 1 + std::log10(CentsInEur) ) //Wir wollen 2 Nachkommastellen, also sagen wir das << BruttoEur << '\n'; std::cin.get(); }Wenn du besonders viel Zeit hast, bastele noch ein/zwei Klassen, die das alles koennen!
Schoener gingen die globalen Konstanten natuerlich mit
std::ratio.öhm, danke...

-
Ist zum lernen. Geh Zeile fuer Zeile durch und schlag in der Referenz nach. Bei Fragen, frag hier im Thread oder mach einen zweiten auf.
Edit: Zeile 21 ist wirklich etwas kompliziert. Ueberspring die erstmal.
-
Sone schrieb:
benimus schrieb:
"size_t"
Anfaenger? Ich formuliere es mal so: **Ist dasselbe wie
unsigned int**Anfänger?
Ja, du bist ein Anfänger. Deine Behauptung ist falsch. Dein inflationäres Geplapper spiegelt Anfängeraberglauben und naives Unverständnis bei Grundlagen zu C bzw. C++ wider.
-
size_t wird in <cstio>, <cstdlib>, <cstring> und <ctime> deklariert.
Sone schrieb:
size_t ist ein Groessentyp. Die Anzahl von Cents ist eine Groesse.

Nicht jeder mit einer Erleuchtung ist auch ein Prophet. Die meisten sind bloss Spinner.
Sone schrieb:
Edit: Ausserdem braucht man
<cstring>fuersize_tfast nie einzubinden, da das die meisten anderen Header schon machen...Keiner der anderen Standardheader bindet <cstring> ausdrücklich ein. Zudem ist "fast nie" gerade kein Grund, einen benötigten Header auszulassen.
-
Wutz schrieb:
Deine Behauptung ist falsch.
*lol*
Folgendes steht in einem Standardheader von MinGW (GCC 4.6.2):
#ifdef _WIN64//Ausnahme _ _MINGW_EXTENSION typedef unsigned __int64 size_t; #else typedef unsigned int size_t; #endif /* _WIN64 */Klar ist das im Standard nicht garantiert. Aber es einem Anfaenger so genau zu machen ist laecherlich unnoetig.
size_t ist ein Groessentyp. Die Anzahl von Cents ist eine Groesse.
Nicht jeder mit einer Erleuchtung ist auch ein Prophet. Die meisten sind bloss Spinner.
Ich sehe nach wie vor kein Problem, fuer eine Anzahl
size_tzu verwenden. Klar war meine Formulierung bescheuert. Trotzdem sehe ich kein Problem.Edit: Ausserdem braucht man <cstring> fuer size_t fast nie einzubinden, da das die meisten anderen Header schon machen...
Keiner der anderen Standardheader bindet <cstring> ausdrücklich ein.
Mit "das" meinte ich,
size_tdeklarieren. Edit: Jup, ich muss mich anders ausdruecken.
Denn bspw. binde ich <iostream>, <string> o. ae. ein, ist size_t deklariert. Ich musste noch nie wegen size_t explizit einen deiner genannten Header einbinden.