2010-03-31 116 views
0

我写了一个程序,它以每行5个数字的输入顺序输出整数。也就是说,前5个整数将被打印在第一行;下一行中接下来的5个整数;等等。我也试图以条形图格式,像打印出来的数字,如何在C中制作条形图?

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; 
} 
+1

你的问题会更容易阅读,如果你不样式整个事情的代码,使用严格地针对实际的代码。 – hora 2010-03-31 03:03:16

+2

你的问题是什么? – 2010-03-31 03:05:35

+1

您提出的所有问题都标记为家庭作业,并且您没有接受任何问题。嗯http://stackoverflow.com/users/292489/user292489 – 2010-03-31 17:02:51

回答

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

+0

我已经尝试通过使用循环来打印我想要打印的x的数量。然而,它一直给我一个说核心倾销的错误。任何人都可以帮助我如何弄清楚如何以条形图格式打印指甲:我的输入号码在我的输入文件中,我想以五个范围(间隔)打印它们,并且在那个范围内我想要计数器通过分配K来计算落入该范围的整数的数量,其中k是落入该范围的侵入者的数量;并且我想打印出“K's”字样。 – user292489 2010-03-31 16:09:39

+0

in otherway: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;对于(A = 2336; I <= 1864; I-) 对于(x = k; x> 0; x-)01​​ fprintf(out,“%d-%d(%d)%s” ,A,B,k,x); } – user292489 2010-03-31 16:17:29

+0

如果你编辑你的问题,当你添加源代码时,它更容易阅读...... 在你的评论中的代码中,你没有初始化我,所以循环将全部错误。此外,你使条件我<=数字,这是坏的,当你倒计时。如果你倒数,你想i> =数字。否则,你应该数数(i ++)。 – Born2Smile 2010-04-10 22:40:35

0

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

看来你已经某处宣称,用户输入值的数组。一个[]

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

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

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

此外,它很好地使用fgets/atoi,而不是读取数字的方式无效的数字不会导致您的程序可能崩溃。

+0

然而,我使用数组为我的间隔范围写了我的代码;我没有得到间隔,它给了我自己的阵列: fprintf(out,“\ n”); d =((A) - (B))/ C; previous = A; left [5] = B;对于(i = 0; i <5; i ++){ right [i] = previous; 如果(i!= 5) left [i] = previous-d; previous = left [i] -1; } – user292489 2010-04-01 20:34:32

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_____ 

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

A * in 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); 
}