C语言实训万年历查询系统_第1页
C语言实训万年历查询系统_第2页
C语言实训万年历查询系统_第3页
C语言实训万年历查询系统_第4页
C语言实训万年历查询系统_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、万年历查询系统本题目设计目的是训练学生的基本编程能力,了解管理信息系统的开发流程,熟悉C语言的数组和函数的基本操作。本程序通过对C语言中的关系表达式、逻辑表达式、选择结构、循环结构、数组和函数等程序设计的基本语法和语义结构的综合训练,掌握程序设计的基本方法、常用技巧,为进一步开发出高质量的管理信息系统打下坚实的基础。1、问题定义创建一个万年历查询系统。假设系统中日期查询是从公元1年1月1日到公元10000年之间所有的日期。程序运行效果如下图所示,选择菜单后,实现相应功能。在问题定义阶段要考虑题目的可行性和需求分析,接下来进入开发阶段,完成系统设计和系统实现的任务。2、系统设计2.1 总体设计采

2、用模块化的程序设计方法,即将较大的任务按照一定的原则分为一个个较小的任务,然后分别设计各个小任务。需要注意的是划分出来的模块应该相对独立但又相关,且容易理解。可以用模块化层次结构图(即模块图)来分析其任务的划分,一般从上到下进行,最上面一层是主模块,下面各层是其上一层模块的逐步细化描述。开始密码检测模块万年历查询系统查询某年某月的最大天数打印某年的全年日历查询某年是否是闰年查询某年某月是星期几从键盘输入从函数读入输出至屏幕从函数读入从键盘输入从函数读入从键盘输入从函数读入 图2.1 万年历系统功能模块图本万年历查询系统要求采用数组、函数实现,如图2.1所示,它由如下四大功能模块组成: 查询某年

3、某月是星期几模块。 查询某年是否是闰年。 打印某年的全年日历。 查询某年某月的最大天数。22 详细设计2.2.1数据结构设计 万年历查询系统void screen(); /系统主界面void leapyear(); /查询某年是否是闰年int IsLeapYear(int); /判断某年是否是闰年void printmonthday(); /查询某年某月的最大天数int everymonth(int,int); /计算每月的最大天数 void whatisit(); /查询某年某月某日是星期几int whatisita(int,int); /计算某年某月的第一天是星期几void printfy

4、earday(); /打印某年的全年日历void printmonth(int,int); /打印某年某月月历2.2.2 main函数流程图开始密码保护模块进入系统主界面函数进入while(1)输出主界面目录输入1到5中的一个数值选择相应操作进入switch(n)主循环输入是否为5是结束否判断键值,调用相应函数完成相应功能程序流程图如图所示。系统在密码保护模块正确输入用户名和密码后直接输出主界面,然后执行显示主菜单和进入主循环操作进行按键判断。在判断键值时,有效的输入为1到5之间的任意数值,其他输入都被视为错误按键。 若输入为5则退出。如选择1,可调用whatisit()函数,执行查询某年某月

5、某天是星期几操作。若选择2,则调用leapyear()函数,执行查询某年是否是闰年操作。若选择3,则调用printfyearday()函数,执行打印某年全年日历的操作。若选择4,则调用printmonthday函数,执行查询某月的最大天数的操作。若输入为1到5之外的数字,则给出按键错误的提示。3、系统实现31 编码3.1.1 程序预处理包括加载头文件,定义结构体、常量和变量,并对它们进行初始化工作。#include<stdio.h>#include<string.h>#include<stdlib.h>void screen(); /系统主界面void le

6、apyear(); /查询某年是否是闰年int IsLeapYear(int); /判断某年是否是闰年void printmonthday(); /查询某年某月的最大天数int everymonth(int,int); /计算每月的最大天数 void whatisit(); /查询某年某月某日是星期几int whatisita(int,int); /计算某年某月的第一天是星期几void printfyearday(); /打印某年的全年日历void printmonth(int,int); /打印某年某月月历3.1.2 主函数main()main()函数主要实现了对整个程序的运行控制,以及相关

