C语言实现图书管理系统:从文件存储到借阅功能

这篇文章将介绍如何使用C语言实现一个简单的图书管理系统,并重点讲解如何将图书数据存储到文件中,以及如何实现借阅和归还功能。

1. 数据结构设计

首先,我们需要定义一个结构体来表示每一条图书信息:ctypedef struct Node { char bookCode[20]; // 图书编号 char bookName[50]; // 书名 char author[50]; // 作者 char publisher[50]; // 出版社 char bookkind[50]; // 图书种类 char bookkinds[50]; // 图书种类编号 float price; // 价格 (修改为浮点型) int quantity; // 数量 int borrowed; // 借阅状态,0表示未借出,1表示已借出 struct Node *next; // 指向下一本书的指针} BookNode;

BookNode *head = NULL; // 定义头指针,初始为空

2. 功能实现

2.1 从文件加载图书数据cvoid loadBookData() { FILE *file = fopen('book_storage.txt', 'r'); if (file == NULL) { return; }

while (!feof(file)) {        BookNode *newNode = (BookNode *)malloc(sizeof(BookNode));        fscanf(file, '%s', newNode->bookCode);        fscanf(file, '%s', newNode->bookName);        fscanf(file, '%s', newNode->author);        fscanf(file, '%s', newNode->publisher);        fscanf(file, '%s', newNode->bookkind);        fscanf(file, '%s', newNode->bookkinds);        fscanf(file, '%f', &newNode->price); // 修改为%f读取浮点数        fscanf(file, '%d', &newNode->quantity);        fscanf(file, '%d', &newNode->borrowed);        newNode->next = NULL;

    if (head == NULL) {            head = newNode;        } else {            BookNode *current = head;            while (current->next != NULL) {                current = current->next;            }            current->next = newNode;        }    }

fclose(file);}

2.2 保存图书数据到文件cvoid saveBookData() { FILE *file = fopen('book_storage.txt', 'w'); if (file == NULL) { printf('无法保存图书信息!

'); return; }

BookNode *current = head;    while (current != NULL) {        fprintf(file, '%s

', current->bookCode); fprintf(file, '%s ', current->bookName); fprintf(file, '%s ', current->author); fprintf(file, '%s ', current->publisher); fprintf(file, '%s ', current->bookkind); fprintf(file, '%s ', current->bookkinds); fprintf(file, '%.2f ', current->price); // 使用%.2f控制输出两位小数 fprintf(file, '%d ', current->quantity); fprintf(file, '%d ', current->borrowed);

    current = current->next;    }

fclose(file);}

2.3 添加图书信息cvoid addBook() { BookNode *newNode = (BookNode *)malloc(sizeof(BookNode)); printf('请输入图书编号:'); scanf('%s', newNode->bookCode); printf('请输入书名:'); scanf('%s', newNode->bookName); printf('请输入作者:'); scanf('%s', newNode->author); printf('请输入出版社:'); scanf('%s', newNode->publisher); printf('请输入图书种类:'); scanf('%s', newNode->bookkind); printf('请输入图书种类编号:'); scanf('%s', newNode->bookkinds); printf('请输入价格:'); scanf('%f', &newNode->price); // 使用%f读取浮点数 printf('请输入数量:'); scanf('%d', &newNode->quantity); newNode->borrowed = 0; newNode->next = NULL;

if (head == NULL) {        head = newNode;    } else {        BookNode *current = head;        while (current->next != NULL) {            current = current->next;        }        current->next = newNode;    }

printf('添加成功!

');}

2.4 删除图书信息cvoid deleteBook() { char bookCode[20]; printf('请输入要删除的图书编号:'); scanf('%s', bookCode);

if (head == NULL) {        printf('没有找到相关图书!

'); return; }

if (strcmp(head->bookCode, bookCode) == 0) {        BookNode *temp = head;        head = head->next;        free(temp);        printf('删除成功!

'); return; }

BookNode *current = head;    while (current->next != NULL) {        if (strcmp(current->next->bookCode, bookCode) == 0) {            BookNode *temp = current->next;            current->next = temp->next;            free(temp);            printf('删除成功!

'); return; } current = current->next; }

printf('没有找到相关图书!

');}

2.5 修改图书信息cvoid modifyBook() { char bookCode[20]; printf('请输入要修改的图书编号:'); scanf('%s', bookCode);

if (head == NULL) {        printf('没有找到相关图书!

'); return; }

BookNode *current = head;    while (current != NULL) {        if (strcmp(current->bookCode, bookCode) == 0) {            printf('请输入新的书名:');            scanf('%s', current->bookName);            printf('请输入新的作者:');            scanf('%s', current->author);            printf('请输入新的出版社:');            scanf('%s', current->publisher);            printf('请输入新的图书种类:');            scanf('%s', current->bookkind);            printf('请输入新的图书种类编号:');            scanf('%s', current->bookkinds);            printf('请输入新的价格:');            scanf('%f', &current->price); // 使用%f读取浮点数            printf('请输入新的数量:');            scanf('%d', &current->quantity);            printf('修改成功!

'); return; } current = current->next; }

printf('没有找到相关图书!

');}

2.6 查找图书信息cvoid searchBook() { char bookName[50]; printf('请输入要查找的书名:'); scanf('%s', bookName);

if (head == NULL) {        printf('没有找到相关图书!

'); return; }

BookNode *current = head;    int found = 0;    while (current != NULL) {        if (strcmp(current->bookName, bookName) == 0) {            printf('图书编号:%s

', current->bookCode); printf('书名:%s ', current->bookName); printf('作者:%s ', current->author); printf('出版社:%s ', current->publisher); printf('图书种类:%s ', current->bookkind); printf('图书种类编号:%s ', current->bookkinds); printf('价格:%.2f ', current->price); // 使用%.2f控制输出两位小数 printf('数量:%d ', current->quantity); printf('借阅状态:%s ', current->borrowed ? '已借出' : '未借出'); found = 1; } current = current->next; }

if (!found) {        printf('没有找到相关图书!

'); }}

2.7 借阅图书cvoid borrowBook() { char bookCode[20]; printf('请输入要借阅的图书编号:'); scanf('%s', bookCode);

if (head == NULL) {        printf('没有找到相关图书!

'); return; }

BookNode *current = head;    while (current != NULL) {        if (strcmp(current->bookCode, bookCode) == 0) {            if (current->borrowed) {                printf('该图书已借出!

'); } else { current->borrowed = 1; printf('借阅成功! '); } return; } current = current->next; }

printf('没有找到相关图书!

');}

2.8 归还图书cvoid returnBook() { char bookCode[20]; printf('请输入要归还的图书编号:'); scanf('%s', bookCode);

if (head == NULL) {        printf('没有找到相关图书!

'); return; }

BookNode *current = head;    while (current != NULL) {        if (strcmp(current->bookCode, bookCode) == 0) {            if (current->borrowed) {                current->borrowed = 0;                printf('归还成功!

'); } else { printf('该图书未借出! '); } return; } current = current->next; }

printf('没有找到相关图书!

');}

2.9 显示所有图书信息cvoid displayBook() { if (head == NULL) { printf('图书列表为空!

'); return; }

BookNode *current = head;    while (current != NULL) {        printf('图书编号:%s

', current->bookCode); printf('书名:%s ', current->bookName); printf('作者:%s ', current->author); printf('出版社:%s ', current->publisher); printf('图书种类:%s ', current->bookkind); printf('图书种类编号:%s ', current->bookkinds); printf('价格:%.2f ', current->price); // 使用%.2f控制输出两位小数 printf('数量:%d ', current->quantity); printf('借阅状态:%s ', current->borrowed ? '已借出' : '未借出'); printf(' ');

    current = current->next;    }}

2.10 释放链表内存cvoid freeBookList() { BookNode *current = head; while (current != NULL) { BookNode *temp = current; current = current->next; free(temp); } head = NULL;}

3. 主函数cint main() { loadBookData(); // 加载图书数据

while (1) {        printf('*****欢迎使用图书管理系统*****

'); printf('1. 添加图书信息 '); printf('2. 删除图书信息 '); printf('3. 修改图书信息 '); printf('4. 查找图书信息 '); printf('5. 借阅图书 '); printf('6. 归还图书 '); printf('7. 显示图书信息 '); printf('0. 退出程序 '); printf('请输入您的选择:');

    int choice;        scanf('%d', &choice);

    switch (choice) {            case 1:                addBook();                break;            case 2:                deleteBook();                break;            case 3:                modifyBook();                break;            case 4:                searchBook();                break;            case 5:                borrowBook();                break;            case 6:                returnBook();                break;            case 7:                 displayBook();                break;            case 0:                saveBookData();  // 保存图书数据                freeBookList();  // 释放链表内存                printf('感谢使用图书管理系统,再见!

'); return 0; default: printf('无效的选择,请重新输入! '); } }}

4. 总结

本文介绍了如何使用C语言实现一个简单的图书管理系统,并实现了文件存储、借阅和归还等功能。你可以根据自己的需求对程序进行修改和完善。

注意:

  • 在实际应用中,应该使用更安全的输入输出函数,例如 fgetssscanf,以避免缓冲区溢出等安全问题。* 本文代码只提供了一个简单的框架,你可以根据需要添加更多功能,例如用户管理、借阅记录等。* 记得在程序退出前保存数据到文件,并在程序启动时加载数据
C语言实现图书管理系统:从文件存储到借阅功能

原文地址: https://www.cveoy.top/t/topic/fv2q 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录