课程设计万年历的设计52503328
万年历单片机课程设计

万年历单片机课程设计一、课程目标知识目标:1. 学生能理解单片机的基本原理,掌握其功能和应用。
2. 学生能掌握万年历的运行机制,理解日期、时间计算的方法。
3. 学生能了解并运用编程语言(如C语言)进行单片机程序设计。
技能目标:1. 学生能运用所学知识,设计并实现一个具有日期和时间显示功能的万年历单片机系统。
2. 学生能够通过实践操作,掌握使用开发工具和调试技巧,提高问题解决能力。
情感态度价值观目标:1. 学生培养对单片机技术及编程的兴趣,激发创新意识和探索精神。
2. 学生通过团队协作,培养沟通、合作能力,提高集体荣誉感。
3. 学生在学习过程中,认识到科技发展对社会的重要性,增强社会责任感。
课程性质:本课程为实践性较强的课程,结合理论知识与实践操作,让学生在动手实践中掌握单片机技术。
学生特点:学生具备一定的电子技术基础,对编程有一定了解,好奇心强,喜欢动手实践。
教学要求:教师需结合学生特点,采用任务驱动、案例教学等方法,引导学生主动探究,确保课程目标的实现。
在教学过程中,注重培养学生的实践能力和创新能力。
通过对课程目标的分解和教学评估,确保学生达到预期学习成果。
二、教学内容1. 单片机基础知识:介绍单片机的组成、工作原理及功能特点,结合教材第二章内容,使学生建立单片机的基本概念。
2. 编程语言基础:回顾C语言编程基础,强调其在单片机编程中的应用,参考教材第四章进行教学。
3. 万年历原理:讲解日期和时间的计算方法,分析万年历的运行机制,结合教材第三章内容进行教学。
4. 单片机程序设计:教授如何使用C语言编写单片机程序,实现万年历功能,参考教材第五章内容。
5. 硬件电路设计:介绍万年历单片机系统的硬件组成,分析电路原理,结合教材第六章进行教学。
6. 实践操作:指导学生使用开发工具进行程序编写、调试和烧录,完成万年历单片机系统的搭建和测试。
7. 教学进度安排:- 第1周:单片机基础知识学习;- 第2周:编程语言基础复习;- 第3-4周:万年历原理讲解和单片机程序设计;- 第5周:硬件电路设计;- 第6周:实践操作,完成万年历单片机系统设计;- 第7周:总结与展示,进行教学评估。
c语言课程设计万年历

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万年历课程设计

c 万年历课程设计一、课程目标知识目标:1. 让学生掌握年、月、日的概念及其关系,理解平年和闰年的区别;2. 使学生掌握如何使用万年历查找任意日期的星期,并了解其原理;3. 让学生了解不同历法的起源和发展,提高历史文化的认识。
技能目标:1. 培养学生运用数学知识解决实际问题的能力,如计算日期与星期之间的关系;2. 培养学生动手制作简单万年历的能力,提高动手操作和创新能力;3. 提高学生运用万年历进行时间管理和规划的能力。
情感态度价值观目标:1. 培养学生珍惜时间、合理安排生活的态度,树立时间观念;2. 激发学生对数学学科的兴趣,增强学习数学的自信心;3. 培养学生团队协作意识,学会与同学分享和交流学习心得。
本课程针对小学四年级学生设计,结合学生年龄特点和认知水平,注重知识性与趣味性的结合。
课程内容与教材紧密联系,旨在通过万年历的制作和使用,让学生在实际操作中掌握数学知识,提高解决问题的能力。
同时,注重培养学生良好的时间观念和情感态度,使学生在轻松愉快的氛围中学习,达到预期的学习成果。
二、教学内容1. 年、月、日的基本概念及其关系:包括一年有多少个月,一个月有多少天,平年和闰年的区别及其判断方法。
相关教材章节:第三章《年、月、日》。
2. 万年历的制作原理与使用方法:介绍星期与日期的关系,引导学生学会使用万年历查找任意日期的星期。
相关教材章节:第三章《认识星期》。
3. 不同历法的起源和发展:简述公历、农历等历法的历史背景,提高学生对历史文化的了解。
相关教材章节:第四章《历法的故事》。
4. 实践活动:分组让学生动手制作简易万年历,巩固所学知识,提高动手操作能力。
相关教材章节:第三章实践活动《制作自己的万年历》。
教学内容安排和进度:第一课时:介绍年、月、日的基本概念及其关系,判断平年和闰年的方法。
第二课时:讲解万年历的制作原理与使用方法,学会查找任意日期的星期。
第三课时:简述不同历法的起源和发展,提高历史文化认识。
自动万年历课程设计

