プロが教える店舗&オフィスのセキュリティ対策術

C++で困っています。かなり初歩的だと思いますがよろしくお願いします。

ぼくは今C++をVS2008コンパイラを使って学んでいます。
参考書として、柴田望洋様著の「明解C++入門編」というものを読んでいます。

そこで演習問題として以下の問題が出されました。
「キーボードから読み込んだ三つの整数の中央値を求めて表示するプログラムを作成せよ。」
*たとえば2,3,1だったら2で、1,2,1だったら1で、3,3,3だったら中央値は3です。

そこで僕は以下のようなコードを書きました。

#include<iostream>
using namespace std;

int main()
{
    int a, b, c;

    cout << "三つ入力してください";
    cin >> a >> b >> c;

    int center = a;
    if(center < b && center < c)
        if(b > c)
            center = c;
        else
            center = b;
    if(center > b && center > c)
        if(b > c)
            center = b;
        else
            center = c;

        cout << "中間値は" << center << "です" << endl;

    return 0;
}

しかし当本では演習問題をより考えてもらうために答えがありません。
一応はこれで指定されたとおりに実行はできるのですが、やはりまだコードが長い気がしてなりません。
考えてもこれ以上のものが考え付かないのですが、これより短く効率の良いものがあるとは思うことができるのです。

そこで本題ですが、もっとコードを短縮して書くことはできないでしょうか?
是非ともよろしくお願いします!

A 回答 (5件)

#include<iostream>


using namespace std;

void main()
{
  int a, b, c;

  cout << "三つ入力してください";
  cin >> a >> b >> c;

  center = (a < c) ? ((a < b) ? ((b < c) ? b : c) : a) : ((a > b) ? ((b > c) ? b : c) : a);

  cout << "中間値は" << center << "です" << endl;
}
    • good
    • 0
この回答へのお礼

なるほど・・条件演算子の中にまた条件演算子を入れて2番目を求めるわけですか!
この発想はありませんでした。
ただ、僕の頭が悪いのかパッと理解することができませんでした。
上級者になるとこういうのも一瞬でわかるものなんですかね・・。

ありがとうございました。勉強になりました。

お礼日時:2010/04/10 09:36

すみません、このケースでstd::setを持ち出すのは適切でないと思い直したので、std::nth_elementを使う方法を示しておきます。



#include <algorithm>
#include <iostream>
#include <vector>

using namespace std;

int main() {
vector<int> v(3);
cout << "三つ入力してください";
cin >> v[0] >> v[1] >> v[2];
std::nth_element(v.begin(), v.begin() + 1, v.end());
cout << "中間値は" << v[1] << "です" << endl;
}
    • good
    • 0
この回答へのお礼

おぉ、そういやソートしてくれる関数?のようなものがありましたね。
別の本で読んだときに知りました。

僕が書かなかったのが悪いのですが、実は僕はif文と演算子だけで書いて欲しかったんです・・。
ごめんなさい!

こんな方法もあるのだと勉強になりました。
ありがとうございました!

お礼日時:2010/04/10 09:54

std::setにソートさせて2番目の要素を取ってくるのはどうでしょうか。



#include <iostream>
#include <set>
#include <vector>

using namespace std;

int main() {
vector<int> v(3);
cout << "三つ入力してください";
cin >> v[0] >> v[1] >> v[2];
set<int> s(v.begin(), v.end());
cout << "中間値は" << *(++s.begin()) << "です" << endl;
}
    • good
    • 0

cout << "三つ入力してください";


cin >> a >> b >> c;

int center = b;
if( a > center ) center = a;
if( center > c ) center = c;

cout << "中間値は" << center << "です" << endl;
----------------------------------
ではどうでしょうか。
    • good
    • 0
この回答へのお礼

答えていただいてありがとうございました。

ですが、実行すると時々間違いがありましたので、できれば確認してから投稿してほしかったです・・。
a = 5, b = 3, c = 2
と入力すると中間値は2とでました。きっと最後の部分では b と c のどちらが大きいか分かっていないため、こうなったのだと思います。

お礼日時:2010/04/10 09:58

#1です。


変数宣言部を以下に訂正してください。

  int a, b, c, center;
    • good
    • 0

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