- 締切済み
C言語。どうしてコンパイルできません^^;
最近プログラミングの勉強をはじめました。 C言語を勉強しています。 /*入力した値の、平均値・最大値・最小値・を出す。*/ #include <stdio.h> int main(void) { int x[5],i,j,w,x,y,z,sum; printf("5つの実数の平均、最大値、最小値を求めます\n"); sum = 0; for(i=0; i<5; i++){ printf("値%d:",i+1); scanf("%d",&x[i]); sum += x[i]; } for(y=0; y<5; y++){ for(j=0; j<4; j++){ w=j+1; if(x[j] < x[w]){ z = x[i]; x[i] = x[w]; x[w] = z; } } } printf("平均値:%f\n最大値:%d\n最小値:%d\n", (double)sum/5, x[0], x[4]); return 0; } Microsoft Visual C++ 2008 Express Edition でコンパイルをしようとしたのですが、 「error C2040: 'x' : 'int' は 'int [5]' と間接操作のレベルが異なります。」 と出てできませんでした^^; 何度も見直したのですが、どうしても間違っている場所がわかりません^^; どこがいけないのでしょうか^^;
- みんなの回答 (11)
- 専門家の回答
みんなの回答
- asuncion
- ベストアンサー率33% (2127/6289)
> min、maxの両方に x[0] を入れるとまずいと思います。どちらか1つでしょう。 そうかな? x[0]~x[4]がすべて同じ値のときにどういう結果を得るべきかを 考えると、minもmaxもx[0]で初期化しておくのが適切でありましょう。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★回答者No.7です。 ・追記事項。 >負数を入力したときに破綻しそうです。 負数も入力要素に考えるなら『max = INT_MIN』にした方が良いですね。 >min, maxともx[0]で初期化する方がよさそうです。 min、maxの両方に x[0] を入れるとまずいと思います。どちらか1つでしょう。 ・tanaka022さんが見ているか分かりませんが配列を使わない方法も載せます。 2つのサンプルを見比べて下さい。 #include <stdio.h> #include <limits.h> // INT_MAX // 入力回数を定義 #define MAX_INPUT (5) // メイン関数 int main( void ) { int min = INT_MAX; // 最小 int max = INT_MIN; // 最大 int sum = 0; // 合計 int i, n; printf( "%dつの整数の平均、最大値、最小値を求めます。\n", MAX_INPUT ); // 入力 for ( i = 1 ; i <= MAX_INPUT ; i++ ){ printf( "値%d:", i ); scanf( "%d", &n ); // 合計 sum += n; // 最小と最大 if ( n < min ) min = n; if ( n > max ) max = n; } // 結果表示 printf( "\n" ); printf( "平均値:%f\n", ((double)sum / MAX_INPUT) ); printf( "最小値:%d\n", min ); printf( "最大値:%d\n", max ); return 0; }
- asuncion
- ベストアンサー率33% (2127/6289)
> ※なお、最初に min、max の値を初期化します。初期化の値に注意。 負数を入力したときに破綻しそうです。 min, maxともx[0]で初期化する方がよさそうです。
- dsuekichi
- ベストアンサー率64% (171/265)
> xがひとつ余分でした汗 そこは、コンパイルができ無い理由ですが、それとは別に、 > 「変数名を間違っています」 変数「 j 」とすべきところに、 間違って変数「 i 」を指定しているところがありますけど・・・ #そのため、コンパイルは通っても、ちゃんと動かない。 投稿時の書き間違いで、本物のコードは正しく指定しているならそれでよいのですが・・・
- Oh-Orange
- ベストアンサー率63% (854/1345)
★模範解答 #include <stdio.h> #include <limits.h> // INT_MAX // 入力回数を定義 #define MAX_INPUT (5) // メイン関数 int main( void ) { int i, x[ MAX_INPUT ]; int min = INT_MAX; // 最小 int max = 0; // 最大 int sum = 0; // 合計 printf( "%dつの整数の平均、最大値、最小値を求めます。\n", MAX_INPUT ); // 入力と合計 for ( i = 0 ; i < MAX_INPUT ; i++ ){ printf( "値%d:", (i + 1) ); scanf( "%d", &x[i] ); sum += x[ i ]; } // 最小と最大 for ( i = 0 ; i < MAX_INPUT ; i++ ){ if ( x[i] < min ) min = x[ i ]; if ( x[i] > max ) max = x[ i ]; } // 結果表示 printf( "\n" ); printf( "平均値:%f\n", ((double)sum / MAX_INPUT) ); printf( "最小値:%d\n", min ); printf( "最大値:%d\n", max ); return 0; } その他: ・『x[ MAX_INPUT ];』を使わずに平均値、最小値、最大値を求められます。 入力値を読むときに最大、最小の if 文を記述すればいいので。 この方法なら最大、最小の求め方も入れ替える(ソート)するよりも 楽に求められます。 ※なお、最初に min、max の値を初期化します。初期化の値に注意。 ・改良してみて下さい。
- asuncion
- ベストアンサー率33% (2127/6289)
> これであっているでしょうか 1)main関数の最後に閉じカッコ } を入れましょう。 2)入力値は「5つの実数」ですか?「5つの整数」ですか? 入力を促すメッセージと、実際に入力する値の種類とが矛盾しています。
- GandamOO
- ベストアンサー率37% (59/158)
実行してみましたか? たとえば、6,2,4,5,7 と入れてみてください。(最小値が2番目にくるように) 最小値がどうなっているでしょう。 答えは、if文の中の入れ替え処理の部分です。 変数をよーくみてみると、ここには関係ない変数がでてきてます。
- dsuekichi
- ベストアンサー率64% (171/265)
単純に、 「変数名を間違っています」 よ。その所為で変な結果になりますね。 #よーく見てみましょう。
お礼
ありがとうございますm(_ _)m xがひとつ余分でした汗
- GandamOO
- ベストアンサー率37% (59/158)
実際にコンパイルが成功して実行すればわかりますが、処理にあやまりがありますね。(後半部分の2重forループ内の処理) 最初のforループ内で大小判定を2回やった方がいいようにも思えますが、いろいろと勉強していってください。
お礼
2回というのは、 for(j=0; j<4; j++){ w=j+1; if(x[j] < x[w]){ z = x[i]; x[i] = x[w]; x[w] = z; for(j=0; j<4; j++){ w=j+1; if(x[j] < x[w]){ z = x[i]; x[i] = x[w]; x[w] = z; ということですか?? すみません 違っていたら勉強をします^^;
- GandamOO
- ベストアンサー率37% (59/158)
エラーメッセージがわかりにくいかもしれませんが、xが重複してるためのエラーです。 int x[5],i,j,w,x,y,z,sum; のところを int x[5],i,j,w,y,z,sum; にしてみてください。
お礼
ありがとうございます。 コンパイルが成功しました^^
- 1
- 2
お礼
これであっているでしょうか #include <stdio.h> int main(void) { int x[5],i,j,y,z,sum; printf("5つの実数の平均、最大値、最小値を求めます\n"); sum = 0; for(i=0; i<5; i++){ printf("値%d:",i+1); scanf("%d", &x[i]); sum += x[i]; } for(y=0; y<5; y++){ for(j=0; j<4; j++){ if(x[j] < x[j+1]){ z = x[j]; x[j] = x[j+1]; x[j+1] = z; } } } printf("平均値:%f\n最大値:%d\n最小値:%d\n", (double)sum/5, x[0], x[4]); return 0;