数据结构课程设计——图书购买模拟系统(C++)

前言

        作者目前(2023年12月)是一名计算机大三学生,该课程设计是我一年前写的,最近快到期末了,就把去年做的课设报告的极简版发出来供大家参考。如果有数据结构课设需求可以后台私信我(留下联系方式,建议QQ,实在急的话可以加我小号QQ 1242484192),但是有偿(看具体需求,够学长填肚子就好,淘宝上300-800一个课设没必要),特别强调:触犯学术不端的需求不做。

一、课题目标

       本课题拟开发一个“图书购买模拟系统”,该系统包括书库子系统和购物车子系统。运行系统时对系统进初始化,读取书库数据文件(txt格式文件),书库数据文件的数据预先手工建立。通过系统功能菜单提示,选择执行相应的功能,结束系统功能的演示只能通过“退出”菜单选项实现。退出系统时,把当前书库的图书信息保存到书库数据文件。

二、子系统

      2.1 书库子系统

      该子系统具体功能如下:添加书库图书、查询书库图书、修改库存数量、按价格高低显示图书、删除书库图书、输出所有图书。

      各个功能模块具体阐述不在此给出。

       2.2 购物车子系统

        该子系统具体功能如下:输出书库图书、购买图书、统计购买金额、按购买日期显示图书、删除购物车图书、输出购物车所有图书信息。

        各个功能模块具体阐述不在此给出。

三、总体设计

      3.1 系统功能模块结构

      根据课题预期要完成的功能要求,设计主菜单与两个子菜单。通过主菜单来控制两个子菜单的调用以及整个系统的退出,通过子菜单来控制各子系统功能模块的调用。每次调用结束子系统功能模块后返回对应的子系统菜单,当选择退出子系统的功能模块时,退出子系统返回主菜单。当操作者选择了主菜单中的退出功能模块时,将书库信息与购物车信息输出为文档,退出系统结束操作。

     3.2书库子系统各个子模块功能的处理流程 (这边只给一个)

     3.2.1【添加书库图书】

  1.  输入需要添加的图书的图书信息;
  2.  在当前书库中进行查找;
  3.  若查找成功,给出错误信息并返回上一级菜单;若查找失败,则将新的图书信息添加至当前书库中;
  4.  返回上一级菜单;

    3.2.2【查询书库图书】

    3.2.3【修改库存数量】

    3.2.4【按价格高低显示图书】

    3.2.5【删除书库图书】

    3.2.6【输出所有图书】

    3.3购物车子系统各个子模块功能的处理流程(这边只给一个)

    3.3.1【输出书库图书】

    3.3.2【购买图书】

  1.  输入要购买的图书的图书号;
  2.  输入购买数量与购买日期;
  3.  从书库中拷贝该图书信息并将其与购买数量、购买日期一同存储至新的结点;
  4.  将该图书的购买信息添加到当前购物车中;
  5.  返回上一级菜单;

    3.3.3【统计购书金额】

    3.3.4【按购买日期显示图书】

    3.3.5【删除购物车图书】

四、详细设计

    4.1结点类型的设计

    1、书库结点:

        书库结点中包含的数据项有:图书号、书名、作者、出版社、出版日期、价格、库存数量、库存金额、入库日期、指针域

    2、购物车结点:

        购物车结点中包含的数据项有:图书号、书名、作者、出版社、出版日期、价格、购买数量、购买金额、购买日期、指针域

    4.2采用的逻辑结构

    线性结构(分析过程不在此给出)

    4.3采用的存储结构

    链式存储结构(分析过程不在此给出)

    4.4核心算法

    4.4.1书库子系统各功能模块核心算法

    【添加书库图书】

核心算法:将新的图书信息存储至新的结点并添加至当前书库中;

处理步骤如下:

申请一个新的结点,将输入的信息……(语言描述在此不给出,给个伪代码)

p = new Node;

p -> 图书号 = 输入的图书号; p -> 图书名 = 输入的书名;

………………

p -> 入库日期 = 输入的入库日期;

if(头结点后没有结点) 头结点的下一个结点 = p;

else p的下一个结点=头结点的下一个结点;头结点的下一个结点 = p;

    【查询书库图书】

    【修改库存数量】

    【按价格高低显示图书】

    【删除书库图书】

    4.4.2购物车子系统各功能模块核心算法

    【购买图书】

      核心算法:将指定图书号的图书信息从书库链表结点拷贝到购物车链表结点中,将新结点插入到购物车链表中

      处理步骤如下:

      设置书库指针指向……(语言描述在此不给出,给个伪代码)

      Node *p 指向书库中指定图书号对应的结点;

      Book *q 指向购物车新结点;

      q -> 图书号 = p -> 图书号; q -> 书名 = p ->书名;

      ……………………

      q -> 购买数量 =输入的购买数量;q -> 购买日期=输入的购买日期;

      if(购物车头结点后没有结点) 头结点的下一个结点为q;

      else q的下一个结点=头结点的下一个结点;头结点的下一个结点 = q;

    【统计购书金额】

    【按购买日期显示图书】

    【删除购物车图书】

