编写一个图书信息管理系统程序

题目2.图书信息管理系统
图书信息包括:图书编号、书名、作者名、出版社、出版时间、价格等。
试设计一图书信息管理系统,实现以下菜单显示的功能:
1录入,录入每本图书的信息,按书号从小到大的顺序将图书信息存入文件中。
2添加,可以添加图书信息。若已有,可以修改该图书的信息,若没有,则插入该图书信息,插入后仍然保持按书号有序,再保存到原文件中。
3查询,按书名查询图书的信息(列出所有书名相同的图书信息)
4修改,书号不可修改,按书号确定要修改的图书对象。
5删除,按书号删除图书信息。
6排序,按出版社排序,并显示。
7浏览,从文件中读取每本图书的信息并显示。
0退出

#include<stdio.h>
#include<stdlib.h>
#include<string.h>    
FILE *fp,*fpj,*fps;
int i,xuan;
typedef struct book{
    char name[10];
    char num[10];
    char writer[10];
    int date;
    char press[10];
    float price;
    char leibie[10];
    int kucun;
    int jiechu;
}bo;
typedef struct student{
    char name[10];
    char num[10];
    int jie;
}st;
typedef struct jieyue{
    char snum[10];
    char bnum[10];
}ji;
void menu()//菜单
{
    printf("\n\n");
    for(i=0;i<80;i++)
        printf("#");
    printf("\n\n");    
    printf("\t\t1-----图书录入\t\t\t");
    printf("2-----图书浏览\n\n");
    printf("\t\t3-----图书查询\t\t\t");
    printf("4-----修改删除图书\n\n");
    printf("\t\t5-----借阅图书\t\t\t");
    printf("6-----归还图书\n\n");
    printf("\t\t7-----借阅查询\t\t\t\n");
    printf("\n\t\t\t\t输入其他任意键退出\n");
    printf("\n\n");
    for(i=0;i<80;i++)
        printf("#");
    printf("\n\n");
}
void end()//录入图书
{
    bo boo,booq;
    printf("请输入图书名(最多十个字符):");
    scanf("%s",boo.name);
    do{
        i=1;
        printf("请输入图书编号(最多十个字符):");
        scanf("%s",boo.num);
        fread(&booq,sizeof(bo),1,fp);
        while(!feof(fp)){
            if(strcmp(booq.num,boo.num)==0){
                printf("\n该编号已存在请重新输入\n\n");
                i=0;
                break;
            }
            fread(&booq,sizeof(bo),1,fp);
        }
        rewind(fp);
    }while(i==0);
    printf("请输入图书作者(最多十个字符):");
    scanf("%s",boo.writer);
    printf("请输入图书出版日期(例如2001年5月3日出版则输入20010503):");
    scanf("%d",&boo.date);
    printf("请输入图书价格:");
    scanf("%f",&boo.price);
    printf("请输入图书出版社(最多十个字符):");
    scanf("%s",boo.press);
    printf("请输入图书类别(最多十个字符):");
    scanf("%s",boo.leibie);
    printf("请输入图书入库数:");
    scanf("%d",&boo.kucun);
    boo.jiechu=0;
    getchar();
    fseek(fp,0,2);
    fwrite(&boo,sizeof(bo),1,fp);
    printf("\n录入成功!回到主菜单");
    system("pause");
}
void print()//浏览图书
{
    bo boo;
    printf("书名      编号      作者      价格      出版社    类别      原始库存  借出\n");
    fread(&boo,sizeof(bo),1,fp);
    while(feof(fp)==0){
        printf("%-10s%-10s%-10s%-10.2f%-10s%-10s%-10d%-4d\n",boo.name,boo.num,boo.writer,boo.price,boo.press,boo.leibie,boo.kucun,boo.jiechu);
        fread(&boo,sizeof(bo),1,fp);
        }
    printf("\n浏览图书完毕!回到主菜单");
    system("pause");
}
int dui(char *p,char *p1)//对比两个字符串的相关度(用于精确搜索)
{
    int bao=0,fan=1;
    for(i=0;i<(int)strlen(p1);i++){
        if(p[0]==p1[i]){
            bao=i;
            break;
        }
    }
    if((int)strlen(p)>(int)strlen(p1)-bao+1)
        return 0;
    else
        for(i=0;i<(int)strlen(p);i++){
            if(p[i]!=p1[bao+i])
                fan=0;
        }
        return fan;
}
void find()//查询图书
{
    char hao[10];
    int fan=1;
    int bian=1;
    bo boo;
    printf("请选择查询类型:\n\n\t\t1-按图书编号模糊查询     2-按图书名关键字查询\n");
    printf("                \n\t\t3-按图书编号精确查询     4-按图书名精确查询\n\n代码:");
    scanf("%d",&xuan);
    if(xuan==1){
        printf("请输入编号(最多十个字符):");
        scanf("%s",hao);
        printf("序号 书名      编号      作者      价格      出版社    类别      原始库存  借出\n");
        fread(&boo,sizeof(bo),1,fp);
        while(!feof(fp)){
            fan=dui(hao,boo.num);
            if(fan==1){
                printf("%-5d%-10s%-10s%-10s%-10.2f%-10s%-10s%-10d%-4d\n",bian,boo.name,boo.num,boo.writer,boo.price,boo.press,boo.leibie,boo.kucun,boo.jiechu);
                bian++;}
            fread(&boo,sizeof(bo),1,fp);
        }
    }
    else if(xuan==2){
        printf("请输入图书名关键字(最多十个字符):");
        scanf("%s",hao);
        printf("序号 书名      编号      作者      价格      出版社    类别      原始库存  借出\n");
        fread(&boo,sizeof(bo),1,fp);
        while(!feof(fp)){
            fan=dui(hao,boo.name);
            if(fan==1)
                printf("%-5d%-10s%-10s%-10s%-10.2f%-10s%-10s%-10d%-4d\n",bian,boo.name,boo.num,boo.writer,boo.price,boo.press,boo.leibie,boo.kucun,boo.jiechu);
            fread(&boo,sizeof(bo),1,fp);
        }
    }
    else if(xuan==4){
        printf("请输入图书名(最多十个字符):");
        scanf("%s",hao);
        printf("序号 书名      编号      作者      价格      出版社    类别      原始库存  借出\n");
        while(!feof(fp)){
            if(strcmp(hao,boo.name)==0)
                printf("%-5d%-10s%-10s%-10s%-10.2f%-10s%-10s%-10d%-4d\n",bian,boo.name,boo.num,boo.writer,boo.price,boo.press,boo.leibie,boo.kucun,boo.jiechu);
            fread(&boo,sizeof(bo),1,fp);
        }
 
    }
    else if(xuan==3){
        printf("请输入图书编号(最多十个字符):");
        scanf("%s",hao);
        printf("序号 书名      编号      作者      价格      出版社    类别      原始库存  借出\n");
        while(!feof(fp)){
            if(strcmp(hao,boo.num)==0)
                printf("%-5d%-10s%-10s%-10s%-10.2f%-10s%-10s%-10d%-4d\n",bian,boo.name,boo.num,boo.writer,boo.price,boo.press,boo.leibie,boo.kucun,boo.jiechu);
            fread(&boo,sizeof(bo),1,fp);
        }
 
    }
    else{
        printf("输入错误,正在退出!");
        system("pause");
        return;
    }
    printf("\n查询图书完毕! ");
    system("pause");
}
void del()//修改删除图书
{
    FILE *p;
    ji jie;
    int j=0;
    char num[10];
    bo boo,booq;
    int xu;
    char or;
    char cha[10];
    printf("\n删除修改图书只能通过图书编号来完成!\n是否调用图书查询来查询你要操作的图书编号(Y/N)\n");
    getchar();
    scanf("%c",&or);
    if(or=='Y'||or=='y'){
        find();
        rewind(fp);}
    printf("\n请输入你要操作的图书的编号(如果输入错误的编号,将不做任何操作):");
    scanf("%s",cha);
    fread(&jie,sizeof(ji),1,fpj);
    while(!feof(fpj)){
        if(strcmp(jie.bnum,cha)==0){
            printf("\n这本书已有人借阅,不能操作!\n正在退出 ");
            system("pause");
            return;
        }
        fread(&jie,sizeof(ji),1,fpj);
    }
    printf("\n\n1-删除图书   2-修改图书\n\n");
    printf("请选择操作类型:");
    scanf("%d",&xuan);
    fread(&boo,sizeof(bo),1,fp);
    p=fopen("c:\\books1.txt","wb+");
    while(!feof(fp)){
        j++;
        if(strcmp(boo.num,cha)==0){    
            if(xuan==2){            
                printf("\n\n1-书名    2-编号    3-作者    4-价格    5-出版社   6-类别    7-库存\n\n");
                printf("请选择要修改的项目:");
                scanf("%d",&xu);
                if(xu==1){
                    printf("你要把%s改为:",boo.name);
                    scanf("%s",boo.name);}
                else if(xu==2){
                    do{
                        i=1;
                        printf("你要把%s改为:",boo.num);
                        scanf("%s",num);
                        rewind(fp);
                        fread(&booq,sizeof(bo),1,fp);
                        while(!feof(fp)){
                            if(strcmp(booq.num,num)==0){
                                printf("\n该编号已存在请重新输入\n\n");
                                i=0;
                                break;
                            }
                            fread(&booq,sizeof(bo),1,fp);
                        }
                    }while(i==0);
                        rewind(fp);
                    for(i=0;i<j;i++){
                        fread(&boo,sizeof(bo),1,fp);
                        strcpy(boo.num,num);
                    }
                }
                else if(xu==3){
                    printf("你要把%s改为:",boo.writer);
                    scanf("%s",boo.writer);}
                else if(xu==4){
                    printf("你要把%.2f改为:",boo.price);
                    scanf("%f",&boo.price);}
                else if(xu==5){
                    printf("你要把%s改为:",boo.press);
                    scanf("%s",boo.press);}
                else if(xu==6){
                    printf("你要把%s改为:",boo.leibie);
                    scanf("%s",boo.leibie);}
                else if(xu==7){
                    printf("你要把%d改为:",&boo.kucun);
                    scanf("%d",&boo.kucun);}
                fwrite(&boo,sizeof(bo),1,p);
            }
        }
        else
            fwrite(&boo,sizeof(bo),1,p);
        fread(&boo,sizeof(bo),1,fp);
    }
    fclose(p);
    p=fopen("c:\\books1.txt","rb+");
    fclose(fp);
    fp=fopen("c:\\book.txt","wb+");
    fread(&boo,sizeof(bo),1,p);
    while(!feof(p)){
        fwrite(&boo,sizeof(bo),1,fp);
        fread(&boo,sizeof(bo),1,p);    
    }
    fclose(fp);
    printf("操作成功   回到主菜单");
    system("pause");
}
void lend()//借阅图书
{
    bo boo;
    FILE *p;
    st stu;
    ji jie;
    int j=0;
    char or,num[10],xnum[10];
    printf("\n借阅图书只能通过图书编号完成!\n是否调用图书查询来查询你要操作的图书编号(Y/N)\n");
    getchar();
    scanf("%c",&or);
    if(or=='Y'||or=='y')
        find();
    printf("\n请输入你要借阅的图书的编号:");
    scanf("%s",num);
    fread(&boo,sizeof(bo),1,fp);
    while(!feof(fp)){
        if(strcmp(num,boo.num)==0){
            j=1;
            break;        
        }
        fread(&boo,sizeof(bo),1,fp);
    }
    if(j==0){
        printf("\n书库没有该图书 正在退出\n");
        system("pause");
        return;
    }
    printf("\n你需要借阅的图书是:\n");
    printf("书名      编号      作者      价格      出版社    类别      原始库存  借出\n");
    printf("%-10s%-10s%-10s%-10.2f%-10s%-10s%-10d%-4d\n",boo.name,boo.num,boo.writer,boo.price,boo.press,boo.leibie,boo.kucun,boo.jiechu);
    if(boo.kucun==boo.jiechu){
        printf("\n该册图书已全部借出!正在退出\n");
        system("pause");
        return;
    }
    printf("\n请输入你的学号:");
    scanf("%s",xnum);
    j=0;
    fread(&jie,sizeof(ji),1,fpj);
    while(!feof(fpj)){
        if((strcmp(jie.bnum,num)==0)&&(strcmp(jie.snum,xnum)==0)){
            j=1;
            break;        
        }
        fread(&jie,sizeof(ji),1,fpj);
    }
    if(j==1){
        printf("\n你已经借阅过该书  正在退出\n");
        system("pause");
        return;
    }
    fread(&stu,sizeof(st),1,fps);
    j=0;
    while(!feof(fps)){
        if(strcmp(xnum,stu.num)==0){
            j=1;
            break;
        }
        fread(&stu,sizeof(st),1,fps);
    }
    if(j==0){
        printf("\n你是第一次借阅图书,为了方便管理请输入你的姓名:");
        scanf("%s",stu.name);
        strcpy(stu.num,xnum);
        stu.jie=1;
        fseek(fps,0,2);
        fwrite(&stu,sizeof(st),1,fps);
    }
    else{
        if(stu.jie==5){//这里可以控制每个学生最多借几本书
            printf("\n你已经借了5本书,不能再借\n");
            system("pause");
            return;}
        p=fopen("c:\\jie.txt","wb+");
        rewind(fps);
        fread(&stu,sizeof(st),1,fps);
        while(!feof(fps)){
            if(strcmp(xnum,stu.num)==0)
                stu.jie++;
        fwrite(&stu,sizeof(st),1,p);
        fread(&stu,sizeof(st),1,fps);
        }
        fclose(p);
        fclose(fps);    
        p=fopen("c:\\jie.txt","rb+");
        fps=fopen("c:\\student.txt","wb+");
        fread(&stu,sizeof(st),1,p);
        while(!feof(p)){
            fwrite(&stu,sizeof(st),1,fps);
            fread(&stu,sizeof(st),1,p);    
        }
    }
    strcpy(jie.bnum,num);
    strcpy(jie.snum,xnum);
    fseek(fpj,0,2);
    fwrite(&jie,sizeof(ji),1,fpj);
    rewind(fp);
    p=fopen("c:\\jie.txt","wb+");
    fread(&boo,sizeof(bo),1,fp);
    while(!feof(fp)){
        if(strcmp(num,boo.num)==0)
            boo.jiechu++;
        fwrite(&boo,sizeof(bo),1,p);
        fread(&boo,sizeof(bo),1,fp);
    }
    fclose(p);
    p=fopen("c:\\jie.txt","rb+");
    fclose(fp);
    fp=fopen("c:\\book.txt","wb+");
    fread(&boo,sizeof(bo),1,p);
    while(!feof(p)){
        fwrite(&boo,sizeof(bo),1,fp);
        fread(&boo,sizeof(bo),1,p);    
    }
    printf("\n借阅成功!回到主菜单");
    system("pause");
}
 
