1题目描述:
实现一个花店卖花系统。
功能要求及说明:
1)假设该花店有若干类型的花待售,要求实现增加和删除某类花的功能。
2)查询:根据花的ID或者名称查询花的名称、价格、进货时间、剩余数量。
3)卖花:根据客户提出的要求出售花,输入数量后自动计算总价,并计算收取金额和找零金额;
4)退花:根据客户的要求退还花,并修改剩余数量;
5)采用面向对象思想编程。
2.代码
#include <iostream>
#include <cstring>
#include <windows.h>
using namespace std;
class FlowerShop //花店类
{
public:
FlowerShop() //构造函数
{
ID="\0";
name="\0";
price=0;
num=0;
year=0;
month=0;
date=0;
}
~FlowerShop(){} //析构函数
void Flower_add(FlowerShop *head); //创建链表,增加花种信息
void Flower_print(FlowerShop *head); //打印花店的信息
void Flower_del(FlowerShop *head); //删除链表节点,实现花种的物理删除
void Flower_search(FlowerShop *head); //搜索花的函数
void Flower_aisell(FlowerShop *head) ; //自动结算函数
void Flower_refund(FlowerShop *head); //退花功能
void Flower_menu(FlowerShop *head); //花店主页函数
private:
string ID; //编号
string name; //花名
double price; //价格
int year;
int month; //进货时间
int date;
int num;
FlowerShop *next; //链表的next
};
void FlowerShop::Flower_add(FlowerShop *head) //创建链表
{
FlowerShop *p1=head;
int num; //花的种类数
cout<<"请输入您要添加的花种数量:";
cin>>num;
for(int i=0;i<num;i++)
{
FlowerShop *p2=new FlowerShop;
cout<<"请输入第"<<i+1<<"位花的ID:";
cin>>p1->ID;
cout<<"请输入第"<<i+1<<"位花名:";
cin>>p1->name;
cout<<"请输入第"<<i+1<<"位花的价格:";
cin>>p1->price;
cout<<"请输入第"<<i+1<<"位花的数量:";
cin>>p1->num;
cout<<"请输入第"<<i+1<<"位进货日期:";
cin>>p1->year>>p1->month>>p1->date;
p1->next=p2;
p2->next=NULL;
p1=p2;
}
cout<<"输入完毕"<<endl;
}
void FlowerShop::Flower_print(FlowerShop *head) //输出链表中花的信息
{
FlowerShop *p1=head;
if(p1->next==NULL)
{
cout<<"没有找到该信息!"<<endl;
}
else
{
cout<<"ID 花名 价格 数量 日期"<<endl;
while(p1->next!=NULL)
{
cout<<p1->ID<<" "<<p1->name<<" "<<p1->price<<" "<<p1->num<<" "<<p1->year<<"年"<<p1->month<<"月"<<p1->date<<"日"<<endl;
p1=p1->next;
}
cout<<"输出完毕"<<endl;
}
}
void FlowerShop::Flower_del(FlowerShop *head) //按花名或ID检索和删除链表的实现
{
FlowerShop *p1=head;
string num;
cout<<"请输入您要删除的ID或者花名:";
cin>>num;
if(p1->next==NULL)
{
cout<<"没有找到该信息!"<<endl;
}
else
{
while(p1->next!=NULL)
{
if(num==p1->ID||num==p1->name)
{
FlowerShop *temp=NULL;
temp=p1->next;
p1->next=temp->next;
delete temp;
cout<<num<<"成功删除!"<<endl;
break;
}
p1=p1->next;
}
}
}
void FlowerShop::Flower_search(FlowerShop *head) //按花名或ID检索链表的实现
{
FlowerShop *p1=head;
string exam;
cout<<"请输入您要查找的花名或ID:\n";
cin>>exam;
if(p1->next==NULL)
{
cout<<"没有找到该信息!"<<endl;
}
else
{
cout<<" ID 花名 价格 数量 日期"<<endl;
while(p1->next!=NULL)
{
if(p1->name==exam||p1->ID==exam)
{
cout<<p1->ID<<" "<<p1->name<<" "<<p1->price<<" "<<p1->num<<" "<<p1->year<<"年"<<p1->month<<"月"<<p1->date<<"日"<<endl;
}
p1=p1->next;
}
}
}
void FlowerShop::Flower_aisell(FlowerShop *head) //按花名或ID检索链表自动结算的实现
{
FlowerShop *p1=head;
string exam;
cout<<"请输入您要买的花名或ID:";
cin>>exam;
if(p1->next==NULL)
{
cout<<"没有找到该信息!\n";
}
else
{
while(p1->next!=NULL)
{
if(p1->name==exam||p1->ID==exam)
{
int sell_num,fmoney;
cout<<"请输入需要的数量:";
cin>>sell_num;
if(sell_num>p1->num)
cout<<"该花库存不足!";
else cout<<"请输入所付金额:";
cin>>fmoney;
cout<<"一共"<<p1->price*sell_num<<"元"<<endl;
cout<<"找零:"<<fmoney-p1->price*sell_num<<endl;
cout<<"购买时间:";system("date/t");
p1->num-=sell_num;
}
p1=p1->next;
}
}
}
void FlowerShop::Flower_refund(FlowerShop *head) //按花名和ID检索链表的实现
{
FlowerShop *p1=head;
string exam;
cout<<"请输入您要退款的花名或ID:\n";
cin>>exam;
if(p1->next==NULL)
{
cout<<"无信息!\n";
}
else
{
while(p1->next!=NULL)
{
if(p1->name==exam||p1->ID==exam)
{
int refund_num;
cout<<"请输入退款的数量:";
cin>>refund_num;
cout<<"退款信息如下:"<<endl;
cout<<"ID:"<<p1->ID<<" "<<"花名:"<<p1->name<<" "<<"退还金额:"<<p1->price*refund_num<<endl;
cout<<"该花的库存:"<<p1->num+refund_num<<endl;
cout<<"退款时间:";system("date/t");
p1->num+=refund_num;
}
p1=p1->next;
}
}
}
void FlowerShop::Flower_menu(FlowerShop *head) //主页菜单
{
FlowerShop F;
while(1)
{
cout<<" 欢迎进入字节花店"<<endl<<"\n温馨提示:本系统讲为您提供以下服务"<<endl;
cout<<" 1.增加花店花种信息 "<<endl;
cout<<" 2.删除花店花种信息 "<<endl;
cout<<" 3.查询花店花种信息 "<<endl;
cout<<" 4.花店所有花种信息 "<<endl;
cout<<" 5.自动售卖鲜花系统 "<<endl;
cout<<" 6.花店退花系统 "<<endl;
cout<<" 0.退出花店系统 "<<endl;
cout<<"请选择服务:";
int choise_num;
cin>>choise_num; //服务选择码
switch(choise_num)
{
case 1 :system("CLS");F.Flower_add(head);system("pause");break;
case 2 :system("CLS");F.Flower_del(head);system("pause");break;
case 3 :system("CLS");F.Flower_search(head);system("pause");break;
case 4 :system("CLS");F.Flower_print(head);system("pause");break;
case 5 :system("CLS");F.Flower_aisell(head);system("pause");break;
case 6 :system("CLS");F.Flower_refund(head);system("pause");break;
case 0 :system("CLS");cout<<"谢谢使用,祝您生活愉快!"<<endl;system("date/t");exit(0);system("pause");
default:system("CLS");cout<<"输入有误!"<<endl;system("pause");
}
}
}
int main() //主函数
{
FlowerShop flowershop;
FlowerShop *head=new FlowerShop;
flowershop.Flower_menu(head);
return 0;
}
实验报告
一 目的
通过花店卖花中遇到的需求对花店卖花系统的设计,进一步熟悉C++的概念、类的封装等实现方法,在此过程中要达到以下目的:
1.了解系统开发的需求分析、类的设计、模块分析、编码测试、整体调试的全过程,逐步熟悉程序设计的方法,养成良好的编程习惯。
2. 掌握类的定义、标准String类和向量, 理解掌握友元函数和重载操作符,动态数组。
3. 熟练使用C语言中的函数、数组、指针、链表和字符串等基本知识
4. 培养解决复杂任务功能分解方法:自顶向下逐步求精、模块化设计、信息隐藏等。
5.提高面向对象程序设计的能力。
二 需求分析
1、问题描述
实现一个花店卖花系统。
假设该花店有若干类型的花待售,要求实现增加和删除某类花的功能。根据花的ID或者名称查询花的名称、价格、进货时间、剩余数量。还可根据客户提出的要求出售花,输入数量后自动计算总价,并计算收取金额和找零金额,最后,根据客户的要求退还花,并修改剩余数量,采用面向对象思想编程。系统的功能结构图如图1所示。
2、 基本要求
(1)采取模块化方式进行程序设计,要求程序的功能设计、数据结构设计及整体结构设计合理。
(2)系统以菜单界面方式(至少采用文本菜单界面,如能采用图形菜单界面更好)工作,运行界面友好,演示程序以用户和计算机的对话方式进行。
三 概要设计
1、类的设计
根据用户的需求设计了类FlowerShop,包含数据成员编号ID、花名name、价格price、数量num和进货日期year、month、date。设置了能满足用户需求的成员函数,添加功能函数、删除功能函数、查询功能函数、自动购买结算函数以及退花函数,类图如图2所示。
2、函数的设计
(1)增加和删除功能函数
通过创建链表,可实现对每一种花的信息的储存,通过对链表的创建和插入实现对某一种花的信息进行添加,从而达到所需的增加功能;还可通过对链表节点的删除,实现对某一种花的信息进行删除,达到所需的删除功能。
(2)查询功能函数
在循环结构中,通过p1=p1->next;将 指针不断地移动,知道p1->name或者p1->ID等于输入的字符串时,将p1所指向的ID、花名、价格、数量和进货日期输出,然后跳出循环结构,从而实现对某一种花的查询功能。
(3)购买结算功能
通过查询功能函数,与输入的ID或花名进行匹配,找到该目标花种的价格和数量,然后输出购买的总价,当想购买的数量大于花的库存数量时,则显示库存不足。
(4)退花功能
通过查询功能函数,与输入的ID或花名进行匹配,找到该目标花种的价格和数量,计算应退还的金额并更新现有库存数量。
四 详细设计
1、菜单界面
菜单界面是用户和卖花系统交互的重要场所,首先在屏幕上输出不同系统功能的文字,可通过数字0~6代替相关功能,当用户选择对应功能的数字时,利用选择结构switch(),调用不同的功能函数。在此结构之上,使用循环结构while(1),反复的调用菜单函数,当用户完成某一项功能时,屏幕自动打印菜单,方便用户进行下一步操作,只要用户的使用需求没有结束,功能菜单可无限制的为用户提供服务,直到用户希望退出系统即输入0时,系统调用exit(0),程序结束,并且输出“谢谢使用,祝您生活愉快!”和退出的时间。
2、链表的创建和删除
链表是由一系列连接在一起的节点构成,每个节点都是一个数据机构,在本系统中,可以用链表来储存给以种花的信息,创建链表,首先在类中定义所需要的数据成员和储存下一个节点地址的next指针,通过定义类的对象指针,增加输入要添加的花的种类,通过循环结构依次输入每一种花的信息,当输入完毕时,系统将提示输入完成。通过将头指针head赋值给FlowerShop定义的对象指针p1,if(p1->nextNULL)可判断链表中是否储存着花的信息,如果为空,则输出“没有找到该信息!”,如果不为空,则通过循环结构while(p1->next!=NULL)从## 标题链表的开始到链表的末尾进行匹对,如果找到花名p1->name或花的编号o1->ID和输入的字符串相同,将要删除的节点的指针复制给类对象指针temp,将temp释放,实现对某一种花的信息进行删除,最后向用户输出“某某花成功删除”。
3、函数的设计
系统中查询、购买结算和退花服务的函数的原理相同,即通过将头指针head赋值给FlowerShop定义的对象指针p1,if(p1->nextNULL)可判断链表中是否储存着花的信息,如果为空,则输出“没有找到该信息!”,如果不为空,则通过循环结构while(p1->next!=NULL)从链表的开始到链表的末尾进行匹对,如果找到花名p1->name或花的编号o1->ID和输入的字符串相同,则将进行下一步操作。如果用户选择的是查询某一种花的信息功能,就会输出该花的编号p1->ID、花名p1->name、价格p1->price、数量p1->num和进货日期p1->year,p1->month,p1->date,这样查询某一种花的信息就可以实现;当用火选择的是购买结算功能的时候,系统将更提示输入需要的购买的是那一种花和需要购买的数量以及要付的价钱,当输入需要购买的话的花名或者花的ID时,通过上述功能可实现该种花的信息的匹配,如输入需要购买的数量大于该花的库存数量时,屏幕打印“库存不足”的信息,如果库存充足,则计算购买该花的总价,计算方法为:该花的价格需要的数量=p1->pricesell_num,然后计算找零金额,计算方法为:用户所付的金额-总价,最后通过system(“date/t”)显示购买的时间,这样购买结算的功能就得以实现;若用户选择的是退花服务的功能,系统需要用户输入要退换的花的花名或者花的ID ,以及要退换改装花的数量,通过链表的搜索匹配到该种花的信息,计算退款的金额,计算方法:退换的数量*该花的价格,并且更新花店中该花的库存数量,更新方法为:p1->num+=refund_num;最后通过system(“date/t”)显示退款的时间。
五 调试分析
1、多次使用同一种功能的数据调试
首次使用系统时,多次使用自动购买结算功能和退花服务功能的时候,由于每次调用的都是p1->num,并且输出的是p1->num-sell_num和p1->num+num_refund,不能对链表中的该花的数量进行更新,无法达到预期的效果。p1->num+=refund_num; 和p1->num-=sell_num;两条语句,可以对链表的数据进行修改,成功处理了数据更新的问题,无论该函数使用多少次,数量的数据将实时更新。
2、菜单的调教
系统设计之初,为用户提供菜单页面的次数只有一次,使用下一功能时必须重新进入系统,或菜单的展示次数是有限的,造成用户使用不便,为此将循环结构改为无限次循环,当用户想退出系统的时候,选择相关指令退出循环,结束程序。这样可以为用户自定义使用次数。
六 测试结果
1、系统菜单界面
系统打开以菜单的形式输出,利于用户选择相应的功能进行服务。只要输入相关数字代码,就可以进入相关服务系统,菜单界面如图3所示.
2、增加花店花种信息
选择服务1,输入要增加花种的数量,以2中为例,2种花的信息,当输入完毕时,屏幕上打印输入完成。2种花的具体信息见图4。
3、 查询某一种花信息
选择服务3,输入你想查找的花的ID或者花名,比如查找郁金香如下图5,系统将为用户提供该花的ID、花名和价格等信息。
4、购买自动计算功能
选择服务5,输入需要购买的花的ID或者花名,以及购买的数量和金额,以下图6以购买水仙花为例,数量为50,金额为500元,系统计算总价350元,找零150元。
5、退花服务
选择服务5,输入需要退的花的ID或者花名,以及数量,以购买水仙花为例,如图7所示。
6、删除功能
以删除玫瑰花2020009为例,如下图8所示。
七 用户使用说明
用户打开该系统时,按照菜单显示的功能输入对应的数字0~6,输入其他数字无效。选项1:使用增加花种信息功能时,按照提示输入花的种类,接着按照自己的需求输入相应的花的ID、花名、价格、数量和进货日期。选项2:使用删除功能时,按照系统提示输入要删除的花的ID或者花名,系统自动删除。选项3:显示全店信息。选项4:使用查询功能时,按照系统提示输入要删除的花的ID或者花名,系统将自动显示花的各种信息。选项5:使用购买结算功能时,按照系统提示输入要删除的花的ID或者花名、数量和对应所付的金额,系统将自动计算总价和找零。选项6:使用退花服务,按照系统提示输入要删除的花的ID或者花名,以及数量,系统自动计算退还金额和更新库存。选项0:退出系统。
八 课程设计总结
通过对本次“花店卖花系统”的设计,熟悉了对菜单选择结构的使用,本系统中利用到链表的方法,利用其优点顺利的将花的不同数据储存起来,其余的函数原理几乎相同,通过输入的信息和链表中的信息进行匹配,检索各花的信息来着运算,达到对花的增加、删除、查询、购买和退款等功能。
在此过程中了解系统开发的需求分析、类的设计、模块分析、编码测试、整体调试的全过程,逐步熟悉程序设计的方法,养成良好的编程习惯,其中用到的编程知识相对综合,更加熟悉C++的编译环境。