辽宁大学软件工程C语言课设-图书馆图书管理系统

library.h

#define RMAX 40
typedef struct bookinfo
{
    int bookId;
    char name[20];
    double price;
    char borrowed;//Y or N
    char author[20];
    int readerID;
    struct bookinfo *next;
}Book;
typedef struct readerinfo
{
    //读者(读者编号,读者姓名,性别,年龄, 所在系,已借书数);
    int id;
    char name[20];
    char sex;//F or M
    int age;
    char profess[80];
    int borrowedNumb;
}Reader;
//主菜单
void linkInit();
void inputError();
//图书查询模块
void queryBookInfo();
//图书管理模块
void manageBookInfo();
//读者管理模块
void manageReaderInfo(); 
//借书模块 
void borrowBooks();
//还书模块
void returnBooks();
//系统管理模块
void manageSystem(); 

main.c

#include
#include
#include"library.h"

Book *head;
Reader reader[RMAX];
int num=0;
void esc()
{
    char choose;
    system("cls");
    printf("\n\n是否导出全部数据::");
    getchar();
    scanf("%c",&choose);
    if(choose=='Y')exportAll();
}

int main()
{
    linkInit();
    while(1)
    {
        int choose;
        //绘制菜单
        system("cls");
        printf("\n\n\t\t     图书借阅管理信息系统\n");
        printf("\t----------------------------------------------\n");
        printf("\t\t\t1.图书信息查询\n\n");
        printf("\t\t\t2.图书信息管理\n\n");
        printf("\t\t\t3.读者信息管理\n\n");
        printf("\t\t\t4.借        书\n\n");
        printf("\t\t\t5.还        书\n\n");
        printf("\t\t\t6.系 统  管 理\n\n");
        printf("\t\t\t0.退 出  系 统\n");
        printf("\t----------------------------------------------\n");
        printf("\n\n\t请选择您想使用的功能<0-6>:");

        //选择功能
        scanf("%d",&choose);
        switch(choose)
        {
        case 1:queryBookInfo(head);break;
        case 2:manageBookInfo();break;
        case 3:manageReaderInfo();break;
        case 4:borrowBooks();break;
        case 5:returnBooks();break;
        case 6:manageSystem();break;
        case 0:esc();return 0;break;
        default:inputError();break;
        }
    }

    return 0;
}

void linkInit()
{
    Book *body1,*body2,*body3;

    head=(Book*)malloc(sizeof(Book));
    head->next=NULL;

    //测试数据



}


void inputError()
{
    printf("\n\t您输入的不是正确的序号,");
    system("PAUSE");
}

ManageBookInfo.c

#include"library.h"
extern struct bookinfo *head;

