《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
相关产品推荐
相关产品推荐

