图书管理系统(课设)

本文档描述了一个使用顺序表实现的图书管理系统的详细设计,包括图书信息的定义、顺序表的定义以及一系列操作如插入、删除、查找、排序等的伪代码。此外,还提供了C++实现的代码片段,涵盖了图书信息输入、输出、按价格排序、查重、按书名查询等功能。系统支持图书信息的增删改查,并具备图书去重和价格调整等高级功能。
摘要由CSDN通过智能技术生成

我们利用顺序表的形式实现图书管理系统,根据实验指导书得出大致的系统总框架和部分伪代码。我们需要实现的实验要求如下:

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

系统框架:

伪代码:

图书信息的定义:

typedef struct {

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

    char name[20]; //书名

    int price;     //价格

}Book;

顺序表的定义:

typedef  struct {

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

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

 }SqList;

seqlist::seqlist(seqlist &T){
T.elem=MAXSIZE;
T.length=0;
}
void scanner{
cin>> num,no,name,pricce;
T.no=no;
T.name=name;
T.price=price;
}
void showlist{
cout<<T.elemType;
}
void insert{
if(location>=length)
throw->flase;
else{
T.elem[i]->T.elem[i+1];
length++;
}
void delete{
if(location>=length)
throw->flase;
else{
T.elem[i]<-T.elem[i+1];
length--;
}
int rank{
T.elem[i]->T.elem[j];
T.elem[i]<-T.elem[j];
}
void reception{
if(T.elem[i]==T.elem[j])
deete T.elem[j];
}
void menu{}

       图书管理.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;
  }
}

                                                                                                                             

