C# :: Aufgabe #168 :: Lösung #2

3 Lösungen Lösungen öffentlich
#168

Biorhytmus - zuerst Top oder Down?

Anfänger - C# von hollst - 13.03.2017 um 12:44 Uhr
Die Biorhytmen sind eine "Entdeckung" des Wiener Psychologen Swoboda und des Berliner Arzt Fließ zu Beginn des 20. Jahrhunderts.
Es soll beim Menschen drei Arten davon geben, den körperlichen Biorhythmus mit einer Periodendauer von 23 Tagen, den emotionalen
Biorhythmus (28 Tage) und den geistigen Biorhythmus (genannt Intellekt, Periodendauer 33 Tage). Die Existenz dieser Rhytmen ist
nicht bewiesen und eine praktische Nutzbarkeit kaum erkennbar. Allerdings sind sie sehr nützlich z. B. bei Ausreden. Wurde eine Prüfung
vermasselt, kann man das leicht auf einen schlechten Wert in der geistigen Periode schieben, war die Leistung auf dem Fußballplatz
miserabel, so lag es am Tiefpunkt beim körperlichen Schwingungswert.

Die Perioden beginnen mit dem Tag der Geburt - bereits ein Kritikpunkt, warum nicht mit dem Tag der Befruchtung oder noch früher?
Diesen gemeinsamen Nullpunkt aller drei Rhytmen wird man erst wieder in 21.252 Tagen erreichen, also nach dem 58. Geburtstag.
Ein gemeinsamer Nullpunkt ist allerdings von untergeordnetem Interesse, schlimmer wäre es, wenn alle drei Rhytmen gleichzeitig im Tiefpunkt
wären, also alle drei den Wert -1 hätten. Ein Glückstag wäre dagegen ein Tag, bei dem alle drei Werte den Topwert +1 hätten.

Die Frage lautet, was passiert im Leben zuerst, alle drei Werte DOWN (sehr nahe oder gleich -1) oder alle drei Werte TOP (sehr nahe oder
gleich +1). Nach wievielen Tagen (Jahren) tritt dies jeweils erstmalig ein?

Als Programmieraufgabe eignet sich die Biorhytmusproblematik gut zum Üben der Entwicklung einer GUI-Anwendung (siehe Abb.). Man kann
es sehr einfach in fast allen Programmiersprachen erlernen und realisieren. Wenn man dies so tut, bekommt man schnelle ein Gefühl dafür,
welche Programmiersprache einem von der Stilistik und Per­for­manz hinsichtlich der grafischen Mensch-Maschine-Kommunikation am
symphatischsten ist.
#2
vote_ok
von hollst (10960 Punkte) - 23.07.2017 um 14:53 Uhr
Um die Frage zu beantworten, "was passiert im Leben zuerst ... ", muss man zunächst definieren, was man unter "sehr nahe oder gleich +/- 1" versteht, das Ergebnis hängt nämlich davon ab. Nebenbei, der nächste gemeinsamen Nullpunkt aller drei Rhytmen wird bereits in 10.626 Tagen erreicht (kleiner Denkfehler).

Quellcode ausblenden C#-Code
using System;
using static System.Console;

namespace biorythmus_console    {

    public static class Program    {

        static void Main()        {
            double nahe = 1.0E-2;
            for (var i = 0; i < 5; i++)            {
                int first = run(nahe);
                (nahe.ToString("E2") + " erg: " + first.ToString("n0").ToMyString(8) + " " + 
                    (Math.Sin(2 * Math.PI * first / periode[0])).ToString().ToMyString(25) + " " +
                    (Math.Sin(2 * Math.PI * first / periode[1])).ToString().ToMyString(25) + " " +
                    (Math.Sin(2 * Math.PI * first / periode[2])).ToString().ToMyString(25) + " " 
                    ).MessageLine();
                grenze /= 2;
            }
            "ready".EndMessage();
        }

        static int[] periode = new int[] { 23, 28, 33 };

        static int run(double grenze)        {            
            int result = 0;
            double old_diff = 0.0;

            bool bo_break = false;
            do  {
                result++;
                double f = 2 * Math.PI * result;
                double[] sins = new double[] {
                    Math.Sin(f / periode[0]),
                    Math.Sin(f / periode[1]),
                    Math.Sin(f / periode[2])
                };
                double diff = Math.Sqrt(
                    Math.Abs((sins[0] - sins[1]) * (sins[0] - sins[1])) +
                    Math.Abs((sins[0] - sins[2]) * (sins[0] - sins[2])) +
                    Math.Abs((sins[1] - sins[2]) * (sins[1] - sins[2])));
                bo_break = (diff < old_diff) && (diff < grenze);
                old_diff = diff;
            } while (!bo_break); 
            return result;
        }

        static void MessageLine(this string s) => WriteLine(s);

        static ConsoleKeyInfo EndMessage(this string s)        {
            s.MessageLine();
            return ReadKey(true);
        }

        static string ToMyString(this string s, int digits)        {
            string result = s;
            while (result.Length < digits)
                result = " ".ToString() + result;
            return result;
        }
    }
}

Kommentare:

Für diese Lösung gibt es noch keinen Kommentar

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben