错误的日期是用C中的日历概念计算的

错误的日期是用C中的日历概念计算的,c,calendar,switch-statement,dayofweek,C,Calendar,Switch Statement,Dayofweek,在这个很棒的网站上发布第一篇文章 所以,我基本上是一个C语言爱好者,我正在制作一个程序,可以返回用户输入日期的日期。我没有使用任何函数或结构,因为我想先用C来构建我的基本概念,这里是switch语句等等。。。 程序编译得很快&没有错误,但答案延迟了1天;我的意思是,当我进入'2171993',那是一个'星期三',我得到了'星期四'。其他人也是如此。 我肯定这个概念有缺陷。请帮我整理一下。欢迎对以下代码发表意见: #include<stdio.h> int temp,yr,yr_new

在这个很棒的网站上发布第一篇文章

所以,我基本上是一个C语言爱好者,我正在制作一个程序,可以返回用户输入日期的日期。我没有使用任何函数或结构,因为我想先用C来构建我的基本概念,这里是switch语句等等。。。 程序编译得很快&没有错误,但答案延迟了1天;我的意思是,当我进入'2171993',那是一个'星期三',我得到了'星期四'。其他人也是如此。 我肯定这个概念有缺陷。请帮我整理一下。欢迎对以下代码发表意见:

#include<stdio.h>
int temp,yr,yr_new,yr_latest,date,month,i,leap,ord,odd=0;
char flag='0';    
int main()
{
clrscr();
puts("Enter the date in the format dd/month-no/yyyy");
scanf("%d %d %d",&date,&month,&yr);
temp=yr/1000;
switch(temp)
{
 case 1: if(temp==0)
 puts("ERROR");
 case 2: if(temp==1)
 {
  if(yr<1600)
  yr_new=yr-1200;
  else
  yr_new=yr-1600;
  break;
  }
case 3: if(temp==2)
 { if (yr<2400)
 yr_new=yr-2000;
 else if(yr<2800)
 yr_new=yr-2400;
 else
 yr_new=yr-2800;
 break;
 }
}
temp=(yr_new/100);
odd+=(temp*5);
yr_latest=yr_new-(temp*100);
leap=yr_latest/4;
ord=yr_latest-leap;
for(i=1;i<=leap;i++)  
odd+=2;
for(i=1;i<=ord;i++)
odd+=1;
/* Leap Year */
if(yr%400==0 && yr%100!=0)
flag='1';
/* month */
switch(month)
{
case 1:
{odd+=(date%7);  break;     }
case 2:
{odd+=(date%7);break;}
case 3:
{ odd+=((date%7)+3);
     if(flag=='1')
     odd+=1;
     break ;
    }
case 4:
{   odd+=((date%7)+6);
    if(flag=='1')
    odd+=1;
    break;  }
case 5:
    { odd+=((date%7)+8);
    if (flag=='1')
    odd+=1;
    break;
    }
case 6:
    { odd+=((date%7)+11);
    if (flag=='1')
    odd+=1;
    break; }
case 7:
    { odd+=((date%7)+13);
    if(flag=='1')
    odd+=1;
    break; }
case 8:
    { odd+=((date%7)+16);
    if(flag=='1')
    odd+=1;
    break ;}
 case 9:
    { odd+=((date%7)+19);
    if(flag=='1')
    odd+=1;
    break;}
 case 10:
    { odd+=((date%7)+21);
    if(flag=='1')
    odd+=1;
    break;}
case 11:    {
     odd+=((date%7)+24);
    if(flag=='1')
    odd+=1;
    break; }
 case 12:
    { odd+=((date%7)+26);
    if(flag=='1')
    odd+=1;
    break;
    }
 }
 odd=odd%7;
 switch(odd)
  { case 0:puts("Sunday"); break;
 case 1:puts("Monday"); break;
 case 2:puts("Tuesday"); break;
 case 3:puts("wednesday"); break;
 case 4:puts("thursday"); break;
 case 5:puts("friday"); break;
 case 6:puts("Saturday"); break;
 default: puts("error!");
 }
getch();
return 0;
}

我想你的开关箱出了点问题!。尝试以下更改,这与您的逻辑有所不同-

#include<stdio.h>
int temp,yr,yr_new,yr_latest,date,month,i,leap,ord,odd=0;
int main()
{
        puts("Enter the date in the format dd/month-no/yyyy");
        scanf("%d %d %d",&date,&month,&yr);
        temp=yr/1000;
        switch(temp)
        {
                case 1: if(temp==0)
                                puts("ERROR");
                case 2: if(temp==1)
                        {
                                if(yr<1600)
                                        yr_new=yr-1200;
                                else
                                        yr_new=yr-1600;
                                break;
                        }
                case 3: if(temp==2)
                        {
                                if(yr == 2000)              // Note this change also
                                        yr_new=yr-1900;
                                else if (yr<2400)
                                        yr_new=yr-2000;
                                else if(yr<2800)
                                        yr_new=yr-2400;
                                else
                                        yr_new=yr-2800;
                                break;
                        }
        }
        temp=(yr_new/100);
        odd+=(temp*5);
        yr_latest=yr_new-(temp*100);

        yr_latest=yr_latest-1; // Here i am leaving the current year in odd days calculation.

        leap=yr_latest/4;
        ord=yr_latest-leap;
        for(i=1;i<=leap;i++)
                odd+=2;
        for(i=1;i<=ord;i++)
                odd+=1;
        for(i=1;i<month;i++) // this logic is to calculate the odd days for the current year.
        {
                switch(i)
                {
                        case 1:
                                odd+=3;
                                break;
                        case 2:
                                if((yr_latest+1)%4 == 0)
                                        odd+=1;
                                else odd+=0;
                                break;
                        case 3:
                                odd+=3;
                                break;
                        case 4:
                                odd+=2;
                                break;
                        case 5:
                                odd+=3;
                                break;
                        case 6:
                                odd+=2;
                                break;
                        case 7:
                                odd+=3;
                                break;
                        case 8:
                                odd+=3;
                                break;
                        case 9:
                                odd+=2;
                                break;
                        case 10:
                                odd+=3;
                                break;
                        case 11:
                                odd+=2;
                                break;
                        case 12:
                                odd+=3;
                                break;
                }
        }
        odd+=date;
        odd=odd%7;
        switch(odd)
        { case 0:puts("Sunday"); break;
                case 1:puts("Monday"); break;
                case 2:puts("Tuesday"); break;
                case 3:puts("wednesday"); break;
                case 4:puts("thursday"); break;
                case 5:puts("friday"); break;
                case 6:puts("Saturday"); break;
                default: puts("error!");
        }
        return 0;
}

当前年份的意思是,如果您输入的是'21 7 1993',首先我计算到'12.12.1992'的奇数天,然后我计算剩余天数的奇数天

使用所有警告和调试信息进行编译,例如gcc-Wall-g和。。。;了解如何使用调试器,例如gdb。不要期望我们调试您的程序。2000年是闰年吗?switchtemp{case 1:iftemp==0…测试开关是否不工作,而不是将星期几数字转换为字符串的开关,只需使用数组:const char*days[]={Sunday,Monday,…}类似于你的奇数开关,除了一个数字外,所有的箱子都是一样的。耶!这就是我错的地方。这完全证明了为什么我要多过一天。非常感谢,朋友。