C++知识总结-薛老师主讲

C语言实现简单的图书管理系统

这个程序将演示结构体、函数、文件I/O、动态内存分配、错误处理和一些算法实现。

以下是一个示例程序,它模拟了一个简单的图书管理系统。该系统允许用户添加书籍、查看书籍列表、按书名搜索书籍以及删除书籍。为了简化,我们不会实现完整的错误处理和边界检查,但会包含一些基本的逻辑。

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

#define MAX_TITLE_LENGTH 100
#define INITIAL_CAPACITY 10

typedef struct {
    char title[MAX_TITLE_LENGTH];
    char author[MAX_TITLE_LENGTH];
    int year;
} Book;

typedef struct {
    Book *books;
    int size;
    int capacity;
} Library;

Library* createLibrary() {
    Library *lib = (Library*)malloc(sizeof(Library));
    lib->books = (Book*)malloc(sizeof(Book) * INITIAL_CAPACITY);
    lib->size = 0;
    lib->capacity = INITIAL_CAPACITY;
    return lib;
}

void addBook(Library *lib, const char *title, const char *author, int year) {
    if (lib->size >= lib->capacity) {
        lib->capacity *= 2;
        lib->books = (Book*)realloc(lib->books, sizeof(Book) * lib->capacity);
    }
    strncpy(lib->books[lib->size].title, title, MAX_TITLE_LENGTH - 1);
    strncpy(lib->books[lib->size].author, author, MAX_TITLE_LENGTH - 1);
    lib->books[lib->size].year = year;
    lib->size++;
}

void listBooks(const Library *lib) {
    for (int i = 0; i < lib->size; i++) {
        printf("Title: %s, Author: %s, Year: %d\n", lib->books[i].title, lib->books[i].author, lib->books[i].year);
    }
}

Book* searchBook(const Library *lib, const char *title) {
    for (int i = 0; i < lib->size; i++) {
        if (strcmp(lib->books[i].title, title) == 0) {
            return &(lib->books[i]);
        }
    }
    return NULL;
}

void deleteBook(Library *lib, const char *title) {
    Book *book = searchBook(lib, title);
    if (book != NULL) {
        for (int i = book - lib->books; i < lib->size - 1; i++) {
            lib->books[i] = lib->books[i + 1];
        }
        lib->size--;
    } else {
        printf("Book not found.\n");
    }
}

void saveLibraryToFile(const Library *lib, const char *filename) {
    FILE *file = fopen(filename, "wb");
    if (file == NULL) {
        perror("Failed to open file for writing");
        return;
    }
    fwrite(&(lib->size), sizeof(int), 1, file);
    fwrite(lib->books, sizeof(Book), lib->size, file);
    fclose(file);
}

void loadLibraryFromFile(Library *lib, const char *filename) {
    FILE *file = fopen(filename, "rb");
    if (file == NULL) {
        perror("Failed to open file for reading");
        return;
    }
    fread(&(lib->size), sizeof(int), 1, file);
    lib->capacity = lib->size; // For simplicity, we assume the file contains exactly the current size of books
    lib->books = (Book*)malloc(sizeof(Book) * lib->capacity);
    fread(lib->books, sizeof(Book), lib->size, file);
    fclose(file);
}

void freeLibrary(Library *lib) {
    free(lib->books);
    free(lib);
}

