如何在C中制作条形图?

时间:2010-03-31 02:57:30

标签: c bar-chart

我编写了一个程序,以与输入相同的顺序打印出整数,每行5个数字。也就是说,前5个整数将打印在第一行;下一行中接下来的5个整数;等等。我也试图用条形图格式打印数字,比如

81-105 ( 1) x
56-80 ( 5) xxxxx
6-11(5) xxxxx
-1-5 (3) xxx

我的节目:

cntr=0;
 while (fscanf(in, "%d", &a[i]) != EOF)
   {i++;

 fprintf(out, "%d-%d (%d) %s\n", A, B, k, x, cntr);
 fprintf(out, "%d\n", k, cntr);

    fprintf(out, "x", a[i]);
    i++;
   }

   fprintf(out, "1864-2336 (%d)%s\n", k, x);
   fprintf(out, "1391-1863 (%d)%s\n", k, x);
   fprintf(out, "918-1390 (%d)%s\n", k, x);
   fprintf(out, "445-917 (%d)%s\n", k, x);
   fprintf(out,"-28-444 (%d)%s\n", k, x);
    fclose(in);
    fclose(out);
return 0;
}

3 个答案:

答案 0 :(得分:2)

您不必使用循环打印x。您可以声明一个x的单个字符串,只要您需要的最大值,然后在printf调用中使用大小规范来控制打印的数量。这是一个简单的例子来说明我的意思:

#include <stdio.h>
#include <string.h>

int main(void)
{
  char maxBar[] = "xxxxxxxxxx";
  size_t i;

  for (i = 0; i < strlen(maxBar); i++)
  {
    printf("%lu: %-*.*s\n", (unsigned long) i, strlen(maxBar), i, maxBar); 
  }
  return 0;
}

输出应如下所示:

0: __________          
1: x_________
2: xx________
3: xxx_______
4: xxxx______
5: xxxxx_____

等,其中_表示空格字符。

*转换说明符中的printf表示字段宽度或精度规范作为参数传递给printf。写

printf("%-*.*s\n", 10, 2, "test");

与写作相同

printf("%-10.2s\n", "test");

,从左到右阅读,意味着

  1. -:左对齐输出
  2. 10:最小字段宽度为10个字符
  3. .2:精确度(打印的最大字符数)为2
  4. 所以输出看起来像

    te________
    

    其中_表示空格字符。

    所以,假设你知道你的酒吧需要提前多大,你可以写一些像

    这样的东西
    for (i = 0; i < k; i++)
    {
      printf("%d-%d (%d) %*.*s\n", lo[k], hi[k], ct[k], strlen(maxBar), ct[k], maxBar);
    }
    

答案 1 :(得分:0)

只需做一个循环来打印你需要的x的数量

   fprintf(out, "1864-2336 (%d)%s\n", k, x);
   for(x=k;x>0;x--)
      fprint(out,"%s","x");
   fprintf(out,"\n");

干杯!

/ B2S

答案 2 :(得分:0)

有很多方法可以做到这一点

您似乎已经在某处声明了用户输入的值数组。一个[]

为了计算条形图,您可以在用户输入所有值后,对该数组进行排序(例如使用qsort())然后遍历数组,检查数组中出现的相同值的数量 - 这将是数字'*'打印出来

我认为您首先应该让用户输入值,然后输出。

您展示的代码看起来不对,例如你在while循环中增加'i'两次。在增量之后使用a [i],因此它将没有读取值。

当读取数字时,使用fgets / atoi也很好,因为无效数字不会导致程序崩溃。