万年历
1 引言
1.1 国内外现状
C语言作为一门通用计算机编程语言,应用广泛,C语言提供了许多低级处理的功能,并且保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译。而且C语言是操作系统、编译原理、数据结构与算法等等基础知识,若想要深入理解、掌握和灵活运用, C语言是的重要前提,现阶段程序员职业生涯超过一半的热门方向直接或间接与 C 有关。而且C语言在全世界都是通用的语言,无论国内外,若从事计算机专业相关的工作,C语言是一项不可过去额的必备技能。
1.2 本课题研究的迫切性
学习者刚刚完成C语言相关的理论学习工作,及时对其进行运用能使学习者的创新能力、沟通能力、协调能力、协作能力、组织能力和较强的应用知识解决实际工程问题的能力都有所提高。防止不及时的进行练习和实践使学习者忘记理论知识,且出现无法将理论实践相结合的情况。
1.3 本文的主要工作
对本次工程实践1:年历系统设计的实现过程中出现的各种问题及其功能进行总结,
2 需求分析
2.1 系统目标
年历系统首先对于输入的任一年,能够给出该年每月的日期及实际周几的对应情况,并与实际的星期数垂直对齐,如下表所示(当输入2004时显示如下):
Input the year:2004
The calendar of the year 2004.
January 1 February 2
============================= =============================
Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat
1 2 3 1 2 3 4 5 6 7
4 5 6 7 8 9 10 8 9 10 11 12 13 14
11 12 13 14 15 16 17 15 16 17 18 19 20 21
18 19 20 21 22 23 24 22 23 24 25 26 27 28
25 26 27 28 29 30 31 29
============================= =============================
March 3 April 4
============================= =============================
Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat
1 2 3 4 5 6 1 2 3
7 8 9 10 11 12 13 4 5 6 7 8 9 10
14 15 16 17 18 19 20 11 12 13 14 15 16 17
21 22 23 24 25 26 27 18 19 20 21 22 23 24
28 29 30 31 25 26 27 28 29 30
============================= =============================
2.2 系统功能
1:输入任一年将显示出该年的所有月份日期,对应的星期,输出的格式如上表要求(注意闰年情况);
2:输入任意日期(包括年、月、日,格式有yyyy/mm/dd、dd/mm/yyyy、mm/dd/yyyy、和yyyy,mm,dd、mm,dd,yyyy、dd,mm,yyyy六种基本情况),要求能够显示出该日期是本年的哪一周,是星期几。
2.3 开发环境及工具
2.3.1 运行环境
Windows:是美国微软公司研发的一套操作系统,它问世于1985年,起初仅仅是Microsoft-DOS模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。
2.3.2 vc++介绍
Microsoft Visual C++(简称Visual C++、MSVC、VC++或VC)是微软公司的C++开发工具,具有集成开发环境,可提供编辑C语言,C++以及C++/CLI等编程语言。VC++集成了便利的除错工具。]
它以拥有“语法高亮”,IntelliSense(自动完成功能)以及高级除错功能而著称。比如,它允许用户进行远程调试,单步执行等。还有允许用户在调试期间重新编译被修改的代码,而不必重新启动正在调试的程序。其编译及建置系统以预编译头文件、最小重建功能及累加连结著称。这些特征明显缩短程式编辑、编译及连结花费的时间,在大型软件计划上尤其显著。
2.3.3 开发语言
C语言一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言
3 系统总体结构设计
3.1 系统结构基本简介
该系统由一个主函数和多个子函数共同组成,以主函数为中心主体,运用多个选择结构程序设计(例如if语句,switch语句),以printf函数和scanf函数为基础对年历系统进行相应功能的完善和改造,结合多个子函数,使系统各部分功能都能够完整实现,最后使得该系统运行结果基本达到需求结果。
3.2 系统功能模块及设计
3.2.1 数据结构设计(系统详细模块流程图)
3.2.2 功能模块介绍
该系统的功能主要分为两部分:
输入1:
输入要查询的年份:
输出该年的完整日历;
输入2:
输入想要查询的年份:
输入想要查询的月份:
输入想要查询的日期:
输出:
xx年xx月xx日是星期x;
xx年xx月xx日是该年的第x周。
输入0:退出程序;
输入其他字符:符号不合法!
请重新输入:
4 系统测试与分析
4.1 测试
1:输入0
2:输入1,输入2004
输入2;2004,02,01:
4.2 调试过程中遇到的主要问题
- 链接时出现问题;
- 在之前定义的子函数,在后面没有具体实现方法;
- 在写长代码的时候,大括号多次被删除,导致缺少“{}”使得程序多次编译出错
- 在写选择结构时注意完整。
5.附源码:
#include<stdio.h>
int leap(int x);
int monthdays(int year,int month); //定义每月的天数//
int getWeekday(int year,int month,int day); //判断某个日期是星期几的函数//
int sum_leap_year(int x); //定义闰年的总个数//
int last_day(int x,int y,int z); //定义n-1年的最后一天//
int getWeeks(int year,int month,int day); //定义周数//
char *month_name(int x); //定义星期//
void Format(int x); //定义每年的第一天从周几开始的格式//
void Prf(int max,int x); //定义输出1,2……号//
int main()
{
int year,month,day;
int leap_year; //定义闰年//
int sum;
int n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12; //每个月第一天//
int n; //一年的第一天//
int i,a;
for(;;)
{
printf("请选择以下功能:\n 1:查看指定年份年历;\n 2:查看指定日期的星期数和周数。\n");
printf("备注:输入0可退出本程序!\n");
printf("请输入:");
scanf("%d",&a);
if(a==0)
{
printf("程序即将退出!\n");
return 0;
}
else if(a==1)
{
printf("Input the year:");
scanf("%d",&year);
leap_year=leap(year);
sum=sum_leap_year(year);
n=(year+(year-1)/4-(year-1)/100+(year-1)/400)%7; //判断一年第一天是周几//
if(leap_year==1)
{
printf("%d is leap year\n",year);
}
else
{
printf("%d is not leap year\n",year);
}
printf("the calendar of the year %d.\n",year);
if(leap_year==1)
{
/*输出一月份*/
printf(" Januray 1\n");
printf("=============================\n");
for(i=0; i<7; i++)
printf("%s ",month_name(i));
printf("\n");
n1=n;
Format(n1);
Prf(31,n1);
printf("\n");
printf("=============================\n");
printf("\n");
/*输出二月份*/
printf(" Feburay 2\n");
printf("=============================\n");
for(i=0; i<7; i++)
printf("%s ",month_name(i));
printf("\n");
n2=(n+31)%7;
Format(n2);
Prf(29,n2);
printf("\n");
printf("=============================\n");
printf("\n");
/*输出三月份*/
printf(" March 3\n");
printf("=============================\n");
for(i=0; i<7; i++)
printf("%s ",month_name(i));
printf("\n");
n3=(n+60)%7;
Format(n3);
Prf(31,n3);
printf("\n");
printf("=============================\n");
printf(