0

ユーザーが入力した日付がCで正当かどうかをチェックするプログラムを修正するように求められました。それを書いてみましたが、ロジックが正しくないと思います。

//Legitimate date
#include <stdio.h>
void main()
{
    int d,m,y,leap;
    int legit = 0;
    printf("Enter the date\n");
    scanf("%i.%i.%i",&d,&m,&y);
    if(y % 400 == 0 || (y % 100 != 0 && y % 4 == 0))
        {leap=1;}
    if (m<13)
    {
        if (m == 1 || (3 || ( 5 || ( 7 || ( 8 || ( 10 || ( 12 )))))))
            {if (d <=31)
                {legit=1;}}
        else if (m == 4 || ( 6 || ( 9 || ( 11 ) ) ) )
            {if (d <= 30)
                {legit = 1;}}
        else
            {
                        if (leap == 1)
                              {if (d <= 29)
                                    {legit = 1;}}
                        if (leap == 0)
                              {{if (d <= 28)
                                    legit = 1;}}
             }
    }
    if (legit==1)
        printf("It is a legitimate date!\n");
    else
        printf("It's not a legitimate date!");

}

月が31日である場合、正しい出力が得られますが、残りの月では、日が32未満の場合、出力は正当です。ご協力いただければ幸いです。

4

5 に答える 5

6

私はあなたのプログラムをシンプルで簡単なものに書き直します、これは役立つかもしれないと思います

//Legitimate date
#include <stdio.h>

void main()
{
   int d,m,y;
   int daysinmonth[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
   int legit = 0;

   printf("Enter the date\n");
   scanf("%i.%i.%i",&d,&m,&y);

   // leap year checking, if ok add 29 days to february
   if(y % 400 == 0 || (y % 100 != 0 && y % 4 == 0))
      daysinmonth[1]=29;
   
   // days in month checking
   if (m<13)
   {
      if( d <= daysinmonth[m-1] )
         legit=1;
   }

   if (legit==1)
      printf("It is a legitimate date!\n");
   else
      printf("It's not a legitimate date!");
}
于 2013-02-19T05:08:45.773 に答える
2

次のような条件を連鎖させることはできません。

if (m == 1 || (3 || ( 5 || ( 7 || ( 8 || ( 10 || ( 12 )))))))

代わりに、各シナリオを特別にテストする必要があります。

if (m == 1 || m == 3 || m == 5 || ...)

m == 1あなたのバージョンは、最初のテスト( )の結果を値と単純にORします3。これは、Cではゼロ以外であり、したがって常にブール値の真です。

于 2013-02-19T04:49:14.233 に答える
1

このテストは確かに間違っています:

if (m == 1 || (3 || ( 5 || ( 7 || ( 8 || ( 10 || ( 12 )))))))

これは

if ((m == 1) || (m == 3) || (m == 5) || ... )

論理式またはゼロ以外の式を実行すると、常にtrueと評価されます。したがって、テスト全体が常に真になります。

于 2013-02-19T04:48:43.260 に答える
0

日付の正当性をより簡単に確認できます。

#define _XOPEN_SOURCE 600
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

time_t get_date(char *line){
#define WRONG() do{printf("Wrong date!\n"); return -1;}while(0)
    time_t date;
    struct tm time_, time_now, *gmt;
    time_.tm_sec = 0;
    time_.tm_hour = 0;
    time_.tm_min = 0;
    if(strchr(line, '.') && sscanf(line, "%d.%d.%d", &time_.tm_mday, &time_.tm_mon, &time_.tm_year) == 3){
        time_.tm_mon--; time_.tm_year += (time_.tm_year < 100) ? 100 : -1900;
    }else
        WRONG();
    memcpy(&time_now, &time_, sizeof(struct tm));
    date = mktime(&time_now);
    gmt = localtime(&date);
    if(time_.tm_mday != gmt->tm_mday) WRONG();
    if(time_.tm_mon != gmt->tm_mon) WRONG();
    if(time_.tm_year != gmt->tm_year) WRONG();
    date = mktime(&time_);
    return date;
#undef WRONG
}

int main(int argc, char** argv){
    struct tm *tmp;
    if(argc != 2) return 1;
    time_t GD = get_date(argv[1]);
    if(GD == -1) return -1;
    printf("Int date = %d\n", GD);
    printf("your date: %s\n", ctime(&GD));
    return 0;
}
于 2013-02-19T06:08:10.187 に答える
0
//reading date and checking if valid or not
//firstly we will check the yeear then the month and then the date
//
//
//
//
#include<stdio.h>
int main()
{
    int d,m,y;
    printf("ENTER THE DATE IN DD/MM/YYYY FORMAT:");
    scanf("%d%d%d",&d,&m,&y);
    //check year 
    if(y>0 && y<9999)
    {
        // check month
        if(m>=1 && m<=12)
        {
            if((d>=1 && d<=31) && (m==1 || m==3 || m==5 || m==7 || m==8 || m==10 || m==12))
                printf("the date is valid in a month with 31 days:");
            else if ((d>=1 && d<=30) && (m==4 || m==6 || m==9 || m==11 ))
                printf("the date is valid in a feb with 30 days:");
            else if ((d>=1 && d<=29) && (m==2) &&  ((y%400==0) || (y%4==0) && (y%100!=0)))
                printf("the date is valid in feb of a leap year:");
            else if ((d>=1 && d<=28) && (m==2) && (y%4==0) && (y%100==0))
                printf("the date is valid in feb of a leap year:");
            else if ((d>=1 && d<=28) && (m==2) && (y%4!=0) )
                printf("the date is valid in feb of a non leap year:"); 
            else
                printf("the date is invalid:");     
        }
        else
        {
            printf("the month is not valid:");
        }
    }
    else 
    {
        printf("the date is not valid:");
    }
    return 0;
}
于 2017-07-12T14:43:10.137 に答える