Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » [Konsole] Datumsüberprüfung

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 <
000
24.08.2008, 19:42 Uhr
norse



Hallo

habe als Übung mir etwas vorgenommen:

Man gibte Tag, Monat und Jahr ein und das Programm überprüft ob das Datum richtig sein kann.

Z.B
24.7.1999 ist richtig

53.3.1998 ist falsch usw


nun das Problem:

Habe angefangen zu schreiben und nun funktioniert es nicht.

sobald etwas bei Tag oder Monat Über 9 eingegeben wird, funktioniert alles nicht =(

könnte jmd helfen?

hier der Code:


C++:
#include <iostream>

char x  = 0;
char j  = 0;
char NZ = '\n';
char TT = 0;
char MM = 0;
unsigned short JJ = 0;


void TMPruefung(void);
void SJPruefung(void);

using namespace std;

int main(void)
{
    cout << "Geben sie den Tag ein: " << NZ;

    cin >> TT;

    cout << NZ << "Geben sie den Monat ein: " << NZ;

    cin >> MM;

    cout << NZ << "Geben sie das Jahr ein: " << NZ;

    cin >> JJ;
    cout << NZ;

    void TMPruefung(char TT, char MM);
    void SJPruefung(char TT, char MM, char JJ);

    cout << TT << MM << JJ;
}

TMPruefung(char TT, char MM)
{
    if(MM == 1, 3, 5, 7, 8, 10, 12, TT <= 31)
    {
        return TT, MM, JJ;
    }

    else if(MM == 4, 6, 9, 11, TT <= 30)
    {
        return TT, MM, JJ;
    }

    else if(MM == 2, TT <= 28)
    {
        return TT, MM, JJ;
    }

    else if(MM == 2, TT == 29)
    {
        JJ / 4 == j;

        if(j != 0)
        {
            return TT, MM, JJ;
        }
    }
}



lg
norse

Bearbeitung von 0xdeadbeef:

quote- in cpp-tags umgeschrieben


Dieser Post wurde am 24.08.2008 um 20:01 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
24.08.2008, 20:00 Uhr
0xdeadbeef
Gott
(Operator)


Sämtliche deiner Variablen sind char, das heißt, eine Zeichenvariable. Du willst da Integer-Variablen (int).

Außerdem verstehst du de Komma-Operator völlig falsch. Der Komma-Operator ist einfache Aneinanderreihung, wobei der Wert des Ausdrucks nachher der letzte in der Aufzählung ist. Das heißt,

C++:
return a,b;


macht das selbe wie

C++:
a;
return b;


Wenn a eine einfache Variable ist, ist das das selbe wie

C++:
return b;


weil a; ja nichts macht. In gleicher Weise bedeutet

C++:
if(MM == 1, 3, 5, 7, 8, 10, 12, TT <= 31)


das selbe wie

C++:
if(TT <= 31)


Was du benutzen willst, sind && (logisches und), || (logisches oder) und switches oder lookup-tables für die Monate. Schlag das in deinem Buch mal nach, ich bin sicher, da ist es drin erklärt.

Das ist nicht das einzige, was schiefläuft - unter anderem rufst du deine Funktionen nicht auf, sondern deklarierst sie in main erneut (mit anderer Signatur und auf lokaler Ebene), und die Variablen da global zu definieren ist ausgesprochen unschön, wenn deine Funktionen doch schon Parameter entgegennehmen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 24.08.2008 um 20:05 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
24.08.2008, 21:08 Uhr
~norse
Gast


Habe jetzt angefangen einiges auszubessern, allerdings läuft da alles schief =(

könntest du evtl ein Teil mal zeigen wie es besser bzw. halt richtig wäre?

Einfach zur Veranschaulichung, daraus lern ich mit am besten.


Wegen den Variablen definieren, in meinem Buch stand das es so am besten wär.
Du meinst also, dass man die in der Zeile in der die Funktion aufgerufen wird, die Variablen definieren sollte?



Wegen den Zeichen... d.h. statt "return a,b" schreibe ich jetzt "return a %% b" oder?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
24.08.2008, 21:26 Uhr
norse



Entschuldigt bitte den Doppelpost... hatte nicht gesehn das ich nciht angemeldet war, daher der Gast - Post...

habe jetzt nochmal ganz von vorne angefangen und die Fehler verbessert.

Das Problem wird der untere Bereich sein, vorallem der Februar.
Aber kann ich es wieder so schreiben wie oben? allerdings halt mit Fehlerberichtigung, oder wüsste jmd bzw du eine bessere, einfacherere Variante?


so habe angefangen, und dabei hab ich mich sehr an das Buch orientiert.
Habe die Bespiele auf mein Projekt übernommen... :

c++

C++:
#include <iostream>

int TEingabe(void);
int MEingabe(void);
int JEingabe(void);
int DBerechnung(int TAG,int MONAT,int JAHR);
int DAusgabe(void);
char NZ = '\n';

using namespace std;

int main(void)
{
    TEingabe();

    MEingabe();

    JEingabe();

    DBerechnung(TAG, MONAT, JAHR);

    DAusgabe();
}

int TEingabe(void)
{
    int TAG = 0;

    cout << "Bitte geben sie den Tag ein: "  << NZ;
    cin >> TAG;

    return TAG;
}

int MEingabe(void)
{
    int MONAT = 0;

    cout << "Bitte geben sie den Monat ein: " << NZ;
    cin >> MONAT;

    return MONAT;
}

intJEingabe(void)
{
    int JAHR = 0;

    cout << "Bitte geben sie ein Jahr ein: " << NZ;
    cin >> JAHR;

    return JAHR;
}

int DBerechnung(TAG, MONAT, JAHR)
{
    if(TAG <= 31 && (1 | 3 | 5 | 7 | 8 | 10 | 12))
    {
        return TAG && Jahr;
    }





Er sagt immer das TAG, JAHR und MONAT bei der Funktionsdefinierung unklar sind.

Weiß echt nicht weiter. Im buch ist es doch genauso =(

desweiterung wollt ich gern wissen, ob ich das mit dem if(TAG <=....) diesesmal richtig habe oder nicht.

Hoffe weiterhin auf solch gute Hilfe

lg
norse

Bearbeitung von 0xdeadbeef:

quote-tags erneut durch cpp-tags ersetzt. Mach's in Zukunft gleich richtig.


Dieser Post wurde am 24.08.2008 um 22:59 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
24.08.2008, 23:12 Uhr
0xdeadbeef
Gott
(Operator)


Ich werd dir nicht die ganze Aufgabe abnehmen, aber ich geb dir mal das hier vor:

C++:
#include <iostream>

bool check_date(int t, int m, int j);

int main() {
  int tag, monat, jahr;

  std::cout << "Tag Monat Jahr: " << std::flush;
  std::cin >> tag >> monat >> jahr;

  if(check_date(tag, monat, jahr)) {
    std::cout << "Datum richtig." << std::endl;
  } else {
    std::cout << "Datum falsch." << std::endl;
  }
}

bool check_date(int t, int m, int j) {
  // TODO: Überprüfen, ob t.m.j ein gültiges Datum ist
  // Wenn ja, true zurückgeben, sonst false
}


Die lokale Variablendeklaration und der Funktionsaufruf sind fett gekennzeichnet. Wichtig ist, dass die Variablen in main deklariert sind, so dass sie nur innerhalb mains Gültigkeit haben - jede Funktion benutzt ihre eigenen Deklarationen, so kommen sie sich gegenseitig nicht in die Haare, und Rekursion lässt sich ggf. sinnvoll betreiben. Der Funktionsaufruf benutzt die in main gültigen Symbole, die in check_date dann t, m und j heißen - ich hätte sie auch gleich nennen können, aber zur Veranschaulichung des Prinzips macht es so mehr Sinn. Schlag das auch in deinem Buch nach, das muss das erklären.

Was den Rest angeht,

C++:
(1 | 3 | 5 | 7 | 8 | 10 | 12)


evaluiert zu 15, weil | binäres oder ist. Was du willst, ist wahrscheinlich (monat == 1 || monat == 3 || monat == 5 || ...), wobei ich an der Stelle eher mit einer Lookup-Table arbeiten würde, a la

C++:
static int const tage_pro_monat[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

// ...
if(tag <= tage_pro_monat[monat]) {
  ...
}


...wobei da natürlich Schaltjahre noch abzufangen sind, und du vorher sicher stellen musst, dass monat zwischen 1 und 12 liegt.

Oh, und benutz in Zukunft statt quote- cpp-tags.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
25.08.2008, 14:42 Uhr
norse



hmm... das schaut komplett anders aus ^^ aber ich denk ich hab jetz einiges besser verstanden.
Danke! Das hat schon super geholfen.

nur was bedeutet das ::flush?

und das mit dem bool hab ich jetzt auch besser verstanden ok.

naja das mit den Tagen... hm static int const hatte ich noch nicht, sagt mir absulut nichts... naja schaut alles etwas mehr anders aus, als ich gesehn habe bisher.

heißt das "static int const tage_pro_monat[] = { 0, 31... " das dort die maximale Anzahl der Tage festgelegt wird? oder versteh ich das falsch... ?

naja scheint alles nicht so einfach als ich gedacht habe =(


ich werd es weiter probieren.
danke an die super Hilfe!
und ja, den cpp- tag werd ich demnächst nutzen

lg
norse
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
25.08.2008, 18:06 Uhr
0xdeadbeef
Gott
(Operator)


std::flush ist ein I/O-Manipulator, vergleichbar mit std::endl, bloß ohne Zeilenende. Er bewirkt, dass, was immer sich im Puffer des Ausgabestreams, auf den er angewendet wird, befindet, sofort ans Ziel geschrieben wird.

Was das Array angeht, static und const sind da streng genommen nicht wirklich notwendig, aber schöner. Das const bewirkt, dass die Elemente des Arrays konstant sind, d.h., der Compiler erlaubt dir nicht, sie zu ändern. Das static bewirkt, dass das Array im gesamten Prozess nur einmal existiert - es macht es zu einer Art globalen Konstante, nur dass sie nur in dieser einen Funktion ansprechbar ist. Mit Variablen willst du so etwas in aller Regel nicht machen, aber bei Konstanten spart es ein bisschen Rechenzeit ein.

Die 0 im Datenteil des Arrays habe ich da eingefügt, weil Array-Indices in C++ mit 0 anfangen, deine Monate aber bei 1. tage_pro_monat[0] ist 0, tage_pro_monat[1] ist 31 usw. bis tage_pro_monat[12]. Pass aber auf, dass du nicht darüber hinausgehst - Wenn du tage_pro_monat[13] ansprichst, erzeugst du undefiniertes Verhalten (was im Zweifel einen segfault bedeutet).
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
25.08.2008, 21:33 Uhr
norse



uff... naja ok das ist jetzt am Anfang doch zu viel..

Danke für deine gute und schnelle Hilfe!

Werde das Projekt jedoch trotzdem erstmal auf Eis legen.. ist für mich als Anfänger doch zu viel neues dabei...

werd es an passender Stelle weiter fortführen

lg
norse
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: