If - Abfrage wird übersprungen



  • Der Code sieht ja grauenhaft aus. Da gibt es einige Möglichkeiten, das zusammenzufassen (und damit wird's vermutlich auch so übersichtlich, daß du den Fehler selber findet).

    PS: sfds
    (und bevor du den Beitrag nicht beachtest, wird wohl kaum einer sich deinen Quelltext näher ansehen)



  • oh das wusste ich nicht. der sieht bei mir aber auch irgendwie anders aus. Danke für den Hineweis.
    Also nochmal.

    #include <iostream.h> 
    int func (int, int, int); // Funktion für die Berechnung des Alters 
    int februar(int); 
    int main () 
    { 
       int jahr_geburt, monat_geburt, tag_geburt, jahr_aktuell, monat_aktuell, tag_aktuell, alter; 
    
      cout << "\nHier bitte Ihr Geburtsjahr eingeben: "; 
      cin >> jahr_geburt; 
    
    while(monat_geburt > 12 || monat_geburt < 1) // Beschränkung der Monatseingabe 
    { 
     cout << "\nHier bitte den Monat eingeben in dem Sie geboren wurden: "; 
     cin >> monat_geburt; 
    } 
    
    if (monat_geburt == 1 || monat_geburt == 3 || monat_geburt == 5 || monat_geburt == 7 || monat_geburt == 8 || monat_geburt == 10 || monat_geburt == 12) 
    { 
       while(tag_geburt > 31 || tag_geburt < 1) 
          { 
            cout << "\nHier bitte den Tag eingeben an dem sie Geboren wurden: "; 
            cin >> tag_geburt; 
          } 
    } 
    
    else if (monat_geburt == 2) 
    
    { 
        tag_geburt = februar (tag_geburt); 
    } 
    
    else 
    { 
        while(monat_geburt > 30 || monat_geburt < 1) 
             { 
                  cout << "\nHier bitte den Tag eingeben an dem sie Geboren       wurden: "; 
    cin >> tag_geburt; 
             } 
    } 
    
    cout << "\nHier bitte das aktuelle Jahr eingeben: "; 
    cin >> jahr_aktuell; 
    
    while(monat_aktuell > 12 || monat_aktuell < 1) 
     {  
         cout << "\nHier bitte den aktuellen Monat eingeben: "; 
         cin >> monat_aktuell; 
    } 
    
    cout << "\nHier bitte den aktuellen Tag eingeben: "; 
    cin >> tag_aktuell; 
    
    if (monat_geburt >= monat_aktuell) // Überprüfung ob der User im aktuellen Jahr schon Geburtstag hatte 
     if (tag_geburt >= tag_aktuell) 
      if (monat_geburt == monat_aktuell)  
       if (tag_geburt == tag_aktuell) 
          { 
           alter = jahr_aktuell - jahr_geburt; 
           cout << "\nHerzlichen Gl\x81 \bckwunsch zu Ihrem " << alter << ".  Geburtstag. Ich w\x81nsche Ihnen alles Gute "<<endl; 
    return 0; 
    } 
    
       else 
          { 
            alter = (jahr_aktuell - jahr_geburt) - 1; 
          } 
      else 
       { 
         alter = (jahr_aktuell - jahr_geburt) - 1; 
       } 
     else 
       { 
          alter = (jahr_aktuell - jahr_geburt) - 1; 
       } 
    else 
     { 
       alter = func (jahr_aktuell, jahr_geburt, alter); 
     } 
       cout << "\nSie sind " << alter << " Jahre alt."<<endl; 
       return 0; 
     } 
    
    //----------------------------------------------------------------------------------------------------------------------------------------------------------- 
    
    int func (int jahr_aktuell, int jahr_geburt, int alter) 
    { 
      alter = jahr_aktuell - jahr_geburt; 
      return alter; 
    
    } 
    
    //----------------------------------------------------------------------------------------------------------------------------------------------------------- 
    
    int februar(int tag_geburt) 
    { 
       while(tag_geburt > 28 || tag_geburt < 1) 
         { 
              cout << "\nHier bitte den Tag eingeben an dem sie Geboren wurden: "; 
              cin >> tag_geburt; 
         } 
    return tag_geburt; 
    } 
    
    //-----------------------------------------------------------------------------------------------------------------------------------------------------------
    


  • while(monat_geburt > 30 || monat_geburt < 1)
    

    soll ja wohl eher tag_geburt sein, oder? (Zeile 35)

    Und den Header <iostream.h> gibt es (im Standard) nicht. Der heißt <iostream>.



  • 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 ganz

    Naja, 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.


Anmelden zum Antworten