Autor Beitrag
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Mi 02.11.11 09:54 
Moin,

ich hätte gern mal ein paar Denkstöße. Vielleicht überseh ich eine einfache Möglichkeit.

Ich habe eine Tabelle mit Einheiten und eine Tabelle mit Umrechnungfaktoren.
In den Faktoren steht natürlich drin, wie ich eine Einheit in eine andere umrechnet. Also nur 3 Felder:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
Einheit von | Faktor | Einheit nach
------------|--------|-------------
Meter       | 1000   | Kilometer
cm          |  100   | Meter
cm          |   10   | Dezimeter
Dezimeter   |   10   | Meter



heißt in diesem Beispiel 1 Meter * 1000 = 1 KM

Nun muss ich eine Funktion schreiben der ich einen Wert, eine Starteinheit und eine Endeinheit übergebe. Diese Funktion rechnet den Wert also in die Endheit um.
Nun hab ich ja für die Umrechnung z.B. von cm in KM keine "direkte" Umrechnung. Ich muss also einen Zwischenschritt rechnen: cm -> Meter -> Kilometer.
Allerdings hab ich ja für diese Umrechnung noch einen weiteren möglichen Weg: cm -> Dezimeter -> Meter -> Kilometer.
Beide führen zum selben Ergebnis.
Es könnte auch sein, dass die größere Einheit links steht. Dann wäre der Faktor z.B. 0,001. Macht es natürlich nochmal schwerer, weil es 2 Wege gibt.

Meine Frage nun:
Wie finde ich einen Weg von Einheit A nach Einheit B. Es könnte ja auch in Sackgassen enden (wenn z.B. der Schritt von Dezimeter nach Meter nicht vorhanden wäre, würde die Umrechnung von cm in Dezimeter in einer Sackgasse enden, weil ich dort nicht weiter komme).
Ob der Weg optimal ist, ist an der Stelle vermutlich egal. Denn die Wegfindung wird um ein vielfaches länger dauern, als die Umrechnung an sich.

Ich hab dabei an einen A* gedacht. Aber schieße ich da nicht mit Kanonen auf Spatzen? Gibts einen einfacheren Weg?

Gruß,
Jens

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 02.11.11 10:45 
Hallo Nersgatt,

da du quasi einen (ungerichteten) Graphen hast, kannst du einfach den Dijkstra-Algorithmus nehmen. Für A* bräuchtest du ja eine Heuristik (bzw. ohne Angabe einer Heuristik wärst du wieder beim Dijkstra-Algorithmus).
Beachte, daß dann deine Kantenkosten aber jeweils nur 1 sind (deine Faktoren spielen ja für den kürzesten Weg keine Rolle).

P.S. Wenn du eine konstante Tabelle hast und sehr oft umrechnen mußt, dann würde ich vorhandene Umrechnungen als Weg cachen, damit du nicht immer wieder die Wegsuche durchführen mußt.
Nersgatt Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Mi 02.11.11 10:56 
Danke Dir, das sieht sehr gut aus. Ich denke, das ist das, was ich suche.
Wie oft Umrechnungen vorkommen, weiß ich ehrlichgesagt noch nicht. Ich werde das aber sowieso in einer Klasse kapseln, so dass ich da auch noch später eine Möglichkeit zum cachen nachschieben kann, wenn sich das als Flaschenhals erweisen sollte.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
buster
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 66
Erhaltene Danke: 7

WIN 7
Delphi 2010 Prof
BeitragVerfasst: Mi 02.11.11 11:37 
Ist das nicht ein bischen übertrieben für so eine billige Umrechnung? :gruebel:
Nimm doch einfach die Faktoren in Beziehung zum Meter (=1), also km = 1000, mm = 0.001 und rechne Faktor(Ausgangsgröße) / Faktor(Zielgröße)
-> z.B. km in mm -> 1000 / 0.001 = 1 000 000 (1 km = 1 000 000 mm) :wink: mm in dm -> 0.001 / 0.1 = 0.01 (1 mm = 0.01 dm) u.s.w. ...
Nersgatt Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Mi 02.11.11 12:02 
Das Problem ist, dass ich nicht weiß, welche Einheiten es geben wird. Die kann der Benutzer selbst pflegen. Bzw. werden die Einheiten teilweise aus einer "fremden" Datenquelle importiert und der Benutzer muss dann noch die Umrechnungen nachpflegen.
Und dabei gehts nicht nur um Stecken, sondern auch z.B. Flächen, Masse, Volumen, etc.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
buster
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 66
Erhaltene Danke: 7

