qq_53080147
菊与刀丶
2021-05-15 17:25
采纳率: 100%
浏览 65

C语言图书管理系统设计

 

 

#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#define Header printf("图书编号   图书名称   图书单价   作者   状态   借书人学号   借书人姓名   借书人性别\n")
#define Print printf("%-8d%-8s%-8f%-8s%-8s%-8d%-8s%-8s%\n",book[p].BookNum,book[p].BookName,book[p].Money,book[p].Author,book[p].State,book[p].StudentNum,book[p].Name,book[p].Sex) 

struct Book
{
    int BookNum;//图书编号
    char BookName[50];//图书名称
    float Money;//图书单价 
    char Author;//作者 
    char State[10];//存在状态 
    int StudentNum;//借书人学号 
    char Name;//借书人姓名
    char Sex;//借书人性别
}book[100];
int saveflag=0;
void Menu()
{
    printf("------------图 书 管 理 系 统-----------\n");
    printf("               主菜单                   \n");
    printf("    1 新进图书基本信息的输入            \n");
    printf("    2 图书基本信息的查询                \n");
    printf("    3 对撤消图书信息的删除              \n");
    printf("    4 为借书人办理注册                  \n");
    printf("    5 办理借书手续                      \n");
    printf("    6 办理还书手续                      \n");
    printf("----------------------------------------\n");
}
int OpenFile(int cnt)
{
    FILE *fp;
    int i=0;
    fp=fopen("D:\\demo\\book.dat","ab+");//以追加方式打开D:\\demo\\Salary.dat二进制文件
    if(fp==NULL)
    {
        printf("Can not open file!");
        exit(0);
    }
    while(!feof(fp))//循环读取文件中的记录,直到文件结束
    {
        if(fread(&book[i],sizeof(struct Book),1,fp)==1)//判断fread()函数读取数据是否成功,返回值为1,则读取了一条记录
        {
            cnt++;
            i++;
        }
    fclose(fp);//关闭文件
    return cnt;//返回文件中记录数 
    } 
}
int Add(int cnt)//添加图书记录

    int choice;
    int i,bookNumTemp,j,recordcnt;
    recordcnt=cnt;
    printf("开始添加图书信息....\n");
    for(i=cnt;i<100;i++)
    {
        printf("图书编号:");
        scanf("%d",&bookNumTemp);
        for(j=0;j<i;j++)
        {
            if(book[j].BookNum==bookNumTemp)//如果编号重复,提示重新输入
            {
                printf("图书编号重复,请重新输入:");
                scanf("%d",&bookNumTemp);
                j=-1;//重新输入编号后,让j=-1,经过j++后,使其为j=0,重新从数组的第一个元素开始比较编号是否重复 
            } 
        }
        book[i].BookNum=bookNumTemp;
        getchar();
        printf("图书名称:");
        gets(book[i].BookName);
        printf("图书单价:");
        scanf("%f",&book[i].Money);
        printf("图书作者:");
        scanf("%s",&book[i].Author);
        printf("借阅状态:");
        scanf("%s",&book[i].State);
        printf("是否继续输入?1 继续  0 退出:");
        scanf("%d",&choice);
        recordcnt++;//输入完一条记录后让记录数增1
        if(choice!=1)
        break; 
    }
    saveflag=1;//输入记录,记录发生变化,saveflag=1,表示变动后的数据未保存
    printf("记录输入完成,按任意键返回主菜单....");
    getchar();
    getchar();
    return recordcnt;//返回记录数 
}
int Locate(int num,int cnt)//按图书编号查询图书信息
{
    int p=-1,i;
    for(i=0;i<cnt;i++)
    {
        if(book[i].BookNum==num)
        {
            p=i;//记录查询到的记录的下标 
            break;
        }
    }
    return p;//返回查询到的记录下标,如果返回为-1,表示记录不存在 
}
void Query(int cnt)//图书信息查询 
{
    int choice=0,tempnum,p,count=0,i;
    char tempname[20];
    printf("开始查询图书信息....\n");
    printf("请选择查询方式(1 按编号 2 按书名):");
    scanf("%d",&choice);
    switch(choice)
    {
    case 1:
            printf("请输入要查询图书的编号:");
            scanf("%d",&tempnum);
            p=Locate(tempnum,cnt);//调用按编号查询图书信息函数
            if(-1==p)
            {
                printf("\n 查询的图书信息不存在,按任意键返回主菜单...."); 
            }
            else
            {
                printf("查询的图书信息如下:\n\n");
                Header;
                printf("%-8d%-8s%-8f%-8s%-8s%-8d%-8s%-8s%\n",book[p].BookNum,book[p].BookName,book[p].Money,book[p].Author,book[p].State,book[p].StudentNum,book[p].Name,book[p].Sex);
                printf("\n 图书信息查询完成,按任意键返回主菜单...."); 
            }
            getchar();
            break;
    case 2:
            getchar();
            printf("请输入要查询图书姓名:");
            gets(tempname);
            for(i=0;i<cnt;i++)//按姓名查询可能有多条记录满足,所以不能用Locate()函数 
            {
                if(strcmp(tempname,book[i].BookName)==0)//判断元素姓名是否与要查询的姓名相同 
                {
                    if(count==0)
                    { 
                        Header;//如果时第1条要查询的记录,则输出行标题,否则不输出 
                    }
                    p=i;
                    Print;//输出查询到的记录 
                    count++;//查询到的记录数 
                }
            }    
        if(0==count)
            printf("\n查询的图书信息不存在,按任意键返回主菜单...."); 
        else
            printf("\n图书信息查询完成,按任意键返回主菜单....");  
        break;
    default:
        printf("选择错误,按任意键返回主菜单....");
    }
    getchar();
}
int Del(int cnt)
{
    int tempnum,p,i;
    printf("开始删除图书信息....\n\n");
    printf("请输入要删除图书的编号:");
    scanf("%d",&tempnum);
    p=Locate(tempnum,cnt);//调用按编号查询图书信息函数
    if(-1==p)
    {
        printf("\n要删除的图书信息不存在,按任意键返回主菜单...."); 
    }
    else
    {
        printf("要删除的图书信息如下:\n\n");
        Header;
        Print;
        for(i=p;i<cnt-1;i++)//从要删除的位置开始,用后一条记录把前一条记录覆盖 
        {
            book[i]=book[i+1]; 
        }
        cnt--;//记录数在原来记录数的基础上减1
        saveflag=1;//记录发生变化,存盘标志改为未存盘
        printf("\n图书信息修改成功,按任意键返回菜单...."); 
    }
    getchar();
    getchar();
    return cnt;//返回记录数    
}
int Register(int cnt)//添加借书人记录

    int choice;
    int i,bookNumTemp,j,recordcnt;
    recordcnt=cnt;
    printf("开始添加借书人信息....\n");
    for(i=cnt;i<100;i++)
    {
        printf("借书人学号:");
        scanf("%d",&bookNumTemp);
        for(j=0;j<i;j++)
        {
            if(book[j].BookNum==bookNumTemp)//如果编号重复,提示重新输入
            {
                printf("借书人学号重复,请重新输入:");
                scanf("%d",&bookNumTemp);
                j=-1;//重新输入编号后,让j=-1,经过j++后,使其为j=0,重新从数组的第一个元素开始比较编号是否重复 
            } 
        }
        book[i].BookNum=bookNumTemp;
        getchar();
        printf("借书人学号:"); 
        scanf("%d",&book[i].StudentNum);
        printf("借书人姓名:");
        scanf("%s",&book[i].Name);
        printf("借书人性别:");
        scanf("%s",&book[i].Sex);
        printf("是否继续输入?1 继续  0 退出:");
        scanf("%d",&choice);
        recordcnt++;//输入完一条记录后让记录数增1
        if(choice!=1)
        break; 
    }
    saveflag=1;//输入记录,记录发生变化,saveflag=1,表示变动后的数据未保存
    printf("记录输入完成,按任意键返回主菜单....");
    getchar();
    getchar();
    return recordcnt;//返回记录数 
}
void ExitSystem(cnt){
}//退出系统
int a[100]={0};
void Borrow(int cnt)//借阅
{
    int tempnum,p,teaNumTemp,j;
    printf("开始借阅图书....\n\n");
    int a1;
    char a2,a3;
    printf("请输入您的学号:");
    scanf("%d",&a1);
    printf("请输入您的姓名:");
    scanf("%s",&a2);
    printf("请输入您的性别:");
    scanf("%s",&a3);
    printf("请输入要借阅的图书编号:");
    scanf("%d",&tempnum);
    p=Locate(tempnum,cnt);//调用按编号查询图书信息函数
    if(-1==p)//返回值-1,表示要查询的图书信息不存在 
    {
        printf("\n要借阅的图书不存在,按任意键返回菜单...."); 
    }
    else
    {
        printf("要借阅的图书信息如下:\n\n");
        Header;
        Print;//显示查询到的图书信息
        printf("借阅后图书信息:\n");
        printf("图书状态:");
        strcpy(book[10].State,"已借出");
        printf("借书人学号:");
        book[p].StudentNum=a1;
        printf("借书人姓名:");
        book[p].Name=a2; 
        printf("借书人性别:");
        book[p].Sex=a3;
        Header;
        Print;
        a[p]=book[p].BookNum;
        book[p].BookNum=0;
        saveflag=1;//记录发生变化,存盘标志改为未存盘
        printf("\n图书借阅成功,按任意键返回主菜单....");
    }
    getchar();
    getchar(); 
}
void Back(int cnt)//归还 
{
    int tempnum,p,teaNumTemp,j,a1=0;
    char x2;
    x2 = 'X';
    int i,c,d;
    printf("开始归还图书....\n\n");
    printf("请输入要归还的图书编号:");
    scanf("%d",&c);
    for(i=0;i<101;i++)
    {
        if(a[i]==c)
        {
            book[i].BookNum=a[i];
        }else{
            printf("该书不属于图书馆");
        }
    } 
        printf("图书状态:");
        strcpy(book[10].State,"已归还");
        printf("借书人学号:");
        book[p].StudentNum=x2; 
        printf("借书人姓名:");
        book[p].Name=x2; 
        printf("借书人性别:");
        book[p].Sex=x2;
        Header;
        Print;
        saveflag=1;//记录发生变化,存盘标志改为未存盘
        printf("\n图书归还成功,按任意键返回主菜单....");
    getchar();
    getchar(); 
}
void main()
{
    int choice=0,count=0;
    count=OpenFile(count);//打开文件,获取文件中记录数
    while(1)
    {
        system("cls");//调用系统清屏功能清除屏幕信息,使光标回到左上角开始位置 
        Menu();//调用菜单函数
        printf("请输入你的选择:");
        scanf("%d",&choice);
        switch(choice)
        {
        case 1:
            count=Add(count);//调用添加记录函数
            break;
        case 2:
            Query(count);//调用查询记录函数
            break;
        case 3:
            count=Del(count);//调用删除记录函数
            break;
        case 4:
            Register(count);
            break;
        case 5:
              Borrow(count);
            break;
        case 6:
            Back(count);
            break; 
        default:
            printf("选择错误,按任意键返回主菜单....");
            getchar();
            getchar();         
        } 
    } 
}

