我们利用顺序表的形式实现图书管理系统,根据实验指导书得出大致的系统总框架和部分伪代码。我们需要实现的实验要求如下:
- 逐个显示图书表中所有图书的相关信息;
- 能根据指定的待入库的新图书的位置和信息,将新图书插入到图书表中指定的位置;
- 根据指定的待出库的旧图书的位置,将该图书从图书表中删除;
- 能统计表中图书个数;
- 实现图书信息表的图书去重;
- 实现最爱书籍查询,根据书名进行折半查找,要求使用非递归算法实现,成功返回此书籍的书号和价格;
- 图书信息表按指定条件进行批量修改;
- 利用快速排序按照图书价格降序排序;
- 实现最贵图书的查找;
系统框架:
伪代码: 图书信息的定义: typedef struct { char no[8]; //8位书号 char name[20]; //书名 int price; //价格 }Book; 顺序表的定义: typedef struct { Book *elem; //指向数据元素的基地址 int length; //线性表的当前长度 }SqList; seqlist::seqlist(seqlist &T){ |
图书管理.cpp
#include"stdafx.h"
#include<iostream>
#include<string>
using namespace std;
#define ok 1
#define error 0
#define maxsize 100
#define overflow -2
typedef struct
{
string ID;
string name;
float price;
}book;//结构体
typedef struct
{
book* elem;
int length;
}sqlist;
int initlist(sqlist &l)//顺序表的初始化
{
l.elem = new book[maxsize];//给顺序表分配地址空间
if (!l.elem)exit(overflow);
l.length = 0;
return ok;
}
void menu()//菜单函数
{
cout << "*************1.输入图书信息***********" << endl;
cout << "*************2.查询图书信息(所有)*******" << endl;
cout << "*************3.按价格排序************" << endl;
cout << "*************4.根据书名查询图书信息****" << endl;
cout << "*************5.根据书名删除图书信息*****" << endl;
cout << "*************6.根据ID查找重复图书信息***" << endl;
cout << "************7.根据输入的特定位置插入书籍*******" << endl;
cout << "************8.得到顺序表长度***************" << endl;
cout << "************9.批量对价格修改*****************" << endl;
cout << "************10.终止程序*****************" << endl;
}
int input(sqlist &l)//输入图书信息
{
cout << "请输入图书的个数:" << endl;
int n;
cin >> n;
for (int i = l.length; i < l.length+n; i++)//便于后续输入图书信息
{
cout << "请输入第"<<i+1<<"本图书信息" << endl;
cout << "书号为:" << endl;
cin >> l.elem[i].ID;
cout << "书名为:" << endl;
cin >> l.elem[i].name;
cout << "价格为:" << endl;
cin >> l.elem[i].price;
}
l.length = l.length + n;
return ok;
}
int Length(sqlist &l){
cout<<"顺序表长度"<<l.length<<endl;
return 0;//返回顺序表长度
}
//批量操作(改价格)
void Adjust(sqlist &l) {
double sum = 0;//求和
for (int i = 0; i < l.length-1; ++i) {
sum += l.elem[i].price;//价格总和
}
double ave = sum / (l.length-1);//求平均
//调整
for (int i = 0; i < l.length ; i++) {
if (l.elem[i].price < ave) {
l.elem[i].price += 0.2 * l.elem[i].price;
}
else {
l.elem[i].price += 0.1 *l.elem[i].price;
}
}
for(int i=0;i<l.length;i++){
cout<<"变化后:"<<l.elem[i].ID<<" "<< l.elem[i].name <<" "<< l.elem[i].price << endl;
}
}
void insertNum(sqlist &l,int location){
if(location<1||location>l.length) throw"位置错误,不在顺表范围之内";
else{
for (int j = l.length; j >= location; --j) { //遍历调整元素位置;
l.elem[j]=l.elem[j-1];
}
cout << "书号为:" << endl;
cin >> l.elem[location-1].ID;
cout << "书名为:" << endl;
cin >> l.elem[location-1].name;
cout << "价格为:" << endl;
cin >> l.elem[location-1].price;
l.length++;
}
}
int sort(sqlist& l)//按价格对图书进行排序(利用冒泡排序)
{
for (int i = 0; i < l.length - 1; i++)
{
for (int n = 0; n < l.length - 1 - i; n++)
{
if (l.elem[n].price > l.elem[n + 1].price)
{
book tmp;
tmp = l.elem[n];
l.elem[n] = l.elem[n + 1];
l.elem[n + 1] = tmp;
}
}
}
cout << "排序后图书信息为:" << endl;
for (int i = 0; i <l.length; i++)
cout << l.elem[i].ID <<" "<< l.elem[i].name <<" "<< l.elem[i].price << endl;
cout<<"最贵的书"<<l.elem[l.length-1].ID<<" "<< l.elem[l.length-1].name <<" "<< l.elem[l.length-1].price << endl;
return ok;
}
void output(sqlist &l)//输出图书信息函数
{
cout << "图书信息为:" << endl;
for (int i = 0; i <l.length; i++)
cout << l.elem[i].ID<< " "<< l.elem[i].name<<" " << l.elem[i].price << endl;
}
int query(sqlist l)//根据图书名查询图书信息
{
cout << "请输入查询的书名:" << endl;
string name1;
cin >> name1;
int low = 0;
int high = l.length - 1;
int mid = 0;
double key = 0;//查找依据
for (int i = 0; i < l.length - 1; i++) {//书名转化价格查找
if (l.elem[i].name == name1) {
key = l.elem[i].price;
}
}
while (low <= high) {//逐步缩小范围
mid = (low + high) / 2;
if (l.elem[mid].price > key)
low = mid + 1;
else if (l.elem[mid].price < key)
high = mid - 1;
else
cout<<l.elem[mid].ID<<" "<<l.elem[mid].name<<" "<<l.elem[mid].price<<endl;
return mid;
}
return -1;
}
int Repetion(sqlist &l)//查重函数,利用书号的唯一性进行比较
{
for(int i=0;i<l.length;i++){
for(int j=i+1;j<l.length;j++){
if(l.elem[i].ID==l.elem[j].ID){
for (int k = 0; k < l.length; k++)//该书后面的书的位置均向前移一位
{
l.elem[k].ID = l.elem[k + 1].ID;
l.elem[k].name = l.elem[k + 1].name;
l.elem[k].price = l.elem[k + 1].price;
}
cout<<"重复书籍为:"<<l.elem[i].ID<<" "<<l.elem[i].name<<" "<<l.elem[i].name<<endl;
l.length--;
return ok;
}
}
}
return 0;
}
int delete_name(sqlist &l)//删除用户所给的图书信息
{
cout << "请输入删除的书名:" << endl;
string name2;
cin >> name2;
for (int i = 0; i < l.length; i++)//该书后面的书的位置均向前移一位
if (l.elem[i].name == name2)
{
l.elem[i].ID = l.elem[i + 1].ID;
l.elem[i].name = l.elem[i + 1].name;
l.elem[i].price = l.elem[i + 1].price;
}
l.length--;
return ok;
}
int main()
{
sqlist l;
initlist(l);//初始化
int select = 0;
while (ok)
{
menu();
cout << "请输入选择" << endl;
cin >> select;
switch (select)//根据用户选择实现功能
{
case 1:
input(l);
continue;
case 2:
output(l);
continue;
case 3:
sort(l);
continue;
case 4:
query(l);
continue;
case 5:
delete_name(l);
continue;
case 6:
Repetion(l);
continue;
case 7:
{
int location;
cin>>location;
insertNum(l,location);
continue;
}
case 8:
cout<<Length(l);
continue;
case 9:
Adjust(l);
continue;
case 10:
break;
}
system("pause");
return 0;
}
}