自动万年历课程设计一、引言万年历是一种常见的时间表示工具,能够提供年、月、日、星期等日期信息。
随着科技的发展,人们对于万年历的需求也越来越多样化。
本次课程设计旨在实现一个自动万年历的功能,通过编程实现自动计算日期、星期和节假日等功能。
二、设计目标设计一个自动万年历的程序,实现以下功能:1.输入年份和月份,自动计算该月的日期信息;2.根据输入的日期,自动计算该日是星期几;3.判断输入的日期是否是法定假日,如春节、清明节等;4.根据输入的年份,自动计算该年的各个节假日日期。
三、设计思路3.1 输入年份和月份,自动计算日期1.根据输入的年份和月份,判断该年是否为闰年;2.根据月份判断该月的天数;3.输出该月的日期信息。
3.2 根据日期,自动计算星期1.判断输入的年份是否为闰年;2.计算该日的累计天数;3.判断累计天数对7取模的结果,得到星期。
3.3 判断输入日期是否为法定假日1.根据输入日期判断是否是法定假日,需根据法定假日的具体规定进行判断;2.输出判断结果。
3.4 根据年份,自动计算节假日日期1.根据公历计算的时间规律,计算出春节的日期;2.根据农历计算的时间规律,计算出农历节日的日期;3.输出计算结果。
四、详细设计4.1 输入年份和月份,自动计算日期1.首先通过输入函数获取用户输入的年份和月份;2.使用条件语句判断输入的年份是否为闰年,根据结果确定二月的天数;3.根据月份和上一步得到的天数,使用循环结构输出该月的日期信息。
4.2 根据日期,自动计算星期1.输入年份、月份和日期;2.使用条件语句判断输入的年份是否为闰年,根据结果确定二月的天数;3.根据输入的年、月、日,计算出累计天数;4.使用计算得到的累计天数对7取模,得到星期。
4.3 判断输入日期是否为法定假日1.定义法定假日的日期范围和名称;2.输入日期;3.对输入日期进行判断,判断是否在法定假日日期范围内;4.输出判断结果。
4.4 根据年份,自动计算节假日日期1.输入年份;2.根据公历的时间规律,计算出春节的日期;3.根据农历的时间规律,计算出农历节日的日期;4.输出计算结果。
自动万年历课程设计

自动万年历课程设计一、课程设计背景二、教学目标三、教学内容1. 自动万年历的基本原理2. 自动万年历的功能设计3. 自动万年历的界面设计四、教学方法和手段1. 讲授法2. 实践操作法五、教学流程安排六、评估方式和标准一、课程设计背景随着现代科技的不断发展,计算机技术已经成为人们日常生活中不可或缺的一部分。
计算机程序设计也成为了计算机科学中非常重要的一个方向。
自动万年历是一个基于计算机程序实现的应用软件,在日常生活中具有广泛应用。
因此,开设自动万年历课程能够帮助学生更好地了解软件开发过程,提高编程能力。
二、教学目标本课程旨在帮助学生掌握以下知识和能力:1. 掌握自动万年历的基本原理。
2. 理解自动万年历功能设计和界面设计。
3. 能够使用Java语言编写简单的自动万年历程序。
4. 能够运用所学知识,开发出实用性较强的自动万年历应用程序。
三、教学内容1. 自动万年历的基本原理介绍自动万年历的基本概念和原理,包括公历和农历的计算方法,闰年和平年的判断方法,节气计算等。
2. 自动万年历的功能设计介绍自动万年历应用程序的功能设计,包括日期查询、日程管理、节日提醒等功能。
3. 自动万年历的界面设计介绍自动万年历应用程序的界面设计,包括主界面设计、日期查询界面设计、日程管理界面设计等。
四、教学方法和手段1. 讲授法通过讲解理论知识,帮助学生掌握自动万年历的基本原理和应用程序开发过程。
2. 实践操作法通过实践操作,帮助学生更好地理解所学知识,并能够独立开发出实用性较强的自动万年历应用程序。
五、教学流程安排1. 第一周:介绍自动万年历的基本原理。
2. 第二周:讲解自动万年历应用程序的功能设计。
3. 第三周:讲解自动万年历应用程序的界面设计。
4. 第四周:进行实践操作,编写简单的自动万年历程序。
5. 第五周:进行实践操作,开发出实用性较强的自动万年历应用程序。
6. 第六周:进行课程总结和回顾。
六、评估方式和标准1. 课堂表现(占比30%):包括听课态度、提问能力等方面的表现。
万年历c语言课程设计

万年历 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语言基础语法复习,引入结构体概念。
万年历课程设计

