错误的日期是用C中的日历概念计算的
在这个很棒的网站上发布第一篇文章 所以,我基本上是一个C语言爱好者,我正在制作一个程序,可以返回用户输入日期的日期。我没有使用任何函数或结构,因为我想先用C来构建我的基本概念,这里是switch语句等等。。。 程序编译得很快&没有错误,但答案延迟了1天;我的意思是,当我进入'2171993',那是一个'星期三',我得到了'星期四'。其他人也是如此。 我肯定这个概念有缺陷。请帮我整理一下。欢迎对以下代码发表意见:错误的日期是用C中的日历概念计算的,c,calendar,switch-statement,dayofweek,C,Calendar,Switch Statement,Dayofweek,在这个很棒的网站上发布第一篇文章 所以,我基本上是一个C语言爱好者,我正在制作一个程序,可以返回用户输入日期的日期。我没有使用任何函数或结构,因为我想先用C来构建我的基本概念,这里是switch语句等等。。。 程序编译得很快&没有错误,但答案延迟了1天;我的意思是,当我进入'2171993',那是一个'星期三',我得到了'星期四'。其他人也是如此。 我肯定这个概念有缺陷。请帮我整理一下。欢迎对以下代码发表意见: #include<stdio.h> int temp,yr,yr_new
#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,…}类似于你的奇数开关,除了一个数字外,所有的箱子都是一样的。耶!这就是我错的地方。这完全证明了为什么我要多过一天。非常感谢,朋友。