C++で三つの整数の中央値を求める方法

このQ&Aのポイント
  • C++で三つの整数の中央値を求めるプログラムを作成する方法について解説します。
  • この記事では、キーボードから読み込んだ三つの整数の中央値を求めるC++のプログラムを短く効率的に書く方法について説明します。
  • C++を使って、キーボードから読み込んだ三つの整数の中央値を求めるプログラムを短く書く方法について解説します。
回答を見る
  • ベストアンサー

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

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; } しかし当本では演習問題をより考えてもらうために答えがありません。 一応はこれで指定されたとおりに実行はできるのですが、やはりまだコードが長い気がしてなりません。 考えてもこれ以上のものが考え付かないのですが、これより短く効率の良いものがあるとは思うことができるのです。 そこで本題ですが、もっとコードを短縮して書くことはできないでしょうか? 是非ともよろしくお願いします!

  • jaron
  • お礼率80% (28/35)

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

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

#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; }

jaron
質問者

お礼

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

その他の回答 (4)

回答No.5

すみません、このケースで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; }

jaron
質問者

お礼

おぉ、そういやソートしてくれる関数?のようなものがありましたね。 別の本で読んだときに知りました。 僕が書かなかったのが悪いのですが、実は僕はif文と演算子だけで書いて欲しかったんです・・。 ごめんなさい! こんな方法もあるのだと勉強になりました。 ありがとうございました!

回答No.4

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; }

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

cout << "三つ入力してください"; cin >> a >> b >> c; int center = b; if( a > center ) center = a; if( center > c ) center = c; cout << "中間値は" << center << "です" << endl; ---------------------------------- ではどうでしょうか。

jaron
質問者

お礼

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

回答No.2

#1です。 変数宣言部を以下に訂正してください。   int a, b, c, center;

