鱼C论坛

 找回密码
 立即注册
查看: 1226|回复: 8

[已解决]c语言图书管理系统求助

[复制链接]
发表于 2019-12-23 18:04:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
请问我的bookin    和delbook没办法在程序中增加或者减少数据
是不是某个地方错了呢?
就是红色的这两段
要怎样做呢?














#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#define LEN sizeof(struct Book)
#define DATA book_num,book_name
struct Card
{
        char card_num[10];
        char student_name[20];
    int book_totle;
};
struct Card card[5]={{"20111101","Zhanjun",3},{"20111103","YangKai",1},{"20111113","WuGang",4},{"20111123","Shanglei",2},{"20111105","ZhangKun",5}};
struct Date
{
        int year;
        int month;
        int day;
};
struct Book
{
    char book_num[10];
        char book_name[20];
   struct Date date;
   int flag;
};
struct Book book[5]={{"305032","History",{0,0,0},1},{"409812","Geogrophy",{0,0,0},1},{"213401","English",{0,0,0},1},{"3287463","Maths",{0,0,0},1},{"4102102","Physicyl",{0,0,0},1}};


char num[10];
void menu();//函数的声明
void borrowbook();
void returnbook();
void bookinquiry();
void bookin();
void readerinquiry();
void readerupdate();
void reborrow();
void delbook();


void borrowbook()
{
        int i;
        char booknum[10];
        printf("请输入要借阅的书号");
        scanf("%s",booknum);
        for(i=0;i<5;i++)
        {
                if(strcmp(booknum,book[i].book_num)==0)
                {
                        if(book[i].flag==0)
                                printf("这本书已经借出!\n");
                        else
                        {
                                book[i].flag=0;
              printf("借出日期填写:(请按年/月/日的顺序,如2019/9/8)\n");
                          scanf("%d/%d/%d",&book[i].date.year,&book[i].date.month,&book[i].date.day);
                          break;
                        }
                }
        }
    for(i=0;i<5;i++)
                if(strcmp(num,card[i].card_num)==0)
                { card[i].book_totle=card[i].book_totle+1;
                break;
                }
                printf("1.确认并返回菜单 2.确认信息并退出\n");
                scanf("%d",&i);
                if(i==1)menu();
                else exit(0);
}
void returnbook()
{
int i;
        char booknum[10];
        printf("请输入要还的书号");
        scanf("%s",booknum);
        for(i=0;i<5;i++)
        {
                if(strcmp(booknum,book[i].book_num)==0)
                {
                   book[i].flag=1;
                   break;
                }
                if(i>=5)
                        printf("卡号输入错误!");
                for(i=0;i<5;i++)
                if(strcmp(num,card[i].card_num)==0)
                { 
                        card[i].book_totle=card[i].book_totle+1;
                    break;
                }
                printf("1.确认并返回菜单 2.确认信息并退出\n");
                scanf("%d",&i);
                if(i==1)menu();
                else exit(0);
        }

}
        
void bookinquiry()
{
        int i;
        char booknum[10];
        printf("请输入要查询的书号:");
        scanf("%s",booknum);
        for(i=0;i<5;i++)
                if(strcmp(booknum,book[i].book_num)==0)
                {
        printf("编号  书名  借出日期  状态\n");
        printf("%s %s",book[i].book_num,book[i].book_name);
        printf("%4d年%2d月%2d日",book[i].date.year,book[i].date.month,book[i].date.day);
        if(book[i].flag==1)
                                printf("未借出!\n");
                        else
                        printf("已借出!\n");
        }
        printf("1.确认并返回菜单 2.确认信息并退出\n");
                scanf("%d",&i);
                if(i==1)
                        menu();
                else 
                        exit(0);
}

void bookin()

{ 
    int i,m=0;/*m是记录的条数*/
    char ch[2];
    FILE *fp;/*定义文件指针*/
    if((fp=fopen("data","ab+"))==NULL)/*打开指定文件*/
    { 
        printf("不能打开文件!\n");
        return;
    }
    while(!feof(fp)) 
    { 
        if(fread(&book[m] ,LEN,1,fp)==1)
            m++;/*统计当前记录条数*/
    }
    fclose(fp);
    if(m==0) 
        printf("没有找到!\n");
    
    if((fp=fopen("data","wb"))==NULL)
    { 
        printf("不能打开文件!\n");
        return;
    }
    for(i=0;i<m;i++) 
        fwrite(&book[i] ,LEN,1,fp);/*向指定的磁盘文件写入信息*/
    printf("是否输入?(y/n):");
    scanf("%s",ch);
    while(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)/*判断是否要录入新信息*/
    {
        printf("号:");
        scanf("%d",&book[m].book_num);
        for(i=0;i<m;i++)
            if(book[m].book_num ==book[i].book_num)
            {
                printf("该记录已经存在,按任意键继续!");
                getch();
                fclose(fp);
                return;
            }
            printf("书名:");
            scanf("%s",book[m].book_name);  
              
            
            if(fwrite(&book[m],LEN,1,fp)!=1)  /*将新录入的信息写入指定的磁盘文件*/
            {
                printf("不能保存!"); 
                getch(); 
            }
            else
            { 
                printf("%s 已经保存!\n",book[m].book_name);
                m++;
            }
            printf("是否继续?(y/n):");/*询问是否继续*/
            scanf("%s",ch);
    }
    fclose(fp);
    printf("OK!\n");
                printf("1.确认并返回菜单 2.确认信息并退出\n");
                scanf("%d",&i);
                if(i==1)
                        menu();
                else 
                        exit(0);
}




