设计思路:
定义两个结构体,一个用于表示图书信息,另一个用于表示图书馆信息。在图书馆信息结构体中,包含图书馆名称、图书数量和图书信息数组。在图书信息结构体中,包含书名、作者、出版年份、主题和副本数。然后,定义三个函数,分别是添加书籍、删除书籍和显示所有书籍的函数。在主函数中,初始化图书馆信息和用户的选择,然后使用一个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,表示程序的执行结束。
本人摸索出来 存在诸多纰漏 请各位指教