万年历C语言课程设计报告
- 格式:doc
- 大小:95.50 KB
- 文档页数:21
c语言课程设计万年历一、课程目标知识目标:1. 理解C语言中结构体、数组、函数等基本概念,并能运用这些知识实现万年历的基本功能;2. 学会使用循环、判断等控制结构,实现对日期的有效处理;3. 了解并掌握C语言中模块化编程的方法,将万年历功能划分为独立的功能模块。
技能目标:1. 能够独立编写C语言程序,实现万年历的日期显示、查询、切换等功能;2. 学会使用调试工具,对程序进行调试和优化,提高程序的稳定性;3. 学会在团队协作中发挥个人优势,与他人共同完成程序设计。
情感态度价值观目标:1. 培养学生积极思考、勇于探索的精神,增强学生对编程的兴趣和热情;2. 培养学生良好的编程习惯,遵循编程规范,注重代码的可读性和可维护性;3. 培养学生的团队协作意识,学会与他人沟通、分享、互助,共同进步。
课程性质:本课程为实践性较强的课程,要求学生在掌握C语言基本知识的基础上,运用所学知识完成万年历的设计与实现。
学生特点:学生具备一定的C语言基础,对编程有一定了解,但实践经验不足。
教学要求:结合学生特点,注重理论与实践相结合,引导学生主动参与,培养学生的编程能力和团队协作能力。
通过课程学习,使学生能够独立完成万年历的设计与实现,提高学生的编程水平和实际操作能力。
二、教学内容1. C语言基本语法复习:回顾结构体、数组、函数等基本概念,确保学生能够熟练运用;相关教材章节:第一章至第四章。
2. 控制结构:讲解循环、判断等控制结构在万年历中的应用;相关教材章节:第五章。
3. 模块化编程:引导学生将万年历功能划分为独立的功能模块,讲解模块之间的调用关系;相关教材章节:第六章。
4. 程序调试与优化:介绍调试工具的使用,教授学生如何找出并解决程序中的错误;相关教材章节:第七章。
5. 项目实践:指导学生按照教学大纲,分阶段完成万年历的设计与实现;相关教材章节:全书综合应用。
教学进度安排:1. 第一周:C语言基本语法复习;2. 第二周:控制结构;3. 第三周:模块化编程;4. 第四周:项目实践(第一阶段:功能设计);5. 第五周:项目实践(第二阶段:功能实现);6. 第六周:项目实践(第三阶段:调试与优化)。
C 语言课程设计报告设计题目:万年历学生姓名:学生学号:专业班级:数学与应用数学一班学院名称:数学与计量经济学院同组人姓名:指导老师:2011年6月15 日1 需求分析1.1问题描述我们需要实现万年历的功能,那么如何实现这个功能呢?我们都很清楚,普通年份和闰年是有区别的,那么该怎么区分这种一天的差别对于万年历日期现实的影响呢?而且已知一个日期,那么我们怎么能够知道它是星期几?是不是需要一个参照物来比较呢?而且还有很多关于万年历的美化问题,占位符的考虑等等。
另外我们还必须判断输入的万年历是否合法,这也需要一个子函数来实现。
好吧,至于基础的判断闰年也是不在话下了。
1.2输入数据要求我们要考虑三种情况,这三种情况下是不能够实现这个万年历的功能的:/*如果给定的日期中年份部分为非正数*/if(date.year<=0)printf("年份不符合要求!\n"printf("请重新输入)/*如果给定的日期中月份部分为负数,为0或者大于12*/if(date.month>12||date.month<1)printf("月份不符合要求!\n");printf("请重新输入");getchar();exit(0);/*如果给定的日期中天数部分为非正数,或者大于31*/a[2]=28+leap(date.year);if(date.day>a[date.month]||date.day<1)printf("日期不符合要求!\n");printf("请重新输入");getchar();exit(0);1.3输出数据要求根据输入数据,输出数据必须严格的按照占位符进行逻辑的策划,然后得知一行万年历的日期的占位符是38个占位符,于是空格占位符和字符显示出来的那些占位符就需要有一个限定使得其不凌乱特别应该注意空格符的占位。
计算机基础课程设计C语言设计报告题目:万年历学院:电气与电子工程学院专业:自动化班级:070304姓名:于洋指导教师:周丽娟设计日期:一、设计题目及来源万年历,来自网上搜索。
二、功能isLeap()判断输入数据是否是闰年;maxDay()判断某年某月最多天数;eachYearTotal ()判断这一天是该年的第几天;week判断某年某月某日的编号;output()输出该天星期几;display()显示月历;check()检查有效性;display1()输出年历;display2()输出月历;display3()输出日历;getMenu()调菜单;三、流程图#include<stdio.h>#include<stdlib.h>int isLeap(int year);int maxDay(int year,int month);int eachYearTotal(int year,int month,int day); int week(int year,int month,int day);char *chineseWeek(int number);void output(int year,int month,int day);void display(int year,int month);int check(int year,int month,int day);void display1(int year);void display2(int year,int month);void display3(int year,int month,int day); void getMenu();void main(){int year,month,day,flag,select;while(1){getMenu();printf("shu ru xuan ze: ");fflush(stdin);scanf("%d",&select);fflush(stdin);switch(select){case 1:do{printf("shu ru nian: ");scanf("%d",&year);flag=check(year,1,1);if(flag==0){printf("shu ru wu xiao\n");}}while(flag==0);display1(year);break;case 2:do{printf("shu ru nian yue: ");scanf("%d%d",&year,&month);flag=check(year,month,1);if(flag==0){printf("shu ru wu xiao\n");}}while(flag==0);display2(year,month);break;case 3:do{printf("shu ru nian yue ri: ");scanf("%d%d%d",&year,&month,&day);flag=check(year,month,day);if(flag==0){printf("shu ru wu xiao\n");}}while(flag==0);display3(year,month,day);break;case 4:exit(0);default:printf("shu ru you wu!\n\n");}}}int isLeap(int year){if(year%4==0&&year%100!=0||year%400==0) return 1;elsereturn 0;}int maxDay(int year,int month){int a[]={31,28,31,30,31,30,31,31,30,31,30,31};if(isLeap(year))a[1]=29;return a[month-1];}int eachYearTotal(int year,int month,int day){int i,sum=0;for(i=1;i<month;i++){sum+=maxDay(year,i);}sum+=day;return sum;}int week(int year,int month,int day){intnumber=(year-1)+(year-1)/4-(year-1)/100+(year-1)/400+eachYearTotal(year,month,d ay);number%=7;return number;}char *chineseWeek(int number){switch(number){case 0:return "Sunday";case 1:return "Monday";case 2:return "Tuesday";case 3:return "Wednesday";case 4:return "Thursday";case 5:return "Friday";case 6:return "Saturday";default:return "error";}}void output(int year,int month,int day){int number=week(year,month,day);printf(" gong yuan%d nian%d ue%d ri%10s\n\n",year,month,day,chineseWeek(number)); }void display(int year,int month){int max,number,i,j=1;max=maxDay(year,month);number=week(year,month,1);printf("%4s%4s%4s%4s%4s%4s%4s\n"," Sunday "," Monday "," Tuesday "," Wednesday "," Thursday "," Friday "," Saturday ");for(i=0;i<number;i++){printf(" ");}while(j<=max){printf("%4d",j);if(i%7==6){printf("\n");}i++;j++;}printf("\n\n");}int check(int year,int month,int day){if(year<0||month<1||month>12||day<1||day>maxDay(year,month))return 0;elsereturn 1;}void display1(int year){int i;printf("\n");for(i=1;i<=12;i++){printf(" gongyuan%d nian%d yue\n\n",year,i); display(year,i);}}void display2(int year,int month){printf("\n gongyuan%d nian%d yue\n\n",year,month); display(year,month);}void display3(int year,int month,int day){printf("\n");output(year,month,day);display(year,month);}void getMenu(){printf("1.nianli\t2.yueli\t3.rili\t4.tuiqu\n");}。
c 万年历课程设计一、课程目标知识目标:1. 学生能够理解年、月、日的关系,掌握平年、闰年的判断方法。
2. 学生能够运用所学的日期知识,制作一个简易的万年历。
3. 学生了解我国农历与公历的异同,认识到不同文化背景下的时间观念。
技能目标:1. 学生通过观察、分析、实践,提高解决问题的能力。
2. 学生学会运用万年历查找特定日期,为生活实际提供便利。
3. 学生能够运用所学知识,创新设计具有个性化的万年历。
情感态度价值观目标:1. 学生培养对时间管理的重视,养成珍惜时间、合理安排时间的好习惯。
2. 学生通过学习我国农历文化,增强民族自豪感,树立文化自信。
3. 学生在合作交流中,培养团队协作精神,学会尊重他人意见,取长补短。
本课程针对小学四年级学生设计,结合学生好奇心强、动手能力逐渐提高的特点,注重培养学生的学习兴趣和实际操作能力。
课程性质为实践性、探究性,旨在让学生在动手实践的过程中,掌握日期知识,提高解决实际问题的能力。
教学要求以学生为主体,教师为主导,注重启发式教学,激发学生的学习兴趣和思考能力,使学生在轻松愉快的氛围中学习,达到课程目标。
通过本课程的学习,学生能够具备制作和运用万年历的基本能力,同时培养良好的时间观念和团队协作精神。
二、教学内容1. 年、月、日的认识与关系- 公历与农历的基本概念- 年、月、日的定义及其相互关系- 平年与闰年的判断方法2. 万年历的制作方法- 万年历的基本结构- 制作万年历的步骤与技巧- 创新设计个性化万年历3. 日期查找与应用- 运用万年历查找特定日期- 日期在实际生活中的应用- 时间管理的方法与技巧教材章节关联:- 《数学》四年级上册第四章“年、月、日”- 《综合实践活动》四年级上册“我们的时间”教学进度安排:1. 第一节课:年、月、日的认识与关系,平年、闰年的判断方法2. 第二节课:万年历的基本结构,制作万年历的步骤与技巧3. 第三节课:个性化万年历的设计与创新,日期查找与应用4. 第四节课:总结与拓展,时间管理的方法与技巧教学内容确保科学性和系统性,以教材为依据,结合实际生活,让学生在掌握日期知识的基础上,学会制作和运用万年历,提高时间管理能力。
万年历 c语言课程设计一、课程目标知识目标:1. 学生能够理解万年历的基本概念,掌握日期与星期之间的转换关系。
2. 学生能够运用C语言中的数据类型、运算符和函数实现日期的计算。
3. 学生掌握结构体在C语言中的应用,并能利用结构体数组存储和管理大量日期数据。
技能目标:1. 学生能够运用所学知识,设计并编写一个简单的万年历程序,实现日期的输入、输出及查询功能。
2. 学生能够在编写程序的过程中,运用结构化编程思想,使代码具有可读性和可维护性。
3. 学生能够通过调试和修改程序,解决实际问题,提高编程解决问题的能力。
情感态度价值观目标:1. 学生培养对计算机编程的兴趣和热情,增强学习C语言的自信心。
2. 学生在团队合作中,学会互相帮助、沟通与协作,培养团队精神。
3. 学生通过编程实践,体会计算机科学在生活中的应用,认识到编程对解决实际问题的价值。
本课程针对高中年级学生,结合C语言编程知识,设计具有实用性和趣味性的万年历项目。
课程旨在让学生在实际编程过程中,掌握C语言的基本语法和编程技巧,提高解决问题的能力,同时培养团队协作和沟通能力。
通过本课程的学习,为学生奠定扎实的编程基础,激发他们对计算机科学的兴趣。
二、教学内容1. C语言基础语法复习:变量、数据类型、运算符、控制语句(条件语句、循环语句)。
2. 函数的定义与调用:重点复习函数的定义格式、参数传递、返回值。
3. 结构体的定义与应用:介绍结构体的概念、定义方法以及如何使用结构体数组。
4. 日期与星期的计算方法:讲解日期与星期之间的转换公式,引导学生理解算法。
5.万年历程序设计:a. 界面设计:设计简洁明了的用户界面,方便用户输入和查看日期。
b. 功能实现:实现日期的输入、输出、查询(按年月查询、按日期查询)。
c. 程序优化:讨论如何优化代码,提高程序运行效率。
d. 错误处理:学习如何处理用户输入错误、日期有效性验证等。
教学内容参考教材相关章节,按照以下进度安排:1. 第一课时:C语言基础语法复习,引入结构体概念。
C语言课程设计报告题目:万年历系统设计者:李文杰专业班级:软件工程(.net)一班学号:************指导教师:***2011年6月30日河南理工大学计算机科学与技术学院目录一、C语言课程设计任务书 (3)1、C语言课程设计目的和要求 (3)1.1目的: (3)1.2要求: (3)二、本组课题及本人任务 (3)三、程序功能简介 (4)四、主题内容 (4)1、题目与要求 (4)1.1 问题提出 (4)1.2 本系统涉及的知识点 (5)1.3 功能要求 (5)2、功能设计 (6)2.1 算法设计 (6)3、程序流程图.. (8)4、程序代码设计 (9)4.1输入及年份平润确定模块 (9)4.2求星期天数模块 (9)4.3求月份天数模块 (11)4.4查询模块 (11)4.5输出及验证模块 (12)4.6说明: (12)5、C程序设计总结 (12)6、结束语 (13)参考文献 (13)一、C语言课程设计任务书1、C语言课程设计目的和要求1.1目的:1)复习、巩固C语言的基础知识,进一步加深对C语言的理解和掌握;2)课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。
提高学生适应实际,实践编程的能力;3)培养学生在项目开发中团队合作精神、创新意识及能力。
1.2要求:1)、对系统进行功能模块分析、控制模块分析正确,符合课题要求,实现相应功能;可以加以其他功能或修饰,使程序更加完善、合理;2)、系统设计要实用,编程简练,可用,功能全面3)、说明书、流程图要清楚4)、记录设计情况(备查,也为编写设计说明书作好准备);5)、要求采用模块化程序设计方法,及锯齿型书写格式,要求上机调试通过和按设计报告格式。
6)、设计上交内容:设计报告一份(按格式书写);源程序盘一张(能编译成可执行文件并能正常运行,可一个班交一张光盘)。
二、本组课题及本人任务经考虑及尝试,本人决定选择题目2.2编写一个万年历系统,完成对日期的查询输出。
多功能电脑时钟设计报告一、实训目的意义及任务要求1.1目的意义单片机的使用领域已十分广泛,如智能仪器仪表、实时工控、通讯设备、导航系统、家用电器等。
“学好单片机,工作就不成问题了。
”老师说,可见学好单片意义之重大。
单片机作为一门基础学科,既是对前期学习C语言的综合运用,也是理论与实践相结合的一大体现。
电脑时钟有效地检验了对DS1302时钟芯片,STC89C52单片机中断,独立键盘,数码管,蜂鸣器,LED灯的控制,同时提高了学生的工程系统设计能力。
LED数字显示的日历钟显示清晰直观、走时准确、可以进行夜视,并且还可以扩展出多种功能。
所以,电子万年历无论作为比赛题目还是练习题目都是很有价值。
通过此次单片机系统综合训练,不仅要让学生认识了解它,而且增强学生学科积极性。
2.2任务要求要求设计的电脑时钟完成以下功能:1.基本功能①实时显示当前时间(4位数码管显示,2位显示小时,2位显示分钟,第2位小数点0.5秒亮,0.5秒灭)。
②能用一按键依次切换显示年及月日。
③能修改当前时钟。
④具有秒表功能,显示秒和百分秒。
2. 扩展功能①单片机与PC机的通讯(可选)②可设定初值的倒计时功能(可选)③闹钟及报时功能(可选)。
④显示星期(可选)。
二、实训方案2.1 系统分析根据系统功能要求,可将系统组成结构分成四大部分:DS1302时钟芯片读数据写数据模块,数码管显示模块,按键设置调节时间模块,秒表功能模块,。
硬件电路接线图如后图,本系统采用DS1302时钟芯片,四位数码管显示年月,日星期,时分,以及秒和百分秒。
其中年月日,时分秒和星期采用DS1302的数据显示,秒表采用单片机定时中断实现。
本系统共用到四个按键,且均为独立对地按键,分别用于显示切换,修改切换,修改加一,修改减一,秒表启动暂停和数据清零。
2.2 器件选择选用STC89C52芯片,频率为11.0592MHz;由于系统要求显示年月日小时和分钟,采用四位LED数码管显示即可;按键是用来设置北京时间或闹钟时间或启动秒表等功能的,设置三个按键:显示切换模式键(key3)、修改数据键(key0)、加一键(key1)、减一键(key2)。
c万年历课程设计一、课程目标知识目标:1. 让学生理解并掌握万年历的基本概念,包括阳历、阴历以及它们之间的关系。
2. 学会运用所学的日期计算方法,计算出任意给定年份的星期几。
3. 了解我国历史上重要的节日及其在万年历中的体现。
技能目标:1. 培养学生运用万年历进行日期推算的能力,提高他们的逻辑思维和计算能力。
2. 通过制作简单的手工万年历,锻炼学生的动手操作能力和创新能力。
情感态度价值观目标:1. 培养学生对万年历文化的兴趣,激发他们学习历史和传统文化的热情。
2. 引导学生认识到万年历在日常生活中的实用性,增强他们的生活常识。
3. 培养学生尊重历史、尊重传统文化,形成正确的价值观。
课程性质分析:本课程为实用工具课程,旨在帮助学生掌握万年历的基本知识,提高他们在生活中的实用技能。
学生特点分析:考虑到学生所在年级,他们已经具备了一定的逻辑思维和计算能力,但对于复杂的概念和技巧还需要进一步的引导和锻炼。
教学要求:结合学生特点,课程设计要注重理论与实践相结合,强调学生的动手实践能力,同时注重培养他们的情感态度和价值观。
通过具体的学习成果分解,为后续的教学设计和评估提供明确的方向。
二、教学内容1. 万年历的基本概念:阳历、阴历、农历、公历的起源及关系。
- 教材章节:第一章第一节“时间的计算与历法”2. 日期计算方法:- 平年与闰年的判断方法。
- Zeller公式及其在日期计算中的应用。
- 教材章节:第一章第二节“日期的计算方法”3. 制作手工万年历:- 设计并制作个人简易万年历。
- 教材章节:第二章“动手制作万年历”4. 我国重要节日及其历法体现:- 春节、中秋节、端午节等节日的历法含义。
- 教材章节:第三章“历法与我国重要节日”5. 实践活动:- 利用所学日期计算方法,进行实际操作练习。
- 分析并讨论生活中万年历的应用实例。
教学内容安排与进度:第一课时:万年历基本概念的学习。
第二课时:日期计算方法的学习与练习。
万年历系统题目:万年历系统姓名:黄炼军学号:20070810505学院:计算机与通信学院专业:计算机科学与技术0705班指导老师:何英完成时间:2009年11月10日一、问题描述模仿Windwos的日历.1)日历显示功能。
能根据系统日期进行初始化,如果没有任何输入,则显示系统日期所在月份的月历。
2)日历查询、闰年判断功能。
输入日期进行查询,显示查询日期所在月份的月历,还将显示所在年份是否为闰年。
3)参数检查功能。
如果输入日期不合法,查询将被拒绝,并显示提示信息。
4)选做:通过键盘操作(如:光标上、下、左、右移动键,pageup、pagedown键)调整年份、月份和日期,并显示调整后的日期及月历。
二、问题分析对于要求1:难点在于判断星期,但根据蔡勒公式,可以很容易地有年月日推断出星期:nDay=year-1+(year-1)/4-(year-1)/100+(year-1)/400+nday;w=nDay%7;其中year:要查询的年份nday:从该年的一月一日起到该天的天数w:得出的星期数,w==0表示星期天。
在打印月历时,只要知道第一天的星期,就可以依次输入后面的日期,通过定长度输出日期,在遇到某天时星期六时,就换行输出,因此可以按照月历的格式输出。
对于初始输入当前月历,可以通过<time.h>中的time 和localtime函数取出系统时间进行初始化。
time_t timer;struct tm* gmt;time(&timer);gmt=localtime(&timer);gmt就是一个时间结构体,可以从中取出年月日。
对于要求2:闰年的判断,能被4整除但不能被100整除,或者能被400整除的年份为闰年,否则为平年。
日期的查询,就是直接打印改天所在月份的月历。
对于要求3:判断日期是否合法,可以先判断年月日是否有小于0的值,月和日是否有超出最大值12和31 ,如果通过此判断合法,再判断是否时闰年,如果时闰年,则判断二月份是否满足要求,闰年二月份不能超过29天,平年二月份不能超过28天。
千里之行,始于足下。
C语言万年历设计报告以下是一个关于C语言万年历设计报告的例子,共计约:设计报告:C语言万年历1. 引言万年历是一种用来显示特定年份日历的工具。
本设计报告将介绍一个使用C语言编写的万年历程序,它可以接受用户输入的年份,并显示该年份的日历。
2. 设计目标本程序的主要设计目标是实现以下功能:- 接受用户输入的年份。
- 检查年份的有效性。
- 显示该年份的万年历。
3. 设计思路万年历程序的设计思路如下:- 首先,接受用户输入的年份。
这可以通过使用C语言的scanf函数等方法来实现。
- 然后,检查年份的有效性。
年份必须大于0且小于或等于当前年份。
这可以通过使用C语言的条件语句来实现。
- 接下来,确定年份的第一天是星期几。
这可以通过查找该年份第一天距离已知星期几(比如星期一)的天数来实现。
- 然后,确定该年份每个月的天数。
根据已知的规则(比如闰年规则),计算每个月的天数。
- 最后,根据以上信息,显示该年份的日历。
可以使用C语言的循环语句和格式化输出函数来实现。
第1页/共2页锲而不舍,金石可镂。
4. 主要函数本程序将包含以下主要函数:- int isLeapYear(int year):判断给定年份是否是闰年。
根据已知的闰年规则进行计算,并返回一个布尔值。
- int getFirstDayOfWeek(int year):确定给定年份的第一天是星期几。
根据该年份的第一天距离已知星期几的天数进行计算,并返回一个整数(代表星期几)。
- void printCalendar(int year):根据给定年份的信息,打印该年份的日历。
5. 测试和调试在开发过程中,可以使用一些测试和调试方法来确保程序的正确性和稳定性。
比如:- 输入测试:使用各种不同类型的数据(正常、边界和异常)进行测试,确保程序在各种情况下都能正常工作。
- 边界测试:测试该程序处理边界条件的能力,比如闰年、非闰年、最小年份、最大年份等。
程序实践报告任务分配:1、头文件,定义常量,全局变量,自定义函数和打印输出模块。
即1~50和140~2902、功能控制模块和一部分日历显示模块,即50~140和290~4003、一部分日历显示模块和键值获取模块,即400~1、基本思路功能模块图本系统包括4个模块,分别是功能控制模块、打印输出模块、日历显示模块和键值获取模块。
(1)功能控制模块。
该模块用于实现日期有效性检查、判断是否是闰年和返回指定日期对应的星期。
(2)打印输出模块。
该模块主要是进行输出显示,包括打印指定个数的空格、打印分隔线、打印用户使用手册、打印当前日期对应的星期以及打印给定的星期。
(3)日历显示模块。
该模块是系统的核心模块,是用来显示指定日期所在月份的月历。
(4)键值获取模块。
该模块接受键盘操作,获取键值,来进行日期调整,并调用日历显示模块中的函数来显示调整后的日历。
日历显示模块日历显示是系统的核心模块,它控制着日历的生成和显示。
其实现流程如图所示。
程序输入的是包含年月日(year,month和day)的日期,输出month所在月份的月历,并突出显示day 所在的日期和year是否是闰年的标识。
程序首先根据year判断其是否是闰年,如果是则需要将该年2月份的天数设置为29天,接着判断day是否超过month所在月份的最大天数,如果超过则显示系统日期所在的月历。
然后进行星期输出的判断,如果输出的是该月的第一个星期,则判断该星期中还有几天在本月(如,该月1号是星期五,则表示该月第一个星期中只有两天在本月,星期一到星期四在上月,则星期一到星期四在本月就不输出,仅有空格表示),输出空格。
输出完第一周后,接着输出第二到第五(或者六)周,每周7天。
在输出过程中,如果遇到了day所在的日期,则突出显示。
键值获取流程图键值获取实现的是从键盘调整日期并显示调整后的月历。
其实现流程如图所示。
系统首先判断从键盘输入的值,如果是右移键,表示增加月份。
此时,如果当前月份是12月,则增加月份后就进入下一年的一月;如果是左移键,表示减少月份。
此时,如果当前月份是1月,则减少月份后就进入上一年的12月;如果是上移键表示增加年份,直接年份加1即可;如果是下移键表示减少奶奶分,直接年份减1即可;如果是向上翻页键表示减小日期。
如果是1月1号,则减少日期后进入上一年的12月31号,如果是某一个月的1号,则减小日期后进入上一月的最后一天;如果是向下翻页键表示增加日期。
如果是12月31号,则增加日期后进入到下一年的1月1号,如果是某一个月的最后一天,则增加日期后进入到下一个月的第一天;如果是Q/q键表示查询日期,此时将输出提示信息,提示用户输入查询日期。
在用户输入查询日期后,系统就爱那个调用日期检查函数对输入日期的合法性进行检测,如果输入日期不合格,则提示错误信息并显示当前系统日期所在月的月历;如果是空格键表示重置,显示当前系统日期所在月的月历;如果是Esc键表示退出系统,按此键后,系统将询问用户是否确定退出,在得到确定回答(用户输入Y/y)后将退出系统。
2、函数功能描述1)checkDate()函数原型:void checkDate()checkDate()函数用于检查输入日期的合法性,包括检查输入日期中的年、月、日部分。
对于年,检查其是否是负数或者是0;对于月,检查其是否是范围在1~12中的值;对于日,检查其是否是范围在1~31中的值。
如果有一个部分不合法,则程序提示用户。
2)isLeapyear()函数原型:int isLeapyear(int year)isLeapyear()函数用于判断制定月份是否是闰年。
参数year为待判断的年份。
3)getWeek()函数原型:int getWeek(int year,int month,int day)getWeek()函数用于计算并返回给定日期对应的星期。
其中参数year、month和day都为整型,分别表示输入的年、月和日。
4)printSpace()函数原型:void printSpace(int n)printSpace()函数用于输出制定个数的空格。
其中整型参数n表示需要输出的空格的个数。
5)printSepatator()函数原型:void printSeparator()printSeparator()函数用于在制定位置输出用户使用手册。
输出位置在函数中已经设定。
7)printWeek()函数原型:void printWeek()printWeek()函数用于输出当前日期对应的星期,即由currentYear,currentMonth和currentDay 确定的日期对应的星期。
该函数首先调用getWeek()函数返回当前日期对应的星期。
8)printWeek2()函数原型:void printWeek2(int week)printWeek2()函数用于根据制定值输出星期。
参数week是一个整型变量,其值可取0到6,分别表示星期一到星期日。
8)showCalendar()函数原型:void showCalendar(int year,int month,int day)showCalendar()函数用于显示日历。
参数year,month和day分别表示年、月和日。
该函数显示year所在年是否是闰年,显示month所在月的月历,突出显示day所在日的日期。
10)getKeyValue()函数原型:void getKeyValue()getKeyValue()函数用于获取键盘的输入。
根据键盘的输入(上下移键、左右移键、上下翻页键、Q/q键)调整当前日期,并显示当前日期所在月的月历等。
4、遇到的问题和相应的解决措施1.dos.h头文件不能在常用的Visual C++里使用。
若使用Turbo C,则键入的汉字无法显示,且无法复制粘贴。
解决措施:经过上网查询和询问同学,知道了导致问题的原因,但若把dos.h在visual c++中换成time.h,过程太复杂,很难实现。
最后,我们跟同学借了一个win-TC,是C语言程序,且可以使用中文和进行复制粘贴;2.键入程序代码的时候显示“非法字符’?(0xa3)在showCalender函数中”解决措施:把showCalender函数全部检查一遍也没有找出问题所在,然后咨询老师,经验丰富的老师一眼看出函数中的一个左括号是用拼音输出的,不是英文;3.程序可以运行,但应该只显示一个向下箭头的地方显示了三行,且覆盖了其他的字符。
解决措施:认真的又检查了一遍,发现“指定输出字符为向下的箭头”的函数中,_CX=01,写成了_CH=01;4.万年历需要获取系统时间,不知从何下手。
解决措施:经查阅资料,得知应用:currentYear=sysTime.da_year;currentMnth=sysTime.da_mon;currentDay=sysTime.da_day;5、心得体会经历了这次课程设计的设计和制作的整个过程,我们才发现我们知识的贫乏和知识面的狭窄,原本以为不就是一个小小的课程设计,小case,很容易就可以搞定,可是到了后来实际的操作的时候可是花费了我们九牛二虎之力,不说其他的,只说时间上面,我们就花费了大把的时间,当然我们也从中体会了很多平时不能收获的东西。
经过一个多月的自主上机和三个多星期的大作业编写,我们一队三人的齐心努力,查阅书籍,上网查询等各种途径,完成了这次的大作业编写。
其中遇到了很多问题,一一解决的过程让我们学会了很多,当然有很多最初的构想没有实现,这也是我们的遗憾之处。
这次作课程设计我们也是收获很大,我们更深入的体会到团队的重要性,通过自学学到了更多C语言的编译,如插入颜色,读取系统时间等,这会是我们终身的财富。
首先,我们对C语言有了更深的了解,使用起来也更加的熟练,原来有一些不知道和不熟悉的函数,我们学会用了。
其次,我们这一次找了不少的资料,找专业的书籍、上网找各方面的资料,也使我们学到了一些书本中学不到的知识,让我们长了见识。
同时我们同学之间也互相的探讨,也增进了我们同学之间的感情。
这次的万年历设计,虽然我们自己觉的很有的成就感,但是这必竟是我们第一次C语言的课程设计,必然会有很多的不足之处有待改进,相信以后我们一定会做的更好。
同时也感谢老师们的耐心讲解与指导,我们期待下一次可以做的更好!【程序代码】/*加载头文件*/#include<stdio.h>#include<bios.h>#include<dos.h>#include<conio.h>#include<graphics.h>#include<string.h>#include<stdlib.h>/*定义常量*//*左移键*/#define LEFT 0x4b00/*右移键*/#define RIGHT 0x4d00/*下移键*/#define DOWN 0x5000/*上移键*/#define UP 0x4800/*向上翻页键*/#define PAGEUP 0x4900/*向下翻页键*/#define PAGEDOWN 0x5100/*小写字母q*/#define QLOWER 0x1071/*大写字母Q*/#define QUPPER 0x1051/*空格键*/#define SPACE 0x3920/*Esc键*/#define ESC 0x011b/*定义全局变量*/struct date sysTime;int currentYear;int currentMonth;int currentDay;int n_currentMon;int n_lastMon;/*--------------------------自定义函数-------------------------*/ void checkDate();int isLeapyear(int year);int getWeek(int year,int month,int day);void printSpace(int n);void printSaparator();void printUsage();void printWeek();void printWeek2(int week);void showCalendar(int year,int month,int day);void getKeyValue();welcome(){int i, graphdriver,graphmode,size,page;char s[30];graphdriver=DETECT;initgraph(&graphdriver,&graphmode,""); cleardevice();setbkcolor(BLUE);setviewport(40,40,600,440,1);setfillstyle(1,2);setcolor(YELLOW);rectangle(1,1,560,400);floodfill(50,50,14);rectangle(20,20,540,380);setfillstyle(1,13);/* 开图视口*//* 用绿色填画出的矩形框*/floodfill(2l,300,14);setcolor(BLACK);settextstyle(1,0,6);/* 用淡洋红色填画出的矩形框*//* 设要显示字符串的字形方向,尺寸*/outtextxy(100,60,"Welcom you");setviewport(100,150,540,380,0); /* 又开一窗口*/setcolor(14);setfillstyle(1,10);rectangle(20,20,420,120);settextstyle(2,0,9);floodfill(21,100,14);/* 用深蓝色填充*/sprintf(s,"Hey girl!!Do you want to know?"); /* 将字符串存到s 字符数组*/setcolor(1);settextstyle(10,0,10); /* 设选用字形4,放大3 倍,水平设置*/outtextxy(110,80,s); /* 显示s 字符串*/getch();closegraph();}/*功能控制模块*//*检查日期有效性函数*/void checkDate(){/*如果给定的日期中年份部分为负数或者0*/if(currentYear<=0){gotoxy(1,27);printf("The year should be a positive number !\n");gotoxy(1,28);printf("Press any key to comtinue.......");getchar();getchar();/*以当前系统时间重新赋值*/currentYear=sysTime.da_year;currentMonth=sysTime.da_mon;currentDay=sysTime.da_day;}/*如果给定的日期中月份部分为负数,为0或者大于12*/if(currentMonth>12||currentMonth<1){gotoxy(1,27);printf("The month should be a number between 1 and 12 !\n"); gotoxy(1,28);printf("Press any key to continue......");getchar();getchar();/*以当前系统时间重新赋值*/currentYear=sysTime.da_year;currentMonth=sysTime.da_mon;currentDay=sysTime.da_day;}/*如果给定的日期中天数部分为负数,为0或者大于31*/if(currentDay>31||currentDay<1){gotoxy(1,27);printf("The day should be a number between 1 and 31 !\n"); gotoxy(1,28);printf("Press any key to continue......");getchar();getchar();/*以当前系统时间重新赋值*/currentYear=sysTime.da_year;currentMonth=sysTime.da_mon;currentDay=sysTime.da_day;}}/*判断是否是闰年函数*/int isLeapyear(int year){/*闰年的判断:(1)year被4整除,并且year不被100整除或(2)year被4整除,并且被400整除*/ if(year%4==0&&year%100||year%400==0)return 1;elsereturn 0;}/*根据给定日期计算星期函数*/int getWeek(int year,int month,int day){int leapFlag;int week;int i;/*该数组用于保存每个月的天数*/int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};int count=0;/*判断给定年份是否是闰年*/leapFlag=isLeapyear(year);/*如果是闰年则2月份的日期应该为29天*/if(leapFlag==1)a[2]++;/*计算从给定年份的1月1日到给定月份的1号之间的天数*/for (i=1;i<month;i++){count+=a[i];}/*计算从给定年份的1月1日到给定日期之间的天数*/count+=day;/*计算星期*/week=(year+1+(year-1)/4+(year-1)/100+(year-1)/400+count)%7;return week;}/*打印输出模块*//*输出指定个数空格函数*/void printSpace(int n){int i;for(i=0;i<n;i++)printf(" ");}/*输出分割线函数*/void printSeparator(){int i;for(i=0;i<38;i++){printf("=");}printf("\n");}/*输出使用方法函数*/void printUsage(){gotoxy(45,3);/*设定字体颜色*/textcolor(YELLOW);/*送格式化输出至屏幕*/cprintf("-----------Usage-----------");gotoxy(45,5);textcolor(YELLOW);cprintf("YEAR");gotoxy(50,5);printf(" Up key( ) to increase;\n");gotoxy(50,7);printf(" Down key( ) to decrease.\n");gotoxy(45,9);textcolor(YELLOW);cprintf("MONTH:");gotoxy(50,9);printf(" Right key( ) to increase;\n");gotoxy(50,11);printf(" Left key( ) to decrease.\n");gotoxy(45,13);textcolor(YELLOW);cprintf("DAY");gotoxy(50,13);printf(" PageDown key to increase;\n");gotoxy(50,15);printf(" PageUp key to decrease.\n");gotoxy(45,17);textcolor(YELLOW);cprintf("QUERY");gotoxy(50,17);printf(" Q/q key\n");textcolor(YELLOW);gotoxy(45,19);cprintf("RESET");gotoxy(50,19);printf(" SPACE key.\n");gotoxy(45,21);textcolor(YELLOW);cprintf("EXIT");gotoxy(50,21);printf(" Esc key\n");gotoxy(59,5);/*设置寄存器,表示在指定位置输出一次指定的字符*/ _CX=01;_AH=0xa;/*指定输出字符为向上的箭头*/_AL=24;/*产生一次中断,输出向上的箭头*/geninterrupt(0x10);gotoxy(61,7);_CX=01;_AH=0xa;/*指定输出字符为向下的箭头*/_AL=25;geninterrupt(0x10);gotoxy(62,9);_CX=01;_AH=0xa;_AL=26;/*指定输出字符为向右的箭头*/geninterrupt(0x10);gotoxy(61,11);_CX=01;_AH=0xa;/*指定输出字符为向左的箭头*/_AL=27;geninterrupt(0x10);/*还原字体颜色*/textcolor(7);}/*根据系统日期输出星期函数*/void printWeek(){int day;/*根据日期获得星期*/day=getWeek(currentYear,currentMonth,currentDay);textcolor(11);/*输出星期,0表示星期天,1表示星期一……6表示星期六*/if(day==0)cprintf("%d-%d-%d,Sunday!",currentYear,currentMonth,currentDay);if(day==1)cprintf("%d-%d-%d,Monday!",currentYear,currentMonth,currentDay);if(day==2)cprintf("%d-%d-%d,Tuesday!",currentYear,currentMonth,currentDay);if(day==3)cprintf("%d-%d-%d,Wednesday!",currentYear,currentMonth,currentDay);if(day==4)cprintf("%d-%d-%d,Thursday!",currentYear,currentMonth,currentDay);if(day==5)cprintf("%d-%d-%d,Friday!",currentYear,currentMonth,currentDay);if(day==6)cprintf("%d-%d-%d,Saterday!",currentYear,currentMonth,currentDay);textcolor(7);}/*输出指定星期函数*/void printWeek2(int week){if(week==0)cprintf(",Sunday");if(week==1)cprintf(",Monday");if(week==2)cprintf(",Tuesday");if(week==3)cprintf(",Wendesday");if(week==4)cprintf(",Thursday");if(week==5)cprintf(",Friday");if(week==6)cprintf(",Staturday");}/*日历显示模块*//*显示日历函数*/void showCalendar(int year,int month,int day){int i;int j;/*输出的日期*/int outDay;int leapFlag;/*本月第一个星期中,在上月的天数*/int dayLastMon;int week;/*该数组用于保存每个月的天数*/int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};outDay=0;dayLastMon=0;week=0;/*判断给定年份是否是闰年*/leapFlag=isLeapyear(year);/*如果是闰年则2月应该是29天*/if(leapFlag==1){a[2]++;}/*如果给定的日期中,天数大于该月的最大天数*/if(day>a[month]){printf("The number of this month's day is %d at most !\n",a[month]);printf("press any key to continue.....\n");getchar();getchar();/*以当前系统时间重新赋值*/year=sysTime.da_year;month=sysTime.da_mon;day=sysTime.da_day;currentYear=sysTime.da_year;currentMonth=sysTime.da_mon;currentDay=sysTime.da_day;}/*当前月的天数*/n_currentMon=a[month];/*上一月的天数*/n_lastMon=a[month-1];/*根据给定日期,获取给定月份1号的星期*/ week=dayLastMon=getWeek(year,month,1);/*清除文本模式窗口*/clrscr();printf("\nThe calendar of %d:",year);textcolor(10);/*显示给定是否是闰年*/if(leapFlag==1)cprintf("[leap year]",year);if(leapFlag==0)cprintf("[not leap year]",year);printf("\n");textcolor(7);printSeparator();textcolor(YELLOW);/*输出月份提示,1~12分别表示1月到12月*/ switch(month){case 1:cprintf("January 1");break;case 2:cprintf("Fabruary 2");break;case 3:cprintf("March 3");break;case 4:cprintf("April 4");break;case 5:cprintf("May 5");break;case 6:cprintf("June 6");break;case 7:cprintf("July 7");break;case 8:cprintf("August 8");break;case 9:cprintf("September 9");break;case 10:cprintf("October 10");break;case 11:cprintf("November 11");break;case 12:cprintf("December 12");break;}textcolor(7);printf("\n\n");textcolor(13);cprintf("Sun Mon Tue Wed Thu Fri Sat");textcolor(7);printf("\n\n");/*因为一个月中最多跨度6个星期,所以循环从0到5*/for(i=0;i<6;i++){/*如果是该月的第一星期*/if(i==0){/*第一个星期中还要7-daylastmon天本月,有daylastmon天在上个月,所以输出daylastmon*4个空格符,每个日期在日历中占用4个空格*/printSpace(dayLastMon*4);/*剩余在本月的第一个星期中的天数为7-dayLastmon*/for(j=0;j<7-dayLastMon;j++){/*到达day的前一天时,输出++outDay*/if(outDay==day-1){/*黄色字体突出显示*/textcolor(YELLOW);cprintf("[%d]",++outDay);textcolor(7);}/*到达day当天时,并且不是星期天*/else if(outDay==day&&week!=0){printf("%3d",++outDay);}/*到达day当天时,并且是星期天*/else{printf("%4d",++outDay);}/*计算当天的星期,如果前一天时星期六(6),当天时星期天(0),其他情况则直接星期加1*/week=(week<6)?week+1:0;}printf("\n\n");}/*如果不是该月的第一个星期*/else{/*则输出该星期中的7天*/for(j=0;j<7;j++){/*输出的天数小于该月的最大天数*/if (outDay<a [month]){/*到达day的前一天时,输出++outDay*/if(outDay==day-1){/*输出一位数字*/if(outDay<9){textcolor(YELLOW);cprintf("[%d]",++outDay);textcolor(7);}/*输出两位数字*/else{textcolor(YELLOW);cprintf("[%2d]",++outDay);textcolor(7);}}/*到达day当天时,并且不是星期天*/else if(outDay==day && week!=0){printf("%3d",++outDay);}/*到达day当天时,并且是星期天*/else{printf("%4d",++outDay);}}/*计算当天星期*/week=(week<6)?week+1:0;}printf("\n\n");if (outDay==a[month])break;}}/*输出分割线*/printSeparator();/*输出当前选择的日期和星期*/printf("The day you choose is:\n\n");printWeek();gotoxy(1,22);textcolor(10);cprintf("--------------------\n");textcolor(7);/*输出系统日期和星期*/printf("\nToday is: %d-%d-%d",sysTime.da_year,sysTime.da_mon,sysTime.da_day); printWeek2(getWeek(sysTime.da_year,sysTime.da_mon,sysTime.da_day));printf("\n\n");/*显示按键操作*/printUsage();gotoxy(1,25);}/*键值获取模块*//*通过键盘调整日期函数*/void getKeyValue(){int key;char ch;/*默认显示当前系统日期和星期*/currentYear=sysTime.da_year;currentMonth=sysTime.da_mon;currentDay=sysTime.da_day;showCalendar(currentYear,currentMonth,currentDay);while(1){/*获取键值,根据键值调整日历输出*/key=bioskey(0);/*右移键,增加月份*/if(key==RIGHT){/*月份值在1~12之间,则直接加1*/if(currentMonth<12 && currentMonth>=1){currentMonth++;}/*如果月份为12,则加1后进位,即年份加1,月份变为1*/ else{currentYear++;currentMonth=1;}}/*左移键,减少月份*/if (key==LEFT){/*月份值在1~12之间,则直接减1*/if (currentMonth<=12 && currentMonth>1){currentMonth--;}/*如果月份为1,则减1后,到上一年,月份变为12*/else{currentYear--;currentMonth=12;}}/*上移键,增加年份*/if (key==UP){currentYear++;}/*下移键,减少年份*/if (key==DOWN){currentYear--;}/*上移键,减少天数*/if (key==PAGEUP){/*当前日不是该月的第一天,则天数直接减1*/if (currentDay!=1){currentDay--;}/*当前日是该月的第一天,并且是该年的第一个月(即1月1日),则天数减1后,变为上一年的最后一个月的最后一天(即12月31日)*/else if (currentDay==1 && currentMonth==1){currentYear--;currentMonth=12;currentDay=31;}/*当前日是该年中某一个月的第一天,则天数减一后,变为上个月的最后一天*/ else{currentMonth--;currentDay=n_lastMon;}}/*下移键,增加天数*/if(key==PAGEDOWN){/*当前日不是该月的最后一天,则天数直接加1*/if (n_currentMon!=currentDay){currentDay++;}/*当前日是该年的最后一天(即12月31日),则天数加1后,变为下一年的第一个月的第一天(即1月1日)*/else if(n_currentMon==currentDay && currentMonth==12){currentYear++;currentMonth=1;currentDay=1;}/*当前日是该年中某一个月的最后一天,则天数加1后,变为下个月的第一天*/else{currentMonth++;currentDay=1;}}/*Q或者q键,表示查询指定日期的星期*/if (key==QLOWER||key==QUPPER){{printf("Input date(eg,%d-%d-%d):",sysTime.da_year,sysTime.da_mon,sysTime.da_day);scanf("%d-%d-%d",¤tYear,¤tMonth,¤tDay);checkDate();}}/*空格键,重置到系统日期*/if (key==SPACE){currentYear=sysTime.da_year;currentMonth=sysTime.da_mon;currentDay=sysTime.da_day;}/*Esc键退出系统*/if (key==ESC){printf("Do you really want to quit?(Y/N)");ch=getchar();if (ch=='y'||ch=='Y')break;}showCalendar(currentYear,currentMonth,currentDay);}}void printtext(unsigned char *temp[],int i){setcolor(4); /*设置颜色*/settextstyle(TRIPLEX_FONT,HORIZ_DIR,3); /*设置字符的字体,方向和大小*/ outtextxy(100,40+i*50,temp[i]); /*在所指定的坐标出显示字符串*/ }/*主函数*/void main(){int i,graphdriver,graphmode;unsigned char *temp[4];int freq[96]={659,587,659,587,659,494,587,523,440,330,440,494,330,494,523,659,587,659,587,659,494,587,523,440,330,440,494,330,523,494,440,440,494,523,587,659,659,330,699,659,587,587,330,659,587,523,523,330,587,523,494,494};int dely[96]={50,50,50,50,50,50,50,50,100,50,50,100,50,50,100,50,50,50,50,50,50,50,50,100,50,50,100,50,50,50,50,100,50,50,50,50,100,50,50,50,50,100,50,50,50,50,100,50,50,50,50,100};graphdriver=DETECT;graphmode=0;temp[0]="Welcome !";temp[1]="Please press any key to start the music......";temp[2]="Do you like it?";temp[3]="Press any key to end the music!";temp[4]="Welcome to calendar";initgraph(&graphdriver,&graphmode,""); /*系统初始化*/cleardevice(); /*清除屏幕*/settextjustify(LEFT_TEXT,CENTER_TEXT); /*设置字符排列方式*/for(i=0;i<2;i++)printtext(temp,i);getch();\for(i=2;i<4;i++)printtext(temp,i);i=0;while(i<96&&!kbhit()){sound(freq[i]); /*扬声器根据频率发声*/ delay(1100*dely[i]); /*声音延时*/i++;}nosound(); /*关闭扬声器*/printtext(temp,4);getch();closegraph(); /*关闭图形模式*/welcome();window(1,1,80,25);textbackground(0);textcolor(WHITE);/*清除文本模式窗口*/clrscr();/*设置屏幕显示方式*/_AL=03;_AH=0;geninterrupt(0x10);getdate(&sysTime);getKeyValue();}。