#include #include #include typedef struct { char number[10];//书号 char name[20];//书名 char author[20];//作者 char publish[50];//出版社 char time[20];//出版时间 float price; }mbook; typedef struct { int count;//书的本数 mbook book[100];//最大可有100本书 }mlibrary; mlibrary library; void save()//保存图书信息。 { FILE *fp; if((fp=fopen("library.doc","w"))==NULL) { printf("\n不能保存图书信息\n"); return; } fwrite(&library.count,sizeof(int),1,fp); fwrite(library.book,sizeof(library.book[0]),library.count,fp); } void putin() /*定义录入函数*/ { int y=1; system("cls"); while(y) { printf("\t请输入您的书籍的书号:"); scanf("%s",library.book[library.count].number); printf("\t请输入书名:"); scanf("%s",library.book[library.count].name); printf("\t请输入作者名:"); scanf("%s",library.book[library.count].author); printf("\t请输入出版社:"); scanf("%s",library.book[library.count].publish); printf("\t请输入出版时间:"); scanf("%s",library.book[library.count].time); printf("\t请输入该书的价格:"); fflush(stdin); scanf("%f",&library.book[library.count].price); library.count++; printf("\n是否继续录入(1.继续;0,退出录入):"); fflush(stdin); scanf("%d",&y); if (y!=1) { y=0; break; } } save(); } void lookup() { system("cls"); printf("图书号\t图书名\t作者名\t出版社\t出版日期\t图书价格\n"); int i ; for ( i=0;i<library.count;i++) { printf("%s\t%s\t%s\t%s\t%s\t%6.2f\n",library.book[i].number,library.book[i].name,library.book[i].author,library.book[i].publish,library.book[i].time,library.book[i].price); } fflush(stdin); getchar(); } void search_by_name() /*定义按书名查询*/ { char s2[20]; int flag=1; printf("\n请输入要查询的书名: "); fflush(stdin); scanf("%s",s2); printf("图书号\t图书名\t作者名\t出版社\t出版日期\t图书价格\n"); int i ; for( i=0;i<library.count;i++ ) if(strcmp(s2,library.book[i].name)==0) { flag=0; printf("%s\t%s\t%s\t%s\t%s\t%6.2f\n",library.book[i].number,library.book[i].name,library.book[i].author,library.book[i].publish,library.book[i].time,library.book[i].price); } if (flag) { printf("cannot found!"); } fflush(stdin); getchar(); } void search_by_author() /*定义按作者名查询*/ { char s3[20]; int flag=1; printf("请输入要查询的书的作者: "); fflush(stdin); scanf("%s",s3); printf("图书号\t图书名\t作者名\t出版社\t出版日期\t图书价格\n"); int i ; for( i=0;i<library.count;i++ ) if(strcmp(s3,library.book[i].author)==0) { flag=0; printf("%s\t%s\t%s\t%s\t%s\t%6.2f\n",library.book[i].number,library.book[i].name,library.book[i].author,library.book[i].publish,library.book[i].time,library.book[i].price); } if (flag) { printf("cannot found!"); } fflush(stdin); getchar(); } void search() /*定义查询函数*/ { int a; system("cls"); /*进行清屏*/ printf("\t\t******************************\n"); printf("开始查询\n"); printf("\t\t\t1---------------search_by_name\n"); printf("\t\t\t2---------------search_by_writer\n"); printf("\t\t\t0---------------exit\n"); printf("\t\t******************************\n") ; printf("\t\t请选择你想要的查询方式:"); fflush(stdin); scanf("%d",&a); switch(a) { case 1: search_by_name(); break; case 2: search_by_author(); break; case 0: return; } } void del() /*定义删除函数*/ { char number[10]; system("cls"); /*清屏*/ printf("\n Please type in the number of the book you want to delete:"); fflush(stdin); scanf("%s",number); int i; for (i=0;i<library.count;i++) { if(strcmp(number,library.book[i].number)==0)break; } if (i!=library.count) { for(;i<library.count-1;i++) { strcpy(library.book[i].name,library.book[i+1].name); strcpy(library.book[i].number,library.book[i+1].number); strcpy(library.book[i].publish,library.book[i+1].publish); strcpy(library.book[i].author,library.book[i+1].author); strcpy(library.book[i].time,library.book[i+1].time); library.book[i].price=library.book[i+1].price; } library.count--; } else printf("\n cannot found!\n"); save(); fflush(stdin); getchar(); } void update()//修改图书信息 { char number[10]; system("cls"); /*清屏*/ printf("\n Please type in the number of the book you want to delete:"); fflush(stdin); scanf("%s",number); int i; for (i=0;i<library.count;i++) { if(strcmp(number,library.book[i].number)==0) { printf("图书号\t图书名\t作者名\t出版社\t出版日期\t图书价格\n"); printf("%s\t%s\t%s\t%s\t%s\t%6.2f\n",library.book[i].number,library.book[i].name,library.book[i].author,library.book[i].publish,library.book[i].time,library.book[i].price); break; } } if (i!=library.count) { mbook book; printf("\n\t\t请输入修改后此图书的信息\n"); printf("\t请输入图书号:"); scanf("%s",book.number); printf("\t请输入图书名:"); scanf("%s",book.name); printf("\t请输入作者名:"); scanf("%s",book.author); printf("\t请输入出版社:"); scanf("%s",book.publish); printf("\t请输入出版时间:"); scanf("%s",book.time); printf("\t请输入该书的价格:"); fflush(stdin); scanf("%f",&book.price); strcpy(library.book[i].name,book.name); strcpy(library.book[i].number,book.number); strcpy(library.book[i].publish,book.publish); strcpy(library.book[i].author,book.author); strcpy(library.book[i].time,book.time); library.book[i].price=book.price; save(); } else printf("\n cannot found!\n"); fflush(stdin); getchar(); } void main() { FILE *fp; if((fp=fopen("library.doc","r"))==NULL) { printf("\n不能打开图书信息库\n"); fp=fopen("library.doc","w+"); printf("\n初始化图书信息库,初始化之后要重启程序\n"); library.count=0; fwrite(&library.count,sizeof(int),1,fp); fclose(fp); return; } fread(&library.count,sizeof(int),1,fp); fread(library.book,sizeof(library.book[0]),library.count,fp); fclose(fp); int a; do { system("cls"); printf("\n\n\n\n\n\t\t\t\t图书信息管理系统\t\t\t\t\n"); printf("\t\t*********************************************\n"); printf("\t\t\t1 ------------------图书信息录入\n"); printf("\t\t\t2 ------------------图书信息浏览\n"); printf("\t\t\t3 ------------------图书信息查询\n"); printf("\t\t\t4 ------------------图书信息删除\n"); printf("\t\t\t5 ------------------图书信息修改\n"); printf("\t\t\t0 -----------------退出图书信息系统\n"); printf("\t\t*********************************************\n"); printf("\t\tPlease Enter Choose: "); fflush(stdin); scanf("%d",&a); switch(a) { case 1: putin(); break; case 2: lookup(); break; case 3: search(); break; case 4: del(); break; case 5: update(); break; case 0: printf("\n\n退出\n\n"); break; default: printf("\n序号不对\n"); } }while(a!=0); save(); }
目 录 1 需求分析 2 2 数据库的概念设计 2 3 数据库的逻辑设计 3 4 数据库的物理设计 4 5 应用程序设计 6 6 编程实现 10 总结与体会 13 致 谢 14 参考文献 15 数据库原理及应用课程设计报告 1 需求分析 1.1 任务和要求 用户有以下需求:建立读者档案;建立图书档案,建立书目索引;完成日常图书检索、借、还工作,对读者档案、图书档案、借、还系统的访问,必需进行身份验证。 1.2系统总体功能设计 图书馆管理系统主要提供的功能包括图书入库、借出、归还以及对读者的信息管理 。 (1) 图书借阅: 借阅图书时应按图书馆的规则进行借阅,例如不超过5本,如果已有超时借阅的图书,则在归还前不允许再借阅等等。 (2) 图书归还: 对于图书遗失或超期归还的情况应根据图书馆的规则进行处罚。 (3) 新图书信息入库: 建立图书信息库,以便读者进行查询和借阅。 (4) 图书信息管理: 图书因使用过久或信息过时需做下架处理,或者在读者借阅书籍时发生遗失的情况下需做遗失处理,这些都需要修改数据库关于书籍的信息。 (5) 读者信息管理: 对读者应该提供能办证、修改、注销;访问时要进行身份验证,办证、修改、注销应记录操作员编号、操作日期、理由、审批记录等功能 (6) 图书信息查询: 一般读者在借阅书籍前都需查询图书馆关于所借书籍的大概信息:该图书是否在馆—是否已借出—在馆中的书架号;除查询书籍外读者还可查询关于自身的信息:是否有超期未还的图书,还可借阅书籍数目等。 1.3软硬件运行环境及开发工具 Visual Basic 6.0 SQL Server 2000 2 数据库的概念设计 E-R模型图:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值