ws影子舞 2023-12-08 08:09 采纳率: 88.9%
浏览 22
已结题

c++类和数组实验代码

本次实验要求大家使用数组编程,完成一个“学生身体肥胖程度”的统计分析程序。身体肥胖程度用“身体质量指数”(BMI, Body Mass Index)评判,BMI计算公式为: ,其中 是体重,单位千克, 表示身高,单位米。BMI超过一定阈值表明身体超重或肥胖,不同年龄和性别,肥胖和超重的评判阈值不同。程序包括三个类BodyMeasurement、BMICutoffs以及BMITable。要求如下:1.用类BodyMeasurement表示一个学生的体检信息,体检信息包括四项:年林、性别、身高、体重。
1.1)用四个私有成员表示四项体检信息。
1.2)编写带参数的构造函数,参数值为上述四个信息的初始值。
1.3)编写4个公有成员函数,分别返回上述四个信息值。
1.4)编写公有成员函数getBMI,计算并返回身体质量指数。
1.5)编写公有成员函数show,在控制台上输出体检信息以及BMI数值。
2. 用类BMICutoffs表示某个年龄的男、女生身体肥胖程度的评判阈值:
2.1)用一个私有成员变量表示年龄。
2.2)使用两个私有成员变量分别表示男生身体超重和肥胖的阈值。
2.3)使用两个私有成员变量分别表示女生身体超重和肥胖的阈值。
2.4)编写带参数的构造函数,参数为上述5个私有成员变量的初始值。
2.5)编写一个公有成员函数show,在控制台上输出年龄以及4个阈值。
2.6)声明BMITable为BMICutoffs的友元类。
3.用类BMITable维护一个BMI阈值表格:
3.1)用私有的数组型静态常成员变量cutoff_table表示6~18岁青少年的BMI阈值。cutoff_table是BMICutoffs数组,包含13个元素(BMICutoffs对象),并初始化cutoff_table为以下表格(你可以拷贝下面的代码),表格中每一行表示一组阈值,其中的数值依次对应年龄、男超重阈值、男肥胖阈值、女超重阈值、女肥胖阈值。比如第一行表示6岁男孩超重和肥胖的BMI阈值分别为16.6,18.1,6岁女孩的超重和肥胖BMI阈值分别为16.3,17.9:cutoff_table[13] = { { 6,16.6,18.1,16.3,17.9}, { 7,17.4,19.2,17.2,18.9}, { 8,18.1,20.3,18.1,19.9}, { 9,18.9,21.4,19.0,21.0}, {10,19.6,22.5,20.0,22.1}, {11,20.3,23.6,21.1,23.3}, {12,21.0,24.7,21.9,24.5}, {13,21.9,25.7,22.6,25.6}, {14,22.6,26.4,23.0,26.3}, {15,23.1,26.9,23.4,26.9}, {16,23.5,27.4,23.7,27.4}, {17,23.8,27.8,23.8,27.7}, {18,24.0,28.0,24.0,28.0}};
3.2)编写静态成员函数printTable,在控制台输出上述表格。请参考下图所示的输出格式:3.3)编写静态成员函数checkBMI,根据年龄、性别以及BMI数值,判断身体状况,身体状况分为四类:正常(Normal)、超重(Overweight)、肥胖(Obesity)以及未知(Unknown)。请用下面的枚举类表示这四种状态:enum class BodyState { Normal = 0, OverWeight = 1, Obesity = 2, Unknown = 3};判断方法为:首先根据年龄和性别,在cutoff_table中找到对应年龄和性别的超重阈值和肥胖阈值,如果没有找到,返回Unknown。如果BMI<超重阈值,返回Normal;否则如果BMI<肥胖阈值,返回Overweight;否则返回Obesity。 例如下面代码定义了一个体检记录John,经过BMITable::checkBMI判别后,应返回Normal://16岁,身高1.86米,体重80公斤BodyMeasurement John(16, 'M', 1.86, 80);BodyState state = BMITable::checkBMI(John.getGender(), John.getAge(), John.getBMI());
4.编写一个自由函数analyze,用于对一组体检信息进行统计分析:判别出其中哪些同学身体超重、哪些同学肥胖。输出超重和肥胖同学的体检信息以及超重/肥胖诊断结果。统计超重和肥胖同学所占的百分比,并输出。该函数的输入参数是一个BodyMeasurement对象数组,无返回值。请参考下面的输出结果: 图2 统计分析输出格式
5.1)定义一个体检信息对象,输出该体检信息以及肥胖程度检测结果。
5.2)用BMITable类输出BMI阈值表格(如图1所示)。
5.3)定义并初始化一个体检信息对象数组,数组中包含40个学生的体检信息,调用analyze函数对这一组信息进行统计分析,输出结果如图2所示。

  • 写回答

