2010-03-31 69 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); 
}