您好,欢迎访问三七文档
项目二:打印日历项目的功能是:由用户输入一个年后,然后就可以分月输出当年的年历。例如输入2010,则输出2010年的年历。如图,图中显示年历的一部分:项目学习目标:继续熟悉数组的使用;继续熟悉函数的使用;了解程序算法设计及N-S流程图;综合使用函数和数组完成设计。分析程序算法:程序算法分析如下:整个程序大致可以分为两个主要部分:输入年份;打印该年的日历,如图①所示。打印日历时,为了清楚的知道打印的是哪一年的日历,先打印年份,接着从1月~12月,分别打印各个月份的名称(英文缩写),然后打印星期的名称(英文缩写),最后再打印当月的日历,如图②所示。要打印某月的日历,首先必须生成当月日历,然后再打印,如图③所示。生成每个月的日历,需要知道当月有多少天,当月每一天是星期几,然后生成当月日历并保存,如图④所示。要知道每月有多少天是比较容易的,除了2月份外,其它月份的天数都是确定的,关键就是确定2月份有几天,如图⑤所示。如果当年是闰年,则2月份有29天,否则为28天。如图⑥所示。要想确定当月每一天是星期几,需要知道当年第一天是星期几,然后类推,每7天一个周期,如图⑦所示。经过以上的4~7步,可以生成日历,然后设计存储格式,保存日历。确定每月有多少天,关键是确定当年是否为闰年。确定每天是星期几,关键是确定当年1月1日是星期几。设计数据的存储格式和打印格式。对于较复杂的程序,可以把功能分解,每个小功能用一个函数实现,使程序的总体结构更加清晰。在这个程序中,可考虑使用以下4个函数:函数1:voidleapyear(intyear),判断year年是否是闰年。函数2:voidcalendar(intyear),按月生成日历。函数3:voidprint2(intmonth,intline),按月打印日历。函数4:main()函数。第一步:输入年份main(){intyear;printf(Inputyear:);scanf(%d,&year);printf(“==========year%d==========\n”,year);}第二步:判断输入的是否是闰年voidleapyear(intyear){if((year%4==0)&&(year%100!=0)||(year%400==0))monthday[2]=29;}闰年的规定:凡是年份能够被4整除、且不能被100整除的是闰年;凡是年份能被400整除的也是闰年。intleapyear(intyear){if((year%4==0)&&(year%100!=0)||(year%400==0))return1;elsereturn0;}main(){intyear;printf(Inputyear:);scanf(%d,&year);printf(“==========year%d==========\n”,year);if(leapyear(year))monthday[2]=29;}intmonthday[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};确定当年第一天是星期几todayweek=(year+(year-1)/4-(year-1)/100+(year-1)/400)%7;第三步:设计数据存储格式,生成各月日历必须为所有需要存储的数据设计存储结构,有了存储结构就可以存储生成的每个月的日历。使用二维字符数据monthname存放每个月的英文名称。charmonthname[13][6]={“”,“JAN”,”FEB”,”MAR”,”APR”,”MAY”,”JUNE”,”JULY”,“AUG”,”SEP”,”OCT”,”NOV”,”DEC”};使用二维数字符数组weekday存放一周每一天的星期几的英文名称。charweekday[8][6]={“SUN”,”MON”,”TUE”,”WED”,”THU”,”FRI”,”STA”,”SUN”};月历的格式ji0SUN1MON2TUE3WED4THU5FRI6STA000000001000000020000000300000004000000050000000使用二维整型数组month_odd、month_even存放奇数月、偶数月的日历:intmonth_odd[6][7],month_even[6][7];因为每周7天,一个月最多的时候是31天,所有月历最多只需要6行,这样就可以用一个6行7列的二维数组month_odd[6][7]、month_even[6][7]存放一个月的日历。生成日历设计变量用变量month表示当前月份,用变量today表示当前日期,用变量todayweek表示当前日期的星期。日历生成方法分析假设已判断出当年1月1日是星期三,怎样生成1月份的日历呢?已知1月份有31天,需要将1~31依次存入数组month_odd[][]当中,因为1月1日是星期三,所以首先将“1”存放在第1行(用变量odd_line表示行,“odd_line=0”表示第一行)第四个位置month_odd[0][3]中,表示1日是星期三。每放一个数today加1,todayweek加1。当变量todayweek等于7时,就应该换行,在下一行存储,而且星期应从星期六重新变成星期日,所以变量todayweek的值应重新赋值为0。这样,每存放7个数就换一行,直至31个数全部存放完毕。存储日期后的日历数组ji0SUN1MON2TUE3WED4THU5FRI6STA000012341567891011212131415161718319202122232425426272829303150000000today=1;//从1日开始存放odd_line=0;//从第1行开始存放for(i=0;i=5;i++)//初始化数组,即清除前一个奇数月的日期数据for(j=0;j=6;j++)month_odd[i][j]=0;while(today=monthday[month])//从1日开始,直到monthday[month],//当月每个日期都要存放{month_odd[odd_line][todayweek]=today;//将当前日期存放在指定位置todayweek++;//星期加1today++;//日期加1if(todayweek==7)//如果存放完每行最后一个元素,则一下元素位置要换行{todayweek=0;//星期从星期六变回到星期日odd_line++;//行数加1}}month++;//月数加1,产生偶数月的日历today=1;//当月第1天even_line=0;//当月第1行for(i=0;i=5;i++)//初始化数组,即清除前一个偶数月的日期数据for(j=0;j=6;j++)month_even[i][j]=0;while(today=monthday[month]){month_even[even_line][todayweek]=today;//产生偶数月的日历todayweek++;today++;if(todayweek==7){todayweek=0;even_line++;}}生成日历的整个函数voidcalendar(intyear){intmonth;inttodayweek,today,i,j;intodd_line,even_line;//分别记录奇数月和偶数月的行数/*确定当年1月1日是星期几*/todayweek=(year+(year-1)/4-(year-1)/100+(year-1)/400)%7;/*连续生成12个月的日历*/for(month=1;month=12;month++){//生成奇数月的日历//生成偶数月的日历if(month%2==0)//将相邻两个月中占用行数最多的传递过去print2(month-1,odd_lineeven_line?odd_line:even_line);if(month==10)//生成10个月的日历之后,停顿getch();}}第四步:打印日历voidprint2(intmonth,intline){inti,j,x;//输出日历上相应的月份名称printf(***%s***,monthname[month]);printf(***%s***\n,monthname[month+1]);//输出日历上的星期名称for(x=0;x=1;x++){for(i=0;i=6;i++)printf(%5s,weekday[i]);printf();}printf(\n);}voidprint2(intmonth,intline){inti,j,x;//输出日历上相应的月份名称//输出日历上的星期名称//打印奇数月的日历for(j=0;j=6;j++){if(month_odd[i][j]==0)//如果奇数月相应的元素值为0,printf();//说明该星期无日子,以5个空格代替elseprintf(“%5d”,month_odd[i][j]);//如果元素的值不为0,//则在相应位置输出该元素}}voidprint2(intmonth,intline){inti,j,x;//输出日历上相应的月份名称//输出日历上的星期名称//打印奇数月的日历printf();//5个空格//打印偶数月的日历for(j=0;j=6;j++){if(month_even[i][j]==0)printf();//5个空格elseprintf(%5d,month_even[i][j]);}}voidprint2(intmonth,intline){inti,j,x;//输出日历上相应的月份名称//输出日历上的星期名称for(i=0;i=line;i++){//打印奇数月的日历printf();//5个空格//打印偶数月的日历printf(\n);//输出完一行之后,换行输出下一行}}第五步:整合#includestdio.hintmonthday[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};charmonthname[13][6]={,JAN,FEB,MAR,APR,MAY,JUNE,JULY,AUG,SEP,OCT,NOV,DEC};charweekday[8][6]={SUN,MON,TUE,WED,THU,FRI,STA,SUN};//定义month_odd[][]存储奇数月的日期,month_even[][]存储偶数月的日期intmonth_odd[6][7],month_even[6][7];main(){intyear;printf(Inputyear:);scanf(%d,&year);printf(==========year%d==========\n,year);leapyear(year);calendar(year);}
本文标题:打印日历
链接地址:https://www.777doc.com/doc-3198852 .html