3

だから私は、1つのステップがそれぞれのユニークな文字の頻度を数えることを含むという問題の解決策を探していました。どこに行っても同じ配列インクリメンターがあります。私はこのフォームを見たことがなく、完全には理解していません。このフォーマットのサポートドキュメントを見つけようとしましたが、実際に何をするのか理解できません。動作させることができます。ただし、各ピースが何を表しているのかわかりません。

私が理解している問題を抱えているPeiceは、ここの括弧内で何が起こっているかです。

frequency[toupper(new_letter) - 'A']++;

周波数は配列です

例:文字が配列に出現する回数を数えますか?

アルゴリズム:

  • ファイルを開く/手紙を読む。
  • 新しい文字の文字配列を検索します。
  • 新しい文字が存在する場合:その文字の頻度スロットをインクリメントします:frequency [toupper(new_letter)-'A'] ++; 新しい文字が欠落している場合は、配列に追加し、頻度を1に設定します。
  • すべての文字が処理されたら、頻度配列を出力します。`

    cout <<'A'+インデックス<<":"<<頻度[インデックス]<< endl;

どんな助けでも理解することは大いに感謝されるでしょう。

4

3 に答える 3

4

これは単なる配列です。おそらく、あなたを混乱させる部分は、toupper(new_letter) - 'A'ここで行うことです。文字を大文字に変換してから、結果のASCIIコードからのASCIIコードを減算し'A'ます。したがって、結果は範囲内の数値になります[0-25]。その後、これを追加することにより'A'、元の大文字を取得します。アルゴリズムの残りの部分に関しては、これは単にソートを数えるようなものです。

于 2013-03-10T15:06:11.237 に答える
2

残念ながら、このソリューションは完全に移植可能ではありません。実行文字セットでは、大文字のAZが連続した値であると想定しています。つまり、に'A' + 1等しい'B'、に'B' + 1等しい、などと想定'C'します。これは必ずしも真実ではありませんが、通常は真実です。

toupper渡された文字を大文字に変換するだけです。'A'上記の仮定を前提として、これから差し引く'A'と、与えられた文字からの「距離」が計算されます。つまり、の場合、結果new_letter'A'0になります。の場合'b'、結果は1になります。ご覧のとおり、を使用する理由は、大文字か小文字toupperかを独立させるためです。new_letter

この結果(基本的にアルファベットの文字の位置)は、配列にアクセスするために使用されます。frequencyが26intの配列(文字ごとに1つ)の場合、対応するにアクセスしますint。その後、増分intされます。

于 2013-03-10T15:09:28.670 に答える
1

array(例)の場合int frequency[26];、配列には追加しません。すでに存在していますが、値はゼロです。

++演算子はの省略形なadd one to the thingので、

frequency[toupper(new_letter) - 'A']++;

と同じです:

frequency[toupper(new_letter) - 'A'] = frequency[toupper(new_letter) - 'A'] + 1;

明らかに、ショートハンドバージョンは、両側で同じであることなどを注意深くチェックする必要がある繰り返しがはるかに少ないため、はるかに読みやすくなっています。

インデックスはtoupper(new_letter) - 'A'-これは最初に任意の文字を大文字にすることで機能します-したがって、それがaor A、'c'、またはCなどであるかどうかは関係なく、次にアルファベットの最初の文字の値を減算します'A'。これは、の場合new_letter'A'インデックスがゼロであることを意味します。インデックス7などを使用する場合。[これnew_letter'G'、すべての文字が連続していることを前提としていますが、これは絶対に確実ではありません。確かに、英語以外の言語である、たとえばä、ǹ、Ë、またはêについて話す場合は、言語の一部としてなど、それらは間違いなくAZをフォローしていません]

1つのテキストの文字数を手作業で数える場合は、紙の端に沿ってすべての文字AZをリストし、テキストでそれらを読むときに各文字の横にドットを置くことができます。次に、ドットの数を数えます。これは同じ種類のことを行いますが、進行中に各カウントが実行され続ける点が異なります。

于 2013-03-10T15:12:07.357 に答える