Kann diese if-else-Anweisung sauberer gemacht werden?

8

Ich versuche, eine C ++ - Zuweisung zu verbessern, um sie effizienter zu machen. Ich bin ein Anfänger mit der Sprache (und Programmierung im Allgemeinen auch), also verwende ich nur das, was ich bis jetzt weiß (wenn, sonst). Ich habe eine Funktion, die Scores in Level konvertiert, also alles unter 30 = 1, 30-49 = 2, 50-79 = 3 und so weiter ...

Hier mache ich es so:

%Vor%

Gibt es einen besseren Weg dies zu tun, da ich weiß, dass dies eine neue Zeile für jede einzelne Punktzahl erfordert, die ich habe.

    
B Smith 25.10.2010, 12:59
quelle

9 Antworten

13

Das hängt eher davon ab, was Sie unter Effizienz verstehen. Sie können die Grenzwerte für jede Ebene in einem Array beibehalten

%Vor%

... oder so ähnlich.

    
The Archetypal Paul 25.10.2010 13:07
quelle
5

Erstellen Sie eine Funktion, in der Sie die Punktzahl übergeben und die Ebene zurückgibt. Wenn es eine Menge von ihnen gibt, sollten Sie ein Array von Scores und Levels erstellen.

%Vor%

so etwas.

    
phkahler 25.10.2010 13:04
quelle
5

Zuerst den Code für die Berechnung der Ebene in eine separate Funktion ausschließen, sagen wir get_level:

%Vor%

Sie können get_level auf verschiedene Arten implementieren.

Wenn die Anzahl der Ebenen klein ist, können Sie die lineare Suche verwenden:

%Vor%

Oder, wenn Sie ein STL-Fan sind:

%Vor%

Wenn Sie viele Ebenen haben, kann die binäre Suche geeigneter sein:

%Vor%

Oder wenn Sie eine relativ kleine Anzahl von Ebenen haben, dann verwenden Sie die if-else-Kette ähnlich Ihrer ursprünglichen Version:

%Vor%

Beachten Sie, dass durch das Einfügen von Returns in separaten Zeilen Ihr Programm im Debugger leichter verfolgt werden kann.

    
vitaut 25.10.2010 13:43
quelle
4

Nein, in puncto Effizienz ist es bereits optimiert.

Zu einer anderen stilistischen Note. Ich würde empfehlen, die Bedingungen und Aussagen auf separate Zeilen zu setzen:

%Vor%

und wie die andere Antwort nahe legt, wäre ein weiteres stilistisches Plus, das übliche Verhalten in eine Funktion zu extrahieren

    
Kenny Cason 25.10.2010 13:05
quelle
2

Der absolut schnellste Weg:

Erstellen Sie ein Array mit 80 Werten, eines für jede mögliche Punktzahl. Füllen Sie das Array mit dem Level für jede mögliche Punktzahl.

Beispiel: int score_array [80] = {1,1,1,1, ...};

Mit dem folgenden Code erhalten Sie das Level für jedes Ergebnis:

level2 = score_array [score2];

Dies wird bis zu einer Maschinenanweisung kompiliert. Geht nicht viel schneller.

    
Jay 25.10.2010 15:26
quelle
2

Wenn der score einen "handhabbaren" Bereich hat, wie wäre es mit dem folgenden?

%Vor%

Die Motivation besteht darin, bedingten Code ( if , else s) auf Kosten einer vorbelegten Tabelle zu vermeiden. Vielleicht ist es zu viel für 3 Level, aber kann helfen, wenn die Anzahl der Level steigt.

    
Arun 26.10.2010 04:14
quelle
1
%Vor%

Prost:)

    
theReverseFlick 26.10.2010 10:10
quelle
1

Sie können Modulo und eine Hash-Tabelle verwenden, um eine gewisse Eleganz zu erreichen. Pseudocode:

%Vor%     
D_K 26.10.2010 20:19
quelle
1

Wenn Sie weniger Ebenen als Finger an Ihren Händen haben, sollten Sie Pauls Vorschlag. Wenn die Anzahl der Ebenen jedoch größer ist, können Sie die binäre Suche verwenden, wenn Ihre Schwellenwerte ziemlich gleichmäßig sind (und streng zunehmen). Dann können Sie der logarithmischen Laufzeit nahe kommen (ich meine, Sie waren , die nach Effizienz fragen).

Dies ist ein guter Kompromiss zwischen dem lupenreinen Vorschlag und der linearen Suche, aber es zahlt sich nur aus, wenn Sie viele Ebenen haben.

Oh, übrigens, wenn es ein Muster gibt, wie die Schwellenwerte gewählt werden, sollten Sie das verwenden, anstatt nach der richtigen Ebene zu suchen.

    
bitmask 26.10.2010 21:00
quelle

Tags und Links