万年历课程设计一、课程目标知识目标:1. 学生能理解万年历的基本概念,掌握年、月、日的关系及其计算方法。
2. 学生能运用所学知识,制作并解释简单的阴阳历、阳历和阴历。
3. 学生能通过实例分析,了解不同文化背景下时间记录方式的异同。
技能目标:1. 学生能够运用万年历知识,解决生活中的实际问题,如日期推算、节日计算等。
2. 学生通过小组合作,提高沟通协调能力,共同完成万年历的制作。
3. 学生能够运用信息技术,收集、整理万年历相关资料,提高信息处理能力。
情感态度价值观目标:1. 学生培养对时间管理的重视,养成珍惜时间、合理安排时间的良好习惯。
2. 学生通过学习不同文化背景下的时间记录方式,增强对多元文化的尊重和理解。
3. 学生在合作探究过程中,培养团队协作精神,提高问题解决能力和自信心。
课程性质:本课程为实践性、综合性课程,结合数学、历史、文化等多学科知识,旨在培养学生的综合素质。
学生特点:六年级学生具备一定的数学基础和动手操作能力,对新鲜事物充满好奇,善于合作交流。
教学要求:注重理论与实践相结合,以学生为主体,激发学生兴趣,引导学生主动探究,培养学生的实践能力和创新精神。
通过课程目标的分解,使学生在学习过程中达到预期的学习成果,为后续教学设计和评估提供依据。
二、教学内容1. 万年历的基本概念- 日期的组成:年、月、日- 阴阳历、阳历、阴历的定义及特点2. 年月日的关系及计算- 平年、闰年的判断- 月份数与天数的对应关系- 日期推算方法3. 不同文化背景下时间记录方式- 我国古代的时间记录方法- 西方阳历的发展及现行公历- 世界各地阴历的运用4. 万年历的制作与应用- 制作方法:手工绘制与电子表格- 实际应用:节假日计算、纪念日查询等5. 教学内容的安排与进度- 第一课时:万年历的基本概念,日期的组成- 第二课时:年月日的关系及计算方法- 第三课时:不同文化背景下时间记录方式- 第四课时:万年历的制作与应用,实践操作教学内容依据课程目标,结合教材章节进行组织,确保科学性和系统性。
课程设计说明万年历程序设计

