kostenloser Webspace werbefrei: lima-city


Rechnen mit Vergleichswerten

lima-cityForumProgrammiersprachenBasic

  1. Autor dieses Themas

    ee2-yoda

    ee2-yoda hat kostenlosen Webspace.

    Vergleiche werden normalerweise in einer If-Abfrage verwendet, um tag/code">Code nur dann auszuführen, wenn der Vergleich als Ergebnis True(Wahr) ergibt.
    Syntax:
    IF {Vergleich} THEN
    ......Anweisungen, die nur ausgeführt werden, wenn der Vergleich True(Wahr) ergibt
    ENDIF

    Wenn man also aus einem Monat die Anzahl der Tage des Monats berechnen will, könnte man folgenden Code schreiben:
    IF M<8 THEN
      T=30 + (M and 1)
    ELSE
      T=31 - (M and 1)
    ENDIF
    IF M=2 THEN T=T-2

    Doch das geht wesentlich kürzer, wenn man weiß das man mit dem Ergebnis eines Vergleichs rechnen kann, denn das Basic speichert nicht die Worte "Falsch" oder "Wahr", sonder 0 für Falsch und -1 für Wahr. Damit läßt sich das Beispiel auf eine einzige Zeile verkürzen:
    T = 30 + ((M + (M > 7)) And 1) + 2 * (M = 2)

    Wichtiger Hinweis!
    Manche Basic-Dialekte benutzen den Wert +1 statt -1 für "Wahr", daher sollte man den vom Basic verwendeten Wert vorher testen. Das geht einfach mit
    PRINT True * 1
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Die bedingte Anweisung
    if
    erwartet nicht zwingend einen Vergleich, sondern einfach allgemein einen Boolean. Auch wenn deine Anweisung etwas kürzer ist, so kann ich sie dennoch nicht unbedingt empfehlen, da sie wohl kaum schneller ausgeführt wird. Man sollte sich angewöhnen, ausführlicheren Code zu schreiben, der auch im Nachhinein mit wenigen Blicken sofort wieder einleuchtet; das erleichtert die Fehlersuche ungemein. Ich empfehle auch nicht mit einem Wert undurchsichtige Rechnungen durchzuführen: Im vorliegenden Fall halte ich statt dessen eine
    case
    -Anweisung in Kombination mit einer Enumeration für sinnvoll.
    Enum Monat
        Januar
        Februar
        März
        April
        Mai
        Juni
        Juli
        August
        September
        Oktober
        November
        Dezember
    End Enum
    
    Dim M As Monat = aktueller Monat
    Dim Tage As Integer
    
    Select Case M
        Case Februar
            Print "Hier müsste die Jahreszahl bekannt sein."
        Case April, Juni, September, November
            Tage = 30
        Case Januar, März, Mai, Juli, August, Oktober, Dezember
            Tage = 31
        Case Else
            Print "Einen Monat " + Monat + " gibt es nicht!"
    End Select
    
    Print Tage
    Achtung: Dies ist nur Pseudocode.

    Gleich ersichtlich ist, dass dieser Code sehr viel länger ist, als das von dir aufgeführte Beispiel. Dafür ist es aber ebenso sehr viel einfacher möglich, hieran Erweiterungen vorzunehmen, oder in einem späteren Stadium auf Fehlersuche zu gehen. Außerdem kann man sofort erkennen, worum es hierbei geht; es lassen sich sogar sehr bequem Informationen über die einzelnen Monate extrahieren. Die eigentliche Berechnungsdauer dürfte allerdings obgleich des längeren Codes bei guten Compilern absolut gleichwertig sein. Viel wichtiger jedoch: Aus Sicht der Hochsprache finden hier keine Berechnungen statt, dadurch entfallen lästige Verknüpfungen von Variablen.


    Während deine erste Lösung dieses Problemes wegen seiner Zweckmäßigkeit annehmbar ist, sollte man vor allem aber auf solche starken Verkürzungen verzichten, wenn man nicht vollständig ausschließen kann, dass:
    - der Ausdruck für jede mögliche Eingabe korrekt arbeitet.
    - nachträgliche Änderungen vollzogen werden müssen.
    - die Problemstellung von externen Parametern abhängt.
    Im Fall der Tage eines Monats sehr unwahrscheinlich, aber es könnte ja sein, dass irgendwann gesetzlich festgelegt wird, dass der März künftig nur noch aus 30 Tagen bestehen solle. In diesem Fall muss man die stark verkürzte Version entweder sehr aufwendig bearbeiten und am Resultat erneut eine Fehleranalyse durchführen, oder ein ganz neuen Ausdruck finden, was nicht weniger zusätzliche Arbeit bedeutet.

    Ich hoffe ich konnte meinen Standpunkt ausführlich genug beleuchten und rate dir, lieber ebenso einfach zu programmieren, denn kompliziert komprimiert.


    Nach ein letzter Verbesserungsvorschlag, der jedoch nur mit objektorientierten Sprachen durchgeführt werden kann:
    class Monat {
        private final int tage;
        public Monat(int tage) {
            this.tage = tage;
        }
        public int anzahlTage() {
        // Für den Februar diese Methode einfach in einer Subklasse überschreiben.
            return tage;
        }
    }
    Auf diese Weise erspart man sich den ganzen Krempel vollständig und schreibt nur noch
    januar.anzahlTage()
    .
  4. Autor dieses Themas

    ee2-yoda

    ee2-yoda hat kostenlosen Webspace.

    toolz schrieb:......Während deine erste Lösung dieses Problemes wegen seiner Zweckmäßigkeit annehmbar ist, sollte man vor allem aber auf solche starken Verkürzungen verzichten, wenn man nicht vollständig ausschließen kann, dass:
    - der Ausdruck für jede mögliche Eingabe korrekt arbeitet.
    - nachträgliche Änderungen vollzogen werden müssen.
    - die Problemstellung von externen Parametern abhängt.
    Ich wollte hier kein komplettes Programm, sondern nur ein Anwendungsbeispiel liefern, das auf jeder mir bekannten Basic-Version funktioniert. Was man von deinem Programm nicht behaupten kann. Wenn du ein Programm anbietest, das nur auf einem Basic aber nicht auf allen funktioniert, würde ich vorschlagen, das du in Zukunft dabei schreibst, für welches Basic der Code gilt. Es sieht mir sehr stark nach VisualBasic aus, das ich vor längerer Zeit einmal benutzt habe. Auf BlitzBasic läuft das Programm in der Form garantiert nicht.
    Wenn man einmal weiß, wie man mit Vergleichswerten rechnet und das auch anwendet, sieht man in der von mir genannten Programmzeile bald nichts kompliziertes mehr und die Fehlermöglichkeiten werden sehr gering.

    toolz schrieb.....Im Fall der Tage eines Monats sehr unwahrscheinlich, aber es könnte ja sein, dass irgendwann gesetzlich festgelegt wird, dass der März künftig nur noch aus 30 Tagen bestehen solle. In diesem Fall muss man die stark verkürzte Version entweder sehr aufwendig bearbeiten und am Resultat erneut eine Fehleranalyse durchführen, oder ein ganz neuen Ausdruck finden, was nicht weniger zusätzliche Arbeit bedeutet.
    Mit gleicher Wahrscheinlichkeit kann es auch sein, das der Mond auf mein Haus fällt und nicht nur meine Programme, sondern auch mein PC und ich selbst sehr aufwendig bearbeitet und einer Fehleranalyse unterzogen werden müssten. Da beides gleichermaßen unwahrscheinlich ist, ist davon auszugehen, das an meiner Programmzeile keinerlei weitere Korrektur erforderlich ist. Ein längeres Programm erhöht hingegen die Wahrscheinlichkeit, das man sich bei der Eingabe vertippt, bietet also eher mehr Fehlermöglichkeiten.
    Die von dir genannte "sehr aufwendige Bearbeitung" beschränkt sich tatsächlich nur darauf, das man an die Zeile nur +(M=3) anhängen müsste. Wofür dabei jedoch eine Fehleranalyse notwendig sein sollte ist mir schleierhaft.

    toolz schrieb
    Nach ein letzter Verbesserungsvorschlag, der jedoch nur mit objektorientierten Sprachen durchgeführt werden kann:
    class Monat {
        private final int tage;
        public Monat(int tage) {
            this.tage = tage;
        }
        public int anzahlTage() {
        // Für den Februar diese Methode einfach in einer Subklasse überschreiben.
            return tage;
        }
    }
    Auf diese Weise erspart man sich den ganzen Krempel vollständig und schreibt nur noch
    januar.anzahlTage()
    .
    Was in dem Codebereich wie berechnet wird ist mir völlig unklar. Auch scheint mir das kein Basic zu sein. Wenn du jedoch lieber in einer anderen Programiersprache Code veröffentlichen möchtest, würde ich dir vorschlagen dies nicht in einem Forenbereich zu tun, der für "Themen zu allen Basic-Dialekten" verwendet werden soll.

    Abschließend:
    Ich wollte ein einfach zu verstehendes Beispiel geben, wie man mit Vergleichswerten rechnen kann. Das man dieses Beispielproblem ebenso gut mit SELECT hätte lösen können war mir durchaus bekannt, es wäre dann aber kein Beispielcode mehr für den Tipp, den ich hier geben wollte. Ich verwende diese Rechenmethode in wesentlich komplexeren Berechnungen, wo sie mir erhebliche Mengen Programmcode ersparen. Diese Berechnungen lassen sich aber entweder gar nicht oder nur in fehleranfälligen Verschachtelungen von IF- oder Select-Anweisungen realisieren.

    Beitrag zuletzt geändert: 2.2.2014 23:16:33 von ee2-yoda
  5. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!