- ベストアンサー
入力した数字の分を配列0~3に・・・
whileで無限ループを作ってscanfで値を入力していくのですが 入力を例えば 0 1 2 2 3(breakする) と入力した場合に その際に a[0] = 1;(0が1個入力されたので1) a[1] = 1; a[2] = 2; 整数で0より小さくて3より大きい場合は無限ループからbreakで脱出するようなプログラムを作りたいと思っているのですが for文でa[i]でやってカウントしていくのかな・・・?とは思っているのですが 中々うまくいきません 関数、ライブラリ等は使いません。 気になってどうしても手をつけてしまうのですが 1日以上悩んでもどうすべきかわかりません
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>3(breakする) >3より大きい場合は無限ループからbreak 3を入力したときにbreakしたいのかしたくないのか、上記の内容からは判断がつきませんが… #include <stdio.h> int main(void) { int a[3] = { 0 }, n, i; do { printf("0~2の数値を入力(範囲外を入力すると終了)> "), scanf("%d", &n); a[n]++; } while (0 <= n && n <= 2); for (i = 0; i < 3; i++) { printf("%d:%d個\n", i, a[i]); } return 0; } 適当に改変してください。
その他の回答 (4)
- unacyo
- ベストアンサー率51% (35/68)
#4です。すいません、参照元間違えました。 #1→#3です。
- unacyo
- ベストアンサー率51% (35/68)
#1さんのコードをちょいと修正。 scanfの次の行に、入力値チェックを追加。 if( (n < 0) || (2 < n)) break; 入力値を使う場合は、必ず先に範囲チェックを行ってください。 while()でチェックする意味が無くなるので、while(1);にでもすれば動きます。
お礼
勉強になりました。ありがとうございます
補足
後無限ループで補足を。 while(1)で無限が作られています。これは講師の指示です。 その中で上記のようなプログラムを組むということです。 たひだひ失礼します
- honor
- ベストアンサー率35% (25/71)
カウントする入力が0~3の4つだけならifやswitchでも使って 入力が0ならa[0]を+1する 入力が1ならa[1]を+1する 入力が2ならa[2]を+1する 入力が3ならa[3]を+1する それ以外ならbreak のように全部書いてしまう方法もありますが。
お礼
そのような方法で書けるみたいでした。 解答ありがとうございます!
補足
No.3様と同様に現在聞くようにしています。 もう少しお待ちください
- kmee
- ベストアンサー率55% (1857/3366)
scanf使ってる時点で「関数、ライブラリ等は使いません」に反するんですが、それは置いといて。 > a[0] = 1;(0が1個入力されたので1) と入力された0,1,2,の数を数えて、配列a[0],a[1],a[2]に入れる、というのが作りたいもの、ということでよろしいでしょうか? ※ 例の場合、「連続している個数」とも解釈できます。その場合まったくプログラムが変わります。 例えば、入力が1だったとして、 それまでの入力に1が1つもなければa[1]=0になっているはずで、それをa[1]=1にします それまでの入力に1が1つならa[1]=1になっているはずで、それをa[1]=2にします それまでの入力に1が2つならa[1]=2になっているはずで、それをa[1]=3にします 例えば、入力が2だったとして、 それまでの入力に2が10個ならa[2]=10になっているはずで、それをa[2]=11にします それまでの入力に2が324個ならa[2]=324になっているはずで、それをa[2]=325にします なんか法則に気付きませんか? > 整数で0より小さくて3より大きい場合 「0より小さくて3より大きい」整数は存在しません。 「0より小さいか、3より大きい」整数なら存在するし、「無限ループからbreakで脱出する」という条件に対して妥当と思われます。
お礼
あ a[2]=325も+1ですね すみません
補足
n[i++] = t++; などは考えたのですが・・・ >それまでの入力に2が10個ならa[2]=10になっているはずで、それをa[2]=11にします それまでの入力に2が324個ならa[2]=324になっているはずで、それをa[2]=325にします ということはa[2]=10だとa[2]=cnt + 1でしょうか? さらにa[2]=325にするとa[2]=cnt -1という形でしょうか?
お礼
行数指定はなかったみたいです! ありがとうございました
補足
友達の課題で/* */の5行でa[0~2]までのを入力した値のときにカウントしていく流れだと思うのですが・・・ しばらくしたら友達に「/*の範囲って5行に決まってるの?それとも自由?」と聞いてみます 確かにif分さえあれば for(i=0;i<=2;i++){ a[i]=0; } と初期化し if(a[0]==t) a[0]=a[0]+1; などができますよね もちろん初期化も大事ですが。 ちょっと情報不足ですみません、もう少しお時間をください