C~图书管理系统

摘要

作为一名在校大学生,图书馆是我们不可或缺的学习圣地。图书馆为我们提供了种类  
、数量极为丰富的文献。  
图书馆人员结构复杂,人员数量有限,涉及方面很广,如果还使用手工操作处理图书  
借阅问题,工作将非常繁琐,需要大量的人力、物理、财力,极大的浪费了资源,对  
于图书管理人员来说,图书馆管理包括图书信息管理、借阅信息管理、读者信息管理  
等等。而这些项目在过去靠手工操作,需要手工记录这些事情,不但麻烦,还经常出  
错,给广大用户带来很多不便,因此,开发这样一套图书馆管理系统软件。让管理员  
方便的管理图书及用户信息,方便用户查找图书。

1、课程设计的目的

  • 用C语言开发一个简单的图书信息管理系统。

2、主要内容

(一)数据结构

  • 图书数据文件 每种图书的信息包括:图书编号(唯一性标识每一本书)、书名、作者、出版社、库存以及价格。
图书编号书名作者出版社库存价格
001论语孔子高等教育出版社45160
  • 用户数据文件 读者的基本信息:证号、读者姓名、借书日期、书名。
证号读者姓名借书日期书名
2013陌年2021/1/19论语

本文采用了四个文件用来保存信息,分别是:

  • gland.txt:管理员账号密码(账号必须是整形,密码可以是字符串)
  • land.txt:读者账号密码(账号必须是整形,密码可以是字符串)
  • library.txt:图书信息
  • reader.txt:读者借阅信息

(二)系统实现功能

1.图书管理员处理功能
1.1用户信息管理
  • 创建普通读者账号
  • 删除普通读者账号
1.2图书信息管理
  • 添加图书
  • 删除图书
  • 浏览图书
  • 修改图书
  • 查询图书
  • 浏览读者借阅
1.3登录功能
  • 管理员登录:本系统管理员账号密码内置在gland.txt文本中,默认账号为1 密码为1
2.普通读者管理系统
1.1读者修改密码
1.2借阅系统管理
  • 浏览图书
  • 借阅图书
  • 归还图书
  • 查询图书
1.3登录系统
  • 读者登录:本系统普通读者账号密码由管理员创建,保存在land.txt文本中,默认账号为2013 密码为123456 所有文件在本文末尾上传

3、功能模块图

本系统功能模块图:
本系统流程图

4、详细设计

4.1结构体

本系统分为五个结构体,分别用来实现管理员登录及普通读者登录,保存图书信息,删除读者账号密码,读者修改密码,保存读者信息。

struct book//图书信息
{
    char num[20],nam[20],aut[20],pub[20];
    int  digit;
    float price;
    struct book *next;
};
struct land//管理员登录信息
{
    int username;
    char password[20];
};
struct mm//修改密码
{
    int username1;
    char mima[20];
};
struct sc//删除用户账号
{
    int username1;
    char mima1[20];
    struct sc *next; 
};
struct dz//读者信息
{
    int xuehao;
    char mingzi[20];
    char riqi[20];
    char shuming[20];
    struct dz *next;
};

4.2登录模块

  • 管理员登录模块
    管理员的账号密码保存在gland.txt文本中,由于初学C语言,应用不是很熟练,因此管理员的账号密码只能通过在文件中修改,添加,删除!!!注意:由于考虑不长远,账号密码都用了int类型,导致账号密码只能是整形!!!初始账号就是我在文件中保存的1,密码也是1。可自己创建文件添加,注意必须是整数!!!
    首先进入登录模块提示输入账号密码,输入完毕后,如果账号或密码错误,会输出账号或密码错误,并自动返回主页面。
void gland()
{
    system("cls");
    FILE*fp;
    struct land s[S];
    int i,N=0,j;
    int zhanghao,flag=0;
    char mima[20];
    int K=0;
    if((fp = fopen("gland.txt","r"))==NULL)
    {
        printf("File open error!\n");
        exit(0);
    }
    K = tjzs2();
    for(; !feof(fp);)
    {
        fscanf(fp,"%d %s",&s[N].username,s[N].password);
        N++;
    }
    fclose(fp);
    printf("请输入管理员账号:\n");
    scanf("%d",&zhanghao);
    printf("请输入密码:\n");
    scanf("%s",&mima);
    getchar();
    for(i=0; i<K; i++)
    {
        if(zhanghao==s[i].username)
        {
            if(strcmp(s[i].password,mima)==0)
            {
                printf("登录成功\n");
                system("cls");
                glmain();
                flag=1;
                break;
            }
        }
    }
    if(flag==0)
    {
        printf("账号或密码错误\n");
        Sleep(2000);
        system("cls");
        lmain();
    }
}
  • 读者登录模块
    普通读者账号密码保存在land.txt文件中,通过管理员可实现创建,删除操作,读者也可自行修改密码。用户输入账户密码之后,如果账号不存在,会提示无此用户;如果密码错误,会提示密码错误,并返回主页面;其中模块需要调用match函数来匹配数据库中的账号密码。

登录函数

void land()
{
    int zhanghao;
    char password[20];
    int i=2,j,k,n;
    char hit=0;
    system("cls");
    do
    {
        printf("\n请输入账号:\n");
        scanf("%d",&zhanghao);
        printf("确认输入请按回车,重新输入请按ESC");
        hit=getch();//暂停程序,当hit接受后继续
        for (; hit!=13&&hit!=27;)//保证只有输入CR或ESC
        {
            hit=getch();
        }
    }
    while(hit==27);
    printf("\n请输入密码:\n");
    scanf("%s",password);
    getchar();
    i=match(zhanghao,password);
    if(i==1)
    {
        printf("登陆成功!按任意键继续");
        getch();
        usermain();
    }
    else
    {
        if(i==-1)
        {
            printf("密码错误!");
            getch();
            land();
        }
        if(i==0)
            printf("不存在此用户");
        getch();
        system("cls");
        lmain();
    }
}

