You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

《Jumping into C++》第5章第7题 基础语法实现垂直柱状图求助

问题分析

你当前实现的是水平柱状图,和题目要求的垂直柱状图不符,且没有做适配缩放的逻辑,如果票数过高会出现单行长度超出屏幕的问题。以下修改方案仅用到你提到的基础语法,没有新增复杂用法:

实现思路

  • 统计完所有票数后,先算出三个选项的最高得票数
  • 设定柱状图的最大显示高度(比如20行,可自行调整),通过整数运算算出每个选项缩放过的柱高,保证最高的柱子刚好占满最大高度,其余按比例缩小
  • 从最高行开始逐行向下打印,每行依次判断三个选项的柱高是否大于当前行号,是则打印对应符号,否则打印空格对齐
  • 最后一行打印三个选项的名称,和上方柱子对齐

完整修改代码

#include<iostream>

int main()
{
    bool pollEnd = false;
    int tech = 0, edu = 0, agri = 0;
    // 设定柱状图最大显示高度,可根据需要调整
    const int MAX_HEIGHT = 20;

    std::cout << "投票统计" << std::endl;
    std::cout << "----------------------------" << std::endl;
    std::cout << "----------------------------" << std::endl;

    
    while(!pollEnd)
    {
        std::cout << "2022年美国最应优先关注的领域是?" << std::endl;
        std::cout << " 1.科技\n 2.教育\n 3.农业" << std::endl;
        std::cout << "\n";
        
        int answer;
        std::cin >> answer;
        
        if(answer == 1)
        {
            tech++;
        }
        else if(answer == 2)
        {
            edu++;
        }
        else if(answer == 3)
        {
            agri++;
        }
        else if(answer == 0)
        {      
            pollEnd = true;
        }
        else
        {
            std::cout << "\n" << "无效选项,请从上述列表中选择。" << std::endl;
        }
    }

    // 计算最高得票数
    int maxVotes = tech;
    if(edu > maxVotes) maxVotes = edu;
    if(agri > maxVotes) maxVotes = agri;

    // 计算每个选项缩放后的柱高,整数运算向上取整
    int techHeight = 0, eduHeight = 0, agriHeight = 0;
    if(maxVotes > 0) {
        techHeight = (tech * MAX_HEIGHT + maxVotes - 1) / maxVotes;
        eduHeight = (edu * MAX_HEIGHT + maxVotes - 1) / maxVotes;
        agriHeight = (agri * MAX_HEIGHT + maxVotes - 1) / maxVotes;
    }

    // 打印垂直柱状图
    std::cout << "\n投票结果垂直柱状图:\n";
    for(int i = MAX_HEIGHT; i >= 1; i--) {
        // 打印科技的柱子
        if(techHeight >= i) {
            std::cout << "*  ";
        } else {
            std::cout << "   ";
        }
        // 打印教育的柱子
        if(eduHeight >= i) {
            std::cout << "#  ";
        } else {
            std::cout << "   ";
        }
        // 打印农业的柱子
        if(agriHeight >= i) {
            std::cout << "|  ";
        } else {
            std::cout << "   ";
        }
        std::cout << "\n";
    }
    // 打印底部标签
    std::cout << "科技 教育 农业\n";
    std::cout << "实际得票数:科技" << tech << " 教育" << edu << " 农业" << agri << "\n";
    
    return 0;
}

效果说明

不管总票数是多少,柱状图都会自动缩放到预设的最大高度范围内,不会超出屏幕显示范围,垂直柱子的比例和实际得票比例完全一致。

内容的提问来源于stack exchange,提问作者Japer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 18:06:00