【问题标题】:How make a bar chart in C?如何用C制作条形图?
【发布时间】:2010-03-31 02:57:29
【问题描述】:

我编写了一个程序,它以与输入相同的顺序打印出整数,每行 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;
}

【问题讨论】:

  • 如果您不将整个内容设置为代码样式,您的问题将更容易阅读,请严格将其用于实际代码。
  • 您提出的所有问题都被标记为作业,您没有接受任何问题。嗯stackoverflow.com/users/292489/user292489

标签: c bar-chart


【解决方案1】:

您不必使用循环来打印您的 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

所以输出看起来像

te________

其中_ 代表一个空格字符。

所以,假设你事先知道你的栏需要多大,你可以写类似

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

【讨论】:

    【解决方案2】:

    只需循环打印您需要的 x 数量

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

    干杯!

    /B2S

    【讨论】:

    • 我尝试使用循环来打印我想要打印的 x 的数量。但是,它一直给我一个错误,说核心转储。谁能帮我弄清楚如何以条形图格式打印整数:我的输入文件中有我的输入数字,我想在五个范围内(间隔)打印它们,在那个范围内我想有计数器通过分配 K 来计算落入该范围的整数的数量,其中 k 是落入该范围的整数的数量;而且我想在每个间隔中为 K 打印“x”。
    • 换句话说: A-B(K)xxx , A 和 B 是范围 , k 是落入该范围内的整数个数。我的程序: fprintf(out,"\n"); fprintf(out, "%d", cntr); // fprintf(out, "1864-2336 (%d)%s\n", k, "x"); // A=1864; //B=2336; //k=5; for(x=k;x>0;x--) for(A = 2336; i
    • 如果你编辑你的问题,当你添加源代码时更容易阅读......在你评论中的代码中,你没有初始化 i,所以循环会出错。您还设置了 i=number。否则你应该数数(i++)。
    【解决方案3】:

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

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

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

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

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

    在读取数字时使用 fgets/atoi 也很好,这样无效的数字不会导致您的程序可能崩溃。

    【讨论】:

    • 然而,我使用数组为我的区间范围编写了我的代码;我没有得到间隔,它给了我它自己的数组: fprintf(out, "\n"); d = ((A)-(B))/C;上一个 = A;左[5]= B; for(i=0; i
    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2023-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多