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