Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   hilfe beim verkürzen meines codes (https://www.delphipraxis.net/180579-hilfe-beim-verkuerzen-meines-codes.html)

almanciyabanci 31. Mai 2014 02:36

hilfe beim verkürzen meines codes
 
hallo alle zusammen,

ich habe folgendes ein problem mit der if schleife, der Ablauf funktioniert zwar aber ich möchte den code verkürzen jedoch kriege ich es nicht hin.

Meine beiden variablen : kmneu und tacho sind Double, zu der variable tacho soll ab 15km immer im 10km tack ein 0,1km dazu addiert werden

NUr ein bruch teil meines langen codes..

Code:

if kmneu>= 1005 then
    begin
     tacho:= kmneu + (kmneu / 100 * 10)
    end
   else if kmneu>= 995 then
     begin
      tacho:= kmneu + (1 / 10 * 100)
     end
   else if kmneu>= 985 then
     begin
      tacho:= kmneu+(1 / 10 * 99)
      end
   else if kmneu>= 975 then
     begin
      tacho:= kmneu+ (1 / 10 * 98)
      end
   else if kmneu>= 965 then
     begin
      tacho:= kmneu+ (1 / 10 * 97)
      end
.
.
.
.
.
else if kmneu>= 35 then
     begin
      tacho:= kmneu+ (1 / 10 * 4)
      end
   else if kmneu>= 25 then
     begin
      tacho:= kmneu+ (1 / 10 * 3)
      end
   else if kmneu>= 15 then
     begin
      tacho:= kmneu+ (1 / 10 * 2)
      end
   else begin
      tacho:= kmneu
      end;

himitsu 31. Mai 2014 03:22

AW: hilfe beim verkürzen meines codes
 
Delphi-Quellcode:
if kmneu >= 1005 then
  tacho := kmneu + (kmneu / 100 * 10)
else if kmneu >= 995 then
  tacho := kmneu + (1 / 10 * 100)
else if kmneu >= 985 then
  tacho := kmneu + (1 / 10 * 99)
else if kmneu >= 975 then
  tacho := kmneu + (1 / 10 * 98)
else if kmneu >= 965 then
  tacho := kmneu + (1 / 10 * 97)
...
else if kmneu >= 35 then
  tacho := kmneu + (1 / 10 * 4)
else if kmneu >= 25 then
  tacho := kmneu + (1 / 10 * 3)
else if kmneu >= 15 then
  tacho := kmneu + (1 / 10 * 2)
else
  tacho := kmneu;
Wenn es nur ein Befehl ist, dann kann man sich natürlich das Begin-End sparen. :mrgreen:
Und dann gibt es natürlich noch das Case.
Delphi-Quellcode:
case kmneu of
  1005..10014{weiß ich nicht}: tacho := kmneu + (kmneu / 100 * 10);
  995..1004: tacho := kmneu + (1 / 10 * 100);
  985..994:  tacho := kmneu + (1 / 10 * 99);
  975..984:  tacho := kmneu + (1 / 10 * 98);
  965..974:  tacho := kmneu + (1 / 10 * 97);
  ...
  35..44:    tacho := kmneu + (1 / 10 * 4);
  25..34:    tacho := kmneu + (1 / 10 * 3);
  15..24:    tacho := kmneu + (1 / 10 * 2);
  else       tacho := kmneu;
end;
Und wie dir auffällt, sind da fortlaufende Zahlen sind, welche man zusammenfassen kann.
Delphi-Quellcode:
case kmneu - 5 of
  1000..1009:
  990..999:
  980..989:
  970..979:
  960..969:
  ...
  30..39:
  20..29:
  10..19:
  else
end;
Delphi-Quellcode:
case (kmneu - 5) div 10 of
  100:
  99:
  98:
  97:
  96:
  ...
  3:
  2:
  1:
  else
end;
Und wenn man weiter sieht, dann kann man die mittlere Reihe auch zusammenfassen.
Ein Blick auf die vorrherrige Reihe gibt auh gleich die mathematische Lösung.
Delphi-Quellcode:
  100:  tacho := kmneu + (kmneu / 100 * 10);
  1..99: tacho := kmneu + (1 / 10 * ((kmneu - 5) div 10 + 1));
  else  tacho := kmneu;
Und nun lässt man einfach noch die äußeren Klammern weg, welche ja nicht nötig sind und stellt löst die Formeln auf.
Delphi-Quellcode:
  100:  tacho := kmneu + kmneu / 10;
  1..99: tacho := kmneu + ((kmneu - 5) div 10 + 1) / 10;
  else  tacho := kmneu;
Und das wäre selbst mit IF nichtmal so lang geworden, wenn man nur mal nach redundanten Regelmäßigkeiten sucht,
vorallem wenn die in der Ausgangsfrage alle schon vorgegeben waren. :wall:

Eventuell sollte man die Aufgabestellungen nochmal genau lesen und das machen, was darin steht.
ab 15 in 10er-Schritten = (kmneu - 15) div 10

Und meinst du nicht, daß 1000 km/h nicht ein bissl viel sind?
So viele IFs hättest du nicht gebraucht, vorallem da sie ja sowieso unnötig wären, wenn man es als Gleichung löst.

Und wo steht eigentlich was von der Formel bei 1005... kmh?

sx2008 31. Mai 2014 03:32

AW: hilfe beim verkürzen meines codes
 
Delphi-Quellcode:
var
  n : integer;
begin
  n := floor(kmneu + 5.0);
  // falls kmneu = 25.0 dann wäre n = 30

  n := n div 10;

  tacho := kmneu + (0.1 * n);
Da fehlt noch ne Kleinigkeit und zwar die Prüfung ob km >= 1005 ist und die abweichende Berechnung aber das kriegst du sicher selbst hin.

Dejan Vu 31. Mai 2014 08:13

AW: hilfe beim verkürzen meines codes
 
Delphi-Quellcode:
  kmneu := kmneu + 0.1* (trunc(min (1005,kmneu)+0.5) div 10 + 1);
...
Genau die gleiche Idee wie sx2008, nur eben in einer Zeile. Es ging ja um die Kürze, nicht um verständlichen Code. ;-).
Und die Deckelung auf 1005 ist auch eingebaut.

