• ベストアンサー

二次元配列2

キーボードから0 以上100 以下の整数を入力し,(1)0 以上10 未満,(2)10 以上20 未満,(3)20 以上30 未満,・・・(10)90 以上100 未満,(11)100 の11 段階に分類して頻度を調べるプログラムを作成します。負の値が入力された場合にはプログラムを終了して,101 以上の数が入力された場合には入力値が無効であることを画面表示して頻度には数えない。 日本語が難しくて少し理解しずらいのですが・・・・・ #include <stdio.h> int main(void){ int i,n,count; int a[11] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; do{ printf("1以上100以下の整数を入力"); scanf("%d",&n); /*ここに頻度の処理を書く??*/ }while(n < 0); printf("終了"); for( i = 0; i < 11; i++){ /*画面表示*/ } getchar(); getchar(); return(0); } という具合でいいのでしょうか・・・・・・・ それと頻度の処理はどうすればいいのでしょうか

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

  • ベストアンサー
  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.2

>という具合でいいのでしょうか・・・・・・・ >それと頻度の処理はどうすればいいのでしょうか あまりに何も出来ていないので、もう少し頑張ってから質問した方がよいでしょう。 このままでは配列 a[11] の用途すらわかりません。

noname#46595
質問者

補足

#include <stdio.h> int main(void){ int i,n; int a[11] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; do{ printf("1以上100以下の整数を入力:"); scanf("%d",&n); if( n >= 0 && n < 10 ){ a[0] += 1; }else if( n >= 10 && n < 20 ){ a[1] += 1; }else if( n >= 20 && n < 30 ){ a[2] += 1; }else if( n >= 30 && n < 40 ){ a[3] += 1; }else if( n >= 40 && n < 50 ){ a[4] += 1; }else if( n >= 50 && n < 60 ){ a[5] += 1; }else if( n >= 60 && n < 70 ){ a[6] += 1; }else if( n >= 70 && n < 80 ){ a[7] += 1; }else if( n >= 80 && n < 90 ){ a[8] += 1; }else if( n >= 90 && n < 100 ){ a[9] += 1; }else if( n == 100 ){ a[10] += 1; } }while(n >= 0); printf("終了\n"); for( i = 0; i < 10; i++ ){ printf("頻度%d ~ %d = %d\n", i*10, i*10 + 9,a[i]); } printf("頻度%d = %d",100,a[10]); getchar(); getchar(); return(0); } こんな感じでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (5)

  • atushi256
  • ベストアンサー率62% (10/16)
回答No.6

No.3の者ですが、以下のURLにもあるとおり、 「配列の初期化では、初期化の足りない要素は 0 で初期化されます。 int no[5] = {0};」 http://www9.plala.or.jp/sgwr-t/c/sec02.html

noname#46595
質問者

お礼

なるほど。 わざわざ int a[11] = { 0, 0, 0,・・・・・・・・} とするよりは int a[11] = {0}; ということですね。 ただ宣言後に初期化を行うとコンパイルエラーしてしまうとういことですね。ありがとうこざいました。勉強になりました。

全文を見る
すると、全ての回答が全文表示されます。
  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.5

>これだと、配列の1番目以降が初期化されていないのでエラーが発生するとおもうのですが まぁ。やってみればわかる。

全文を見る
すると、全ての回答が全文表示されます。
  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.4

>こんな感じでしょうか? いいんじゃね。 >101 以上の数が入力された場合には入力値が無効であることを画面表示して がないくらい?

noname#46595
質問者

お礼

すいませんw早とちりですね・・・・・ }else if( n >= 100 ){ printf("無効\n"); } は }else if( n >= 101 ){ printf("無効\n"); } でした・・・・・・。 指摘ありがとうございます。

noname#46595
質問者

補足

あとは }else if( n >= 100 ){ printf("無効\n"); } を付け加えるだけですね・・・・・。

全文を見る
すると、全ての回答が全文表示されます。
  • atushi256
  • ベストアンサー率62% (10/16)
回答No.3

