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();         
        } 
    } 
}

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

怎么搞

#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();
        }
    }
}

 

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

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

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

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