2016-05-13 6 views
-1
void main() 
{ 
string s, Letter; 
cin >> s; 
int count[26], i, s_i; 
for (i = 0; i < 26; i++) 
    count[i] = 0; 
int n = sizeof(s); 
for (i = 0; i < n; i++) 
{ 
    s_i = s[i] - 'a'; 
    count[s_i]++; 
} 
for (i = 0; i < 26; i++) 
{ 
    if (count[i] != 0) 
    { 
     Letter = 'a' + i; 
     cout << Letter << " : " << count[i] << endl; 
    } 
} 
} 

これは、文字列の文字数を数えるプログラムです。 s_i = s [i] - 'a'の意味はなんですか?特に、なぜ ' - 'を使うのですか?手紙を数える他の方法はありますか?s_i = s [i] - 'a'の意味は何ですか?

+1

「a」 - 「a」が意味することを考えてください。それで、 '' b ' - ' a ''はどういう意味だろう。 –

+0

'a' + 1 = 'b'、 'a' + 2 = 'c' – tofutim

+2

s_i = s [i] - 'a'。これは、インデックスを0から取得するために使用されます。ここでは、単純に2文字のASCII値の違いを取っています。 s_i = s [i] - 'a'はs_i = 98(char 'b'のascii値) - 97(char 'a'のascii値)= 1 –

答えて

1

x - 'a'は、文字の値がxとアルファベットの最初の小文字の間の距離を示します。例えば


'B' - '' == 1
'C' - '' == 2

編集1:容易な方法
カウントのあなたの配列を宣言します256スロットあります。
文字を配列のインデックスとして使用します。
インデックスの値をインクリメントします。例えば

:減算を使用

unsigned int counts[256]; 
char c = 'b'; 
//... 
counts[c] += 1; 

x - 'a'は、より小さいサイズのアレイを可能にします。

編集2:よりポータブル溶液
よりポータブル溶液、符号化に依存しないものは、アルファベットを含む文字の配列を使用することです。文字を検索し、見つかった場合、インデックスは文字のオフセットです。

char c = 'j'; 
const std::string lowercase_alphabet = "abcdefghijklmnopqrstuvwxyz"; 
const std::string uppercase_alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
unsigned int counts[26] = {0}; 
//... 
unsigned int index = lowercase_alphabet.find(c); 
if (index != std::string::npos) 
{ 
    ++counts[index]; 
} 
else 
{ 
    index = uppercase_alphabet.find(c); 
    if (index != std::string::npos) 
    { 
    ++counts[index]; 
    } 
} 

同じ概念が文字配列の代わりに、std::stringタイプに適用することができます。

注:toupperとは、ローカライゼーションのオーバーヘッドを避けるために使用されません。注意すべき

+0

あなたは256スロットではなく26スロットを意味しますか? – CinCout

+0

['EBCDIC](http://www.csgnetwork.com/ascebcdic.html)のように、' c ' - ' a '== 2'などのペダンティックであることは保証されません。 C標準では、 'a' <'b' <'c' <... –

+0

@CinCout:いいえ、配列は256スロット、 'char'型の範囲です。この方法は減算を必要としないので簡単です。文字変数を配列のインデックスとして使用します。 –

0

少数のポイント:

  1. プログラムは、文字列が小文字のみ( - z)と他には何が含まれている前提としています。したがって、-'a'を行うことにより[a-z]

  2. から最大26 possible characterにすることができ、我々は単にs[i]から'a'のASCII値が減算されています。各文字には固有のascii valueがあります。コンパイル時に、コンパイラはASCIIの値'a'をチェックし、-'a'-48に置き換えます。 -'a'の代わりに-48を実行してもかまいませんが、この場合はASCII値の'a'を覚える必要はありません。

  3. [a-z]のすべてのアスキー値は連続しています。 a'sの値は48であり、z'sの値は57です。したがって、s[i]-'a'を実行することによって、ith varaibleaの違いは何ですか。

  4. 最後にLetter = 'a' + i;が元の文字を取得するために行われます。

関連する問題