重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【解消】通知が届かない不具合について

3個の整数値のなかで2番目に大きい値を求めて表示するにはどういったプログラムを書けばいいのですか?教えてください。

A 回答 (4件)

/* 配列から2番目に多きい値を求める */


#include <stdio.h>

int main(void){
int data[]={ 254, 14, 36};
int i,j,c;
int size=sizeof(data)/sizeof(int);

for(i=0;i<size;i++){
c=0;
for(j=0;j<size;j++){
if(data[i]<data[j]) /* 自分より要素の大きいものを数える */
c++;
}
if(c==1)/* 自分より大きい要素は1つしかない、つまり自分は2番 */
break;
}
printf("2番目に大きい値は、%d です\n",data[i]);

return 0;
}
    • good
    • 0
この回答へのお礼

ありがとうございます。丁寧なプログラムなので理解することができました。また御力貸して頂ければ幸いです。

お礼日時:2005/10/12 23:41

ちょっと変わった方法として


#include <stdio.h>

int main(void)
{
char buf[BUFSIZ];
int a[3];
int i,mid;

while(fgets(buf,BUFSIZ,stdin) != 0) {
sscanf(buf,"%d %d %d",&a[0],&a[1],&a[2]);
i = 0;
if (a[0] <= a[1]) i++;
if (a[1] <= a[2]) i += 2;
if (a[2] <= a[0]) i += 4;

switch(i) {
case 2:
case 5:
mid = a[0];
break;
case 1:
case 6:
mid = a[2];
break;
default:
mid = a[1];
}
printf("mid = %d\n", mid);

}
}
    • good
    • 0

質問の回答だけであれば素直に比較処理でいいのでは


ないでしょうか。
表示関数は、printf();でも何でもいいとしますね。
役割的に比較と表示は別なのでメソッドに分けます。
また等しい数がないと仮定しますね。

void CalcurateSecLargeNumber( void )
{
 if ( a < b )
 {       // aよりbが大きい場合
  if ( b < c )
  {      // bよりcが大きい
   表示(b);
  }
 }
 else
 {       // bよりaが大きい場合
  if ( a < c )
  {      // aよりcが大きい
   表示(a);
  }
 }
 表示(c);   // cよりaが大きい場合
}

// 但し、3個の中でというのではなく将来的に拡張
// する予定があるのであれば、例えばn個の中で2番
// 目に大きい数字を求める。
// または、n個の中でm番目に大きな数字を求める。
// 求めた数字を表示する。
// というのであれば全く違ってきます。
    • good
    • 0

いくつかやり方がありますが、並べ替えの方法で。


1番目のマスからA,B,Cとします。
1.AとBを比べ左が大きくなるように入れ替えます。
2.BとCを比べて入れ替えます。
  この状態では1マス目と2マス目がどちらかが最大でどちらかが2番目です。
3.1マス目と2マス目を比べて交換します

これで2番めのマスが2番目に大きいです。

これで駄目なら、IF分で場合わけしていくしかありません。
    • good
    • 0

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