プロが教えるわが家の防犯対策術!

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

A 回答 (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;
}

===== ここまでソース=======================================
    • good
    • 0

>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 - 入力順番)を加えて、配列に格納し、・・(略)。

 あちゃ、これじゃあ負数の場合ダメだ(「引いて、・・」として下さい)。
    • good
    • 0

いろいろ方法は考えられるけど, 単純に「3番目に大きい値」がわかりさえすればあとはなんとかなるっしょ?

    • good
    • 0

======= ここからソース ==========================================


// 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は非常に楽で良いですね!!
    • good
    • 0
この回答へのお礼

ありがとうございます。
でも、これだと3つ大きい数は出ますけど
順番通りには出ないんではないですか?
こんな感じで出力してほしいんです。
898。 897。 895。

お礼日時:2009/05/26 23:46

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