Probleme mit case

lobo87

Mitglied
Hallo Leute,

Nur mal zur Erläuterung habe einen Code geschrieben, der mir nach Eingabe des Datum (von 1901-2099) den Wochentag dazu herausfindet! Funktioniert einwandfrei(obwohl noch nicht ganz optimiert und umständlich) bis auf die Monate August/September (08/09)...

Habe das Ganze so gemacht, dass er für jedes Monat einen eigenes Case macht, in dem er checkt ob das eingegebene Datum auch wirklich gültig ist und erst dann rechnen beginnt!

Nur ist das Problem jetzt sobal ich zB: das Datum 22/08/1987 eingebe und mir gleich darauf den gespeicherten Wert des Monats(also 8) wieder ausgeben lasse steht dort 0...das Gleiche auch bei 09. Die Sache ist nun die mein Code hat jetzt gute 200 Zeilen und ich werde nicht den Ganzen hier einstellen! Hoffe dass das so in Ordnung ist und mir irgendwer damit helfen könnte.

Lg Daniel

Code:
int day,month,year;
int year_4,year_400,daysinmonth,monthdays,all,zsum,leapyear,weekday;

int main()
{
   printf("ENTER DD/MM/YYYY\n");        //Gibt Am Bildschirm aus
   scanf("%i/%i/%i", &day, &month, &year); //liest werte ein
   printf("Zahl ist: %i\n",day);
   printf("Zahl ist: %i\n",month);
   year_4=(year % 4);     //modulo v Schaltjahren berechnet
   year_400=(year % 400);    // genauso schaltjahr alle 400 jahre
   isValidDate(day,month,year,year_4,year_400);    // funktion Gültigkeitprüfung
   return(0);
}