写入不了文件,输出也有问题。

怎么搞

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • technologist_15
    CSDN专家-三岁丫 2021-05-15 19:56
    已采纳
    #include<stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define Header printf("图书编号   图书名称   图书单价   作者   状态   借书人学号   借书人姓名   借书人性别\n")
    #define Print printf("%-8d%-8s%-8f%-8s%-8s%-8d%-8s%-8s%\n",book[p].BookNum,book[p].BookName,book[p].Money,book[p].Author,book[p].State,book[p].StudentNum,book[p].Name,book[p].Sex)
    
    struct Book
    {
        int BookNum;//图书编号
        char BookName[50];//图书名称
        float Money;//图书单价
        char Author[20];//作者
        char State[10];//存在状态
        int StudentNum;//借书人学号
        char Name[20];//借书人姓名
        char Sex[10];//借书人性别
    }book[100];
    int saveflag=0;
    void Menu()
    {
        printf("------------图 书 管 理 系 统-----------\n");
        printf("               主菜单                   \n");
        printf("    1 新进图书基本信息的输入            \n");
        printf("    2 图书基本信息的查询                \n");
        printf("    3 对撤消图书信息的删除              \n");
        printf("    4 为借书人办理注册                  \n");
        printf("    5 办理借书手续                      \n");
        printf("    6 办理还书手续                      \n");
        printf("----------------------------------------\n");
    }
    int OpenFile(int cnt)
    {
        FILE *fp;
        int i=0;
        fp=fopen("book.dat","ab+");//以追加方式打开D:\\demo\\Salary.dat二进制文件
        if(fp==NULL)
        {
            printf("Can not open file!");
            exit(0);
        }
        while(!feof(fp))//循环读取文件中的记录,直到文件结束
        {
            if(fread(&book[i],sizeof(struct Book),1,fp)==1)//判断fread()函数读取数据是否成功,返回值为1,则读取了一条记录
            {
                cnt++;
                i++;
            }
        }
        fclose(fp);//关闭文件
        return cnt;//返回文件中记录数
    }
    int Add(int cnt)//添加图书记录
    {
        int choice;
        int i,bookNumTemp,j,recordcnt;
        recordcnt=cnt;
        printf("开始添加图书信息....\n");
        for(i=cnt;i<100;i++)
        {
            printf("图书编号:");
            scanf("%d",&bookNumTemp);
            for(j=0;j<i;j++)
            {
                if(book[j].BookNum==bookNumTemp)//如果编号重复,提示重新输入
                {
                    printf("图书编号重复,请重新输入:");
                    scanf("%d",&bookNumTemp);
                    j=-1;//重新输入编号后,让j=-1,经过j++后,使其为j=0,重新从数组的第一个元素开始比较编号是否重复
                }
            }
            book[i].BookNum=bookNumTemp;
            getchar();
            printf("图书名称:");
            gets(book[i].BookName);
            printf("图书单价:");
            scanf("%f",&book[i].Money);
            printf("图书作者:");
            scanf("%s",&book[i].Author);
            printf("借阅状态:");
            scanf("%s",book[i].State);
            printf("是否继续输入?1 继续  0 退出:");
            scanf("%d",&choice);
            recordcnt++;//输入完一条记录后让记录数增1
            if(choice!=1)
                break;
        }
        saveflag=1;//输入记录,记录发生变化,saveflag=1,表示变动后的数据未保存
        printf("记录输入完成,按任意键返回主菜单....");
        getchar();
        getchar();
        return recordcnt;//返回记录数
    }
    int Locate(int num,int cnt)//按图书编号查询图书信息
    {
        int p=-1,i;
        for(i=0;i<cnt;i++)
        {
            if(book[i].BookNum==num)
            {
                p=i;//记录查询到的记录的下标
                break;
            }
        }
        return p;//返回查询到的记录下标,如果返回为-1,表示记录不存在
    }
    void Query(int cnt)//图书信息查询
    {
        int choice=0,tempnum,p,count=0,i;
        char tempname[20];
        printf("开始查询图书信息....\n");
        printf("请选择查询方式(1 按编号 2 按书名):");
        scanf("%d",&choice);
        switch(choice)
        {
            case 1:
                printf("请输入要查询图书的编号:");
                scanf("%d",&tempnum);
                p=Locate(tempnum,cnt);//调用按编号查询图书信息函数
                if(-1==p)
                {
                    printf("\n 查询的图书信息不存在,按任意键返回主菜单....");
                }
                else
                {
                    printf("查询的图书信息如下:\n\n");
                    Header;
                    printf("%-8d%-8s%-8f%-8s%-8s%-8d%-8s%-8s\n",book[p].BookNum,book[p].BookName,book[p].Money,book[p].Author,book[p].State,book[p].StudentNum,book[p].Name,book[p].Sex);
                    printf("\n 图书信息查询完成,按任意键返回主菜单....");
                }
                getchar();
                break;
            case 2:
                getchar();
                printf("请输入要查询图书姓名:");
                gets(tempname);
                for(i=0;i<cnt;i++)//按姓名查询可能有多条记录满足,所以不能用Locate()函数
                {
                    if(strcmp(tempname,book[i].BookName)==0)//判断元素姓名是否与要查询的姓名相同
                    {
                        if(count==0)
                        {
                            Header;//如果时第1条要查询的记录,则输出行标题,否则不输出
                        }
                        p=i;
                        Print;//输出查询到的记录
                        count++;//查询到的记录数
                    }
                }
                if(0==count)
                    printf("\n查询的图书信息不存在,按任意键返回主菜单....");
                else
                    printf("\n图书信息查询完成,按任意键返回主菜单....");
                break;
            default:
                printf("选择错误,按任意键返回主菜单....");
        }
        getchar();
    }
    int Del(int cnt)
    {
        int tempnum,p,i;
        printf("开始删除图书信息....\n\n");
        printf("请输入要删除图书的编号:");
        scanf("%d",&tempnum);
        p=Locate(tempnum,cnt);//调用按编号查询图书信息函数
        if(-1==p)
        {
            printf("\n要删除的图书信息不存在,按任意键返回主菜单....");
        }
        else
        {
            printf("要删除的图书信息如下:\n\n");
            Header;
            Print;
            for(i=p;i<cnt-1;i++)//从要删除的位置开始,用后一条记录把前一条记录覆盖
            {
                book[i]=book[i+1];
            }
            cnt--;//记录数在原来记录数的基础上减1
            saveflag=1;//记录发生变化,存盘标志改为未存盘
            printf("\n图书信息修改成功,按任意键返回菜单....");
        }
        getchar();
        getchar();
        return cnt;//返回记录数
    }
    int Register(int cnt)//添加借书人记录
    {
        int choice;
        int i,bookNumTemp,j,recordcnt;
        recordcnt=cnt;
        printf("开始添加借书人信息....\n");
        for(i=cnt;i<100;i++)
        {
            printf("借书人学号:");
            scanf("%d",&bookNumTemp);
            for(j=0;j<i;j++)
            {
                if(book[j].BookNum==bookNumTemp)//如果编号重复,提示重新输入
                {
                    printf("借书人学号重复,请重新输入:");
                    scanf("%d",&bookNumTemp);
                    j=-1;//重新输入编号后,让j=-1,经过j++后,使其为j=0,重新从数组的第一个元素开始比较编号是否重复
                }
            }
            book[i].BookNum=bookNumTemp;
            getchar();
            printf("借书人学号:");
            scanf("%d",&book[i].StudentNum);
            printf("借书人姓名:");
            scanf("%s",&book[i].Name);
            printf("借书人性别:");
            scanf("%s",&book[i].Sex);
            printf("是否继续输入?1 继续  0 退出:");
            scanf("%d",&choice);
            recordcnt++;//输入完一条记录后让记录数增1
            if(choice!=1)
                break;
        }
        saveflag=1;//输入记录,记录发生变化,saveflag=1,表示变动后的数据未保存
        printf("记录输入完成,按任意键返回主菜单....");
        getchar();
        getchar();
        return recordcnt;//返回记录数
    }
    void ExitSystem(cnt){
    }//退出系统
    int a[100]={0};
    void Borrow(int cnt)//借阅
    {
        int tempnum,p,teaNumTemp,j;
        printf("开始借阅图书....\n\n");
        int a1;
        char a2,a3;
        printf("请输入您的学号:");
        scanf("%d",&a1);
        printf("请输入您的姓名:");
        scanf("%s",&a2);
        printf("请输入您的性别:");
        scanf("%s",&a3);
        printf("请输入要借阅的图书编号:");
        scanf("%d",&tempnum);
        p=Locate(tempnum,cnt);//调用按编号查询图书信息函数
        if(-1==p)//返回值-1,表示要查询的图书信息不存在
        {
            printf("\n要借阅的图书不存在,按任意键返回菜单....");
        }
        else
        {
            printf("要借阅的图书信息如下:\n\n");
            Header;
            Print;//显示查询到的图书信息
            printf("借阅后图书信息:\n");
            printf("图书状态:");
            strcpy(book[10].State,"已借出");
            printf("借书人学号:");
            book[p].StudentNum=a1;
            printf("借书人姓名:");
    //        book[p].Name=a2;
            printf("借书人性别:");
    //        book[p].Sex=a3;
            Header;
            Print;
            a[p]=book[p].BookNum;
            book[p].BookNum=0;
            saveflag=1;//记录发生变化,存盘标志改为未存盘
            printf("\n图书借阅成功,按任意键返回主菜单....");
        }
        getchar();
        getchar();
    }
    void Back(int cnt)//归还
    {
        int tempnum,p,teaNumTemp,j,a1=0;
        char x2;
        x2 = 'X';
        int i,c,d;
        printf("开始归还图书....\n\n");
        printf("请输入要归还的图书编号:");
        scanf("%d",&c);
        for(i=0;i<101;i++)
        {
            if(a[i]==c)
            {
                book[i].BookNum=a[i];
            }else{
                printf("该书不属于图书馆");
            }
        }
        printf("图书状态:");
        strcpy(book[10].State,"已归还");
        printf("借书人学号:");
        book[p].StudentNum=x2;
        printf("借书人姓名:");
    //    book[p].Name=x2;
        printf("借书人性别:");
    //    book[p].Sex=x2;
        Header;
        Print;
        saveflag=1;//记录发生变化,存盘标志改为未存盘
        printf("\n图书归还成功,按任意键返回主菜单....");
        getchar();
        getchar();
    }
    void main()
    {
        int choice=0,count=0;
        count=OpenFile(count);//打开文件,获取文件中记录数
        while(1)
        {
            system("cls");//调用系统清屏功能清除屏幕信息,使光标回到左上角开始位置
            Menu();//调用菜单函数
            printf("请输入你的选择:");
            scanf("%d",&choice);
            switch(choice)
            {
                case 1:
                    count=Add(count);//调用添加记录函数
                    break;
                case 2:
                    Query(count);//调用查询记录函数
                    break;
                case 3:
                    count=Del(count);//调用删除记录函数
                    break;
                case 4:
                    Register(count);
                    break;
                case 5:
                    Borrow(count);
                    break;
                case 6:
                    Back(count);
                    break;
                default:
                    printf("选择错误,按任意键返回主菜单....");
                    getchar();
                    getchar();
            }
        }
    }
    点赞 评论
  • technologist_15
    CSDN专家-三岁丫 2021-05-15 17:50

    你的 fclose(fp)和retuen cnt; 放错位置了吧,应该放在 while 循环外面

    点赞 评论
  • QA_Assistant
    有问必答小助手 2021-05-17 14:48

    您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

    如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

    ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

    点赞 评论

相关推荐