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;
}
No.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;
}
===== ここまでソース=======================================
No.3
- 回答日時:
>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 - 入力順番)を加えて、配列に格納し、・・(略)。
あちゃ、これじゃあ負数の場合ダメだ(「引いて、・・」として下さい)。
No.1
- 回答日時:
======= ここからソース ==========================================
// 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。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# C++初心者です stirng 2 2022/09/20 20:43
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
*をユーザーが入力した数字の数...
-
正負を反転させて出力するプロ...
-
数字以外が入力されたらエラー...
-
C言語について
-
C言語 逆ピラミッドの作り方
-
漢字のソートについて
-
プログラミングの問題で、キー...
-
4桁の数字以外を入力したらエラ...
-
入力候補を表示させるには・・・?
-
double型が正常に認識されてい...
-
プログラムC言語の整数の約数に...
-
C言語 While文(ループ)内の...
-
c言語でひらがなのしりとりをで...
-
if文の条件にscanf関数を使うと…?
-
java初心者です。入力されたの...
-
scanf("%s", buf);でスペースを...
-
VBでの日付入力値のフォーマッ...
-
getchar()について 教えてくだ...
-
Linuxで入力待ちなしkeyread関...
-
cout関数を使っているのですが...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
*をユーザーが入力した数字の数...
-
正負を反転させて出力するプロ...
-
数字以外が入力されたらエラー...
-
プログラミング初心者です。 Py...
-
double型が正常に認識されてい...
-
java初心者です。入力されたの...
-
Eclipseコンソール表示を、リセ...
-
scanfが2回使えない・・・?;
-
C言語scanf_sで何故か2回入力に...
-
if文の条件にscanf関数を使うと…?
-
プログラミングの問題です 「金...
-
Linuxで入力待ちなしkeyread関...
-
ワードで文字を入力する時の変...
-
cout関数を使っているのですが...
-
batプログラム上で文字列を入力...
-
Userformの入力順序をタブオー...
-
scanf が無視されます
-
C言語 逆ピラミッドの作り方
-
gets_sがうまく動かない
-
Excel VBAで、Application.Inpu...
おすすめ情報