一、这是一个简单图书管理系统,分为管理员和用户两个功能块,进入不同的模块就有不同的功能实现。
二、流程图
三、附上代码
#include#include #include struct book1 { char isbn[20];//书号 char name[20];//书名 char author[20];//作者 char print[20];//出版社 char zone[15];//编号 int amount;//库存量 float price;//价格 }; struct book { struct book1 book1;//图书信息结构体 struct book *next; }; void menu();//主菜单 void menu1();//管理者菜单 void menu2();//用户菜单 void backmenu1();//实现返回管理者功能菜单函数 void backmenu2();//用户功能菜单函数 void add(); //增加 void display();//显示 void display1(); void change();//修改 void enter();//数据录入 void find();//查找 void delete();//删除 void browser();//浏览 void insert();//插入 void sort();//排序 void lendbook();//借阅 void returnbook();//还书 struct book *read();//文件数据传入链表 void write(struct book *head);//链表数据写入文件 int main() { char c; menu(); printf("管理员请输入m,用户请输入n,退出请按0n"); scanf("%c",&c); while(c!='0')//当输出不是退出键时 { if(c=='m') { backmenu1();//进入管理者功能 break; } else if(c=='n') { backmenu2();//进入用户功能 break; } else { printf("输入错误请重新输入!n"); scanf("%c",&c); } scanf("%c",&c); } if(c=='0') printf("您已成功退出图书管理系统!n"); return 0; } //登录界面 void menu() { system("cls"); printf("*-----------------------------------图书管理系统------------------------------------*n"); printf("*-----------------------------------------------------------------------------------*n"); printf("* 登录选项 *n"); printf("* 1.管理员 2.用户 *n"); printf("*-----------------------------------------------------------------------------------*n"); printf("n"); } // 管理员界面 void menu1() { system("cls"); printf("*---------------------------------图书管理系统-------------------------------------*n"); printf("* *n"); printf("*---------------------------------管理员功能列表-----------------------------------*n"); printf("* *n"); printf("*1.录入图书 2.增加图书 3.显示图书 *n"); printf("*4.修改图书信息 5.查找图书 6.删除图书 *n"); printf("*7.浏览图书 8.图书排序 9.插入图书 *n"); printf("*----------------------------------------------------------------------------------*n"); printf("n"); } //用户界面 void menu2() { system("cls"); printf("***********************************图书管理系统*************************************n"); printf("* *n"); printf("*----------------------------------用户功能列表------------------------------------*n"); printf("* *n"); printf("*1.借阅书籍 2.查询书籍 3.归还书籍 *n"); printf("*4.浏览书籍 *n"); printf("*----------------------------------------------------------------------------------*n"); printf("n"); } //实现返回管理者功能菜单函数 void backmenu1() { FILE *fp; int n=1; while(n!=0) { system("cls"); menu1();//在这个循环中,每执行一次功能后会继续显示菜单 printf("请选择以上功能,退出系统请按0n"); printf("n"); scanf("%d",&n); fp=fopen("libraries.txt","r"); if((n>=3&&n<=9)&&(fp==NULL||fgetc(fp)==EOF))//当无文件或者文件内容空白时且选择非(录入添加显示)功能 { printf("没有书籍,建议管理员先录入书籍信息n"); system("pause"); } else { switch(n) { case 1:enter();break; case 2:add();break; case 3:display1();break; case 4:change();break; case 5:find();break; case 6:delete();break; case 7:browser();break; case 8:sort();break; case 9:insert();break; } } fclose(fp); } printf("n"); if(n==0) printf("您已成功退出图书管理系统!n"); } //用户功能菜单函数 void backmenu2() { FILE *fp; int n=1; while(n!=0) { system("cls"); menu2(); printf("选择功能,退出请按0n"); scanf("%d",&n); fp=fopen("libraries.txt","r"); if((fp==NULL||fgetc(fp)==EOF))//当无文件或者文件内容空白时 { printf("图书馆内暂无藏书,请耐心等待n"); system("pause"); } else { switch(n) { case 1:lendbook();break; case 2:find();break; case 3:returnbook();break; case 4:browser();break; } } fclose(fp); } if(n==0) { printf("您已成功退出图书管理系统n"); system("pause"); } } //文件数据传入链表 struct book* read() { FILE *fp; struct book1 book1; struct book *p,*tail=NULL,*head=NULL; fp=fopen("libraries.txt","r"); if(!fp) { printf("cannot open filen"); exit(0); } while(fscanf(fp,"%s%s%s%s%s%d%f",book1.isbn,book1.zone,book1.name,book1.author,book1.print,&book1.amount,&book1.price)!=EOF)//在文件未遇到结束标志时读取数据 { p=(struct book*)malloc(sizeof(struct book)); p->book1=book1; if(head==NULL) head=p; if(tail!=NULL) tail->next=p; tail=p; tail->next=NULL; } fclose(fp); return head; } //链表写入文件 void write(struct book *head) { FILE *fp; struct book *p=NULL; fp=fopen("libraries.txt","w"); if(!fp) { printf("cannot open filen"); exit(0); } p=head; while(p) { //将数据写入文件 fprintf(fp,"%-20s%-15s%-15s%-15s%-19s%-14d%-12.2f ",p->book1.isbn,p->book1.zone,p->book1.name,p->book1.author,p->book1.print,p->book1.amount,p->book1.price); p=p->next; } fclose(fp); } //数据录入 void enter() { FILE *fp; int i,n; struct book1 book1; system("cls"); printf("输入录入的书籍数量n"); scanf("%d",&n); printf("按以下格式输入n"); printf("ISBN 分区 书名 作者 出版社 数量 单价n"); fp=fopen("libraries.txt","w"); if(!fp) { printf("cannot open filen"); exit(0); } for(i=0;i book1.isbn,p2->book1.zone,p2->book1.name,p2->book1.author,p2->book1.print,&p2->book1.amount,&p2->book1.price); while(p) { if(strcmp(p->book1.name,p2->book1.name)==0)//与已有书籍重名 { p->book1.amount++; printf("添加成功n"); printf("原书籍数量增加n"); break; } else p=p->next; } if(head==NULL) head=p2; else { p1=head; while(p1->next!=NULL) p1=p1->next; p1->next=p2; p2->next=NULL; } write(head); //将数据写入文件 n=getchar(); printf("书籍添加成功n"); display(); system("pause"); } //显示所有图书 void display() { struct book1 book1; FILE *fp; printf("图书馆库存n"); printf("n"); fp=fopen("libraries.txt","r"); if(!fp) { printf("cannot open filen"); exit(0); } else { printf("ISBN 分区 书名 作者 出版社 数量 单价n"); while(fscanf(fp,"%s%s%s%s%s%d%f",book1.isbn,book1.zone,book1.name,book1.author,book1.print,&book1.amount,&book1.price)!=EOF) { printf("%-20s%-15s%-15s%-15s%-19s%-14d%-12.2fn",book1.isbn,book1.zone,book1.name,book1.author,book1.print,book1.amount,book1.price); } } fclose(fp); printf("n"); } void display1(){ system("cls"); display(); system("pause"); } //修改图书信息 void change() { struct book *p,*head,*q=NULL; system("cls"); int n=1,amount; char isbn[20]={' '},name[20]={' '},author[20]={' '},print[20]={' '},name1[20]={' '},zone[15]={' '}; float price; p=head=read(); display(); printf("输入要修改的图书书名n"); scanf("%s",name); while(p) { if(strcmp(p->book1.name,name)==0)//查找要修改的书籍,找到后跳出循环 { q=p; break; } else p=p->next; } while(n!=0) { printf("请选择您要修改的信息,退出修改请按0n"); printf("*------------------------------------------------------*n"); printf("*1.修改ISBN序号 2.修改作者信息 3.修改出版社信息 *n"); printf("*4.修改数量 5.修改单价 6.修改书名 *n"); printf("*7.修改编号 *n"); printf("*------------------------------------------------------*n"); scanf("%d",&n); switch(n) { case 1: printf("输入新ISBN序号:"); scanf("%s",isbn); strcpy(q->book1.isbn,isbn);break; case 2: printf("输入新作者信息:"); scanf("%s",author); strcpy(q->book1.author,author);break; case 3: printf("输入新出版社信息;");scanf("%s",print); strcpy(q->book1.print,print);break; case 4: printf("输入新数量;"); scanf("%d",&amount); q->book1.amount=amount;break; case 5: printf("输入新单价;"); scanf("%f",&price); q->book1.price=price;break; case 6: printf("输入新书名:"); scanf("%s",name1); strcpy(q->book1.name,name1);break; case 7: printf("输入新编号:"); scanf("%s",zone); strcpy(q->book1.zone,zone);break; } } write(head); //将修改后的信息存入文件 printf("修改成功!n"); display(); system("pause"); } //查找书籍 void find() { struct book *head=NULL,*p; char name[20]={' '}; int flag=0; char n=1; system("cls"); head=read();//让head指向传入文件数据的链表 p=head; printf("输入查找书籍相关信息(ISBN/书名/作者)(注意不得超过20个字):n"); scanf("%s",name); while(p) { if(strcmp(p->book1.name,name)==0||strcmp(p->book1.author,name)==0||strcmp(p->book1.isbn,name)==0) { printf("ISBN 分区 书名 作者 出版社 数量 单价n"); printf("%-20s%-15s%-15s%-15s%-19s%-14d%-12.2fn",p->book1.isbn,p->book1.zone,p->book1.name,p->book1.author,p->book1.print,p->book1.amount,p->book1.price); printf("n"); flag=1; break; } else p=p->next; } if(flag==0) printf("没有此书籍,请确认书名是否正确!nn"); system("pause"); } //浏览书籍的数量 void browser() { struct book *p=NULL,*head; system("cls"); head=read(); p=head; if(p==NULL) printf("没有书籍n"); else { printf("已有书籍如下n"); printf("书名 数量n"); while(p) { printf("%-15s%14dn",p->book1.name,p->book1.amount); p=p->next; } } system("pause"); } //删除书籍 void delete() { struct book *p1=NULL,*p2=NULL,*head=NULL; char name[20]={' '}; char ch; p1=p2=head=read(); system("cls"); display(); printf("n"); printf("输入要删除的书籍名称:n"); scanf("%s",name); while(strcmp(p1->book1.name,name)!=0&&p1!=NULL)//第一本书和要删除的书名不同则一直寻找 p1=p1->next; if(head==p1)//如果第一本书名和要删书名相同则换头结点 head=head->next; else { while(p2) { if(p2->next==p1)//p2指向p1的所指向结点的前一个 { p2->next=p1->next; free(p1); break; } p2=p2->next; } } printf("删除成功!n"); write(head); display(); printf("n"); system("pause"); } //插入书籍 void insert() { struct book *p1,*head,*p2,*p; system("cls"); head=read(); p1=head; p2=head->next; printf("请按以下格式输入要插入的书籍信息n"); printf("ISBN 分区 书名 作者 出版社 数量 单价n"); p=(struct book *)malloc(sizeof(struct book)); scanf("%s%s%s%s%s%d%f",p->book1.isbn,p->book1.zone,p->book1.name,p->book1.author,p->book1.print,&p->book1.amount,&p->book1.price); p->next=NULL; if(strcmp(head->book1.isbn,p->book1.isbn)>0) { head=p; p->next=p1; } else { while(p2&&strcmp(p2->book1.isbn,p->book1.isbn)<=0)//p2为空退出循环则插入在尾部 { p1=p2; p2=p2->next; } p->next=p2; p1->next=p; } printf("成功插入书籍!n"); write(head); display(); system("pause"); } int count()//统计图书文本个数 { FILE *fp; int n=0; struct book1 book1; fp=fopen("libraries.txt","r"); if(!fp) { printf("cannot open filen"); exit(0); } while(fscanf(fp,"%s%s%s%s%s%d%f",book1.isbn,book1.zone,book1.name,book1.author,book1.print,&book1.amount,&book1.price)!=EOF) n++; fclose (fp);//关闭文件 return n; //返回个数 } //书籍排序功能 void sort() { FILE *fp; struct book1 a[100]; struct book1 t; //用于排序的结构体变量 int n,i,j; system("cls"); n=count();//调用统计图书文本函数 fp=fopen("libraries.txt","r"); if(!fp) { printf("cannot open filen"); exit(0); } for(i=0;i 0) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } } fclose(fp); //注意关闭文件 fp=fopen("libraries.txt","w"); if(!fp) { printf("cannot open filen"); exit(0); } for(i=0;i