五、编码设计

        (类名、数据成员定义、函数声明在此不给出,给一个删除功能的代码)

//删除库中图书 
void Library::Delete(string xh){
	if(xh.length()!=4){
		cout<<"------------------------------"<<endl;
    	cout<<"|     图书的编码需为四位数   |"<<endl;
		cout<<"|        图书删除失败        |"<<endl; 
		cout<<"------------------------------"<<endl; 
	}else{ 
	Node *p,*q;
	p=head->next;
	q=head;
    while(p->next!=NULL && p->SerialNumber!=xh){
		p=p->next;
	}//遍历链表使指针p指向指定图书 
	if(p->SerialNumber==xh){
		Show(p);
			cout<<"        ------------------        "<<endl;
			cout<<"        |是否确认删除图书|        "<<endl;
			cout<<"        |1、删除  2、保留|        "<<endl; 
			cout<<"        ------------------        "<<endl; 
			int choose;            //功能选择变量 
			cin>>choose;
			if(choose!=1 && choose!=2){
			    cout<<"无效输入,返回菜单"<<endl;
			}else{
				switch(choose){
					case 1:
						while(q->next!=p){q=q->next;}    //使q指针指向p指针指向的结点的前一个结点 
						if(p->next!=NULL){
							q->next=p->next;
						}else{
							q->next=NULL;
						}
						cout<<"图书:"<<p->BookName<<" 已成功删除"<<endl;
						break;
					case 2:
						cout<<"保留图书,返回菜单"<<endl;
						break; 
				}
			}
	}else{
	    cout<<"该图书号不存在,查找失败!"<<endl; 
	}
	}
}
//输出购物车中的总金额
//收起来了一部分,大家可以自己思考
void Shopping::TotalPrice(string xh){
	Book *p,*q;
	p=Head->next;
	q=Head->next;
	while(q->SerialNumber!=xh){
		q=q->next;
	}
    if(q!=NULL){
		double Max=q->BuyPrice;
		double Min=q->BuyPrice;
		while(q!=NULL){
			if(q->SerialNumber==xh && q->BuyPrice>Max){
				Max=q->BuyPrice;
			}
			if(q->SerialNumber==xh && q->BuyPrice<Min){
				Min=q->BuyPrice;
			}
			q=q->next;
        } //找出MAX和MIN
		p=Head->next;
		q=Head->next;
		double temp=Min; 
	    while(p!=NULL){ ……} //输出最大购买金额的图书 
        p=Head->next;
	    while(Max!=Min){
			while(p!=NULL){ ……} //输出此时区间内最大购买金额的图书 
        }
	p=Head->next;
	double TotalPrice=0;
	int TotalNumber=0;
	while(p!=NULL){ ……}
	    cout<<xh<<" 号图书的总金额为:"<<TotalPrice<<endl;
	    cout<<xh<<" 号图书的总数量为:"<<TotalNumber<<endl;
	}else{
		cout<<"-------------------------------------"<<endl;
		cout<<"|        购物车中不存在该图书       |"<<endl;
		cout<<"-------------------------------------"<<endl; 
	}
}

        对于其他功能,有一定难度的是【按价格高低显示图书】和【按购买日期显示图书】(这两个功能模块的逻辑是一样的),其次是【购买图书】,这些功能的实现留给大家思考,有想法或者需要帮助的话可以私信我(联系方式在前言里)

六、程序运行结果

        这边给一部分运行结果

七、收获与体会

        在本次课程设计过程中,我独立完成了图书购买模拟系统的程序代码,回想整个程序设计的过程,无论是在生活方面还是在专业方面我都感触颇深。

        其实在一开始的时候,我是非常不自信的,我不认为自己能够独立完成这样一个可以说是我在代码领域里碰到的第一个“大工程”。那时候真的不知道自己该怎么办,马上要开始检查进度了但自己脑子里还是一团浆糊,有那么一刻真的想要放弃这次课程设计……最后的结果呢?已经完全呈现在这篇报告里了。从一开始看到题目的不自信到最后的完成报告这整个过程中,让我感触最深的不是如何设计结点、如何设计各个功能的成员函数、如何从一个链表的结点中读取信息存储到另一个链表的结点中……让我感触最深的其实是,放平心态,永远对自己自信。

        …………(报告里其实写了很多,这边就给这一点点吧,大家加油,有需要私信我)

  • 27
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值