【问题标题】:Creating a histogram with C++ (Homework)使用 C++ 创建直方图(作业)
【发布时间】:2012-02-05 02:13:57
【问题描述】:

在我的 c++ 课程中,我们得到了分配的对。通常我可以很容易地想出一个有效的算法,这次我不知道如何做到这一点来挽救我的生命。

我正在寻找的是有人解释算法(或只是给我关于什么可行的提示)以完成这项工作。我仍处于计划阶段,并希望自己完成此代码以便学习。我只需要一点帮助就可以到达那里。

我们必须基于 4 或 5 整数输入创建直方图。它应该看起来像这样:

Calling histo(5, 4, 6, 2) should produce output that appears like:

        *
    *   *
    * * *
    * * *
    * * * *
    * * * *
    -------
    A B C D

对此的格式化简直要了我的命。更糟糕的是,我们不能使用任何类型的数组或使用其他库的“高级”排序系统。

起初我以为我可以将值从高到低排列。但后来我意识到如果不使用 sort 函数我不知道如何做到这一点,而且我不知道如何从那里继续。

感谢任何可以帮助我开始这项任务的人。 :)

【问题讨论】:

  • 您的意思是要将其打印到控制台...还是什么?
  • 如果您想排序(无论出于何种原因),我会查找如何手动进行“冒泡排序”。无论如何,了解这一点很有用。
  • @Pluckerpluck,不是快速排序吗?
  • 看起来这只是一个格式拼图。与其上下看,不如从左到右看?
  • 我更喜欢快速排序,但在他研究优化之前,我选择了一种更简单的方法。还有什么比冒泡排序更简单。

标签: c++ formatting histogram


【解决方案1】:

尝试类似的方法:

  1. 确定直方图中的最大数
  2. 使用这样的循环来构造直方图:

    for(int i = largest; i >= 1; i--)

    在循环体中,执行第 3 步到第 5 步

  3. 如果i <= value_of_column_a,则打印*,否则打印空格

  4. 对每列重复第 3 步(或编写循环...)

  5. 打印换行符

  6. 使用-打印水平线

  7. 打印列标签

【讨论】:

  • 哇。为什么我没有想到这一点?你说的方式,听起来很容易。我将开始编写代码并查看它是否有效,但我认为它会。谢谢。
  • @Lindsiria,压力可能影响了你的思考。
【解决方案2】:

也许我在你的 q 上弄错了,但是如果你知道每列中有多少项目,那么像你的例子一样打印它们应该很容易:

第1步:找到数字的最大值,存储在变量中,分配给列。

第 2 步:打印空格,直到到达最大值列。打印星。打印剩余的星星/空格。添加一个 \n 字符。

第 3 步:找到下一个最大值。在最大值 >= 最大值的列中打印星号,否则打印空格。添加换行符。最后。

第 4 步:重复第 3 步(直到出现以下停止条件)

当您打印的星数等于最大最大值时,您已经打印了所有星数。

第 5 步:添加 -------- 行和 \n

第 6 步:添加行标题和 \n

【讨论】:

  • 用户输入图表有多少列(4或5)然后每列有多少项目。所以我不知道用户要输入的数字。如果我修改它,这种方式可以工作。
  • @Lindsiria 这真的不应该有什么不同 - 但你提到函数是 histogr..(5,4,3,2) - 因此,你有 4 列(A,B,C ,D),以及它们的值 (A=5,B=4,C=3,D=2)
【解决方案3】:

如果我正确理解了问题,我认为问题可以这样解决:

a= <array of the numbers entered>
T=<number of numbers entered> = length(a) //This variable is used to 
                                          //determine if we have finished
                                          //and it will change its value

Alph={A,B,C,D,E,F,G,..., Z}  //A constant array containing the alphabet
                             //We will use it to print the bottom row

for (i=1 to T) {print Alph[i]+" "}; //Prints the letters (plus space), 
                                    //one for each number entered

for (i=1 to T) {print "--"};        //Prints the two dashes per letter above 
                                    //the letters, one for each

while (T!=0) do {
   for (i=1 to N) do {
       if (a[i]>0) {print "*"; a[i]--;} else {print " "; T--;};
   };
   if (T!=0) {T=N};

}

它的作用是,对于每个输入的非零数字,它将打印一个 *,然后减少输入的数字。当其中一个数字变为零时,它会停止为其列放置 *s。当所有数字都变为零时(请注意,当 T 的值从 for 中出来时会发生这种情况。这就是变量 T 的用途)然后它停止。

我认为问题不在于直方图。请注意,它也不需要排序,甚至不需要知道

【讨论】:

    猜你喜欢
    • 2021-02-19
    • 2014-02-16
    • 2020-08-11
    • 1970-01-01
    • 2014-02-15
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多