int main() {
    Library *lib = createLibrary();

    addBook(lib, "The Great Gatsby", "F. Scott Fitzgerald", 1925);
    addBook(lib, "1984", "George Orwell", 1949);
    addBook(lib, "To Kill a Mockingbird", "Harper Lee", 1960);

    printf("Initial library:\n");
    listBooks(lib);

    printf("\nSearching for '1984':\n");
    Book *foundBook = searchBook(lib, "1984");
    if (foundBook != NULL) {
        printf("Found: Title: %s, Author: %s, Year: %d\n", foundBook->title, foundBook->author, foundBook->year);
    }

    printf("\nDeleting 'The Great Gatsby':\n");
    deleteBook(lib, "The Great Gatsby");
    listBooks(lib);

    const char *filename = "library.dat";
    printf("\nSaving library to file '%s':\n", filename);
    saveLibraryToFile(lib, filename);

    Library *loadedLib = createLibrary();
    printf("\nLoading library from file '%s':\n", filename);
    loadLibraryFromFile(loadedLib, filename);
    listBooks(loadedLib);

    freeLibrary(loadedLib);
    freeLibrary(lib);

    return 0;
}

这个程序演示了以下C语言特性:

1.结构体(struct):用于定义Book和Library类型。
2.动态内存分配:使用malloc、realloc和free来管理Library中的书籍数组。
3.文件I/O:使用fopen、fwrite、fread和fclose来保存和加载图书管理系统的状态到文件中。
4.函数:将不同的功能封装到独立的函数中,以提高代码的可读性和可维护性。
5.字符串处理:使用strncpy和strcmp来处理书名和作者名的字符串。
6.简单的错误处理:在文件操作中使用perror来打印错误信息。
请注意,这个示例代码是为了教学目的而编写的,并没有实现完整的错误处理和边界检查。在实际开发中,你应该添加更多的错误处理逻辑来确保程序的健壮性。

下面是薛老师写的一个图书管理系统的代码示例:

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

typedef struct {
    char title[50];
    char author[50];
    float price;
} Book;

Book library[10]; // 假设库存上限为10本书
int library_size = 0; // 当前库存书籍数量

// 添加图书到库存
void add_book() {
    if (library_size >= 10) {
        printf("库存已满,无法添加。\n");
        return;
    }
    printf("请输入书名: ");
    scanf("%49[^\n]", library[library_size].title); // 安全读取书名
    getchar(); // 读取换行符
    printf("请输入作者: ");
    scanf("%49[^\n]", library[library_size].author); // 安全读取作者
    getchar(); // 读取换行符
    printf("请输入价格: ");
    scanf("%f", &library[library_size].price); // 读取价格
    getchar(); // 读取换行符
    library_size++; // 更新库存数量
    printf("添加成功。\n");
}

// 显示图书列表
void list_books() {
    if (library_size == 0) {
        printf("没有可显示的图书。\n");
        return;
    }
    for (int i = 0; i < library_size; i++) {
        printf("书名: %s, 作者: %s, 价格: %.2f\n", library[i].title, library[i].author, library[i].price);
    }
}

// 查询图书
void search_book() {
    char title[50];
    printf("请输入要查询的书名: ");
    scanf("%49[^\n]", title);
    getchar();
    for (int i = 0; i < library_size; i++) {
        if (strcmp(library[i].title, title) == 0) {
            printf("找到了书籍,信息如下:\n书名: %s, 作者: %s, 价格: %.2f\n", library[i].title, library[i].author, library[i].price);
            return;
        }
    }
    printf("没有找到该书籍。\n");
}

// 主菜单
void menu() {
    int choice;
    do {
        printf("\n图书管理系统\n");
        printf("1. 添加图书\n");
        printf("2. 显示图书列表\n");
        printf("3. 查询图书\n");
        printf("4. 退出\n");
        printf("请选择: ");
        scanf("%d", &choice);
        getchar();
        switch (choice) {
            case 1:
                add_book();
                break;
            case 2:
                list_books();
                break;
            case 3:
                search_book();
                break;
            case 4:
                printf("退出成功。\n");
                break;
            default:
                printf("无效选项,请重新选择。\n");
                break;
        }
    } while (choice != 4);
}

int main() {
    menu();
    return 0;
}


大家可以做一下参考。这段代码提供了一个简单的图书管理系统的核心功能实现,包括添加、显示和查询图书的功能。虽然没有原始代码中的所有功能,但它展示了如何使用结构体来管理数据