c
1#include<stdio.h> 2#include<stdlib.h> //exit, malloc, realloc 関数 3int main(void){ 4int *input; //int 型入力値に対するデータ領域の先頭位置アドレス 5int hist[5] = {0}; // 1-5 までの値に対する頻度(初期値0) 6int size = 5; //データ入力用メモリ領域数の初期設定 7int count = 0; //データ入力数 8int value; //データ入力値 9int i, j; //ループ変数 10printf("入力値のヒストグラムを作成します.(終了:ゼロ入力)\n"); 11input = (int *)mallco(sizeof(int)* 5); 12if(input == NULL){ 13 printf("メモリが確保できません\n"); 14 exit(-1); 15} 16while(1){ //while(1)は break するまで(ゼロが入力されるまで)永遠に回り続けます. 17printf("数値(1-5)を入力してください:"); 18scanf("%d", &value); 19if(value == 0){break;} //0が入力された場合,while 文からアウトします. 20if(count > size){ //入力数が当初入力数 5 個を超える場合 21size = size + 5; //領域数を5つ増やす 22input = (int *)reallco(sizeof(int)* 5); 23if(input == NULL){ 24 printf("メモリが確保できません\n"); 25 exit(-1); 26} 27} 28*(input + count) = value; 29for(i = 1; i <= 5; i++){if(value == i){hist[i-1]++;}} 30//ヒストグラム用のデータカウントを行なっています. 31count++; 32} 33------------------------------------------------------------ 34//ヒストグラムの作成 35 36------------------------------------------------------------ 37free(input); 38return 0; 39} 40
コード内の水平線間に1~5の数字を適当に入力して、入力された回数に応じて*を積んでいくヒストグラムを作りたいと考えています。表記の方法は「1:*** 2:* 3: 4:** 5:***」のようにしたいです。
for文をつかって組もうと思ったのですがしばらく調べたり試行錯誤してもうまく組む方法が思いつかなかったのでお力を借りたいと思いました。
私が考えて作ってみたのは下記の通りなのですが無限に*が生成されてしまいます。どこが間違っているか教えていただきたいです。
c
1//ヒストグラムの作成 2printf("1:"); 3for(j=0;j>=hist[0];j++){ 4 printf("*"); 5} 6 printf("\n"); 7 printf("2:"); 8 for(j=0;j>=hist[1];j++){ 9 printf("*"); 10} 11 printf("\n"); 12 printf("3:"); 13 for(j=0;j>=hist[2];j++){ 14 printf("*"); 15} 16 printf("\n"); 17 printf("4:"); 18 for(j=0;j>=hist[3];j++){ 19 printf("*"); 20} 21 printf("\n"); 22 printf("5:"); 23 for(j=0;j>=hist[4];j++){ 24 printf("*"); 25} 26 printf("\n"); 27
その提示のコードはなんでしょうか。
また、しつもんはなんでしょう
malloc()とかrealloc()とか難しい関数を使うことは置いておいて、まず
1番目の入力: 1番目に入力された値の数分ループして '*' を出力
2番目の入力: 2番目に入力された値の数分ループして '*' を出力
...
のようなコードは書けますか。それが自力でできないようだと完成は難しいと思います。
※ところでmalloc()もrealloc()も関数名のスペルが間違っています。きっと、コンパイルが通って実行ファイルが出来上がりませんね。
すみません、自分なりに考えたものを追記しましたので確認お願いいたします。
関数のスペルミスもなおしました。教えていただきありがとうございます!
表示が変なら最初に疑うのは表示している部分でしょう。ヒストグラムの作成のfor文ですが、j>=hist[num]が一度でも真となったらjは増える一方ですから…
> 自分なりに考えたものを追記しましたので
考えてコードを書くだけでなく、そのコードが意図通り動作しているのか、デバッグしましょう。
> for(j=0;j>=hist[0];j++){
① jを0に初期化
② j がhinst[0]の値以上なら{}内のブロックを実行
③ j を+1 して②に戻る
で意図通り動くのでしょうか。hinst[0]に値を入れているのはどこですか?
回答も既にいただいているのですから、そちらも理解して応対しましょう。
皆さん返信ありがとうございます!以上じゃなくて未満でしたね、そこを変更したらうまく作動しました
回答2件
あなたの回答
tips
プレビュー