• ベストアンサー

どのようにすればいいですか?

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

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

  • ベストアンサー
  • BLK314
  • ベストアンサー率55% (84/152)
回答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; } ===== ここまでソース=======================================

その他の回答 (3)

  • yama5140
  • ベストアンサー率54% (136/250)
回答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 - 入力順番)を加えて、配列に格納し、・・(略)。  あちゃ、これじゃあ負数の場合ダメだ(「引いて、・・」として下さい)。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

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

  • BLK314
  • ベストアンサー率55% (84/152)
回答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は非常に楽で良いですね!!

mutekisama
質問者

お礼

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

関連するQ&A

  • 配列のプログラムですが

    #include <iostream> using namespace std; int main() { int a[100],b=-9999; int i=0,j; do { cout << "整数値を入力してください\n"; cin >> a[i]; b += a[i]; i++; }while( a[i-1] != 9999); cout << b << '\n'; for(j=0;j<i-1;j=j+1) cout << a[j] * 3 << '\n'; return 0; } このプログラムってどんな計算をしてるんですか?誰か分かる人いますか 整数値を入れてくださいって出るだけなんですが

  • アドバイスください。

    10個の1桁の整数を入力して、入力した順番に並べたいのですが 最後の出力のところで番地が表示されてしまいます。 どうしてでしょうか? #include<iostream> using namespace std; int main(void){ int a; int b[10]; for(int i=0; i<9; i++){ cin >> a; b[i]=a; } cout << b; return 0; }

  • javaプログラミング

    以下のプログラムがコンバイルできません なぜでしょうか? #include<iostream> #include<cmath> using namespace std; int main() { double a, b; cout << "実数 a の値を入力してください " << endl; cin >> a; cout << "実数 b の値を入力してください " << endl; cin >> b; cout << a << " の " << b << " 乗は " << pow(a, b) << "です" << endl; return 0; }

    • ベストアンサー
    • Java
  • C++で行列とベクトルの積を求める

    行列とベクトルの掛け算 y=Ax (A(3*3行列以上)とxを適当に初期化) を作成せよ これが分からないんですが誰か分かる人いませんか?下は行列の和と積をそれぞれ求めてるんですが、こんな感じになりそうなんですよね #include<iostream> using namespace std; int main() { double A[3][3]={{1,1,6},{5,3,2},{2,2,2}}; double B[3][3]={{4,1,3},{2,4,3},{5,9,2}}; double temp; int i,j,k; for(i=0;i<3;i++){ for(k=0;k<3;k++){ } } for(i=0;i<3;i++){ for(k=0;k<3;k++){ } } cout<<"和:A+B="<< '\n'; for(i=0;i<3;i++){ cout<<" { "; for(j=0;j<3;j++){ cout<< (A[i][j]+B[i][j]); if(j!=2) cout<<" , "; } cout<< " }" << '\n'; } cout<< '\n'; cout<<"積:A*B="<< '\n'; for(i=0;i<3;i++){ cout<<" { "; for(j=0;j<3;j++){ temp=0.0; for(k=0;k<3;k++) temp += A[i][k]*B[k][j]; cout<< temp; if(j!=2) cout<< " , "; } cout<< " }" << '\n'; } return 0; }

  • 他のファイルからの数値代入

    かなり初歩的なこととは思いますが、取り組み始めたばかりで悪戦苦闘しています。 大学からの課題なのですが、 (1) 数値の入力と演算、表示を行うプログラムを組む (2) (1)とは別のファイルに(1)の結果を使って(自動的に読み込む)   更に演算し結果をを表示するプログラムを組む それぞれの入力と演算に関しては… (1) #include <iostream> using namespace std; int main() { int a; cout << "数値入力:" ; cin >> a; a = a * 2; cout << "結果 = " << a << '\n'; return 0; } (2) #include <iostream> using namespace std; int main() { int b; b = a; cout << "結果 = " << b << '\n'; return 0; } このような感じをイメージしているのですが… (2)のファイルでaが定義されていないことになり上手く出来ません。 他のファイルでの演算結果を引用するには、どのようにすればいいのでしょうか? 使用しているのはVC++ 2005です。宜しくお願いします。

  • 点数の最高得点を知るプログラム

    #include<iostream> using namespace std;  int main() {  int i;  int box[5]; cout << "テストの点数を入力してください。\n"; for (int i = 0; i < 5; i++) { cin >> box[i]; } return 0; } for文で 点数を入力まで行ったのですが、 関数で配列を使って入力した最大値を調べるプログラムの練習問題なんですが、 何回もエラー出てしまいよく解っていません。 関数からポインタまで配列でどうつかうかがよく解ってないんだと思います。 良かったら教えてください、お願いします。

  • C++ ソートのやり方

    僕が作ったプログラムで、これはバブルソートなのかわからないので教えてください。 また、ほかのソートの仕方も教えてください。 よろしくお願いします。 汎用関数を使っているのでわかりにくいかもしれないですがお願いします。 #include <iostream> using namespace std; template <class X>void Sort(X *data, int size) { X temp; for (int i = 0; i < size; i++){ for (int j = i + 1; j < size; j++){ if (data[i]>data[j]){ temp = data[i]; data[i] = data[j]; data[j] = temp; } } } } int main() { int i[10]{1, 4, 3, 5, 2, 10, 2, 7, 6, 8}; char c[10]{'c', 'b', 'z', 'a', 'x', 'y', 'j', 'n', 'm', 'r'}; Sort(c, 10); Sort(i, 10); for (int j = 0; j < 10; j++){ cout << i[j] << ' '; } cout << endl; for (int j = 0; j < 10; j++){ cout << c[j] << ' '; } cout << endl; getchar(); return 0; }

  • ''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> using namespace std; int main () { int x; int sum = 0; cout << "正の整数値の各桁を足す。\n " ; do{ cout << "正の整数値:"; cin >> x; }while (x <= 0); cout << "足すと"; while (x > 0){ cout << sum += x % 10; x /= 10; return sum; } cout << "です。\n " ; } とまでは書けましたがうまくいきません。 初心者なので簡単かもしれませんがお願いします。

  • 合計値を求める関数

    #include<iostream> using namespace std; //sum関数の定義 int sum(int x, int y) { return x + y;  } int main() { int num1, num2, ans; cout << "1番目の整数を入力して下さい。\n"; cin >> num1; cout << "2番目の整数値を入力して下さい。\n"; cin >> num2; ans = sum(num1, num2); cout << "合計は" << ans << "です。\n"; return 0; }  ここのreturn x+y;の所の合計値を戻り値として返す処理の仕組みを解りやすく教えて欲しいです、戻り値はちょっと解りづらいです、よろしくお願いします。