C语言实现简单的图书管理系统
本文实例为大家分享了C语言实现简单图书管理系统的具体代码,供大家参考,具体内容如下
代码:
/* 课程设计项目名称:图书查询系统 作者:施瑞文 时间:2018.3.4 */ #include<stdio.h> #include<string.h> #include<windows.h> #include<conio.h> #include<stdlib.h> #define N sizeof(struct BOOK) struct BOOK //图书信息 { char number[10]; //登录号 char name[10]; //书名 char author[10]; //作者名 char type[10]; //类型 char publish[10]; //出版单位 char time[8]; //出版时间 float price; //价格 int num; //数量 int x; struct BOOK *next; //指针域 }; typedef struct BOOK Book; typedef Book *book; void HideCursor(); //隐藏光标 void toxy(int x, int y); //将光标移动到X,Y坐标处 void color(short x); //设置颜色 void over(); //退出 void menu(); //菜单 void input_book(); //图书入库 void save_book(book p);//将图书信息存入文件 void find_book(); //查询 void print_book(); //图书总览 void del_book(); //删除图书 void amend_book(); //修改信息 book ss(); void find_name_book(); //按书名查询 void find_author_book(); //按作者查询 void find_number_book(); //按登录号查询 void find_publish_book(); //按出版社查询 void fuzzy_search(); //模糊查找 void HideCursor() //隐藏光标 { CONSOLE_CURSOR_INFO cursor_info = {1, 0}; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info); } void color(short x) { if(x>=0&&x<=15) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),x); } else { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),x); } } void toxy(int x, int y) //将光标移动到X,Y坐标处 { COORD pos = { x , y }; HANDLE Out = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(Out, pos); } void menu() //菜单 { do { system("cls"); //清屏 HideCursor(); //隐藏光标 color(15); //设置一个好看的颜色 char t; toxy(50,5);//将光标移动到(50,5)坐标处 printf(" 图书查询管理系统"); toxy(48,8); printf("| 1.图书入库 |"); toxy(48,10); printf("| 2.修改信息 |"); toxy(48,12); printf("| 3.删除信息 |"); toxy(48,14); printf("| 4.图书查询 |"); toxy(48,16); printf("| 5.图书总览 |"); toxy(48,18); printf("| 6.退出软件 |"); t=getch(); //不回显函数 switch(t) { case '1':input_book();break; case '2':amend_book();break; case '3':del_book();break; case '4':find_book();break; case '5':print_book();break; case '6':over();break; default :break; } }while(1); } book ss() //将文件中的内容读出到链表中,返回值为表头地址 { FILE *fp; //文件指针 int n=0; book head=NULL; book p2,p,pr=NULL; fp=fopen("mybook","ab+"); //以只读的方式打开文件 if(fp==NULL) { printf("cannot open file\n"); } while(!feof(fp)) //判断文件位置标志是否移动到文件末尾 { n++; p=(book)malloc(N); //向内存申请一段空间 fread(p,N,1,fp); //将fp所指向的文件中的内容赋给p if(n==1) { head=p; p2=p; } else //创建链表 { pr=p2; p2->next=p; p2=p; } } if(pr!=NULL) pr->next=NULL; else head=NULL; fclose(fp); //关闭文件 return head; //返回头指针 } void input_book() //图书录入 { do { system("cls"); color(10); char t; book p; p=(book)malloc(N); //申请空间 //输入图书信息 toxy(48,8); printf("请输入图书登录号(小于10位数):"); scanf("%s",p->number);getchar(); toxy(48,10); printf("请输入书名(小于10位数):"); scanf("%s",p->name);getchar(); toxy(48,12); printf("请输入作者名(小于10位数):"); scanf("%s",p->author);getchar(); toxy(48,14); printf("请输入图书类别(小于10位数):"); scanf("%s",p->type);getchar(); toxy(48,16); printf("请输入图书出版单位(小于10位数):"); scanf("%s",p->publish);getchar(); toxy(48,18); printf("请输入图书出版时间(小于8位数):"); scanf("%s",p->time);getchar(); toxy(48,20); printf("请输入图书价格:"); scanf("%f",&p->price);getchar(); toxy(48,22); printf("请输入图书数量:"); scanf("%d",&p->num); save_book(p); toxy(48,24); printf("正在保存...."); Sleep(500); //暂停0.5秒 system("cls"); toxy(46,8); printf("-------------------------"); toxy(46,9); printf("| |"); toxy(46,10); printf("| 保存成功!是否继续? |"); toxy(46,12); printf("| 1.是 2.否 |"); toxy(46,13); printf("| |"); toxy(46,14); printf("-------------------------"); while(1) //利用死循环可有效防止其他按键干扰 { t=getch(); if(t=='1') { break; } else if(t=='2') { menu(); } } }while(1); } void amend_book() //修改图书信息 { do { system("cls"); color(10); book head,p; int i=11,j=0,x; char ch,t; FILE *fp; //文件指针 char _name[10]; char number[10]; //登录号 char name[10]; //书名 char author[10]; //作者名 char type[10]; //类型 char publish[10]; //出版单位 char time[8]; //出版时间 float price; //价格 int num; //数量 head=ss(); p=head; toxy(48,10); printf("请输入你要修改的图书的书名:"); gets(_name); while(p!=NULL) //初始化p->x为0 { p->x=0; p=p->next; } p=head; //让p重新指向表头 toxy(20,5); printf("***********************************************图书信息******************************************************"); toxy(20,8); printf("-------------------------------------------------------------------------------------------------------------"); toxy(20,9); printf("登录号 书名 作者名 图书类别 出版单位 出版时间 价格 数量"); toxy(20,10); printf("-------------------------------------------------------------------------------------------------------------"); while(p!=NULL) { if(p!=NULL&&strcmp(p->name,_name)==0) { toxy(20,i); j++; printf("%d:%s%14s%14s%14s %14s %18s %.2f%12d\n",j,p->number,p->name,p->author,p->type,p->publish,p->time,p->price,p->num); p->x=j; //给符合查询标准的结点标号 i++; } p=p->next; } if(j==0) //如果j=0,即没有进入前面的搜索循环,也就是没有找到相应的信息 { toxy(50,i); printf("没有找到相应的信息!(按0返回,按1重新搜索)"); while(1) //死循环是为了防止除0和1的其他按键干扰 { ch=getch(); if(ch=='0') { menu();break; } else if(ch=='1') { break; } } if(ch=='1') //如果输入的ch等于1,则结束本次循环 continue; } while(1) { toxy(45,i); printf("请输入您要修改的图书的编号:"); scanf("%d",&x);getchar(); if(x>j||x==0) { toxy(45,++i); printf("输入错误,请重新输入!"); Sleep(500); } else { break; } } p=head; //让p重新指向表头 while(p!=NULL&&p->x!=x) //遍历链表查询符合条件的结点 { p=p->next; } if(p) //如果p不为空 { system("cls"); //输入要修改的信息 toxy(48,8); printf("请输入图书登录号(小于10位数):"); scanf("%s",number);getchar();strcpy(p->number,number); toxy(48,10); printf("请输入书名(小于10位数):"); scanf("%s",name);getchar();strcpy(p->name,name); toxy(48,12); printf("请输入作者名(小于10位数):"); scanf("%s",author);getchar();strcpy(p->author,author); toxy(48,14); printf("请输入图书类别(小于10位数):"); scanf("%s",type);getchar();strcpy(p->type,type); toxy(48,16); printf("请输入图书出版单位(小于10位数):"); scanf("%s",publish);getchar();strcpy(p->publish,publish); toxy(48,18); printf("请输入图书出版时间(小于8位数):"); scanf("%s",time);getchar();strcpy(p->time,time); toxy(48,20); printf("请输入图书价格:"); scanf("%f",&price);getchar();p->price=price; toxy(48,22); printf("请输入图书数量:"); scanf("%d",&num);getchar();p->num=num; } color(7); toxy(46,8); printf("-------------------------"); toxy(46,9); printf("| |"); toxy(46,10); printf("| 是否确认修改? |"); toxy(46,12); printf("| 1.是 2.否 |"); toxy(46,13); printf("| |"); toxy(46,14); printf("-------------------------"); while(1) //利用死循环防止其他按键干扰 { t=getch(); if(t=='1') { break; } else if(t=='2') { menu(); } } system("cls"); toxy(46,10); printf("正在修改,请稍后...."); fp=fopen("mybook","wb"); //以只写的方式打开名为mybook的二进制文件,打开的同时清空文件中的内容 if(fp==NULL) { printf("cannot open file"); } if(fwrite(head,N,1,fp)!=1) //将head写入fp所指向的文件中 { printf("write error!"); } fclose(fp); //关闭文件 if(head!=NULL) //如果head不为空 { p=head->next; //让p指向第二个结点 fp=fopen("mybook","ab"); //以追加的方式打开文件 if(fp==NULL) { printf("cannot open file"); } while(p!=NULL) { if(fwrite(p,N,1,fp)!=1)//将p写入fp所指向的文件中 { printf("write error!"); } p=p->next; } fclose(fp); //关闭文件 } Sleep(500); //暂停0.5秒 system("cls"); toxy(46,10); printf("修改成功!即将自动返回主菜单...."); Sleep(500); break; }while(1); } void del_book() //删除信息 { do { system("cls"); color(9); FILE *fp; book head,p,pre=NULL; int j=0,x,i=11; char name[10]; char t,c,ch; head=ss(); //调用函数,返回表头地址 toxy(48,10); printf("请输入你要删除的图书的书名:"); scanf("%s",name); p=head; while(p!=NULL) { p->x=0; p=p->next; } p=head; toxy(20,5); printf("***********************************************图书信息******************************************************"); toxy(20,8); printf("-------------------------------------------------------------------------------------------------------------"); toxy(20,9); printf("登录号 书名 作者名 图书类别 出版单位 出版时间 价格 数量"); toxy(20,10); printf("-------------------------------------------------------------------------------------------------------------"); while(p!=NULL) { if(p!=NULL&&strcmp(p->name,name)==0) { toxy(20,i); j++; printf("%d:%s%14s%14s%14s %14s %18s %.2f%12d\n",j,p->number,p->name,p->author,p->type,p->publish,p->time,p->price,p->num); p->x=j; i++; } p=p->next; } if(j==0) //如果j=0,即没有进入前面的搜索循环,也就是没有找到相应的信息 { toxy(50,i); printf("没有找到相应的信息!(按0返回,按1重新搜索)"); while(1) //死循环是为了防止除0和1的其他按键干扰 { ch=getch(); if(ch=='0') { menu();break; } else if(ch=='1') { break; } } if(ch=='1') //如果输入的ch等于1,则结束本次循环 continue; } while(1) { toxy(45,i); printf("请输入您要删除的图书的编号:"); scanf("%d",&x);getchar(); if(x>j||x==0) { toxy(45,++i); printf("输入错误,请重新输入!"); Sleep(500); } else { break; } } color(7); toxy(46,8); printf("-------------------------"); toxy(46,9); printf("| |"); toxy(46,10); printf("| 是否确认删除? |"); toxy(46,12); printf("| 1.是 2.否 |"); toxy(46,13); printf("| |"); toxy(46,14); printf("-------------------------"); while(1) { t=getch(); if(t=='1') { break; } else if(t=='2') { menu(); } } p=head; while(p!=NULL&&p->x!=x) { pre=p; p=p->next; } if(p!=NULL) { if(pre==NULL) { head=head->next; } else { pre->next=p->next; } } free(p); fp=fopen("mybook","wb"); if(fp==NULL) { printf("cannot open file"); } if(fwrite(head,N,1,fp)!=1) { printf("write error!"); } fclose(fp); if(head!=NULL) { p=head->next; fp=fopen("mybook","ab"); if(fp==NULL) { printf("cannot open file"); } while(p!=NULL) { if(fwrite(p,N,1,fp)!=1) { printf("write error!"); } p=p->next; } fclose(fp); } system("cls"); toxy(46,10); printf("正在删除,请稍后...."); Sleep(500); system("cls"); toxy(46,8); printf("-------------------------"); toxy(46,9); printf("| |"); toxy(46,10); printf("| 删除成功,是否继续? |"); toxy(46,12); printf("| 1.是 2.否 |"); toxy(46,13); printf("| |"); toxy(46,14); printf("-------------------------"); while(1) { c=getch(); if(c=='1') { break; } else if(c=='2') { menu(); } } }while(1); } void print_book() //图书总览 { system("cls"); color(6); book head,p; int i=11; int sum=0; head=ss(); toxy(20,5); printf("***********************************************图书总览******************************************************"); toxy(20,8); printf("-------------------------------------------------------------------------------------------------------------"); toxy(20,9); printf("登录号 书名 作者名 图书类别 出版单位 出版时间 价格 数量"); toxy(20,10); printf("-------------------------------------------------------------------------------------------------------------"); if(head==NULL) { toxy(45,11); printf("书库暂时没有书哦~赶快去添加几本吧^_^(按任意键返回)"); getch(); menu(); } p=head; while(p!=NULL) { toxy(20,i); printf("%s%14s%14s%14s %14s %18s %.2f%12d\n",p->number,p->name,p->author,p->type,p->publish,p->time,p->price,p->num); i++; sum+=p->num;//计算图书总量 p=p->next; } toxy(48,7); printf("图书总量为:%d",sum); toxy(45,i); printf("按任意键返回"); getch();//不回显函数 } void find_book() //查询图书 { do { system("cls"); //清屏 color(8); char t; toxy(50,5); printf(" 图书查询"); toxy(48,8); printf("| 1.书名 查询 |"); toxy(48,10); printf("| 2.作者 查询 |"); toxy(48,12); printf("| 3.登录号查询 |"); toxy(48,14); printf("| 4.出版社查询 |"); toxy(48,16); printf("| 5.模糊 查询 |"); toxy(50,18); printf("按0返回主菜单"); t=getch(); switch(t) { case '0':menu();break; case '1':find_name_book();break; case '2':find_author_book();break; case '3':find_number_book();break; case '4':find_publish_book();break; case '5':fuzzy_search();break; default :break; } }while(1); } void find_name_book() //按名字查询 { system("cls"); color(8); book head,p; int i=11; head=ss(); char name[10]; toxy(48,8); printf("请输入您要查询图书的书名:"); gets(name); toxy(48,10); printf("正在查询...."); Sleep(500); p=head; toxy(20,5); printf("***********************************************图书总览******************************************************"); toxy(20,8); printf("-------------------------------------------------------------------------------------------------------------"); toxy(20,9); printf("登录号 书名 作者名 图书类别 出版单位 出版时间 价格 数量"); toxy(20,10); printf("-------------------------------------------------------------------------------------------------------------"); while(p!=NULL) { if(p!=NULL&&strcmp(p->name,name)==0) { toxy(20,i); printf("%s%14s%14s%14s %14s %18s %.2f%12d\n",p->number,p->name,p->author,p->type,p->publish,p->time,p->price,p->num); i++; } p=p->next; } toxy(45,i); printf("按任意键返回!"); getch(); find_book(); } void find_author_book() //按作者名查询 { system("cls"); color(8); book head,p; int i=11; head=ss(); char author[10]; toxy(48,8); printf("请输入您要查询图书的作者名:"); gets(author); toxy(48,10); printf("正在查询...."); Sleep(500); p=head; toxy(20,5); printf("***********************************************图书总览******************************************************"); toxy(20,8); printf("-------------------------------------------------------------------------------------------------------------"); toxy(20,9); printf("登录号 书名 作者名 图书类别 出版单位 出版时间 价格 数量"); toxy(20,10); printf("-------------------------------------------------------------------------------------------------------------"); while(p!=NULL) { if(p!=NULL&&strcmp(p->author,author)==0) { toxy(20,i); printf("%s%14s%14s%14s %14s %18s %.2f%12d\n",p->number,p->name,p->author,p->type,p->publish,p->time,p->price,p->num); i++; } p=p->next; } toxy(45,i); printf("按任意键返回!"); getch(); find_book(); } void find_number_book() //按图书编号查询 { system("cls"); color(8); book head,p; int i=11; head=ss(); char number[10]; toxy(48,8); printf("请输入您要查询图书的登录号:"); gets(number); toxy(48,10); printf("正在查询...."); Sleep(500); p=head; toxy(20,5); printf("***********************************************图书总览******************************************************"); toxy(20,8); printf("-------------------------------------------------------------------------------------------------------------"); toxy(20,9); printf("登录号 书名 作者名 图书类别 出版单位 出版时间 价格 数量"); toxy(20,10); printf("-------------------------------------------------------------------------------------------------------------"); while(p!=NULL) { if(p!=NULL&&strcmp(p->number,number)==0) { toxy(20,i); printf("%s%14s%14s%14s %14s %18s %.2f%12d\n",p->number,p->name,p->author,p->type,p->publish,p->time,p->price,p->num); i++; } p=p->next; } toxy(45,i); printf("按任意键返回!"); getch(); find_book(); } void find_publish_book() //按出版商查询 { system("cls"); color(8); book head,p; int i=11; head=ss(); char publish[10]; toxy(48,8); printf("请输入您要查询图书的出版社:"); gets(publish); toxy(48,10); printf("正在查询...."); Sleep(500); p=head; toxy(20,5); printf("***********************************************图书总览******************************************************"); toxy(20,8); printf("-------------------------------------------------------------------------------------------------------------"); toxy(20,9); printf("登录号 书名 作者名 图书类别 出版单位 出版时间 价格 数量"); toxy(20,10); printf("-------------------------------------------------------------------------------------------------------------"); while(p!=NULL) { if(p!=NULL&&strcmp(p->publish,publish)==0) { toxy(20,i); printf("%s%14s%14s%14s %14s %18s %.2f%12d\n",p->number,p->name,p->author,p->type,p->publish,p->time,p->price,p->num); i++; } p=p->next; } toxy(45,i); printf("按任意键返回!"); getch(); find_book(); } void fuzzy_search() //模糊查询 { system("cls"); color(8); book head,p; int i=11; head=ss(); char information[10]; toxy(48,8); printf("请输入您要查询图书的信息:"); gets(information); toxy(48,10); printf("正在查询...."); Sleep(500); p=head; toxy(20,5); printf("***********************************************图书总览******************************************************"); toxy(20,8); printf("-------------------------------------------------------------------------------------------------------------"); toxy(20,9); printf("登录号 书名 作者名 图书类别 出版单位 出版时间 价格 数量"); toxy(20,10); printf("-------------------------------------------------------------------------------------------------------------"); while(p!=NULL) { if(p!=NULL&&(strcmp(p->name,information)==0||strcmp(p->author,information)==0||strcmp(p->number,information)==0||strcmp(p->publish,information)==0)) { toxy(20,i); printf("%s%14s%14s%14s %14s %18s %.2f%12d\n",p->number,p->name,p->author,p->type,p->publish,p->time,p->price,p->num); i++; } p=p->next; } toxy(45,i); printf("按任意键返回!"); getch(); find_book(); } void save_book(book p) //将p中内容写入文件 { FILE *fp; //文件指针 fp=fopen("mybook","ab"); //以追加的方式打开名字为mybook的二进制文件 if(fp==NULL) { printf("cannot open file"); } if(fwrite(p,N,1,fp)!=1) //将p所指向的一段大小为N的内容存入fp所指向的文件中 { printf("write error"); } fclose(fp); //关闭文件 } void over() //退出软件 { char t; toxy(48,11); printf("-----------------------"); toxy(48,12); printf("| 您确定要退出吗? |"); toxy(48,14); printf("| 1.确定 2.取消 |"); toxy(48,15); printf("-----------------------"); while(1) { t=getch(); //输入t switch(t) { case '1': system("cls"); color(6); toxy(48,10); printf("正在安全退出...."); Sleep(1000); //暂停1秒 system("cls"); color(8); toxy(48,10); printf("已安全退出软件"); toxy(48,12); printf("谢谢使用!"); toxy(48,14); printf("by-by^_^"); exit(0); break; //终止程序 case '2': menu(); break; //调用函数,进入菜单 default :break; } } } main() //简洁明了的主函数 { menu();//菜单 }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
赞 (0)