帮我用c语言写一个图书信息管理系统。图书信息包括:图书编号(如TP312C/1394)、书名、作者名、出版单位、出版时间、价格。试设计一图书信息管理系统,图书信息用文件保存,并提供以下功能: 1、图书信息添加 2、显示图书信息(按文件内顺序) 3、按书名排序(同名则按编号) 4、按书名查询(结果按编号排序) 5、按作者名查询(按作者名排序,同名则按图书编号) 6、图书信息的删除(按图书编号查询到) 7、图书信息的修改(按图书编号查询到)
时间: 2023-08-11 13:04:15 浏览: 72
好的,我可以帮你设计一个基于 C 语言的图书信息管理系统,以下是实现细节:
首先,我们需要定义一个结构体来存储图书信息,包括图书编号、书名、作者名、出版单位、出版时间、价格等字段。
```c
typedef struct {
char book_id[20];
char book_name[50];
char author[30];
char publisher[50];
char pub_date[20];
float price;
} BookInfo;
```
然后,我们需要实现以下功能:
1. 图书信息添加
图书信息添加可以通过文件操作来实现,将新增的图书信息写入文件中即可。
```c
void add_book_info(char* file_name) {
BookInfo book;
printf("请输入图书信息:\n");
printf("图书编号:");
scanf("%s", book.book_id);
printf("书名:");
scanf("%s", book.book_name);
printf("作者名:");
scanf("%s", book.author);
printf("出版单位:");
scanf("%s", book.publisher);
printf("出版时间:");
scanf("%s", book.pub_date);
printf("价格:");
scanf("%f", &book.price);
FILE* fp;
if ((fp = fopen(file_name, "ab")) == NULL) {
printf("无法打开文件!\n");
return;
}
fwrite(&book, sizeof(BookInfo), 1, fp);
fclose(fp);
printf("图书信息添加成功!\n");
}
```
2. 显示图书信息(按文件内顺序)
显示图书信息也可以通过文件操作来实现,按照文件内的顺序读取图书信息并输出即可。
```c
void show_all(char* file_name) {
FILE* fp;
if ((fp = fopen(file_name, "rb")) == NULL) {
printf("无法打开文件!\n");
return;
}
BookInfo book;
while (fread(&book, sizeof(BookInfo), 1, fp) == 1) {
printf("%s\t%s\t%s\t%s\t%s\t%.2f\n", book.book_id, book.book_name, book.author,
book.publisher, book.pub_date, book.price);
}
fclose(fp);
}
```
3. 按书名排序(同名则按编号)
按书名排序可以通过读取文件中所有图书信息,然后按照书名排序并输出即可。
```c
void sort_by_book_name(char* file_name) {
FILE* fp;
if ((fp = fopen(file_name, "rb")) == NULL) {
printf("无法打开文件!\n");
return;
}
BookInfo book_list[100];
int count = 0;
while (fread(&book_list[count], sizeof(BookInfo), 1, fp) == 1) {
count++;
}
fclose(fp);
// 冒泡排序
for (int i = 0; i < count - 1; i++) {
for (int j = 0; j < count - i - 1; j++) {
if (strcmp(book_list[j].book_name, book_list[j + 1].book_name) > 0 ||
(strcmp(book_list[j].book_name, book_list[j + 1].book_name) == 0 &&
strcmp(book_list[j].book_id, book_list[j + 1].book_id) > 0)) {
BookInfo temp = book_list[j];
book_list[j] = book_list[j + 1];
book_list[j + 1] = temp;
}
}
}
// 输出排序结果
for (int i = 0; i < count; i++) {
printf("%s\t%s\t%s\t%s\t%s\t%.2f\n", book_list[i].book_id, book_list[i].book_name,
book_list[i].author, book_list[i].publisher, book_list[i].pub_date,
book_list[i].price);
}
}
```
4. 按书名查询(结果按编号排序)
按书名查询可以通过读取文件中所有图书信息,然后按照书名查询并输出查询结果即可。
```c
void search_by_book_name(char* file_name) {
char book_name[50];
printf("请输入书名:");
scanf("%s", book_name);
FILE* fp;
if ((fp = fopen(file_name, "rb")) == NULL) {
printf("无法打开文件!\n");
return;
}
BookInfo book_list[100];
int count = 0;
while (fread(&book_list[count], sizeof(BookInfo), 1, fp) == 1) {
count++;
}
fclose(fp);
// 按书名查询
BookInfo search_result[100];
int result_count = 0;
for (int i = 0; i < count; i++) {
if (strcmp(book_list[i].book_name, book_name) == 0) {
search_result[result_count] = book_list[i];
result_count++;
}
}
// 按编号排序
for (int i = 0; i < result_count - 1; i++) {
for (int j = 0; j < result_count - i - 1; j++) {
if (strcmp(search_result[j].book_id, search_result[j + 1].book_id) > 0) {
BookInfo temp = search_result[j];
search_result[j] = search_result[j + 1];
search_result[j + 1] = temp;
}
}
}
// 输出查询结果
printf("查询结果:\n");
for (int i = 0; i < result_count; i++) {
printf("%s\t%s\t%s\t%s\t%s\t%.2f\n", search_result[i].book_id, search_result[i].book_name,
search_result[i].author, search_result[i].publisher, search_result[i].pub_date,
search_result[i].price);
}
}
```
5. 按作者名查询(按作者名排序,同名则按图书编号)
按作者名查询也可以通过读取文件中所有图书信息,然后按照作者名查询并输出查询结果即可。
```c
void search_by_author(char* file_name) {
char author[30];
printf("请输入作者名:");
scanf("%s", author);
FILE* fp;
if ((fp = fopen(file_name, "rb")) == NULL) {
printf("无法打开文件!\n");
return;
}
BookInfo book_list[100];
int count = 0;
while (fread(&book_list[count], sizeof(BookInfo), 1, fp) == 1) {
count++;
}
fclose(fp);
// 按作者名查询
BookInfo search_result[100];
int result_count = 0;
for (int i = 0; i < count; i++) {
if (strcmp(book_list[i].author, author) == 0) {
search_result[result_count] = book_list[i];
result_count++;
}
}
// 按作者名和编号排序
for (int i = 0; i < result_count - 1; i++) {
for (int j = 0; j < result_count - i - 1; j++) {
if (strcmp(search_result[j].author, search_result[j + 1].author) > 0 ||
(strcmp(search_result[j].author, search_result[j + 1].author) == 0 &&
strcmp(search_result[j].book_id, search_result[j + 1].book_id) > 0)) {
BookInfo temp = search_result[j];
search_result[j] = search_result[j + 1];
search_result[j + 1] = temp;
}
}
}
// 输出查询结果
printf("查询结果:\n");
for (int i = 0; i < result_count; i++) {
printf("%s\t%s\t%s\t%s\t%s\t%.2f\n", search_result[i].book_id, search_result[i].book_name,
search_result[i].author, search_result[i].publisher, search_result[i].pub_date,
search_result[i].price);
}
}
```
6. 图书信息的删除(按图书编号查询到)
图书信息的删除可以通过按照图书编号查询到图书信息,然后将该图书信息从文件中删除即可。
```c
void delete_by_book_id(char* file_name) {
char book_id[20];
printf("请输入图书编号:");
scanf("%s", book_id);
FILE* fp;
if ((fp = fopen(file_name, "rb")) == NULL) {
printf("无法打开文件!\n");
return;
}
BookInfo book_list[100];
int count = 0;
while (fread(&book_list[count], sizeof(BookInfo), 1, fp) == 1) {
count++;
}
fclose(fp);
// 按图书编号查询
int delete_index = -1;
for (int i = 0; i < count; i++) {
if (strcmp(book_list[i].book_id, book_id) == 0) {
delete_index = i;
break;
}
}
// 删除图书信息
if (delete_index >= 0) {
for (int i = delete_index; i < count - 1; i++) {
book_list[i] = book_list[i + 1];
}
count--;
if ((fp = fopen(file_name, "wb")) == NULL) {
printf("无法打开文件!\n");
return;
}
for (int i = 0; i < count; i++) {
fwrite(&book_list[i], sizeof(BookInfo), 1, fp);
}
fclose(fp);
printf("图书信息删除成功!\n");
} else {
printf("未找到该图书编号的图书信息!\n");
}
}
```
7. 图书信息的修改(按图书编号查询到)
图书信息的修改可以通过按照图书编号查询到图书信息,然后修改该图书信息并写回文件中即可。
```c
void modify_by_book_id(char* file_name) {
char book_id[20];
printf("请输入图书编号:");
scanf("%s", book_id);
FILE* fp;
if ((fp = fopen(file_name, "rb")) == NULL) {
printf("无法打开文件!\n");
return;
}
BookInfo book_list[100];
int count = 0;
while (fread(&book_list[count], sizeof(BookInfo), 1, fp) == 1) {
count++;
}
fclose(fp);
// 按图书编号查询
int modify_index = -1;
for (int i = 0; i < count; i++) {
if (strcmp(book_list[i].book_id, book_id) == 0) {
modify_index = i;
break;
}
}
// 修改图书信息
if (modify_index >= 0) {
printf("请输入修改后的图书信息:\n");
printf("书名:");
scanf("%s", book_list[modify_index].book_name);
printf("作者名:");
scanf("%s", book_list[modify_index].author);
printf("出版单位:");
scanf("%s", book_list[modify_index].publisher);
printf("出版时间:");
scanf("%s", book_list[modify_index].pub_date);
printf("价格:");
scanf("%f", &book_list[modify_index].price);
if ((fp = fopen(file_name, "wb")) == NULL) {
printf("无法打开文件!\n");
return;
}
for (int i = 0; i < count; i++) {
fwrite(&book_list[i], sizeof(BookInfo), 1, fp);
}
fclose(fp);
printf("图书信息修改成功!\n");
} else {
printf("未找到该图书编号的图书信息!\n");
}
}
```
最后,我们可以实现一个菜单,让用户选择操作。
```c
int main() {
char file_name[50];
printf("请输入图书信息文件名:");
scanf("%s", file_name);
while (1) {
printf("\n");
printf("请选择操作:\n");
printf("1. 图书信息添加\n");
printf("2. 显示图书信息(按文件内顺序)\n");
printf("3. 按书名排序(同名则按编号)\n");
printf("4. 按书名查询(结果按编号排序)\n");
printf("5. 按作者名查询(按作者名排序,同名则按图书编号)\n");
printf("6. 图书信息的删除(按图书编号查询到)\n");
printf("7. 图书信息的修改(按图书编号查询到)\n");
printf("8. 退出\n");
int choice;
scanf("%d", &choice);
switch (choice) {
case 1:
add_book_info(file_name);
break;
case 2:
show_all(file_name);
break;
case 3:
sort_by_book_name(file_name);
break;
case 4:
search_by_book_name(file_name);
break;
case 5:
search_by_author(file_name);
break;
case 6:
delete_by_book_id(file_name);
break;
case 7:
modify_by_book_id(file_name);
break;
case 8:
return 0;
default:
printf("无效操作!\n");
}
}
}
```
以上就是基于 C 语言实现的图书信息管理系统,希望能对你有所帮助。
阅读全文