- ベストアンサー
どのようにすればいいですか?
10個の1桁の整数を入力して、その中から最も大きい数字を3つを 入力した順番通り出力するにはどのようにすればいいですか? #include<iostream> using namespace std; int main(void){ int b[10]; int a; for(int i=0; i<10; i++){ cin >> a; b[i]=a; } int i, j, temp; for (i = 1; i < 10; i++) { temp = b[i]; for (j = i; j > 0 && b[j-1] > temp; j--) b[j] = b[j -1]; b[i] = temp; } for(int i=0; i<3;i++){ cout << b[9-i]; } return 0; }
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
No.1です >10個の1桁の整数を入力して、その中から最も大きい数字を3つを >入力した順番通り出力するにはどのようにすればいいですか? 言っていることがよくわからないので誤解してしまったようです。 つまり、こういうことですか? 0以上9以下の整数を10個入力させる。 その10個の整数の中から大きい順に3つの整数を抽出せよ。 抽出した3つの整数は(大きさ順ではなく) 入力した順番で並べて表示せよ。 この問題を解いてみました ====== ここからソース =============================================== // sort.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 // #include <iostream> #include <algorithm> #include <vector> #include <functional> using namespace std; // 入力された順番とその値を合わせて管理するクラス class CData { public: CData(int Index, int Value) {m_Index = Index, m_Value = Value;} int GetIndex() const {return m_Index;} int GetValue() const {return m_Value;} protected: int m_Index; int m_Value; }; // ソート基準を定義する // 値基準 class ValOrder { public: bool operator()(const CData& lhs, const CData& rhs) const { int l = lhs.GetValue(); int r = rhs.GetValue(); if (l == r) { return lhs.GetIndex() < rhs.GetIndex(); } else { return l > r; } } }; // 入力順基準 class IdxOrder { public: bool operator()(const CData& lhs, const CData& rhs) const { return lhs.GetIndex() < rhs.GetIndex(); } }; int main(int argc, char* argv[]) { // 値とともに入力順も記憶する必要があるので // CDataクラスでまとめて扱います。 vector<CData> b; b.reserve(10); // 値を入力させます size_t n = b.capacity(); for(size_t i = 0; i < n; i++) { int a; cin >> a; b.push_back(CData(i, a)); } // 上位3つを取り出すためソートします sort(b.begin(), b.end(), ValOrder()); // さらに3つを入力順にソートします sort(b.begin(), b.begin() + 3, IdxOrder()); // 結果を表示します cout <<"結果" << endl; cout << "値, 位置" << endl; for(int i = 0; i < 3; i++) { cout << b[i].GetValue() << "," << b[i].GetIndex() + 1 << endl; } return 0; } ===== ここまでソース=======================================
その他の回答 (3)
- yama5140
- ベストアンサー率54% (136/250)
>10個の1桁の整数を入力して、その中から最も大きい数字を3つを >入力した順番通り出力するにはどのようにすればいいですか? 入力が 1 1 1 8 9 1 2 2 1 1 の場合、「最も大きい数字」は、9 ですが、 3つ揃いません。その場合の処理は?。 入力が 8 9 1 9 9 1 9 9 7 9 の場合、 「入力した順番通り出力」とは、9(2) 9(4) 9(5) と入力した順番を括弧などで示す、ということでしょうか?。 ++++++++++++++++++++++++++++++++++++++++++++++++++++ >でも、これだと3つ大きい数は出ますけど >順番通りには出ないんではないですか? >こんな感じで出力してほしいんです。 >898。 897。 895。 どうして3桁なのですか? 仕様の変更?。 「最も」はどうされたのでしょうか? 仕様の変更?。 「こんな感じ」からは、「入力した順番」が見えませんが・・。 898は、10番目の入力でも、2番目の入力でも「最も大きかった」んでしょ?。 ++++++++++++++++++++++++++++++++++++++++++++++++++++ ・10個の整数を入力し、その中の大きい方から3個、入力順番を添えて出力せよ。 ・同値の場合は、入力順を優先し、出力対象が4個以上となる場合は、その旨を記せ。 出力例 898(10)。897(1)。895(2)。他に左と同値のもの有り ではないですか?。 だとして、ソートにバブルを使う場合のヒント: ・正統?バブルでは、比較に=を付ける(比較ループの後半となる、水面近くを優先)。 ・沈み込み(笑)バブルでは、比較に=を付けない(比較ループの前半の、 〃 )。 水面近く = 早期の入力 = 入力した順番どおり ------------------ または、入力値を10倍し、( 10 - 入力順番)を加えて、配列に格納し、・・(略)。 あちゃ、これじゃあ負数の場合ダメだ(「引いて、・・」として下さい)。
- Tacosan
- ベストアンサー率23% (3656/15482)
いろいろ方法は考えられるけど, 単純に「3番目に大きい値」がわかりさえすればあとはなんとかなるっしょ?
- BLK314
- ベストアンサー率55% (84/152)
======= ここからソース ========================================== // sort.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 // #include <iostream> #include <algorithm> #include <vector> #include <functional> using namespace std; #define ARRAY_OF(a) (sizeof ((a)) / sizeof ((a[0]))) int main(int argc, char* argv[]) { int b[10]; for(int i = 0; i < ARRAY_OF(b); i++) { int a; cin >> a; b[i] = a; } // STLのお決まりで最後の要素の次の要素のアドレスを // 渡す // ちょっと見ると危険な気がするが // bはb[9]までしかない!!! // お決まりなので従うしかない sort(b, &b[10], greater<int>()); for(int i = 0; i < 3; i++) { cout << b[i]; } return 0; } ==== ここまでソース ============================================== iostrem(iostrem.hでなく)を#includeしていることは C++のプログラムであり STL使用ってことですね。 STLで書きました。 STLは非常に楽で良いですね!!
お礼
ありがとうございます。 でも、これだと3つ大きい数は出ますけど 順番通りには出ないんではないですか? こんな感じで出力してほしいんです。 898。 897。 895。