0

入力と同じ順序で 1 行あたり 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;
}
4

3 に答える 3

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_____

など。ここで_、はスペース文字を表します。

変換指定子のA*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);
}
于 2010-03-31T16:29:23.433 に答える
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

于 2010-03-31T03:09:26.820 に答える
0

これを行うには多くの方法があります

ユーザーが入力した値の配列をすでにどこかで宣言しているようです。[]

ユーザーがすべての値を入力した後に棒グラフを計算するには、その配列を並べ替え (たとえば、qsort() を使用) してから、配列内で発生する同じ値の数をチェックして配列を走査します。これは '* の数になります。 ' 印刷する

最初にユーザーに値を入力させてから、出力を行うべきだと思います。

あなたが示すコードは間違っているように見えます。たとえば、while ループで 'i' を 2 回インクリメントします。インクリメントの後に a[i] を使用するため、読み取り値はありません。

また、無効な数値によってプログラムがクラッシュする可能性がないように数値を読み取る場合は、代わりに fgets/atoi を使用することをお勧めします。

于 2010-03-31T03:17:25.703 に答える