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;
}
しかし当本では演習問題をより考えてもらうために答えがありません。
一応はこれで指定されたとおりに実行はできるのですが、やはりまだコードが長い気がしてなりません。
考えてもこれ以上のものが考え付かないのですが、これより短く効率の良いものがあるとは思うことができるのです。
そこで本題ですが、もっとコードを短縮して書くことはできないでしょうか?
是非ともよろしくお願いします!
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;
}
なるほど・・条件演算子の中にまた条件演算子を入れて2番目を求めるわけですか!
この発想はありませんでした。
ただ、僕の頭が悪いのかパッと理解することができませんでした。
上級者になるとこういうのも一瞬でわかるものなんですかね・・。
ありがとうございました。勉強になりました。
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;
}
おぉ、そういやソートしてくれる関数?のようなものがありましたね。
別の本で読んだときに知りました。
僕が書かなかったのが悪いのですが、実は僕は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;
}
No.3
- 回答日時:
cout << "三つ入力してください";
cin >> a >> b >> c;
int center = b;
if( a > center ) center = a;
if( center > c ) center = c;
cout << "中間値は" << center << "です" << endl;
----------------------------------
ではどうでしょうか。
答えていただいてありがとうございました。
ですが、実行すると時々間違いがありましたので、できれば確認してから投稿してほしかったです・・。
a = 5, b = 3, c = 2
と入力すると中間値は2とでました。きっと最後の部分では b と c のどちらが大きいか分かっていないため、こうなったのだと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C#の検索プログラムの問題で下の写真についてなのですが実行した時にfirst、last、center 2 2022/10/13 09:36
- JavaScript vertical sliderをautoplayしたい 2 2022/08/25 14:47
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# C++初心者です stirng 2 2022/09/20 20:43
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- HTML・CSS アコーディオンメニューが思うように動作しません。 1 2023/08/20 16:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
空ENTERの判別
-
switch文のエラーについて
-
名前空間でビルドエラー(LNK20...
-
C++での <iostream.h>と<iostre...
-
C言語のポインターで詰まっている
-
c++で、cvMatからvectorへの変...
-
セグメンテーションフォルトが...
-
構造体に決められた文字列を入...
-
VC++で文字列から任意の文字を...
-
string型のフォーマット書式指...
-
VS2019でofstreamが未定義になる
-
2重の(?)の#include
-
指定した文字を削除したい
-
[Win + Eclipse + GCC]socketク...
-
c++のvirtual関数および継承に...
-
vectorの中にmap
-
構造体配列のvectorへの変換と...
-
なぜ、C++の標準ヘッダをインク...
-
VHDLのsignedとunsignedの違いは?
-
enumの値から定義名を文字列化...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
enumの値から定義名を文字列化...
-
VC++で文字列から任意の文字を...
-
C言語 ストリームについて。
-
switch文のエラーについて
-
string型のフォーマット書式指...
-
構文エラーが出ているのですが...
-
空ENTERの判別
-
gccでコンパイル時のエラー
-
なぜ、C++の標準ヘッダをインク...
-
リモートデスクトップの接続元I...
-
JPEGやPNGが読めるLoadImage関数
-
mapの初期化
-
snprintfが使用できない。
-
atlbase.h と afxwin.hの同時定義
-
C言語のエラーを修正したい
-
CSting を TCHAR [] に変換した...
-
#include "fstream.h"
-
構造体配列のvectorへの変換と...
-
【C++】ヘッダ内でstringを格納...
-
CStringとString
おすすめ情報