数据结构10

4.3 重要程序段3

void alterBook()

{

    Book book; //fread读取内容的结构变量

    FILE *pf = fopen("book.bin", "rb+");

    char strBno[10];

    char ch;

    int count=0;

    if (pf == NULL) {

        printf("打开book.bin文件失败啦!!\n");

        exit(1);

    }

    printf("请输入要修改的图书编号:");

    scanf("%s",strBno);

    fseek(pf, 0, SEEK_SET); //文件指针移到最前头

 

    while(fread(&book, sizeof(Book),1, pf) == 1)

    {

        //状态为1的才显示(未删除),且输入的编号存在

        if (book.state == 1 &&(strcmp(strBno, book.bno) == 0))

        {

            printf("%-10s %-10s %-8s %-15s %-8s %-10s\n","编号","名称","作者","出版日期","价格","数量");

            printf("%-10s %-11s %-7s %-13.10s ¥%-9.2f %d\n"

                   ,book.bno,book.name,book.author,book.pubDate,book.price,book.quantity);

            printf("找到以上书籍,是否要修改(y/n[a-z]): ");

            getchar();

            scanf("%c",&ch);

            if (ch == 'y' || ch == 'Y') {

                //将文件指针位置定位到该条记录指针的上一条数据,在执行写入就是更新此条记录

                fseek(pf, (long)(ftell(pf) - sizeof(Book)),0);

                book.state = 1; //默认1(未删除)

                strcpy(book.bno, strBno); //字符串赋值

                printf("图书名称:");

                scanf("%s",book.name);

                printf("图书作者:");

                scanf("%s",book.author);

                printf("出版日期(yyyy-mm-dd):");

                scanf("%s",book.pubDate);

                printf("图书价格:");

                scanf("%f",&book.price);

                printf("图书数量:");

                scanf("%d",&book.quantity);

                if(fwrite(&book, sizeof(Book), 1, pf))

                    printf("修改成功!");

                else

                    printf("修改失败!(error:401)");

                count = 0;

                break;

            }

            break;

        }

        else{

            count = 1;

        }

    }

    if (count)

        printf("未找到该图书信息!(error:402)\n");

    fclose(pf);

}

4.4 重要程序段4

void addBook()

{

    FILE *pf = fopen("Book.bin", "rb+");

    Book *head = (Book*)malloc(sizeof(Book));//创建一个头结点

    Book *node = head; //创建一个节点指向头结点,用于遍历

    Book *pb; //定义一个指针申请内存写入数据

    Book book;

    int success=0; //用于计算录入成功的数量

    int fail = 0;

    int count = 0;

    char ch;

 

    if (pf == NULL) {

        printf("打开book.bin文件失败啦!!\n");

        exit(1);

    }

    printf("录入图书信息(y/n):");

    getchar();

    scanf("%c",&ch);

    while(ch == 'y' || ch == 'Y')

    {

        getchar();

        pb = (Book*)malloc(sizeof(Book));

        pb->state = 1; //录入图书状态默认是1

        printf("图书编号:");

        scanf("%s",pb->bno);

        printf("图书名称:");

        scanf("%s",pb->name);

        printf("图书作者:");

        scanf("%s",pb->author);

        printf("出版日期(yyyy-mm-dd):");

        scanf("%s",pb->pubDate);

        printf("图书价格:");

        scanf("%f",&pb->price);

        printf("图书数量:");

        scanf("%d",&pb->quantity);

        pb->next = NULL; //初始化下一个节点为NULL

        node->next = pb;

        node = node->next;

        printf("是否继续录入(y/n[a-z]):");

        getchar();

        scanf("%c",&ch);

    }

    fseek(pf, 0, SEEK_END);//文件指针位置移到最后

    //遍历链表

    for (head=head->next; head; head=head->next) {

        count = 0;

        //循环读取文件内容,判断图书编号是否存在,存在则录入失败

        fseek(pf, 0, SEEK_SET); //文件指针移到最前头

        while(fread(&book, sizeof(Book),1, pf) == 1){

            //判断该书是否存在

            if (strcmp(book.bno, head->bno) == 0 && book.state == 1) {

                count = 1;

                fail++;

                break;

            }

        }

        //如果录入的书不存在,则文件指针位置移到最后,然后把该图书信息写文件里。

        if(count != 1){

            fseek(pf, 0, SEEK_END);

            fwrite(head, sizeof(Book), 1, pf);

            success++;

        }

    }

    printf("一共录入:%d本书  成功录入:%d 本  失败(已存在):%d 本\n",success+fail,success,fail);

    fclose(pf); //关闭文件

}

4.5 重要程序段5

void borrowBooks()