void delbook()
{
    FILE *fp;
    int snum,i,j,m=0;
    char ch[2];
    if((fp=fopen("data","ab+"))==NULL)
    { 
        printf("不能打开文件\n");
        return;
    }
    while(!feof(fp))  
        if(fread(&book[m],LEN,1,fp)==1) 
            m++;
        fclose(fp);
        
        printf("请输入编号:");
        scanf("%d",&snum);
        for(i=0;i<5;i++)
            if(snum==book[i].book_num)
                break;
            if(i==m)
            {
                printf("没有找到!");
                getchar();
                return;
            }
            printf("已经找到该记录,是否删除?(y/n)");
            scanf("%s",ch);
            if(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)/*判断是否要进行删除*/
            {
                for(j=i;j<m;j++)
                    book[j] = book[j+1];/*将后一个记录移到前一个记录的位置*/
                i--;/*记录的总个数减1*/
                printf("成功删除!\n");
            }
            if((fp=fopen("data","wb"))==NULL)
            { 
                printf("不能打开!\n");
                return;
            }
            for(j=0;j<m;j++)/*将更改后的记录重新写入指定的磁盘文件中*/
                if(fwrite(&book[j] ,LEN,1,fp)!=1)
                { 
                    printf("不能保存!\n");
                    getch();
                }
                fclose(fp);
                printf("1.确认并返回菜单 2.确认信息并退出\n");
                scanf("%d",&i);
                if(i==1)
                        menu();
                else 
                        exit(0);
}


void readerinquiry()
{
        int i;
        char studentname[20];
        printf("请输入要查询的读者");
        scanf("%s",studentname);
        for(i=0;i<5;i++)
        if(strcmp(studentname,card[i].student_name)==0)
                {
        printf("借书证号  姓名  书名  借出日期  \n");
        printf("%s %s %s",card[i].card_num,card[i].student_name,book[i].book_name);
        printf("%4d年%2d月%2d日\n",book[i].date.year,book[i].date.month,book[i].date.day);
        
        }
        printf("1.确认并返回菜单 2.确认信息并退出\n");
                scanf("%d",&i);
                if(i==1)menu();
                else exit(0);
}
void readerupdate()
{

        printf("这是添加与删除读者的函数\n");
}

void reborrow()
{
        int i;
        char booknum[10];
        printf("请输入要续借的书号");
        scanf("%s",booknum);
        for(i=0;i<5;i++)
        if(strcmp(booknum,book[i].book_num)==0)
        {
        printf("编号  书名  借出日期  状态\n");
        printf("%s %s",book[i].book_num,book[i].book_name);
        printf("%4d年%2d月%2d日",book[i].date.year,book[i].date.month,book[i].date.day);
        
        if(book[i].flag==1)
            printf("不能续借!\n");
                        else
                                printf("可以续借!\n");
        }

                        printf("1.确认续借    2.取消续借");
                        scanf("%d",&i);
             if(i==1)
                {
               book[i].flag=0;
             printf("续借日期填写:(请按年/月/日的顺序,如2019/9/8)\n");
                    scanf("%d/%d/%d",&book[i].date.year,&book[i].date.month,&book[i].date.day);
                           
                }
                else 
                printf("1.确认并返回菜单 2.确认信息并退出\n");
                scanf("%d",&i);
                if(i==1)menu();
                else exit(0);
}
void menu()
{
        int n;
        printf("~~~欢迎使用本校图书管理系统~~~\n");
        printf("*******************************\n");
        printf("1.借书\n");
        printf("2.还书\n");
        printf("3.图书查询\n");
        printf("4.新书上架\n");
    printf("5.旧书下架\n");
        printf("6.读者查询\n");
        printf("7.添加与删除读者\n");
        printf("8.续借\n");
    printf("9.退出\n");
        printf("请选择以上选项:\n");
        printf("*******************************\n");
        scanf("%d",&n);
        switch(n)
        {
        case 1:borrowbook();break;
        case 2:returnbook();break;
        case 3:bookinquiry();break;
        case 4:bookin();break;
    case 5:delbook();break;
        case 6:readerinquiry();break;
        case 7:readerupdate();break;
        case 8:reborrow();break;
        case 9:exit(0);break;
    default:printf("输入错误,退出\n");exit(0);break;
        }

}