《高级语言程序设计》课程设计说明书设计题目:万年历程序设计班级:学号:姓名:完成日期:一:课程设计目的《高级语言程序设计》课程设计是电子信息、光信息专业和物理学专业集中实践性环节之一,是学习完《高级语言程序设计》课程后进行的一次全面的综合练习,其目的在于加深对程序设计大体知识的明白得,把握利用C语言进行模块化软件设计的大体方式,提高通过编写程序解决实际问题的能力,为尔后从事设计工作和后续各类编程课程的学习打好基础。
二:需求分析题目:要求:输入年份和月份,自动输出该月的日历,清楚的显示每一天是礼拜几,输入年份,月份和具体日期能确信某天是礼拜几。
万年历是采纳数字电路实现对.时,分,秒.数字显示的计时装置,普遍用于个人家庭,车站, 码头办公室等公开场合,成为人们常生活中不可少的必需品,由于数字集成电路的进展和石英晶体振荡器的普遍应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。
诸如按时自动报警、按时自动打铃、时刻程序自动操纵、按时广播、自动起闭路灯、按时开关烘箱、通断动力设备、乃至各类按时电气的自动启用等,可是所有这些,都是以钟表数字化为基础的。
因此,研究万年历及扩大其应用,有着超级现实的意义。
它能够对年、月、日、周日、时、分、秒进行计时,关于数字电子万年历采纳直观的数字显示,能够同时显示年、月、日、周日、时、分、秒等信息,还具有时刻校准等功能。
综上所述此万年历具有读取方便、显示直观、功能多样、电路简练、本钱低廉等诸多优势,符合电子仪器仪表的进展趋势,具有广漠的市场前景。
三:概要设计1-判定是不是为闰年计算所输入的年份是不是可被4整除,假设不能被整除,为平年。
假设可被4整除,计算此年份可否被100整除,不能被100整除那么为闰年。
既能被4整除,也能被100整除的年份,假设也能被400整除,那么为闰年,不然为平年。
闰年366天,平年365天2-要紧设计思路四:详细设计源程序:#include <stdio.h> #include <stdlib.h>void DayOfWeek(){int rtnDay;int y,m,d;char ch;while (1){printf("请输入年月日(xxxx,xx,xx): ");scanf("%d,%d,%d", &y, &m, &d);fflush(stdin);rtnDay =(3*y-(7*(y+(m+9)/12))/4+(23*m)/9+d+17-((y+(m<3?-1:0))/100+1)*3/4) % 7; printf("%04d年%02d月%02d日是礼拜%d\n", y, m, d, rtnDay?rtnDay:7); printf("继续查询(y/n)");ch = getchar();if(ch != 'y' && ch != 'Y')break;}}void GetMonth(int D, int md, int n){int N ,m,d,y,c,Wd;int i,maxday,i1;if(md>=13||md<=0)printf("HAVE WRONG!");else{for(i1=0;;md++,i1++){if(md==0){md=12;D-=1;}elseif(md==13){md=1;D+=1;}m=md;printf("\n============%d,%2d============\n",D,md);if(0<m&&m<=12){switch(m){case 1:maxday=31;break;case 2:if(D%4==0&&D%100!=0||D%400==0) maxday=29;elsemaxday=28;break;case 3:maxday=31;break;case 4:maxday=30;break;case 5:maxday=31;break;case 6:maxday=30;break;case 7:maxday=31;break;case 8:maxday=31;break;case 9:maxday=30;break;case 10:maxday=31;break;case 11:maxday=30;break;case 12:maxday=31;break;default:printf("HAVE WRONG");}if(0<m&&m<=2){N=D-1;m=m+10;}else{N=D;m=m-2;}c=N/100;y=N%100;Wd=((1+(13*m-1)/5+y+y/4+c/4-2*c)%7+7)%7; printf(" SUN MOU TUE WED TUR FRI SAT\n"); for(i=0;i<Wd;i++)printf("%4c",' ');for(d=1;d<=maxday;d++){printf("%4d",d);Wd=(Wd+1)%7;if(Wd==0)printf("\n");}}elseprintf("HAVE WRONG!");if(i1==n)break;}}}void MonthOfYear(){char ch;int y, m;while (1){printf("请输入年月(xxxx,xx): "); scanf("%d,%d", &y, &m);fflush(stdin);GetMonth(y, m, 0);printf("\n继续查询(y/n)");ch = getchar();if(ch != 'y' && ch != 'Y')break;}}void GetYear(){char ch;int y;while (1){printf("请输入年: ");scanf("%d", &y);fflush(stdin);GetMonth(y, 1, 11);printf("\n继续查询(y/n)");ch = getchar();if(ch != 'y' && ch != 'Y')break;}}int main(){char ch;while(1){system("cls");printf("1.查询礼拜\n");printf("2.查询月份\n");printf("3.显示一年\n");printf("4.退出程序\n");ch = getchar();fflush(stdin);switch(ch){case '1':DayOfWeek();break;case '2':MonthOfYear();break;case '3':GetYear();break;case '4':printf("是不是退出(y/n)");ch = getchar();fflush(stdin);if(ch == 'y' || ch == 'Y')exit(0);break;}}}五:运行成效及分析1 登录界面输入3,通过输入年份可显示一年每一个月份的日历;输入2,通过输入年份和月份(中间以空格分开)可显示该月的日历;假设输入1,通过输入年份月份和日期(中间以逗号分开)可显示该日的礼拜;输入4,那么退出查询系统2查询礼拜输入1后回车,然后输入具体的年月日可查出该天为礼拜几3查询月历输入2回车,然后输入年月可显示该月月历4显示一年输入3后回车,输入一个有效年份可显示该年的十二个月的月历。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计万年历的设计52503328兰州理工大学计算机与通信学院2014年秋季学期面向对象课程设计题目:万年历的设计序言《面向对象的程序设计》是计算机专业一门重要的专业基础课。
此次课程设计的目的是以面向对象程序设计语言为基础,通过完成一些具有一定难度的课程设计题目的编写、调试、运行工作,进一步掌握面向过程和面向对象程序设计的基本方法和编程技巧,巩固所学理论知识,使理论与实际相结合。
从而提高自我分析问题、解决问题的能力。
通过课程设计,学生在下述各方面的能力应该得到锻炼:(1)进一步巩固、加深学生所学专业课程《C++语言程序设计》的基本理论知识,理论联系实际,进一步培养学生综合分析问题、解决问题的能力。
(2)全面考核学生所掌握的基本理论知识及其实际业务能力,从而达到提高学生素质的最终目的。
(3)利用所学知识,开发小型应用系统,掌握运用C++语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理的综合能力。
(4)对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型。
(5)掌握面向对象的程序设计方法。
(6)进一步掌握在集成环境下如何调试程序、修改程序和程序的测试。
目录摘要 (2)第一章系统总体设计 (3)一.理论说明 (3)二.流程图说明 (4)1.总体流程说明图 (4)2.部分流程说明图 (4)第二章系统详细设计 (7)一.主要组成部分 (7)二.源程序 (9)第三章系统测试 (34)四软件使用说明书 (40)一.系统运行环境 (40)二.系统操作提示 (40)总结 (41)参考文献 (42)致谢 (42)摘要万年历作为日常中的小工具,具有多方面的功能,能有效帮助人们记录以及计算时间,在极大程度上帮助人们在日期以及时间方面有最直观的体现。
该设计通过C++的基本知识和技能设计出一个万年历程序,该程序需实现时间和日期的显示以及计算。
一.实现提供时、分、秒组成的时间,并提供时间增加的方法(按秒);二.实现记录年、月、日的过程,并提供日期增加的方法(按天);三.通过上述两项,设计出除除具有年、月、日、时、分、秒外,还增加国名和与格林威治时间的差;四. 输入年、月、日、时、分、秒,在屏幕上模拟显示一电子计时器,不断输出下一秒的时间和日期,以及格林威治的日期和时间。
该设计不仅体现了普通日历的功能,还加入了电子计时器的部分,使得万年历在原本的基础上有了更大的扩充。
关键字:时间,日期,格林威治时间差,电子计时器第一章系统总体设计一.理论说明关于万年历的基本要求,须体现时间,日期等,所以,定义时间类time,日期类date,完成关于年(year),月(month),日(day),时(hour),分(minute),秒(second)的定义。
1 在计算时间的时候,每达到1秒的时候对second进行加1,然后判断是否达到60秒,达到的话minute就加1,minute到达60hour就加一,同样的方法对hour、day、month和year进行计算。
2在计算日期的时候,在对day计数时,考虑到大小月和闰年,对day 进行加1时,判断是哪一月和是否为闰年。
在确定年、月、日之后,使用函数Week()进行对星期几的计算,根据1901年每月1号是星期几可以得出现在是星期几。
在这个程序中,还使用了一个对话框类,使用对话框来对时间日期的设置。
在菜单栏里添加一个“设置时间”的选项和一个菜单消息,当点击这个选项就会弹出设置时间日期的对话框,对话框中编辑控件设定了每个值的取值范围,从而对输入错误进行排除。
二.流程图说明1.总体流程说明图(图一)2.部分流程说明图(1)二月天数全年天数(2)(图三)另:在本程序中共用到三个类,定义时间的time类,定义日期的date类,以及公有继承了time和date的datetime类,此派生类的作用是定义电子时钟的运行方式。
在程序中还运用到一些独立的函数,以实现星期以及格林威治时间差等功能。
二、系统详细设计1. 主要组成部分该程序主要为了实现日期和时间的显示以及格林威治时间差的计算结果,其中功能时间的显示使用类datetime来实现,功能时差的计算使用类time 和类date来实现。
下面分别介绍类time,date的详细设计。
时间类time的具体实现流程:先声明后定义,类time定义为时间基类,其中:成员函数time()主要功能为时分秒赋初值,实现方式为:函数内定义成员函数int gethour(){return hour;};int getminute(){return minute;};int getsecond(){return second;}返回时分秒的值;成员函数void sethour(int nhour){hour=nhour;};void setminute(int nminute){minute=nminute;};void setsecond(int nsecond){second=nsecond;};成员函数~time主要功能为在撤销对象占有的内存之前完成清理工作释放内存,实现方式为:,通过对象调用析构函数完成清理工作。
类time具体实现流程为:class time{private:int hour;int minute;int second;public:time();time(int nhour,int nminute,int nsecond);time(time &c);~time();int gethour(){return hour;};int getminute(){return minute;};int getsecond(){return second;};void sethour(int nhour){hour=nhour;};void setminute(int nminute){minute=nminute;};void setsecond(int nsecond){second=nsecond;};};类date定义为:描述日期的基类其中:成员函数int getyear(){return year;};int getmonth(){return month;};int getday(){return day;};string getweek(){ return week;};主要功能为返回年月日的值,实现方式为:调用成员函数成员函数void setyear(int nyear){year=nyear;};void setmonth(int nmonth){month=nmonth;};void setday(int nday){day=nday;};void setweek(string c){week=c;};主要功能为给私有数据成员赋值,实现方式为通过调用析构函数实现。
类datetime公开继承类time和类date的属性,实现电子时钟的功能,完成时间由秒自增的过程。
定义函数week(),以及situation(),完成日期对应星期数以及时间差的计算过程,完善电子时钟以及万年历的功能。
2. 源程序#include<iostream>#include<string>#include<cmath>#include<windows.h>using namespace std;int mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};bool isleapyear(int year)//判断是否是闰年{return (year%4==0 && year%100!=0)||(year%400==0);}int mon_day(int year ,int month)//判断月份对应的天数{if (isleapyear(year)&&month==2){return 29;}else return mon[month];}int getyearday(int year)//返回一年天数{if(isleapyear(year))return 366;else return 365;}class time{private:int hour;int minute;int second;public:time();time(int nhour,int nminute,int nsecond);time(time &c);~time();int gethour(){return hour;};int getminute(){return minute;};int getsecond(){return second;};void sethour(int nhour){hour=nhour;};void setminute(int nminute){minute=nminute;};void setsecond(int nsecond){second=nsecond;}; };class date{private:int year;int month;int day;string week;public:date();date(int y,int m,int d);date(date &t);~date();int getyear(){return year;};int getmonth(){return month;};int getday(){return day;};string getweek(){ return week;};void setyear(int nyear){year=nyear;};void setmonth(int nmonth){month=nmonth;};void setday(int nday){day=nday;};void setweek(string c){week=c;};void reset(int y=0,int m=0,int d=0);date operator +(const date &t);date operator -(const date &t);};class datetime:public date,public time{private:public:datetime();datetime(int nyear,int nmonth,int nday,int nhour,int nminute,int nsecond);datetime(int nyear,int nmonth,int nday,time & c);datetime(date & t,int nhour,int nminute,int nsecond);datetime addbysecond();datetime operator=(datetime & t);datetime operator+(datetime & t);};time::time()//判断时间并进行赋值{hour=0;minute=0;second=0;}time::time(int nhour,int nminute,int nsecond){if(nhour>24||nhour<0){ hour=0;}else hour=nhour;if(nminute>59||nminute<0){minute=0;}else minute=nminute;if(nsecond>59||nsecond<0){second=0;}else second=nsecond;}time::time(time &c){hour=c.hour;minute=c.minute;second=c.second;}time::~time()//time析构函数{}date::date()//date构造函数{year=0;month=0;day=0;}date::date(int y,int m,int d) {if(y<1900){y=1900;}else year=y;if(m>12 || m<=0)m=1;}else month=m;int maxday=0;if(m==2){if(isleapyear(year)) {maxday=29;}else{maxday=28;}}else{maxday=mon[m]; }if(d>maxday || d<=0) {d=1;}day=d;}date::date(date & t){year=t.year ;month=t.year;day=t.day;}date::~date(){};void date::reset (int y,int m,int d){this->year =y;this->month =m;this->day =d;}datetime::datetime():date(),time(){};datetime::datetime(int nyear,int nmonth,int nday,int nhour,int nminute,int nsecond):date(nyear,nmonth,nday),time(nhour,nminute,nsecond) {}datetime::datetime(int nyear,int nmonth,int nday,time & c):time(c),date(nyear,nmonth,nday){}datetime::datetime(date & t,int nhour,int nminute,int nsecond):date(t),time(nhour,nminute,nsecond){}datetime datetime::addbysecond(){this->setsecond(this->getsecond()+1);if(this->getsecond()>59){this->setsecond(0);this->setminute(this->getminute()+1);if(this->getminute()>59){this->setminute(0);this->sethour(this->gethour()+1);if(this->gethour()>23){this->sethour(0);this->setday(this->getday()+1);if(this->getday()>mon_day( this->getyear() ,this->getmonth())){this->setday(1);this->setmonth(this->getmonth()+1);if(this->getmonth() >12){this->setmonth(1);this->setyear(this->getyear()+1);}}}}}return *this;}datetime datetime::operator=(datetime & t){this->setyear(t.getyear());this->setmonth(t.getmonth());this->setday(t.getday());this->sethour(t.gethour());this->setminute(t.getminute());this->setsecond(t.getsecond());return *this;}datetime datetime::operator+(datetime & t){if((this->getyear()+t.getyear())<1900){this->setyear(1900);}else this->setyear((this->getyear()+t.getyear()));if((this->getmonth()+t.getmonth())>12 || (this->getmonth()+t.getmonth())<=0){this->setmonth(1);}else this->setmonth((this->getmonth()+t.getmonth()));int maxday=0;if((this->getyear()+t.getyear())==2){if(isleapyear((this->getyear()+t.getyear()))){maxday=29;}else{maxday=28;}}else{maxday=mon[this->getmonth()+t.getmonth()];}if((this->getday()+t.getday())>maxday ||(this->getday()+t.getday())<=0) {this->setday(1);}this->setday((this->getday()+t.getday()));return *this;}int dayinyear(datetime & t)//日期在年中的天数{int i=0,day=0;for(i=1;i<t.getmonth();i++){day+=mon_day(t.getyear(),i);}day+=t.getday();return day;}void getweek( datetime &t)//判断天数对应星期{int week=0;int diffday;if(t.getyear()==1900){if(t.getmonth()==1){diffday=t.getday()-1;}else{diffday=dayinyear(t)-1;}}else{int d1=getyearday(1900)-1;int d2=dayinyear(t);int d3=0;int year=0;for(year=1901;year<t.getyear();year++){d3+=getyearday(year);}diffday=d1+d2+d3;}week=diffday%7;switch(week){case 0:t.setweek("星期一");break;case 1:t.setweek("星期二");break;case 2:t.setweek("星期三");break;case 3:t.setweek("星期四");break;case 4:t.setweek("星期五");break;case 5:t.setweek("星期六");break;case 6:t.setweek("星期天");break;}cout<<t.getweek() <<" "<<endl;;}int getmonthfirst(datetime & t)//返回对应月的第一天星期数{datetimetemp(t.getyear(),t.getmonth(),1,t.gethour(),t.getminute(),t.getsecond());getweek( temp);//判断对应星期数if(temp.getweek()=="星期一")return 1;else if(temp.getweek()=="星期二")return 2;else if(temp.getweek()=="星期三")return 3;else if(temp.getweek()=="星期四")return 4;else if(temp.getweek()=="星期五")return 5;else if(temp.getweek()=="星期六")return 6;elsereturn 7;}void showmonth(datetime & t)//打印当前月日历{int i=0;cout<<"Monday"<<" "<<"Tusday"<<" "<<"Wedday"<<" "<<"Thuday"<<" "<<"Friday"<<" "<<"Satday"<<" "<<"Sunday"<<endl;int j=0;int k=1;int num=getmonthfirst(t);cout<<" ";for(k=1;k<=8-num;k++)cout<<k<<" ";cout<<endl;for(i=k;i<=mon_day(t.getyear(),t.getmonth());i++) {int flag=1;int first=k;if(i<10){cout<<" "<<i<<" ";}else cout<<i<<" ";if((i-k)==6){cout<<endl;k=i+1;}}}void stuation1(datetime & t)//计算两日期相差天数{int nyear=0;int nmonth=0;int nday=0;int nhour=0;int nminute=0;int nsecond;cout<<"请输入年月日:"<<endl;cin>>nyear>>nmonth>>nday;cout<<"请输入时分秒:"<<endl;cin>>nhour>>nminute>>nsecond;datetime temp ( nyear, nmonth,nday, nhour, nminute,nsecond); int diffday=0;if(t.getyear()==nyear){if(t.getmonth()==nmonth){diffday=abs(t.getday()-nday);}else{diffday=abs(dayinyear(t)-dayinyear(temp));}}else if(nyear<t.getyear()){int d1=getyearday(temp.getyear())-dayinyear(temp);int d2=dayinyear(t);int d3=0;int year=0;for(year=nyear;year<t.getyear();year++){d3+=getyearday(year);}diffday=d1+d2+d3;}else{int d1=getyearday(t.getyear())-dayinyear(t);int d2=dayinyear(temp);int d3=0;int year=0;for(year=t.getyear();year<nyear;year++){d3+=getyearday(year);}diffday=d1+d2+d3;}cout<<"与原日期相隔的天数为:"<<diffday<<endl; }int monthsurplus(datetime & t)//当月剩余天数{return mon_day(t.getyear(),t.getmonth())-t.getday(); }int yearsurplus(datetime & t)//当年剩余天数{return getyearday(t.getyear())-dayinyear(t);}void stuation2(datetime & t ){int diffday=0;int lastday=0;int lastmonth=0;int lastyear=0;cout<<" 请输入相隔的天数:"<<endl;cin>>diffday;if(diffday>0){if(diffday<=monthsurplus(t))//月未变{lastday=diffday+t.getday();lastmonth=t.getmonth();lastyear=t.getyear();}else if(diffday<=yearsurplus(t))//年未变{lastyear=t.getyear();int k=1;int i=monthsurplus(t);while(i<diffday){i+=(mon_day(t.getyear(),t.getmonth()+k));k++;}lastmonth=t.getmonth()+k-1;int h=0; int total=monthsurplus(t);for(h=(t.getmonth()+1);h<lastmonth;h++){total+=mon_day(t.getyear(),h);}lastday=diffday-total;}else//年变了{int k=1;int fmonth=0;int i=yearsurplus(t);while(i<diffday){i+=getyearday(t.getyear()+k);k++;}lastyear=t.getyear()+k-1;int fyear=yearsurplus(t);for(i=(t.getyear()+1);i<lastyear;i++){fyear+=getyearday(i);}int surplusday=diffday-fyear;//所求年的天数int h=0,j=1;while(h<=surplusday){h+=mon_day(lastyear,j);j++;}lastmonth=j-1;int total=0;int j1=1;for(;j1<lastmonth;j1++){total+=mon_day(lastyear,j1);}lastday=surplusday-total;}}else//diffday<0{if (abs(diffday)<t.getday()){lastday=t.getday();lastmonth=t.getmonth();lastyear=t.getyear();}else if(abs(diffday)<=dayinyear(t)){lastyear=t.getyear();int j=0,total=0;int k=t.getmonth();int i=t.getday();while(i<diffday){i+=mon_day(t.getyear(),k-1);k--;}lastmonth=k;for(j=t.getmonth();j>=(lastmonth+1);j--){total+=mon_day(t.getyear(),j);}lastday=diffday-total;}else{int i=dayinyear(t);int k=t.getyear();while(i<diffday){i+=getyearday(k-1);k--;}lastyear=k;int mtotal=0;int j=0;for(j=t.getyear();j>=lastyear+1;j--){mtotal+=getyearday(j);}int nday=abs(diffday)-mtotal;int h=0;int flag=0;int m=0;while(h<nday){h+=mon_day(lastyear,12-flag);flag--;}lastmonth=flag;int dtotal=0;for(m=12;m>=lastmonth+1;m--){dtotal+=mon_day(lastyear,m);}lastday=nday-dtotal;}}cout<<"日期为:"<<endl;cout<<lastyear<<"年"<<lastmonth<<"月"<<lastday<<"日"<<endl; }void Tprojection(datetime & sytime){int option=0;cout<<" 您已进入万年历系统"<<endl;cout<<" 您已进入日期推算菜单"<<endl;cout<<" 1.计算两日期相差天数"<<endl;cout<<" 2.计算日期前后推算"<<endl;cout<<" 请选择:"<<”1或2:”;cin>>option;system("cls"); //清屏switch(option){case 1:stuation1(sytime);//计算两日期相差天数break;case 2:stuation2(sytime);//计算日期前后推算break;}}void timers( datetime &dtime)//模拟电子计时器{int k=0;cout<<dtime.getyear()<<"年"<<dtime.getmonth()<<"月"<<dtime.getday() <<"日"<<dtime.gethour()<<"时"<<dtime.getminute()<<"分"<<dtime.getsecond()<<"秒"<<endl;getweek( dtime );//判断对应星期数while(true){Sleep(2200);dtime.addbysecond();//电子模拟showmonth(dtime);//打印当前月日历system("cls");cout<<dtime.getyear()<<"年"<<dtime.getmonth()<<"月"<<dtime.getday()<<"日"<<dtime.gethour()<<"时"<<dtime.getminute()<<"分"<<dtime.getsecond()<<"秒"<<endl;getweek( dtime );//判断对应星期数showmonth(dtime);//打印当前月日历}}void Elcsystem(datetime & sytime){int option=0;cout<<" 您已进入万年历模拟系统"<<endl;cout<<" 1.进入日期模拟输出系统"<<endl;cout<<" 2.进入日期推算系统"<<endl;cout<<"请选择"<<”1或2:”;cin>>option;system("cls"); //清屏switch(option){case 1 :{cout<<" 当前时间为:"<<endl;cout<<" ";timers( sytime);//模拟电子计时器};case 2:Tprojection(sytime);//日期推算break;system("plause");//暂停defaut:cout<<" 无此选项!!!!"<<endl;}}void showmenu(){cout<<" 您已进入电子模拟系统"<<endl;cout<<" 1.模拟万年历输出"<<endl;cout<<” 2.退出万年历系统"<<endl;cout<<"请选择:"<<”1或2:”;}int main(){int nyear=0;int nmonth=0;int nday=0;int nhour=0;int nminute=0;int nsecond;cout<<" 您已进入万年历系统"<<endl;cout<<" 请输入年月日"<<endl;cin>>nyear>>nmonth>>nday;cout<<" 请输入时分秒"<<endl;cin>>nhour>>nminute>>nsecond;system("cls"); //清屏datetime sytime( nyear, nmonth,nday, nhour, nminute,nsecond);int option;showmenu();cin>>option;system("cls"); //清屏while(option!=3){switch (option){case 1: Elcsystem(sytime);//调用电子模拟系统break;case 2:goto l;//退出系统break;default :break;}showmenu();cin>>option;}l:system("cls"); //清屏cout<<" ——谢谢使用——"<<endl; return 0;}第三章系统测试1.请输入日期按回车键进行下一步骤;(图3.1)2.请输入时间按回车进行下一步骤;(图3.2)3.选择下一过程按回车键继续;(图3.3)4.进入万年历模拟系统之后选择下一步骤按回车键继续;(图3.4)5.输出当前时间;(图3.5.1)停顿几秒后会显示万年历的输出情况;(图3.5.2)6.进入万年历模拟系统之后进行第二步骤;(图3.6)7.进入日期推算后选择下一步骤;(图3.7)8.输入日期计算与原日期相差天数值;(图3.8)9.推算出相差天数之后进行另一步骤;(图3.9.1)(图3.9.2)10.在日期推算界面中选择另一步骤,进行日期的前后推算;(图3.10)11.输入相隔天数按回车键继续;(图3.11)12.选择退出系统。