匹配函数,匹配成功返回1,密码错误返回-1,不存在此用户返回0

int match(int m,char a[20])//匹配数据库中的账号密码
{
    FILE*fp;
    int n=0,i=0;
    int username;
    char password[20];

    if ((fp=fopen("land.txt","r"))==NULL)
    {
        system ("cls");
        printf("\n 不存在此用户!请新建账户");
        getch();
        system("cls");
        lmain();
    }
    for(; !feof(fp);)
    {
        fscanf(fp,"%d%s",&username,password);
        if(m==username)
        {
            if(strcmp(a,password)==0)
                return 1;
            else
            {
                return -1;
            }
        }
    }
    return 0;
}

4.3添加图书

添加图书可实现批量添加,输入ESC结束添加,否则将一直添加。

void add()
{
    FILE*fp;
    char i;
    int digit=0;
    float price=0;
    char  nam[20],aut[20],pub[20],num[20];
    system ("cls");
    if((fp=fopen("library.txt","r"))==NULL)
    {
        printf("File open error!\n");
        exit(0);
    }
    printf("\n请按以下格式输入图书信息:\n书号    书名     作者    出版社     进库量      单价");
    fp = fopen("library.txt","a");
    for(; i!=27;)
    {
        printf("\n请输入:\n");
        scanf("%s%s%s%s%d%f",num,nam,aut,pub,&digit,&price);
        fprintf(fp,"%-8s%-9s%-14s%-16s%-7d%-8.2f\n",num,nam,aut,pub,digit,price);
        printf("结束输入请按ESC\n");
        i=getch();
    }
    fclose(fp);
    printf("\n保存成功,按任意键返回上一层!");
    getch();
    tsmain();
}

4.4删除图书

这部分做的不是很好,日后需要多多改善。

void Delete()
{
    struct book *head=NULL;
    struct book *p,*p1,*p2;
    int tmany=0,n=0,j,k;
    float tprice=0;
    char  tnam[20],taut[20],tcat[20],tpub[20],tnum[20];
    char jnam[20];
    char i,hit;
    FILE *fp;
    if ((fp=fopen("library.txt","r"))==NULL)//打开文件
    {
        system ("cls");
        printf("\n记录文件不存在!按任意键返回");
        getch();
        tsmain();
    }
    else//实现删除的功能
    {
        system ("cls");
        printf("\n请输入你要删除的书名:");//输入删除图书书名
        scanf("%s",jnam);
        printf("\n确认删除请回车,取消请按Esc\n");
        i=getch();
        for(; i!=13&&i!=27;)
            i=getch();
        if (i==27)
            tsmain();
        fp=fopen("library.txt","r");
        j=tjzs();
        for (k=0; k<j; k++)
        {
            fscanf(fp,"%s%s%s%s%d%f",tnum,tnam,taut,tpub,&tmany,&tprice);
            if (strcmp(jnam,tnam)!=0)//比较名字,将不同名字的信息复制到链表
            {
                n++;
                if (n==1)//建立链表
                {
                    p1=p2=(struct book*)malloc(sizeof(struct book));
                    head=p1;
                }
                else
                {
                    p2->next=p1;
                    p2=p1;
                    p1=(struct book*)malloc(sizeof(struct book));//新建链表
                }

                strcpy(p1->num,tnum);//复制书号
                strcpy(p1->nam,tnam);//复制书名
                strcpy(p1->aut,taut);//复制作者名字
                strcpy(p1->pub,tpub);//复制出版社
                p1->digit=tmany;//复制个数
                p1->price=tprice;//复制单价
            }
        }
        if (n==0)
        {
            head=NULL;
        }
        else
        {
            p2->next=p1;
            p1->next=NULL;
            fclose(fp);
        }
    }
    fp=fopen("library.txt","w");//清空文件,只写打开,然后关闭
    fclose(fp);
    fp=fopen("library.txt","a");//追加文件
    p=head;
    for (; p!=NULL;) //把链表内容覆盖到文件
    {
        fprintf(fp,"%-8s%-9s%-14s%-16s%-7d%-8.2f\n",p->num,p->nam,p->aut,p->pub,p->digit,p->price);
        p=p->next;
    }
    fclose(fp);
    printf("\n删除成功,按任意键返回上一层\n");
    getch();
    tsmain();
}

5、运行结果

  • 主页面
图5.1主页面
  • 管理员登录页面
图5.2管理员登录页面
  • 管理员二级页面
图5.3管理员二级页面
  • 管理员用户信息管理页面
图5.4管理员用户信息管理页面
  • 管理员图书信息管理页面
图5.5管理员图书信息管理页面
  • 读者登录页面
图5.6读者登录页面
  • 读者二级页面
图5.7读者二级页面
  • 读者借阅系统页面
图5.8读者借阅系统页面
## 6、源代码