void main()
{   
        int i;
        char num[10];
        printf("请输入你的卡号");
        scanf("%s",num);
        for(i=0;i<5;i++)
        if(strcmp(num,card[i].card_num)==0)
                break;
        if(i>=5)
        {
                printf("卡号不存在!");
                exit(0);
        }
else
        menu();
         
}
最佳答案
2019-12-23 21:39:47
book的book_num定义的是字符数组,所以bookin函数里:
scanf("%d", &book[m].book_num);
if (book[m].book_num == book[i].book_num)
应该改成:
scanf("%s", book[m].book_num);
if (strcmp(book[m].book_num, book[i].book_num) == 0)

delbook函数里判断书号也是类似的问题:
if (snum == book[i].book_num)
snum定义的是int,而book_num是字符数组。

动态添加删除改成用链表实现比较好吧。网上有很多例子,本论坛也有很多贴子。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-12-23 21:39:47 | 显示全部楼层    本楼为最佳答案   
book的book_num定义的是字符数组,所以bookin函数里:
scanf("%d", &book[m].book_num);
if (book[m].book_num == book[i].book_num)
应该改成:
scanf("%s", book[m].book_num);
if (strcmp(book[m].book_num, book[i].book_num) == 0)

delbook函数里判断书号也是类似的问题:
if (snum == book[i].book_num)
snum定义的是int,而book_num是字符数组。