static void sort()
{
    printf("\n\n\t\t任选功能暂不开发,");
    system("pause");
}
static void deldate()
{
    struct bookinfo *link,*body;
    int numb;
    char choose; 

    link=head;
    system("cls");

    printf("\n\n\t\t输入需要删除的图书编号:");
    scanf("%d",&numb);
    while(link->next!=0)
    {
        body=link; 
        link=link->next;
        if(link->bookId==numb)
        {
            system("cls");
            printf("\t\t  原书信息\n");
            printf("\t\t****************\n");
            printf("\t\t图书编号:%d\n",link->bookId);
            printf("\t\t书    名:%s\n",link->name);
            printf("\t\t单    价:%.2lf\n",link->price);
            printf("\t\t作    者:%s\n",link->author);
            printf("\t\t是否借出:%c\n",link->borrowed);
            printf("\t\t读者编号:%d\n",link->readerID);
            printf("\t\t****************\n\n");

            printf("\t\t确认删除(输入Y确认删除,其他字符视为放弃):"); 
            getchar(); 
            scanf("%c",&choose);
            if(choose=='Y')
            {
                body->next=0;
                free(link);
                printf("\n\n\t\t删除成功,");
                system("pause");
                return; 
            }
            return;
        }

    }
    printf("\n\t\t未找到该图书,");
    system("pause"); 
}
static void update()
{
    struct bookinfo *link,*body;
    int numb,newid;

    link=head;
    system("cls");

    printf("\n\n\t\t输入需要更改的图书编号:");
    scanf("%d",&numb);
    while(link->next!=0)
    {
        link=link->next;
        if(link->bookId==numb)
        {
            system("cls");
            printf("\t\t  原书信息\n");
            printf("\t\t****************\n");
            printf("\t\t图书编号:%d\n",link->bookId);
            printf("\t\t书    名:%s\n",link->name);
            printf("\t\t单    价:%.2lf\n",link->price);
            printf("\t\t作    者:%s\n",link->author);
            printf("\t\t是否借出:%c\n",link->borrowed);
            printf("\t\t读者编号:%d\n",link->readerID);
            printf("\t\t****************\n\n");

            printf("\t\t图书编号(非正数视为放弃):"); 
            scanf("%d",&newid);
            if(newid<=0)
            {
                return; 
            }
            link->bookId=newid;
            printf("\t\t书    名:"); 
            getchar();
            gets(link->name);
            printf("\t\t单    价:"); 
            scanf("%lf",&link->price);
            printf("\t\t作    者:"); 
            getchar();
            gets(link->author);
            return;
        }

    }
    printf("\n\t\t未找到该图书,");
    system("pause"); 
}
static void add()
{
    struct bookinfo *link,*body;
    link=head;
    while(link->next!=0)
    {
            link=link->next;
    }

    system("cls");
    printf("\n\n\t\t输入图书信息(图书编号为非正数则结束)\n\n");
    while(1)
    {
        body=(Book*)malloc(sizeof(Book));
        printf("\t\t图书编号:"); 
        scanf("%d",&body->bookId);
        if(body->bookId<=0)
        {
            free(body);
            break;
        }
        printf("\t\t书    名:"); 
        getchar();
        gets(body->name);
        printf("\t\t单    价:"); 
        scanf("%lf",&body->price);
        printf("\t\t作    者:"); 
        getchar();
        gets(body->author);
        body->next=0;
        body->borrowed='N';
        body->readerID=0;
        link->next=body;
        link=body;
        printf("\n\n\t\t****************************\n\n"); 
    }



}
static void show()
{
    struct bookinfo *link;
    system("cls");
    printf("------------------------------图 书 信 息--------------------------------------\n\n");
    printf("图书编号\t书名\t\t单价\t作者\t\t是否借出\t读者编号\n\n");

    link=head;
    while(link->next!=0)
    {
            link=link->next;
            printf("%d\t\t%s\t\t%.2lf\t%s\t\t%c\t\t%d\n\n",link->bookId,link->name,link->price,link->author,link->borrowed,link->readerID);
    }
    system("pause");
}

void manageBookInfo()
{
    while(1)
    {
        int choose;
        //绘制菜单
        system("cls");
        printf("\n\n\t\t         图 书 信 息 管 理\n");
        printf("\t----------------------------------------------\n");
        printf("\t\t\t1.浏览所有图书信息\n\n");
        printf("\t\t\t2.新  增    图  书\n\n");
        printf("\t\t\t3.修 改 图 书 信息\n\n");
        printf("\t\t\t4.删 除 图 书 信息\n\n");
        printf("\t\t\t5.排            序\n\n");
        printf("\t\t\t0.返回 上一级 菜单\n");
        printf("\t----------------------------------------------\n");
        printf("\n\n\t请选择您想使用的功能<0-5>:");

        //选择功能
        scanf("%d",&choose);
        switch(choose)
        {
        case 1:show();break;
        case 2:add();break;
        case 3:update();break;
        case 4:deldate();break;
        case 5:break;
        case 0:return;break;
        default:inputError();break;
        }
    }

}

ManageReaderInfo.c

#include"library.h"
extern Reader reader[RMAX];
extern int num;

