内容正文:
项目十 数组和函数综合应用──打印日历
学习目标
继续熟悉数组的使用。
继续熟悉函数的使用。
了解程序算法设计及N-S流程图。
综合使用数组和函数完成程序设计。
本项目来编写一个简单实用的小程序:打印年历。这个程序的功能是:由用户输入一个年号,然后就可以分月输出当年的年历。
项目十 数组和函数综合应用──打印日历
项目十 数组和函数综合应用──打印日历
任务一 分析程序算法
任务二 确定每个月的天数
任务三 确定当年的每天是星期几
任务四 设计数据存储方式,生成各月日历
任务五 设计打印格式,输出日历
任务六 完成整个程序
任务一 分析程序算法
N-S流程图也叫“盒图”,这种流程图去掉了传统流程图中带箭头的流程线,全部算法写在矩形框内,使流程图显得更加紧凑,适合结构化程序设计。N-S流程图表示的程序三种基本结构如下:
任务一 分析程序算法
(1)顺序结构 (2)选择结构 (3)循环结构
任务一 分析程序算法
程序算法分析
整个程序可以大致分为两个主要部分:输入年份、打印该年的日历。见图中的①。
打印日历时,为了清楚地知道打印的是哪一年的日历,先打印年份,然后从1月~12月,分别打印各月份的名称(英文缩写),然后打印星期的名称(英文缩写),最后再打印当月的日历。见图中的②。
要打印某月的日历,首先必须生成当月日历,然后再打印。见图中的③。
生成每一个月的日历,需要知道当月有多少天,当月每一天是星期几,然后生成当月日历并保存。见图中的④。
要知道每月有多少天是比较容易的,除了2月份外,其他月份的天数都是确定的,关键就是确定2月份有几天。见图中的⑤。
如果当年是闰年,则2月份有29天,否则,2月份为28天。见图中的⑥。
要想确定当月每一天是星期几,需要知道当年第一天是星期几,然后类推,每7天一个周期。见图中的⑦。
经过以上的4~7步,可以生成日历,然后,设计存储格式,保存生成的日历。
设计好输出格式,打印已生成的日历即可。见图中的⑧
任务一 分析程序算法
经过综合和细化,最终就可以得到整个程序的N-S流程图
以上的分析过程使用了进行程序设计的一个重要方法——“从上到下,逐步求精”的方法。这个方法是解决复杂问题的一种常用方法。
对于较复杂的程序,可以把功能分解,每个小功能用一个函数实现,使程序的总体结构更加清晰。
在这个程序中,应考虑使用以下4个函数。
函数1:“int leapyear(int year)”,判断“year”是否为闰年。
函数2:“void print2(int month,int t)”,按月打印日历。
函数3:“void calendar(int year)”,按月生成日历。
函数4:“main()”主函数。
任务一 分析程序算法
按功能划分函数
任务二 确定每个月的天数
int leapyear(int year) /*函数1:判断year是否为闰年*/
{if ((year%4==4)&&(year%100)!=0||(year%400==0))
return 1;
else
return 0;}
使用一维整型数组“monthday[]”来存放每各月的天数:
int monthday[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
如果是闰年,则2月份有29天:
if ((year%4==0)&&(year%100!=0)||(year%400==0))
monthday[2]=29;
为了提高程序的可读性,实现程序的模块化设计,对闰年的判断设计成函数“leapyear()”
任务三 确定当年的每天是星期几
确定每天是星期几,关键是判断当年的1月1日是星期几。
对于输入的年号year,year年的1月1日是星期几可以用下列公式计算:
当年第1天是星期几判断出来了,就可依次推算以后的日子是星期几了。
todayweek=[year+(year-1)/4-(year-1)/100+(year-1)/400]%7
任务四 设计数据存储方式,生成各月日历
int month2[6][7];
设计数据存储方式
使用一维整型数组“monthday”存放每个月的天数:
int monthday[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
使用二维字符型数组“monthname”存放每个月的英文名称:
Char monthname[13][6]={"","JAN","FEB","MAR","APR","MAY",
"JUNE","JULY","AUG","SEP",