图书信息管理系统的设计与实现

图书信息管理系统的设计与实现

(一)实验内容:

设计并实现一个图书信息管理系统。根据实验要求设计该系统的菜单和交互逻辑,并编码实现增删改查的各项功能。 该系统至少包含以下功能:

  1. 根据指定图书个数,逐个输入图书信息;
  2. 逐个显示图书表中所有图书的相关信息;
  3. 能根据指定的待入库的新图书的位置和信息,将新图书插入到图书表中指定的位置;
  4. 根据指定的待出库的旧图书的位置,将该图书从图书表中删除;
  5. 能统计表中图书个数;
  6. 实现图书信息表的图书去重;
  7. 实现最爱书籍查询,根据书名进行折半查找,要求使用非递归算法实现,成功返回此书籍的书号和价格;
  8. 图书信息表按指定条件进行批量修改;
  9. 利用快速排序按照图书价格降序排序;
  10. 实现最贵图书的查找;

(二)实验提示:

图书信息的定义:

typedef struct {

    char no[8];   //8位书号

    char name[20]; //书名

    int price;     //价格

}Book;

顺序表的定义:

typedef  struct {

  Book  *elem;     //指向数据元素的基地址

  int  length;       //线性表的当前长度                                                           

 }SqList;

链表的定义:

typedef struct LNode{

     Book   data;       //数据域

     struct LNode  *next;   //指针域

}LNode,*LinkList;  

  1. 基于顺序存储/链式存储结构的图书信息表的创建和输出

定义一个包含图书信息(书号、书名、价格)的顺序表。读入相应的图书数据来完成图书信息表的创建,然后统计图书表中的图书个数,同时逐行输出每本图书的信息。

输入

输入 n+1 行,其中前 n 行是 n 本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。最后第 n+1 行是输入结束标志:0 0 0(空格分隔的三个 0)。其中书号和书名为字符串类型,价格为浮点数类型。

输出