static void sort()
{
    printf("\n\n\t\t任选功能暂不开发,");
    system("pause");
}
static void deldate()
{
    int i,j,temp;
    Reader newReader;
    char choose;

    system("cls");
    printf("\n\n\t\t输入需要删除的读者编号:");
    scanf("%D",&temp);
    for(i=0;iif(reader[i].id==temp)
        {
            printf("\n\t\t读者编号:%d",reader[i].id);
            printf("\n\t\t读 者 名:%s",reader[i].name);
            printf("\n\t\t年    龄:%d",reader[i].age);
            printf("\n\t\t性别:%c",reader[i].sex);
            printf("\n\t\t所 在 系:%s",reader[i].profess);
            getchar();
            printf("\n\n\t\t确认删除(输入Y确认,其他字符视为放弃):");
            scanf("%c",&choose);
            if(choose=='Y')
            {
                for(j=i;j1;j++);
                {
                    reader[j]=reader[j+1];
                }
                num--;
            }
            break;

        }
    }
    if(i==num)
    {
        printf("\n\t\t错误:该读者不存在!\n");
        printf("\t\t");
        system("pause");
    }


}
static void update()
{
    int i,temp;
    Reader newReader;
    char choose;

    system("cls");
    printf("\n\n\t\t输入需要更改的读者编号:");
    scanf("%D",&temp);
    for(i=0;iif(reader[i].id==temp)
        {
            printf("\n\t\t读者编号:%d",reader[i].id);
            printf("\n\t\t读 者 名:%s",reader[i].name);
            printf("\n\t\t年    龄:%d",reader[i].age);
            printf("\n\t\t性别:%c",reader[i].sex);
            printf("\n\t\t所 在 系:%s",reader[i].profess);
            printf("\n\n\t**************(新读者编号为非正数视为放弃)*************");

            printf("\n\n\t\t读者编号:"); 
            scanf("%d",&newReader.id);
            if(newReader.id<=0)
            {
                return;
            }
            printf("\t\t读 者 名:"); 
            getchar();
            gets(newReader.name);
            printf("\t\t年    龄:"); 
            scanf("%d",&newReader.age);
            printf("\t\t性别:"); 
            getchar();
            scanf("%c",&newReader.sex);
            printf("\t\t所 在 系:"); 
            getchar();
            gets(newReader.profess);
            newReader.borrowedNumb=0;
            printf("\n\t\t确认更改(输入Y确认,其他字符视为放弃):");
            scanf("%c",&choose);
            if(choose=='Y')
            {
                reader[i]=newReader;
            }
            break;

        }
    }
    if(i==num)
    {
        printf("\n\t\t错误:该读者不存在!\n");
        printf("\t\t");system("pause");
    }


}
static void add()
{
    Reader newReader;

    system("cls");
    printf("\n\n\t\t输入读者信息(读者编号为非正数则结束)\n");
    while(1)
    {
        printf("\n\t\t----------------------------------------\n"); 
        printf("\t\t读者编号:"); 
        scanf("%d",&newReader.id);
        if(newReader.id<=0)
        {
            break;
        }
        printf("\t\t读 者 名:"); 
        getchar();
        gets(newReader.name);
        printf("\t\t年    龄:"); 
        scanf("%d",&newReader.age);
        printf("\t\t性别:"); 
        getchar();
        scanf("%c",&newReader.sex);
        printf("\t\t所 在 系:"); 
        getchar();
        gets(newReader.profess);
        newReader.borrowedNumb=0;
        reader[num++]=newReader;
    }

}
static void show()
{
    int i=0;
    system("cls");
    printf("------------------------------读 者 信 息--------------------------------------\n\n");
    printf("读者编号\t姓名\t性别\t年龄\t所在系\t\t借书数\n");
    for(i=0;iprintf("%d\t\t%s\t%c\t%d\t%s\t\t%d\n",reader[i].id,reader[i].name,reader[i].sex,reader[i].age,reader[i].profess,reader[i].borrowedNumb);
    }
    system("pause");
}

