【问题标题】:How do I output a vertical histogram?如何输出垂直直方图?
【发布时间】:2021-12-26 09:54:39
【问题描述】:

我有一个包含 10 个国家/地区名称的字符串数组(最大长度为 100)。我有另一个数组,其中包含该国家赢得的相应总金额。这两个数组如下所示:

char countryNames[10][100] = {"Japan", "USA", "China", "ROC", "UK", "Australia", 
                              "Kosova", "Italy", "France", "Canada"}

int totalMedals[10] = {13, 14, 18, 12, 7, 6, 2, 9, 5, 4}

所以日本赢得了 13 枚奖牌,美国赢得了 14 枚奖牌,等等。我很难找到一种方法来使用 * 将这些统计数据输出到垂直直方图中。这是我正在寻找的输出:

我找不到不是非常硬编码的解决方案。没有特定的间距,但我希望它看起来更像示例。 谁能帮我做这个?

【问题讨论】:

  • 与其他任何事情一样,您必须在开始打印之前知道最高输出是多少,并且您必须确定每个countryNames 将使用哪一列。然后您知道您的直方图将需要显示很多(例如18)行。然后从0 循环到18 以输出直方图(或者您可以从18 循环到0)然后只需按显示顺序检查每个国家,并在行索引包含该值时输出一个值直方图列 - 在该国家/地区从该行的开头偏移。 (这就是为什么你必须按顺序检查/输出)
  • 如果你用笔和纸,那你会怎么做?也许找出最高的“总奖牌”可能是一个好的开始?
  • 您知道for 循环可以在任一方向循环,不仅从018,而且从180 也同样简单?这种倒计时循环在这种情况下可能非常有用。

标签: c output histogram


【解决方案1】:

您可以通过逐行输出来输出垂直直方图。
IE。你必须放弃整个“垂直”的想法,并通过大量的远见将所有内容强制成线条。

基本上:
第一步:找到pad,最长名字的长度。
第二步:找到total,总条目数。
第 3 步:创建一个由 pad * total 空格组成的以换行符和零结尾的字符序列。
第四步:找到index,最高数字的索引。
第 5 步:将位置 index * pad 的空白处更改为 '*'
第 6 步:找到next,即下一个最高数字的索引。
第七步:输出字符序列totalMedals[index]-totalMedals[next]次。
第 8 步:将 next 的值复制到 index
第 9 步:从第 5 步开始重复,直到完成,使用 0 作为最后一个数字。

那么你只需要根据喜好输出带有填充的名称。

这通过假设奖牌的唯一编号来简化,即没有两个具有相同的编号 - 就像您输入的数据中一样。 (虽然我怀疑它实际上也可能适用于非唯一数字。)

【讨论】:

  • 这是故意根据meta.stackoverflow.com/questions/334822/… 中描述的折衷方案(简而言之:“帮助做作业,但不要只为提问者做”)。出于显而易见的原因。我想我什至可以同时做 3 到 5 个帮助步骤,感觉很慷慨。
  • 在您尝试编写代码以匹配您获得的指导后,如果您遇到问题的特定部分,请编辑您的问题并在末尾添加您编写的代码您的问题(以 4 个空格缩进,或在上方和下方使用 ```,以便您的代码格式正确)并指出您坚持的部分。然后将提供额外的帮助。
【解决方案2】:
int max_medals = 0;
int total_countries = totalMedals.length; //this is 10 here

// here we are finding how many max medals have been won, this will 
// allow us to find the height of the matrix

for (int i=0; i<total_countries; i++)
    max_medals = max(totalMedals[i], max_mexdals);

// create the matrix representing histogram
char matrix[total_countries][max_medals];

// traversing left to right, bottom to up, if that country 
// has 'j+1' number of medals, fill the matrix else let it be blank
for(int j=0; j<max_medals; j++)
   for(int i =0; i<total_countries; i++)
      if(totalMedals[i] <= j+1)
         matrix[i][j] = '*'
      else
         matrix[i][j] = ' '

确认语法和边缘情况一次,希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 2011-08-27
    相关资源
    最近更新 更多