c语言图书管理系统

Python029

c语言图书管理系统,第1张

#include <iostream>

#include <iomanip>

#include <string>

#include <fstream>//输入/输出文件流类

using namespace std

const int Maxr=100//最多的读者

const int Maxb=100//最多的图书

const int Maxbor=5//每位读者最多借五本书

//读者类,实现对读者的信息的描述

class Reader

{

private:

int tag//删除标记 1:已删 0:未删

int no//读者编号

char name[10]//读者姓名

int borbook[Maxbor]//所借图书

public:

Reader() {}

char *getname() {return name} //获取姓名

int gettag() {return tag} //获取删除标记

int getno() {return no} //获取读者编号

void setname(char na[]) //设置姓名

{

strcpy(name,na)

}

void delbook(){ tag=1}//设置删除标记 1:已删 0:未删

void addreader(int n,char *na)//增加读者

{

tag=0

no=n

strcpy(name,na)

for(int i=0i<Maxbori++)

borbook[i]=0

}

void borrowbook(int bookid)//借书操作

{

for(int i=0i<Maxbori++)

{

if (borbook[i]==0)

{

borbook[i]=bookid

return

}

}

}

int retbook(int bookid)//还书操作

{

for(int i=0i<Maxbori++)

{

if(borbook[i]==bookid)

{

borbook[i]=0

return 1

}

}

return 0

}

void disp()//读出读者信息

{

cout <<setw(5) <<no <<setw(10) <<name<<"借书编号:["

for(int i=0i<Maxbori++)

if(borbook[i]!=0)

cout <<borbook[i] <<"|"

cout <<"]"<<endl

}

}

//读者类库,实现建立读者的个人资料

class RDatabase

{

private:

int top//读者记录指针

Reader read[Maxr]//读者记录

public:

RDatabase() //构造函数,将reader.txt读到read[]中

{

Reader s

top=-1

fstream file("reader.txt",ios::in)//打开一个输入文件

while (1)

{

file.read((char *)&s,sizeof(s))

if (!file)break

top++

read[top]=s

}

file.close()//关闭 reader.txt

}

void clear()//删除所有读者信息

{

top=-1

}

int addreader(int n,char *na)//添加读者时先查找是否存在

{

Reader *p=query(n)

if (p==NULL)

{

top++

read[top].addreader(n,na)

return 1

}

return 0

}

Reader *query(int readerid)//按编号查找

{

for (int i=0i<=topi++)

if (read[i].getno()==readerid &&

read[i].gettag()==0)

{

return &read[i]

}

return NULL

}

void disp() //输出所有读者信息

{

for (int i=0i<=topi++)

read[i].disp()

}

void readerdata()//读者库维护

~RDatabase() //析构函数,将read[]写到reader.txt文件中

{

fstream file("reader.txt",ios::out)

for (int i=0i<=topi++)

if (read[i].gettag()==0)

file.write((char *)&read[i],sizeof(read[i]))

file.close()

}

}

void RDatabase::readerdata()

{

char choice

char rname[20]

int readerid

Reader *r

while (choice!='0')

{

cout <<"\n\n\t\t\t读 者 维 护\n\n\n\t\t 1 新 增\n\n\t\t 2 更 改\n\n\t\t 3 删 除\n\n\t\t 4 查 找\n\n\t\t 5 显 示\n\n\t\t 6 全 删\n\n\t\t 0 退 出"<<endl

cin >>choice

switch (choice)

{

case '1':

cout <<"输入读者编号:"

cin >>readerid

cout <<"输入读者姓名:"

cin >>rname

addreader (readerid,rname)

break

case '2':

cout <<"输入读者编号:"

cin >>readerid

r=query(readerid)

if (r==NULL)

{

cout <<" 该读者不存在 "<<endl

break

}

cout <<"输入新的姓名:"

cin >>rname

r->setname(rname)

break

case '3':

cout <<" 输入读者编号:"

cin >>readerid

r=query(readerid)

if (r==NULL)

{

cout <<" 该读者不存在" <<endl

break

}

r->delbook()

break

case '4':

cout <<"读入读者编号:"

cin >>readerid

r=query(readerid)

if (r==NULL)

{

cout <<"该读者不存在"<<endl

break

}

r->disp()

break

case '5':

disp()

break

case '6':

clear()

break

default:cout<<"输入错误,请从新输入:"break

}

}

}

//图书类,实现对图书的描述,图书的编号,书名,借出,还入等

class Book

