strcat(tempOut[i%2][0],"");//运用strcat函数把4个空格接到tempout[i%2][0]
for(m=1;m<32;m++)//每月天数循环
{
sprintf(temp,"%4d",m);//输出格式占4列,右端对齐
strcat(tempOut[i%2][line],temp);//运用strcat函数把temp数组拷贝到tempout所指的末尾,且tempout有足够的空间存放temp的内容
if((a+m)%7==0)
line++;
if(n==1&&m==31)break;//从此处至以下执行整月停止
elseif(n==2&&m==28)break;
elseif(n==3&&m==29)break;
elseif(n==4&&m==30)break;
}
a=(a+m)%7;//a为每月末行天数
if(i%2==0)
{
i++;
gotoAGAIN;
}
elsefor(j=0;j<6;j++)
{
if(strlen(tempOut[0][j])==0&&strlen(tempOut[1][j])==0)break;//运用strlen函数判断检查左右列是否都没有第六行,如果是就可以省去空行的输出了。
printf("%-33s%s\n",tempOut[0][j],tempOut[1][j]);
}
printf("============================================================\n\n");//输出左边的字符串,长度33,使得右边字串对齐。
}
}
voidfind_day()
{
inta,day,month,year,sum,leap,S,k,W;//定义变量
printf("\n请输入年月日(格式如2004111):
\n");
scanf("%d%*c%d%*c%d",&year,&month,&day);
switch(month)
{
case1:
sum=0;break;
case2:
sum=31;break;
case3:
sum=59;break;
case4:
sum=90;break;
case5:
sum=120;break;
case6:
sum=151;break;
case7:
sum=181;break;
case8:
sum=212;break;
case9:
sum=243;break;
case10:
sum=273;break;
case11:
sum=304;break;
case12:
sum=334;break;
default:
printf("dataerror");break;
}
sum=sum+day;
if(year%400==0||(year%4==0&&year%100!
=0))//判断闰年还是平年
leap=1;
elseleap=0;
if(leap==1&&month>2)
sum++;
S=(year-1+(year-1)/4-(year-1)/100+(year-1)/400+sum)%7;//S/7的系数就是星期数
a=(year+(year-1)/4-(year-1)/100+(year-1)/400)%7;
k=(sum+a)%7;//判断k能否被7整除,是否有余数,有余数则周数+1
if(k==0)
{
W=(sum+a)/7;//W代表第几周,特别的是从星期日到星期一,而不是从星期一到星期日
printf("第%d周",W);
}
else
{
W=(sum+a)/7;
W=W+1;
printf("第%d周",W);
}
switch(S)
{
case1:
printf("星期一\n");break;
case2:
printf("星期二\n");break;
case3:
printf("星期三\n");break;
case4:
printf("星期四\n");break;
case5:
printf("星期五\n");break;
case6:
printf("星期六\n");break;
case0:
printf("星期日\n");break;
}
printf("\n");
}
4测试
4.1测试结果及分析
5小结
5.1本问题解决方法及程序实现小结
1、用基姆拉尔森计算公式去计算某年第一天是星期几
a=(year+(year-1)/4-(year-1)/100+(year-1)/400)%7;//在公式中year表示年数,公式由百度搜索得出
2、为了并排月份,定义了一个三维数组chartempOut[2][6][40],temp[10];//tempOut[左0右1][每月第几行][每行字符明细]。
3、运用memset、strcat、sprintf函数:
memset(tempOut,0,sizeof(tempOut));//memset函数的作用是在一段内存块中填充某个给定的值,它是对数组进行清零操作。
strcat(tempOut[i%2][0],"");//运用strcat函数把4个空格接到tempout[i%2][0]。
sprintf(temp,"%4d",m);//输出格式占4列,右端对齐,特别注意,sprintf针对的是把一些内容放进字符数组,用法与printf有点相似。
5.2尚未解决的问题及下一步工作思路
本程序还是有缺点,当要选择数字时,若输入了字母等非数字类型,然后程序就不能运行。
还有goto语句使用太多,虽然goto语句很好用,但是却不太好。
6参考文献
[1]苏小红.C语言大学实用教程(第三版).电子工业出版社.2012.5
[2]
12