C自学 实战项目 基于C实现简单图书管理系统

设计思路:

        定义两个结构体,一个用于表示图书信息,另一个用于表示图书馆信息。在图书馆信息结构体中,包含图书馆名称、图书数量和图书信息数组。在图书信息结构体中,包含书名、作者、出版年份、主题和副本数。然后,定义三个函数,分别是添加书籍、删除书籍和显示所有书籍的函数。在主函数中,初始化图书馆信息和用户的选择,然后使用一个while循环,直到用户选择退出为止。在循环中,首先输出欢迎信息,然后输出可供选择的四个操作,最后使用scanf函数读取用户的选择。根据用户的选择,使用switch循环执行相应的操作,如果用户选择的数字不是1、2、3或4,程序将输出一个提示信息并重新询问用户的选择。最后,如果用户选择4,直接返回0,表示程序的执行结束。

程序代码:

#include <stdio.h>
#include <stdlib.h>

// 定义一个结构体来表示图书信息
typedef struct book {
    char title[20];
    char author[20];
    char year[4];
    char subject[50];
    int copies;
} Book;

// 定义一个结构体来表示图书馆
typedef struct library {
    char name[50];
    int num_books;
    Book books[100];
} Library;

// 函数原型声明
void add_book(Book*, Library*);
void remove_book(Book*, Library*);
void display_books(Book*, Library*);

int main() {
    Library lib;
    char choice;

    // 初始化图书馆
    strcpy(lib.name, "My Library");
    lib.num_books = 0;

    // 循环直到用户选择退出
    while (1) {
        printf("Welcome to %s Library!\n", lib.name);
        printf("1. Add a book\n");
        printf("2. Remove a book\n");
        printf("3. Display all books\n");
        printf("4. Exit\n");
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                add_book(&lib.books[lib.num_books], &lib);
                break;
            case 2:
                remove_book(&lib.books[lib.num_books], &lib);
                break;
            case 3:
                display_books(&lib.books[lib.num_books], &lib);
                break;
            case 4:
                return 0;
            default:
                printf("Invalid choice. Try again.\n");
                break;
        }
    }

    return 0;
}

// 添加一本书到图书馆
void add_book(Book* book, Library* lib) {
    int i;

    // 验证书名、作者、出版年份和主题是否为空
    if (book->title[0] == '\0' || book->author[0] == '\0' || book->year[0] == '\0' || book->subject[0] == '\0') {
        printf("All fields are required.\n");
        return;
    }

    // 验证书名、作者、出版年份和主题长度是否合法
    if (strlen(book->title) > 20 || strlen(book->author) > 20 || strlen(book->year) > 4 || strlen(book->subject) > 50) {
        printf("Fields cannot exceed the specified length.\n");
        return;
    }

    // 计算书籍的副本数
    book->copies = 1;

    // 在图书馆中添加一本书
    lib->num_books++;
    for (i = lib->num_books - 1; i > 0; i--) {
        lib->books[i].copies++;
    }
    strcpy(lib->books[lib->num_books].title, book->title);
    strcpy(lib->books[lib->num_books].author, book->author);
    strcpy(lib->books[lib->num_books].year, book->year);
    strcpy(lib->books[lib->num_books].subject, book->subject);
}

// 从图书馆中删除一本书
void remove_book(Book* book, Library* lib) {
    int i, j;

    // 验证要删除的书名是否存在
    for (i = 0; i < lib->num_books; i++) {
        if (strcmp(lib->books[i].title, book->title) == 0) {
            break;
        }
    }
    if (i == lib->num_books) {
        printf("Book not found.\n");
        return;
    }

    // 将后一本书的副本数加1
    for (j = i; j < lib->num_books - 1; j++) {
        lib->books[j].copies++;
    }

    // 减少图书馆中的书籍数量
    lib->num_books--;
}

