本次考试可以选择使用的理论知识点罗列如下:
常量、new/delete、引用、构造函数、析构函数、拷贝构造、静态成员、友元、组合类、重载函数、虚函数、运算符重载、模板、错误异常处理、格式化输入输出以及文件存取管理等。
请每个同学结合自己对现实世界的认知能力和代码实践能力综合运用所学的C++面向对象程序设计语言完成以下测试要求。
设定食品类做基类,干果类为派生类,请按照下面各题的要求编写程序:
(1) 合理编写基类和派生类代码完成基本功能。要求基类至少包含三个以上的数据成员和若干个合适的成员函数(其中构造函数至少2个),派生类至少增加二个以上的数据成员和若干合适的的成员函数。在主函数中声明至少包含5个派生类对象的数组完成初始化输入功能。每个函数都要写简明注释,说明功能。(30分)
(2) 编写一个函数可以随机修改对象的数据。要求写简明注释,说明功能。(5分)
(3) 设计合理情景, 增加静态成员对所有对象实现合理的统计功能并输出结果。如统计对象个数,求平均值以及找出最小的对象等等(以什么条件判断最小,每个考生结合自己的类自行设计合理条件)。要求写简明注释,说明功能。(10分)
(4) 编写一个能够将“对象”或“对象指针”或“对象引用”作为参数的函数,并调用此函数完成和本考题的基类或派生类相关的功能。要求写简明注释,说明功能。(10分)
(5) 每个考生依据自己的类增加一个合适的友元函数完成运算符重载(如 +、-、*、/、>、<、>>、<< 等等),以便能直接操作自定义的类对象 。要求写简明注释,说明功能。(10分)
(6) 对主函数中已经声明的对象数组,使用对象指针遍历对象数组中的数据,并将数据通过输入输出流类控制格式(如对齐方式、列宽、填充字符、精度等格式控制)输出到屏幕上,同时把数据一并输出到文件中(文本文件、二进制文件不限)。要求写简明注释,说明功能。(20分)
(7) 在以上6题的基础上,鼓励考生在面向对象编程方法上、设计思想理念上、跨课程等方面进行创新性编程并融入到考试答案中。要求写简明注释,说明编程意图(15分)
第(7)题提示,但考生可以不局限于提示:
(1) 面向对象编程方法:类的组合、虚函数、模板、异常处理、虚基类等。
(2) 跨课程:数据结构、数据库、软件工程、计算方法等。
(3) 多应用:增加题目中类和对象的应用情景等。如利用文件保存对象数组后,可以读出数据并对文件中的对象数据进行查、删、增、改等操作。
此次课程设计的大致框架写在了最前面
具体步骤和关键点代码中都有注释和说明
如有写的不正确的地方欢迎给我指出问题,我会进行修改和完善
/***
本次设计是以食品类为基类,干果为派生类
且干干果为本店特色食品,购买两件以上的干果干果价格打9折
且商家一开始可以修改食物价格
场景是模拟顾客到超市食品区购买商品
(7) 在以上6题的基础上,鼓励考生在面向对象编程方法上、设计思想理念上、跨课程等方面进行创新性编程并融入到考试答案中。要求写简明注释,说明编程意图(15分)
可以把c++接入MySQL,记录数据,把此程序设计成一个超市管理系统,超市拥有者可以自定义加入商品,顾客可以进行选购商品,并且可以调用函数,
*/
#include
#include
#include
#include
#include
using namespace std;
void Customer_System();
class food //食品基类
{
private :
string name;//食品名称
double price;//食品价格
bool specialty;//是否为特色食品(干果)
int id;//食物种类编号
static int tot_num;//商店食品总数
public:
food() {}; //无参构造函数
food(string name1,double price1,bool specialty1)
{
tot_num++;
id=tot_num;
name = name1;
price = price1;
specialty = specialty1;
};//普通构造函数
food(string name1,double price1)
{
tot_num++;
id=tot_num;
name = name1;
price = price1;
specialty = false;
};//默认为food的构造函数
void print_information()
{
cout<<"商品名称:"<<name<<" ";
cout<<"商品价格:"<<price<<endl;
cout<<endl;
};//输出食品信息
string getname()
{
return name;
};//得到食品名称
double getprice()
{
return price; //得到食品价格
}
bool getspecialty()
{
return specialty; //食品是否为干果
}
void writename(string name1) ///可以直接修改对象的数据
{
name = name1;
}
void writeprice(double price1)
{
price = price1;
}
///(2) 编写一个函数可以随机修改对象的数据。要求写简明注释,说明功能。(5分)
friend double operator-(food& a,food &b)
{
double temp;
temp = a.price-b.price;
return temp;
}///计算两个食品之间的价格差
///(5) 每个考生依据自己的类增加一个合适的友元函数完成运算符重载(如 +、-、*、/、>、<、>>、<< 等等),以便能直接操作自定义的类对象 。要求写简明注释,说明功能。(10分)
};
class Dry_Fruits:public food //干果子类
{
private:
string information;//干果信息
string nutritive_value;//营养价值
public:
Dry_Fruits(string name1,double price1,bool specialty1,string information1,string nutritive_value1):food(name1,price1,specialty1)
{
information = information1;
nutritive_value = nutritive_value1;
};//构造函数
void print_information()
{
cout<<"坚果名称:"<<getname()<<" ";
cout<<"坚果价格:"<<getprice()<<" ";
cout<<"坚果描述:"<<information<<" ";
cout<<"坚果营养价值:"<<nutritive_value<<endl;
cout<<endl;
}
};///(1) 合理编写基类和派生类代码完成基本功能。要求基类至少包含三个以上的数据成员和若干个合适的成员函数(其中构造函数至少2个),派生类至少增加二个以上的数据成员和若干合适的的成员函数。在主函数中声明至少包含5个派生类对象的数组完成初始化输入功能。每个函数都要写简明注释,说明功能。
///将对象作为参数的函数
double cast(food &f,int x,int y) //计算当前食品的总价格
{
if(f.getspecialty()) //是坚果
{
if(y>=2)
{
return f.getprice()*x*0.9;
}
else return f.getprice()*x;
}
else
{
return f.getprice()*x;
}
}///(4) 编写一个能够将“对象”或“对象指针”或“对象引用”作为参数的函数,并调用此函数完成和本考题的基类或派生类相关的功能。要求写简明注释,说明功能。(10分)
//初始化tot_num;
int food::tot_num=0;
int main()
{
//顾客进行点单
Customer_System();//顾客点单系统
return 0;
}
void Customer_System() //顾客点单系统
{
加载食品信息
food f[6]=
{
food(),
food("泡椒凤爪",10,false),
food("冰红茶",3),
food("泡面",5,false),
Dry_Fruits("榛子",50,true,"榛子是国际畅销的名贵干果,有“坚果之王”的美誉","high"),
Dry_Fruits("腰果",60,true,"腰果有丰富的营养价值,可炒菜,也可作药用,为世界著名四大干果之一","mid")
};
//可以修改食品价格
//cout<<"超市食物信息"<
//for(int i=1;i<=5;i++){
// f[i].print_information();
//}
///把输出的内冲输入到文件名称为food的dat文件中
ofstream fout("food.dat",ios::out);//定义一个流对象
///使用对象指针输出food的商品列表(数组)中的数据,并通过输出流的控制格式输出商品的名称和价格
food *p;//定义指向类food的对象指针
p=f;
int e=5;
while(e--)
{
p++;
///输出到屏幕上
cout<<"商品名称:";
cout.fill(' ');//设置填充字符为空格
cout.width(8);//设置域宽为10
cout<< p->getname();//把fodd商品表输入到屏幕上
cout.width(22);//设置域宽为15
cout.fill('_');//设置填充字符为-
cout<<"价格:"<<p->getprice()<<endl;//把food商品表输入到屏幕上
///同时输出到food文件中
fout<<"商品名称:";
fout.fill(' ');//设置填充字符为空格
fout.width(8);//设置域宽为10
fout<< p->getname();//把fodd商品表输入到文件中
fout.width(22);//设置域宽为15
fout.fill('_');//设置填充字符为-
fout<<"价格:"<<p->getprice()<<endl;//把food商品表输入到文件中
}
fout.close();//关闭文件
///(6)对主函数中已经声明的对象数组,使用对象指针遍历对象数组中的数据,并将数据通过输入输出流类控制格式(如对齐方式、列宽、填充字符、精度等格式控制)输出到屏幕上,同时把数据一并输出到文件中(文本文件、二进制文件不限)。要求写简明注释,说明功能。(20分)
cout<<"现在你是管理者,你可以修改商品的价格!"<<endl;
for(int i=1; i<=5; i++)
{
cout<<"你是否要修改"<<f[i].getname()<<"的价格?"<<endl;
cout<<" yes or no "<<endl;
string s;
cin>>s;
if(s=="yes")
{
cout<<"请输入想修改的食品价格"<<endl;
double y;
cin>>y;
f[i].writeprice(y);
}
else
{
cout<<"此商品价格没有改变"<<endl;
}
}
cout<<"新的超市食物信息"<<endl;
for(int i=1; i<=5; i++)
{
f[i].print_information();
}
cout<<"---------------欢迎光临小月亮食品超市--------------"<<endl;
int a[6];
int tot1=0;//选购食品件数
int tot2=0;//坚果商品件数
\
for(int i=1; i<=5; i++)
{
a[i]=0;
}
while(1)
{
cout<<"*****************************************"<<endl;
cout<<"请输入您要进行的操作:"<<endl;
cout<<"1.选择商品"<<endl;
cout<<"2.查看已购买商品的信息"<<endl;
cout<<"3.结账"<<endl;
cout<<"4.比较两种商品的价格差"<<endl;
int x;
cin>>x;
switch(x)
{
case(1): //选购食品
{
for(int i=1; i<=5; i++)
{
cout<<i<<'.';
f[i].print_information();
}
int y;
cin>>y;
if(y==4||y==5)
{
tot2++;
}
a[y]++;
break;
}
case(2): //购物车
{
cout<<"您选购的商品有"<<endl;
int tot3=0;
double sum=0;
for(int i=1; i<=5; i++)
{
if(a[i]!=0)
{
tot3++;
cout<<tot3<<".";
cout<<f[i].getname();
cout<<" *"<<a[i];
cout<<" ";
double c=cast(f[i],a[i],tot2);
sum+=c;
cout<<c<<"元"<<endl;
}
}
cout<<"商品总计"<<sum<<"元"<<endl;
break;
}
case(3):
{
double sum=0;
for(int i=1; i<=5; i++)
{
if(a[i]!=0)
{
double c=cast(f[i],a[i],tot2);
sum+=c;
}
}
while(1)
{
cout<<"您需要支付"<<sum<<"元,请付钱:"<<endl;
double y;
cin>>y;
for(int i=1; i<=5; i++)
{
if(a[i]!=0)
{
y-=cast(f[i],a[i],tot2);
}
}
if(y>=0) //结账
{
cout<<"找零"<<y<<"元,";
cout<<"欢迎下次光临"<<endl;
return ;
break;//结账成功
}
else
{
cout<<"付款金额不足,请重新支付"<<endl;
}
}
break;
}
case(4): //比较两个食品时间的价格
{
cout<<"请输入要进行对比的两种食品"<<endl;
int y,z;
cin>>y>>z;
double d=f[y]-f[z];
if(fabs(d)<=0.000001)
{
cout<<f[y].getname()<<"与"<<f[z].getname()<<"价格相同"<<endl;
}
else if(d>0)
{
cout<<f[y].getname()<<"比"<<f[z].getname()<<"贵"<<d<<"元"<<endl;
}
else
{
cout<<f[z].getname()<<"比"<<f[y].getname()<<"贵"<<-d<<"元"<<endl;
}
break;
}
default:
{
cout<<"输入有误请重新输入"<<endl;
}
}
///(3) 设计合理情景, 增加静态成员对所有对象实现合理的统计功能并输出结果。如统计对象个数,求平均值以及找出最小的对象等等(以什么条件判断最小,每个考生结合自己的类自行设计合理条件)。要求写简明注释,说明功能。(10分
}
}