2009-05-20 1 views
2

Ich nehme eine C# -Klasse und ich brauche Hilfe, den folgenden Code zu verstehen.Brauchen Sie Hilfe, Code zu verstehen

Der Code hat eine Anordnung, die Antworten auf eine Befragung, mit Werten 1 bis 10.

Der Ausgang zeigt diese Bewertungen und die Häufigkeit, wie oft ein Wert ausgewählt wurde, darstellt.

Der folgende Code stammt aus meinem Buch, aber ich habe es zu einem einfachen Beispiel geändert.

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(); 

Wie funktioniert die Linie ++frequency[responses[answer]]; Arbeit? Wenn ich das sehe, wenn ich reponses[answer] das erste Mal durch die Schleife nehme, würde dies responses[0] darstellen, was eine 3 wäre, richtig? Dies ist, wo ich verwirrt bin, was macht der ++frequency Teil dieser Linie?

Antwort

2

Es fügt eins zu der Frequenz an dieser Stelle im Array hinzu.

Zum Beispiel wird die Frequenz an Position 3 (von Ihrem Beispiel) um eins erhöht, nachdem diese Zeile ausgeführt wurde.

EDIT: Also, genauer gesagt, wenn Antwort = 0, Antworten [0] = 3, so wird Frequenz [3] hinzugefügt.

Das ++ könnte sehr leicht auch am Ende des Befehls sein. Mit anderen Worten:

++frequency[responses[answer]]; 


dasselbe ist (in diesem Fall) als

frequency[responses[answer]]++; 
0

Verwendung Es bedeutet Schritt den Wert bei der Frequenz [3]. Wobei 3 das Ergebnis der Antworten ist [Antwort]. In ähnlicher Weise würde die nächste Iteration den Wert bei der Frequenz [2] erhöhen.

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

EDIT: Ich denke, es ist ziemlich unklar, es so zu schreiben. Als persönliche Präferenz mag ich es nicht, unäre Operationen (++ x, x ++, etc.) für Elemente zu verwenden, die viele Indizes enthalten.

+0

Fehlende Klammer. – mwjackson

+0

reparierte es, danke. – CookieOfFortune

2

Lassen Sie uns es brechen: Wie Sie weisen darauf hin, auf den ersten Pass Antworten [Antwort] wertet auf „3“

Also diese dann wie ++ Frequenz sieht [3]

Die ++ erhöht den Wert des Arrays bei Index 3 um 1

Einfach genug?

Ich sollte auch darauf hinweisen, dass die Anwendung der ++ vor das Array, anstatt, nachdem es bewirkt, wie die Inkrementierung ausgeführt wird (obwohl es die Ergebnisse dieses Codes nicht beeinflusst).

Zum Beispiel:

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

Was j und k?

j wird 3 sein, und k wird auch 3 sein. Das liegt daran, dass wenn Sie ++ vorher setzen, es zuerst auswertet.Wenn Sie es am Ende platzieren, wird es nach dem Rest des Ausdrucks ausgewertet.

1

Wenn es hilft, denke an ++ Frequenz [] als "Frequenz = Frequenz + 1".

Wenn der Operator ++ vor der Variablen steht, wird das Inkrement angewendet, bevor die Anweisung ausgeführt wird. Wenn das ++ danach kommt, wird die Anweisung ausgeführt und dann wird die Variable inkrementiert.

In diesem Fall spielt es keine Rolle, da das Inkrementieren vor oder nach der Logik keinen Einfluss hat.

Da "Antworten [Antwort]" zu einer Zahl ausgewertet wird, erhöht diese Codezeile den Häufigkeitseintrag an diesem Arrayindex. Also das erste Mal durch, ist die Antwort 0, also Antworten [Antwort] ist 3, so wird die Frequenz [3] Box um 1 inkrementiert. Das nächste Mal durch, wird die Frequenz [2] Box inkrementiert ... etc. etc usw.

1

frequency ist ein Array, bei dem alle Elemente auf 0 initialisiert werden (der Standardwert für einen int). Die Zeile ++frequency[responses[answer]] inkrementiert das Frequenzelement, auf das die Ganzzahl responses[answer] verweist. Wenn Sie ++ vor die Häufigkeit setzen, wird das Array-Element inkrementiert, bevor der resultierende Wert zurückgegeben wird.

Sie können read more about the ++ operator here.

0

Der Operator ++ in C# wird bei einer Integer-Operation um eins erhöht.

Die spezifische Linie, die Sie betrachten, Häufigkeit ist ein Array von ganzen Zahlen mit 7 Elementen. Das ist irgendwie verwirrend, weil es so aussieht, wie Sie es in Ihrem Code erklärt haben, dass dieser Code mit jedem Wert im Antwort-Array über 6 bricht.

Dieses Problem beiseite, im Grunde erhöht es den Index des Arrays es greift zu. In Ihrem Beispiel wäre also die Antwort [0] 3. Also würde diese Zeile den Wert von frequency [3] finden und um 1 erhöhen. Da Integer-Arrays mit allen Werten bei Null initialisiert werden, wird nach der ersten Iteration die Häufigkeit [3 ] wäre 1. Wenn es später noch 3 in Ihrem Antwort-Array gäbe, würde die Frequenz [3] wieder inkrementiert werden (dh Antworten [4]).

Ich hoffe, das hilft Ihnen.

0

Das Ziel des Code-Snippets scheint zu sein, die Häufigkeit zu bestimmen, mit der jede Antwort im Array 'Antworten' erscheint. Für Ihr Beispiel sollte Frequenz [3] also 5, Frequenz [5] 5 usw. sein.

Die Zeile, nach der Sie fragen, nimmt das aktuelle Element aus dem Array Antworten und inkrementiert das zugehörige Element Wert in der Frequenzmatrix um 1, um anzuzeigen, dass der bestimmte Wert in Antworten beobachtet wurde.

Sobald das gesamte Codefragment ausgeführt wird, enthält das Häufigkeitsarray die Anzahl der Male, die jedes Element von 0 bis 7 im Antwortarray beobachtet wurde.

1

In solchen Fällen ist es oft nützlich, den Code neu zu schreiben, während Sie ihn gehen.

Wenn Antwort = 0

  • ++ Frequenz [Antworten [0]]
  • ++ Frequenz [3], da Antworten [0] = 3
  • Frequenz sieht nun wie {0, 0 , 0, 1, 0, 0, 0}

Wenn Antwort = 1

  • ++ Frequenz [respo NSEs [1]]
  • ++ Frequenz [2], da Antworten [1] = 2
  • Frequenz sieht nun wie {0, 0, 1, 1, 0, 0, 0}

Und bald.

0

Es verwendet das Frequenzarray, um zu zählen, wie oft jede Antwort eingegeben wurde. Sie könnte hat einen Zähler für jede Antwort:

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

Aber das wäre hässlich Programmierung sein und nicht so einfach oder effizient. Wenn Sie das frequency-Array verwenden, können Sie keinen if/else if-Block oder einen Schalter verwenden und Ihren Code leichter lesbar machen.

Eine andere Sache über diese Frequenz-Array.

int[] frequency = new int[7]; 

Dies initialisiert alle ganzen Zahlen im Array 0, das ist, warum Sie gerade es statt zu sehen beginnen kann durch Erhöhen, wenn es das erste Mal für die jeweilige Reaktion und dann war es mit 1 oder etwas von der Initialisierung diese Natur.

Viel Glück mit all dem Spaß C# Sie vor Ihnen haben.

Verwandte Themen