C++で文章を携帯電話のテンキー入力シーケンスに変換する方法
このチュートリアルでは、与えられた文章(英字の文字列)を、旧式の携帯電話でその文字を入力する際に押すテンキーの数字列へと変換するC++プログラムについて解説します。
かつてのフィーチャーフォンでは、各数字キーに複数のアルファベットが割り当てられていました。たとえば「2」にはA・B・C、「3」にはD・E・Fが対応しており、目的の文字を入力するには対応するキーを必要な回数だけ押す仕組みでした。
キーとアルファベットの対応表
- 2 → A, B, C
- 3 → D, E, F
- 4 → G, H, I
- 5 → J, K, L
- 6 → M, N, O
- 7 → P, Q, R, S
- 8 → T, U, V
- 9 → W, X, Y, Z
スペースは「0」で表現します。今回のタスクは、アルファベットの文字列を受け取り、それを入力するための数字列を出力することです。
アルゴリズムの考え方
- A〜Zまでの各文字に対応するキー操作の数字列を、あらかじめ配列に格納しておきます。
- 入力文字列を先頭から1文字ずつ走査します。
- スペースであれば「0」を出力に追加し、それ以外の文字であれば「文字 − 'A'」で計算したインデックスを使って配列から対応する数字列を取り出し、結果に連結します。
サンプルコード
#include <bits/stdc++.h>
using namespace std;
// 数値シーケンスを計算する関数
string calc_sequence(string arr[], string input){
string output = "";
// 入力文字列の長さ
int n = input.length();
for (int i = 0; i < n; i++){
// スペースが含まれているか判定
if (input[i] == ' ')
output = output + "0";
else {
int position = input[i] - 'A';
output = output + arr[position];
}
}
return output;
}
int main(){
// 各文字に対応するシーケンスを配列に格納
string str[] = {
"2","22","222", // A B C
"3","33","333", // D E F
"4","44","444", // G H I
"5","55","555", // J K L
"6","66","666", // M N O
"7","77","777","7777",// P Q R S
"8","88","888", // T U V
"9","99","999","9999" // W X Y Z
};
string input = "TUTORIALSPOINT";
cout << calc_sequence(str, input);
return 0;
}
実行結果
8888666777444255577777666444668
コードの解説
配列 str には、AからZまでの26文字それぞれに対応するキー操作が順番に格納されています。たとえば「T」は8キーを4回押すため「8888」、「U」は「88」となります。
関数 calc_sequence では、入力文字列の各文字について、スペースなら「0」を、それ以外なら input[i] - 'A' で求めたインデックス位置にある数字列を結果文字列に追加していきます。最終的に完成した数字列を返却し、main関数で標準出力に表示しています。
この手法の計算量はO(n)(nは入力文字列の長さ)であり、非常に効率的です。事前に対応表を用意しておくことで、複雑な条件分岐を避けつつシンプルに実装できるのがポイントです。
-
C++の純粋関数とは?特徴とstrlen()・sqrt()を使った実装例をわかりやすく解説
純粋関数(Pure Function)とは、同じ引数の値に対して常に同じ結果を返す関数のことです。純粋関数は結果を返すだけにとどまり、引数の変更、入出力ストリームへのアクセス、出力生成といった余計な副作用(Side Effect)を一切持ちません。この性質により、純粋関数はプログラムの動作が予測しやすく、テストやデバッグ、並列処理においても扱いやすいという大きなメリットがあります。純粋関数と非純粋関数の例C++標準ライブラリには、純粋関数として振る舞うものが多数存在します。代表的な例としては以下のような関数が挙げられます。純粋関数の例: sin()、strlen()、sqrt()、max()、
-
C++でint型をstring型に変換する方法を解説
整数(int)を文字列(string)に変換したい場合、いくつかの方法があります。まずはC言語由来のitoa関数を使う方法から見ていきましょう。 itoa関数を使う方法 itoaは「integer to ASCII」の略で、整数値を文字列に変換するC言語の関数です。以下のように使用します。 例 #include<iostream> int main() { int a = 10; char *intStr = itoa(a); string str = string(intStr); cout << str; } 出力 このコードを実行す