{

private:

int tag//删除标记 1:已删 0:未删

int no//图书编号

char name[20]//书名

int onshelf//是否再架 1:再架 2:已借

public:

Book(){}

char *getname() { return name}//获取姓名

int getno(){ return no}//获取图书编号

int gettag(){ return tag}//获取删除标记

void setname(char na[])//设置书名

{

strcpy(name,na)

}

void delbook(){ tag=1}//删除图书

void addbook(int n,char *na)//增加图书

{

tag=0

no=n

strcpy(name,na)

onshelf=1

}

int borrowbook()//借书操作

{

if (onshelf==1)

{

onshelf=0

return 1

}

return 0

}

void retbook()//还书操作

{

onshelf=1

}

void disp()//输出图书

{

cout <<setw(6) <<no <<setw(18) <<name <<setw(10)

<<(onshelf==1? "在架":"已借") <<endl

}

}

//图书库类,实现对图书的维护,查找,删除等

class BDatabase

{

private:

int top//图书记录指针

Book book[Maxb]//图书记录

public:

BDatabase()//构造函数,将book.txt读到book[]中

{

Book b

top=-1

fstream file("book.txt",ios::in)

while (1)

{

file.read((char *)&b,sizeof(b))

if (!file) break

top++

book[top]=b

}

file.close()

}

void clear()//全删

{

top=-1

}

int addbook(int n,char *na)//增加图书

{

Book *p=query(n)

if (NULL==p)

{

top++

book[top].addbook(n,na)

return 1

}

return 0

}

Book *query(int bookid)//查找图书

{

for (int i=0i<=topi++)

if (book[i].getno()==bookid &&book[i].gettag()==0)

{

return &book[i]

}

return NULL

}

void bookdata()//图书库维护

void disp()

{

for (int i=0i<=topi++)

if (book[i].gettag()==0)

book[i].disp()

}

~BDatabase()//析构函数,将book[]写到book.txt文件中

{

fstream file("book.txt",ios::out)

for (int i=0i<=topi++)

if (book[i].gettag()==0)

file.write((char *)&book[i],sizeof(book[i]))

file.close()

}

}

void BDatabase::bookdata()

{

char choice

char bname[40]

int bookid

Book *b

while (choice!='0')

{

cout <<"\n\n\n\t\t\t图 书 维 护 "<<endl<<endl

cout<<"\t\t1 新 增\n \t\t2 更 改\n\t\t3 删 除\n\t\t4 查 找\n\t\t5 显 示\n\t\t6 全 删\n\t\t0 退 出"<<endl

cin >>choice

switch (choice)

{

case '1':

cout <<"输入图书编号:"<<endl

cin >>bookid

cout <<"输入图书书名:"<<endl

cin >>bname

addbook(bookid,bname)

break

case '2':

cout <<"输入图书编号:"<<endl

cin >>bookid

b=query(bookid)

if (b==NULL)

{

cout <<" 该图书不存在 "<<endl

break

}

cout <<"输入新的书名:"<<endl

cin >>bname

b->setname(bname)

break

case '3':

cout <<" 读入图书编号:"<<endl

cin >>bookid

b=query(bookid)

if (b==NULL)

{

cout <<" 该图书不存在" <<endl

break

}

b->delbook()

break

case '4':

cout <<" 读入图书编号:"<<endl

cin >>bookid

b=query(bookid)

if (b==NULL)

{

cout <<" 该图书不存在"<<endl

break

}

b->disp()

break

case '5':

disp()

break

case '6':

clear()

break

default:cout<<"输入错误,请从新输入:"

}

}

}

//main() 函数的实现,程序的主界面的引导

void main()

{

char choice

int bookid,readerid

RDatabase ReaderDB

Reader *r

BDatabase BookDB

Book *b

while(choice!='0')

{

cout <<endl<<endl<<"\t\t\t 图 书 管 理 系 统\n\n\n"

cout <<"\t\t\t1 借 书\n\n\t\t\t2 还 书 \n\n\t\t\t3 图 书 维 护\n\n\t\t\t4 读 者 维 护\n\n\t\t\t0 离 开"<<endl

cin >>choice

switch (choice)

{

case '1':

cout <<" 借书 读者编号:"

cin >>readerid

cout <<" 图书编号: "

cin >>bookid

r=ReaderDB.query(readerid)//按编号查找

if (NULL==r)

{

cout <<" 不存在该读者,不能借书"<<endl

break

}

b=BookDB.query(bookid)

if (b==NULL)

{

cout <<" 不存在该图书,不能借书"<<endl

break

}

if (b->borrowbook()==0)

{

cout <<" 该图书已借出,不能借书"<<endl

break

}

r->borrowbook(b->getno())

break

case '2':

cout<<"还书\n 读者编号:"

cin >>readerid

cout <<" 图书编号:"

cin >>bookid

r=ReaderDB.query(readerid)

if (r==NULL)

{

cout <<" 不存在该读者,不能还书" <<endl

break

}

b=BookDB.query(bookid)

if (b==NULL)

{

cout <<" 不存在该图书,不能还书" <<endl

break

}

b->retbook()

r->retbook(b->getno())

break

case '3':

BookDB.bookdata()

break

case '4':

ReaderDB.readerdata()

break

default:cout<<"输入错误,请从新输入:"

}

}

}

