• 締切済み

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]' と間接操作のレベルが異なります。」 と出てできませんでした^^; 何度も見直したのですが、どうしても間違っている場所がわかりません^^; どこがいけないのでしょうか^^;

みんなの回答

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.11

>  min、maxの両方に x[0] を入れるとまずいと思います。どちらか1つでしょう。 そうかな? x[0]~x[4]がすべて同じ値のときにどういう結果を得るべきかを 考えると、minもmaxもx[0]で初期化しておくのが適切でありましょう。

すると、全ての回答が全文表示されます。
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.10

★回答者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)
回答No.9

> ※なお、最初に min、max の値を初期化します。初期化の値に注意。 負数を入力したときに破綻しそうです。 min, maxともx[0]で初期化する方がよさそうです。

すると、全ての回答が全文表示されます。
  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.8

> xがひとつ余分でした汗 そこは、コンパイルができ無い理由ですが、それとは別に、 > 「変数名を間違っています」 変数「 j 」とすべきところに、 間違って変数「 i 」を指定しているところがありますけど・・・ #そのため、コンパイルは通っても、ちゃんと動かない。 投稿時の書き間違いで、本物のコードは正しく指定しているならそれでよいのですが・・・

すると、全ての回答が全文表示されます。
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.7

★模範解答 #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)
回答No.6

> これであっているでしょうか 1)main関数の最後に閉じカッコ } を入れましょう。 2)入力値は「5つの実数」ですか?「5つの整数」ですか?   入力を促すメッセージと、実際に入力する値の種類とが矛盾しています。

すると、全ての回答が全文表示されます。
  • GandamOO
  • ベストアンサー率37% (59/158)
回答No.5

実行してみましたか? たとえば、6,2,4,5,7 と入れてみてください。(最小値が2番目にくるように) 最小値がどうなっているでしょう。 答えは、if文の中の入れ替え処理の部分です。 変数をよーくみてみると、ここには関係ない変数がでてきてます。

tanaka022
質問者

お礼

これであっているでしょうか #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;

すると、全ての回答が全文表示されます。
  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.4

単純に、 「変数名を間違っています」 よ。その所為で変な結果になりますね。 #よーく見てみましょう。

tanaka022
質問者

お礼

ありがとうございますm(_ _)m xがひとつ余分でした汗

すると、全ての回答が全文表示されます。
  • GandamOO
  • ベストアンサー率37% (59/158)
回答No.3

実際にコンパイルが成功して実行すればわかりますが、処理にあやまりがありますね。(後半部分の2重forループ内の処理) 最初のforループ内で大小判定を2回やった方がいいようにも思えますが、いろいろと勉強していってください。

tanaka022
質問者

お礼

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)
回答No.2

エラーメッセージがわかりにくいかもしれませんが、xが重複してるためのエラーです。 int x[5],i,j,w,x,y,z,sum; のところを int x[5],i,j,w,y,z,sum; にしてみてください。

tanaka022
質問者

お礼

ありがとうございます。 コンパイルが成功しました^^

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

専門家に質問してみよう