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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

3228閲覧

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

takuan1205

総合スコア6

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/04/21 00:19

前提・実現したいこと

現在、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の様に数字に大きな差が生じる際に
計算量がかなり大きくなって無駄な気がしました。
リンク内容

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

C++

1#include <iostream> 2#include <vector> 3 4using namespace std; 5 6int main() { 7 vector<int> number[10]; 8 9 int a; 10 11 while (true) { 12 cout << "正の整数を入力:"; 13 cin >> a; 14 15 //一の位を調べそれぞれのリストに追加 16 if (a > 0) { 17 number[a % 10].push_back(a); 18 //-1が入力された際にそれぞれのリストを表示 19 //リストに数字が入っていなければなしと表示する 20 } 21 else { 22 for (int i = 0; i < 10; ++i) 23 { 24 cout << "一の位が" << i << ":"; 25 if (number[i].empty()) { 26 cout << "なし" << endl; 27 } 28 else { 29 for (int n : number[i]) 30 { 31 cout << n << " "; 32 } 33 cout << endl; 34 } 35 } 36 break; //while文から抜ける 37 } 38 } 39}

これを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 00:39

編集2020/04/21 01:22
SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takuan1205

2020/04/21 01:42

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

0

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

  • number[a%10].push_back(a);

の1行で済む

  • 結果出力も10回のループ回せばいい

投稿2020/04/21 00:28

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問