void manageReaderInfo()
{
    while(1)
    {
        int choose;
        //绘制菜单
        system("cls");
        printf("\n\n\t\t         读 者 信 息 管 理\n");
        printf("\t----------------------------------------------\n");
        printf("\t\t\t1.浏览所有读者信息\n\n");
        printf("\t\t\t2.新  增    读  者\n\n");
        printf("\t\t\t3.修 改 读 者 信息\n\n");
        printf("\t\t\t4.删 除 读 者 信息\n\n");
        printf("\t\t\t5.排            序\n\n");
        printf("\t\t\t0.返回 上一级 菜单\n");
        printf("\t----------------------------------------------\n");
        printf("\n\n\t请选择您想使用的功能<0-5>:");

        //选择功能
        scanf("%d",&choose);
        switch(choose)
        {
        case 1:show();break;
        case 2:add();break;
        case 3:update();break;
        case 4:deldate();break;
        case 5:break;
        case 0:return;break;
        default:inputError();break;
        }
    }

}

ManageSystem.c

#include"library.h"
#include
extern Reader reader[RMAX];
extern int num;
extern struct bookinfo *head;
//导出操作
static void exportBook()
{
    FILE *fp;
    Book *link,*last;
    char choose;
    link=head;


    fp=fopen("book.dat","wb");
    while(link->next!=0)
    {
        last=link;
        link=link->next;
        fwrite(link,sizeof(Book),1,fp);
        last->next=link->next;
        free(link);
        link=last;
    }
    fclose(fp);
    num=0;
    system("cls");
    printf("\n\n\t\t图书信息导出成功!\n\n\t\t");
    system("pause");
}
static void exportReader()
{
    FILE *fp;
    int i;
    char choose;

    fp=fopen("reader.dat","wb");
    for(i=0;isizeof(Reader),1,fp);
    }

    fclose(fp);

    system("cls");
    printf("\n\n\t\t读者信息导出成功!\n\n\t\t");
    system("pause");
}
void exportAll()
{
    exportReader();
    exportBook();

}

//导入操作
static void importBook()
{
    FILE *fp;
    Book *link,*body;
    link=head;
    fp=fopen("book.dat","rb");

    while(1)
    {
        body=(Book*)malloc(sizeof(Book));
        fread(body,sizeof(Book),1,fp);
        if(feof(fp))
        {
            free(body);
            break;
        }
        body->next=0;
        link->next=body;
        link=body;

    }

    fclose(fp);
    system("cls");
    printf("\n\n\t\t图书信息导入成功!\n\n\t\t");
    system("pause");
}
static void importReader()
{
    FILE *fp;
    int i;
    char choose;

    fp=fopen("reader.dat","rb");
    num=0;
    for(i=0;isizeof(Reader),1,fp);
        if(feof(fp))break;
        num++;
    }
    system("cls");
    printf("\n\n\t\t读者信息导入成功!\n\n\t\t");
    system("pause");

}
static void importAll()
{
    importReader();
    importBook();

}