dayOfWeek(int day, int month, int year, int daysinmonth, int monthdays, int all, int zsum, int leapyear, int weekday)
{
if (month==1) {daysinmonth=31; monthdays=0;}
if (month==2) {daysinmonth=28; monthdays=31;}
if (month==3) {daysinmonth=31; monthdays=59;}
if (month==4) {daysinmonth=30; monthdays=90;}
if (month==5) {daysinmonth=31; monthdays=120;}
if (month==6) {daysinmonth=30; monthdays=151;}
if (month==7) {daysinmonth=31; monthdays=181;}
if (month==8) {daysinmonth=31; monthdays=212;}
if (month==9) {daysinmonth=30; monthdays=243;}
if (month==10) {daysinmonth=31; monthdays=273;}
if (month==11) {daysinmonth=30; monthdays=304;}
if (month==12) {daysinmonth=31; monthdays=334;}

//Hier würde die Berechnung und Tagesausgabe stehen...die stimmt zu 100%


isValidDate(int day, int month, int year, int year_4, int year_400)
{
   if(day<32&&day>00&&month<13&&month>00&&year<2100&&year>1900)

      switch(month)
         {
      case 1:
               {
                  printf("Dieses Datum ist gültig!\n");
                  dayOfWeek(day,month,year,daysinmonth,monthdays,all,zsum,leapyear,weekday);
                  break;
               }

      case 2:
               {
               if(year_4>0||year_400>0)
                     {
                     if(day<=28)
                        {
                         printf("Dieses Datum ist gültig!\n");
                         dayOfWeek(day,month,year,daysinmonth,monthdays,all,zsum,leapyear,weekday);
                         break;
                        }
                     else
                        {
                         printf("Dieses Datum ist ungültig\n");
                         break;
                        }
                     }
               else
               {
                  if(year_4==0||year_400==0)
                     {
                        if(day<=29)
                           {
                           printf("Dieses Datum ist gültig!\n");
                           dayOfWeek(day,month,year,daysinmonth,monthdays,all,zsum,leapyear,weekday);
                           break;
                           }
                        else
                           {
                           printf("Dieses Datum ist ungültig\n");
                           break;
                           }
                     }
               }
             }
     //geht hier ganz gleich weiter.....jetzt kommen case 8/9 und da haut was nicht hin
     //sind aber ganz gleich aufgebaut wie die restlichen Cases
      case 8:
             {
                  printf("Dieses Datum ist gültig!\n");
                  dayOfWeek(day,month,year,daysinmonth,monthdays,all,zsum,leapyear,weekday);
                  break;

             }
      case 9:
             {
               if(day<31)
                  {
                  printf("Dieses Datum ist gültig!\n");
                  dayOfWeek(day,month,year,daysinmonth,monthdays,all,zsum,leapyear,weekday);
                  break;
                  }
               else
                  {
                  printf("Dieses Datum ist ungültig!\n");
                  break;
                  }
             }
      case 10:
             {

                  printf("Dieses Datum ist gültig!\n");
                  dayOfWeek(day,month,year,daysinmonth,monthdays,all,zsum,leapyear,weekday);
                  break;

             }

  //Da standen Case 11 + 12

      default: printf("Dieses Datum ist 1ungültig!\n");
         }
   else
      printf("Dieses Datum ist 2ungültig!\n");
}
 
hallo,
versuch mal bei der eingabe die null "0" wegzulassen, also z.b.:
22/8/1987

schreib dann mal ob das funktioniert :p

mfg adam
 
Hi.

Du hast das Problem bereits als erledigt markiert, allerdings ist es hier so üblich dann auch die Lösung hinzuschreiben für andere die das gleiche Problem haben.

Der Punkt ist, das der Formatparameter %i bei scanf einen Integer Wert einliest, allerdings dies zur Basis 16 tut falls der Wert mit "0x" bzw "0X" anfängt und eine Oktalzahl erwartet falls der Wert mit einer 0 anfängt. "08" bzw. "09" ist keine gültige Oktalzahl und somit schlägt das Einlesen fehl (deshalb sollte man ja auch den Rückgabewert der scanf Funktion prüfen ob das Einlesen auch wirklich geklappt hat).

Die Lösung ist, statt %i einfach %d zu benutzen, denn dabei wird immer ein dezimaler Integerwert eingelesen, ob der nun mit 0 anfängt oder nicht.

Also:
C++:
if (scanf("%d/%d/%d", &day, &month, &year) == 3) {
Gruß
 
habe mich nämlich gewundert weshalb du zum einlesen eine int variable nutzt.
ich habe mal ein shutdown bei einer gewissen zeit programmiert,
vielleicht hilft dir der teil ja weiter, da zeit und datum beide in ein string geschrieben werden.

Code:
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <time.h>

using namespace std;

bool myshutdown(char *, char *);
const HWND GetConsoleWindow();


int main() {
    char mytime[9];
    char systime[9];

    cout<<"Shutdown Zeit eingeben, z.b.: 12:30:00"<<endl;
    cout<<">>";
    cin.getline(mytime, 9);

    //Diese Funktion versteckt das Fenster
    //ShowWindow(GetConsoleWindow(), SW_HIDE);

    while(1) {
        _strtime(systime);

        if(!myshutdown(systime, mytime)) {
            system("cls");
            cout<<"System Zeit: "<<systime<<endl;
            cout<<"Shutdown...: "<<mytime<<endl;
            Sleep(1000);
        }
        else {
            system("shutdown -s -t 0 -c \"Zeit ist abgelaufen\"");
            exit(0);
        }
    }
    
    return 0;
}


bool myshutdown(char *systime, char *mytime) {
    if(!strcmp(systime, mytime))
        return true;
    else
        return false;
}


const HWND GetConsoleWindow() { 
    HWND hwnd;
    TCHAR strOldTitle[256];
    
    GetConsoleTitle(strOldTitle, 256);
    hwnd = FindWindow(NULL, strOldTitle);

    return(hwnd); 
}

...das wichtigste an diesem code ist für dich wohl nur der anfang der main,
mit "char mytime[9]" z.b.!
das gute an strings ist das du sie miteinander vergleichen kannst, vielleicht kommst du dann auch um deine lange switch herum ;)
mfg adam
 
habe mich nämlich gewundert weshalb du zum einlesen eine int variable nutzt.
Eigentlich ist das ja gar nicht so schlecht, denn schließlich sind Tag, Monat und Jahr Integer Werte und desweiteren kann man dann auch mit ihnen Rechnen und z.B. bestimmen ob es sich um ein Schaltjahr handelt oder nicht. Außerdem sollte man schon erstmal irgendwie feststellen, ob der eingegebene Wert überhaupt ein(e) vernünftiges Datum/Zeit ist bevor man irgendetwas damit anstellt.

Code:
    char mytime[9];
    char systime[9];

    cout<<"Shutdown Zeit eingeben, z.b.: 12:30:00"<<endl;
    cout<<">>";
    cin.getline(mytime, 9);
Du prüfst hier nicht ob überhaupt etwas eingelesen werden konnte und rechnest mit einem zufälligen Wert weiter.

Gruß
 
:p
da gebe ich dir recht, jedoch sollte dieser code kein schönheitspreis bekommen.
ich hatte mir das in ein paar min. mal zusammengebastelt, bei ernsthaften programmen füge ich natürlich abfragen ein ;)
 
Nochmals danke für eure Antworten!

Nein Schönheitspreis bekommt der wahrlich nicht, also funktionieren tut er jetzt vollständig ohne macken und Fehler....falls ihn jemand haben will(ist zwar durch dieses switch lang aber doch einigermaßen übersichtlich geworden!

MfG
Daniel
 

Anhänge

Zurück