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

}

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

以上是 C语言实现简单的图书管理系统 的全部内容, 来源链接: utcz.com/p/245963.html

回到顶部