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

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

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

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

Q&A

解決済

2回答

6660閲覧

キーボードから整数の値を入力すると、その値が漢数字で出力されるプログラム

sattsun

総合スコア25

C++

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

0グッド

0クリップ

投稿2020/04/09 08:47

【問題】
キーボードから整数の値を入力すると、その値が漢数字で出力されるプログラムを作りなさい。
このとき、用いられるのは、1から9に対応するのが、一から九までの漢字で、ゼロは、〇と表示するようにしなさい。
また、この数字と漢字の対応は、mapを用いて作りなさい。また、結果を出力する際には、3桁ごとに「,」(コンマ)を出力すること。
※ヒント:入力は、数値としてではなく、文字列として受付、その中身が妥当かどうか調べるとよい。

【期待される実行結果】(整数の値が入力された場合)
整数の値を入力してください:1198000 ← コンソールから整数の値を入力
変換結果:一,一九八,○○○

【期待される実行結果】(整数以外の値が入力された場合)
整数の値を入力してください:hello
整数の値を入力してください。

【質問内容】
1.整数以外を入力すると、「整数の値を入力してください。」だけ表示されるようにしたいです。
2.コンマの出力方法が分かりませんでした。教えてほしいです。

【作成したコード】

#include <iostream> #include <string> #include <map> using namespace std; int main() { map <string, string> score; // map のデータ構造を用意する。 cout << "整数の値を入力してください:" ; string names[] = { "0","1","2","3","4","5","6","7","8","9" }; score[names[0]] = "〇"; score[names[1]] = "一"; score[names[2]] = "二"; score[names[3]] = "三"; score[names[4]] = "四"; score[names[5]] = "五"; score[names[6]] = "六"; score[names[7]] = "七"; score[names[8]] = "八"; score[names[9]] = "九"; char num[20]; int i = 0,j = 0; cin >> num; cout << "変換結果:"; while (num[i] != '\0') { names[i] = num[i]; if (names[i] == "0") { cout << score[names[i]]; } else if (names[i] == "1") { cout << score[names[i]]; } else if (names[i] == "2") { cout << score[names[i]]; } else if (names[i] == "3") { cout << score[names[i]]; } else if (names[i] == "4") { cout << score[names[i]]; } else if (names[i] == "5") { cout << score[names[i]]; } else if (names[i] == "6") { cout << score[names[i]]; } else if (names[i] == "7") { cout << score[names[i]]; } else if (names[i] == "8") { cout << score[names[i]]; } else if (names[i] == "9") { cout << score[names[i]]; } else { cout << "整数の値を入力してください。" << endl; return 0; } i++; } return 0; }

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

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

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

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

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

guest

回答2

0

ベストアンサー

C++

1#include <iostream> 2#include <string> 3using namespace std; 4 5int main() 6{ 7 static const char *kansuji[] = { 8 "〇", "一", "二", "三", "四", "五", "六", "七", "八", "九" 9 }; 10 cout << "整数の値を入力してください:"; 11 string num; cin >> num; 12 13 for (char c : num) 14 if (c < '0' || c > '9') { 15 cout << "整数の値を入力してください。\n"; 16 return 1; 17 } 18 19 int k = (num.size() + 2) % 3 + 2; 20 for (char c : num) { 21 if (--k == 0) { 22 k = 3; 23 cout << ","; 24 } 25 cout << kansuji[c - '0']; 26 } 27 cout << endl; 28}

多分、int k = (num.size() + 2) % 3 + 2; はトリッキーでしょう。

for (char c : num) の代わりに for (int i = 0; i < num.size(); i++)
と書いた場合は、c を num[i] として下さい。

sattsun さん、理解できてもできなくても何かコメントをお願いします。

追記
k の値について説明します。

8桁の数字 45678901があったとします。
45,678,901 のようにコンマを入れます。
各数字に下位の桁から1,2,3,1,2,3...という番号を付けてみましょう。
45,678,901
21 321 321 これが各数字出力後の k の値です。
各数字を出力する前に、k を 1 減らして、それが 0 なら
「,」を先に出力します。
例えば、6 を出力するとき、直前の k の値が 1 ですから、1減らして 0なので、
「,」を出力します。そして、自分の 6 に対しては k は 3 にしています。
これが if (--k == 0) { k = 3; cout << c; } です。

問題は k の初期値です。
最初の 4 を出力する前の k の値は 3 でないといけません。
これは、桁数の 8 を 3 で割った余りより 1 大きい値です。
int k = num.size() % 3 + 1; でうまく行きそうです。

数字が 7桁の 4567890 だった場合、
4,567,890
1 321 321
最初の 4 を出力する前の k は 2 でないといけません。
int k = num.size() % 3 + 1; でうまく行きます。

数字が 6桁の 456789 だった場合、
456,789
321 321
最初の 4 を出力する前の k は
int k = num.size() % 3 + 1; だと 1 になります。
ところが 1 だと、--k で 0 になるので、コンマを出力して
,456,789
になってしまいます。
k の初期値を 4 にしておけば、この問題を解決できます。
--k でも 0 にならず、3 になってくれます。

num.size() % 3 は 0, 1, 2 ですが、それを 1, 2, 3 ではなく
4, 2, 3 にしないといけないのです。そして、それは
int k = (num.size() + 2) % 3 + 2; で実現できます。

投稿2020/04/10 05:03

編集2020/04/12 12:54
kazuma-s

総合スコア8224

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

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

sattsun

2020/04/12 00:51

すみません、int k = (num.size() + 2) % 3 + 2;とif (--k == 0) { k = 3; cout << ","; } の箇所が分かりませんでした。。。 もう少し詳しく解説は欲しいです。
SHOMI

2020/04/12 11:14

int k = (num.size() + 2) % 3 + 2; は初回の3桁区切りのカンマが先頭から文字目になるか計算しているだけですよ。 3の倍数桁なら4、3の倍数+1桁なら2、3の倍数+2桁なら3。 具体的な桁数を代入して計算してみればわかると思います。
sattsun

2020/04/13 13:58

あ、分かりました。 ありがとうございました。
guest

0

まず基本的なことですが、C++規格では、文字がエンコードされたときに半角数字の0-9は連続することが定められています。

なので、'0' <= c && c <= '9'のような条件で数値判定ができます(正の整数だけでいいなら

この条件に当てはまったあとも

cpp

1static const std::string cvt[] = { "〇", "一", "二", "三", "四", "五", "六", "七", "八", "九" }; 2 3cvt[c - '0']

のようにして変換できます。

さいごにカンマについては、いきなり標準出力しないで、出力用のstd::string型の変数に変換結果を徐々に付け加えていって、最後に出力するときに、配列の要素数より桁数が確定するのであとはループの中で条件文書けばいいですね。

投稿2020/04/09 09:10

yumetodo

総合スコア5850

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問