//导出菜单
static void export()
{
    while(1)
    {
        int choose;
        //绘制菜单
        system("cls");
        printf("\n\n\t\t         导 出 到 文 件\n");
        printf("\t----------------------------------------------\n");
        printf("\t\t\t1.导 出 图 书 信 息\n\n");
        printf("\t\t\t2.导 出 读 者 信 息\n\n");
        printf("\t\t\t3.导 出 全 部 信 息\n\n");
        printf("\t\t\t0.返 回 上 级 菜 单\n");
        printf("\t----------------------------------------------\n");
        printf("\n\n\t请选择您想使用的功能<0-5>:");

        //选择功能
        scanf("%d",&choose);
        switch(choose)
        {
        case 1:exportBook();break;
        case 2:exportReader();break;
        case 3:exportAll();break;
        case 0:return;break;
        default:inputError();break;
        }
    }
}
//导入菜单
static void import()
{
    while(1)
    {
        int choose;
        //绘制菜单
        system("cls");
        printf("\n\n\t\t         导 入 到 系 统\n");
        printf("\t----------------------------------------------\n");
        printf("\t\t\t1.导 入 图 书 信 息\n\n");
        printf("\t\t\t2.导 入 读 者 信 息\n\n");
        printf("\t\t\t3.导 入 全 部 信 息\n\n");
        printf("\t\t\t0.返 回 上 级 菜 单\n");
        printf("\t----------------------------------------------\n");
        printf("\n\n\t请选择您想使用的功能<0-5>:");

        //选择功能
        scanf("%d",&choose);
        switch(choose)
        {
        case 1:importBook();break;
        case 2:importReader();break;
        case 3:importAll();break;
        case 0:return;break;
        default:inputError();break;
        }
    }
}
void manageSystem()
{
    while(1)
    {
        int choose;
        //绘制菜单
        system("cls");
        printf("\n\n\t\t         系 统 管 理\n");
        printf("\t----------------------------------------------\n");
        printf("\t\t\t1.导 出  到  文 件\n\n");
        printf("\t\t\t2.从 文  件  导 入 \n\n");
        printf("\t\t\t0.返回 上一级 菜单\n");
        printf("\t----------------------------------------------\n");
        printf("\n\n\t请选择您想使用的功能<0-5>:");

        //选择功能
        scanf("%d",&choose);
        switch(choose)
        {
        case 1:export();break;
        case 2:import();break;
        case 0:return;break;
        default:inputError();break;
        }
    }
}

QueryBookInfo.c

#include"library.h"
extern struct bookinfo *head;

static int findstring(char s1[],char s2[])
{
    int i=0,j=0;
    while(s1[i]!='\0')
    {
        if(s2[j]=='\0') return i;
        if(s1[i+j]==s2[j])
        {
            j++;
        }else{
            i++;
            j=0;
        }

    }
    return -1;
}