以上回答你满意么?

#include<windows.h>

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#include<conio.h>

struct book{

char number[100]

char tittle[100]

char writer[100]

char publisher[100]

char date[100]

char price[100]

char status[100]

char reader[100]

}

void search_book()

void borrow_book()

void return_book()

void add_book()

void delete_book()

void modify_book()

void scan_book()

int main()

{

int c1=0,c2,c3

int l,x,z

while(1)

{

system("color 2C")

printf("\t\t\t ^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^ \n")

printf("\t\t\t| * - * - * -图书管理系统 * - * - * |\n")

printf("\t\t\t* [1] 用户登录 *\n")

printf("\t\t\t* [2] 管理员登录 *\n")

printf("\t\t\t^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^ \n")

printf("\n")

printf("请选择你的操作 :")

scanf("%d",&c1)

system("cls")

break

}

if(c1==1)

{

while(1){

system("color 2C")

printf("\t\t\t ^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^ \n")

printf("\t\t\t| * - * - * -图书管理系统 * - * - * |\n")

printf("\t\t\t* [1] 查询图书 *\n")

printf("\t\t\t| [2] 借阅图书 |\n")

printf("\t\t\t* [3] 借还图书 *\n")

printf("\t\t\t* [4] 浏览图书信息 *\n")

printf("\t\t\t| [5] 退出图书管理系统 |\n")

printf("\t\t\t^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^ \n")

printf("\n")

printf("请选择你的操作 :")

scanf("%d",&c2)

getchar()

switch(c2)

{

case 1:search_book()break

case 2:borrow_book()break

case 3:return_book()break

case 4:scan_book()break

case 5:system("cls")return 0

}

}

}

if(c1==2)

{

while(1){

system("color 2C")

printf("\t\t\t ^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^ \n")

printf("\t\t\t| * - * - * -图书管理系统 * - * - * |\n")

printf("\t\t\t| [1] 添加图书 |\n")

printf("\t\t\t* [2] 删减图书 *\n")

printf("\t\t\t| [3] 修改图书信息 |\n")

printf("\t\t\t* [4] 浏览图书信息 *\n")

printf("\t\t\t| [5] 退出图书管理系统 |\n")

printf("\t\t\t^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^ \n")

printf("\n")

printf("请选择你的操作 :")

scanf("%d",&c3)

getchar()

switch(c3)

{

case 1:add_book()break

case 2:delete_book()break

case 3:modify_book()break

case 4:scan_book()break

case 5:system("cls")return 0

}

}

}

}

/*查询图书*/

void search_book()

{

FILE*fp

struct book n

struct book nn

int l,r

char x,z

fp=fopen("F:\\课程设计\\图书管理系统.txt","rb")

while(1)

{

l=0

system("cls")

printf("请输入图书名称:")

scanf("%s",n.tittle)

fflush(stdin)

rewind(fp)

while(1)

{

fread(&nn,sizeof(nn),1,fp)

if(feof(fp))

break

r=strcmp(n.tittle,nn.tittle )

if(r==0)

{

l=1

break

}

}

if(l==0)

{

printf("没有要查询的图书!!!\n\n ")

}

else

{

printf("查询的图书为:")

printf("\n")

printf("****************************************\n")

printf("编号 书名 作者 出版社 出版时间 价格 状态 借阅者\n")

printf("\n")

printf("%s %s %s %s %s %s %s",nn.number,nn.tittle,nn.writer,nn.publisher,nn.date,nn.price,nn.status,nn.reader)

printf("\n\n\n")

}

printf("是否继续查询图书 ? [是(y)/否(n)] ? \n\n")

do

{

x=getche()

}while(x!='n'&&x!='y')

if(x=='n')

break

}

fclose(fp)

system("cls")

}

//添加

void add_book()

