📅  最后修改于: 2023-12-03 15:00:12.481000             🧑  作者: Mango
本题主要考察对于C结构体的理解和使用。
定义一个结构体Book
表示书,包含以下属性:
title
(书名,字符串类型)author
(作者,字符串类型)num_of_pages
(页数,整型)price
(价格,浮点型)同时,我们需要定义一个函数bookArray
,该函数接受一个字符串参数s
,其中s
是一组以逗号分隔的书籍信息,每本书籍的信息包含书名、作者、页数、价格,四者均为字符串类型,并以空格分隔。
要求:解析该字符串s
,并将解析结果存入一个长度为3的数组book_arr
中。其中,book_arr[0]
表示页数最小的书籍的书名,book_arr[1]
表示页数最大的书籍的价格,book_arr[2]
表示书籍的平均价格。如果有多本书籍页数或价格相同,则最终结果返回其中任意一本书籍。
请完成bookArray
函数的定义。
char s[] = "c primer plus stepohen prata, 1192, 20.99,
learn c the easy way jeff povey, 1280, 22.79,
advanced programming in unix environment w.richard steven, 994, 24.98";
{"c primer plus stepohen prata", "advanced programming in unix environment w.richard steven", 22.253333}
book_arr[0]
表示页数最小的书籍的书名是c primer plus stepohen prata
book_arr[1]
表示页数最大的书籍的价格是advanced programming in unix environment w.richard steven
book_arr[2]
表示书籍的平均价格是22.253333
#include <stdlib.h>
#include <string.h>
typedef struct book
{
char* title;
char* author;
int num_of_pages;
float price;
}Book;
void bookArray(char* s, char** book_arr)
{
// 解析字符串s中的书籍信息,并将结果存入数组book_list中
// 首先解析出每本书的信息,存储到book_list中
Book* book_list[100];
int book_cnt = 0;
char* token = strtok(s, ",");
while (token != NULL)
{
// 逐个读取book信息的四个属性:书名、作者、页数、价格,并保存到结构体中
Book* b = (Book*)malloc(sizeof(Book));
char* b_token = strtok(token, " ");
b->title = (char*)malloc(sizeof(char)*100);
strcpy(b->title, b_token);
b_token = strtok(NULL, " ");
b->author = (char*)malloc(sizeof(char)*100);
strcpy(b->author, b_token);
b_token = strtok(NULL, " ");
b->num_of_pages = atoi(b_token);
b_token = strtok(NULL, " ");
b->price = atof(b_token);
book_list[book_cnt++] = b;
token = strtok(NULL, ",");
}
// 依次查找最小页数、最大价格和平均价格
int min_idx = 0, max_idx = 0, sum = 0;
for (int i = 1; i < book_cnt; i++)
{
if (book_list[i]->num_of_pages < book_list[min_idx]->num_of_pages)
min_idx = i;
if (book_list[i]->price > book_list[max_idx]->price)
max_idx = i;
sum += book_list[i]->price;
}
// 将最后的结果存入数组book_arr中
book_arr[0] = (char*)malloc(sizeof(char)*100);
strcpy(book_arr[0], book_list[min_idx]->title);
book_arr[1] = (char*)malloc(sizeof(char)*100);
strcpy(book_arr[1], book_list[max_idx]->title);
book_arr[2] = (char*)malloc(sizeof(char)*100);
sprintf(book_arr[2], "%.6f", ((float)sum / (float)(book_cnt - 1)));
// 释放空间
for (int i = 0; i < book_cnt; i++)
{
free(book_list[i]->title);
free(book_list[i]->author);
free(book_list[i]);
}
}
题目要求解析字符串,所以首先使用字符串分割函数strtok
将输入字符串按逗号分割,并逐个读取分割后的字符串,将字符串中的四个参数分别赋给结构体中的属性。
之后是本题的重点:查找书籍列表中的最小页数、最大价格和平均价格。我们可以使用数组遍历来实现:
min_idx
和max_idx
的初值分别设为0min_idx
更新为该书的下标;如果发现某本书籍的价格大于最大值,则将max_idx
更新为该书的下标book_arr
中需要注意的是,为了防止除数为0的情况,我们此处采用了book_cnt - 1
作为分母计算平均价格。