C++第一单元实验一第二题菜单选择程序.docx
- 文档编号:27942317
- 上传时间:2023-07-06
- 格式:DOCX
- 页数:16
- 大小:91.04KB
C++第一单元实验一第二题菜单选择程序.docx
《C++第一单元实验一第二题菜单选择程序.docx》由会员分享,可在线阅读,更多相关《C++第一单元实验一第二题菜单选择程序.docx(16页珍藏版)》请在冰豆网上搜索。
C++第一单元实验一第二题菜单选择程序
【设计题目】
设计菜单选择趣味程序
【设计要求】
菜单是应用程序的界面,本题的任务是设计一个比较实用的菜单,通过菜单选择不同的功能。
设计分为两步:
首先设计一个含有多个菜单项的菜单演示程序,然后再为这些菜单项配上相应的功能。
菜单内容
程序运行后,界面给出3个菜单项的内容和输入提示。
1.解一元二次方程
2.出圈游戏
3.退出程序
选择l-3:
使用数字1-3来选择菜单项,执行相应的菜单项功能,其他输入则不起作用。
【总体设计】
一、菜单驱动程序
输入1-3之间的任意一个数字,即可进入相应选择项。
从程序测试结果可知,当选择相应选择项时,其输出信息分别为:
解一元二次方程、出圈游戏和退出程序。
1.主程序的设计
假设使用文件select.cpp,内容如下:
/*********************************
*select.cpp主程序文件
*********************************/
#include"cpp2.h"
voidmain()
{
handle_menu();//调用菜单处理函数
}
2.实现循环和功能选择的设计-菜单处理函数
/*********************************
*菜单处理函数
*********************************/
voidhandle_menu(void)
{
for(;;)
{
switch(menu_select())//调用菜单选择函数
{
case1:
FindIt();//求解一元二次方程
break;
case2:
game();//出圈游戏
break;
case3:
cout<<"\t再见!
\n";
return;
}
}
}
这里使用for循环实现重复选择,假设输入选择用变量用cn存储,它作为menu_select()函数的返回值提供给switch语句。
3.得到cn的合理值的设计-菜单选择函数
应该设计一个函数用来输出提示信息和处理输入,这个函数应该返回一个数
值cn,以便供给switch语句使用。
/*********************************
*菜单选择函数
**********************************/
intmenu_select()
{
chars[2];
intcn;
cout<<"\t1.解一元二次方程\n";
cout<<"\t2.出圈游戏\n";
cout<<"\t3.退出程序\n";
cout<<"\t选择1-3:
";
for(;;)
{
gets(s);
cn=atoi(s);//是为了使输入的字符串转变为数字
if(cn<1||cn>3)
printf("\n\t输入错误,重选1-3:
");
else
break;
}
returncn;
}
二、求解一元二次方程
1.设计要求
这里要求编制一个求方程aX2+bx+c=0的根的程序。
一般将系数设成float型,可以把求根变量设成double型,使用库函数sqrt()求平方根,sqrt()在头文件math.h中定义。
假设:
d=b*b-4*a-c可以根据d>0、=0或<0来决定求解方法。
if(d>0)
{//有两个不相等的实数解}
elseif(d==0)
{//有两个相等的实数解}
else
{//有两个不相等的虚数解}
2.设计方法
(1)设计一个FindRoot类表示这个方程。
(2)在头文件cpp2.h中声明类,在FindRoot.cpp文件中定义成员函数。
(3)使用函数Findlt()作为菜单项。
3.类FindRoot的设计
为了方便,除了将方程系数设计为属性之外,还将方程的根x1和x2,以及用来作为判定条件的d(d=b*b-4*a*c)均设计成类的属性。
如图1是其类图,图2是对象obj的对象图。
其中,成员函数Find()是用来求方程的根,Display()则用来输出结果。
由此可见,它们都需要用到属性d。
可在构造函数中求出d的值,其他成员函数直接使用这个属性,不必再去计算。
图1类图图2obj对象图
①.设计构造函数
FindRoot:
:
FindRoot(floatx,floaty,floatz)
{
a=x;b=y;c=z;
d=b*b-4*a*c;
}
②设计求根成员函数Find()
voidFindRoot:
:
Find()
{
if(d>0)
{
x1=(-b+sqrt(d))/(2*a);
x2=(-b-sqrt(d))/(2*a);
return;
}
elseif(d==0)
{
x1=x2=(-b)/(2*a);
return;
}
else
{
x1=(-b)/(2*a);
x2=sqrt(-d)/(2*a);
}
}
③设计输出结果的成员函数Display()
voidFindRoot:
:
Display()
{
if(d>0)
{
cout<<"x1="< return; } elseif(d==0) { cout<<"xl=x2="< return; } else { cout<<"Xl="< cout<<"X2="< } } 4.设计菜单函数FindIt() 为了循环求解,使用for循环语句。 退出时,希望只接收一个字符。 最简单的是输入一个0作为a的值。 /************************************************ *菜单项函数 ***************************************************/ voidFindIt() { floata,b,c; cout<<"这是一个求方程ax2+bx+c=0的根的程序。 "< cout<<"把变量设为double型,使用库函数math进行计算."< for(;;) { cout<<"输入方程系数a: "; cin>>a; if(a==0)//a为0,结束运行,因为“回车”被atoi()函数作为“0”值赋给cn { getchar();//为消除回车的影响 return; } cout<<"输入方程系数b: "; cin>>b; cout<<"输入方程系数c: "; cin>>c; FindRootobj(a,b,c); obj.Find(); obj.Display(); } } 三、设计出圈游戏 1.设计要求 这里假设有人数为n个人的一个小组,他们按顺时针方向围坐一圈。 一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。 报数m的人出列,然后从他原来所在的、顺时针方向的下一个人开始重新从1报数,报到m时停止报数并出列。 如此下去,直至所有人全部出列为止。 要求按他们出列的顺序输出他们的名字。 2.设计方法 求解出圈顺序的方法很多,这里我采用的是利用类和数组来求解出圈顺序,仅供大家参考。 (1)设计一个SeqList类。 (2)在头文件cpp2.h中声明类,并使用默认的内联函数方式定义它们。 (3)使用类的数组来求解。 (4)用Joseph()函数求解出圈,使用函数game()作为菜单项。 (5)在文件gamel.cpp中实现Joseph()和game()函数。 3.设计类 这里要求使用名字,而在名字的字符串中,可能存在空格。 可以为该类设计两个属性,一个是字符串,用来存储名字。 另一个是整数,用来表示报数的位置。 若使用类的数组,则可以通过数组的下标,将位置和名字对应起来。 在声明的类中,同时定义的成员函数就是默认的内联函数。 另外,考虑到使用类的数组,所以不为它定义构造函数,而是用系统提供的默认无参数构造函数。 /************************************************* *声明SeqList类* *使用内联函数定义类* ****************************************************/ classSeqList{ intnum; charname[10]; public: intGetNum() {returnnum;} voidDispName() {cout< voidSetNum(inta) {num=a;} voidSetName(charb[[]] {strcpy(name,b);} }; 按照要求,不需要为类设计求解出圈的成员函数。 4.求解出圈的函数Joseph() 使用类的数组,其实就是利用顺序存储结构来求解。 在数组初始化后,调用函数Joseph() 寻找出列人员。 假设建立类的数组c,这时只能为数组c假设一个长度,实际的有效长度只有 在给定人数之后才能知道。 它的算法思想如下: voidJoseph(SeqListc[],intlength)//使用数组作为参数,同时需要将人数传给它。 { BEGIN 初始化 人数Length 参加游戏的人的名字 计数器初值 k从1开始循环length次 j计数器清零 j循环(j<间隔次数m) 计数i 如果i数到尾部,则返回第一个位置,即重置i等于0 如果该位置上的人仍然在圈中,则j计数加1 endj//结束循环j 如果是最后一个,结束循环,作特殊处理 不是最后一个,输出出圈人的信息 标识该人员已出圈,开始新一轮循环 endk 最后一个结束循环,输出它的信息。 END } 判断是利用数据成员的值,已经出圈的将其标志为0。 下次数到他时,作为无效数据处 理。 输出使用数据成员name。 5.菜单项函数game() 位置编号num应该从1开始,但C++的数组是从O开始,所以num的值比其所在数组的下标的值多1,这样做是为了直观。 数组的大小一旦定义,就不能改变。 算法思想如下: voidgame() { BEGIN 初始化n和length 定义数组c[n]; 初始化数组c 调用Joseph()函数 END } 四、设计头文件 可将函数原型声明、类的声明一起放在头文件中,假设头文件为cpp2.h。 #if! defined(CPP2_H) #defineCPP2_H #include #include usingnamespacestd; /********************************* *声明FindRoot类 *********************************/ classFindRoot { ……………………….. } /********************************* *声明SeqList类* *使用内联函数* *定义类的成员函数* *********************************/ classSeqList { ……………………….. } /********************************* *声明函数原型 *********************************/ voidFindIt(); voidhandle_menu(void); intmenuselect(); voidgame(); voidJoseph(SeqList[],int); #endif 【项目的文件结构】 这个项目共有3个.cpp文件和一个.h文件。 假定项目文件为: 菜单选择.dsp,其结构如下图所示: 在项目中既可先添加各文件,然后在文件中编程;也可以事先使用编辑器将各源程序写好,然后直接添加到项目中。 文件及函数组成 源文件 函数名或其他成分 功能 select.cpp 菜单和主函数设计 main() menu_select() handle_menu() 主函数 菜单选择 菜单处理 FindRoot.cpp 求解一元二次方程设计 FindRoot() Find() Display() FindIt() 构造函数 求解成员函数 显示信息的成员函数 菜单项函数 game.cpp 出圈游戏设计 Joseph() game() 求解出圈函数 菜单项函数 cpp2.h 头文件设计 FindRoot类 SeqList类 库函数 函数原型声明 类声明 类定义 引用库函数 引用函数 【运行界面参考】 1.解方程 运行情况如下: 1.解一元二次方程 2.出圈游戏 3.退出程序 选择1-3: 1 2.出圈 分别用两个程序互相验证,输入5个人,间隔为10。 运行情况如下 1.解一元二次方程 2.出圈游戏 3.退出程序 选择1-3: 2 3.退出 1.解一元二次方程 2.出圈游戏 3.退出程序 选择1-3: 3 再见! 【评价标准】 ●本题是训练使用类和数组,只要能保证程序运行全部正确,即可获得不低于85分。 ●如果具有一定的创造性(如,使用构造类型的数据构成数组),分数则不低于90分。 ●如果有一个程序完全不正确,成绩不能高于75分,有两个程序完全不正确,则不予及格。 如果只是菜单有问题,最高可得80分。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 第一 单元 实验 第二 菜单 选择 程序
![提示](https://static.bdocx.com/images/bang_tan.gif)