簡體   English   中英

需要幫助理解代碼

[英]Need help understanding code

我正在學習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]];如何++frequency[responses[answer]]; 工作? 在看這個時,如果我第一次通過循環接受reponses[answer] ,這將代表responses[0] ,這將是3,正確嗎? 這是我感到困惑的地方,這條線的++frequency部分是做什么的?

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

編輯:我認為這樣寫是非常不清楚的。 作為個人偏好,我不喜歡對存在大量索引的元素使用一元操作(++ x,x ++等)。

它在陣列中該位置的頻率上加一。

例如,在該行執行后,位置3(來自您的示例)的頻率將增加1。

編輯:因此,更詳細地說,當answer = 0時,響應[0] = 3,所以頻率[3]會添加一個。

++也可以很容易地在命令的末尾。 換一種說法,

++frequency[responses[answer]];


和使用一樣(在這種情況下)

frequency[responses[answer]]++;

讓我們分解一下:正如你所指出的那樣,在第一次通過時,回答[answer]將評估為“3”

所以這看起來像++頻率[3]

++將索引3處的數組值遞增1

夠簡單嗎?

我還應該指出,在數組之前而不是之后應用++會影響遞增的執行方式(盡管它不會影響此代碼的結果)。

例如:

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

什么是j和k?

j將是3,k也將是3.這是因為如果你之前放置++,它首先評估它。 如果將它放在最后,它會在表達式的其余部分之后對其進行求值。

如果有幫助,可以將++ frequency []視為“frequency = frequency + 1”。

如果++運算符位於變量之前,則在執行語句之前應用增量。 如果后來出現++,則執行該語句,然后遞增變量。

在這種情況下,無關緊要,因為在之前或之后遞增不會影響邏輯。

由於“響應[回答]”評估為一個數字,該行代碼正在遞增該數組索引處的頻率條目。 所以第一次通過,答案是0,所以響應[答案]是3,所以頻率[3]框增加1.下一次,頻率[2]框增加......等等等等

frequency是一個數組,其中所有元素都初始化為0(int的默認值)。 ++frequency[responses[answer]]將增加在responses[answer]找到的整數指出的頻率元素。 通過將++放在頻率前面,數組元素將在返回結果值之前遞增。

您可以在此處閱讀有關++運算符的更多信息

在這種情況下,在您走過時重寫代碼通常很有用。

當答案= 0時

  • ++頻率[響應[0]]
  • ++頻率[3],因為響應[0] = 3
  • 頻率現在看起來像{0,0,0,1,0,0,0}

當答案= 1時

  • ++頻率[響應[1]]
  • ++頻率[2],因為響應[1] = 2
  • 頻率現在看起來像{0,0,1,1,0,0,0}

等等。

它意味着在頻率[3]處遞增值。 其中3是回復的結果[回答]。 類似地,下一次迭代將在頻率[2]處遞增值。

C#中的++運算符應用於整數時會將其遞增1。

您正在查看的特定行,frequency是一個包含7個元素的整數數組。 這有點令人困惑,因為你在代碼中解釋它的方式,看起來這個代碼會破壞6以上的響應數組中的任何值。

拋開這個問題,基本上它正在遞增它正在訪問的數組的哪個索引。 因此在您的示例中,響應[0]將為3.因此,此行將找到頻率[3]的值並將其遞增1.由於整數數組初始化時所有值均為零,因此在第一次迭代后,頻率[3]然后如果你的響應數組中有另外3個,則頻率[3]將再次遞增(即響應[4])。

我希望這可以幫助你。

代碼段的目標似乎是確定每個響應出現在“響應”數組中的次數。 因此,對於您的示例集,頻率[3]應為5,頻率[5]應為5,等等。

因此,您詢問的行從響應數組中獲取當前元素,並將頻率數組中的關聯值增加1,以指示已在響應中觀察到特定值。

整個代碼片段執行后,頻率數組包含在響應數組中觀察到0到7的每個元素的次數。

它使用頻率數組來計算每個響應輸入的次數。 可以為每個答案都有一個計數器:

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

但這將是丑陋的編程,而不是那么容易或有效。 使用頻率數組允許您不使用if / else if塊或開關,使代碼更易於閱讀。

關於頻率數組的另一件事。

int[] frequency = new int[7]; 

這會將數組中的所有整數初始化為0,這就是為什么你可以通過遞增它來開始,而不是看它是否是第一次進行特定響應,然后用1或類似的東西初始化它。

祝你們擁有所有有趣的C#,祝你好運。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM