一篇应该不太有人看的博客,哈哈哈~~只是因为前辈叮嘱开始写博客记录我的IT生活。 **
**。Language:C 题目: 1、用户从终端输入一个长度为8位的字符串 2、字符串的内容为某年某月某日的数值 3、程序通过计算输出当年当月日历 4、程序设计原理及思路 允许 百度 5、希望诸位充分理解题意写出没有BUG的代码 6、程序中 不能 预设题外已知值 如:定义2019年11月1日为星期五 7、提供如下两串神秘代码可以使用
^20[0|1][0-9](0[1-9]|1[0|1|2])(0[1-9]|[1|2][0-9]|3[0-1])$ ^20[0|1][0-9](((0[1|3|5|7|8])(0[1-9]|[1|2][0-9]|3[0-1]))|((0[4|6|9])(0[1-9]|[1|2][0-9]|30))|(02(0[1-9]|[1|2][0-9]))|(1[0|2](0[1-9]|[1|2][0-9]|3[0-1]))|(11(0[1-9]|[1|2][0-9]|30)))$ 8、只有正确的输入才能得到正确的结果 错误的输入必然得不到正确的结果 9、提供一个正确的示例: 终端输入: 20191118 终端输出: 日 一 二 三 四 五 六 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30首先本人没有用到上面两个正则,原因有两个:一、用正则要用regex类库,本人不是很熟悉。二、这个正则没有考虑所有情况。 这也导致本代码在输入校验上做的不是很好。
写代码且先必须知道的两个判定条件或公式: 1.计算某年某月某天是星期几: 蔡勒(Zeller)公式:w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1 其中:y为年份后两位,c为世纪即年份前两位,m为月份(大于等于3,小于等于14,本年1,2月算上年13,14月),d为日。 详细阐述见链接:
https://blog.csdn.net/wcg_jishuo/article/details/7039091以上公式只适用于1582年10月15日之后的情形
2.判断闰年条件: 1⃣️普通年能被4整除且不能被100整除的为闰年。 2⃣️能被100整除且能被400整除的是闰年(能被100整除不能被400整除是平年)。
知道以上条件就可以直接上代码了,这里你只要对着日历想算法,你就能想到了。
#include<stdio.h> int getWeekday(long value);/*求出某年某月某天是星期几*/ int isLeapyear(long value);/*判断闰年*/ void printCalendayNumber(int end);/*数字格式输出*/ //函数声明 int year,weekday,month,day,century; //全局变量 int main(){ long value; printf("Please enter the value: "); scanf("%ld",&value);/*这里输入是以数值形式*/ weekday=getWeekday(value); printf("日 \t一 \t二 \t三 \t四 \t五 \t六\n"); if(month==14){ if(isLeapyear(value)==1){ printCalendayNumber(29); } else printCalendayNumber(28); } if(month==4||month==6||month==9||month==11){ printCalendayNumber(30); } if(month==3||month==5||month==7||month==8||month==10||month==12||month==13){ printCalendayNumber(31); } return 0; } int getWeekday(long value){ //day,century,month,year全部通过数值的计算取出 day=value%100; if(day>31){ printf("The format of the input is incorrect"); return 0; } year=(value/10000)%100; month=(value/100)%100; if(month<1||month>12){ printf("The format of the input is incorrect"); return 0; } if(month==1||month==2){ month=12+month; year--; } century=value/1000000; if(century<15||(century==15&&year<82)||(century==15&&year==82&&month<10)||(century==15&&year==82&&month==10&&day<15)){ printf("The format of the input is incorrect"); return 0; } return (year+(year/4)+(century/4)-2*century+(26*(month+1)/10)+day-1)%7; //蔡勒公式 } int isLeapyear(long value){ int tem=value/10000; if(tem%4==0&&tem%100!=0||tem%400==0) //判断闰年条件 return 1; else return 2; } //打印数字,传入的是该月有多少天 void printCalendayNumber(int end){ int firstDay,i; if(day>weekday){ firstDay=7-((day-(weekday+1))%7); //这里的firstDay计算是求出前面的空格数 } else firstDay=weekday-(day-1); for(i=0;i<firstDay;i++){ printf("\t"); } for(i=1;i<=end;i++){ if(i-1==(7-firstDay)||(i-1-(7-firstDay))%7==0)/*换行条件,看着复杂,对着日历你就能想到了*/ printf("\n"); printf("%2d\t",i); } }以上代码的改进最好是先传字符串,通过类库做一次正则校验,然后再转数值进行计算。