関連するQ&A

  • ''C++の条件分岐分からないんですが

    #include<iostream> using namespace std; int main(){ int a; cout << "数値を入力してください\n"; cin >> a; if( a > 30) cout <<"31以上ですね\n"; } else if(a<10){ cout <<"10未満ですね\n"; } else { cout <<"30以下で10以上ですね\n"; } return 0; } これが例文なんですが、 変数aの値がbより小さい場合には、『aはbより小さいです』と表示させ、大きい場合には"a=a+b"を計算させる 文字変数mの中身が'a'ならば、『aが格納されています』と表示させて、'a'でないならば『'a'でない文字が格納されています』と表示させたあと、変数bとcを使った『b=b+c』を計算する。 変数aが、変数bより小さい場合には、『aはbより小さいです』と表示し、変数bより大きい場合には、『aはbより大きいです』と表示し、変数bと等しい場合には、『aとbは等しいです』と表示する #include<iostream> using namespace std; int main(){ int a; if(a < b) { __cout("aはbより小さいです\n"); } else { __c = a + b; }return 0; } #include<iostream> using namespace std; int main(){ int a; if(m == 'a') __cout("aが格納されています\n"); } else { __cout("\'a\'でない文字が格納されています\n"); } return 0; } #include<iostream> using namespace std; int main(){ int a; if(a < b) { __cout("aはbより小さいです\n"); } else if(a == b) { __cout("aとbは等しいです\n"); } else { __cout("aはbより大きいです\n"); } return 0; } これ合ってますか?あとプログラミング環境すらないので実行結果教えてもらっていいですか?

  • C++の二次方程式のプログラム

    #include <iostream> #include <cmath> using namespace std; int main() { double a,b,c; cin >> a >> b >> c; if(a==0) { cout << (-c/b) << '\n'; } else if((b*b-4*a*c)<0) { cout << (-b/2/a) << 'i' << sqrt(4*a*c-b*b)/2/a << '\n'; } else { cout << (-b/2/a) << sqrt(4*a*c+b*b)/2/a << '\n'; } return 0; } 最後のelseの下のcoutが本当に分からないんで教えてくださいお願いします。一応この条件(a=0の時、aが0以上の時、aが0以下の時)で出題されてるんですが…

  • C++の二次方程式のプログラム

    二次方程式の解を求めるプログラムで虚数解の場合、a=0の場合、実数解の場合で求めるようにしているんですが、 #include <iostream> #include <cmath> using namespace std; int main() { double a,b,c; cin >> a >> b >> c; if(a==0) { cout << (-c/b) << '\n'; } else if((b*b-4*a*c)<0) { cout << (-b/2/a) << 'i' << sqrt(4*a*c-b*b)/2/a << '\n'; } else { 次にcout が来るのは分かってるんですが、数学でこういう書き方しなし、ここから先の書き方が分からないんですが、どうやって書けばいいですか? 多分return 0; } のぞいてあと2行か1行だと思うんですが

  • C++で二次方程式のプログラム

    大分前に二次方程式のプログラムを作るって問題が出ていました。 しかし、セットで作ったプログラムのフローチャートを書くんですがフローチャートが分かりません。 条件は 虚数解 a=0 実数解 の場合分けをして、解を出すってプログラムなんですが、多分、それ自体は合っていると思います。 しかし、そのフローチャートを書きなさいって問題があったんですが、それが未だに分からないんですが、これをフローチャートに書くとすると、どう書けばいいですか? #include <iostream> #include <cmath> using namespace std; int main() { double a,b,c,d,x0,x1; cout << "aを入力してください\n"; cin >> a; cout << "bを入力してください\n"; cin >> b; cout << "cを入力してください\n"; cin >> c; d=b*b-4*a*c; x0 = (-b + sqrt(d)) / (2 * a); x1 = (-b - sqrt(d)) / (2 * a); if(a==0) { cout << "解は1つで" << -c/b << "です\n"; } else if(d>0) { cout << "解は二つの実数解で,解は" << x0 << "," << x1 << "です\n"; } else { cout << "解は二つの虚数解で,解は" << (-b) / (2 * a) << "+i" << sqrt(-d) / (2 * a) << " , " << (-b) / (2 * a) << "-i" << sqrt(-d) / (2 * a) << "です\n"; } return 0; }

  • VC++でプログラムの勉強をしています。

    プログラムは最近はじめたばかりです。While文とif文を使ってクイズを作ってみたところ、一個目のsinで入力を求めているところから無限ループになってしまいました。色々調べてcin.cler()とsin.ignore()を入れたりもしてみましたが上手くいきませんでした。どこを間違えているのでしょうか? //クイズ #include <iostream> using namespace std; int main()//cin.clear();cin.ignore();???? { int a; int b; while(1) { cout<<"ネコ型のロボットが出てくるアニメといえば?"<<endl; cout<<"A)ドラえもん B)ドラエもん C)ほりえもん D)サザエさん"<<endl; cin>>a; if(a=='A') { cout<<"ファイナルアンサー?"<<endl; cout<<"Y)Yes N)NO"<<endl; cin>>b; if(b=='Y'){break;} if(b=='N'){cout<<"ゆっくり考えてね!!"<<endl;} if(b!='Y'||'N'){cout<<"正しく入力してね!"<<endl;} } if(a=='B'||'C'||'D') { cout<<"ファイナルアンサー?"<<endl; cout<<"Y)Yes N)NO"<<endl; cin>>b; if(b=='Y'){cout<<"残念!!"<<endl;} if(b=='N'){cout<<"ゆっくり考えてね!!"<<endl;} } if(a!='A'||'B'||'C'||'D'){cout<<"正しく入力してね!"<<endl;} } cout<<"正解!!"<<endl; }

  • c++について

    入力した値が123または456で一致したら一致と表示したいのですがどうfor文を回すか分かりません。 ご助力願います_(._.)_ class N { bool hit(const char* a[],const char* b) {   for(int i=0;i<*a[i];i++) if(*a[i]!=b[i]) { return false; } return true ; } public: N() { const char* a[ ]={ "123","456"}; char b[4]; int num; cin>>num; sprintf_s(b, 4, "%03d", num); if(hit(a,b)) cout<<"一致"; else cout<<"不一致"; } };

  • コンソールで整数を入力(C#)

    C#でコンソールから整数を入力したいのですが、 やり方がみつかりません。分かる方教えてください。 C++だと下のようなコードです。 int a; cout<<"整数を入力して!"; cin>>a; cout<<"入力した整数は:"<<a; こんなこと分からなくてすみません...

  • C++のプログラムが走りません。

    <<条件は以下です。>> データメンバ x:xの座標(ただし 0-1000とする) y:yの座標(ただし 0-1000とする) z:zの座標(ただし 0-1000とする) メンバ関数 void setX(int a): xの座標を設計する(範囲外の値は、error messageを出力する) void setY(int b): Yの座標を設計する(範囲外の値は、error messageを出力する) void setZ(int c) Zの座標を設計する(範囲外の値は、error messageを出力する) int getX(): Xの座標値を得る int getY(): Yの座標値を得る int getZ(): Zの座標値を得る << 不明な点は、 if文で、どう戻るかがわからないことと、 最後の結果表示の部分です。 以下が、作成したプログラムです。ネットで検索して類似しているプログラムを参考にしたんですが。 よろしくお願いします。>> #include <iostream> using namespace std; class Zahyou{ private: int getX();//Xの座標値を得る int getY();//Yの座標値を得る int getZ();//Zの座標値を得る int a,b,c; public: void setX(int a);//Xの座標を設計する void setY(int b);//Yの座標を設計する void setZ(int c);//Zの座標を設計する void show(); }; void Zahyou::show(){ cout << "The result is: (" << a << "," << b << "," << c << ")"; } void Zahyou::setX(int a){ cout << " Please Input X " << "\n "; cin >> a ; if(a < 0 && a > 1000){ cout << "The value of X is a mistake, Please input X again! " << " \n "; } } void Zahyou::setY(int b){ cout << "Please Input Y " << "\n "; cin >> b ; if(b < 0 && b > 1000){ cout << "The value of y is a mistake, Please input X again! " << " \n "; cin >> b ; } } void Zahyou::setZ(int c){ cout << " Please Input Z " << "\n "; cin >> c ; if(c < 0 && c > 1000){ cout << "The value of Z is a mistake, Please input X again! " << " \n "; cin >> c ; } } int main(){ Zahyou zahyou1; zahyou1.getX(); zahyou1.getY(); zahyou1.getZ(); zahyou1.show(); return 0; }

  • 二次方程式のプログラム

    C++で二次方程式の解を求めるんですが、虚数解の場合、a=0の場合、実数解の場合で求めるようにしているんですが、 #include <iostream> #include <cmath> using namespace std; int main() { double a,b,c; cin >> a >> b >> c; if(a==0) { cout << (-c/b) << '\n'; } else if((b*b-4*a*c)<0) { cout << (-b/2/a) << 'i' << sqrt(4*a*c-b*b)/2/a << '\n'; } else { この先の最後の一文教えてください。抜けてて書いてないんです。

  • 最大値(c++)

    3つの数の最大値をArrayを使って求めるProgramを書いてます。何とかそれっぽくできたのですが、実行すると、一番初めに入れた数が最大値であると、表示されてしまいます。 なにが問題なのでしょうか? #include<iostream.h> int max(int n[], int size){ int max= n[0]; for (int i=1; i>size; i++) if(n[i]>max) max= n[i]; return max; } int main(){ int a,b,c; cout<<" 3つの数の最大値を求めます。順に3つの数字をいれてください。"<<endl; cin>>a>>b>>c; int d[]={ a,b,c }; cout<<"max :"<<max(d,sizeof d/ sizeof d[0])<<endl; return 0; }

専門家に質問してみよう