动态添加删除改成用链表实现比较好吧。网上有很多例子,本论坛也有很多贴子。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-24 21:54:11 | 显示全部楼层
superbe 发表于 2019-12-23 21:39
book的book_num定义的是字符数组,所以bookin函数里:
scanf("%d", &book[m].book_num);
if (book[m].bo ...

非常感谢,这个问题困扰我好几天。
你的回答很好的帮助了我。
新手新手
链表的话还没有学到,后续一定会补上这部分内容
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-24 22:41:11 | 显示全部楼层
superbe 发表于 2019-12-23 21:39
book的book_num定义的是字符数组,所以bookin函数里:
scanf("%d", &book[m].book_num);
if (book[m].bo ...

你好,如果按照现在这种方法的话删除(delbook)要怎么做
我的bookin和delbook都是从其他类似的搬过来的
现在的话添加(bookin)已经能好了
但是delbook不能操作
请问是哪里有问题呢?
要怎么修改呢?
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#define LEN sizeof(struct Book)
#define DATA book_num,book_name
struct Card
{
        char card_num[10];
        char student_name[20];
    int book_totle;
};
struct Card card[5]={{"20111101","Zhanjun",3},{"20111103","YangKai",1},{"20111113","WuGang",4},{"20111123","Shanglei",2},{"20111105","ZhangKun",5}};
struct Date
{
        int year;
        int month;
        int day;
};
struct Book
{
    char book_num[10];
        char book_name[20];
   struct Date date;
   int flag;
};
struct Book book[5]={{"305032","History",{0,0,0},1},{"409812","Geogrophy",{0,0,0},1},{"213401","English",{0,0,0},1},{"3287463","Maths",{0,0,0},1},{"4102102","Physicyl",{0,0,0},1}};


char num[10];
void menu();//函数的声明
void borrowbook();
void returnbook();
void bookinquiry();
void bookin();
void readerinquiry();
void readerupdate();
void reborrow();
void delbook();


void borrowbook()
{
        int i;
        char booknum[10];
        printf("请输入要借阅的书号");
        scanf("%s",booknum);
        for(i=0;i<5;i++)
        {
                if(strcmp(booknum,book[i].book_num)==0)
                {
                        if(book[i].flag==0)
                                printf("这本书已经借出!\n");
                        else
                        {
                                book[i].flag=0;
              printf("借出日期填写:(请按年/月/日的顺序,如2019/9/8)\n");
                          scanf("%d/%d/%d",&book[i].date.year,&book[i].date.month,&book[i].date.day);
                          break;
                        }
                }
        }
    for(i=0;i<5;i++)
                if(strcmp(num,card[i].card_num)==0)
                { card[i].book_totle=card[i].book_totle+1;
                break;
                }
                printf("1.确认并返回菜单 2.确认信息并退出\n");
                scanf("%d",&i);
                if(i==1)menu();
                else exit(0);
}
void returnbook()
{
int i;
        char booknum[10];
        printf("请输入要还的书号");
        scanf("%s",booknum);
        for(i=0;i<5;i++)
        {
                if(strcmp(booknum,book[i].book_num)==0)
                {
                   book[i].flag=1;
                   break;
                }
                if(i>=5)
                        printf("卡号输入错误!");
                for(i=0;i<5;i++)
                if(strcmp(num,card[i].card_num)==0)
                { 
                        card[i].book_totle=card[i].book_totle+1;
                    break;
                }
                printf("1.确认并返回菜单 2.确认信息并退出\n");
                scanf("%d",&i);
                if(i==1)menu();
                else exit(0);
        }

}
        
void bookinquiry()
{
        int i;
        char booknum[10];
        printf("请输入要查询的书号:");
        scanf("%s",booknum);
        for(i=0;i<5;i++)
                if(strcmp(booknum,book[i].book_num)==0)
                {
        printf("编号  书名  借出日期  状态\n");
        printf("%s %s",book[i].book_num,book[i].book_name);
        printf("%4d年%2d月%2d日",book[i].date.year,book[i].date.month,book[i].date.day);
        if(book[i].flag==1)
                                printf("未借出!\n");
                        else
                        printf("已借出!\n");
        }
        printf("1.确认并返回菜单 2.确认信息并退出\n");
                scanf("%d",&i);
                if(i==1)
                        menu();
                else 
                        exit(0);
}

void bookin()

{ 
    int i,m=0;/*m是记录的条数*/
    char ch[2];
    FILE *fp;/*定义文件指针*/
    if((fp=fopen("data","ab+"))==NULL)/*打开指定文件*/
    { 
        printf("不能打开文件!\n");
        return;
    }
    while(!feof(fp)) 
    { 
        if(fread(&book[m] ,LEN,1,fp)==1)
            m++;/*统计当前记录条数*/
    }
    fclose(fp);
    
    
    if((fp=fopen("data","wb"))==NULL)
    { 
        printf("不能打开文件!\n");
        return;
    }
    for(i=0;i<m;i++) 
        fwrite(&book[i] ,LEN,1,fp);/*向指定的磁盘文件写入信息*/
    printf("是否输入?(y/n):");
    scanf("%s",ch);
    while(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)/*判断是否要录入新信息*/
    {
        printf("图书编号:");
        scanf("%s",book[m].book_num);
        for(i=0;i<m;i++)
            if (strcmp(book[m].book_num, book[i].book_num) == 0)
            {
                printf("该记录已经存在\n");
                printf("1.确认并返回菜单 2.确认信息并退出\n");
                        scanf("%d",&i);
                if(i==1)
                        menu();
                else 
                        exit(0);
            }
            printf("书名:");
            scanf("%s",book[m].book_name);  
              
            
            if(fwrite(&book[m],LEN,1,fp)!=1)  /*将新录入的信息写入指定的磁盘文件*/
            {
                printf("不能保存!"); 
                getch(); 
            }
            else
            { 
                printf("%s 已经保存!\n",book[m].book_name);
                m++;
            }
            printf("是否继续?(y/n):");/*询问是否继续*/
            scanf("%s",ch);
    }
    fclose(fp);
    printf("OK!\n");
                printf("1.确认并返回菜单 2.确认信息并退出\n");
                scanf("%d",&i);
                if(i==1)
                        menu();
                else 
                        exit(0);
}




void delbook()
{
    FILE *fp;
    int i,j,m=0;
        char snum;
    char ch[2];
    if((fp=fopen("data","ab+"))==NULL)
    { 
        printf("不能打开文件\n");
        return;
    }
    while(!feof(fp))  
        if(fread(&book[m],LEN,1,fp)==1) 
            m++;
        fclose(fp);
        
        printf("请输入编号:");
        scanf("%s",snum);
        for(i=0;i<5;i++)
            if (strcmp(snum, book[i].book_num) == 0)
               
      printf("已经找到该记录,是否删除?(y/n)");
            scanf("%s",ch);
            if(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)/*判断是否要进行删除*/
            {
                for(j=i;j<m;j++)
                    book[j] = book[j+1];/*将后一个记录移到前一个记录的位置*/
                i--;/*记录的总个数减1*/
                printf("成功删除!\n");
            }
            if((fp=fopen("data","wb"))==NULL)
            { 
                printf("不能打开!\n");
                return;
            }
            for(j=0;j<m;j++)/*将更改后的记录重新写入指定的磁盘文件中*/
                if(fwrite(&book[j] ,LEN,1,fp)!=1)
                { 
                    printf("不能保存!\n");
                    getch();
                }
                fclose(fp);
                printf("1.确认并返回菜单 2.确认信息并退出\n");
                scanf("%d",&i);
                if(i==1)
                        menu();
                else 
                        exit(0);
}


void readerinquiry()
{
        int i;
        char studentname[20];
        printf("请输入要查询的读者");
        scanf("%s",studentname);
        for(i=0;i<5;i++)
        if(strcmp(studentname,card[i].student_name)==0)
                {
        printf("借书证号  姓名  书名  借出日期  \n");
        printf("%s %s %s",card[i].card_num,card[i].student_name,book[i].book_name);
        printf("%4d年%2d月%2d日\n",book[i].date.year,book[i].date.month,book[i].date.day);
        
        }
        printf("1.确认并返回菜单 2.确认信息并退出\n");
                scanf("%d",&i);
                if(i==1)menu();
                else exit(0);
}
void readerupdate()
{






















        printf("这是添加与删除读者的函数\n");
}

void reborrow()
{
        int i;
        char booknum[10];
        printf("请输入要续借的书号");
        scanf("%s",booknum);
        for(i=0;i<5;i++)
        if(strcmp(booknum,book[i].book_num)==0)
        {
        printf("编号  书名  借出日期  状态\n");
        printf("%s %s",book[i].book_num,book[i].book_name);
        printf("%4d年%2d月%2d日",book[i].date.year,book[i].date.month,book[i].date.day);
        
        if(book[i].flag==1)
            printf("不能续借!\n");
                        else
                                printf("可以续借!\n");
        }

                        printf("1.确认续借    2.取消续借");
                        scanf("%d",&i);
             if(i==1)
                {
               book[i].flag=0;
             printf("续借日期填写:(请按年/月/日的顺序,如2019/9/8)\n");
                    scanf("%d/%d/%d",&book[i].date.year,&book[i].date.month,&book[i].date.day);
                           
                }
                else 
                printf("1.确认并返回菜单 2.确认信息并退出\n");
                scanf("%d",&i);
                if(i==1)menu();
                else exit(0);
}
void menu()
{
        int n;
        printf("~~~欢迎使用本校图书管理系统~~~\n");
        printf("*******************************\n");
        printf("1.借书\n");
        printf("2.还书\n");
        printf("3.图书查询\n");
        printf("4.新书上架\n");
    printf("5.旧书下架\n");
        printf("6.读者查询\n");
        printf("7.添加与删除读者\n");
        printf("8.续借\n");
    printf("9.退出\n");
        printf("请选择以上选项:\n");
        printf("*******************************\n");
        scanf("%d",&n);
        switch(n)
        {
        case 1:borrowbook();break;
        case 2:returnbook();break;
        case 3:bookinquiry();break;
        case 4:bookin();break;
    case 5:delbook();break;
        case 6:readerinquiry();break;
        case 7:readerupdate();break;
        case 8:reborrow();break;
        case 9:exit(0);break;
    default:printf("输入错误,退出\n");exit(0);break;
        }

}

void main()
{   
        int i;
        char num[10];
        printf("请输入你的卡号");
        scanf("%s",num);
        for(i=0;i<5;i++)
        if(strcmp(num,card[i].card_num)==0)
                break;
        if(i>=5)
        {
                printf("卡号不存在!");
                exit(0);
        }
else
        menu();
         
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-24 23:46:03 | 显示全部楼层
本帖最后由 superbe 于 2019-12-24 23:58 编辑

有一点小修改:
void delbook()
{
    FILE *fp;
    int i, j, m = 0;
    char snum[10];                                                //修改的行  (原来是char snum; )
    char ch[2];
    if ((fp = fopen("data", "ab+")) == NULL)
    {
        printf("不能打开文件\n");
        return;
    }
    while (!feof(fp))
        if (fread(&book[m], LEN, 1, fp) == 1)
            m++;
    fclose(fp);

    printf("请输入编号:");
    scanf("%s", snum);
    for (i = 0; i<5; i++)
        if (strcmp(snum, book[i].book_num) == 0)
        {                                                                   //修改的行 (添加了{ )
            printf("已经找到该记录,是否删除?(y/n)");
            break;                                                       //修改的行 (添加了break )
        }                                                                   //修改的行 (添加了} )
    scanf("%s", ch);
    if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)/*判断是否要进行删除*/
    {
        for (j = i; j<m; j++)
            book[j] = book[j + 1];/*将后一个记录移到前一个记录的位置*/
        m--;           /*记录的总个数减1*/                                  //修改的行 (原来是 i--; )
        printf("成功删除!\n");
    }
    if ((fp = fopen("data", "wb")) == NULL)
    {
        printf("不能打开!\n");
        return;
    }
    for (j = 0; j<m; j++)/*将更改后的记录重新写入指定的磁盘文件中*/
        if (fwrite(&book[j], LEN, 1, fp) != 1)
        {
            printf("不能保存!\n");
            getch();
        }
    fclose(fp);
    printf("1.确认并返回菜单 2.确认信息并退出\n");
    scanf("%d", &i);
    if (i == 1)
        menu();
    else
        exit(0);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-25 07:53:15 | 显示全部楼层
好的,谢谢!
大神请收下我的膝盖!!!
突然觉得c语言的世界很奇妙
努力学c
加油
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-25 18:39:39 | 显示全部楼层
加油
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-12-27 17:12:45 | 显示全部楼层
想做一个显示所有信息的函数(show)
不输入数据的话信息显示挺好
如果用bookin函数输入数据的话就乱套了
用delbook删除居然还能再显示(show)函数查到
请问这是咋回事


#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#define LEN sizeof(struct Book)
#define FORMAT "%-15s%-15s%-15s%-15s\n"
#define DATA card[i].card_num,card[i].student_name,book[i].book_num,book[i].book_name
struct Card
{
        char card_num[99];
        char student_name[20];
    int book_totle;
};
struct Card card[10]={{"20111101","Zhanjun",3},{"20111103","YangKai",1},{"20111113","WuGang",4},{"20111123","Shanglei",2},{"20111105","ZhangKun",5}};
struct Date
{
        int year;
        int month;
        int day;
};
struct Book
{
    char book_num[10];
        char book_name[20];
   struct Date date;
   int flag;
};
struct Book book[10]={{"305032","History",{0,0,0},1},{"409812","Geogrophy",{0,0,0},1},{"213401","English",{0,0,0},1},{"3287463","Maths",{0,0,0},1},{"4102102","Physicyl",{0,0,0},1}};


char num[10];
void menu();//函数的声明
void borrowbook();
void returnbook();
void bookinquiry();
void bookin();
void readerinquiry();
void readerin();
void reborrow();
void delbook();
void delreader();
void show();


void borrowbook()
{
        int i;
        char booknum[10];
        printf("请输入要借阅的书号");
        scanf("%s",booknum);
        for(i=0;i<5;i++)
        {
                if(strcmp(booknum,book[i].book_num)==0)
                {
                        if(book[i].flag==0)
                                printf("这本书已经借出!\n");
                        else
                        {
                                book[i].flag=0;
              printf("借出日期填写:(请按年/月/日的顺序,如2019/9/8)\n");
                          scanf("%d/%d/%d",&book[i].date.year,&book[i].date.month,&book[i].date.day);
                          break;
                        }
                }
        }
    for(i=0;i<5;i++)
                if(strcmp(num,card[i].card_num)==0)
                { card[i].book_totle=card[i].book_totle+1;
                break;
                }
                printf("1.确认并返回菜单 2.确认信息并退出\n");
                scanf("%d",&i);
                if(i==1)menu();
                else exit(0);
}
void returnbook()
{
int i;
        char booknum[10];
        printf("请输入要还的书号");
        scanf("%s",booknum);
        for(i=0;i<5;i++)
        {
                if(strcmp(booknum,book[i].book_num)==0)
                {
                   book[i].flag=1;
                   break;
                }
                if(i>=5)
                        printf("卡号输入错误!");
                for(i=0;i<5;i++)
                if(strcmp(num,card[i].card_num)==0)
                { 
                        card[i].book_totle=card[i].book_totle+1;
                    break;
                }
                printf("1.确认并返回菜单 2.确认信息并退出\n");
                scanf("%d",&i);
                if(i==1)menu();
                else exit(0);
        }

}
        
void bookinquiry()
{
        int i;
        char booknum[10];
        printf("请输入要查询的书号:");
        scanf("%s",booknum);
        for(i=0;i<5;i++)
                if(strcmp(booknum,book[i].book_num)==0)
                {
        printf("编号  书名  借出日期  状态\n");
        printf("%s %s",book[i].book_num,book[i].book_name);
        printf("%4d年%2d月%2d日",book[i].date.year,book[i].date.month,book[i].date.day);
        if(book[i].flag==1)
                                printf("未借出!\n");
                        else
                        printf("已借出!\n");
        }
         
                 printf("书号不存在\n");
        printf("1.确认并返回菜单 2.确认信息并退出\n");
                scanf("%d",&i);
                if(i==1)
                        menu();
                else 
                        exit(0);
        
}

void bookin()

{ 
    int i,m=0;
    char ch[2];
    FILE *fp;
    if((fp=fopen("data","ab+"))==NULL)
    { 
        printf("不能打开文件!\n");
        return;
    }
    while(!feof(fp)) 
    { 
        if(fread(&book[m] ,LEN,1,fp)==1)
            m++;
    }
    fclose(fp);
    
    
    if((fp=fopen("data","wb"))==NULL)
    { 
        printf("不能打开文件!\n");
        return;
    }
    for(i=0;i<m;i++) 
        fwrite(&book[i] ,LEN,1,fp);
    printf("是否输入?(y/n):");
    scanf("%s",ch);
    while(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)
    {
        printf("图书编号:");
        scanf("%s",book[m].book_num);
        for(i=0;i<m;i++)
            if (strcmp(book[m].book_num, book[i].book_num) == 0)
            {
                printf("该记录已经存在\n");
                printf("1.确认并返回菜单 2.确认信息并退出\n");
                        scanf("%d",&i);
                if(i==1)
                        menu();
                else 
                        exit(0);
            }
            printf("书名:");
            scanf("%s",book[m].book_name);  
              
            
            if(fwrite(&book[m],LEN,1,fp)!=1)  
            {
                printf("不能保存!"); 
                getch(); 
            }
            else
            { 
                printf("%s 已经保存!\n",book[m].book_name);
                m++;
            }
            printf("是否继续?(y/n):");
            scanf("%s",ch);
    }
    fclose(fp);
    printf("OK!\n");
                printf("1.确认并返回菜单 2.确认信息并退出\n");
                scanf("%d",&i);
                if(i==1)
                        menu();
                else 
                        exit(0);
}









void delbook()
{
    FILE *fp;
    int i, j, m = 0;
    char snum[10];                                                
    char ch[2];
    if ((fp = fopen("data", "ab+")) == NULL)
    {
        printf("不能打开文件\n");
        return;
    }
    while (!feof(fp))
        if (fread(&book[m], LEN, 1, fp) == 1)
            m++;
    fclose(fp);

    printf("请输入编号:");
    scanf("%s", snum);
    for (i = 0; i<5; i++)
        if (strcmp(snum, book[i].book_num) == 0)
        {                                                                   
            printf("已经找到该记录,是否删除?(y/n)");
            break;                                                       
        }                                                                  
    scanf("%s", ch);
    if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
    {
        for (j = i; j<m; j++)
            book[j] = book[j + 1];
        m--;                                            
        printf("成功删除!\n");
    }
    if ((fp = fopen("data", "wb")) == NULL)
    {
        printf("不能打开!\n");
        return;
    }
    for (j = 0; j<m; j++)
        if (fwrite(&book[j], LEN, 1, fp) != 1)
        {
            printf("不能保存!\n");
            getch();
        }
    fclose(fp);
    printf("1.确认并返回菜单 2.确认信息并退出\n");
    scanf("%d", &i);
    if (i == 1)
        menu();
    else
        exit(0);
}


void readerinquiry()
{
        int i;
        char studentname[20];
        printf("请输入要查询的读者");
        scanf("%s",studentname);
        for(i=0;i<5;i++)
        if(strcmp(studentname,card[i].student_name)==0)
                {
        printf("借书证号  姓名  书名  借出日期  \n");

        printf("%s %s %s",card[i].card_num,card[i].student_name,book[i].book_name);
        printf("%4d年%2d月%2d日\n",book[i].date.year,book[i].date.month,book[i].date.day);
        
        }

        printf("1.确认并返回菜单 2.确认信息并退出\n");
                scanf("%d",&i);
                if(i==1)menu();
                else exit(0);
}
void readerin()

{ 
    int i,m=0;
    char ch[2];
    FILE *fp;
    if((fp=fopen("data","ab+"))==NULL)
    { 
        printf("不能打开文件!\n");
        return;
    }
    while(!feof(fp)) 
    { 
        if(fread(&card[m] ,LEN,1,fp)==1)
            m++;
    }
    fclose(fp);
    
    
    if((fp=fopen("data","wb"))==NULL)
    { 
        printf("不能打开文件!\n");
        return;
    }
    for(i=0;i<m;i++) 
        fwrite(&card[i] ,LEN,1,fp);
    printf("是否输入?(y/n):");
    scanf("%s",ch);
    while(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)
    {
        printf("学号:");
        scanf("%s",card[m].card_num);
        for(i=0;i<m;i++)
            if (strcmp(card[m].card_num, card[i].card_num) == 0)
            {
                printf("该记录已经存在\n");
                printf("1.确认并返回菜单 2.确认信息并退出\n");
                        scanf("%d",&i);
                if(i==1)
                        menu();
                else 
                        exit(0);
            }
            printf("姓名:");
            scanf("%s",card[m].student_name);  
              
            
            if(fwrite(&card[m],LEN,1,fp)!=1)  
            {
                printf("不能保存!"); 
                getch(); 
            }
            else
            { 
                printf("%s 已经保存!\n",card[m].student_name);
                m++;
            }
            printf("是否继续?(y/n):");
            scanf("%s",ch);
    }
    fclose(fp);
    printf("OK!\n");
                printf("1.确认并返回菜单 2.确认信息并退出\n");
                scanf("%d",&i);
                if(i==1)
                        menu();
                else 
                        exit(0);
}
void delreader()
{
    FILE *fp;
    int i, j, m = 0;
    char num[10];                                                
    char ch[2];
    if ((fp = fopen("data", "ab+")) == NULL)
    {
        printf("不能打开文件\n");
        return;
    }
    while (!feof(fp))
        if (fread(&card[m], LEN, 1, fp) == 1)
            m++;
    fclose(fp);

    printf("请输入编号:");
    scanf("%s", num);
    for (i = 0; i<5; i++)
        if (strcmp(num, card[i].card_num) == 0)
        {                                                                   
            printf("已经找到该记录,是否删除?(y/n)");
            break;                                                       
        }                                                                   
    scanf("%s", ch);
    if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
    {
        for (j = i; j<m; j++)
            card[j] = card[j + 1];
        m--;                                            
        printf("成功删除!\n");
    }
    if ((fp = fopen("data", "wb")) == NULL)
    {
        printf("不能打开!\n");
        return;
    }
    
    fclose(fp);
    printf("1.确认并返回菜单 2.确认信息并退出\n");
    scanf("%d", &i);
    if (i == 1)
        menu();
    else
        exit(0);
}


void reborrow()
{
        int i;
        char booknum[10];
        printf("请输入要续借的书号");
        scanf("%s",booknum);
        for(i=0;i<5;i++)
        if(strcmp(booknum,book[i].book_num)==0)
        {
        printf("编号  书名  借出日期  状态\n");
        printf("%s %s",book[i].book_num,book[i].book_name);
        printf("%4d年%2d月%2d日",book[i].date.year,book[i].date.month,book[i].date.day);
        
        if(book[i].flag==1)
            printf("不能续借!\n");
                        else
                                printf("可以续借!\n");
        }

                        printf("1.确认续借    2.取消续借");
                        scanf("%d",&i);
             if(i==1)
                {
               book[i].flag=0;
             printf("续借日期填写:(请按年/月/日的顺序,如2019/9/8)\n");
                    scanf("%d/%d/%d",&book[i].date.year,&book[i].date.month,&book[i].date.day);
                           
                }
                else 
                printf("1.确认并返回菜单 2.确认信息并退出\n");
                scanf("%d",&i);
                if(i==1)menu();
                else exit(0);
}
void show()     
{
   
    int i;
    
    printf("学号           姓名           书号           书名\t\n");
    for(i=0;i<10;i++)
    printf(FORMAT,DATA);
 
                printf("1.确认并返回菜单 2.确认信息并退出\n");
                scanf("%d",&i);
                if(i==1)
                        menu();
                else 
                        exit(0);
}


void menu()
{
        int n;
        printf("~~~欢迎使用本校图书管理系统~~~\n");
        printf("*******************************\n");
        printf("1.借书\n");
        printf("2.还书\n");
        printf("3.图书查询\n");
        printf("4.新书上架\n");
    printf("5.旧书下架\n");
        printf("6.读者查询\n");
        printf("7.添加读者\n");
        printf("8.删除读者\n");
        printf("9.续借\n");
        printf("10.显示\n");
    printf("11.退出\n");
        printf("请选择以上选项:\n");
        printf("*******************************\n");
        scanf("%d",&n);
        switch(n)
        {
        case 1:borrowbook();break;
        case 2:returnbook();break;
        case 3:bookinquiry();break;
        case 4:bookin();break;
    case 5:delbook();break;
        case 6:readerinquiry();break;
        case 7:readerin();break;
        case 8:delreader();break;
        case 9:reborrow();break;
        case 10:show();break;
        case 11:exit(0);break;

    default:printf("输入错误,退出\n");exit(0);break;
        }

}

void main()
{   
        int i;
        char num[10];
        printf("请输入你的卡号");
        scanf("%s",num);
        for(i=0;i<5;i++)
        if(strcmp(num,card[i].card_num)==0)
                break;
        if(i>=5)
        {
                printf("卡号不存在!");
                exit(0);
        }
else
        menu();
         
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-27 22:30:16 | 显示全部楼层
本帖最后由 superbe 于 2019-12-27 22:36 编辑

可能是data文件和数组数据不一致导致的,实际上并没有从数组中删除掉。
例如data文件为空,delBook()函数里
if (fread(&book[m], LEN, 1, fp) == 1)  
    m++;
读取不成功,m值为0,所以
for (j = i; j<m; j++)
    book[j] = book[j + 1];
j<m不成立,没有执行。

这是书上的一个程序可以参考,和你的需求有点类似。这个代码开始就从文件中读取数据,如果文件为空就输入新数据,并保存到文件。以后每次读取文件都是最新数据,输入的新数据会追加到文件末尾,数组数据和文件是保持一致的。
/* booksave.c -- 在文件中保存结构的内容 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXTITL  40
#define MAXAUTL  40
#define MAXBKS   10             /* 最大书籍数量 */
char * s_gets(char * st, int n);
struct book {                   /* book结构  */
    char title[MAXTITL];
    char author[MAXAUTL];
    float value;
};

int main(void)
{
    struct book library[MAXBKS]; /* 结构数组  */
    int count = 0;
    int index, filecount;
    FILE * pbooks;
    int size = sizeof (struct book);
    
    if ((pbooks = fopen("book.dat", "a+b")) == NULL)
    {
        fputs("Can't open book.dat file\n",stderr);
        exit(1);
    }
    
    rewind(pbooks);            /* 定位到文件开始  */
    while (count < MAXBKS &&  fread(&library[count], size,
                                    1, pbooks) == 1)
    {
        if (count == 0)
            puts("Current contents of book.dat:");
        printf("%s by %s: $%.2f\n",library[count].title,
               library[count].author, library[count].value);
        count++;
    }
    filecount = count;
    if (count == MAXBKS)
    {
        fputs("The book.dat file is full.", stderr);
        exit(2);
    }
    
    puts("Please add new book titles.");
    puts("Press [enter] at the start of a line to stop.");
    while (count < MAXBKS && s_gets(library[count].title, MAXTITL) != NULL
           && library[count].title[0] != '\0')
    {
        puts("Now enter the author.");
        s_gets(library[count].author, MAXAUTL);
        puts("Now enter the value.");
        scanf("%f", &library[count++].value);
        while (getchar() != '\n')
            continue;                /* 清理输入行  */
        if (count < MAXBKS)
            puts("Enter the next title.");
    }
    
    if (count > 0)
    {
        puts("Here is the list of your books:");
        for (index = 0; index < count; index++)
            printf("%s by %s: $%.2f\n",library[index].title,
                   library[index].author, library[index].value);
        fwrite(&library[filecount], size, count - filecount,
               pbooks);
    }
    else
            puts("No books? Too bad.\n");
    
    puts("Bye.\n");
    fclose(pbooks);
    
    return 0;
}

char * s_gets(char * st, int n)
{
    char * ret_val;
    char * find;
    
    ret_val = fgets(st, n, stdin);
    if (ret_val)
    {
        find = strchr(st, '\n');   // look for newline
        if (find)                  // if the address is not NULL,
            *find = '\0';          // place a null character there
        else
            while (getchar() != '\n')
                continue;          // dispose of rest of line
    }
    return ret_val;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-5 05:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表