目录
  • 主要内容
  • 概要设计
  • 项目源码
    • 结构体
    • 登录界面函数
    • 选择界面函数
    • 操作界面函数
    • 添加函数
    • 查找函数
    • 删除函数
    • 借书管理函数
    • 信息储存函数
    • 还书函数
    • 修改函数
    • 添加借书函数
    • 查找借书函数
    • 借书管理函数
    • 主函数
  • 总结

    时间在流去,我们在长大。

    嗨,这里是狐狸~~

    今天是2022年的一月四日了,元旦小长假也过去了,新年新气象,新年新目标,我们要向前看,不要执意过去了,感谢过去,把握现在,展望未来,这是我们现在应该做的。好了,废话不多说,今天我们分享一个系统,确实也有许久没有分享过系统了,今天就给大家详细讲一下这个图书管理系统吧。

    C语言大作业之图书管理系统的实现详程

    主要内容

            开发一个图书信息管理系统,图书信息包括:图书编号、书名、作者、出版社、类别、出版时间、价格等基本信息(也可以根据自己情况进行扩充,比如是否借出、库存量等)。使之能提供以下基本功能:

    (1)图书信息录入功能(图书信息用文件保存)--输入

    (2)图书信息浏览功能--输出

    (3)查询功能(至少一种查询方式)、排序功能(至少一种排序方式):

                ①按书名查询

                ②按作者名查询 按照价钱排序 按出版时间排序等等

    (4)图书信息的删除与修改

              扩展功能:可以按照自己的程度进行扩展。比如

                              (1)简单的权限处理

                              (2)报表打印功能

                              (3)甚至根据自己情况,可以加上学生信息,并扩充为图书借阅系统。

                              (4)模糊查询

                              (5)综合查询

                              (6)统计功能 比如统计处某一类别的图书信息 或 筛选出小于指定数量库存的图书信息等等。

    概要设计

    1 图书录入可以录入图书名,作者,出版社,出版日期,价格!录入图书编号时函数就会判断此        编 号是否存在,若存在不能成功录入!

    2 图书浏览可以浏览全部图书!

    3 图书查询提供按图书编号模糊查询,按图书名关键字查询,按图书编号精确查询,按图书名精确      查询!模糊查询和关键字查询事通过比价字符串的相似度而实现的!

    4 修改删除图书可以通过图书查询来查询操作的图书编号,通过编号操作!函数会提示用户是否调      用图书查询来找到自己想要操作的图书的编号。如果某一本图书已经被借阅那么用户就不能删        除 该图书!

    5 借阅图书通过学号和图书编号进行借阅!如果该学号是第一次借阅那么会提示用户输入自己的姓      名,并存入student.txt,方便以后借阅与归还!

    6 归还图书先提供学号,然后程序会输出该学号借阅的所有图书,然后再通过编号归还!

    7 借阅查询可查询某个学生已借但未归还的图书!

    C语言大作业之图书管理系统的实现详程

    项目源码

    结构体

    先建立结构体,定义结构体成员

    typedef struct book/*图书结构体*/
    {
    char num[10];  /*书号*/
    char name[10];  /*书名*/
    char auth[10]; /*作者*/
    int count;
    int sum;
    }Book;
    typedef struct borrow/*借书结构体*/
    {
    char id[20];
    char user[20];
    char book[20];
    char bookid[20];
    struct borrow *next;
    }BBnode,*BBlink;
    struct user 
    { 
    char num[10];/* 学号 */ 
    char pass[15];
    char name[15]; 
    char sex[10]; 
     
    }; 
     
    typedef struct unode 
    { 
    struct user data; 
    struct unode *next; 
    }Unode,*Ulink; 
    Unode *os;

    登录界面函数

    int login(Ulink l)
    {
     
     
    /*****************登陆窗口初始化****************************/
    while(!flag)
    {
    char User_id[10],password[10],tmp;
    int i=0;
    User_id[0]='\0';
    password[0]='\0';
    textbackground(179);
    clrscr();
    gotoxy(33,23);
    textcolor(YELLOW);
    cputs("ESC = EXIT");
    textcolor(WHITE);
    textbackground(179);
    box(1,1,80,24);
    h_line(2,3,78);
    gotoxy(15,2);
    cputs("Login now please input the User__ID  and Password");
    bar_(30,10,23,5,5);
    /******************账号过滤*********************/
    while(User_id[0]=='\0')
    {
    gotoxy(31,11);
    textcolor(YELLOW);
    textbackground(5);
    cputs("User__ID:");
    gotoxy(31,13);
    cputs("Password:");
    textbackground(179);
    textcolor(WHITE);
    gotoxy(28,7);
    cputs("please input the User__ID!");
    textbackground(179);
    textcolor(YELLOW);
    gotoxy(27,11);
    putch(272);
    gotoxy(27,13);
    putch(' ');
    gotoxy(40,11);
    tmp=getch();
    if(tmp==27)
    {
    flg=27;
    return 0;
    }
    while(tmp!='\r'&&i<=9&&(tmp>=64&&tmp<=90)||(tmp>=97&&tmp<=122||(tmp>=48&&tmp<=57)))
    {
    textcolor(YELLOW);
    textbackground(5);
    	putch(tmp);
    	User_id[i]=tmp;
    	i++;
    	tmp=getch();
    	if(tmp==27)
    	{
    flg=27;
    return 0;
    }
    }
    User_id[i]='\0';
    }
    /**********************密码过滤****************************/
    while(password[0]=='\0')
    {
    gotoxy(28,7);
    textbackground(179);
    textcolor(WHITE);
    cputs("  input the password now  ");
    textbackground(179);
    textcolor(YELLOW);
    gotoxy(27,13);
    putch(272);
    gotoxy(27,11);
    putch(' ');
    gotoxy(40,13);
    i=0;
    tmp=getch();
    if(tmp==27)
    {
    flg=27;
    return 0;
    }
    while(tmp!='\r'&&i<=10&&(tmp>=64&&tmp<=90)||(tmp>=97&&tmp<=122||(tmp>=48&&tmp<=57)))
    {
    	textbackground(5);
    	putch('*');
     
    	password[i]=tmp;
    	i++;
    	tmp=getch();
    	if(tmp==27)
    	{
    flg=27;
    return 0;
    }
    }
    password[i]='\0';
    }
    /*************把账号和密码进行对比验证**************/
    if(!strcmp(User_id,"admin")&&!strcmp(password,"admin"))
    	{
    		return 2;
    	}
    if(cmps(l,User_id,password))
    {	 
    	return 1;
    }
    }
    }

    选择界面函数

    void choose()
    {
    while(1)
    {
     
    textbackground(179);
    clrscr();
    gotoxy(33,2);
    textcolor(WHITE);
    cputs("Administrastor");
    textcolor(YELLOW);
    box(1,1,80,24);
    h_line(2,3,78);
    gotoxy(3,6);
    cputs(">>>-------------------------1.User Management----------------------------<<<");
    gotoxy(3,10);
    cputs(">>>-------------------------2.Book Management----------------------------<<<");
    	gotoxy(3,14);
    cputs(">>>-------------------------3.Borrow Books-------------------------------<<<");
    gotoxy(30,22);
    textcolor(RED);
    cputs("Please Select!!!");
    flg=getch();
    if(flg=='2')		
    	bookss();									
    if(flg=='1')
    	users();
    if(flg=='3')
    	borrow();
    if(flg==27)
    {
    	flg=-1;
    	return;
    }	
    }		
    }
    void admin()
    {
    while(1)
    {
    choose();	
    if(flg=='1')	
    bookss();
    if(flg=='2')
    users();
    if(flg=='3')
    borrow();
    if(flg==27)
    {
    return;
    }
    }
    }

    操作界面函数

    void user(Ulink h)
    {
    int flag;
    BBlink l,p,r;/* 连表 */ 
    FILE *fp; /* 文件指针 */ 
    int count=0; 
    l=(BBnode*)malloc(sizeof(BBnode)); 
    l->next=NULL; 
    r=l; 
    fp=fopen(bfile,"rb"); 
    if(fp==NULL) 
    { 
    	fp=fopen(bfile,"wb"); 
    } 
    while(!feof(fp)) 
    {
    	p=(BBnode*)malloc(sizeof(BBnode)); 
    	if(fread(p,sizeof(BBnode),1,fp)) /* 将文件的内容放入接点中 */ 
    	{ 
    		p->next=NULL; 
            r->next=p; 
            r=p; /* 将该接点挂入连中 */ 
            count++; 
        } 
    } 
    	while(1) 
    {	
    	textbackground(179);
    	clrscr();
    	textcolor(YELLOW);
    	box(1,1,80,24);
    	h_line(2,3,78);
    	gotoxy(3,2);
    	textcolor(RED);
    	cputs("A.");
    	textcolor(BLUE);
    	cputs("my message  ");
    	textcolor(RED);
    	cputs("B.");
    	textcolor(BLUE);
    	cputs("modyfy my message  ");
    	textcolor(RED);
    	cputs("C.");
    	textcolor(BLUE);
    	cputs("my borrow  ");
    	textcolor(RED);
    	cputs("D.");
    	textcolor(BLUE);
    	cputs("search book");
    	textcolor(YELLOW);
    	gotoxy(50,50);
    	flag=getch(); 
        switch(flag)		
    	{ 		
    	case 'a':
    		show(os);
    		
    		break; /*************添加用户**********/
    	case 'b':
    		Modify_user(h);
    		Save(h);
    		
    		break;/*************删除用户**********/
    	case 'c':
    		Myborrow();
    		break;
    	case 'd':
    		usersearch();
     
    		
    		break;
    	case 27:
    		return;
    		
    	} 
     
    } 
     
    }

    添加函数

    图书的添加,包括用户添加以及管理员添加

    void add(blink l)
    { 
    Bnode *p,*r,*s; 
    char num[10]; 
    r=l; 
    s=l->next; 
    while(r->next!=NULL) 
    	r=r->next; 
    textcolor(RED);
    gotoxy(25,4);
    cputs("INPUT THE MESSAGE ABOUT BOOK");
    gotoxy(31,10);
    textcolor(YELLOW);
    cputs("Book ID:");
    scanf("%s",num); 
    p=(Bnode *)malloc(sizeof(Bnode));  
    while(s) 
    { 
    	if(strcmp(s->data.num,num)==0) 
    	{ 
    		textcolor(WHITE);
    		gotoxy(25,15);
    		cputs("This ID:");
    		printf("'%s'",num); 
    		cputs("is exist!");    
    		gotoxy(25,22);
    		cputs("please Press any key to continue...");  
    		gotoxy(255,252);
    		getch();                    
    		return; 
    	} 
    	s=s->next; 
    } 
    strcpy(p->data.num,num); 
    gotoxy(31,12);
    textcolor(YELLOW);
    cputs("Input Book name:"); 
    scanf("%s",p->data.name); 
    gotoxy(31,14);
    cputs("input your Book auth:"); 
    scanf("%s",p->data.auth); 
    gotoxy(31,16);
    cputs("input your Book count:"); 
    scanf("%d",&p->data.count); 
    bookcount=p->data.count+bookcount;
    p->data.sum=0;
    p->next=NULL; 
    r->next=p; 
    r=p; 
    gotoxy(30,22);
    textcolor(RED);
    cputs("Add Book Success !!!");
    getch();
    textcolor(YELLOW);
    } 
     
     /*******管理员添加用户*******/
    void Add(Ulink l)
    { 
    Unode *p,*r,*s; 
    char num[10]; 
    r=l; 
    s=l->next; 
    while(r->next!=NULL) 
    	r=r->next; 
    textcolor(RED);
    gotoxy(25,4);
    cputs("INPUT THE MESSAGE ABOUT BOOK");
    gotoxy(31,10);
    textcolor(YELLOW);
    cputs("User ID:");
    scanf("%s",num); 
    p=(Unode *)malloc(sizeof(Unode));  
    while(s) 
    { 
    	if(strcmp(s->data.num,num)==0) 
    	{ 
    		gotoxy(25,15);
    		cputs("This ID:");
    		printf("'%s'",num); 
    		cputs("is exist!");    
    		gotoxy(25,22);
    		textcolor(RED);
    		cputs("please Press any key to continue...");  
    		gotoxy(255,252);
    		getch();                    
    		return; 
    	} 
    	s=s->next; 
    } 
    strcpy(p->data.num,num); 
    gotoxy(31,12);
    textcolor(YELLOW);
    cputs("Input Password:"); 
    scanf("%s",p->data.pass); 
    gotoxy(31,14);
    cputs("input your name:"); 
    scanf("%s",p->data.name); 
    gotoxy(31,16);
    cputs("input the sex:"); 
    scanf("%s",p->data.sex); 
    p->next=NULL; 
    r->next=p; 
    r=p; 
    gotoxy(30,22);
    cputs("Add User Success !!!");
    usercount++;
    getch();
    textcolor(YELLOW);
    } 

    查找函数

    用户查找以及管理员查找

    /*******管理员查找图书*******/
    void qur(blink l)
    { 
    int sel; 
    char findmess[20]; 
    Bnode *p; 
     
    if(!l->next) 
    { 
    gotoxy(30,4);
    textcolor(WHITE);
         cputs("Not Find Bookdata!!!"); 
    	 getch();
        return; 
    } 
    textcolor(RED);
    gotoxy(25,4);
    cputs("Please Select Search  Type !");
    gotoxy(10,8);
    textcolor(WHITE);
    cputs("1.Search by ID");
    gotoxy(10,10);
    cputs("2.Search by Name");
    gotoxy(10,12);
    cputs("Please Select 1 or 2:");
    scanf("%d",&sel); 
    if(sel==1) 
    {
    	gotoxy(36,8);
    	textcolor(YELLOW);
    	cputs("Input the search ID:"); 
    	scanf("%s",findmess); 
    	p=locate(l,findmess,"num"); 
    	if(p) 
    	{ 
    		gotoxy(36,12);
    		textcolor(WHITE);
    		cputs("Book ID:");
    		printf("%s",p->data.num);
    		gotoxy(36,14);
    		textcolor(WHITE);
    		cputs("Book Name:");
    		printf("%s",p->data.name);
    		gotoxy(36,16);
    		textcolor(WHITE);
    		cputs("Book author:");
    		printf("%s",p->data.auth);
    		gotoxy(36,18);
    		textcolor(WHITE);
    		cputs("Book count:");
    		printf("%d",p->data.count);
    		getch();
    		textcolor(YELLOW);
    		gotoxy(30,21);
    		cputs("Search Success !!");
    	}
    	else 
    	{
    		gotoxy(30,22);
    		textcolor(RED);
    		cputs("Not finde !!!"); 
    		getch();
    	}
    }	
    else if(sel==2) /* 姓名 */
    { 
    	gotoxy(36,8);
    	textcolor(YELLOW);
    	cputs("Input the search name:");
    	scanf("%s",findmess); 
    	p=locate(l,findmess,"name"); 		
    	if(p) 
    	{ 
    		gotoxy(36,12);
    		textcolor(WHITE);
    		cputs("Book ID:");
    		printf("%s",p->data.num);
    		gotoxy(36,14);
    		textcolor(WHITE);
    		cputs("Book Name:");
    		printf("%s",p->data.name);
    		gotoxy(36,16);
    		textcolor(WHITE);
    		cputs("Book author:");
    		printf("%s",p->data.auth);
    		gotoxy(36,18);
    		textcolor(WHITE);
    		cputs("Book count:");
    		printf("%d",p->data.count);
    		getch();
    		textcolor(YELLOW);
    	} 
    	else 
    	{
    		textcolor(RED);
    		gotoxy(30,22);
    		cputs("Not finde !!!"); 
    	}
    } 
    else 
    {
    	textcolor(RED);
    	gotoxy(30,22); 
    	cputs("Error !!"); 
    	getch();
    }
    } 
     
    /*******用户查找图书*******/
    void usersearch()
    { 
    int sel; 
    char findmess[20]; 
    Bnode *p; 
    blink l;/* 连表 */ 
    FILE *fp; /* 文件指针 */ 
    int count=0; 
    Bnode *P,*r;
    l=(Bnode*)malloc(sizeof(Bnode)); 
    l->next=NULL; 
    r=l; 
    fp=fopen(file,"rb"); 
    if(fp==NULL) 
    { 
    	fp=fopen(file,"wb"); 
     } 
    while(!feof(fp)) 
    { 
        P=(Bnode*)malloc(sizeof(Bnode)); 
        if(fread(P,sizeof(Bnode),1,fp)) /* 将文件的内容放入接点中 */ 
        { 
            P->next=NULL; 
    		bookcount=bookcount+P->data.count;
    		booksum=booksum+P->data.sum;
            r->next=P; 
            r=P; /* 将该接点挂入连中 */ 
            count++; 
        }
    } 
    fclose(fp); /* 关闭文件 */ 
     
     
    if(!l->next) 
    { 
    gotoxy(30,4);
    textcolor(WHITE);
         cputs("Not Find Bookdata!!!");
    	 getch();
        return; 
    } 
    textcolor(RED);
    gotoxy(25,4);
    cputs("Please Select Delete  Type !");
    gotoxy(10,8);
    textcolor(WHITE);
    cputs("1.Search by ID");
    gotoxy(10,10);
    cputs("2.Search by Name");
    gotoxy(10,12);
    cputs("Please Select 1 or 2:");
    scanf("%d",&sel); 
    if(sel==1) 
    {
    	gotoxy(36,8);
    	textcolor(YELLOW);
    	cputs("Input the search ID:"); 
    	scanf("%s",findmess); 
    	p=locate(l,findmess,"num"); 
    	if(p) 
    	{ 
    		gotoxy(36,12);
    		textcolor(WHITE);
    		cputs("Book ID:");
    		printf("%s",p->data.num);
    		gotoxy(36,14);
    		textcolor(WHITE);
    		cputs("Book Name:");
    		printf("%s",p->data.name);
    		gotoxy(36,16);
    		textcolor(WHITE);
    		cputs("Book author:");
    		printf("%s",p->data.auth);
    		gotoxy(36,18);
    		textcolor(WHITE);
    		cputs("Book count:");
    		printf("%d",p->data.count-p->data.sum);
    		getch();
    		textcolor(YELLOW);
    	}
    	else 
    	{
    		gotoxy(30,22);
    		textcolor(RED);
    		cputs("Not finde !!!"); 
    		getch();
    	}
    }	
    else if(sel==2)
    { 
    	gotoxy(36,8);
    	textcolor(YELLOW);
    	cputs("Input the search name:");
    	scanf("%s",findmess); 
    	p=locate(l,findmess,"name"); 		
    	if(p) 
    	{ 
    		gotoxy(36,12);
    		textcolor(WHITE);
    		cputs("Book ID:");
    		printf("%s",p->data.num);
    		gotoxy(36,14);
    		textcolor(WHITE);
    		cputs("Book Name:");
    		printf("%s",p->data.name);
    		gotoxy(36,16);
    		textcolor(WHITE);
    		cputs("Book author:");
    		printf("%s",p->data.auth);
    		gotoxy(36,18);
    		textcolor(WHITE);
    		cputs("Book count:");
    		printf("%d",(p->data.count-p->data.sum));
    		getch();
    		textcolor(YELLOW);
    	} 
    	else 
    	{
    		textcolor(RED);
    		gotoxy(30,22);
    		cputs("Not finde !!!"); 
    	}
    } 
    else 
    {
    	textcolor(RED);
    	gotoxy(30,22); 
    	cputs("Error !!"); 
    	getch();
    }
    } 
     
    /*******图书查找*******/
    int cmpbook(blink l,char id[],char na[])
    { 
    char findm[20];
    Bnode *p; 
    if(!l->next) 
    { 
    	gotoxy(25,4);
    	textcolor(RED);
         cputs("Not Find Book!!!"); 
    	 getch();
        return 0; 
    } 
    strcpy(findm,id);
    	p=locate(l,findm,"num"); 
    	if(p) 
    	{ 
    		strcpy(findm,na);
    		p=locate(l,findm,"name"); 		
    		if(p) 
    		{ 
    			return 1;	
    		} 
    		else 
    		{
    			textcolor(RED);
    			gotoxy(30,22);
    			cputs("Book name is NULL !!!"); 
    			getch();
    			return 0;
    		}
    	}
    	else 
    	{
    		gotoxy(30,22);
    		textcolor(RED);
    		cputs("Book id is NULL !!!"); 
    		getch();
    		return 0;
    	}
    	
     
     
    	
    	
     
    } 

    删除函数

    图书的删除

    void del(blink l) 
    { 
    	int sel; 
    	Bnode *p,*r; 
    	char findmess[20]; 
    	if(!l->next) 
    	{ 
    		gotoxy(25,4);
    		textcolor(RED);
    		cputs("=====>not thing could delete!\n"); 
    		getch();
    		return; 
    	} 
    	textcolor(RED);
    	gotoxy(25,4);
    	puts("Please Select Delete  Type !");
    	gotoxy(10,8);
    	
    	textcolor(WHITE);
    	cputs("1.Delete by Book ID");
    	gotoxy(10,10);
    	cputs("2.Delete by Book Name");
    	gotoxy(10,12);
    	cputs("Please Select 1 or 2:");
    	scanf("%d",&sel); 
    	if(sel==1)     
    	{ 
    		gotoxy(36,8);
    		textcolor(YELLOW);
    		cputs("Input the delete ID:"); 
    		scanf("%s",findmess); 
    		p=locate(l,findmess,"num"); 
    		if(p) 
    		{ 
    			bookcount=bookcount-p->data.count;
    			r=l; 
    			while(r->next!=p) 
    				r=r->next; 
    			r->next=p->next; 
    			free(p); 
    			gotoxy(30,22);
    			textcolor(RED);
    			cputs("Delete success!\n");     
    			textcolor(YELLOW);  
    		} 
    		else 
    		{
    	textcolor(RED);
    	gotoxy(30,22); 
    	cputs("Error !!"); 
    		}
    	} 
    	else if(sel==2) 
    	{ 
    		gotoxy(36,8);
    		textcolor(YELLOW);
    		cputs("Input the delete name:"); 
    		scanf("%s",findmess); 
    		p=locate(l,findmess,"name"); 
    		if(p) 
    		{ 
    			r=l; 
    			while(r->next!=p) 
    				r=r->next; 
    			r->next=p->next; 
    			free(p); 
    			gotoxy(30,22);
    			textcolor(RED);
    			cputs("Delete success!\n"); 
    			bookcount--;
    			textcolor(YELLOW);  
    		} 
    		else
    		{
    			gotoxy(25,18);
    			cputs("Not find!!"); 
    		}
    	} 
    	else
    	{
    	textcolor(RED);
    	gotoxy(30,22); 
    	cputs("Error !!");  
    	}
    	getch();
    	textcolor(YELLOW);
    } 

    借书管理函数

    void borrow()
    {
    while(1)
    {
    int flag;
    BBlink l,p,r;/* 连表 */ 
    FILE *fp; /* 文件指针 */ 
    int count=0; 
    l=(BBnode*)malloc(sizeof(BBnode)); 
    l->next=NULL; 
    r=l; 
    fp=fopen(bfile,"rb"); 
    if(fp==NULL) 
    { 
    	fp=fopen(bfile,"wb"); 
    } 
    while(!feof(fp)) 
    {
    	p=(BBnode*)malloc(sizeof(BBnode)); 
    	if(fread(p,sizeof(BBnode),1,fp)) /* 将文件的内容放入接点中 */ 
    	{ 
    		p->next=NULL; 
            r->next=p; 
            r=p; /* 将该接点挂入连中 */ 
            count++; 
        } 
    	borrowcount=count;
    } 
    while(1) 
    {	
    	textbackground(179);
    	clrscr();
    	textcolor(YELLOW);
    	box(1,1,80,24);
    	h_line(2,3,78);
    	gotoxy(3,2);
    	textcolor(RED);
    	cputs("B");
    	textcolor(BLUE);
    	cputs("orrow book  ");
    	textcolor(RED);
    	cputs("R");
    	textcolor(BLUE);
    	cputs("eturn book  ");
    	textcolor(RED);
    	cputs("S");
    	textcolor(BLUE);
    	cputs("earch borrow  ");
    	textcolor(YELLOW);
    	printf("count: (borrow=%d)",borrowcount);
    	textcolor(RED);
    	gotoxy(50,50);
    	flag=getch(); 
        switch(flag)		
    	{ 		
    	case 'b':
    		Add_borrow(l);
    		
    		break; /*************添加用户**********/
    	case 'r':
    		Del_borrow(l);
    		Save_borrow(l);
    		break;
    	case 's':
    		Qur_borrow(l);
    		break;
    	case 27:
    		return;
    		
    	} 
         } 	 
      }
    }
     

    信息储存函数

    图书信息的储存

    *******借书信息保存*******/
    void Save_borrow(BBlink l) 
    { 
     FILE* fp; 
     BBnode *p; 
     int flag=1,count=0; 
     fp=fopen(bfile,"wb"); 
     if(fp==NULL) 
     { 
    gotoxy(35,12);
    	textcolor(RED);
          cputs("open error!"); 
          exit(1); 
     } 
     p=l->next; 
     while(p) 
     { 
          if(fwrite(p,sizeof(BBnode),1,fp)==1) 
          { 
              p=p->next; 
              count++; 
          } 
          else 
          { 
              flag=0; 
              break; 
          } 
    } 
    if(flag) 
    { 
    textcolor(RED);
    gotoxy(30,24);
     /*** printf("save success.(saved%d.)",count);**调试的时候用的*/
    }
    fclose(fp); 
    } 

    还书函数

    /* 还书的操作 */ 
    void Del_borrow(BBlink l) 
    { 
    		int sel; 
    	BBnode *p,*r; 
    	Bnode *L;
    	char findmess[20];
    	FILE *fp; /* 文件指针 */
    Bnode *P,*R,*Q;
    L=(Bnode*)malloc(sizeof(Bnode)); 
    L->next=NULL; 
    R=L; 
    fp=fopen(file,"rb"); 
    if(fp==NULL) 
    { 
    	fp=fopen(file,"wb");
     }
    while(!feof(fp))
    {
        P=(Bnode*)malloc(sizeof(Bnode));
        if(fread(P,sizeof(Bnode),1,fp)) /* 将文件的内容放入接点中 */
        {
            P->next=NULL;
            R->next=P;
            R=P; /* 将该接点挂入连中 */
        }
    }
    fclose(fp); /* 关闭文件 */
     
    	if(!l->next)
    	{
    		gotoxy(30,4);
    		textcolor(RED);
    		cputs("not Book could Return!\n");
    		getch();
    		return;
    	}
    	textcolor(RED);
    	gotoxy(25,4);
    	puts("Please Select Return  Type !");
    	gotoxy(10,8);
     
    	textcolor(WHITE);
    	cputs("1.Return by Borrow ID");
    	gotoxy(10,10);
    	cputs("2.Return by book name");
    	gotoxy(10,12);
    	cputs("Please Select 1 or 2:");
    	scanf("%d",&sel);
    	if(sel==1)
    	{
    		gotoxy(36,8);
    		textcolor(YELLOW);
    		cputs("Input the Borrow ID:");
    		scanf("%s",findmess);
    		p=Locate_borrow(l,findmess,"num");
    		if(p)
    		{
     
    				Q=locate(L,findmess,"num");
    				if(Q) 
    				{ 
    					Q->data.sum=Q->data.sum-1;
    						save(L);
    				} 
    			r=l; 
    			while(r->next!=p) 
    				r=r->next; 
    			r->next=p->next; 
    			free(p); 
    			gotoxy(30,22);
    			textcolor(RED);
    			cputs("Return success!\n"); 
    			borrowcount--;
    			getch();
    			textcolor(YELLOW);  
    		} 
    		else 
    		{
    			gotoxy(30,22);
    			textcolor(RED);
    			cputs("Note find !!"); 
    			getch();
    			
    		}
    	} 
    	else if(sel==2) 
    	{ 
    		gotoxy(36,8);
    		textcolor(YELLOW);
    		cputs("Input the Book name:"); 
    		scanf("%s",findmess); 
    		p=Locate_borrow(l,findmess,"book");
    		if(p) 
    		{ 
    			
    				Q=locate(L,findmess,"name"); 
    				if(Q) 
    				{ 
    					Q->data.sum=Q->data.sum-1;
    						save(L);
    				} 
    			
    			r=l; 
    			while(r->next!=p) 
    				r=r->next; 
    			r->next=p->next; 
    			free(p); 
    			gotoxy(30,22);
    			textcolor(RED);
    			cputs("Borrow success!\n"); 
    			borrowcount--;
    			getch();
    			textcolor(YELLOW);  
    		} 
    		else
    		{
    			gotoxy(30,18);
    			textcolor(RED);
    			cputs("Not find!!"); 
    			getch();
    		}
    	} 
    		
    	else
    	{
    		gotoxy(30,22);
    		textcolor(RED);
    		cputs("Not finde !!"); 
    		getch();
    	}
    	textcolor(YELLOW);
    } 

    修改函数

    也分为用户和管理员两种情况 

    /* ****用于管理员修改用户资料 ***/
    void Modify(Ulink l) 
    { 
    	Unode *p; 
    	char findmess[20]; 
    	if(!l->next) 
    	{
    		gotoxy(30,4);
    		textcolor(RED);
    		cputs("not thing could modify!"); 
    		getch();
    		return; 
    	} 
    	gotoxy(30,4);
    	textcolor(RED);
    	cputs("Modify User Message");
    	gotoxy(25,8);
    	textcolor(YELLOW);
    	cputs("input the User Id:");
    	scanf("%s",findmess); 
    	p=Locate(l,findmess,"num"); 
    	if(p) 
    	{ 
    		textcolor(YELLOW);
    		gotoxy(25,10);
    		printf("Inpute The New ID(old:%s):",p->data.num); 
    		scanf("%s",p->data.num); 
    		gotoxy(25,12);
    		printf("Input The New Password(old:%s):",p->data.pass); 
    		scanf("%s",p->data.pass); 
    		gotoxy(25,14);
    		printf("Input The New Name(old:%s):",p->data.name); 
    		scanf("%s",p->data.name); 
    		gotoxy(25,16);
    		printf("Input The New Sex(old:%s):",p->data.sex); 
    		scanf("%s",p->data.sex); 
    		gotoxy(30,20);
    		textcolor(RED);
    		cputs("Modify Success !!!"); 
    		getch();
    		textcolor(YELLOW);
    	} 
    	else 
    	{	
    		gotoxy(30,16);
    		textcolor(RED);
    		cputs("Not Finde !!!"); 
    		getch();
    	}
    } 
     
     
     /****供用户修改用户自己资料 */
    void Modify_user(Ulink l)
    { 
    	Unode *p; 
    	char findmess[20]; 
    	if(!l->next) 
    	{
    		gotoxy(30,4);
    		textcolor(RED);
    		cputs("not thing could modify!"); 
    		getch();
    		return; 
    	} 
    	gotoxy(30,4);
    	textcolor(RED);
    	cputs("Modify User Message");
    	gotoxy(33,8);
    	textcolor(YELLOW);
    	strcpy(findmess,os->data.num);
    	printf("your id:%s",findmess);
    	p=Locate(l,findmess,"num"); 
    	if(p) 
    	{ 
    		textcolor(YELLOW);
    		gotoxy(24,10);
    		printf("Input The New Password(old:%s):",p->data.pass); 
    		scanf("%s",p->data.pass); 
    		gotoxy(24,12);
    		printf("Input The New Name(old:%s):",p->data.name); 
    		scanf("%s",p->data.name); 
    		gotoxy(24,14);
    		printf("Input The New Sex(old:%s):",p->data.sex); 
    		scanf("%s",p->data.sex); 
    		gotoxy(31,18);
    		textcolor(RED);
    		cputs("Modify Success !!!"); 
    		getch();
    		textcolor(YELLOW);
    	} 
    	else 
    	{	
    		gotoxy(30,16);
    		textcolor(RED);
    		cputs("Not Finde !!!"); 
    		getch();
    	}
    } 

    添加借书函数

    /*******添加借书*******/
    void Add_borrow(BBlink l) 
    { 
    Ulink H;/* 连表 */ 
    FILE *Fp; /* 文件指针 */ 
    Unode *Q,*T;
    blink L;/* 连表 */ 
    FILE *FP; /* 文件指针 */ 
    int ttl;
     
    Bnode *P,*R;
    char bookid[20];
    char bookname[20];
    char userid[20];
    BBnode *p,*r,*s; 
    char num[10]; 
    r=l; 
    s=l->next; 
    while(r->next!=NULL) 
    	r=r->next; 
    L=(Bnode*)malloc(sizeof(Bnode)); 
    L->next=NULL; 
    R=L; 
    FP=fopen(file,"rb"); 
    if(FP==NULL) 
    { 
    	FP=fopen(file,"wb"); 
     } 
    while(!feof(FP)) 
    { 
        P=(Bnode*)malloc(sizeof(Bnode)); 
        if(fread(P,sizeof(Bnode),1,FP)) /* 将文件的内容放入接点中 */ 
        { 
            P->next=NULL; 
    		bookcount=bookcount+P->data.count;
            R->next=P; 
            R=P; /* 将该接点挂入连中 */ 
     
        } 
    } 
    fclose(FP); /* 关闭文件 */ 
     
     
    H=(Unode*)malloc(sizeof(Unode)); 
    H->next=NULL; 
    T=H;
    Fp=fopen(ufile,"rb"); 
    if(Fp==NULL) 
    { 
    	Fp=fopen(ufile,"wb"); 
     } 
    while(!feof(Fp)) 
    { 
        Q=(Unode*)malloc(sizeof(Unode));
        if(fread(Q,sizeof(Unode),1,Fp)) /* 将文件的内容放入接点中 */ 
        { 
            Q->next=NULL; 
            T->next=Q; 
            T=Q; /* 将该接点挂入连中 */ 
        } 
    } 
    fclose(Fp); 
    textcolor(RED);
    gotoxy(25,4);
    cputs("Please input thease message");
    gotoxy(30,10);
    textcolor(YELLOW);
    cputs("Input Borrow ID:");
    scanf("%d",&ttl);
    itoa(ttl,num,10) ;
    p=(BBnode *)malloc(sizeof(BBnode));
    while(s) 
    { 
    	if(strcmp(s->id,num)==0) 
    	{ 
    		gotoxy(30,15);
    		cputs("Borrow ID:");
    		printf("'%s'",num); 
    		cputs("is exist!");    
    		gotoxy(26,22);
    		textcolor(RED);
    		cputs("please Press any key to continue...");  
    		gotoxy(255,252);
    		getch();                    
    		return; 
    	} 
    	s=s->next; 
    } 
    strcpy(p->id,num);
    gotoxy(31,12);
    textcolor(YELLOW);
    cputs("Input book id:"); 
    scanf("%s",bookid);
    gotoxy(31,14);
    textcolor(YELLOW);
    cputs("Input book name:"); 
    scanf("%s",bookname);/***************************************图书判断在否***************************************/ 
    if(cmpbook(L,bookid,bookname))
    {
    	strcpy(p->bookid,bookid);
    	strcpy(p->book,bookname);
    	gotoxy(31,16);
    cputs("input your ID:"); 
    scanf("%s",userid); /**************************************用户判断在否********************************/
    if(cmpuser(H,userid))
    {
    	strcpy(p->user,userid);
    	p->next=NULL; 
    r->next=p; 
    r=p; 
    if(changeb(L,bookid))
    {
    gotoxy(30,22);
    cputs("Borrow Success !!!");
    Save_borrow(l);
    borrowcount++;
     
    getch();
    }
    }
     
    }
     
    textcolor(YELLOW);
    } 

    查找借书函数

    查找自己借了哪些书

    void Myborrow()
    {
    int i;
     
    BBlink l,p,r;/* 连表 */ 
    FILE *fp; /* 文件指针 */ 
    int count=0; 
    l=(BBnode*)malloc(sizeof(BBnode)); 
    l->next=NULL; 
    r=l; 
    fp=fopen(bfile,"rb"); 
    if(fp==NULL) 
    { 
    	fp=fopen(bfile,"wb"); 
    } 
    i=6;
    while(!feof(fp)) 
    {
     
     
    	
    	p=(BBnode*)malloc(sizeof(BBnode)); 
    	if(fread(p,sizeof(BBnode),1,fp)) /* 将文件的内容放入接点中 */ 
    	{ 
    		textcolor(WHITE);
    		gotoxy(30,4);
    		cputs("Your borrow book");
    		
    		if(strcmp(p->user,os->data.num)==0)
    		{
    			textcolor(YELLOW);
     
    			gotoxy(20,i);
    			printf("Borrow ID:%s\tBook id:%s\tBook name:%s",p->id,p->bookid,p->book);
    			i++;
     
    			p->next=NULL; 
    			r->next=p; 
    			r=p; /* 将该接点挂入连中 */ 
    			count++; 
    		}
        } 
    	myborrow=count;
    	if(myborrow==0)
    	{
    		textcolor(YELLOW);
    		gotoxy(30,13);
    		cputs("You  no borrow !!");
     
     
    	}
     
     
     
    }
    fclose(fp);
    textcolor(YELLOW);
    	gotoxy(65,2);
    	printf("(borrow=%d)",myborrow);
    		
    	getch();
     
    }

    借书管理函数

    void borrow()
    {
    while(1)
    {
    int flag;
    BBlink l,p,r;/* 连表 */ 
    FILE *fp; /* 文件指针 */ 
    int count=0; 
    l=(BBnode*)malloc(sizeof(BBnode)); 
    l->next=NULL; 
    r=l; 
    fp=fopen(bfile,"rb"); 
    if(fp==NULL) 
    { 
    	fp=fopen(bfile,"wb"); 
    } 
    while(!feof(fp)) 
    {
    	p=(BBnode*)malloc(sizeof(BBnode)); 
    	if(fread(p,sizeof(BBnode),1,fp)) /* 将文件的内容放入接点中 */ 
    	{ 
    		p->next=NULL; 
            r->next=p; 
            r=p; /* 将该接点挂入连中 */ 
            count++; 
        } 
    	borrowcount=count;
    } 
    while(1) 
    {	
    	textbackground(179);
    	clrscr();
    	textcolor(YELLOW);
    	box(1,1,80,24);
    	h_line(2,3,78);
    	gotoxy(3,2);
    	textcolor(RED);
    	cputs("B");
    	textcolor(BLUE);
    	cputs("orrow book  ");
    	textcolor(RED);
    	cputs("R");
    	textcolor(BLUE);
    	cputs("eturn book  ");
    	textcolor(RED);
    	cputs("S");
    	textcolor(BLUE);
    	cputs("earch borrow  ");
    	textcolor(YELLOW);
    	printf("count: (borrow=%d)",borrowcount);
    	textcolor(RED);
    	gotoxy(50,50);
    	flag=getch(); 
        switch(flag)		
    	{ 		
    	case 'b':
    		Add_borrow(l);
    		
    		break; /*************添加用户**********/
    	case 'r':
    		Del_borrow(l);
    		Save_borrow(l);
    		break;
    	case 's':
    		Qur_borrow(l);
    		break;
    	case 27:
    		return;
    		
    	} 
     
    } 	
     
    }
     
     
    }

    主函数

    main()
    {
     
    Ulink h,os;/* 连表 */ 
    FILE *fp; /* 文件指针 */ 
    Unode *p,*r;
    h=(Unode*)malloc(sizeof(Unode)); 
    h->next=NULL; 
    r=h; 
    fp=fopen(ufile,"rb"); 
    if(fp==NULL) 
    { 
    	fp=fopen(ufile,"wb"); 
     } 
    while(!feof(fp)) 
    { 
        p=(Unode*)malloc(sizeof(Unode)); 
        if(fread(p,sizeof(Unode),1,fp)) /* 将文件的内容放入接点中 */
        {
            p->next=NULL;
            r->next=p;
            r=p; /* 将该接点挂入连中 */
     
        }
    }
    fclose(fp);
    system("wellcome");
    	if(flg==27)
    	{
    		flg=-1;
    		return;
    	}
    		while(1)
    		{
    			flag=login(h);
    			if(flg==27)
    				{
    					flg=-1;
    					break;
    				}
     
    				if(flag==2)
    				{
    					choose();
    					flag=0;
    				}
    				if(flag==1)
    				{
    					user(h);
    					flag=0;
    				}
     
    		}
     
    }

    总结

         今天的代码量有点小多,难度也不小,用了大量的链表来储存数据,还有一些功能因为篇幅的问题没有放上来,总的来说,这个图书管理系统的功能是很全面的,无论从哪个角度来看。当然啦。有兴趣的同学可以进群领取完整的源码看看,绝对是一个不错的机会,可以说,你要是学会了这个系统,你的C语言在我看来就完全没有问题了,而且在数据结构一块,你也算是小成了,所以希望大家可以认真学习,争取早日掌握。

         这也是2022年的第一篇文章了,希望2022继续加油,向大家分享更多有趣的、有用的知识,十分感谢大家的一路支持,后续我还会发布更多的项目源或者学习资料,希望大家可以持续关注。

    C语言大作业之图书管理系统的实现详程

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。