こんな感じでどうでしょうか? 適当に書いたので、間違えてるかもしれません。 #include <stdio.h> int main(void){ int i,n; int count = 0; int a[11] = { 0 }; do{ printf("0以上100以下の整数を入力"); scanf("%d",&n); if( 0<=n && n<=100 ){ ++a[n/10]; ++count; } }while( 0<=n ); printf("終了"); for( i = 0; i < 11; i++){ printf("%d 番目の区分の頻度は %f \n", i+1, ((float)a[i])/count) } getchar(); getchar(); return(0); }

noname#46595
質問者

補足

これだと、配列の1番目以降が初期化されていないのでエラーが発生するとおもうのですが・・・・・・・

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

質問があります。 1)0以上100以下の「正しい」整数の入力は、 どうやって終了するのでしょうか? 2)負の数を入力したときにはプログラムを終了すると書かれていますが、 頻度の値を出力せずに終了するのでしょうか? それとも、頻度の値を出力してから終了するのでしょうか? 後者であれば、1)の話は解決します。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 2次元配列

    課題で、氏名をローマ字で入力し、2次元配列に格納するプログラムを作成するというのがでました。条件として、氏名の長さは10文字以下、最大件数は10件。1エントリ入力ごとに累計件数を表示し、10件目の入力が完了するか、氏名の一文字目に'0'が入力されたら入力を終了しデータを表示する。11文字以上入力されたら、先頭から10文字までを有効とし、11文字目以降を無視する。 改行のみの入力の場合、エラーメッセージを表示し、再入力させる。 初心者の私には、データの表示と、条件の処理の仕方がわかりません。 下記プログラムを上記の条件を満たすようにするには、どこを直したらよいか教えてください。 お願いします。 #include <stdio.h> #include <string.h> #define BUFFERSIZE 1024 main() { char str[10][BUFFERSIZE]; char c; int count = 0; int i; int j; int l[10]; /*氏名の入力*/ for (i = 0; i < 10; i++) { printf("氏名人力 : "); while ( (c = getchar()) != '\n' ) { if( count < BUFFERSIZE - 1 ){ str[i][count++] = c; } } str[i][count] = '\0'; printf("累計 : %d \n", i+1); } for (i = 0; i < 10; i++) { for (j = 0; j < 10; j++) { printf("%c",str[i][j]); } putchar('\n'); } return 0; }

  • 2次元配列

    大学の課題なのですが 10×10の2次元配列に、平面のビットパターンが入っているとする(0と1の整数が入っているとする)。左右反転して出力しなさい。 という問題で、自分は以下のプログラムを作ったのですが、うまくうごいてくれません。だれか間違いを指摘していただけないでしょうか。 よろしくお願いします。 #include<stdio.h> int main(void) { int i,j; int data[10][10]={0,1}; for(i=0;i<10;i++){ for(j=0;j<10;j++){ printf("%3d",data[10-i][10-j]); } printf("\n"); } return(0); }

  • 関数の再帰処理

    1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657... という数列(フィボナ数列)を再帰処理でだしたいのですが・・・・・ include <stdio.h> int function( int ); int main( void ){ int n; do { printf( "0 以上の整数値を入力して下さい→ " ); scanf( "%d", &n ); }while ( n < 0 ); printf( "計算結果: %d\n", function( n ) ); getchar(); getchar(); return 0; } int function( int n ){ //フィボナの処理(function)の再帰呼び出しによる } function内に再帰処理を用いてprintf( "計算結果: %d\n", function( n ) );で画面出力したいのですが・・・・・・。

  • 二次元配列についての質問です。

    1~9の数字を9,8,7,6,5,4,3,2,1と出力するようなプログラムを作成しているのですが、解りません。一応ある程度(以下のプログラム)出来たのですが、何処をどう直せばいいか解りません。何処を直せばいいか教えて下さい。 #include<stdio.h> int main(void){ int i,mt[3][3]= {{1,2,3}, {4,5,6}, {7,8,9}}; for(i=0;i<3;i++){ printf("%3d",mt[i][i]); } printf("\n"); return(0); }

  • 一次元配列についてです

    配列matを以下の様に宣言し、連続した3つの数の和を順に書き出すプログラムを作成しています。が、条件式とprintfの出力の仕方が全く解りません。この二つが解る方、教えて頂けませんか。 #include <stdio.h> int main(void) { int i,mat[10]={5,3,8,2,7,1,10,4,9,6}; for(i=0;i<10;i++) { } printf("\n"); return(0); }

  • 二次配列

    3×2 行列の要素(float)をキーボードから入力し,画面表示するプログラムを作成したいのですが 配列名をmatrixとして #include <stdio.h> int main(void){ int i, j; float matrix[3][2]; for ( i = 0; i < 3; i++ ){ printf("列入力:"); scanf("%f",matrix[i]); } for ( j = 0; j < 2; j++ ){ printf("行入力:"); scanf("%f",matrix[i]); }   for( i = 0; i < 3; i++ ){ for(j = 0; j < 2; j++ ){ printf("matrix[%d][%d] = %f\n",i+1,j+1,matrix[j][i]); } } getchar(); getchar(); return(0); } としたのですが・・・・・・一部が正しく表示されません。 さらにビジュアルスタジオ.net2003でコンパイルすると。実行結果の最後にエンターキーを押すとエラーが発生してしまうのですが・・・・。 どのようにすればいいのでしょうか?

  • 配列プログラムのバグ

    入力した正の整数を読み込み、小さい順に並べ替える配列のプログラムを作りたいのですが、以下のプログラムで結果がくるってしまいます。 色々な数値を入力してみたところ、入力した数字のうち、どれかが0に なってしまうようなのですが、いまいち理解できません。 どこを修正すればいいのでしょうか? #include<stdio.h> int main(void){ int a[255],b,i=0,j,k; while(i<255){ printf("正整数:\n"); scanf("%d",&a[i]); if(a[i]==0) break; else if(a[i]<0){ printf("正の整数ではありません"); return 0; } i++; } for(k=0;k<=i;k++){ for(j=0;j<=i;j++){ if(a[j]>a[j+1]){ b=a[j]; a[j]=a[j+1]; a[j+1]=b; } } } printf("入力された整数は小さい順に"); for(j=0;j<=i;j++){ printf("%d,",a[j]); } printf("です。"); return 0; }

  • 二次元配列の対各成分を書き出すプログラムについて

    実行結果が3,5,7を書き出すプログラムを作成したいです。1,5,9を書き出す(以下のプログラム)を書き出すものは出来たのですが、3,5,7を書き出すプログラムが解りません。誰か解る方、教えて下さい。 #include<stdio.h> int main(void){ int i,mt[3][3]= {{1,2,3}, {4,5,6},     {7,8,9}}; for(i=0;i<3;i++){ printf("%d",mt[i][i]); } printf("\n"); return(0); }

  • C言語初心者です。次の問題で質問です。

    (問題) 二つの整数値を読み込んで、それらの値の差が10以下でなければ、「それらの差は10以下」そうでなければ「それらの差は11以上」と表示するプログラムを作成せよ。ただし、論理OR演算子を用いること。 (自分の解答) #include <stdio.h> int main(void) { int n1,n2; printf("2つの整数を入力してください\n"); printf("整数1:"); scanf("%d",&n1); printf("整数2:"); scanf("%d",&n2); if ( (n1-n2) <= 10 || (n1-n2) >= 11) { /*ここがわかりません*/ printf("それらの差は10以下です。"); } else { printf("それらの差は11以上です。"); } return 0; } 論理OR演算子の使い方が分かりません。 解答お願いいたします。

  • 配列の問題

    配列の問題です。 n個の要素を持つ一次元配列の値(変数値)をまったく逆に入れ替えるプログラムを作りたいのですが、この場合どのようにして逆を表現すればよいのかわかりません。 (nの値は読み込み、配列は奇数個でも偶数個でも使えるプログラムでなければなりません) 参考書を見ながら作ってみたのですが…だめでした。 プログラム初心者です。アドバイスお願いします。 int main(void) { int i,n; int vc[n]; printf("n個の要素を持つ一次元配列をつくる\n"); printf("nの値を入力してください\n"); scanf("%d",&n); for (i=0;i<n+1;i++) vc[i]=i+1; for (i=0;i<5;i++) printf("vc[%d]=%d\n",i,vc[i]); printf("この配列を逆に入れ替えると\n); return 0; }