アプリ版:「スタンプのみでお礼する」機能のリリースについて

下記の問題が解けなくて困っております。
for文をつかった解法をお願いしたいです。


n個の要素からなる整数の配列a[ ]の中から2番目に大きな値を求め、それを戻り値とする関数maxsecを作成しなさい。


int maxsec(int n , int a[ ])
{




宜しくお願いします。

A 回答 (8件)

#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つ目の要素を返す、ということです。
    • good
    • 0

配列の先頭から順に見て、一番大きな値と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;
}
    • good
    • 0

問題の根幹にかかわるところだけど, そもそも「2番目に大きな値」ってなんですか?



a 全体の中で a[0] が最大だと困りませんか>#2.
    • good
    • 0

以前、類題に回答したことがあります。


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://oshiete.goo.ne.jp/qa/5317566.html
    • good
    • 0

No.3 で触れられていますが、「定義の問題」は大切ですよね。



10, 10, 9, 8 というデータがあった場合、そもそも「2番目に大きな値」とは?

1)10, 10, 9, 8 をソートした場合の2番目だから、10

2)数字としては、3種類で、2番目に大きな値は、9

あと、なんか見落としている気もするけど……。
    • good
    • 0

せっかくなので、作ってみました。



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 の最大値を求める
}
    • good
    • 0

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 が正解。
}
    • good
    • 0
この回答へのお礼

もっとも丁寧に回答してくださったのでBAとさせて頂きました。

質問の仕方がいまいちよくなかったのは反省点です。


他の方もわかりやすい回答ありがとうございました!

お礼日時:2014/07/16 17:57

 基本的にNo.1の方と同じですが、


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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!