• ベストアンサー

縦の棒グラフ

こんにちは。30代のプログラム初心者です。 C言語で一日毎の平均気温に合わせて、「*」印を下図のようなイメージで表示する棒グラフを作成したい(5℃なら*を5つ表示)のですが、丸1日試行錯誤してもうまくいきませんでした。 ちなみに配列kionには、一日毎の気温を格納しています。 int kion{5,4,3,・・・}; (℃) 10| 9| 8| 7| 6| 5| * 4| * * 3| * * * 2| * * * (以下省略) 1|_*_* *_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 0 1 2 3 4 5 6 7 8 9 10 11 12 ~(以下省略) 横のメモリの _ _ _ _ _ _ _ _ _ _ _ _ _ 0 1 2 3 4 5 6 7 ・・・ は、普通にprintfで表示させているのですが、 縦の 10| 9| 8| 7| 6| 5| の表示がうまくいきません。 二次元配列を使っているのですが、やりかたが悪いんだと思います。 アドバイスを頂ければありがたいです。よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • yonfa
  • ベストアンサー率52% (22/42)
回答No.2

こんな感じでどうでしょう? for (i = 10; i > 0; i--){  // 気温iのメモリ表示  printf("%dl", i);  // グラフ表示  for (j = 0; j < 10; j++){   if (kion[j] >= i){    printf("*");   }   else{    printf(" ");   }  }  // 改行  printf("\n"); } 一応、グラフまで表示できるようにしました。 ただし、このままでは、気温や日数の桁数が変わるとグラフががたがたになると思います。 質問者様がプログラミングの自己学習されているという判断でよいのでしょうか? 後は自力できれいな表示ができるようにがんばってください。

DT50
質問者

お礼

ご回答ありがとうございました。 これを見る前に、自分で大体解決できてしまいました(^-^;。 こちらも参考にさせて頂きます。

その他の回答 (2)

  • noocyte
  • ベストアンサー率58% (171/291)
回答No.3

グラフ本体を表示するコードは #2 さんが書かれていますので, 左側の目盛と縦線 ('l' (エル) はやめた方がいいですよ(笑)) を出力するヒントだけ. ・縦目盛の最大桁数が事前にわかっている場合  仮に3桁とすると,   int y; // 縦目盛の値   printf("%3d|", y); ・縦目盛の最大桁数が事前にわかっていない場合  (1) 表示するすべての縦目盛の値から,それらの最大桁数を求める.    個々の値yの桁数を調べるには,sprintf() を使ってyの値を文字列に変換し,    strlen() でその長さを求めればよい.  (2) 縦目盛りの最大桁数を maxWidth とすると,次のようにすれば目盛の値yを    maxWidth 文字分の幅 (右詰め) で出力できる.     int maxWidth; // 縦目盛りの最大桁数     int y; // 縦目盛の値     printf("%*d|", maxWidth, y); 詳しくは,マニュアルの printf,sprintf,strlen の説明を読んでください.

DT50
質問者

お礼

ご回答ありがとうございました。 これを見る前に、自分で大体解決できてしまいました(^-^;。 こちらも参考にさせて頂きます。

  • yukimican
  • ベストアンサー率70% (112/159)
回答No.1

質問の意図がよくわかりません。 現在どのような出力になっていて、どうしたいのかを はっきりと書いて頂ければ、的確なアドバイスができると思います。 また、「やりかたが悪い」と書かれても、そもそも どういうやりかたをしているのかわからないので、 処理の概要 または ソースコードを書いていただけると助かります。

DT50
質問者

お礼

どうも済みませんでした。 縦軸に表示するところからやっていたのですが、それすらできません。 まず二次元配列の1列目・1行目から1列目・10行目までに10から1の数字を置き、2列目の全ての行に区切りとしての「l(エル)」を置こうと思い、このようにしてみました。 この後、配列kionに格納された値に応じて「*」を1日ごとに表示させたいと思っています。1日目の気温を「*」で5つ縦に表示、2日目の気温を「*」で4つ縦に表示・・・という具合にです。 まだ説明が下手かもしれませんが、意図が伝わらないのでしたら追記させていただきますので、ご指摘ください。   よろしくお願い致します。 #include <stdio.h> #include <ctype.h> int main() { /* int kion[10] = /* 一日ごとのkionを格納する配列 (本当は28にしたいのですが、長くなるのでとりあえず10でお願いします。)*/ /* { 5,4,3,8,7,5,2,6,4,5 };*/ int i; int j; int g[10][10] = {}; for (i = 10 ; i > 0 ; i--) { g[10 - i][0] = i ;     g[10 - i][1] = l; } for (i = 0 ; i < 10 ; i++) { for (j = 0 ; j < 10 ; j++) { putchar(g[i][j]); } printf("\n"); } printf( "-----------------------------------\n"); /* 横軸に 日付を一日毎に表示。 */ printf( " " ); for(i = 1 ; i <= 10 ; i++) { printf( " %2d " , i); } printf( "\n" ); return 0; }

関連するQ&A