// 显示图书馆中的所有书籍
void display_books(Book* books, Library* lib) {
    int i;

    printf("Title\tAuthor\tYear\tSubject\tCopies\n");
    for (i = 0; i < lib->num_books; i++) {
        printf("%s\t%s\t%s\t%s\t%d\n", lib->books[i].title, lib->books[i].author, lib->books[i].year, lib->books[i].subject, lib->books[i].copies);
    }
}

 代码解释:

#include <stdio.h>
#include <stdlib.h>

        这两个头文件分别包含了标准输入输出流和stdlib库,用于处理各种系统调用,如文件打开、关闭、分配内存等。

// 定义一个结构体来表示图书信息
typedef struct book {
    char title[20];
    char author[20];
    char year[4];
    char subject[50];
    int copies;
} Book;

        这个结构体表示一本书的信息,包括书名、作者、出版年份、主题和副本数。其中,书名、作者、出版年份和主题都是字符串类型,用char数组表示,最大长度分别为20、20、4和50个字符。副本数是整型,用int表示。

// 定义一个结构体来表示图书馆
typedef struct library {
    char name[50];
    int num_books;
    Book books[100];
} Library;

        这个结构体表示一个图书馆的信息,包括图书馆名称、图书数量和图书信息数组。图书馆名称是字符串类型,用char数组表示,最大长度为50个字符。图书数量是整型,用int表示。图书信息数组是一个包含100个Book结构体的数组,用于存储图书馆中的所有书籍信息。

void add_book(Book* book, Library* lib);
void remove_book(Book* book, Library* lib);
void display_books(Book* books, Library* lib);

        这三个函数分别是添加书籍、删除书籍和显示所有书籍的函数。它们都有两个参数,一个是指向Book结构体的指针,用于存储要添加/删除/显示的书籍信息;另一个是指向Library结构体的指针,用于存储图书馆的信息。

int main() {
    Library lib;
    char choice;

        这是程序的主函数。它定义了一个Library结构体lib和一个整型变量choice,用于存储图书馆的信息和用户的选择。

// 初始化图书馆
strcpy(lib.name, "My Library");
lib.num_books = 0;

        这两行代码用strcpy函数将字符串"My Library"复制到lib.name中,用0初始化lib.num_books。

// 循环直到用户选择退出
while (1) {
    printf("Welcome to %s Library!\n", lib.name);
    printf("1. Add a book\n");
    printf("2. Remove a book\n");
    printf("3. Display all books\n");
    printf("4. Exit\n");
    scanf("%d", &choice);

        这段代码使用一个while循环,直到用户选择退出为止。循环中,首先输出欢迎信息,然后输出可供选择的四个操作,最后使用scanf函数读取用户的选择。如果用户输入的数字不是1、2、3或4,程序将输出一个提示信息并重新询问用户的选择。

switch (choice) {
    case 1:
        add_book(&lib.books[lib.num_books], &lib);
        break;
    case 2:
        remove_book(&lib.books[lib.num_books], &lib);
        break;
    case 3:
        display_books(&lib.books[lib.num_books], &lib);
        break;
    case 4:
        return 0;
    default:
        printf("Invalid choice. Try again.\n");
        break;
}

        这段代码使用一个switch循环,根据用户的选择执行相应的操作。如果用户选择1,调用add_book函数添加一本书;如果用户选择2,调用remove_book函数删除一本书;如果用户选择3,调用display_books函数显示所有书籍;如果用户选择4,直接返回0。如果用户选择的数字不是1、2、3或4,程序将输出一个提示信息并重新询问用户的选择。

return 0;

        这行代码表示程序的执行结束。

运行原理:

        首先初始化图书馆的信息和用户的选择,然后使用一个while循环,直到用户选择退出为止。在循环中,首先输出欢迎信息,然后输出可供选择的四个操作,最后使用scanf函数读取用户的选择。根据用户的选择,使用switch循环执行相应的操作,如果用户选择的数字不是1、2、3或4,程序将输出一个提示信息并重新询问用户的选择。最后,如果用户选择4,直接返回0,表示程序的执行结束。

        本人摸索出来 存在诸多纰漏 请各位指教

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值