staging.inyokaproject.org

[C++/Qt] Kalkulator - Einheiten umrechnen

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

LusH9600

Anmeldungsdatum:
5. September 2011

Beiträge: Zähle...

Kalkulator rechnet verschiedenste Einheiten zuverlässig um.

Kalkulator wird in C++ geschrieben ( GUI in Qt ). Ich bin auf der Suche nach C++-Entwicklern, die mir helfen wollen.

Version 1.4.1 hat circa 9000 Zeilen Code.

Funktionen der Version 1.4.1 im Überblick:

- Temperatur - Länge - Masse - Kraft - Beschleunigung - Winkelbeschleunigung - Geschwindigkeit - Leistung - Zeit

Installation:

Kalkulator liegt als SourceCode und als Debian-Paket auf dem unten genannten Link vor.

Der folgende Link verweist auf SourceForge, wo das Projekt bereits besteht: http://www.sourceforge.net/projects/kalculator

Ich freue mich natürlich auf jederlei Feedback.

BodomBeachTerror

Anmeldungsdatum:
24. März 2008

Beiträge: Zähle...

9000 Zeilen Code? Da hast du glaube ich etwas falsch gemacht!

LusH9600

(Themenstarter)

Anmeldungsdatum:
5. September 2011

Beiträge: 6

Nein habe ich nicht wieso ?

Allein die Auswahl "Kraft" bringt 9 Einheiten, die individuell um zurechnen sind, das bedeutet, dass jede genauere Auswahl beim betätigen eines bestimmten SIGNALs mit einer if/else if Abfrage erkannt, und vollständig umgerechnet werden muss.

Systemkritiker

Anmeldungsdatum:
2. Januar 2011

Beiträge: Zähle...

Naja, leicht verbessern könnte man das schon. Beispiel:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
             if ( ui->comboBox->currentText() == "mm/s^2")
             {
                 ui->label_4->setText("mm/s^2");
             }

             else  if ( ui->comboBox->currentText() == "cm/s^2")
             {
                 ui->label_4->setText("cm/s^2");
             }

             else  if ( ui->comboBox->currentText() == "m/s^2")
             {
                 ui->label_4->setText("m/s^2");
             }

             else  if ( ui->comboBox->currentText() == "km/s^2")
             {
                 ui->label_4->setText("km/s^2");
             }

             else  if ( ui->comboBox->currentText() == "ft/s^2")
             {
                 ui->label_4->setText("ft/s^2");
             }

             else  if ( ui->comboBox->currentText() == "in/s^2")
             {
                 ui->label_4->setText("in/s^2");
             }

             else  if ( ui->comboBox->currentText() == "ya/s^2")
             {
                 ui->label_4->setText("ya/s^2");
             }

             else  if ( ui->comboBox->currentText() == "meilen/s^2")
             {
                 ui->label_4->setText("meilen/s^2");
             }

             else  if ( ui->comboBox->currentText() == "Erdbeschleunigung [g]")
             {
                 ui->label_4->setText("Erdbeschleunigung [g]");
             }

             else  if ( ui->comboBox->currentText() == "Galilei [gal]")
             {
                 ui->label_4->setText("Galilei [gal]");
             }

Warum nicht so:

1
ui->label_4->setText(ui->comboBox->currentText());

Um wirklich drastische Zeilenreduktionen einzufahren, würde ich mir einmal die Überladungen von QComboBox::addItem anschauen. Wenn du für jeden Eintrag die Konstante hättest, die man braucht, um auf die SI-Einheit zurückzukommen und was ihre Abkürzung ist, hättest du alle Umrechnungen auf 10 Zeilen reduziert.

Beste Grüsse
Systemkritiker

BodomBeachTerror

Anmeldungsdatum:
24. März 2008

Beiträge: 788

Wie mein Vorposter schon sagte, du erzeugst Code Redundanz. Du hast viele Code Stücke die sehr ähnlich sind, nur ein sehr kleiner Teil ist unterschiedlich wie zB eine Konstante. Solche Stücke gilt es zu vermeiden und zusammenzufassen. So was ist teils recht schwierig, und vor allem bei einem Umrechner ist das ganze nicht ganz so trivial denke ich.

Da musst du dir eben etwas praktisches ausdenken. So ist der Code wirklich unüberschaubar und nicht wartungsfreundlich.

Wenn du ein wenig Java kannst, kannst du die vll. mal NumericChameleon ansehen, die unterstützen weit mehr Einheiten als du und haben trotzdem deutlich weniger Code. Jedoch gehen die einen anderen Weg. Die speichern die Umrechnungsfaktoren in Dateien und lesen diese zur Laufzeit ein, somit brauchen die nur eine Klasse zur Verwaltung der meisten Einheiten. Eigentlich gar nicht schlecht.

VincentVale

Avatar von VincentVale

Anmeldungsdatum:
11. Juni 2009

Beiträge: 317

Probiere es doch mal mit einem "switch case"

switch(Variable)
{
 case 10:
 
 case 20:
 
 case 30:
 
 case 40:
 
} 

in welchem du die Werte für bestimmte Variablen setzt. So kannst du die ganzen "else if" Bereiche Rausschmeißen und hast am Ende vielleicht nur eine Rechnung.

Allein schon wenn ich in beschleunigung.cpp schaue

double mm = ui->lineEdit->text().toDouble(&ok);

in jedem else if Statement findet sich diese Variablendeklaration. Meiner Meinung nach ein gutes Beispiel für die Coderedundanz, definiere diese doch vor der Abfrage.

Und eine letzte Frage noch, warum machst du so viele Einzelrechnungen? Ich meine von der Grundeinheit zu KiloGrundeinheit sind doch immer / 1000 oder Grundeinheit zu MegaGrundeinheit ( Gott klingt das dämlich xD ) sollten auch /1000 /1000 sein. Solche wiederkehrenden Rechnungen kann man doch super in Funktionen auslagern.

Hoffe meine Gedankengänge sind nicht so Falsch. Bin vor 3 Jahren auf Java umgestiegen und manchmal war C++ ja etwas eigen, aber ein logisch sollte man so noch einiges Einsparen können an Code. 😀

Kurdder

Anmeldungsdatum:
12. April 2009

Beiträge: 85

Also wenn du möchtest, kann ich dir durchaus meine Hilfe anbieten, würde mich freuen, mich mit einzubringen oder ggf. auch erstmal die Tipps der anderen Umsetzen. Welche sonstigen Fortschritte für das Programm hast du dir denn evtl schon Überlegt?

LusH9600

(Themenstarter)

Anmeldungsdatum:
5. September 2011

Beiträge: 6

Sorry für die späte Antwort, hatte wenig Zeit...

Also zuKurdder schrieb:

Also wenn du möchtest, kann ich dir durchaus meine Hilfe anbieten, würde mich freuen, mich mit einzubringen oder ggf. auch erstmal die Tipps der anderen Umsetzen. Welche sonstigen Fortschritte für das Programm hast du dir denn evtl schon Überlegt?

Zuerst will ich momentan noch Funktionen hinzufügen, GUI übersichtlicher gestalten und Projekt neu strukturieren.

Würde mich natürlich über deine Hilfe freuen 😀

An alle anderen:

Danke für die vielen Vorschläge, ich denke da war sehr vieles Brauchbares dabei 😉

Antworten |