WIN 7
Delphi 2010 Prof
BeitragVerfasst: Mi 02.11.11 12:16 
Mit einer festen Größe, auf die sich alle anderen Einheiten beziehen, und den dazugehörigen Umrechnungsfaktoren, sollte das meiner Meinung nach überall funktionieren...
von mir aus auch mit Zentner ;) ( wenn 1 Zentner = 1 -> 1 kg = 0.02 ... Berechnung Zentner in kg -> 1 / 0.02 = 50 -> 1 Zentner = 50 kg )
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: Mi 02.11.11 12:25 
Wenn du dann allerdings € in $ umrechnen willst und dafür als Basis Meter brauchst...
zuma
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 660
Erhaltene Danke: 21

Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
BeitragVerfasst: Mi 02.11.11 12:37 
In meiner Anwednung hab ich so ca 200 Einheiten, wobei die ebenfalls die User selbst anlegen können. Die Einheitenumrechnung brauch ich in zig Masken, teilweise kann der User sogar pro Ds wählen, in welcher Einheit er was sehen will (z.b. Stammdaten sagt Einheit ist KG, er will %, FXU, nmol/100ml, i.E. oder weiss der Geier was sehen).
Dazu hab ich eine Tabelle mit Einheiten (ID, Bez) + eine mit Einheitenumrechnungsfaktoren,
die genau deinem Muster entspricht (IDVon, IDAuf, Wert).
Desweiteren gibts eine kleine Maske, in der die User den Umrechnungsfaktor selbst angeben können (Standard-Einheitsumrechnungen werden natürlich vorbelegt ausgeliefert)
In der Maske gibts 2 Comboboxen (EinheitVon, EinheitAuf) und ein Eingabefeld für den Faktor sowie ein Grid zur Anzeige.

dreht man an den comboboxen, springt die Anzeige immer auf den richtigen DS (ID's der Einheiten liegen im Object der Items), umgerechnet wird z.Teil auch automatisch (kg > g = 1000, dann kann man g > kg auch automatisch setzen ;) ). Alle kleineren 'Schmankerl' verrat ich aber nicht :P

Eine kleine Funktion in meiner 'Utils'-Unit gibt mir immer den Umrechnungsfaktor zu 2 Einheiten (default = 0), so das ich im Programm immer nur sage:
Faktor := gibUmrechnungsfaktor(EinheitenId1, EinheitenId2);
und kann immer einfach mit dem Faktor rechnen.

Fahre damit seit Jahren sehr gut, wenn's mal rechenfehler gibt, liegts zu 99% daran, das der User nen falschen Umrechnungsfaktor eingegeben hat. Und so kann ich auch ... hmmm .. 'kundenspezifische Umrechnungsfaktoren' nutzen, da kann aus nem Euro auch mal 132 Cent werden ;)

fällt mir gerade ein:
ich bau noch nen Feld 'Kundenwert' in die Umrechnungstabelle ein, so kann ich vergleichen, ob der Kunde meine oder seine Werte nutzt. Zeige ihm dann immer nur seine,
nutze in der Logik immer seine, wenn nicht da, meine, wenn nicht da 0;

Ich machs 'händisch', da mir die Algorithmen aufgrund der 'kundenspezifische Umrechnungsfaktoren' zu steif oder aufwändig sind. So bleib ich flexibler und kann den User jeden 'Mist' machen lassen, ohne mein Programm anpassen zu müssen.

My 2 Cents ;

Zuma

_________________
Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!


Zuletzt bearbeitet von zuma am Mi 02.11.11 12:46, insgesamt 1-mal bearbeitet
buster
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 66
Erhaltene Danke: 7

WIN 7
Delphi 2010 Prof
BeitragVerfasst: Mi 02.11.11 12:43 
user profile iconbaka0815 hat folgendes geschrieben Zum zitierten Posting springen:
Wenn du dann allerdings € in $ umrechnen willst und dafür als Basis Meter brauchst...
...dann geht das auch ;) -> 1 Euro = 3 Meter, 1 Dollar = 2 Meter -> Euro in Dollar : 3/2 = 1.50 , also 1 Euro = 1,50 Dollar ;) (und Meter kürzt sich raus)
Nersgatt Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Mi 02.11.11 12:51 
Alles klar. Du übernimmst dann die Hotline und erklärst DAS den Kunden. :rofl:

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
buster
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 66
Erhaltene Danke: 7

WIN 7
Delphi 2010 Prof
BeitragVerfasst: Mi 02.11.11 13:01 
Mach ich tagtäglich :)
Ja, nee, man sollte schon für jede Größe/Umrechnung eine eigene Basis haben, das erleichtert die Sache jedenfalls ungemein ;) aber prinzipiell ist alles möglich ...
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Mi 02.11.11 13:02 
Die übliche Variante wäre wirklich, nur eine Hand voll Umrechnungsfaktoren in Richtung einer Basis (SI-Einheiten bieten sich an) zu nehmen. Macht Delphi glaub ich auch so.

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
Längen:
m = 1
cm = 0.01
mm = 0.001
nm = 0.000001
dm = 0.1
km = 1000
nmi = 1825
au = 151000

