前提・実現したいこと
現在、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が入力されたら、それぞれの配列を表示、数字がなければなしと表示する。
発生している問題・エラーメッセージ
①8〜17行目の最初の配列の定義が、かなり冗長になってしまっている ②27〜47行目の配列に追加するコードも冗長になっている ③52〜149行目の表示部分もどうにかして、1つを繰り返す様に書けないだろうか。
該当のソースコード
C++
1#include <iostream> 2#include <string> 3#include <vector> 4 5using namespace std; 6 7int main(){ 8 vector<int> number_0; //1の位が0 9 vector<int> number_1; //1の位が1 10 vector<int> number_2; //1の位が2 11 vector<int> number_3; //1の位が3 12 vector<int> number_4; //1の位が4 13 vector<int> number_5; //1の位が5 14 vector<int> number_6; //1の位が6 15 vector<int> number_7; //1の位が7 16 vector<int> number_8; //1の位が8 17 vector<int> number_9; //1の位が9 18 19 int a; 20 21 while(true){ 22 cout << "正の整数を入力:"; 23 cin >> a; 24 25//一の位を調べそれぞれのリストに追加 26 if(a>0){ 27 if(a%10 == 0){ 28 number_0.push_back(a); 29 }else if(a%10 == 1){ 30 number_1.push_back(a); 31 }else if(a%10 == 2){ 32 number_2.push_back(a); 33 }else if(a%10 == 3){ 34 number_3.push_back(a); 35 }else if(a%10 == 4){ 36 number_4.push_back(a); 37 }else if(a%10 == 5){ 38 number_5.push_back(a); 39 }else if(a%10 == 6){ 40 number_6.push_back(a); 41 }else if(a%10 == 7){ 42 number_7.push_back(a); 43 }else if(a%10 == 8){ 44 number_8.push_back(a); 45 }else if(a%10 == 9){ 46 number_9.push_back(a); 47 } 48 49//-1が入力された際にそれぞれのリストを表示 50//リストに数字が入っていなければなしと表示する 51 }else{ 52 if(number_0.size() == 0){ 53 cout << "一の位が0:なし" << endl; 54 }else{ 55 cout << "一の位が0:"; 56 for(int k = 0;k < number_0.size();k++){ 57 cout << number_0[k] << " "; 58 } 59 cout << endl; 60 } 61 if(number_1.size() == 0){ 62 cout << "一の位が1:なし" << endl; 63 }else{ 64 cout << "一の位が1:"; 65 for(int k = 0;k < number_1.size();k++){ 66 cout << number_1[k] << " "; 67 } 68 cout << endl; 69 } 70 71 if(number_2.size() == 0){ 72 cout << "一の位が2:なし" << endl; 73 }else{ 74 cout << "一の位が2:"; 75 for(int k = 0;k < number_2.size();k++){ 76 cout << number_2[k] << " "; 77 } 78 cout << endl; 79 } 80 81 if(number_3.size() == 0){ 82 cout << "一の位が3:なし" << endl; 83 }else{ 84 cout << "一の位が3:"; 85 for(int k = 0;k < number_3.size();k++){ 86 cout << number_3[k] << " "; 87 } 88 cout << endl; 89 } 90 91 if(number_4.size() == 0){ 92 cout << "一の位が4:なし" << endl; 93 }else{ 94 cout << "一の位が4:"; 95 for(int k = 0;k < number_4.size();k++){ 96 cout << number_4[k] << " "; 97 } 98 cout << endl; 99 } 100 101 if(number_5.size() == 0){ 102 cout << "一の位が5:なし" << endl; 103 }else{ 104 cout << "一の位が5:"; 105 for(int k = 0;k < number_5.size();k++){ 106 cout << number_5[k] << " "; 107 } 108 cout << endl; 109 } 110 111 if(number_6.size() == 0){ 112 cout << "一の位が6:なし" << endl; 113 }else{ 114 cout << "一の位が6:"; 115 for(int k = 0;k < number_6.size();k++){ 116 cout << number_6[k] << " "; 117 } 118 cout << endl; 119 } 120 121 if(number_7.size() == 0){ 122 cout << "一の位が7:なし" << endl; 123 }else{ 124 cout << "一の位が7:"; 125 for(int k = 0;k < number_7.size();k++){ 126 cout << number_7[k] << " "; 127 } 128 cout << endl; 129 } 130 131 if(number_8.size() == 0){ 132 cout << "一の位が8:なし" << endl; 133 }else{ 134 cout << "一の位が8:"; 135 for(int k = 0;k < number_8.size();k++){ 136 cout << number_8[k] << " "; 137 } 138 cout << endl; 139 } 140 141 if(number_9.size() == 0){ 142 cout << "一の位が9:なし" << endl; 143 }else{ 144 cout << "一の位が9:"; 145 for(int k = 0;k < number_9.size();k++){ 146 cout << number_9[k] << " "; 147 } 148 cout << endl; 149 } 150 break; //while文から抜ける 151 } 152 } 153} 154
試したこと
アルゴリズムとして1つ考えたのが、
①入力された数値を一旦配列1につっこむ
②-1が入力されたら1〜(配列1の数字の最大値)までfor文で配列1について調べていく。
③配列1に存在する数値だったら、一桁目を調べ(一桁目が0〜9配列)にそれぞれ追加していく。
④最後に(一桁目が0〜9配列)を全て表示
です。この方法だと、ソート関数を実装しなくても昇順にソートが可能だと思ったのですが、
入力が例えば1,10000,-1の様に数字に大きな差が生じる際に
計算量がかなり大きくなって無駄な気がしました。
リンク内容
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/21 01:42