C语言实现简单的图书管理系统

时间:2021-09-11 23:42:11

本文实例为大家分享了C语言实现简单图书管理系统的具体代码,供大家参考,具体内容如下

C语言实现简单的图书管理系统

C语言实现简单的图书管理系统

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();//菜单 
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/qq_41226029/article/details/79438131