{

FILE *fp

struct book n

struct book nn

char x,z

int l,r

fp=fopen("F:\\课程设计\\图书管理系统.txt","ab+")

do

{

system("cls")

do

{

l=0

printf("\n")

printf("编号 书名 作者 出版社 出版时间 价格 状态 借阅者\n")

fflush(stdin)

scanf("%s %s %s %s %s %s %s %s",n.number,n.tittle,n.writer,n.publisher,n.date,n.price,n.status,n.reader)

system("cls")

rewind(fp)

while(!feof(fp))

{

fread(&nn,sizeof(nn),1,fp)

r=strcmp(n.tittle,nn.tittle)

if(r==0)

{

l=1

printf(" 该图书已存在,请输入新的图书信息: \n\n")

break

}

}

}while(l)

fwrite(&n,sizeof(n),1,fp)

printf("\n")

printf("是否继续输入新的图书信息[y/n] \n\n")

do

{

x=getche()

}while(x!='n'&&x!='y')

}while(x=='y')

fclose(fp)

system("cls")

}

//删除图书

void delete_book()

{

FILE *fp,*fp1

char x,z

struct book n

struct book nn

int l,r

fp=fopen("F:\\课程设计\\图书管理系统.txt","ab+")

while(1)

{

l=0

system("cls")

printf("\n")

printf("请输入需要删除的图书名: \n\n")

fflush(stdin)

scanf("%s",&n.tittle)

rewind(fp)

while(1)

{

fread(&nn,sizeof(nn),1,fp)

if(feof(fp))

break

r=strcmp(n.tittle,nn.tittle)

if(r==0)

{

l=1

break

}

}

if(l==0)

{

printf("\n")

printf("对不起,未找到该图书 \n")

}

else

{

printf("\n")

printf("****************************************\n")

printf("编号 书名 作者 出版社 出版时间 价格 状态 借阅者\n")

printf("\n")

printf("%s %s %s %s %s %s %s %s",nn.number,nn.tittle,nn.writer,nn.publisher,nn.date,nn.price,nn.status,nn.reader)

printf("\n")

printf("确认删除图书信息? [是(y)/否(n)]\n\n")

do

{

z=getche()

}while(z!='n'&&z!='y')

if(z=='n')

break

else

{

fp1=fopen("F:\\课程设计\\图书管理系统new.txt","wb")

rewind(fp)

while(1)

{

fread(&nn,sizeof(nn),1,fp)

if(feof(fp))

break

r=strcmp(n.tittle,nn.tittle)

if(r!=0)

fwrite(&nn,sizeof(nn),1,fp1)

}

fclose(fp)

fclose(fp1)

fp=fopen("F:\\课程设计\\图书管理系统.txt","wb")

fp1=fopen("F:\\课程设计\\图书管理系统new.txt","rb")

while(1)

{

fread(&nn,sizeof(nn),1,fp1)

if(feof(fp1))

break

fwrite(&nn,sizeof(nn),1,fp)

}

fclose(fp)

fclose(fp1)

}

}

printf("\n")

printf("是否继续删除图书信息? [是(y)/否(n)] \n")

do

{

x=getche()

}while(x!='n'&&x!='y')

if(x=='n')

break

}

fclose(fp)

system("cls")

}

//修改图书信息

void modify_book()

{

FILE *fp

struct book n

struct book nn

int l,r

char x,z

fp=fopen("F:\\课程设计\\图书管理系统.txt","rb+")

while(1)

{

l=0

printf("\n")

system("cls")

printf("请输入需要修改的图书名: \n\n")

fflush(stdin)

scanf("%s",&n.tittle)

system("cls")

rewind(fp)

while(1)

{

fread(&nn,sizeof(nn),1,fp)

if(feof(fp))

break

r=strcmp(n.tittle,nn.tittle)

if(r==0)

{

l=1

break

}

}

if(l==0)

{

printf("\n")

printf("对不起,未找到该图书信息 \n\n")

}

else

{

printf("\n")

printf("****************************************\n")

printf("编号 书名 作者 出版社 出版时间 价格 状态 借阅者\n")

printf("\n")

printf("%s %s %s %s %s %s %s %s",nn.number,nn.tittle,nn.writer,nn.publisher,nn.date,nn.price,nn.status,nn.reader)

printf("请依次修改图书信息\n\n\n")

fflush(stdin)

scanf("%s %s %s %s %s %s %s %s",n.number,n.tittle,n.writer,n.publisher,n.date,n.price,n.status,n.reader)

fseek(fp,sizeof(nn),1)

fwrite(&n,sizeof(nn),1,fp)

}

printf("\n")

printf(" 是否继续修改用户信息[y/n]? \n\n")

do

{

x=getch()

}while(x!='n'&&x!='y')

if(x=='n')

break

}

fclose(fp)

system("cls")

}

//借书

void borrow_book()

