c++面向对象程序设计------课程设计

课程设计要求

本次考试可以选择使用的理论知识点罗列如下:
常量、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,记录数据,把此程序设计成一个超市管理系统,超市拥有者可以自定义加入商品,顾客可以进行选购商品,并且可以调用<graphics.h>函数,
*/
#include<iostream>
#include<string>
#include<cmath>
#include<iomanip>
#include<fstream>
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<<"超市食物信息"<<endl;
//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分
    }
}

  • 17
    点赞
  • 97
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
新编java设计习题与解析是一本专注于提升学习者在Java编程方面实践能力的教材。该书汇集了大量的习题,并提供了对这些习题的详细解析,旨在帮助读者理解和掌握Java语言的基础知识和常用编程技巧。 这本教材的编写者深知实践在学习编程中的重要性,因此,在设计习题时注重了实际应用和场景模拟。习题类型涵盖了Java语言的各个方面,包括基本语法、面向对象、集合、异常处理、多线程等。每个习题都设计了一个具体的编程任务,要求读者用Java编写相应的代码来实现,从而让读者通过实践来加深对知识点的理解和应用能力的训练。 在习题的解析部分,该书提供了详细的代码分析和解答,讲解了实现思路、关键步骤和常用的解决方法。解析内容不仅仅是对答案的简单解读,更注重于帮助读者理解和掌握解决问题的方法和技巧。同时,解析中还包括了常见错误和容易犯的问题,并给出相应的建议和提示,帮助读者克服困难和提升自己的代码质量。 新编java设计习题与解析适合各层次的Java学习者使用,不论是初学者还是有一定编程基础的人都能从中获得收益。通过完成习题并仔细阅读解析,读者能够逐渐提高自己的编程技巧和实践能力,为以后更复杂的Java项目做好准备。无论是学生、自学者还是职场人士,都能从该书中获取到宝贵的经验和知识,快速成长为Java编程方面的专家。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值