7、功能模块的调用。3.1.3 主菜单界面void screen ()void screen () system("CLS");int n;while(1)printf("欢迎来到万年历查询系统,请您按照下列提示进行操作,祝您查询愉快!n");printf(" n");printf(" 万年历查询系统界面 n");printf(" * n");printf(" 1.查询某年某月某日是星期几 n");printf(" 2.查询某年是否是闰年 n");printf

8、( 3.打印某年的全年日历 n");printf(" 4.查询某年某月的最大天数 n");printf(" 5.退出 n");printf(" * n");printf(" n");printf(" 请输入您要查询的选项( _ ): " );scanf("%d",&n); /读取输入的数字switch(n) case 1:whatisit(); /查询某年某月某日是星期几break;case 2:leapyear(); /查询某年是否是闰年break;cas

9、e 3:printfyearday(); /打印某年的全年日历break;case 4: printmonthday(); /查询某年某月的最大天数break;case 5:system("cls");printf("nn");printf("tn");printf("t*n"); printf("t* 谢谢使用本程序 *n");printf("t* 编辑者:黄丽敏 *n");printf("t* 编辑时间:2012.06.19 *n");printf(&

10、quot;t*n");printf("tn"); exit(0);default:printf("/(o)/不好意思,您输入信息错误,请您按要求重新输入!谢谢!nn");break;3.1.4 登陆界面输入用户名和密码菜单选择界面3.1.5 查询某年某月某日是星期几 void whatisit()int y,m,d,s,k=1,sum,n,i;char yn;while(k)printf("n请您输入年,月,日:n");scanf("%d,%d,%d",&y,&m,&d);getc

11、har(); /吸收回车符 if(m<1 | m>12) /判断输入的月份是否正确printf("您输入的月份不对!月份应为0到12月!请按要求重新输入。n");continue; if(d<1 | d>31)printf("您输入的日期不对!日期应为1号到31号!请按要求重新输入。"); continue;s=0; for(i=1;i<m;i+)s=s+ai;s=s+d; /累加天数if(IsLeapYear(y) && m>2) /判断是否是闰年,且月份大于2s=s+1;sum=s;n=(y-1+(

12、y-1)/4-(y-1)/100+(y-1)/400+sum)%7; /计算结果06printf("这天是星期%sn",weekn); /显示星期几printf("是否继续本项目的查询(Y/N)?");scanf("%c",&yn);if(yn='y'| yn='Y' )k=1;elsek=0; system("CLS"); 此函数有错误提示功能,如下:3.1.6查询某年是否是闰年 int IsLeapYear(int year)return(year%4=0 &&a

13、mp; year%100!=0 | year%400=0);void leapyear()int y,k=1;char yn;while(k)printf("n请输入要查询的年份:n");scanf("%d",&y);getchar(); /吸收回车符if(IsLeapYear(y) /判断是否是闰年printf("是闰年n");elseprintf("不是闰年n");printf("是否继续本项目的查询(Y/N)?");scanf("%c",&yn);if(

14、yn='y' | yn='Y')k=1;elsek=0;system("CLS");3.1.7 打印全年日历void printfyearday()int y,value,sum,i,k=1;char yn;while(k) printf("n请输入您要查询日历的年份:n");scanf("%d",&y);getchar();for(i=1;i<=12;i+)printf("%d年%d月的信息:n",y,i);value=whatisita(y,i); /计算某年某月的

15、第一天是星期几sum=everymonth(y,i); /计算某年某月最大天数 printmonth(value,sum); /打印一个月的日历printf("n");printf("是否继续查询(Y/N)?");scanf("%c",&yn);if(yn='y' | yn='Y')k=1;elsek=0;system("CLS");.3.1.8 查询某年某月最大天数void printmonthday()int y,m,value,k=1;char yn;while(k)p

16、rintf("n请输入您要查询的年份,月份:n");scanf("%d,%d",&y,&m);getchar(); /吸收回车符if(m<0 | m>12) /判断输入的月份是否正确printf("您输入的月份不对!月份应为0到12月!n");continue;value=everymonth(y,m); /计算该年该月的最大天数printf("%d年%d月的最大天数为:%dn",y,m,value);printf("是否继续本项目的查询(Y/N)?");scanf(

17、"%c",&yn);if(yn='y' | yn='Y')k=1;elsek=0;system("CLS");3.1.8 退出system("cls");printf("nn");printf("tn");printf("t*n"); printf("t* 谢谢使用本程序 *n");printf("t* 编辑者:黄丽敏 *n");printf("t* 编辑时间:2012.06.19 *n

18、");printf("t*n");printf("tn");32 测试与调试3.2.1 概述一般情况下,为解决一个问题所编写的程序代码较长,可能包括几百条甚至成千上万条语句。在检查并排除所有语法错误后,还会有不易发现的逻辑错误,因此要对程序进行认真仔细的测试与调试。测试是通过运行程序发现错误的过程,常见的错误有数据溢出、数组越界、进入死循环、语句顺序颠倒、多加“;”或少加“”等等。调试则是确定测试中找到的错误性质并改正错误的过程。测试与调试通常交替进行,即测试调试再测试再调试。能检查出尚未发现的、各种不同类型错误的测试才是成功的测试。测试程序需

19、要测试用例,测试用例可用如下公式表示:测试用例测试数据预期结果。好的测试用例应该是用尽可能少的测试数据发现尽可能多的错误,即发现错误的概率要大。要选择合适的测试数据,使系统在运行时尽量能执行到每条语句,以测试各指令是否正确。还应分别测试输入合法数据与非法数据时,程序的运行情况,。对于合法数据,还要考虑数据的一般性与特殊性,如求最大值的问题,应测试最大值在最前面、最后面、中间某一位置的情况。测试可按模块测试、组装测试和确认测试的步骤进行。(1)模块测试就是分别对各模块进行测试的过程。在编写一个模块后应立即对其进行测试,因为这时对模块记忆深刻,而且单个模块相对较小,所以容易构造测试数据,能方便地检

20、查和改正错误。(2)组装测试就是把所有模块(应该是通过模块测试的模块)按预先制定的计划逐步组装和测试的过程。一般情况下,各模块之间要相互传递数据和控制信息,因此组装测试的主要任务是发现模块接口中的错误。(3)确认测试是最后一个步骤,一般在将软件交付用户之前,应确认软件是否确实满足用户的要求,通常使用接近实际的用例进行测试。测试程序时,用监视窗口可以随时查看变量或表达式的值,有时还可以将部分程序代码用注释符暂时括起来,缩短程序,以便压缩出错代码的范围。3.2.2 程序测试在登陆菜单中输入用户名和密码,在验证用户名和密码都正确后可进入主菜单。这时选择,可以进行选择各菜单,然后可以进行万年历查询了。

21、选择菜单5,则可以不作任何抄作,直接退出程序。4、系统维护经测试与调试确认软件无错时,开发就告一段落,这时可以交付软件供用户使用,但是在软件的使用过程中还会面临更加漫长的工作,即软件维护。一般维护的工作有:更改使用中发现的错误;为适应实际环境而对程序进行修改;为满足新的需求而对程序作必要的改进等等。七、在C语言编程中常见错误C语言的最大特点是:功能强、使用方便灵活。C编译的程序对语法检查并不象其它高级语言那么严格,这就给我们留下“灵活的余地”,但还是由于这个灵活给程序的调试带来了许多不便,尤其对我们这些初学C语言的人来说,经常会出一些连自己都不知道错在哪里的错误。看着有错的程序,不知该如何改起

22、,我通过这次编程,也积累了一些C编程时常犯的错误:1. 书写标识符时,忽略了大小写字母的区别。编译程序把a和A认为是两个不同的变量名,而显示出错信息。C语言认为大写字母和小写字母是两个不同的字符。习惯上,符号常量名用大写,变量名用小写表示,以增加可读性。2.忽略了变量的类型,进行了不合法的运算。%是求余运算,得到a/b的整余数。整型变量a和b可以进行求余运算,而实型变量则不允许进行“求余”运算。3.将字符常量与字符串常量混淆。混淆了字符常量与字符串常量,字符常量是由一对单引号括起来的单个字符,字符串常量是一对双引号括起来的字符序列。C规定以“”作字符串结束标志,它是由系统自动加上的,所以字符串

23、“a”实际上包含两个字符:a'和',而把它赋给一个字符变量是不行的。4.忽略了“=”与“=”的区别。在C语言中,“=”是赋值运算符,“=”是关系运算符。如: if (a=3) a=b;前者是进行比较,a是否和3相等,后者表示如果a和3相等,把b值赋给a。由于习惯问题,初学者往往会犯这样的错误。5.忘记加分号。分号是C语句中不可缺少的一部分,语句末尾必须有分号。 a=1 b=2编译时,编译程序在“a=1”后面没发现分号,就把下一行“b=2”也作为上一行语句的一部分,这就会出现语法错误。改错时,有时在被指出有错的一行中未发现错误,就需要看一下上一行是否漏掉了分号。 z=x+y; t

24、=z/100; printf("%f",t); 对于复合语句来说,最后一个语句中最后的分号不能忽略不写(这是和PASCAL不同的)。6.多加分号。对于一个复合语句,如: z=x+y; t=z/100; printf("%f",t); ;复合语句的花括号后不应再加分号,否则将会画蛇添足。又如:if (a%3=0);I+;本是如果3整除a,则I加1。但由于if (a%3=0)后多加了分号,则if语句到此结束,程序将执行I+语句,不论3是否整除a,I都将自动加1。再如: for (I=0;I<5;I+); scanf("%d",&am

25、p;x); printf("%d",x);本意是先后输入5个数,每输入一个数后再将它输出。由于for()后多加了一个分号,使循环体变为空语句,此时只能输入一个数并输出它。7.输入变量时忘记加地址运算符“&”。 int a,b; scanf("%d%d",a,b);这是不合法的。Scanf函数的作用是:按照a、b在内存的地址将a、b的值存进去。“&a”指a在内存中的地址。8.输入数据的方式与要求不符。scanf("%d%d",&a,&b);输入时,不能用逗号作两个数据间的分隔符,如下面输入不合法: 3,4

26、 输入数据时,在两个数据之间以一个或多个空格间隔,也可用回车键,跳格键tab。scanf("%d,%d",&a,&b);C规定:如果在“格式控制”字符串中除了格式说明以外还有其它字符,则在输入数据时应输入与这些字符相同的字符。下面输入是合法的: 3,4 此时不用逗号而用空格或其它字符是不对的。 3 4 3:4 又如: scanf("a=%d,b=%d",&a,&b);输入应如以下形式: a=3,b=4 9.输入字符的格式与要求不一致。在用“%c”格式输入字符时,“空格字符”和“转义字符”都作为有效字符输入。scanf(&q

27、uot;%c%c%c",&c1,&c2,&c3);如输入a b c 字符“a”送给c1,字符“ ”送给c2,字符“b”送给c3,因为%c只要求读入一个字符,后面不需要用空格作为两个字符的间隔。10.输入输出的数据类型与所用格式说明符不一致。例如,a已定义为整型,b定义为实型a=3;b=4.5;printf("%f%dn",a,b);语法错逻辑错 运行错0.忘记定义变量:main()x=3;y=6;printf(“%dn”,x+y);11.C语言的变量一定要先定义才能使用;12.输入输出的数据的类型与所用格式说明符不一致int a=3;flo

28、at b=4.5;printf(“%f%dn”,a,b);它们并不是按照赋值的规则进行转换(如把4.5转换为4),而是将数据在存储单元中的形式按格式符的要求组织输出(如b占4个字节,只把最后两个字节的数据按%d,作为整数输出)13.未注意int型数据的数值范围int型数据的数值范围(-3276832768)int num=89101;printf(“%d”,num);会将超过低16位的数截去从而得到23563注意:定义了long型,而在输出时仍用”%d”说明符,仍会出现以上错误14.输入变量时忘记使用地址符scanf(“%d%d”,a,b);15.输入时数据的组织与要求不符对scanf函数中格

29、式字符串中除了格式说明符外,对其他字符必须按原样输入16.误把”=“作为”等于”比较符“=“为附值运算符“=“为比较运算符17.语句后面漏分号t=a;a=b;b=t它是pascal的语法18.不该加分号的地方加了分号if(a>b);printf(“a is larger than bn”);for(i=0;i<10;i+);scanf(“%d”,&x);printf(“%dn”,x*x);19.对应该有花括弧的复合语句,忘记加花括弧sum=0;i=1;while(i<=100)sum=sum+1;i+;20.括弧不配对while(c=getchar()!=#)putc

30、har(c);11.在用标识时,忘记了大写字母和小写字母的区别int a,b,c;a=2;b=3;C=A+B;printf(“%d+%d=%D”,A,B,C);12.引用数组元素时误用发圆括弧int i,a(10);for(i=0;i<10;i+)scanf(“%d”,&a(i);13.在定义数组时,将定义的”元素个数”误认为是”可使用的最大下标值int a10=1,2,3,4,5,6,7,8,9,10;int i;for(i=1;i<=10;i+)printf(“%d”,ai);14.对二维或多维数组的定义和引用的方法不对int a5,4;printf(“%d”,a1+2

31、,2+2);15.误以为数组名代表数组中全部元素int a4=1,2,3,4;printf(“%d%d%d%d”,a);16.混淆字符数组与字符指针的区别main()char str40;str=“Computer and c”;printf(“%sn”,str);17.在引用指针变量之前没有对它赋予确定的值char *p;scanf(“%s”,p);char *p,c20;p=c;scanf(“%s”,p);18.switch语句的各分支中漏写 break语句混淆字符和字符串的表示形式char sex;sex=“M”;19.使用自加(+)和自减(-)运算符时出的错误int *p,a5=1,3

32、,5,7,9;p=a;printf(“%d”,*p+);注意于*(+p)的区别;20.所调用的函数在调用语句之后才定义,而又在调用前未加说明main()float x,y,z;x=3.5;y=-7.6;z=max(x,y);printf(“%f”,z);编译时不给出出错信息,但运行结果将与原意不符。这种错误尤其需要注意。八、心得体会1. 虽然这次实训程序没有全部自己写,参考了很多资料写的,才有了头绪,但是在看资料的程序理解过程也学到了很多东西,只要真正把它弄懂了,融会贯通我相信我也可以自己编程。2. 经过上一个学期对C程序设计的学习,我们学习了理论知识,了解了C语言程序设计的思想,这些知识都为

33、我们的下一步学习打下了坚实的基础。通过这次实训,一方面是为了检查我们一个学期来我们学习的成果,另一方面也是为了让我们进一步的掌握和运用它,同时也让我们认清自己的不足之处和薄弱环节,加以弥补和加强。 3. 通过对c语言万年历的设计进一步的巩固了用c语言编写程序,并且有利于更好的掌握c语言! 4. 在万年历的编写过程中也体会到了做事情一顶要细心、认真。更加知道了要掌握好基础知识。还有体会到了成功的感觉!在万年历的设计过程中更加体会到了善于请教的重要性,“三人行必有我师焉。”虚心向他人学习真的能学到很多知识,而且能吸取各路精华,更好的的完成设计!也体会到以后在学习上虚心求教学习的必要性和重要性! 5. 通过本次实训也培养了我独立思考、 综合运用所学有关相应知识的能力,掌握 工程软件设计的基本方法,强化上机动手编程能力,闯过理论与实践相结合的难关! 6. 由于C语言是近年在国内外得到迅速推广应用的一种语言。C语言功能丰富,表达能力强,使用灵活方便,应用面广,目标程序效率高,可移植性好,既具有高级

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论