Zeiten:
s = 1
min = 60
h = 3600
d = 24*3600
etc.


Dann besteht eine Umrechnung nur aus Wert * Quelleinheit / Zieleinheit.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Nersgatt Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Mi 02.11.11 13:49 
Damit kommen meine Kunden nicht klar. Die rechnen in so komischen Einheiten wie Doppelzentner. Vielleicht wissen sie noch, dass das 2 Zentner sind. Und 1 Zentner sind 2 Sack....
Aber wenn man fragt "und wie viel Kilo sind das", dann machen sie ein langes Gesicht. Ist halt leider so.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
buster
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 66
Erhaltene Danke: 7

WIN 7
Delphi 2010 Prof
BeitragVerfasst: Mi 02.11.11 14:24 
Aber an den Umrechnungsfaktoren kommst du doch so oder so nicht vorbei... ? :nixweiss:
Und selbst, wenn du Zentner als Basis hättest...
Zentner = 1
Doppelzentner = 2
Sack = 0.5
Umrechnung Doppelzentner in Säcke: 2 / 0.5 = 4 , also 1 Doppelzentner = 4 Säcke ...
Was ist daran so schwer zu verstehen? ;)
Und der schlaue Delphi-Programmierer könnt's dann sogar noch in kg umrechnen :D
Aber wenn nicht mal deine Kunden die Umrechnungsfaktoren wissen, wie willst du's dann machen??
Nersgatt Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Mi 02.11.11 14:40 
user profile iconbuster hat folgendes geschrieben Zum zitierten Posting springen:

Was ist daran so schwer zu verstehen? ;)

Genau das frage ich mich auch täglich. :D
Meine Kunden sind kein EDV-Leute. Das sind auch keine Büromenschen. Die habens oft mit der Mathematik nicht so, wenn es das Niveau der 4. Klasse übersteigt. Was aber keinesfalls heißt, dass das bei allen meinen Kunden so ist. Nur ich muss diese Leute "mit einplanen".

Ne, an den Faktoren komm ich nicht vorbei, das ist klar. Es geht darum, dass ich den Kunden nicht erklären kann, dass sie alle Masseeinheiten z.B. in KG umrechnen müssen. Die können das höchstens in die "nächste" Einheit umrechnen. Daher ist es für mich die beste Lösung, ihn wirklich die Faktoren zwischen den Einheiten angeben zu lassen, die er weiß.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
buster
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 66
Erhaltene Danke: 7

WIN 7
Delphi 2010 Prof
BeitragVerfasst: Mi 02.11.11 14:47 
Dann wirst du wohl in den sauren Apfel beißen müssen... Oder du bietest das den Kunden als besonderen Service an, (gegen Aufschlag, versteht sich), ihre Umrechnungstabellen zu befüllen ;) wiki hilft da gerne weiter :)
zuma
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 660
Erhaltene Danke: 21

Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
BeitragVerfasst: Mi 02.11.11 15:42 
Nersgatt,
ich hab das gleiche Problem:
Vom Wissenschaftler bis zum Lkw-Fahrer als User,
die einen können dir die Umrechnungsfaktoren für die exotischten Einheiten aus dem Stand sagen, während die anderen bei der Frage nach Umrechnungsfaktor dich anschauen, als hättest du gerade Gotteslästerung betrieben oder sowas ;)

Wir pflegen selber eine Basis in der wir alle 'neuen' faktoren der Kunden sammeln und aktualisieren die Tabellen beim Kunden dann beim nächsten Update automatisch (Falls Wert nicht vom Kunden eingegeben).

Alles andere lässt einen irgendwann verzweifeln, denn jeden intelligenten Programmierer kannste mit genug dummen Usern in den Wahnsinn treiben sagt meine Erfahrung ;)

Zuma

_________________
Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 03.11.11 00:41 
Um zum algorithmischen Teil zurückzukommen: Single-Source kürzeste Wege in einem ungewichteten Graphen sucht man weder mit A* noch Dijkstra, sondern mit Breitensuche ;) .
Wenn die Tabelle auch editiert werden kann, wäre das auf jeden Fall einfacher (und sicher performant genug), als Umrechnungsfaktoren zu einer (beliebig gewählten) Basiseinheit zu cachen (was ja für den Nutzer vollkommen transparent möglich wäre) (ich mag Klammern).

_________________
>λ=