📜  C测验– 104 |问题4(1)

📅  最后修改于: 2023-12-03 15:00:12.481000             🧑  作者: Mango

C测验-104 |问题4

本题主要考察对于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_idxmax_idx的初值分别设为0
  • 从第1本书籍开始遍历,如果发现某本书籍的页数小于最小值,则将min_idx更新为该书的下标;如果发现某本书籍的价格大于最大值,则将max_idx更新为该书的下标
  • 在遍历完所有书籍后,我们就确定了最大页数和最高价格的书籍,同时也计算得到了所有书籍的价格总和
  • 最后,我们将结果保存在长度为3的字符串数组book_arr

需要注意的是,为了防止除数为0的情况,我们此处采用了book_cnt - 1作为分母计算平均价格。

参考资料