{

FILE*fp

struct book n

struct book nn

char x,z

int l,r

fp=fopen("F:\\课程设计\\图书管理系统.txt","rb+")

while(1)

{

l=0

system("cls")

printf("\n")

printf("请输入需要借阅的图书名: \n")

fflush(stdin)

scanf("%s",&n.tittle)

rewind(fp)

while(1)

{

fread(&nn,sizeof(nn),1,fp)

if(feof(fp))

break

r=strcmp(n.tittle,nn.tittle)

if(r==0)

{

l=1

break

}

}

if(l==0)

{

printf("\n")

printf("对不起,未找到该图书。 \n")

}

else

{ printf("\n")

printf("****************************************\n")

printf("编号 书名 作者 出版社 出版时间 价格 状态 借阅者\n")

printf("\n")

printf("%s %s %s %s %s %s %s %s",nn.number,nn.tittle,nn.writer,nn.publisher,nn.date,nn.price,nn.status,nn.reader)

printf("\n")

fflush(stdin)

printf("请输入图书信息并修改在库状态及借阅者信息")

printf("****************************************\n")

printf("编号 书名 作者 出版社 出版时间 价格 状态 借阅者\n")

printf("\n")

scanf("%s %s %s %s %s %s %s %s",n.number,n.tittle,n.writer,n.publisher,n.date,n.price,n.status,n.reader)

fseek(fp,sizeof(nn),1)

fwrite(&n,sizeof(nn),1,fp)

}

printf("\n")

printf(" 是否继续借书? [是(y)/否(n)] \n\n")

do

{

x=getch()

}while(x!='n'&&x!='y')

if(x=='n')

break

}

fclose(fp)

system("cls")

}

//还书

void return_book()

{

FILE*fp

struct book n

struct book nn

char x,z

int l,r

fp=fopen("F:\\课程设计\\图书管理系统.txt","rb+")

while(1)

{

l=0

system("cls")

printf("\n")

printf("请输入需要借还的图书名: \n")

fflush(stdin)

scanf("%s",&n.tittle)

rewind(fp)

while(1)

{

fread(&nn,sizeof(nn),1,fp)

if(feof(fp))

break

r=strcmp(n.tittle,nn.tittle)

if(r==0)

{

l=1

break

}

}

if(l==0)

{

printf("\n")

printf("对不起,未找到该图书。 \n")

}

else

{

printf("\n")

printf("****************************************\n")

printf("编号 书名 作者 出版社 出版时间 价格 状态 借阅者\n")

printf("\n")

printf("%s %s %s %s %s %s %s %s",nn.number,nn.tittle,nn.writer,nn.publisher,nn.date,nn.price,nn.status,nn.reader)

printf("\n")

fflush(stdin)

printf("请输入图书信息并修改在库状态 \n\n")

printf("****************************************\n")

printf("编号 书名 作者 出版社 出版时间 价格 状态 借阅者\n")

printf("\n")

scanf("%s %s %s %s %s %s %s %s",n.number,n.tittle,n.writer,n.publisher,n.date,n.price,n.status,n.reader)

fseek(fp,-(int)sizeof(nn),1)

fwrite(&n,sizeof(nn),1,fp)

}

printf("\n")

printf("是否继续还书? [是(y)/否(n)] \n")

do

{

x=getche()

}while(x!='n'&&x!='y')

if(x=='n')

break

}

fclose(fp)

system("cls")

}

//浏览

void scan_book()

{

FILE*fp

char x,z

struct book n

fp=fopen("F:\\课程设计\\图书管理系统.txt","rb")

rewind(fp)

system("cls")

while(1)

{

fread(&n,sizeof(n),1,fp)

if(feof(fp))

break

else

{

printf("********************************************\n")

printf("编号 书名 作者 出版社 出版时间 价格 状态 借阅者\n")

printf("\n")

printf("%s %s %s %s %s %s %s %s",n.number,n.tittle,n.writer,n.publisher,n.date,n.price,n.status,n.reader)

printf("\n")

}

}

printf("\n")

printf("回到主菜单请按回车")

do

{

x=getche()

}while(x!='\r')

if(x=='\r')

{

fclose(fp)

system("cls")

}

}

虽然没有时间给你编写具体程序,但是我可以告诉你算法和数据结构:

定义一个如下的结构体:

struct book_manager

{

char num[30], bookname[100], author[30], classnum[40]

......

}

算法:链表的查找、删除、排序。

算法必须采用动态的才行,因为你的图书数目不是固定的,可能随时需要删除、还有增加、排序。

现在不是补分的问题,而是实际上从编写到调试通过一个程序是需要花费非常多的时间的,调试程序比编写程序更为复杂。