{

    FILE *pf = fopen("user.bin", "rb+");

    FILE *pfb = fopen("book.bin", "rb+");

    Book book;

    User user;

    User usertemp;

    int is=1;

    int t=0;

    char ch;

       long date=0;

 

    if (pf == NULL) {

        printf("打开user.bin文件失败啦!!\n");

        exit(1);

    }

    if (pfb == NULL) {

        printf("打开book.bin文件失败啦!!\n");

        exit(1);

    }

    do{

        printf("请输入你的学号:");

        scanf("%s",user.id);

        //文件指针移到最前头

        fseek(pf, 0, SEEK_SET);

        //如果是新用户要求输入姓名

        while(fread(&usertemp, sizeof(User),1, pf) == 1){

            if (strcmp(usertemp.id, user.id) == 0) {

                strcpy(user.name, usertemp.name);

                is = 0;

                break;

            }

        }

        if (is) {

            printf("请输入你的姓名(新用户):");

            scanf("%s",user.name);

        }

        printf("请输入借阅的图书编号:");

        scanf("%s",user.u_bno);

        fseek(pf, 0, SEEK_SET);

        //判断是否借过该书,不能重复借同一本书

        while(fread(&usertemp, sizeof(User),1, pf) == 1){

            if (strcmp(usertemp.u_bno, user.u_bno) == 0 && strcmp(usertemp.id, user.id) == 0

                &&usertemp.quantity != 0) {

                is = 2;

                break;

            }

        }

        user.quantity = 1; //默认每种图书只能借一本

        fseek(pf, 0, SEEK_END);//pf文件指针位置移到最后

        fseek(pfb, 0, SEEK_SET);//pfb文件指针位置移到最前

        //判断该图书是否存在才能借阅

        while(fread(&book, sizeof(Book),1, pfb) == 1 && is!=2){

            if (strcmp(book.bno, user.u_bno) == 0 && book.state == 1) {

                if (book.quantity >= user.quantity) {

                                   time(&date); //将时间变量赋值为系统当前时间的时间戳

                                   metis_strftime(date, user.date); //记录借阅时间

                    fwrite(&user, sizeof(User), 1, pf);

                    printf("借阅成功!书名:%s 借阅数量:%d\n",book.name,user.quantity);

                    book.quantity -= user.quantity;

                    //定位到该条图书信息指针文件位置,然后更新被借走的数量

                    fseek(pfb, (long)(ftell(pfb) - sizeof(Book)),0);

                    fwrite(&book, sizeof(Book), 1, pfb);

                    t = 0;

                    break;

                }

                else{

                    printf("借阅失败,该图书库存不足!(error:601)\n",book.quantity);

                    t=0;

                    break;

                }

            }

            else{

                t = 1;

            }

        }

        if (t)

            printf("借阅失败该书编号不存在!(error:602)\n");

        else if (is == 2)

            printf("你已借阅该图书,不能重复借阅!(error:603)\n");

        printf("是否继续借阅(y/n[a-z]):");

        getchar();

        scanf("%c",&ch);

    }while(ch == 'y' || ch == 'Y');

 

    fclose(pf); //关闭文件

    fclose(pfb); //关闭文件

}

4.6 重要程序段6

void revertBook()

{

    FILE *pf = fopen("user.bin", "rb+");

    FILE *pfb = fopen("book.bin", "rb+");

    Book book;

    User user;

    User utemp;

    char rbno[50];

    char utid[20];

    char ch;

    int count = 0;

    if (pf == NULL) {

        printf("打开user.bin文件失败啦!!\n");

        exit(1);

    }

    if (pfb == NULL) {

        printf("打开book.bin文件失败啦!!\n");

        exit(1);

    }

 

 

    do{

        printf("请输入你的学号:");

        scanf("%s",user.id);

        strcpy(utid, user.id);

        //文件指针移到最前头

        fseek(pf, 0, SEEK_SET);

        //学号存在才能归还

        while(fread(&utemp, sizeof(User),1, pf) == 1){

            if (strcmp(user.id, utemp.id) == 0) {

                count = 1;

                break;

            }

        }

        fseek(pf, 0, SEEK_SET);//pf文件指针位置移到最前

        if(count == 1){

            printf("以下是你借阅的书籍:\n");

            printf("%-10s %-15s %-16s %-24s\n","学号","图书编号","图书名称","借阅日期");

            while(fread(&utemp, sizeof(User),1, pf) == 1){

                fseek(pfb, 0, SEEK_SET);//pfb文件指针位置移到最前

                while (fread(&book, sizeof(Book), 1, pfb)==1 && (strcmp(user.id, utemp.id) ==0)) {

                    if (strcmp(utemp.u_bno,book.bno)==0 && utemp.quantity==1) {

                        printf("%-10s %-15s %-13s %s\n"

                               ,utemp.id,book.bno,book.name,utemp.date);

                    }

                }

            }

            printf("请输入你要归还的图书编号:");

            scanf("%s",rbno);

            fseek(pfb, 0, SEEK_SET);//pf文件指针位置移到最前

            fseek(pf, 0, SEEK_SET);//pf文件指针位置移到最前

            while(fread(&book, sizeof(Book), 1, pfb)==1){

                if (strcmp(book.bno,rbno) == 0) {

                    book.quantity+=1; //用户归还库存+1

                    //定位到该条图书信息指针文件位置,然后更新还书数量

                    fseek(pfb, (long)(ftell(pfb) - sizeof(Book)),0);

                    fwrite(&book, sizeof(Book), 1, pfb);

                    count = 2;

                    break;

                }

                else{

                    count = 3;

                }

            }

            while(fread(&user, sizeof(User), 1, pf)==1){

                if (strcmp(user.id,utid) == 0 && strcmp(user.u_bno,rbno) == 0

                    &&user.quantity != 0){

                    user.quantity = 0; // 用户归还后-1;

                    //定位到该条图书信息指针文件位置,然后更新还书信息

                    fseek(pf, (long)(ftell(pf) - sizeof(User)),0);

                    fwrite(&user, sizeof(User), 1, pf);

                    count = 2;

                    break;

                }

                else{

                    count = 3;

                }

            }

        }

        else{

            printf("系统未查询到该学号所借阅的图书!(error:701)\n");

        }

        if (count == 2) {

            printf("还书成功!\n");

        }

        else if(count == 3){

            printf("还书失败,你未借阅该图书!(error:702)\n");

        }

        printf("是否继续归还(y/n[a-z]):");

        getchar();

        scanf("%c",&ch);

    }while(ch == 'y' || ch == 'Y');

 

    fclose(pf);

    fclose(pfb);

}

posted @ 2022-07-15 22:54  清梦韶华  阅读(31)  评论(0编辑  收藏  举报