Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Erstes if-else Programm

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ]
000
22.10.2016, 18:05 Uhr
~CNoob
Gast


Hallo Leute!
Befinde mich am Anfang meines Informatik Studiums und soll ein Programm schreiben dass verschiedene Datumsangaben vergleichen, und ausgeben soll wie sie sich zueinander verhalten.
Das ist mein erstes If-else Konstrukt und ich verstehe nicht so genau woran es liegt das es nicht funktioniert. Leider geben die Skripts meines Professors mir auch Klarheit was nicht stimmen könnte.
Habe schon viel mit der Reihenfolge etc. rumgespielt aber das höchste der Gefühle war, das eins der drei Enden korrekt ablief. Meine Vermutungen sind, das ich entweder eine komplett falsche Reihenfolge gewählt habe, ein else if Befehl fehlt (und) oder am letzten if etwas mit den && nicht stimmt.
(Obwohl ich das schon mit Kommata versucht habe, was logischerweise auch nicht richtig klappt)
Wäre für Anregungen, Hinweise und Hilfe dankbar!


Code:
#include <iostream>
using namespace std;

int main()
{
    int a, b, c, d, e, f;

    cout << "Bitte geben Sie den Tag des ersten Datums ein: ";
    cin >> a;
    cout << "Bitte geben Sie den Monat des ersten Datums ein: ";
    cin >> b;
    cout << "Bitte geben Sie das Jahr des ersten Datums ein: ";
    cin >> c;
    cout << "Bitte geben sie den Tag des zweiten Datums ein: ";
    cin >> d;
    cout << "Bitte geben Sie den Monat des zweiten Datums ein: ";
    cin >> e;
    cout << "Bitte geben Sie das Jahr des zweiten Datums ein: ";
    cin >> f;

    if (a < d)
    {
        if (b > e)
        {
            if (c > f)
            {
                cout << "Das erste Datum liegt vor dem zweiten Datum. " << endl;
            }
            else cout << "Das erste Datum liegt nach dem zweiten Datum. " << endl;
        }
    }

    if (a == b && c == e && c == f)
        {
            cout << "Beide Datumsangaben sind gleich. " << endl;
        }
    

    system("pause");
    return 0;
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
22.10.2016, 19:52 Uhr
Hans
Library Walker
(Operator)


Hi,

Zitat von ~CNoob:
Leider geben die Skripts meines Professors mir auch Klarheit was nicht stimmen könnte.

ich nehme an, das sollte "Leider geben die Skripts meines Professors mir auch keine Klarheit..." heissen.

Zitat von ~CNoob:
Wäre für Anregungen, Hinweise und Hilfe dankbar!


Nun ja, als erstes wären da mal die Variablennamen; a,b,c,d,e,f sind jetzt nicht gerade sehr Aussagekräftig. Variablennamen wie Tag1, Tag2, Monat1, Monat2, Jahr1, Jahr2 schon eher.
Dann brauchst Du für die Abfragen von Tag, Monat und Jahr jeweils auch einen else-Zweig und musst die einzelnen Werte nicht nur darauf testen, ob sie unterschiedlich sind, sondern auch auf Gleichheit. Denn es kann ja sein, dass ein oder zwei Werte (etwa Tag und Monat) gleich sind, der Dritte (in diesem Fall das Jahr) aber nicht.

Da das alles sehr umständlich werden kann, greift man gern zu dem Trick, alle Daten zuvor in eine Anzahl von Tagen ab einem bestimmten "Basistag" umzurechnen. In der Regel verwendet man dazu den 1. Januar 1970. Unter Berücksichtigung aller Schaltjahre liegt der inzwischen 17096 Tage zurück - wenn Open Office richtig gerechnet hat. Wenn Du das so machst, brauchst Du nur noch einen Test auf grösser, kleiner oder gleich, und hast das Ergebnis.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
23.10.2016, 13:12 Uhr
ao

(Operator)



Zitat von Hans:
Da das alles sehr umständlich werden kann, greift man gern zu dem Trick, alle Daten zuvor in eine Anzahl von Tagen ab einem bestimmten "Basistag" umzurechnen. In der Regel verwendet man dazu den 1. Januar 1970. Unter Berücksichtigung aller Schaltjahre ...

Wenn man das exakt rechnet (unter Berücksichtigung von Monaten mit 28, 29, 30 oder 31 Tagen), wird das in der Tat etwas kompliziert. Für die gestellte Aufgabe (2 Kalenderdaten vergleichen und feststellen, welches früher oder später ist) reicht auch eine vereinfachte Umrechnung, die alle Monate mit 31 Tagen zählt.

Wichtig ist hier nur, dass jedem Datum eindeutig eine Zahl zugeordnet wird und dass diese Zahlen dieselbe Ordnung (Reihenfolge) haben wie die Kalenderdaten selber. Nimmt man jeden Monat mit 31 Tagen an, dann gibt es in der Zahlenreihe Werte, denen kein reales Kalenderdatum entspricht. Das ist aber für die Aufgabe nicht erforderlich.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
23.10.2016, 17:29 Uhr
~CNoob
Gast


Danke erstmal für eure Antworten.
Klar das sollte "keine" Klarheit heißen.
Eure Idee ist prinzipiell ziemlich gut nur wird das in der Aufgabe explizit verboten, um else-if auch schön umständlich zu lernen .
Also die Variablennamen werde ich mal eindeutiger machen, aber wie ich da noch else Befehle einbauen, geschweige denn gleichzeitig noch auf Gleichheit prüfen soll bleibt mir leider weiterhin ein Rätsel.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
23.10.2016, 17:34 Uhr
~CNoob
Gast


Also den unteren Teil zur Prüfung ob die Daten gleich sind habe ich mal so angepasst.


Code:
if (tag1 == tag2 && monat1 == monat2 && jahr1 == jahr2)
        {
            cout << "Beide Datumsangaben sind gleich. " << endl;
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
23.10.2016, 20:45 Uhr
Hans
Library Walker
(Operator)


Hi,

Zitat von ~CNoob:
Danke erstmal für eure Antworten.
Eure Idee ist prinzipiell ziemlich gut nur wird das in der Aufgabe explizit verboten, um else-if auch schön umständlich zu lernen .


hm... - also wenn das so ist...

Am besten fängst Du damit an, die Jahre zu überprüfen, dann die Monate und zuletzt die Tage. Also etwa so:

C++:
/////////////////////////////////////////////////////////////////////////////////////////////////
if (Jahr1 < Jahr2)
   cout << "Datum 1 liegt vor Datum 2."  << endl;
else if (Jahr1 > Jahr2)     // Jahr 1 ist hier grösser oder gleich
   cout << "Datum 1 liegt hinter Datum 2."  << endl;

else if (Monat1 < Monat2)   // ab dieser Stelle sind die Jahre gleich, deshalb kann man sich den
                            // expliziten Test auf Gleichheit sehr wahrscheinlich sparen.
//   ...
//  über den Rest darfst Du selbst nachdenken. ;-)




Ich habs nicht überprüft, denke aber mal, dass es so funktionieren müsste.


Hans

----

@ao:

Zitat:
Für die gestellte Aufgabe (2 Kalenderdaten vergleichen und feststellen, welches früher oder später ist) reicht auch eine vereinfachte Umrechnung, die alle Monate mit 31 Tagen zählt.

Das ist eine interessante Überlegung, klingt aber nützlich.
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 23.10.2016 um 20:48 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
23.10.2016, 21:38 Uhr
Hans
Library Walker
(Operator)


Nachtrag: Hab's jetzt ausprobiert und festgestellt: es geht.

----
P.S.

Zitat:
aber wie ich da noch else Befehle einbauen, geschweige denn gleichzeitig noch auf Gleichheit prüfen soll bleibt mir leider weiterhin ein Rätsel.

Denk mal hierüber nach:

C++:
int a,b;

// a unb b Werte zuweisen, z.B. mit cin

if (a<b)
   cout << "a ist kleiner als b" << endl;
else if (a>b)
   cout << "a ist grösser als b" << endl;
else
   cout << "a und b sind gleich" << endl;


--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 23.10.2016 um 21:47 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
24.10.2016, 18:18 Uhr
~CNoob
Gast


Ich danke dir vielmals!
Hab´s fast geschafft.
Zuerst mit mehreren if´s versucht, aber da gibt er mit logischerweise 3x das Ergebnis aus.
Jetzt mit mehreren else if funktioniert es ziemlich gut, bis auf den Fall das Jahre gleich sind und die Tage nicht, da gibt er mir immer noch an das beide Daten gleich sind.
Einen letzten Denkanstoß würde ich dir hoch anrechnen.


Code:
if (jahr1 < jahr2)
        cout << "Das erste Datum liegt vor dem zweiten Datum. " << endl;
    else if (jahr1 > jahr2)
        cout << "Das erste Datum liegt nach dem zweiten Datum. " << endl;
    else if (jahr1 == jahr2)
        cout << "Beide Datumsangaben sind gleich. " << endl;

    else if (monat1 < monat2)
        cout << "Das erste Datum liegt vor dem zweiten Datum. " << endl;
    else if (monat1 > monat2)
        cout << "Das erste Datum liegt nach dem zweiten Datum. " << endl;
    else if (monat1 == monat2)
        cout << " Beide Datumsangaben sind gleich. " << endl;

    else if (tag1 < tag2)
        cout << " Das erste Datum liegt vor dem zweiten Datum. " << endl;
    else if (tag1 > tag2)
        cout << " Das erste Datum liegt nach dem zweiten Datum. ";
    else if (tag1 == tag2)
        cout << "Beide Datumsangaben sind gleich. " << endl;
    

    system("pause");
    return 0;
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
24.10.2016, 22:34 Uhr
Hans
Library Walker
(Operator)


Hi,

denk über den Kommentar in dem Codebeispiel aus posting 005 noch mal nach.
Oder anders: Wenn Du eine Grösse a erst darauf überprüfst, ob sie grösser als ein Vergleichswert b ist, und danach, ob sie kleiner als b ist. Beide Vergleiche fallen negativ aus, treffen also nicht zu. Welche Schlussfolgerung bleibt dann noch übrig? Und vor allem: Muss man diese Schlussfolgerung noch einmal explizit überprüfen?
Soweit mal der Denkanstoss.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 25.10.2016 um 20:54 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
25.10.2016, 09:39 Uhr
ao

(Operator)



Zitat von ~CNoob:
bis auf den Fall das Jahre gleich sind und die Tage nicht, da gibt er mir immer noch an das beide Daten gleich sind.

Weil du alles in einer einzigen if-else-if-Kette abhandelst.

Wenn du

C++:
if (jahr1 < jahr2)
        cout << "Das erste Datum liegt vor dem zweiten Datum. " << endl;
    else if (jahr1 > jahr2)
        cout << "Das erste Datum liegt nach dem zweiten Datum. " << endl;
    else if (jahr1 == jahr2)
        cout << "Beide Datumsangaben sind gleich. " << endl;


hinter dir hast, welche weiteren Fälle können dann noch auftreten? Anders gesagt, die letzten 6 else-ifs werden nie auch nur überprüft, weil einer der drei ersten Fälle immer eintritt.

Um den Ablauf besser zu verfolgen, ändere mal die Ausgabetexte:

C++:
if (jahr1 < jahr2)
        cout << "Das erste Jahr liegt vor dem zweiten Jahr. " << endl;
    else if (jahr1 > jahr2)
        cout << "Das erste Jahr liegt nach dem zweiten Jahr. " << endl;
    else if (jahr1 == jahr2)
        cout << "Beide Jahresangaben sind gleich. " << endl;

    else if (monat1 < monat2)
        cout << "Der erste Monat liegt vor dem zweiten Monat. " << endl;

    // ... und so weiter ...


Dann siehst du, wo du hängenbleibst und wo das Programm was anderes macht als du dir wünschst.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: