質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.04%

正の整数を入力し続け、最後に整数の一の位が同じものをまとめて表示する。

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,011

score 6

前提・実現したいこと

現在、C++を学習しております。問題の回答自体はでき、実行結果も正しいのですが、あまりにも冗長な気がしますのでプログラムのアドバイスをいただきたく質問致しました。
また、問題文では特に指定されていないのですが、実行例の4について昇順になっています。私のプログラムでは考慮していないのですが、これをvector配列で昇順とするにはやはりソート関数を実装するしかないでしょうか。

以下問題文です。(probex4-3)

コンソールから正の整数値を入力させ続け、-1を入力すると、それまで入力した整数の一の位が同じものをまとめて表示するプログラムを作りなさい。このとき、入力された整数値は、vectorで作った可変長配列の中に格納すること。

期待される実行結果
正の整数を入力:50
正の整数を入力:43
正の整数を入力:2
正の整数を入力:12
正の整数を入力:34
正の整数を入力:24
正の整数を入力:8
正の整数を入力:-1 ← -1が入力されたら、入力を終える

一の位が0 : 50
一の位が1 : なし ← 該当する数値が無い場合は、「なし」と表示する。
一の位が2 : 2
一の位が3 : 43
一の位が4 : 24 34 ← 該当するものが複数存在する場合は、すべて表示する。
一の位が5 : なし
一の位が6 : なし
一の位が7 : なし
一の位が8 : 8
一の位が9 : なし

vectorの可変長配列を一の位0〜9に合わせて10個用意する。
-1が入力されるまでwhile文を実行する。入力されたら150行目のbreak;で抜ける。
入力された数字の一桁目を見てvector配列に追加する。
-1が入力されたら、それぞれの配列を表示、数字がなければなしと表示する。

発生している問題・エラーメッセージ

817行目の最初の配列の定義が、かなり冗長になってしまっている
②2747行目の配列に追加するコードも冗長になっている
③52149行目の表示部分もどうにかして、1つを繰り返す様に書けないだろうか。

該当のソースコード

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main(){
  vector<int> number_0; //1の位が0
  vector<int> number_1; //1の位が1
  vector<int> number_2; //1の位が2
  vector<int> number_3; //1の位が3
  vector<int> number_4; //1の位が4
  vector<int> number_5; //1の位が5
  vector<int> number_6; //1の位が6
  vector<int> number_7; //1の位が7
  vector<int> number_8; //1の位が8
  vector<int> number_9; //1の位が9

  int a;

  while(true){
    cout << "正の整数を入力:";
    cin >> a;

//一の位を調べそれぞれのリストに追加
    if(a>0){
      if(a%10 == 0){
        number_0.push_back(a);
      }else if(a%10 == 1){
        number_1.push_back(a);
      }else if(a%10 == 2){
        number_2.push_back(a);
      }else if(a%10 == 3){
        number_3.push_back(a);
      }else if(a%10 == 4){
        number_4.push_back(a);
      }else if(a%10 == 5){
        number_5.push_back(a);
      }else if(a%10 == 6){
        number_6.push_back(a);
      }else if(a%10 == 7){
        number_7.push_back(a);
      }else if(a%10 == 8){
        number_8.push_back(a);
      }else if(a%10 == 9){
        number_9.push_back(a);
      }

//-1が入力された際にそれぞれのリストを表示
//リストに数字が入っていなければなしと表示する
    }else{
      if(number_0.size() == 0){
        cout << "一の位が0:なし" << endl;
      }else{
        cout << "一の位が0:";
        for(int k = 0;k < number_0.size();k++){
          cout << number_0[k] << " ";
        }
        cout << endl;
      }
          if(number_1.size() == 0){
            cout << "一の位が1:なし" << endl;
          }else{
            cout << "一の位が1:";
            for(int k = 0;k < number_1.size();k++){
              cout << number_1[k] << " ";
            }
            cout << endl;
          }

              if(number_2.size() == 0){
                cout << "一の位が2:なし" << endl;
              }else{
                cout << "一の位が2:";
                for(int k = 0;k < number_2.size();k++){
                  cout << number_2[k] << " ";
                }
                cout << endl;
              }

                  if(number_3.size() == 0){
                    cout << "一の位が3:なし" << endl;
                  }else{
                    cout << "一の位が3:";
                    for(int k = 0;k < number_3.size();k++){
                      cout << number_3[k] << " ";
                    }
                    cout << endl;
                  }

                      if(number_4.size() == 0){
                        cout << "一の位が4:なし" << endl;
                      }else{
                        cout << "一の位が4:";
                        for(int k = 0;k < number_4.size();k++){
                          cout << number_4[k] << " ";
                        }
                        cout << endl;
                      }

                        if(number_5.size() == 0){
                          cout << "一の位が5:なし" << endl;
                        }else{
                          cout << "一の位が5:";
                          for(int k = 0;k < number_5.size();k++){
                            cout << number_5[k] << " ";
                          }
                          cout << endl;
                        }

                          if(number_6.size() == 0){
                            cout << "一の位が6:なし" << endl;
                          }else{
                            cout << "一の位が6:";
                            for(int k = 0;k < number_6.size();k++){
                              cout << number_6[k] << " ";
                            }
                            cout << endl;
                          }

                            if(number_7.size() == 0){
                              cout << "一の位が7:なし" << endl;
                            }else{
                              cout << "一の位が7:";
                              for(int k = 0;k < number_7.size();k++){
                                cout << number_7[k] << " ";
                              }
                              cout << endl;
                            }

                              if(number_8.size() == 0){
                                cout << "一の位が8:なし" << endl;
                              }else{
                                cout << "一の位が8:";
                                for(int k = 0;k < number_8.size();k++){
                                  cout << number_8[k] << " ";
                                }
                                cout << endl;
                              }

                                if(number_9.size() == 0){
                                  cout << "一の位が9:なし" << endl;
                                }else{
                                  cout << "一の位が9:";
                                  for(int k = 0;k < number_9.size();k++){
                                    cout << number_9[k] << " ";
                                  }
                                  cout << endl;
                                }
      break; //while文から抜ける
    }
  }
}

試したこと

アルゴリズムとして1つ考えたのが、
①入力された数値を一旦配列1につっこむ
②-1が入力されたら1〜(配列1の数字の最大値)までfor文で配列1について調べていく。
③配列1に存在する数値だったら、一桁目を調べ(一桁目が0〜9配列)にそれぞれ追加していく。
④最後に(一桁目が0〜9配列)を全て表示
です。この方法だと、ソート関数を実装しなくても昇順にソートが可能だと思ったのですが、
入力が例えば1,10000,-1の様に数字に大きな差が生じる際に
計算量がかなり大きくなって無駄な気がしました。
リンク内容

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

あなたの方針通りに短縮するとこうでしょうか。

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> number[10];

    int a;

    while (true) {
        cout << "正の整数を入力:";
        cin >> a;

        //一の位を調べそれぞれのリストに追加
        if (a > 0) {
                number[a % 10].push_back(a);
            //-1が入力された際にそれぞれのリストを表示
            //リストに数字が入っていなければなしと表示する
        }
        else {
            for (int i = 0; i < 10; ++i)
            {
                cout << "一の位が" << i << ":";
                if (number[i].empty()) {
                    cout << "なし" << endl;
                }
                else {
                    for (int n : number[i])
                    {
                        cout << n << " ";
                    }
                    cout << endl;
                }
            }
            break; //while文から抜ける
        }
    }
}

これをvector配列で昇順とするにはやはりソート関数を実装するしかないでしょうか

vectorは勝手にソートされませんので、昇順にしたいのであればソートが必要です。
上記コードで
#include <vector>#include <set>
vector<int> number[10];multiset<int> number[10];
number[a % 10].push_back(a);number[a % 10].insert(a);
に変えると昇順に出力されます。
multisetはソートして保持するため。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/04/21 10:42

    ありがとうございました。大変助かりました。

    キャンセル

0

vectorの10個の配列にしておきましょう

  • number[a%10].push_back(a);
    の1行で済む
  • 結果出力も10回のループ回せばいい

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る