青岛农业大学
课程设计报告
题 目: 使用菜单选择趣味程序
姓 名: 杨丽娜
学 院: 理学与信息科学学院
专 业: 通信工程
班 级: 2班
学 号: 20123239
指导教师:
年月日
目 录
一 设计目的…………………………………………………………….1
二 课程设计的内容........................................2
三 课程设计的要求与数据..................................3
四 课程设计应完成的工作..................................4
五 总体设计(包含几大功能模块)...........................5
六 详细设计(各功能模块的具体实现算法——流程图)………….6
七 调试分析(包含各模块的测试用例,及测试结果)…………….7
八 总结………………………………………………………………...8
十 参考资料…………………………………………………………….9
一 设计目的
进一步加深、巩固所学专业课程(《C语言程序设计》)的基本理论知识,理论联系实际,进一步培养自己综合分析问题和解决问题的能力。掌握运用C语言独立地编写、调试应用程序和进行其它相关设计的技能。
结合实际深入理解高级语言程序设计的基本概念、原理及方法。运用所学的基础知识开发一个小型的程序,能根据问题的需要构造所需的数据结构,设计适合的算法,解决问题。掌握设计任务的具体要求,进行设计、调试软件的具体方法、步骤和技巧。对一个实际课题的软件设计有基本了解,拓展知识面,激发在此领域中继续学习和研究的兴趣,为学习后续课程做准备。
二 课程设计的内容
使用菜单选择趣味程序
设计目的:本程序旨在训练学生的编程能力,使用C语言最基本的知识,训练结构化程序设计的基本技术。
功能:设计分两步,首先设计一个含有多个菜单项的菜单演示程序,然后再为这些菜单项配上相应的功能。
要求:使用数字1—6来选择菜单项,其他输入则不起作用。其实是5道编程题:
1)FindNum 使用穷举法寻找满足下式中的i 的值(30+i)*6237=(10*i+3)*3564
2)FindRoot 求方程的根的程序
3)Detective 一辆汽车撞人后逃跑。4个目击者提供如下线索:
甲:牌照三、四位相同; 乙:牌号为31xxxx;
丙:牌照五、六位相同; 丁:三到六位是一个整数的平方
4)Bear
本题是一个笑话,话说有一只狗熊到玉米地里掰玉米,一边掰一边吃。第一天吃了一半,又拿走一个回去喂小狗熊。第二天又去吃了剩下的一半,走时仍然带一个回去喂小狗熊。以后每天都吃前一天剩下的一半,拿走一个。到第十天时,地里只剩下一个玉米。求地里一共有多少玉米。
5)Diamond
本题要求编制打印以下图案的程序,注意题目要求在左边留出一定空格
*
***
*****
*******
*****
***
*
6)GoodBye!
结束程序运行。
三 课程设计的要求与数据
1.用C语言实现系统;
2.使用数字1—6来选择菜单项,其他输入则不起作用;
四 课程设计应完成的工作
(1)编写算法;
(2)算法测试,并有具体的测试结果和结果分析;
(3)撰写课程设计报告。内容包括:
1) 封面扉页
2) 设计任务书
3) 目录
4) 总体设计方案(包括流程图)
5) 使用说明及运行实例(包括界面)
6) 成员设计内容简介
7) 项目源程序代码(注意注释的使用)
8) 指导教师评语
五 总体设计(包含几大功能模块)
通过输入1-6来进行菜单选择,来选取自己需要的程序结果,从而得到想要的结果。
六 详细设计(各功能模块的具体实现算法——流程图)
使用菜单选择程序
菜单是应用程序的界面,控制语句用来改变程序执行的顺序,是实现结构化程序设计的基础。设计一个比较实用的菜单,通过菜单选择不同的功能。
设计分为两步:首先设计一个含有多个菜单项的菜单演示程序,然后再为这些菜单项配上相应的功能。
一、设计一个菜单程序
(1)菜单内客
程序运行后,给出6个菜单项的内容和输入提示。
1.FindNum
2.FindRoot
3.Detective
4.Bear
5.Diamond
6.Goodbye!
Input 1-6:
(2)设计要求
使用数字1-6来选择菜单项,其他输人则不起作用。
二、增加菜单项的处理功能
以设计的菜单为基础,增加菜单项的处理功能。
菜单项设计要求
这其实是5道编程题,目的是锻炼使用控制语句的能力。
(1)FindNum
利用计算机的计算速度快的特点,把所有可能的数都试一下,从中找出符合条件的数。这就是所谓的穷举法。
某位的数字只有0-9个数字,显然已经排除了为0的可能性,将1--9种可能性拿来试验,即可找到合适的数字。由此可见,就是寻找满足下式面的i值:
(30+i)×6237=(10×i+3)×3564
(2)FindRoot
这里要求编制一个求方程ax2+bx+c=0的根的程序。一般将系数设计成float型,可以把变量设为double型,使用库函数sqrt求平方根,sqrt在头文件math.h中定义。假设
disc=b×b-4×a×c
可以根据d大于、等于或小于零来决定求解方法。
if(disc>0)
{//有两个不相等的实数解}
else if ( disc = = 0 )
{//有两个相等的实数解}
else
{//有两个不相等的虚数解}
(3)Detective
这是一道侦探题。一辆汽车憧人后逃跑。4个目击者提供如下线索:
甲:牌照三、四位相同; 乙:牌号为31xxxx;
丙:牌照五、六位相同; 丁:三一六位是一个整数的平方。
为了从这些线索中求出牌照号码,只要求出后四位再加上310000即可。这四位又是前两位相同,后两位也相同,互相又不相同并且是某个整数的平方的数。可以仍然使用穷举法,利用计算机的计算速度快的特点,把所有可能的数都试一下,从中找出符合条件的数。
因为后面4位数,1000的平方根>31,所以穷举实验时不需从1开始,而是从31开始寻找一个整数的平方。下面直接使用for语句格式,给出算法思想。{
int i,a,b,c,d;long m;
for(i=32;i<=99;i++) /*穷举找出后四位号码*/
{
m=i*i;
a=m%10;
b=m/10%10;
c=m/100%10;
d=m/1000;
if(a==b&&c==d)
break;
}
printf("%ld\n",m+310000);
return 0;
}
(4)Bear
本题是一个笑话,话说有一只狗熊到玉米地里掰玉米,一边掰一边吃。第一天吃了一半,又拿走一个回去喂小狗熊。第二天又去吃了剩下的一半,走时仍然带一个回去喂小狗熊。以后每天都吃前一天剩下的一半,拿走一个。到第十天时,地里只剩下一个玉米。求地里一共有多少玉米。
这里可以使用回溯算法。假设狗熊每次吃掉的为x2,则第10天时的x2=1,第9天地里剩下的玉米xl = (x2 + l) ×2,这也是狗熊在第8天时吃掉的玉米数量。因此可以使用如下算法描述:
{
int day,x1,x2;
day=9;
x2=1;
while(day>0)
{x1=(x2+1)*2; /*第1天玉米数是第2天玉米数加1后的2倍*/
x2=x1;
day--;
}
printf("total=%d\n",x1);
return 0;
}
(5)Diamond
本题要求编制打印以下图案的程序,注意题目还要求在左边留出一定空格。
*
***
*****
*******
*****
***
*
(6)Goodbye!
这里除了输出一个简单的信息之外,还必须结束程序运行。
七 调试分析(包含各模块的测试用例,及测试结果)
7.1源程序
#include<stdio.h>
#include<stdlib.h> /*定义杂相函数及内存分配函数*/
#include<ctype.h> /*字符处理*/
#include<math.h>
int menu_select();
int FindNum();
int FindRoot();
int Detective();
int Bear();
int Diamond();
int GoodBye();
void main() /*主函数*/
{
for(;;) /*一直循环直到用break等终止,和while(1)有着同样的作用*/
{
switch(menu_select())
{case 1:
FindNum();
system("pause");
break;
case 2:
FindRoot();
system("pause");
break;
case 3:
Detective();
system("pause");
break;
case 4:
Bear();
system("pause");
break;
case 5:
Diamond();
system("pause");
break;
case 6:
printf("GoodBye!\n");
system("pause");
exit(6);
}
}
}
int menu_select() /*主函数菜单*/
{
char c;
do{
system("cls");
printf("1.FindNum\n" );
printf("2.FindRoot\n");
printf("3.Detective\n");
printf("4.Bear\n");
printf("5.Diamond\n");
printf("6.GoodBye\n");
c=getchar();
}while(c<'1'||c>'6');
return(c-'0');
}
int FindNum() /*找数字*/
{
int i;
for(i=0;i<10;i++)
{
if((30+i)*6237==(i*10+3)*3564)
{
printf("The answer is %d\n",i);
printf("3%d*6237=%d3*3564\n",i,i);
break;
}
}
return 0;
}
int FindRoot() /*找方程的根*/
{
double a,b,c,disc,x1,x2,realpart,imagpart; /*定义double型变量*/
scanf("%lf%lf%lf",&a,&b,&c);
printf("The equation");
if(fabs(a)<=1e-6)
printf("is not a equation\n");
else
{
disc=b*b-4*a*c;
if(fabs(disc)<=1e-6)
printf("has two eqaul roots:%8.4f\n",-b/(2*a));
else
if(disc>1e-6)
{
x1=(-b+sqrt(-disc))/(2*a);
x2=(-b-sqrt(disc))/(2*a);
printf("has distinct real roots:%8.4fand%8.4f\n",x1,x2);
}
else
{
realpart=-b/(2*a); /*realpart是复根的实部*/
imagpart=sqrt(disc)/(2*a); /*realpart是复根的虚部*/
printf("has complax roots\n");
printf("%8.4f+%8.4fi\n",realpart,imagpart); /*输出一个复数*/
printf("%8.4f+%8.4fi\n",realpart,imagpart); /*输出另一个复数*/
}
}
return 0;
}
int Detective() /*找牌照*/
{
int i,a,b,c,d;long m;
for(i=32;i<=99;i++) /*穷举找出后四位号码*/
{
m=i*i;
a=m%10;
b=m/10%10;
c=m/100%10;
d=m/1000;
if(a==b&&c==d)
break;
}
printf("%ld\n",m+310000);
return 0;
}
int Bear() /*熊吃玉米的问题*/
{
int day,x1,x2;
day=9;
x2=1;
while(day>0)
{x1=(x2+1)*2; /*第1天玉米数是第2天玉米数加1后的2倍*/
x2=x1;
day--;
}
printf("total=%d\n",x1);
return 0;
}
int Diamond() /*钻石*/
{
int i,j,k;
for(i=0;i<=3;i++) /*控制循环次数,i由1变到3,共循环3次*/
{
for(j=0;j<=2-i;j++)
printf(" ");
for(k=0;k<=2*i;k++)
printf("*");
printf("\n");
}
for(i=0;i<=2;i++)
{
for(j=0;j<=i;j++)
printf(" ");
for(k=0;k<4-2*i;k++)
printf("*");
printf("\n");
}
return 0;
}
int GoodBye() /*再见*/
{
char a='G',b='o',c='o',d='d',e='B',f='y',g='e’,h=’!’; /*定义8个字符变量并初始化*/
putchar(a); /*向显示器输出字母G*/
putchar(b); /*向显示器输出字母o*/
putchar(c); /*向显示器输出字母o*/
putchar(d); /*向显示器输出字母d*/
putchar(e); /*向显示器输出字母B*/
putchar(f); /*向显示器输出字母y*/
putchar(g); /*向显示器输出字母e*/
putchar(h); /*向显示器输出符号!*/
putchar('\n'); /*向显示器输出一个换行值*/
return 0;
}
7.2主要程序运行结果
1)当输入的菜单项为1时,输出结果如图a所示
图a
2)当输入的菜单项为2时有以下3种情况
(1)输入a,b,c的值1,2,1,得到两个相等的实根,输出结果如图b①所示
图b①
(2)输入a,b,c的值1,2,2,得到两个共轭的复根,输出结果如图b②所示
图b②
(3)输入a,b,c的值2,6,1,得到两个不等的实根,输出结果如图b③所示
图b②
3)当输入的菜单项为3时,输出结果如图c所示
图b③
4)当输入的菜单项为4时,输出结果如图d所示
图d
5)当输入的菜单项为5时,输出结果如图e所示
图e
6)当输入的菜单项为6时,输出结果如图f所示
图f
八 总结
由于本课题中的许多知识点都没有学过都要靠自己到课外的资料中去查找。在用的时候难免出现这样那样的错误。如开始设计出来的菜单不是预想的那样,而是总个窗中出现混乱。解决的这个问题的办法是调整。一个系统的菜单和提示信息非常重要。如果没有这些用户根本不知道怎么用你设计的这个系统。在设计的调试过程中也无法顺利的完成调试工作。有了一个清晰简单的菜单和一些提示信息这后,调试过程完成的非常顺利。
回顾起此次课程设计,我感慨颇多,的确,从拿到题目到完成整个编程,从理论到实践,在整整两个礼拜的日子里,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体……通过这次课程设计之后,一定把以前所学过的知识熟悉了,本次课程设计结束了,我们通过这次实践学到了许多知识。学到了设计一个简单的系统。要注意哪些方面。也使我们知道自己哪些方面做得还不够。这不仅是程序设计,更是锻炼我们处理问题的能力,同时也使我了解编写程序是件细心活,稍不留神就会出错,这就必须要求我们对待事情要认真!在编写程序的过程中,错误不断出现,不同的类型(如少写了一个符号,写错了字母,用错了函数等等)层出不穷,这考验我们待事细心,耐心,能不能坚持到底,不能半途而废。
但我们总结出了一点点的经验如下:
1、要对系统的功能和要求做出详细的分析,并合理分解任务。
2、把分解出来的子任务,做给一个相对独立的模块。
3、在设计一个模块之前,要简单构想一下总界面的显视情况。
4、针对构想出来的界面进行程序的编写。
九 参考资料
[1]谭浩强. C程序设计(第三版) . 北京:清华大学出版社, 20##
[2]谭浩强. C程序设计题解与上机指导(第三版) . 北京:清华大学出版社, 2005
[3]李春葆,张植民,肖忠付.C语言设计题典[M].北京:清华大学出版社,2002
[4]网上相关资料