If Bedingungen ineinander

Detlef7able

Grünschnabel
Hallo,

ich habe folgende if-Bedingungen für Monate mit 30 und 31 Tagen, (Februar ausgenommen).
b steht für Monate und a für Tage
C++:
if (((b == 1) || (b == 3) || (b == 5) || (b == 7) || (b == 8) || (b == 10) || (b == 12) && (a <= 0) || (a > 31)) || ((b == 2) || (b == 4) || (b == 6) || (b == 9) || (b == 11) && (a <= 0) || (a > 30)))
                    return 0;

            if (((b == 1) || (b == 3) || (b == 5) || (b == 7) || (b == 8) || (b == 10) || (b == 12) && (a > 0) || (a < 32)) || ((b == 2) || (b == 4) || (b == 6) || (b == 9) || (b == 11) && (a > 0) || (a < 31)))
                        return 1;

Allerdings funktioniert es bei den 30er Monaten nicht, es wird immer 0 zurückgegeben.
Ich hoffe ihr könnt mir helfen.
Vielen Dank im Voraus
 
Moin,

so aus dem Stand: du solltest das Ganze mal sauber klammern, da IMHO das logische UND ('&&') stärker als das logische ODER ('||') ist !

Gruß Klaus
 
Okay, habe nun geklammert und möchte allerdings noch ergänzen ob es keine Zahl ist funktioniert aber nicht. Wenn ich z.B. 12f eingebe geht es trotzdem als korrekt durch.

C++:
int korrekt(char *tag, char*mon)
{
    char cht;
    char chm;
    int a, b;
    a = atoi(tag);
    b = atoi(mon);
    while ((cht = *tag++) != '\0') {
        while ((chm = *mon++) != '\0') {
            if ((!isdigit(cht)) || (!isdigit(chm)) || ((b == 1) || (b == 3) || (b == 5) || (b == 7) || (b == 8) || (b == 10) || (b == 12)) && ((a <= 0) || (a > 31)) || (((b == 2)) || (b == 4) || (b == 6) || (b == 9) || (b == 11)) && (((a <= 0) || (a > 30))))
                    return 0;

            if (((b == 1) || (b == 3) || (b == 5) || (b == 7) || (b == 8) || (b == 10) || (b == 12)) && ((a > 0) || (a < 32)) || (((b == 2)) || (b == 4) || (b == 6) || (b == 9) || (b == 11)) && (((a > 0) || (a < 31))))
                        return 1;
                    }
                }
            }
 
hmm, ich verstehe ohnehin nicht wirklich, was Dein Code prüfen soll ...
Und was meinst Du mit "Wenn ich z.B. 12f eingebe"?
Wo gibt Du was ein ??
Meinst Du eine Übergabe an die Parameter der Methode ??

Schreib' mal ein paar Komentare in den Code, damit wir eine Chance haben, ihn wirklich nachzuvollziehen

Und was übergibst Du konkret an die Methode "korrekt" ??

Gruß Klaus
 
Hallo,

ganz am Rande hilft es auch, wenn man in den logischen Verkettungen Zeilenumbrüche einfügt. Z.B. nach einem "&&".
Auch ist es nicht verboten mehrere ifs zu schachteln, zumal das gerade das debuggen am Anfang sehr erleichtert, da man die einzelnen Aussagen nachvollziehen kann.

Grüße,
Jennesta
 
C++:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LINE_LEN 100
#pragma warning (disable : 4996)


int korrekt(char *tag, char*mon)
{
    char cht;
    char chm;
    int a, b;
    a = atoi(tag);
    b = atoi(mon);
    while ((cht = *tag++) != '\0') {
        while ((chm = *mon++) != '\0') {
           
            
            if (!isdigit(cht) || (!isdigit(chm))) {

                if    (((b == 1) || (b == 3) || (b == 5) || (b == 7) || (b == 8) || (b == 10) || (b == 12)) && ((a <= 0) || (a > 31))
                    || (((b == 2)) || (b == 4) || (b == 6) || (b == 9) || (b == 11)) && ((a <= 0) || (a > 30))){
                    return 0;
                }
            }
           
           
            if (((b == 1) || (b == 3) || (b == 5) || (b == 7) || (b == 8) || (b == 10) || (b == 12)) && ((a > 0) || (a < 32)) || (((b == 2)) || (b == 4) || (b == 6) || (b == 9) || (b == 11)) && (((a > 0) || (a < 31))))
                return 1;
    }
    }
}
   
int main() {
    char tag[100], mon[100];

    for (;;) {
        printf("Bitte Tag eingeben\n"); fflush(stdout);
        gets(tag);
        printf("Bitte Monat eingeben\n"); fflush(stdout);
        gets(mon);

        if (korrekt(tag, mon))
        {
            printf("ist klar");
            break;
        }

        else
            printf("ne geht nicht");
        }
       
   
        getchar();
        getchar();
}

Ich möchte das der Benutzer Tag,Monat und anschließend das Jahr eingibt. Dabei sollen nur Zahlen verwendet werden, für die korrekte Eingabe also irgendwelche anderen Zeichen sollen zurückgewiesen werden.
Eigentlich möchte ich ja das Datum einlesen lassen und das erscheint mir sehr schwierig wegen den Punkten (xx.xx.xxxx).
 
okay nun scheint es tendenziell zu funktionieren aber wenn ich bei tag eine zahl sowie buchstaben eingebe (20f) und bei monat dann nur eine zahl erhalte ich eine Fehlermeldung. (Debug Assertion Failed!)
Wenn ich bei Tag eine Zahl eingebe und bei Monat z.B. 20 f funktioniert es wie es soll.
 
Du hast zwei Schleifen ineinander, bei denen du den Zeiger auf Tag und Monat hochzählst. Vor allem aber hast du die Prüfung auf reine Zahl und gültige Werte durcheinander. Das solltest du schön sauber trennen. Es hilft dir auch, wenn du die verschiedenen IF-Abfragen sauberer trennst.
Ich habe mir vor Jahren schon angewohnt, bei IF-Abfragen jeden einzelnen Vergleich in eine eigene Zeile zu packen. Werden mehrere Kombinatoren (oder/und) verbunden, rücke ich die zusammengehörenden Blöcke entsprechend so ein, dass ich die direkt erkenne:

Code:
// ist tag numerisch?
for ( size_t i = 0; i < strlen( tag ); ++i )
{
  if ( !isdigit( tag[i] ) )
  {
    return 0;
  }
}
// ist monat numerisch?
for ( size_t i = 0; i < strlen( mon); ++i )
{
  if ( !isdigit( mon[i] ) )
  {
    return 0;
  }
}

// jetzt die Werte prüfen
int  tagNum = atoi( tag );
int  monatNum = atoi( mon );

// völlig unmögliche Werte sofort aussortieren
if ( ( monatNum < 1 )
||   ( monatNum > 12 )
||   ( tagNum < 1 )
||   ( tagNum > 31 ) )
{
  return false;
}

// Anzahl Tage gültig?
switch ( monatNum )
{
  case 2:
    // Februar - Extraprüfung Schaltjahr etc...
    if ( tagNum > 28 )
    {
      return 0;
    }
    // TODO
    break;
  case 4:
  case 6:
  case 9:
  case 11:
    if ( tagNum > 30 )
    {
      return 0;
    }
    break;
}
return 1
 
Zurück