Delphi-Quellcode:
trunc(x + 0.5)
konvertiert einen Double in einen Integer und kompensiert dabei eventuelle Rundungfehler.

Sir Rufo 31. Mai 2014 08:28

AW: hilfe beim verkürzen meines codes
 
BTW if-schleife ;)

Dejan Vu 31. Mai 2014 08:33

AW: hilfe beim verkürzen meines codes
 
Zitat:

Zitat von Sir Rufo (Beitrag 1260847)

Stimmt nicht:
http://python.about.com/od/tutorial1/ss/begpyctrl_4.htm
:lol:

Sir Rufo 31. Mai 2014 08:37

AW: hilfe beim verkürzen meines codes
 
Zitat:

Zitat von Dejan Vu (Beitrag 1260848)
Zitat:

Zitat von Sir Rufo (Beitrag 1260847)

Stimmt nicht:
http://python.about.com/od/tutorial1/ss/begpyctrl_4.htm
:lol:

Seit der Bibel wissen wir doch wie böse Schlangen sind :mrgreen:

Dejan Vu 31. Mai 2014 09:58

AW: hilfe beim verkürzen meines codes
 
<OT-Klippe>
Es war so ziemlich der einzige Link, der *nicht* gegen die Schlif-Eife (ich darf das Wort nicht aussprechen :freak:) gewettert hat.
</OT-Klippe>

Perlsau 31. Mai 2014 10:18

AW: hilfe beim verkürzen meines codes
 
Zitat:

Zitat von Dejan Vu (Beitrag 1260848)
Zitat:

Zitat von Sir Rufo (Beitrag 1260847)

Stimmt nicht:
http://python.about.com/od/tutorial1/ss/begpyctrl_4.htm
:lol:

Dadurch, daß ein anderer dieselbe fehlerhafte Ausdrucksweise anwendet, wird sie nicht zu einer korrekten Ausdrucksweise. Allerdings könnte man rekursive Programmierung in manchen Fällen mit ein wenig Phantasie durchaus als IF-Schleife bezeichnen, wenn nach THEN oder ELSE die Methode noch einmal aufgerufen wird.

Dejan Vu 31. Mai 2014 10:40

AW: hilfe beim verkürzen meines codes
 
Zitat:

Zitat von Perlsau (Beitrag 1260862)
Zitat:

Zitat von Dejan Vu (Beitrag 1260848)
...
:lol:

Dadurch, daß ein anderer dieselbe fehlerhafte Ausdrucksweise anwendet, wird sie nicht zu einer korrekten Ausdrucksweise....

Was meinst Du, ist mit dem :lol: gemeint?:roll:

Perlsau 31. Mai 2014 10:43

AW: hilfe beim verkürzen meines codes
 
Ja was wohl: Du deutest damit an, dabei zu lachen. Das ändert aber nichts an der Richtigkeit meiner Aussage. Ich hoffe, du fühltest dich dadurch nicht beleidigt, denn das lag ganz gewiß nicht in meiner Absicht.

Dejan Vu 31. Mai 2014 10:52

AW: hilfe beim verkürzen meines codes
 
Zitat:

Zitat von Perlsau (Beitrag 1260868)
Das ändert aber nichts an der Richtigkeit meiner Aussage.

Nhmnja, der Teil hier ist doch irgendwie überflüssig:
Zitat:

Zitat von Perlsau (Beitrag 1260862)
Dadurch, daß ein anderer dieselbe fehlerhafte Ausdrucksweise anwendet, wird sie nicht zu einer korrekten Ausdrucksweise.

Hat was mit Ironie zu tun (der Smiley).
Zitat:

Zitat von Uns Wiki
Dabei behauptet der Sprecher etwas, das seiner wahren Einstellung oder Überzeugung nicht entspricht, diese jedoch für ein bestimmtes Publikum ganz oder teilweise durchscheinen lässt.

Wenn Du also das Piktogramm korrekt interpretiert hättest (dazu gehört nicht viel, einfach mal den Besen rausnehmen ;-) ), dann wärst Du Teil des dieses 'bestimmten Publikums' gewesen (kann man sich streiten, ob das erstrebenswert ist)

Wichtig! Nichts von dem ist böse gemein, von beiden Seiten nicht.

So, nun geh ich raus, die Sonne lacht.
Sie hat mir heute Glück gebracht.
Macht es mir nach, und geht hinaus.
Und hier ist die Geschichte aus.

Perlsau 31. Mai 2014 10:54

AW: hilfe beim verkürzen meines codes
 
Kein weiteres Interesse an deinen Spielchen ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz