質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

2690閲覧

C言語でヒストグラムを組む方法を教えていただきたいです

jump110

総合スコア10

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/05/23 12:47

編集2021/05/23 13:53

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2021/05/23 12:48

その提示のコードはなんでしょうか。 また、しつもんはなんでしょう
dodox86

2021/05/23 13:07

malloc()とかrealloc()とか難しい関数を使うことは置いておいて、まず 1番目の入力: 1番目に入力された値の数分ループして '*' を出力 2番目の入力: 2番目に入力された値の数分ループして '*' を出力 ... のようなコードは書けますか。それが自力でできないようだと完成は難しいと思います。 ※ところでmalloc()もrealloc()も関数名のスペルが間違っています。きっと、コンパイルが通って実行ファイルが出来上がりませんね。
jump110

2021/05/23 13:54

すみません、自分なりに考えたものを追記しましたので確認お願いいたします。 関数のスペルミスもなおしました。教えていただきありがとうございます!
cwi

2021/05/24 00:33

表示が変なら最初に疑うのは表示している部分でしょう。ヒストグラムの作成のfor文ですが、j>=hist[num]が一度でも真となったらjは増える一方ですから…
dodox86

2021/05/24 01:43

> 自分なりに考えたものを追記しましたので 考えてコードを書くだけでなく、そのコードが意図通り動作しているのか、デバッグしましょう。 > for(j=0;j>=hist[0];j++){ ① jを0に初期化 ② j がhinst[0]の値以上なら{}内のブロックを実行 ③ j を+1 して②に戻る で意図通り動くのでしょうか。hinst[0]に値を入れているのはどこですか? 回答も既にいただいているのですから、そちらも理解して応対しましょう。
jump110

2021/05/24 05:20

皆さん返信ありがとうございます!以上じゃなくて未満でしたね、そこを変更したらうまく作動しました
guest

回答2

0

C

1#include<stdio.h> 2 3int main(void) { 4 int hist[5] = { 0 }; // 1-5 までの値に対する頻度(初期値0) 5 printf("入力値のヒストグラムを作成します.(終了:ゼロ入力)\n"); 6 int value; 7 do { 8 printf("数値(1-5)を入力してください:"); 9 scanf("%d", &value); 10 if ( value >= 1 || value <= 5 ) { 11 ++hist[value-1]; 12 } 13 } while ( value != 0 ); 14 15 for ( int i = 1; i < 6; ++i ) { 16 printf("%d:", i); 17 for ( int count = hist[i-1]; count; --count ) { 18 printf("*"); 19 } 20 printf("\n"); 21 } 22 return 0; 23}

投稿2021/05/23 13:12

編集2021/05/23 13:14
episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

c

1printf("1:"); 2for(j=0;j<hist[0];j++){ 3 printf("*"); 4} 5 printf("\n"); 6 printf("2:"); 7 for(j=0;j<hist[1];j++){ 8 printf("*"); 9} 10 printf("\n"); 11 printf("3:"); 12 for(j=0;j<hist[2];j++){ 13 printf("*"); 14} 15 printf("\n"); 16 printf("4:"); 17 for(j=0;j<hist[3];j++){ 18 printf("*"); 19} 20 printf("\n"); 21 printf("5:"); 22 for(j=0;j<hist[4];j++){ 23 printf("*"); 24} 25 printf("\n");

投稿2021/05/24 05:21

jump110

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kaina

2021/05/24 05:26

この課題では1~5の数字になっていますが、例えば1~100、1~1000と増えた場合 あなたはfor分を100個、1000個と増やすのですか?
jump110

2021/05/31 07:07

今の自分ではこの方法しか思いつかなかったのですがたしかに数が増えると対処できなくなりますね... 良ければ数が数がふえた場合の対処方法を教えていただきたいです。
kaina

2021/05/31 07:24

それがepistemeさんの回答ですよ。
jump110

2021/05/31 07:44

for文を重ねて書いているところですね!なるほど、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問