C++:使用*显示数组数据的条形图

Posted

技术标签:

【中文标题】C++:使用*显示数组数据的条形图【英文标题】:C++ : display a bar chart of array data using * 【发布时间】:2016-01-27 14:47:54 【问题描述】:

我正在用 C++11 编写一个程序来表示年降雨量统计数据。我几乎完成了程序,但我被困在最后一个阶段。我需要使用 * 设计/显示一个条形图,它显示来自数组的数据。例如: 英国2015年月降雨量(mm)依次为:154.3、79.2、95.6、46.3、109.6、55.1、109.5、107.4、54.0、72.2、176.0、230.0。

我希望条形图看起来像这样:

0 - 50 : *
50 - 80 : ****
80 - 110 : ****
110 - 140 : 
140 - more : ***

这是我写的代码,但输出不正确

void RainFall::outputBarChart() const 
cout<< "Bar Chart for RainFall Amount:"<< endl;

const size_t frequencySize= 5;
array<unsigned int, frequencySize > frequency =  ; 

for(int mark : amount)
++frequency[mark / 50];

for(size_t count = 0; count < frequencySize; ++count) 

if (count == 0)
cout << " 0-49: ";
else
cout<< count * 50 << "-"<< (count * 50) + 30 << ": ";

       for (unsigned int stars = 0; stars < frequency[count]; ++stars)
       cout<< '*';
       cout << endl;


它在输出中为我提供了以下条形图

0 - 49 : *
50 - 80 : *****
100 - 130 : ***
150 - 180 : **
200 - 230 : **

【问题讨论】:

你尝试了什么? 为了更漂亮的输出,您可以垂直对齐数字和冒号,也可以将数字右对齐:) @DanielLangr 是的,老师可能会为此作业加分 【参考方案1】:

尝试使用矩阵来保存“图表”。像这样的:

char chart[][] = char[12][4];

// fill the "chart" with blanks!

for (auto idx=0; idx<12; ++idx)

    if (rain[idx] <= 50)
    
        chart[idx][3] = '*';
     else if (rain[idx] > 50 && rain[idx] <= 80)
    
        chart[idx][3] = '*';
        chart[idx][2] = '*';
        chart[idx][1] = '*';
        chart[idx][0] = '*';

     //etc to cover all cases


// now print the matrix
for (auto idxCol=0; idxCol<4; ++idxCol)

    for (auto idxLn=0; idxLn<12; ++idxLn)
        std::cout << chart[idxLn][idxCol];
    std::cout << std::endl;

它可以优化,但我相信你可以做到。

【讨论】:

【参考方案2】:

这是我的解决方案:

#include <iostream>
#include <string>

using namespace std;

struct barChart_t

    int minValue = -1;
    int maxValue = -1;
    string counts;
 myBarChart[5];

int main()

    // Rainfall data
    float UK_monthlyRainfall_mm[] = 
        154.3, 79.2, 95.6, 46.3, 109.6, 55.1, 
        109.5, 107.4, 54.0, 72.2, 176.0, 230.0;

    // Initialize desired chart ranges
    myBarChart[0].minValue = 0;
    myBarChart[0].maxValue = 50;

    myBarChart[1].minValue = myBarChart[0].maxValue;
    myBarChart[1].maxValue = 80;

    myBarChart[2].minValue = myBarChart[1].maxValue;
    myBarChart[2].maxValue = 110;

    myBarChart[3].minValue = myBarChart[2].maxValue;
    myBarChart[3].maxValue = 140;

    myBarChart[4].minValue = myBarChart[3].maxValue;

    // Check data ranges and increment counter  
    for (int month = 0; month < 12; month++)
    
        for (int line = 0; line < 5; line++)
        
            if (myBarChart[line].maxValue != -1)
            
                if ((UK_monthlyRainfall_mm[month] >= myBarChart[line].minValue) && 
                    (UK_monthlyRainfall_mm[month] <= myBarChart[line].maxValue))
                    myBarChart[line].counts = myBarChart[line].counts + '*';
            
            else if (UK_monthlyRainfall_mm[month] >= myBarChart[line].minValue)
            
                myBarChart[line].counts = myBarChart[line].counts + '*';
            
        
    

    // Print chart
    for (int line = 0; line < 5; line++)
    
        if (myBarChart[line].maxValue != -1)
            cout << myBarChart[line].minValue << " - " << myBarChart[line].maxValue << " : " << myBarChart[line].counts << endl;
        else
            cout << myBarChart[line].minValue << " - " << "more" << " : " << myBarChart[line].counts << endl;
    
    return 0;

正如您将看到的,我使用一个结构来保存每条线所需的信息,并使用一个结构数组来保存条形图。 -1 maxValue 验证用于识别“更多”情况。输出:

0 - 50 : *
50 - 80 : ****
80 - 110 : ****
110 - 140 :
140 - more : ***

【讨论】:

以上是关于C++:使用*显示数组数据的条形图的主要内容,如果未能解决你的问题,请参考以下文章

用于循环的php数组管理显示堆积的条形图

R语言使用ggplot2可视化堆叠条形图,并在堆叠条形图上显示数据值实战

条形图仅显示一个 x 值的条形图

ZingChart:具有一系列空值的堆积条形图

使用二进制数据创建条形图

java生成饼状图,条形图,折线图的技术可以动态的显示