0

これを行うためのC++での推奨される最良の方法は何ですか:アルファベットの文字を7つのグループに分割して、後でcharがグループ1、3、または4などにあるかどうかを尋ねることができます...?もちろん、これを自分で行う方法はいくつか考えられますが、このようなことを行うときは、標準を知り、それを守りたいと思います。

0
AEIOUHWY
1
BFPV
2
CGJKQSXZ
3
DT
4
MN
5
L

6
R
4

3 に答える 3

2

C++ でこれを行う最善の方法: アルファベットの文字を 7 つのグループに分割して、後で char がグループ 1、3、または 4 などにあるかどうかを確認できるようにします... ?

「分割」自体を行う最も効率的な方法は、文字/文字から数値までの配列を持つことです。

//                      A  B  C  D  E  F  G  H...
const char lookup[] = { 0, 1, 2, 3, 0, 1, 2, 0...

switch/case ステートメントのもう 1 つの妥当な選択です。コンパイラは、配列の実装を作成するか、他のアプローチを作成するかを決定できます。

これらの 1 ~ 6 の値をどのように使用する予定かは不明ですenumが、適切なエンコーディングの選択肢のようです。これには、コード全体に散在する「魔法の」数値定数よりも人間が読みやすく、コンパイラでチェックされる一方で、これらの特定の数値 (たとえば、< 比較、ストリーミングなど) の使用を引き続きサポートするという利点があります。任意の幅の定数 int も正常に機能する可能性がありますが、統一型はありません。

于 2012-11-12T05:46:18.330 に答える
1

関連する少量のデータを考えると、おそらくビット単位のルックアップ、つまり値を設定することになります。

cat1 = 1;
cat2 = 2;
cat3 = 4;
cat4 = 8;
cat5 = 16;
cat6 = 32;
cat7 = 64;

次に、アルファベットの各文字に 1 つずつ、26 個の値の配列を作成し、それぞれにその文字のカテゴリの値を含めます。手紙を分類したいときは、categories[ch-'A']それを見つけるだけです。

于 2012-11-12T05:47:02.970 に答える
1

ルックアップ テーブルを作成します。

int lookup[26] = { 0, 1, 2, 3, 0, 1, 2, 0 .... whatever };

inline int getgroup(char c)
{
    return lookup[tolower(c) - 'a'];
}

このように呼びます

char myc = 'M';
int grp = lookup(myc);

簡潔にするために、エラー チェックは省略されています。

もちろん、7 つのグループが表すものによっては、0、1、2 などを使用する代わりに列挙型を作成できます。

于 2012-11-12T05:47:51.543 に答える