static void byId()
{
    struct bookinfo *link,*body;
    int numb,count=0,choose;

    link=head;
    system("cls");

    printf("\n\n\t\t输入要查找的图书编号:");
    scanf("%d",&numb);
    while(link->next!=0)
    {
        body=link; 
        link=link->next;
        if(link->bookId==numb)
        {
            count++;
            //system("cls");
            printf("\n\n\t\t  查询结果\n");
            printf("\t\t****************\n");
            printf("\t\t图书编号:%d\n",link->bookId);
            printf("\t\t书    名:%s\n",link->name);
            printf("\t\t单    价:%.2lf\n",link->price);
            printf("\t\t作    者:%s\n",link->author);
            printf("\t\t是否借出:%c\n",link->borrowed);
            printf("\t\t读者编号:%d\n",link->readerID);
            printf("\t\t****************\n\n");
        }

    }
    if(count==0)
    {
        printf("\n\t\t未找到符合要求的图书,");
    }else{
        printf("\n\t\t共找到%d条结果,",count);
    } 
    printf("输入Y继续查找,其他字符视为放弃:");
    getchar();
    scanf("%c",&choose);
    if(choose=='Y') byId();
}
static void byName()
{
    struct bookinfo *link,*body;
    int count=0;
    char name[20],choose; 

    link=head;
    system("cls");
    //fflush(stdin);

    printf("\n\n\t\t输入要查找的书名关键字:");
    getchar();
    gets(name); 
    while(link->next!=0)
    {
        body=link; 
        link=link->next;
        if(findstring(link->name,name)!=-1)
        {
            count++;
            //system("cls");
            printf("\n\n\t\t  查询结果\n");
            printf("\t\t****************\n");
            printf("\t\t图书编号:%d\n",link->bookId);
            printf("\t\t书    名:%s\n",link->name);
            printf("\t\t单    价:%.2lf\n",link->price);
            printf("\t\t作    者:%s\n",link->author);
            printf("\t\t是否借出:%c\n",link->borrowed);
            printf("\t\t读者编号:%d\n",link->readerID);
            printf("\t\t****************\n\n");
        }

    }
    if(count==0)
    {
        printf("\n\t\t未找到符合要求的图书,");
    }else{
        printf("\n\t\t共找到%d条结果,",count);
    } 
    printf("输入Y继续查找,其他字符视为放弃:");
    scanf("%c",&choose);
    if(choose=='Y') byName();
} 
static void byAuthor()
{
    struct bookinfo *link,*body;
    int count=0;
    char author[20],choose;

    link=head;
    system("cls");

    printf("\n\n\t\t输入要查找的图书作者关键字:");
    getchar(); 
    gets(author); 
    while(link->next!=0)
    {
        body=link; 
        link=link->next;
        if(findstring(link->author,author)!=-1)
        {
            count++;
            //system("cls");
            printf("\n\n\t\t  查询结果\n");
            printf("\t\t****************\n");
            printf("\t\t图书编号:%d\n",link->bookId);
            printf("\t\t书    名:%s\n",link->name);
            printf("\t\t单    价:%.2lf\n",link->price);
            printf("\t\t作    者:%s\n",link->author);
            printf("\t\t是否借出:%c\n",link->borrowed);
            printf("\t\t读者编号:%d\n",link->readerID);
            printf("\t\t****************\n\n");
        }

    }
    if(count==0)
    {
        printf("\n\t\t未找到符合要求的图书,");
    }else{
        printf("\n\t\t共找到%d条结果,",count);
    } 
    printf("输入Y继续查找,其他字符视为放弃:");
    scanf("%c",&choose);
    if(choose=='Y') byAuthor();
} 
void queryBookInfo()
{
    while(1)
    {
        int choose;
        //绘制菜单
        system("cls");
        printf("\n\n\t\t             图书查询\n");
        printf("\t----------------------------------------------\n");
        printf("\t\t\t1.按图书编号查询\n\n");
        printf("\t\t\t2.按 书 名 查 询\n\n");
        printf("\t\t\t3.按 作 者 查 询\n\n");
        printf("\t\t\t0.返回上一级菜单\n");
        printf("\t----------------------------------------------\n");
        printf("\n\n\t请选择您想使用的功能<0-3>:");

        //选择功能
        scanf("%d",&choose);
        switch(choose)
        {
        case 1:byId();break;
        case 2:byName();break;
        case 3:byAuthor();break;
        case 0:return;break;
        default:inputError();break;
        }
    }

}

ReturnBooks.c

#include"library.h"
extern Reader reader[RMAX];
extern int num;
extern struct bookinfo *head;
static Book* getBookById(int numb)
{
    struct bookinfo *link,*body;

    link=head;

    while(link->next!=0)
    {
        body=link; 
        link=link->next;
        if(link->bookId==numb)
        {
            if(link->borrowed=='N')
            {
                printf("\n错误:该图书尚未外借");
                return 0;
            }else{
                return link;
            }

        }

    }
    printf("\n错误:未找到符合要求的图书");
    return 0;
}
void returnBooks()
{
    int bookid,readerid,i;
    Book *node;
    char choose;

    system("cls");
    printf("\n\n\t\t    归还图书");
    printf("\n--------------------------------------\n");
    printf("\n图书编号:");
    scanf("%d",&bookid);
    node=getBookById(bookid);
    if(node!=0)
    {
        printf("\n读者编号:");
        scanf("%d",&readerid);
        for(i=0;iif(reader[i].id==readerid)
            {
                if(node->readerID!=reader[i].id)
                {
                    printf("\n\n错误:该读者没有借此书");
                    break;
                }
                node->borrowed='N';
                node->readerID=0;
                reader[i].borrowedNumb--;
                printf("\n\n归还完成!");
                break;
            }
        }
        if(i==num)
        {
            printf("\n\n错误:未找到该读者");
        }

    }

    printf("\n\n是否继续借书::");
    getchar();
    scanf("%c",&choose);
    if(choose=='Y')returnBooks();
}

你可能感兴趣的:(程序人生)