10条回答 默认 最新

  • 专家-郭老师 Java领域新星创作者 2023-12-08 08:10
    关注

    由人工智能和答主提供,可以参考如下,如果回答的不正确,及时评论区回复,我追加回答,谢谢。

    以下代码可以正常跑通,您先看看是不是您要的结果:

    img

    代码:

    #include <iostream>
    #include <iomanip>  // 用于设置输出格式
    #include <string>
    #include <locale.h>
    
    // 枚举类型定义身体状态
    enum class BodyState {
        Normal = 0,
        OverWeight = 1,
        Obesity = 2,
        Unknown = 3
    };
    
    // 声明类 BMICutoffs,以便在 BMITable 中使用
    class BMICutoffs;
    
    // 类 BodyMeasurement 表示一个学生的体检信息
    class BodyMeasurement {
    public:
        // 带参数的构造函数
        BodyMeasurement(int age, char gender, double height, double weight);
    
        // 公有成员函数,用于获取体检信息的各项数值
        int getAge() const;
        char getGender() const;
        double getHeight() const;
        double getWeight() const;
    
        // 计算并返回身体质量指数 (BMI)
        double getBMI() const;
    
        // 在控制台上输出体检信息以及BMI数值
        void show() const;
    
    private:
        int age;
        char gender;
        double height;
        double weight;
    };
    
    // 类 BMICutoffs 表示某个年龄的男、女生身体肥胖程度的评判阈值
    class BMICutoffs {
    private:
        int age;
        double maleOverweightThreshold, maleObesityThreshold, femaleOverweightThreshold, femaleObesityThreshold;
    
    public:
        // 带参数的构造函数
        BMICutoffs(int age, double maleOverweight, double maleObesity, double femaleOverweight, double femaleObesity);
    
        // 在控制台上输出年龄以及4个阈值
        void show() const;
    
        // 声明 BMITable 为 BMICutoffs 的友元类
        friend class BMITable;
    };
    
    // 类 BMITable 维护一个BMI阈值表格
    class BMITable {
    private:
        static const BMICutoffs cutoff_table[];
    
    public:
        // 在控制台上输出BMI阈值表格
        static void printTable();
    
        // 根据年龄、性别以及BMI数值,判断身体状况
        static BodyState checkBMI(char gender, int age, double bmi);
    };
    
    // 定义类 BodyMeasurement 的成员函数
    BodyMeasurement::BodyMeasurement(int age, char gender, double height, double weight)
        : age(age), gender(gender), height(height), weight(weight) {}
    
    int BodyMeasurement::getAge() const { return age; }
    
    char BodyMeasurement::getGender() const { return gender; }
    
    double BodyMeasurement::getHeight() const { return height; }
    
    double BodyMeasurement::getWeight() const { return weight; }
    
    double BodyMeasurement::getBMI() const {
        return weight / (height * height);
    }
    
    void BodyMeasurement::show() const {
        std::wcout << L"年龄: " << age << L"岁, 性别: " << gender << L", 身高: " << height << L"米, 体重: " << weight << L"公斤" << std::endl;
    }
    
    // 定义类 BMICutoffs 的成员函数
    BMICutoffs::BMICutoffs(int age, double maleOverweight, double maleObesity, double femaleOverweight, double femaleObesity)
        : age(age), maleOverweightThreshold(maleOverweight), maleObesityThreshold(maleObesity),
          femaleOverweightThreshold(femaleOverweight), femaleObesityThreshold(femaleObesity) {}
    
    void BMICutoffs::show() const {
        std::wcout << L"年龄: " << age << L", 男生超重阈值: " << maleOverweightThreshold
                  << L", 男生肥胖阈值: " << maleObesityThreshold
                  << L", 女生超重阈值: " << femaleOverweightThreshold
                  << L", 女生肥胖阈值: " << femaleObesityThreshold << std::endl;
    }
    
    // 定义类 BMITable 的成员函数
    const BMICutoffs BMITable::cutoff_table[] = {
        {6, 16.6, 18.1, 16.3, 17.9},
        {7, 17.4, 19.2, 17.2, 18.9},
        {8, 18.1, 20.3, 18.1, 19.9},
        {9, 18.9, 21.4, 19.0, 21.0},
        {10, 19.6, 22.5, 20.0, 22.1},
        {11, 20.3, 23.6, 21.1, 23.3},
        {12, 21.0, 24.7, 21.9, 24.5},
        {13, 21.9, 25.7, 22.6, 25.6},
        {14, 22.6, 26.4, 23.0, 26.3},
        {15, 23.1, 26.9, 23.4, 26.9},
        {16, 23.5, 27.4, 23.7, 27.4},
        {17, 23.8, 27.8, 23.8, 27.7},
        {18, 24.0, 28.0, 24.0, 28.0}
    };
    
    void BMITable::printTable() {
        for (const BMICutoffs &cutoff : cutoff_table) {
            cutoff.show();
        }
    }
    
    BodyState BMITable::checkBMI(char gender, int age, double bmi) {
        for (const BMICutoffs &cutoff : cutoff_table) {
            if (cutoff.age == age) {
                if (gender == 'M') {
                    if (bmi < cutoff.maleOverweightThreshold) {
                        return BodyState::Normal;
                    } else if (bmi < cutoff.maleObesityThreshold) {
                        return BodyState::OverWeight;
                    } else {
                        return BodyState::Obesity;
                    }
                } else if (gender == 'F') {
                    if (bmi < cutoff.femaleOverweightThreshold) {
                        return BodyState::Normal;
                    } else if (bmi < cutoff.femaleObesityThreshold) {
                        return BodyState::OverWeight;
                    } else {
                        return BodyState::Obesity;
                    }
                }
            }
        }
        return BodyState::Unknown;
    }
    
    // 自由函数 analyze,对一组体检信息进行统计分析
    void analyze(const BodyMeasurement students[], int numStudents) {
        int overweightCount = 0;
        int obesityCount = 0;
    
        for (int i = 0; i < numStudents; ++i) {
            BodyMeasurement student = students[i];
            student.show();
    
            double bmi = student.getBMI();
            BodyState state = BMITable::checkBMI(student.getGender(), student.getAge(), bmi);
    
            switch (state) {
                case BodyState::OverWeight:
                    std::wcout << L"BMI状态: 超重" << std::endl;
                    overweightCount++;
                    break;
                case BodyState::Obesity:
                    std::wcout << L"BMI状态: 肥胖" << std::endl;
                    obesityCount++;
                    break;
                default:
                    std::wcout << L"BMI状态: 正常" << std::endl;
                    break;
            }
            std::wcout << std::endl;
        }
    
        double overweightPercentage = static_cast<double>(overweightCount) / numStudents * 100.0;
        double obesityPercentage = static_cast<double>(obesityCount) / numStudents * 100.0;
    
        std::wcout << L"超重百分比: " << overweightPercentage << L"%" << std::endl;
        std::wcout << L"肥胖百分比: " << obesityPercentage << L"%" << std::endl;
    }
    
    int main() {
        setlocale(LC_ALL, "");  // 设置本地化环境为默认值
        BodyMeasurement students[] = {
            {16, 'M', 1.86, 80},
            // 添加更多学生信息
        };
    
        analyze(students, sizeof(students) / sizeof(students[0]));
    
        return 0;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(9条)

报告相同问题?

问题事件

  • 系统已结题 12月16日
  • 已采纳回答 12月8日
  • 创建了问题 12月8日

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