总计 n+1 行,第 1 行是所创建的图书表中的图书个数,后 n 行是 n 本图书的信息(书号、

书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔。其中价格输出保留两

位小数。

输入样例:

9787302257646 程序设计基础 25.00

9787302164340 程序设计基础(第 2 版) 20.00

9787302219972 单片机技术及应用 32.00

9787302203513 单片机原理与应用技术 26.00

9787810827430 工业计算机控制技术——原理与应用 29.00

9787811234923 汇编语言程序设计教程 32.00

0 0 0

  1. 基于顺序存储/链式存储结构的图书信息表的修改

读入图书信息表,然后计算所有图书的平均价格,将所有低于平均价格的图书价格提高20%,所有高于或等于平均价格的图书价格提高10%,最后逐行输出价格修改后的图书信息。

输入

输入 n+1 行,其中前 n 行是 n 本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。最后第 n+1 行是输入结束标志:0 0 0(空格分隔的三个 0)。其中书号和书名为字符串类型,价格为浮点数类型。

输出

总计 n+1 行,第 1 行是修改前所有图书的平均价格,后 n 行是价格修改后 n 本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔。其中价格输出保留两位小数。

输入样例:

9787302257646 程序设计基础 25.00

9787302164340 程序设计基础(第 2 版) 20.00

9787302219972 数据挖掘与机器学习 32.00

9787302203513 模式识别与智能计算 26.00

9787810827430 工业计算机控制技术——原理与应用 29.00

9787811234923 操作系统教程 32.00

0 0 0

输出样例:

9787302257646 程序设计基础 30.00

9787302164340 程序设计基础(第 2 版) 24.00

9787302219972 数据挖掘与机器学习 35.20

9787302203513 模式识别与智能计算 28.60

9787810827430 工业计算机控制技术——原理与应用 31.90

9787811234923 操作系统教程 35.20

  1. 基于顺序存储/链式存储结构的图书信息表的最贵图书查找

读入相应的图书信息表,然后查找价格最高的图书,输出相应图书的信息。

输出

总计 m+1 行,其中,第 1 行是最贵的图书数目,(价格最高的图书可能有多本),后m行是最贵图书的信息,每本图书信息占一行,书号、书名、价格用空格分隔。其中价格输出保留两位小数。

输出样例:

2

9787302219972 数据挖掘与机器学习 35.20

9787811234923 操作系统教程 35.20

  1. 基于顺序存储/链式存储结构的图书信息表的最爱图书的查找

读入相应的图书信息表,然后根据指定的最爱图书的名字,输出相应图书的信息。

输入

输入1行,为每次待查找的最爱图书名字。

输出

若查找成功,输出k+1行,对于每次查找,第一行是最爱图书数目,同一书名的图书可能有多本,后K行是最爱图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,其中价格输出保留两位小数。若查找失败:只输出以下提示:抱歉,没有你的最爱!

输出样例

2

9787302257646 程序设计基础 30.00

9787302164340 程序设计基础(第 2 版) 24.00

  1. 基于顺序存储/链式存储结构的图书信息表的新书入库

读入指定的待入库的新图书的位置和信息,将新图书插入到图书表中指定的位置上,最后输出新图书入库后所有图书的信息。

输入

总计n+1行,首先输入第1行,内容仅为一个整数,代表待入库的新图书的位置序号,然后输入n行,内容为新图书的信息,书号、书名、价格用空格分隔。

输出

若插入成功,输出新图书入库后所有图书的信息(书号、书名、价格),总计n+1行,每行是一本图书的信息,书号、书名、价格用空格分隔。其中价格输出保留两位小数。

若插入失败,只输出以下提示:抱歉,入库位置非法!

输入样例:

2

9787302265436  计算机导论实验指导 18.00

输出样例:

9787302257646 程序设计基础 30.00

9787302265436 计算机导论实验指导 18.00

9787302164340 程序设计基础(第 2 版) 24.00

9787302219972 数据挖掘与机器学习 35.20

9787302203513 模式识别与智能计算 28.60

9787810827430 工业计算机控制技术——原理与应用 31.90

9787811234923 操作系统教程 35.20

  1. 基于顺序存储/链式存储结构的图书信息表的旧书出库

读入指定的待出库的旧图书的书号,将该图书从图书表中删除,最后输出旧图书出库后所有图书的信息。

输入

输入待出库的旧图书的书号;

输出

若删除成功,输出旧图书出库后所有图书的信息(书号、书名、价格),每行是一本图书的信息,书号、书名、价格用空格分隔。其中价格输出保留两位小数。

若删除失败,只输出以下提示:出库失败,未找到该图书!

  1. 基于顺序存储/链式存储结构的图书信息表的图书去重

出版社出版的任何一本图书的书号(ISBN)都是唯一的,即图书表中不允许包含书号重复的图书。读入相应的图书信息表(事先加入书号重复的记录),然后进行图书的去重,即删除书号重复的图书(只留第一本),最后输出去重后所有图书的信息。

输出

总计输出m+1行(m<=n),其中,第一行是去重后的图书数目,后m行是去重后图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,其中价格输出保留两位小数。

代码

typedef struct {
    string no;   //8位书号
    string name; //书名
    double price;     //价格
}Book;
//顺序表的定义:
typedef struct LNode {
    Book   data;       //数据域
    struct LNode* next;   //指针域
}LNode;
typedef  struct {
    LNode* first;     //指向数据元素的基地址
    int  length;       //线性表的当前长度   
}SqList;
//链表的定义
 

Library() {
        sq.length = 0;LNode* first = new LNode; sq.first = first;
        Book book;  first->next = NULL; LNode* r =first; LNode* ln = new LNode;
        while (1) {
            ln = new LNode;
            cin >> ln->data.no >> ln->data.name >> ln->data.price;
            
            if (ln->data.no == "0" && ln->data.name == "0"&&ln->data.price==0 ) {
                break;
            }
            else {
                r->next = ln; r = ln;
                sq.length++;
            }
        }
        r->next = NULL;
    }
 

实现代码如下

#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;
  }
}

猜你喜欢

转载自blog.csdn.net/weixin_46279994/article/details/118076528