2009-05-20 10 views
2

私はC#クラスを取っています。次のコードを理解する助けが必要です。値1 コードを理解するのに助けが必要です

10のスルー出力は、これらの評価値が選択された回数の頻度を表示して

コードは、調査への回答を表す配列を有しています。

次のコードは私の本ですが、基本的な例に変更しました。

int[] responses = { 3, 2, 5, 6, 3, 5 , 4, 5, 5, 5}; 
int[] frequency = new int[7]; 


for (int answer = 0; answer < responses.Length; answer++) 
    ++frequency[responses[answer]]; 

for (int rating = 1; rating < frequency.Length; rating++) 
    Console.WriteLine(rating + ", " + frequency[rating]); 

Console.Read(); 

はどのように行++frequency[responses[answer]];動作しますか?これを見ると、最初にループを経由してreponses[answer]を受け取ると、これはresponses[0]となりますが、それは正しいでしょうか?これは私が混乱するところです、++frequencyの部分は何ですか?

答えて

2

これは、配列内のその位置の周波数に1を加算します。

たとえば、位置3の周波数は、その行が実行された後に1ずつ増加します。

EDIT:つまり、answer = 0のときレスポンス[0] = 3となるので、frequency [3]に1が追加されます。

++は非常に簡単にコマンドの最後に置くことができます。換言すれば、

++frequency[responses[answer]]; 



frequency[responses[answer]]++; 
0

の使用など(この場合)と同じことであるそれは、[3]の周波数での値をインクリメントします。ここで、3は応答[回答]の戻り値です。同様に、次の反復は頻度[2]で値を増分する。

5
frequency[responses[answer]] = frequency[responses[answer]] + 1; 

編集:そういう風に書くのはかなり不透明だと思います。私は個人的な好みとして、多くのインデックスが存在する要素に対して単項演算(++ x、x ++など)を使用することは嫌いです。

+0

ブラケットがありません。 – mwjackson

+0

固定しました。ありがとうございます。 – CookieOfFortune

2

はそれを打破するのをしてみましょう:あなたが指摘するように、最初のパスの応答[解答]上に「3」

評価しますので、これは、周波数++のように見えます[3]

++インデックス3の配列の値を1だけインクリメントしています

十分に簡単ですか?

また、よりも前に適用すると、インクリメントがどのように実行されるのか(このコードの結果には影響しませんが)は効果があります。例えば

int n = 2; 
int j = ++n; 
int k = n++; 

jとkは何ですか?

jは3になり、kも3になります。これは、前に++を置くと、最初に評価されるからです。最後に置くと、残りの式の後で評価されます。

1

++ frequency []を「frequency = frequency + 1」と考えてください。

変数の前に++演算子がある場合は、文が実行される前にインクリメントが適用されます。その後++が来ると、文が実行され、変数がインクリメントされます。

前後のインクリメントがロジックに影響を与えないため、この場合は問題ありません。

「応答[回答]」は数値に評価されるため、そのコード行はその配列インデックスの頻度入力を増分しています。だから最初の答えは0なので、応答[回答]は3なので、周波数[3]ボックスは1だけ増分されています。次回は周波数[2]ボックスが増えます。 。

1

周波数はすべての要素が0(intの既定値)に初期化される配列です。行++frequency[responses[answer]]は、responses[answer]にある整数で指し示される周波数要素をインクリメントします。周波数の前に++を置くことによって、結果の値が返される前に配列要素がインクリメントされます。

read more about the ++ operator hereです。

0

C#の++演算子は、整数に適用されると1だけインクリメントされます。

あなたが見ている特定の線で、周波数は7要素の整数の配列です。あなたのコードで説明した方法では、このコードが6以上のレスポンス配列のどの値でも破損するように見えるので、混乱させるものです。

これは基本的に配列のどのインデックスでも増やしていますそれはアクセスしている。したがって、あなたの例では、レスポンス[0]は3になります。したがって、この行はfrequency [3]の値を見つけて1だけインクリメントします。整数配列はゼロですべての値で初期化されるので、 ]は1になります。その後、応答配列に別の3つがある場合、frequency [3]は再び増分されます(つまり、respond [4])。

私はこれがあなたを助けてくれることを願っています。

0

コードスニペットの目的は、各応答が「応答」配列に現れる回数を決定することにあるようです。例えば、あなたの設定例では、frequency [3]は5、frequency [5]は5でなければなりません。

したがって、あなたが求めている行は、現在の要素を応答配列から取り出し、特定の値が応答で観測されたことを示すために、周波数配列の値に1を加えます。

コードスニペット全体が実行されると、頻度配列にはレスポンス配列で0から7までの各要素が観測された回数が含まれます。

1

このような場合は、コードを歩いて書き換えると便利です。

場合答え= 0

  • ++周波数[応答[0]
  • ++周波数[3]以降の応答[0] = 3
  • 周波数は、現在{0、0のように見えます、0、1、0、0、0}

答え= 1つの

  • ++周波数[RESPO NSE [1]
  • ++周波数[2]以降の反応[1] = 2
  • 周波数が現在のように見える{0、0、1、1、0、0、0}

そしてそうです。

0

周波数配列を使用して、各応答が何回入力されたかをカウントしています。あなたはは、回答ごとにカウンタ持つことができ

int numberOfOnes = 0; 
int numberOfTwos = 0; 
// Etc... 

をしかし、それは醜いプログラミングと同じくらい簡単か、効率的ではないだろう。周波数配列を使用すると、if/else ifブロックまたはスイッチを使用せずにコードを読みやすくします。

その周波数配列に関するもう1つのこと。

int[] frequency = new int[7]; 

これは、それがその特定の応答のための初めてだったし、その後1かの何かでそれを初期化する場合は、それをインクリメントする代わりに見て始めることができます理由です、0に、アレイ内のすべての整数を初期化その性質。

あなたに先んじているすべての楽しいC#で幸運を祈る。

関連する問題