void huan(){//归还图书
    FILE *p;
    bo boo;
    ji jie;
    st stu;
    int j=0;
    char snum[10],bnum[10];
    i=0;
    printf("\n请输入你的学号:");
    scanf("%s",snum);
    printf("\n你借阅了以下图书\n");
    fread(&jie,sizeof(ji),1,fpj);
    printf("书名      编号      作者      价格      出版社    类别      原始库存  借出\n");
    while(!feof(fpj)){
        if(strcmp(jie.snum,snum)==0){
            fread(&boo,sizeof(bo),1,fp);
            while(!feof(fp)){
                if(strcmp(jie.bnum,boo.num)==0){
                    printf("%-10s%-10s%-10s%-10.2f%-10s%-10s%-10d%-4d\n",boo.name,boo.num,boo.writer,boo.price,boo.press,boo.leibie,boo.kucun,boo.jiechu);
                    j=1;
                }
                fread(&boo,sizeof(bo),1,fp);
            }
        }
        fread(&jie,sizeof(ji),1,fpj);
    }
    if(j==0){
        printf("\n你没有借阅任何图书!\n\n正在退出");
        system("pause");
        return;
    }
    rewind(fp);
    rewind(fpj);
    printf("\n请输入你归还的图书的编号:");
    scanf("%s",bnum);
    fread(&jie,sizeof(jie),1,fpj);//改变jieyue.txt里的数据
    p=fopen("c:\\jie.txt","wb+");
    while(!feof(fpj)){
        if((strcmp(jie.bnum,bnum)==0)&&(strcmp(jie.snum,snum)==0))
            i=1;
        else 
            fwrite(&jie,sizeof(jie),1,p);
        fread(&jie,sizeof(jie),1,fpj);
    }
    if(i==0){
        printf("\n你没有借过该图书\n正在退出");
        system("pause");
        return;
    }
    fclose(p);
    fclose(fpj);    
    p=fopen("c:\\jie.txt","rb+");
    fpj=fopen("c:\\jieyue.txt","wb+");
    fread(&jie,sizeof(ji),1,p);
    while(!feof(p)){
        fwrite(&jie,sizeof(ji),1,fpj);
        fread(&jie,sizeof(ji),1,p);    
    }
    fclose(p);//改变book.txt里的数据
    p=fopen("c:\\jie.txt","wb+");
    fread(&boo,sizeof(bo),1,fp);
    while(!feof(fp)){
        if(strcmp(bnum,boo.num)==0)
            boo.jiechu--;
        fwrite(&boo,sizeof(bo),1,p);
        fread(&boo,sizeof(bo),1,fp);
    }
    fclose(p);
    p=fopen("c:\\jie.txt","rb+");
    fclose(fp);
    fp=fopen("c:\\book.txt","wb+");
    fread(&boo,sizeof(bo),1,p);
    while(!feof(p)){
        fwrite(&boo,sizeof(bo),1,fp);
        fread(&boo,sizeof(bo),1,p);    
    }
    fclose(p);//改变student.txt里的数据
    p=fopen("c:\\jie.txt","wb+");
    rewind(fps);
    fread(&stu,sizeof(st),1,fps);
    while(!feof(fps)){
        if(strcmp(snum,stu.num)==0)
            stu.jie--;
        fwrite(&stu,sizeof(st),1,p);
        fread(&stu,sizeof(st),1,fps);
    }
    fclose(p);
    fclose(fps);    
    p=fopen("c:\\jie.txt","rb+");
    fps=fopen("c:\\student.txt","wb+");
    fread(&stu,sizeof(st),1,p);
    while(!feof(p)){
        fwrite(&stu,sizeof(st),1,fps);
        fread(&stu,sizeof(st),1,p);    
    }
    printf("\n归还成功!回到主菜单");
    system("pause");
}
void cha(){//借阅查询
    char num[10];
    bo boo;
    ji jie;
    printf("\n请输入你的学号:");
    scanf("%s",num);
    fread(&jie,sizeof(ji),1,fpj);
    printf("书名      编号      作者      价格      出版社    类别      原始库存  借出\n");
    while(!feof(fpj)){
        if(strcmp(jie.snum,num)==0){
            fread(&boo,sizeof(bo),1,fp);
            while(!feof(fp)){
                if(strcmp(jie.bnum,boo.num)==0)
                    printf("%-10s%-10s%-10s%-10.2f%-10s%-10s%-10d%-4d\n",boo.name,boo.num,boo.writer,boo.price,boo.press,boo.leibie,boo.kucun,boo.jiechu);
                fread(&boo,sizeof(bo),1,fp);
            }
        }
        fread(&jie,sizeof(ji),1,fpj);
    }
    printf("\n查询完毕!回到主菜单");
    system("pause");
}
main(){
    if((fp=fopen("c:\\book.txt","rb+"))==NULL){
        printf("在c盘根目录下没有找到储存图书信息的book.txt文件\n请选择  1--手动导入!  2--创建此文件\n");
        scanf("%d",&xuan);
        switch(xuan){
        case 2:if((fp=fopen("c:\\book.txt","wb+"))!=NULL)
                   printf("创建成功\n\n");
            break;
        case 1:printf("请把名为book.txt的文件复制到c盘根目录下\n\n");
        }
    }
    if((fpj=fopen("c:\\jieyue.txt","rb+"))==NULL){
        printf("在c盘根目录下没有找到储存借阅信息的jieyue.txt文件\n请选择  1--手动导入!  2--创建此文件\n");
        scanf("%d",&xuan);
        switch(xuan){
        case 2:if((fpj=fopen("c:\\jieyue.txt","wb+"))!=NULL)
                   printf("创建成功\n\n");
            break;
        case 1:printf("请把名为jieyue.txt的文件复制到c盘根目录下\n\n");
        }
    }
    if((fps=fopen("c:\\student.txt","rb+"))==NULL){
        printf("在c盘根目录下没有找到储存学生信息的student.txt文件\n请选择  1--手动导入!  2--创建此文件\n");
        scanf("%d",&xuan);
        switch(xuan){
        case 2:if((fps=fopen("c:\\student.txt","wb+"))!=NULL)
                   printf("创建成功\n\n");
            break;
        case 1:printf("请把名为student.txt的文件复制到c盘根目录下\n\n");
        }
    }
    menu();
    printf("\n  代码:");
    scanf("%d",&xuan);        
    while(xuan==1||xuan==2||xuan==3||xuan==4||xuan==5||xuan==6||xuan==7){
        fp=fopen("c:\\book.txt","rb+");
        fps=fopen("c:\\student.txt","rb+");
        fpj=fopen("c:\\jieyue.txt","rb+");
        switch(xuan){
        case 0:break;
        case 1:end();break;
        case 2:print();break;
        case 3:find();break;
        case 4:del();break;
        case 5:lend();break;
        case 6:huan();break;
        case 7:cha();break;
        }
        fclose(fp);
        fclose(fpj);
        fclose(fps);
        menu();
    printf("\n  代码:");
    scanf("%d",&xuan);
    }
 
}