If - Abfrage wird übersprungen
-
oh, das hab ich übersehen, hab es aber geändert und es funltioniert nicht. wenn ich <iostream> statt <iostream.h> erkennt mein Compiler (borland)
die cin und cout befehle nicht. Daran kann es also auch nicht liegen.
-
Hallo
entweder du schriebst vor jedes cin und cout nun ein std::, also std::cin oder std:: cout oder du schreibst am Anfang des Programmes :
using namespace std;chrische
-
Hurricane schrieb:
...Daran kann es also auch nicht liegen.
Das stimmt wohl.
EDIT: Da war chrische mal wieder schneller ;):
Trotzdem ist iostream (ohne .h) die richtge Wahl.
Da dort cout und cin im namespace std liegen, musst Du das dem Compiler mitteilen:chrische5 schrieb:
...
entweder du schriebst vor jedes cin und cout nun ein std::, also std::cin oder std:: cout oder du schreibst am Anfang des Programmes :using namespace std;chrische
ODER (IMO oftmals besser):
using std::cin; using std::cout;Gruß,
Simon2.
-
Erstmal zur allgemeinen Struktur:
- Variablen kannst du auch innerhalb einer Funktion definieren, die brauchst du nicht als Parameter vom Hauptprogramm anzufordern (betrifft vor allem 'tag_geburt' in februar() und 'alter' in func() (btw, ein unsinniger Name))
- Du verwendest den selben Code ständig wieder - da wäre es angebracht, das in eine Funktion auszulagern:
int tag_eingabe(int max_tag,const string& prompt) { int tag=0; while(tag<1||tag>max_tag) { cout<<prompt; cin>>tag; } return tag; } if (monat_geburt==1 || monat_geburt==3 || monat_geburt==5 || monat_geburt==7 || monat_geburt==8 || monat_geburt==10 || monat_geburt==12) tag_geburt=tag_eingabe(31,"Bitte den Tag Ihrer Geburt angeben"); else if (monat_geburt == 2) tag_geburt=tag_eingabe(28,"Bitte den Tag Ihrer Geburt angeben");//hier eventuell noch Schaltjahre auswerten else tag_geburt=tag_eingabe(30,"Bitte den Tag Ihrer Geburt angeben");- Wozu hast du die Funktion func() überhaupt definiert, wenn du ihre Arbeit dann doch im Hauptprogramm von Hand erledigst?
- deine if()-Kaskade am Schluß könntest du zu einem einzelnen if() mit einer ver-undeten Bedingung zusammenfassen (besonders weil die else-Zweige alle gleich aussehen)
- ...
(Zu deinem Problem hat ja Z2 schon etwas gesagt - da du den Monat schon vorher eingegeben hast, wird die Schleife direkt übersprungen)
-
Ok, das mit dem
using namespace std;fuktioniert.
Aber der Rest geht immer noch nicht
-
Hallo
Das sieht nett aus, aber ich schreibe immer std::cin, ... Schon allein, weil man ja im Header so etwas wie using namespace nicht schreiben soll.
chrische
-
Hi,
ich habe bis vor Kurzem auch immer mit voll qualifizierten Namen gearbeitet .... bis mir auffiel, dass ich mir damit die Möglichkeit nehme, später die Namen aus anderen Namespaces aufzulösen (was ja ein wichtiges Feature der ganze Sache ist).
Seitdem qualifiziere ich nicht mehr voll, damit ich später festlegen kann, was ich aus welchem namespace haben möchte....und ggf. für einzelne Namen (oder eben alle) auch wechseln kann.
Gruß,
Simon2.
-
@cstoll
Hey Danke, aber die Konstante mit string&prompt, das verstehe ich noch nicht so ganz
-
Hallo
Simon2 schrieb:
Hi,
ich habe bis vor Kurzem auch immer mit voll qualifizierten Namen gearbeitet .... bis mir auffiel, dass ich mir damit die Möglichkeit nehme, später die Namen aus anderen Namespaces aufzulösen (was ja ein wichtiges Feature der ganze Sache ist).
Seitdem qualifiziere ich nicht mehr voll, damit ich später festlegen kann, was ich aus welchem namespace haben möchte....und ggf. für einzelne Namen (oder eben alle) auch wechseln kann.
Gruß,
Simon2.
Wenn ich ehrlich bin, verstehe ich das nicht. Kannst du das mal an einem Beispiel zeigen.
chrische
-
Hurricane schrieb:
@cstoll
Hey Danke, aber die Konstante mit string&prompt, das verstehe ich noch nicht so ganzNaja, du brauchst die selbe Funktion eine Ebene tiefer noch, um den aktuellen Tag angeben zu können (und eigentlich ist die Funktion sogar zur Eingabe der Monate geeignet), also bekommt sie einen String übergeben, wie sie zur Eingabe auffordern soll (beim aktuellen Datum übergibst du dann "Bitte den heutigen Tag angeben").
(std::string ist der C++ Weg, um Zeichenketten zu verarbeiten - das verwende ich aus Gewohnheit, anstelle mit char* rumzubasteln)
-
chrische5 schrieb:
Wenn ich ehrlich bin, verstehe ich das nicht. Kannst du das mal an einem Beispiel zeigen.
Ich glaube er meint sowas:
// foo.cpp #include <algorithm> using std::find_if; // version 2 // foo.cpp //#include <algorithm> #include "foo_algo.hpp" //using std::find_if; using foobar::find_if;
-
@cstoll
Also Danke erstmal es funtkioniert jetzt, hab es ein bisschen auf meine art umgemodelt, der trick war es den tag in der eingabe funktion auf NUll zu setzen.
aber warum? das verstehe ich noch nicht so ganz
-
Lokale Variablen sind beim Anlegen uninitialisiert (d.h. irgendein Wert kann darin stehen) und wenn du dann eine vorabweisende Schleife benutzt ,z.B. while(x < 0){}, kann es passieren, daß diese Schleife niemals durchlaufen wird.
-
finix schrieb:
chrische5 schrieb:
Wenn ich ehrlich bin, verstehe ich das nicht. Kannst du das mal an einem Beispiel zeigen.
Ich glaube er meint sowas:
// foo.cpp #include <algorithm> using std::find_if; // version 2 // foo.cpp //#include <algorithm> #include "foo_algo.hpp" //using std::find_if; using foobar::find_if;Jupp !
Wesentlich ist, dass im "eigentlichen Code" nichts mehr zu ändern ist. Sonst musst Du bei jeder Verwendung von find_if (in diesem Beispiel) "std::find_if" durch "foobar::find_if" ersetzen musst.
Besonders lästig, wenn es in vielen unterschiedlichen Modulen ist (die evtl. alle Deinen Header mit der using-Clause einbinden).Gruß,
Simon2.