希望对各位有所帮助

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include<windows.h>
#define S 100
struct book//图书信息
{
    char num[20],nam[20],aut[20],pub[20];
    int  digit;
    float price;
    struct book*next;
};
struct land//管理员登录信息
{
    int username;
    char password[20];
};
struct mm//修改密码
{
    int username1;
    char mima[20];
};
struct sc//删除用户账号
{
    int username1;
    char mima1[20];
    struct sc *next;
};
struct dz//读者信息
{
    int xuehao;
    char mingzi[20];
    char riqi[20];
    char shuming[20];
    struct dz *next;
};
void xiugai();//修改密码
void glmenu();//显示管理员菜单
void glmain();//管理界面菜单
void usermain();//用户信息管理
void usermenu();//用户信息菜单
void tsmain();//管理员图书信息管理
void tsmenu();//管理员图书信息菜单
void tsmenu1();//用户图书信息菜单
void find();//管理员查询图书
void find1();//用户查询图书
void add();//增加图书
void Delete();//删除图书
void dzjy();//浏览读者借阅信息
void borrow1();//借阅图书
void change();//修改图书信息
void Return1();//归还图书
void land();//用户登陆
void gland();//管理员登录
void xinjian();//创建普通用户账号密码
void sczh();//删除普通读者账号
void xgmm();//修改密码
void lmain();//登录界面函数
void cksj();//管理员浏览全部图书信息
void cksj1();//用户浏览全部图书信息
void gllmain();//用户信息管理
void gllmenu();//图书信息管理
int main()
{
    lmain();
    return 0;
}
int tjzs()//统计图书文本个数
{
    FILE *fp;
    int many=0,n;
    float tprice=0;
    char tname[20],tauthor[20],tchuban[20],tshuhao[20];
    fp=fopen("library.txt","r");//打开文件
    for (n=0; !feof(fp); n++) //逐个读文件
        fscanf(fp,"%s%s%s%s%d%f",tshuhao,tname,tauthor,tchuban,&many,&tprice);
    n--;
    fclose(fp);//关闭文件
    return (n);//返回个数
}
int tjzs1()//统计文读者本个数函数
{
FILE *fp;
int username=0,n;
char mingzi[20],riqi[20],zname[20];
fp=fopen("reader.txt","r");//打开文件
for (n=0;!feof(fp);n++)//逐个读文件
fscanf(fp,"%d%s%s%s ",&username,&mingzi,&riqi,&zname);
n--;
fclose(fp);//关闭文件
return (n);//返回个数
}
int tjzs3()//统计普通用户账号密码文本个数
{
    FILE *fp;
    int zhao=0,n;
    char mm[20];
    fp=fopen("land.txt","r");//打开文件
    for (n=0; !feof(fp); n++) //逐个读文件
        fscanf(fp,"%d %s",&zhao,mm);
    n--;
    fclose(fp);//关闭文件
    return (n);//返回个数
}
int tjzs2()//统计管理员账号密码文本个数
{
    FILE *fp;
    int zhang=0,n;
    char mima[20];
    fp=fopen("gland.txt","r");//打开文件
    for (n = 0; !feof(fp); n++) //逐个读文件
        fscanf(fp,"%d %s",&zhang,mima);
    fclose(fp);//关闭文件
    return n;//返回个数
}
void lmain()//登录页面函数
{
    char choose;
    lmenu();
    printf("\n");
    scanf("%c",&choose);
    switch(choose)//功能函数
    {
    case'1':
            gland();
        break;
    case'2':
            land();
        break;
    case'3':
            system("cls");
        exit(0);
        break;
    }
}
void glmenu()//主菜单
{
    system ("cls");
    printf("**************************************************");
    printf("\n\n 1.用户信息管理\n\n");
    printf("\n\n 2.图书信息管理\n\n");
    printf("\n\n 3.返回上一层\n\n");
    printf("*************************************************\n");
    return 0;
}
void usermenu()//主菜单
{
    system ("cls");
    printf("**************************************************");
    printf("\n\n 1.用户修改密码\n\n");
    printf("\n\n 2.借阅系统管理\n\n");
    printf("\n\n 3.返回上一层\n\n");
    printf("*************************************************\n");
    return 0;
}
void gllmenu()
{
    system("cls");
    printf("**************************************************");
    printf("\n\n 1.创建普通读者账号\n\n");
    printf("\n\n 2.删除普通读者账号\n\n");
    printf("\n\n 3.返回上一层\n\n");
    printf("*************************************************\n");
    return 0;
}
void tsmenu()
{
    system("cls");
    printf("**************************************************");
    printf("\n 1.添加图书\n\n");
    printf("\n 2.删除图书\n\n");
    printf("\n 3.浏览图书\n\n");
    printf("\n 4.修改图书\n\n");
    printf("\n 5.查询图书\n\n");
    printf("\n 6.浏览读者借阅\n\n");
    printf("\n 7.返回上一层\n\n");
    printf("*************************************************\n");
    return 0;
}
void lmenu()//显示登录菜单
{
    printf("\n\n\t    欢迎使用图书信息管理系统\n\n");
    printf("**********************************************");
    printf("\n\n\t\t1.图书管理员处理系统\n\n");
    printf("\n\n\t\t2.普通读者管理系统\n\n");
    printf("\n\n\t\t3.退出系统\n\n");
    printf("\n\n\t    请按键选择,回车确定\n");
    printf("**********************************************");
    return ;
}
void tsmenu1()
{
    system("cls");
    printf("**************************************************");
    printf("\n 1.浏览图书\n\n");
    printf("\n 2.借阅图书\n\n");
    printf("\n 3.归还图书\n\n");
    printf("\n 4.查询图书\n\n");
    printf("\n 5.返回上一层\n\n");
    printf("*************************************************\n");
    return 0;
}
void gllmain()
{
    char choose;
    gllmenu();
    getchar();
    scanf(" %c",&choose);
    switch(choose)//功能函数
    {
    case'1':
            xinjian();
        break;
    case'2':
            sczh();
        break;
    case'3':
            glmain();
        break;
    }
}
void tsmain()
{
    char choose;
    tsmenu();
    getchar();
    scanf(" %c",&choose);
    switch(choose)//功能函数
    {
    case'1':
            add();
        break;
    case'2':
            Delete();
        break;
    case'3':
            cksj();
        break;
    case'4':
            change();
        break;
    case'5':
            find();
        break;
    case'6':
            dzjy();
            break;
    case'7':
        glmain();
        break;
    }
}
void glmain()
{
    char choose;
    glmenu();
    scanf(" %c",&choose);
    switch(choose)//功能函数
    {
    case'1':
            gllmain();
        break;
    case'2':
            tsmain();
        break;
    case'3':
            system("cls");
        getchar();
        lmain();
        break;
    }
}
void usermain()
{
    char choose;
    usermenu();
    scanf(" %c",&choose);
    switch(choose)//功能函数
    {
    case'1':
            xgmm();
        break;
    case'2':
            tsmain1();
        break;
    case'3':
            system("cls");
        getchar();
        lmain();
        break;
    }
}
void tsmain1()
{
    char choose;
    tsmenu1();
    getchar();
    scanf("%c",&choose);
    switch(choose)//功能函数
    {
    case'1':
            cksj1();
        break;
    case'2':
            borrow1();
        break;
    case'3':
            Return1();
        break;
    case'4':
            find1();
        break;
    case'5':
            usermain();
    }
}
void gland()
{
    system("cls");
    FILE*fp;
    struct land s[S];
    int i,N=0,j;
    int zhanghao,flag=0;
    char mima[20];
    int K=0;
    if((fp = fopen("gland.txt","r"))==NULL)
    {
        printf("File open error!\n");
        exit(0);
    }
    K = tjzs2();
    for(; !feof(fp);)
    {
        fscanf(fp,"%d %s",&s[N].username,s[N].password);
        N++;
    }
    fclose(fp);
    printf("请输入管理员账号:\n");
    scanf("%d",&zhanghao);
    printf("请输入密码:\n");
    scanf("%s",&mima);
    getchar();
    for(i=0; i<K; i++)
    {
        if(zhanghao==s[i].username)
        {
            if(strcmp(s[i].password,mima)==0)
            {
                printf("登录成功\n");
                system("cls");
                glmain();
                flag=1;
                break;
            }
        }
    }
    if(flag==0)
    {
        printf("账号或密码错误\n");
        Sleep(2000);
        system("cls");
        lmain();
    }
}
void xinjian()
{
    FILE *fp;
    int zhanghao,flag=0;
    char password[20],password1[20];
    char hit=0;
    if ((fp=fopen("land.txt","r"))==NULL)
    {
        printf("File open error!\n");
        exit(0);
    }
    system("cls");
    fp=fopen("land.txt","a");
    for(;;)
    {
        printf("\n请按以下格式输入账户:\n学号 密码\n");
        printf("请输入:");
        scanf("%d %s",&zhanghao,password);
        printf("再次输入密码:\n");
        scanf("%s",password1);
        if(strcmp(password,password1)==0)
        {
            flag=1;
            fprintf(fp,"%d %s\n",zhanghao,password);
            break;
        }
        else
        {
            printf("两次输入密码不一致,请重新操作\n");
            for(; hit!=13&&hit!=27;)
            hit=getch();
            if(hit=27){
                system("cls");
            gllmain();
            }
            if(hit=13)
            {
            system("cls");
                xinjian();
            }
        }
    }
    fclose(fp);
    printf("创建成功,按任意键返回");
    getch();
    system("cls");
    gllmain();
}
void sczh()
{
    struct sc *head=NULL;
    struct sc *p,*p1,*p2;
    int zhanghao,username;
    char mima[20];
    char i,j,k,n=0;
    FILE *fp;
    if ((fp=fopen("land.txt","r"))==NULL)//打开文件
    {
        system ("cls");
        printf("File open error\n");
        getch();
    }
    else
    {
        system ("cls");
        printf("\n请输入你要删除的账号:");//输入删除账号
        scanf("%d",&zhanghao);
        printf("\n确认删除请回车,取消请按Esc\n");
        i=getch();
        for(; i!=13&&i!=27;)
            i=getch();
        if (i==27)
            gllmain();
        fp=fopen("land.txt","r");
        j=tjzs3();
        for (k=0; k<j; k++)
        {
            fscanf(fp,"%d %s",&username,mima);
            if (zhanghao!=username)
            {
                n++;
                if (n==1)
                {
                    p1=p2=(struct sc*)malloc(sizeof(struct sc));
                    head=p1;
                }
                else
                {
                    p2->next=p1;
                    p2=p1;
                    p1=(struct sc*)malloc(sizeof(struct sc));//新建链表
                }

                strcpy(p1->mima1,mima);
                p1->username1=username;
            }
        }
        if (n==0)
        {
            head=NULL;
        }
        else
        {
            p2->next=p1;
            p1->next=NULL;
            fclose(fp);
        }
    }
    fp=fopen("land.txt","w");//清空文件,只写打开,然后关闭
    fclose(fp);
    fp=fopen("land.txt","a");//追加文件
    p=head;
    for (; p!=NULL;) //把链表内容覆盖到文件
    {
        fprintf(fp,"%-4d  %-5s\n",p->username1,p->mima1);
        p=p->next;
    }
    fclose(fp);
    system ("cls");
    printf("\n删除成功 \n按任意键返回上一层\n");
    getch();
    gllmain();
}
void add()
{
    FILE*fp;
    char i;
    int digit=0;
    float price=0;
    char  nam[20],aut[20],pub[20],num[20];
    system ("cls");
    if((fp=fopen("library.txt","r"))==NULL)
    {
        printf("File open error!\n");
        exit(0);
    }
    printf("\n请按以下格式输入图书信息:\n书号    书名     作者    出版社     进库量      单价");
    fp = fopen("library.txt","a");
    for(; i!=27;)
    {
        printf("\n请输入:\n");
        scanf("%s%s%s%s%d%f",num,nam,aut,pub,&digit,&price);
        fprintf(fp,"%-8s%-9s%-14s%-16s%-7d%-8.2f\n",num,nam,aut,pub,digit,price);
        printf("结束输入请按ESC\n");
        i=getch();
    }
    fclose(fp);
    printf("\n保存成功,按任意键返回上一层!");
    getch();
    tsmain();
}
void change()
{
    system("cls");
    FILE*fp;
    char a;
    char nume[20],name[20],auth[20],publ[20];
    int digi,flag=0;
    double pri;
    char t[20],g;
    char hit;
    struct book s[S];
    fp=fopen("library.txt","r");
    int i=0;
    if(fp==NULL)
    {
        printf("can't open the file");
        exit(0);
    }
    while(fscanf(fp,"%s %s %s %s %d %f",s[i].num,s[i].nam,s[i].aut,s[i].pub,&s[i].digit,&s[i].price)!=EOF)
        i++;
    int L = tjzs();

    fclose(fp);
    for(int j=0; j<L; j++)
    {
        printf("\n书号:%-10s 书名:%-10s 作者:%-10s  出版社:%-10s 数量:%-5d  价格:%-5.2lf\n",s[j].num,s[j].nam,s[j].aut,s[j].pub,s[j].digit,s[j].price);
    }
    for(;hit!=27;)
    {
    printf("请输入要修改的书号:\n\n");
    scanf(" %s",&t);
    getchar();
    for(int k=0; k<L; k++)
    {
        if(strcmp(t,s[k].num)==0)
        {
            flag=1;
            printf("\t\t1.书号:\n");
            printf("\t\t2.书名:\n");
            printf("\t\t3.作者:\n");
            printf("\t\t4.出版社:\n");
            printf("\t\t5.数量:\n");
            printf("\t\t6.价格:\n");
            printf("请输入要修改的选项:\n");
            scanf("%c",&g);
            getchar();
            switch(g)
            {
            case'1':
                printf("修改后书号:\n");
                scanf("%s",nume);
                strcpy(s[k].num,nume);
                break;
            case'2':
                printf("修改后书名:\n");
                scanf("%s",name);
                strcpy(s[k].nam,name);
                break;
            case'3':
                printf("修改后作者:\n");
                 scanf("%s",auth);
                 strcpy(s[k].aut,auth);
                 break;
            case'4':
                printf("修改后出版社:\n");
                 scanf("%s",publ);
                  strcpy(s[k].pub,publ);
                  break;
            case'5':
                printf("修改后数量:\n");
                scanf("%d",&digi);
                s[k].digit=digi;
                break;
            case'6':
                printf("修改后价格:\n");
                scanf("%lf",&pri);
                s[k].price=pri;
                break;
            }
            printf("图书信息修改完成\n");
     }
    }
        printf("继续输入请按回车,结束输入请按Esc\n");
        hit=getch();//暂停程序当i接收后继续下一条指令
        for (;hit!=13&&hit!=27;)//保证只能是CR和ESC才能退出循环,输入其他字符无用,暂停程序,按'CR'继续。
        hit=getch();
    }
    if(flag==0)
    {
        printf("没有此图书\n");
    }
    int h=0;
    fp = fopen("library.txt","w");
    for(h=0;h<L;h++)
    {
        fprintf(fp,"%-8s%-9s%-14s%-16s%-7d%-8.2f\n",s[h].num,s[h].nam,s[h].aut,s[h].pub,s[h].digit,s[h].price);
    }
    fclose(fp);
    tsmain();
}
void dzjy()
{
    FILE *fp;
    int zhanghao=0,n=0,i=0,j=0;
    char mingzi[20],riqi[20],zname[20];
	if ((fp=fopen("reader.txt","r"))==NULL)//打开读者文件夹
    {
        system ("cls");
        printf("\n记录文件不存在!按任意键返回");
	    getch();
	    tsmain();
    }
    n=tjzs1();
    printf("%d\n",n);
    if (n==0)
	{
	    system ("cls");
	printf("\n无任何记录!");
	}
	fp=fopen("reader.txt","r");
	system ("cls");
	printf("\n证号\t读者姓名\t\t借书日期\t书名\n");
	for (;!feof(fp);)
	{
	fscanf(fp,"%d%s%s%s\n ",&zhanghao,mingzi,riqi,zname);
	printf("\n%-8d%-23s%-18s%-10s\n",zhanghao,mingzi,riqi,zname);
	}
	fclose(fp);
	printf("\n按任意键返回\n");
	getch();
	tsmain();
}
void find()
{
    FILE *fp;
    int k=0,many=0,m=0,n=0;
    float price=0;
    char  nam[20],aut[20],pub[20],num[20];
    char i;
    char chazhao[20];
    for(;i!=27;)
    {
        k=0;
    if ((fp=fopen("library.txt","r"))==NULL)//打开文件
    {
        system ("cls");
        printf("\n记录文件不存在!按任意键返回");
        getch();
        tsmain();
    }
    system("cls");
    printf("请输入书号或书名或作者查询:\n");
    scanf("%s",chazhao);

    m=tjzs();
    for(n=0; n<m; n++)
    {
        fscanf(fp,"%s%s%s%s%d%f",num,nam,aut,pub,&many,&price);
        if(!strcmp(chazhao,num)||!strcmp(chazhao,nam)||!strcmp(chazhao,aut))
        {
            if(k==0)
            {
                printf("查询结果:\n\n");
                printf("书号\t书名\t作者\t\t出版社\t\t现存量\t单价\n");
                printf("%-8s%-9s%-14s%-16s%-7d%-8.2f\n",num,nam,aut,pub,many,price);
                k++;
            }

        }
    }
    if (k==0)//文件夹为空则输出无记录并返回上一层
    {
        system ("cls");
        printf("\n无符合记录!\n");
        getch();
        tsmain();
    }
    fclose(fp);//查询结束
    printf("查询成功,输入回车继续查找,输入ESC结束!\n");
    i = getch();
    for(;i!=27&&i!=13;)
        i = getch();
    }
    tsmain();
}
void Delete()
{
    struct book *head=NULL;
    struct book *p,*p1,*p2;
    int tmany=0,n=0,j,k;
    float tprice=0;
    char  tnam[20],taut[20],tcat[20],tpub[20],tnum[20];
    char jnam[20];
    char i,hit;
    FILE *fp;
    if ((fp=fopen("library.txt","r"))==NULL)//打开文件
    {
        system ("cls");
        printf("\n记录文件不存在!按任意键返回");
        getch();
        tsmain();
    }
    else//实现删除的功能
    {
        system ("cls");
        printf("\n请输入你要删除的书名:");//输入删除图书书名
        scanf("%s",jnam);
        printf("\n确认删除请回车,取消请按Esc\n");
        i=getch();
        for(; i!=13&&i!=27;)
            i=getch();
        if (i==27)
            tsmain();
        fp=fopen("library.txt","r");
        j=tjzs();
        for (k=0; k<j; k++)
        {
            fscanf(fp,"%s%s%s%s%d%f",tnum,tnam,taut,tpub,&tmany,&tprice);
            if (strcmp(jnam,tnam)!=0)//比较名字,将不同名字的信息复制到链表
            {
                n++;
                if (n==1)//建立链表
                {
                    p1=p2=(struct book*)malloc(sizeof(struct book));
                    head=p1;
                }
                else
                {
                    p2->next=p1;
                    p2=p1;
                    p1=(struct book*)malloc(sizeof(struct book));//新建链表
                }

                strcpy(p1->num,tnum);//复制书号
                strcpy(p1->nam,tnam);//复制书名
                strcpy(p1->aut,taut);//复制作者名字
                strcpy(p1->pub,tpub);//复制出版社
                p1->digit=tmany;//复制个数
                p1->price=tprice;//复制单价
            }
        }
        if (n==0)
        {
            head=NULL;
        }
        else
        {
            p2->next=p1;
            p1->next=NULL;
            fclose(fp);
        }
    }
    fp=fopen("library.txt","w");//清空文件,只写打开,然后关闭
    fclose(fp);
    fp=fopen("library.txt","a");//追加文件
    p=head;
    for (; p!=NULL;) //把链表内容覆盖到文件
    {
        fprintf(fp,"%-8s%-9s%-14s%-16s%-7d%-8.2f\n",p->num,p->nam,p->aut,p->pub,p->digit,p->price);
        p=p->next;
    }
    fclose(fp);
    printf("\n删除成功,按任意键返回上一层\n");
    getch();
    tsmain();
}
void land()
{
    int zhanghao;
    char password[20];
    int i=2,j,k,n;
    char hit=0;
    system("cls");
    do
    {
        printf("\n请输入账号:\n");
        scanf("%d",&zhanghao);
        printf("确认输入请按回车,重新输入请按ESC");
        hit=getch();//暂停程序,当hit接受后继续
        for (; hit!=13&&hit!=27;)//保证只有输入CR或ESC
        {
            hit=getch();
        }
    }
    while(hit==27);
    printf("\n请输入密码:\n");
    scanf("%s",password);
    getchar();
    i=match(zhanghao,password);
    if(i==1)
    {
        printf("登陆成功!按任意键继续");
        getch();
        usermain();
    }
    else
    {
        if(i==-1)
        {
            printf("密码错误!");
            getch();
            land();
        }
        if(i==0)
            printf("不存在此用户");
        getch();
        system("cls");
        lmain();
    }
}
void xgmm()
{
    system("cls");
    FILE*fp;
    struct mm s[100];
    int i=0,j,k,m=0;
    int username,flag=0;
    char password[20],mima1[20],mima2[20];
    if((fp = fopen("land.txt","r"))==NULL)
    {
        printf("还未注册,请注册\n");
        fp = fopen("land.txt","w");
        getchar();
        system("cls");
        lmain();
    }
    fp = fopen("land.txt","r");
    printf("请输入账号:\n");
    scanf("%d",&username);
    printf("请输入密码:\n");
    scanf("%s",password);
    getchar();
    m=tjzs3();
    for(; !feof(fp);)
    {
        fscanf(fp,"%d %s",&s[i].username1,s[i].mima);
        i++;
    }
    for(k=0; k<m; k++)
    {
        if(username==s[k].username1)
        {
            flag=1;
            if(strcmp(password,s[k].mima)==0)
            {
                flag=2;
                printf("请输入新密码:\n");
                scanf("%s",mima1);
                printf("请再次输入新密码:\n");
                scanf("%s",mima2);
                if(strcmp(mima1,mima2)==0)
                {
                strcpy(s[k].mima,mima1);
                printf("修改密码成功!\n");
                Sleep(2000);
                system("cls");
                }
                else
                {
                    printf("两次密码输入不一致,按任意键退出!\n");
                    getch();
                    usermain();
                    system("cls");
                }
            }
        }
    }
    if(flag==0)
    {
        printf("此用户尚未注册,请注册\n");
        Sleep(3000);
    }
    if(flag==1)
    {
        printf("输入密码错误,请重新进入\n");
        Sleep(3000);
    }
    fp = fopen("land.txt","w");
    for(j=0; j<m; j++)
    {
        fprintf(fp,"%d %s\n",s[j].username1,s[j].mima);
    }
    fclose(fp);
    system("cls");
    usermain();
}
int match(int m,char a[20])//匹配数据库中的账号密码
{
    FILE*fp;
    int n=0,i=0;
    int username;
    char password[20];

    if ((fp=fopen("land.txt","r"))==NULL)
    {
        system ("cls");
        printf("\n 不存在此用户!请新建账户");
        getch();
        system("cls");
        lmain();
    }
    for(; !feof(fp);)
    {
        fscanf(fp,"%d%s",&username,password);
        if(m==username)
        {
            if(strcmp(a,password)==0)
                return 1;
            else
            {
                return -1;
            }
        }
    }
    return 0;
}
void cksj()
{
    FILE *fp;
    int n=0;
    int k=0,m=0,many=0;
    float price=0;
    char  nam[20],aut[20],pub[20],num[20];
    char i;
    if ((fp=fopen("library.txt","r"))==NULL)//打开文件
    {
        system ("cls");
        printf("\n记录文件不存在!按任意键返回");
        getch();//返回
        tsmain();
    }
    n= tjzs();
    if (n==0)
    {
        system ("cls");
        printf("\n无任何记录!");
    }

    fp=fopen("library.txt","r");//打开只读文件
    system ("cls");
    printf("书号\t书名\t 作者\t\t出版社\t\t库存量\t单价\n");

    for (m=0; m<n; m++) //输出数据
    {
        fscanf(fp,"%s%s%s%s%d%f",num,nam,aut,pub,&many,&price);
        printf("%-8s%-9s%-14s%-18s%-7d%-8.2f\n",num,nam,aut,pub,many,price);
    }
    fclose(fp);
    printf("\n按任意键返回\n");
    getch();
    tsmain();
}
void find1()
{
    FILE *fp;
    int k=0,many=0,m=0,n=0;
    float price=0;
    char  nam[20],aut[20],pub[20],num[20];
    char i;
    char chazhao[20];
    system("cls");
    for(;i!=27;)
    {
        k=0;
    if ((fp=fopen("library.txt","r"))==NULL)//打开文件
    {
        system ("cls");
        printf("\n记录文件不存在!按任意键返回");
        getch();
        tsmain();
    }
    system("cls");
    printf("请输入书号,书名,作者查询:\n");
    scanf("%s",chazhao);
    system ("cls");
    m=tjzs();
    for(n=0; n<m; n++)
    {
        fscanf(fp,"%s%s%s%s%d%f",num,nam,aut,pub,&many,&price);
        if(!strcmp(chazhao,num)||!strcmp(chazhao,nam)||!strcmp(chazhao,aut))
        {
            if(k==0)
            {
                printf("查询结果:\n\n");
                printf("书号\t书名\t作者\t\t出版社\t\t现存量\t单价\n");
                printf("%-8s%-9s%-14s%-16s%-7d%-8.2f\n",num,nam,aut,pub,many,price);
                k++;
                fclose(fp);
            }

        }
    }
    if (k==0)
    {
        system ("cls");
        printf("\n无符合记录!按任意键退出\n");
        getch();
        tsmain1();
    }
    printf("查询完成,按ESC退出查询,按回车继续查询\n");
    i = getch();
    for(;i!=27&&i!=13;)
        i = getch();
    }
    tsmain1();
}
void cksj1()
{
    FILE *fp;
    int n=0;
    int k=0,m=0,many=0;
    float price=0;
    char  nam[20],aut[20],pub[20],num[20];
    char i;
    if ((fp=fopen("library.txt","r"))==NULL)//打开文件
    {
        system ("cls");
        printf("\n记录文件不存在!按任意键返回");
        getch();//返回
        tsmain1();
    }
    n= tjzs();
    if (n==0)
    {
        system ("cls");
        printf("\n无任何记录!");
    }

    fp=fopen("library.txt","r");//打开只读文件
    system ("cls");
    printf("书号\t书名\t 作者\t\t出版社\t\t库存量\t单价\n");

    for (m=0; m<n; m++) //输出数据
    {
        fscanf(fp,"%s%s%s%s%d%f",num,nam,aut,pub,&many,&price);
        printf("%-8s%-9s%-14s%-18s%-7d%-8.2f\n",num,nam,aut,pub,many,price);
    }
    fclose(fp);
    printf("\n按任意键返回\n");
    getch();
    tsmain1();
}
void borrow1()
{
    FILE *fp,*fp3;
    struct book *head=NULL;
    struct book *p,*p1,*p2;
    int i,loop,k,n=0,flag=0,s=0;
    int jnum=0;
    int many=0;
    float tprice=0;
    char tname[20],tauthor[20],tchuban[20],tshuhao[20],ttname[20],mingzi[20],riqi[20],zname[20];
    char hit=0;
    system("cls");
    if((fp=fopen("library.txt","r"))==NULL)
    {
        system("cls");
        printf("\n 图书馆无库存!按任意键退出!");
        getch();
        exit(0);
    }
    else
    {
        printf("\n请输入借阅书名:\n请输入:");
        scanf("%s",zname);
        k= tjzs();//统计图书馆文件个数
        for (i=0; i<k; i++) //先将图书信息建立链表,更改库存
        {
            fscanf(fp,"%s%s%s%s%d%f",tshuhao,tname,tauthor,tchuban,&many,&tprice);
            n++;
            if(n==1)
            {
                p1=p2=(struct book*)malloc(sizeof(struct book));
                head=p1;
            }
            else
            {
                p2->next=p1;
                p2=p1;
                p1=(struct book*)malloc(sizeof(struct book));

            }
            strcpy(p1->num,tshuhao);//复制书号
            strcpy(p1->nam,tname);//复制书名
            strcpy(p1->aut,tauthor);//复制作者
            strcpy(p1->pub,tchuban);//复制出版社
            p1->digit=many;//复制现存量
            p1->price=tprice;//复制单价
        }
        if(n==0)
            head=NULL;
        else
        {
            p2->next=p1;
            p1->next=NULL;
            fclose(fp);
        }

    }
    p=head;

    for (; p!=NULL;)
    {
        if(!(strcmp(p->nam,zname)))
        {

            flag=1;
            loop=p->digit;
            (p->digit)--;
        }
        p=p->next;
    }
    if(flag&&(loop>0))
    {

        fp=fopen("library.txt","w");
        fclose(fp);
        fp=fopen("library.txt","a");
        p=head;

        for(; p !=NULL;)
        {
            fprintf(fp,"%-8s%-9s%-14s%-16s%-7d%-8.2f\n",p->num,p->nam,p->aut,p->pub,p->digit,p->price);
            p=p->next;
        }
        free(p);
        fclose(fp);

        if ((fp3=fopen("reader.txt","r"))==NULL)//建读者文件夹存入借书信息
        {
            fp3=fopen("reader.txt","w");//打开只读文件
            fclose(fp3);
        }
        fp3=fopen("reader.txt","a");

        printf("\n请按以下格式输入读者信息:\n 证号 姓名 借书日期 借书书名\n请输入:");//录入读者信息
        scanf("%d %s %s %s",&jnum,mingzi,riqi,zname);
        fprintf(fp3,"\n%-18d%-23s%-18s%-10s\n",jnum,mingzi,riqi,zname);
        fclose(fp3);
        printf("借书成功!请两个月内归还!!!按任意键返回\n");
        getch();//返回
        tsmain1();//调用借阅系统
    }
    else
    {
        if(flag!=0)
            printf("此书已被借完!按任意键返回!");//否则输出此书已被借完
        else
            printf("查找无此书!按任意键返回");
    }
    getch();//返回
    tsmain1();//调用借阅系统
}
void Return1()
{
    system("cls");
    FILE *fp,*fp1;
    int M=0;
    int i=0,flag=0,j=0,k=0,n=0;
    struct book s[100];
    struct dz *head=NULL;
    struct dz *p,*p1,*p2;
    char name[20];
    int H=tjzs(),G=tjzs1();
	 int txuehao=0,ttxuehao;
	 char tmingzi[20],triqi[20],tshuming[20],ttshuming[20];
	 char hitkey=0;
    if((fp=fopen("reader.txt","r"))==NULL)
    {
        printf("不存在用户信息");
        exit(0);
        system("cls");
        tsmain1();
    }
    printf("请输入读者学号及书名\n");
    scanf("%d %s",&ttxuehao,ttshuming);
    fp = fopen("reader.txt","r");
    for(;!feof(fp);)
    {
        fscanf(fp,"%d%s%s%s",&txuehao,tmingzi,triqi,tshuming);
        if((txuehao==ttxuehao)&&strcmp(ttshuming,tshuming)==0)
        {
            flag=1;
            fclose(fp);
            break;
        }
    }
    if(flag==1)
    {
        fp1 = fopen("library.txt","r");
        for(;!feof(fp1);)
        {
            fscanf(fp,"%s%s%s%s%d%f\n",s[M].num,s[M].nam,s[M].aut,s[M].pub,&s[M].digit,&s[M].price);
            M++;
        }

        for(i=0;i<H;i++)
        {
        if(strcmp(ttshuming,s[i].nam)==0)
        {
            s[i].digit++;
            fclose(fp1);
            break;
        }
        }
        fp1 = fopen("library.txt","w");
        for(j=0;j<H;j++)
            fprintf(fp1,"%-8s%-9s%-14s%-16s%-7d%-8.2f\n",s[j].num,s[j].nam,s[j].aut,s[j].pub,s[j].digit,s[j].price);
        fclose(fp1);
        fp  = fopen("reader.txt","r");
        for (k=0; k<G; k++)
        {

            fscanf(fp,"%d%s%s%s",&txuehao,tmingzi,triqi,tshuming);
            if (strcmp(ttshuming,tshuming)!=0)//比较名字,将不同名字的信息复制到链表
            {
                n++;
                if (n==1)//建立链表
                {
                    p1=p2=(struct dz*)malloc(sizeof(struct dz));
                    head=p1;
                }
                else
                {
                    p2->next=p1;
                    p2=p1;
                    p1=(struct dz*)malloc(sizeof(struct dz));//新建链表
                }

                strcpy(p1->mingzi,tmingzi);//复制借书名
                strcpy(p1->riqi,triqi);//复制日期
                strcpy(p1->shuming,tshuming);//复制书名
                p1->xuehao=txuehao;//复制单价
            }
        }
        if (n==0)
        {
            head=NULL;
        }
        else
        {
            p2->next=p1;
            p1->next=NULL;
            fclose(fp);
        }
    fp=fopen("reader.txt","w");//清空文件,只写打开,然后关闭
    fclose(fp);
    fp=fopen("reader.txt","a");//追加文件
    p=head;
    for (; p!=NULL;) //把链表内容覆盖到文件
    {
        fprintf(fp,"%-8d%-23s%-18s%-10s\n",p->xuehao,p->mingzi,p->riqi,p->shuming);
        p=p->next;
    }
    fclose(fp);
    printf("还书成功!按任意键退出");
    getch();
    system("cls");
    tsmain1();
    }
    if(flag==0)
    {
        printf("还书失败,请重新操作!\n");
        Sleep(2000);
        system("cls");
        tsmain1();
    }

}

  • 27
    点赞
  • 140
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Redamancy_WC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值