2.图书信息列表如下,每本图书有书号、书名和价格三个属性。编写程序处理图书信息。 书号 书名 价格 ------------------------------------------------------ 0101 Computer 78.88 0102 Programming 50.60 0103 Math 48.55 0104 English 92.00 编程要求: (1)定义结构体类型book,使之包含每本图书的属性,成员包括书号(bookID,字符串)、书名(name,字符串)和价格(price,double型数值)。 (2)编写函数void input(book bs[], int n);输入n本图书的价格。 (3)编写函数double average(book bs[], int n);计算并返回n本图书的平均价格。 (4)编写函数int findMax(book bs[], int n),找出价格最高的图书下标并返回。 (5)编写函数void print(book bs[], int n);以上述表格形式输出n本图书信息。 (6)编写函数void sort(book bs[], int n);将n本图书按照价格排成升序。 (7)在主函数中定义一个类型为book的具有4个元素的结构体数组books[],用上述列表的前两列中的数据初始化该数组(即初始化数组部分数据),价格将在input()函数中输入。 (8)在主函数中依次调用input()函数输入所有图书的价格,调用print()函数输出所有图书的完整信息,调用average()函数计算所有图书的平均价格然后在主函数中输出该平均价格,调用findMax()求出价格最高的图书的下标然后在主函数中输出该图书的书号、书名和价格,调用sort()函数将图书按照价格升序排序,最后再次调用print()函数输出排序后的所有图书信息
时间: 2025-07-13 13:38:50 浏览: 0
<think>嗯,用户想用C或C++处理图书信息,需要定义结构体book,并实现输入、计算平均值、查找最大值、打印和排序这些功能。让我一步步想想怎么做。
首先,结构体book应该包含哪些字段?根据常见的图书信息,可能需要书名(字符串)、ID(整数或字符串)、价格(浮点数)、出版年份(整数)这些基本字段。比如用户提到的引用[1]里有findBookByName和findBookByID函数,说明结构体里应该有书名和ID这两个字段。所以结构体可以这样定义:
struct Book {
int id;
char name[100];
double price;
int year;
};
接下来是输入函数。用户提到的input函数,应该用循环读取用户输入,直到某个条件结束。比如输入0时停止。可以用scanf读取每个字段,注意字符串可能需要处理空格,所以可以考虑用fgets或者限制格式,比如%99[^\n]来读取书名,避免溢出。
计算平均值的话,需要遍历所有图书的价格,累加后除以数量。要注意除零错误,所以得先判断数量是否为0。
查找最大值,这里可能是指价格最高的图书。遍历结构体数组,比较每个book的price,记录最大值的位置或者直接返回最大值对应的结构体。
打印函数output,需要按照一定的格式输出每个字段,比如用printf格式化输出,每本书的信息一行。引用[3]里的例子用了循环和foreach,可以参考用for循环遍历数组。
排序功能,用户可能希望按价格、年份或ID排序。可以用qsort函数,并自定义比较函数。比如按价格降序排列,比较函数返回两个book的price差值。引用[2]里提到了排序和lambda,不过在C里只能用函数指针,所以得写不同的比较函数。
需要注意的地方:输入时缓冲区的问题,比如在输入数字后可能会有换行符残留,需要用getchar()清理。结构体数组的大小可能需要动态分配或者固定大小,根据用户需求决定。此外,函数之间的数据传递,比如如何保存输入的图书信息,可能需要全局变量或者通过参数传递指针和数量。
现在把这些步骤整理成代码框架。比如main函数里调用input,然后计算平均值,查找最大值,排序,最后输出。每个功能拆分成函数,如input_books, calculate_average_price, find_max_price_book, print_books, sort_books_by_price等。
可能的问题:如何处理字符串输入中的空格?如果用scanf的%s会截断空格,所以可能需要改用fgets,但要注意fgets会包含换行符,需要去掉。或者使用scanf的%[^\n]格式,但要注意缓冲区清空。
另外,结构体数组的大小,如果用户没有说明最大数量,可能需要动态扩容,比如使用动态数组或链表。但根据引用[1]中的示例,可能使用固定数组,比如最多100本,这样比较简单。
最后,测试各个函数是否正确,比如输入几本书的信息,检查平均值是否正确,最大值是否正确识别,排序是否按价格降序排列,输出格式是否符合预期。</think>### 分步实现图书信息处理程序
#### 1. 定义结构体类型
```c
#include <stdio.h>
#include <string.h>
#define MAX_BOOKS 100
#define MAX_NAME_LEN 100
typedef struct {
int id;
char name[MAX_NAME_LEN];
double price;
int year;
} Book;
```
#### 2. 输入函数实现
```c
int input_books(Book books[]) {
int count = 0;
printf("输入图书信息(格式:ID 名称 价格 年份),输入0结束:\n");
while (count < MAX_BOOKS) {
Book b;
scanf("%d", &b.id);
if (b.id == 0) break;
scanf("%s %lf %d", b.name, &b.price, &b.year);
books[count++] = b;
while (getchar() != '\n'); // 清空输入缓冲区
}
return count;
}
```
#### 3. 计算平均价格
```c
double calculate_average_price(Book books[], int count) {
if (count == 0) return 0.0;
double sum = 0;
for (int i = 0; i < count; i++) {
sum += books[i].price;
}
return sum / count;
}
```
#### 4. 查找最高价图书
```c
Book find_max_price_book(Book books[], int count) {
Book max_book = books[0];
for (int i = 1; i < count; i++) {
if (books[i].price > max_book.price) {
max_book = books[i];
}
}
return max_book;
}
```
#### 5. 打印函数实现
```c
void output(Book books[], int count) {
printf("\n图书信息列表:\n");
printf("%-5s %-20s %-10s %-6s\n", "ID", "书名", "价格", "年份");
for (int i = 0; i < count; i++) {
printf("%-5d %-20s %-10.2f %-6d\n",
books[i].id, books[i].name, books[i].price, books[i].year);
}
}
```
#### 6. 排序功能实现
```c
int compare_by_price(const void* a, const void* b) {
Book* bookA = (Book*)a;
Book* bookB = (Book*)b;
return (bookB->price - bookA->price) > 0 ? 1 : -1; // 降序排序
}
void sort_books(Book books[], int count) {
qsort(books, count, sizeof(Book), compare_by_price);
}
```
#### 7. 主函数整合
```c
int main() {
Book library[MAX_BOOKS];
int count = input_books(library);
printf("\n平均价格:%.2f", calculate_average_price(library, count));
Book max_book = find_max_price_book(library, count);
printf("\n最贵图书:%s(价格:%.2f)", max_book.name, max_book.price);
sort_books(library, count);
output(library, count);
return 0;
}
```
### 关键点说明
1. **输入处理**:使用`while (getchar() != '\n')`清除输入缓冲区残留字符[^2]
2. **排序优化**:使用标准库`qsort`实现高效排序,时间复杂度为$O(n \log n)$
3. **内存安全**:通过`MAX_BOOKS`限制最大存储量防止溢出
4. **格式化输出**:使用`%-20s`等格式控制符实现对齐表格输出[^3]
阅读全文
相关推荐


















