• ベストアンサー

C言語 配列・関数の問題

下記の問題が解けなくて困っております。 for文をつかった解法をお願いしたいです。 n個の要素からなる整数の配列a[ ]の中から2番目に大きな値を求め、それを戻り値とする関数maxsecを作成しなさい。 int maxsec(int n , int a[ ]) { 宜しくお願いします。

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

  • ベストアンサー
回答No.7

No.6 訂正です。 int pack(int n, int maxValue, int a[]) { int i; int j; for(i = j = 0; i < n; i++) { if(a[i] != maxValue) a[j++] = a[i]; } return j; // 配列の「大きさ」なので、j - 1 ではなくて、j が正解。 }

turureishi
質問者

お礼

もっとも丁寧に回答してくださったのでBAとさせて頂きました。 質問の仕方がいまいちよくなかったのは反省点です。 他の方もわかりやすい回答ありがとうございました!

その他の回答 (7)

回答No.8

 基本的にNo.1の方と同じですが、  関数に入った時に、   if( n<=1 ){       return( -1 );   } という2番目が存在しない場合に-1か何かを返すのか、  何を返すのかが明確では有りませんね。(笑)

回答No.6

せっかくなので、作ってみました。 No.5 の方針2)で それぞれの関数の中でやっていることは、全く単純なことというのが、ウリです。 #include <stdio.h> // 最大の数を返す int max(int n, int a[]) { int maxValue = a[0]; int i; for(i = 1; i < n; i++) if (maxValue < a[i]) maxValue = a[i]; return maxValue; } // 大きさ n の 配列 a[] の中から、 maxValue と同じものを削除して配列を縮める // 返り値は、縮めた後の配列の大きさ(というか、データの数 - 1) int pack(int n, int maxValue, int a[]) { int i; int j; for(i = j = 0; i < n; i++) { if(a[i] != maxValue) a[j++] = a[i]; } return j - 1; } // 2番目に大きな値を返す int maxsec(int n, int a[]) { return max(pack(n, max(n, a), a), a); // max(n, a) で、最大値を出して、それれを抜いた配列を pack(n, max(n, a), a) でつくる // 最後に(最大値が削除された大きさ、pack(n, max(n, a), a) の配列 a の最大値を求める }

回答No.5

No.3 で触れられていますが、「定義の問題」は大切ですよね。 10, 10, 9, 8 というデータがあった場合、そもそも「2番目に大きな値」とは? 1)10, 10, 9, 8 をソートした場合の2番目だから、10 2)数字としては、3種類で、2番目に大きな値は、9 あと、なんか見落としている気もするけど……。

回答No.4

以前、類題に回答したことがあります。 int maxsec(int n , int a[]) { int max, second, i; max=0; for ( int i=1; i<n; ++i ) if ( a[max]<a[i] ) max=i; second=0; if ( max==0 ) second=1; for ( i=second+1; i<max; ++i ) if ( a[second]<a[i] ) second=i; for ( i=max+i; i<n; ++i ) if ( a[second]<a[i] ) second=i; return a[second]; }

参考URL:
http://okwave.jp/qa/q5317566.html
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

問題の根幹にかかわるところだけど, そもそも「2番目に大きな値」ってなんですか? a 全体の中で a[0] が最大だと困りませんか>#2.

回答No.2

配列の先頭から順に見て、一番大きな値と2番目の値を求める方法 int maxsec(int n, int a[]) { int v1,v2; int i; v1=a[0]; v2=a[0]; for (i=0; i<n; i++) { if ((v1 < a[i]) { v2 = v1; v1 = a[i]; } else if (v2 < a[i]) { v2 = a[i]; } } return v2; }

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

#include <stdio.h> int maxsec(int n, int a[]) { int t, i, j; for (i = 0; i < n - 1; i++) { for (j = i + 1; j < n; j++) { if (a[i] < a[j]) { t = a[i], a[i] = a[j], a[j] = t; } } } return a[1]; } int main(void) { int a[] = { 3, 5, 8, 4, 7, 2, 9, 6, 0, 1 }; printf("%d\n", maxsec(sizeof(a) / sizeof(a[0]), a)); return 0; } 要するに、引数として渡した配列を降順にソートして、 先頭から2つ目の要素を返す、ということです。

関連するQ&A