MBrendecke icon

Zahlen

MBrendecke | PRO | 03/23/18 04:35:56 PM UTC | 0 ⭐ | 356 👁️ | Never ⏰ | []
C# |

4.99 KB

|

None

|

0 👍

/

0 👎

using System;
using System.Text.RegularExpressions;
 
using static System.Console;
using static System.Math;
 
namespace Zahlen {
    static class Zahlen {
        static void Main(string[] args) {
            string[] ergebnisse = new string[2];
 
#if DEBUG
            string function = "((x * x) - 2 / (x + 8 * x) + 15)";
            ergebnisse[0] = Aufgabe1(function, -15);      
#else
            string function = "";
            do {
                WriteLine("Bitte geben Sie einen Funktionsterm ein.");
                Write("f(x) = ");
                function = ReadLine();
            } while (String.IsNullOrWhiteSpace(function));
 
            string value = "";
            double result;
            do {
                WriteLine("Bitte geben Sie einen Wert für 'x' ein.");
                Write("x = ");
                value = ReadLine();
            } while (!Double.TryParse(value, out result));
 
            ergebnisse[0] = Aufgabe1(function, result);
#endif
 
            ergebnisse[1] = Aufgabe2(23245);
 
            for (int i = 0; i < ergebnisse.Length; i++) {
                WriteLine($@"Ergebnis für Aufgabe #{i + 1}: {ergebnisse[i]}");
            }
 
            WriteLine($"\nFunktionswerte für f(x) = {function}\n");
            for (int i = -10; i <= 10; i++) {
                WriteLine($@"f({i}) = {Aufgabe1(function, i)}");
            }
 
            WriteLine("\nEnde des Programms");
            ReadKey();
        }
 
        static string Aufgabe1(string function, double value) {
            function = function.ToLower().Replace("x", value.ToString()).Replace(" ", "");
 
            string filterDigits = @"-?([0-9]*\,[0-9]+|[0-9]+)";
            string filterOperators = @"*/+-";
            string filterTestSubterm = $@"\(({filterDigits}[{filterOperators}]{filterDigits})[^)]*\)";
 
            var valuesInBraches = Regex.Matches(function, filterTestSubterm);
 
            foreach (var valueInBrache in valuesInBraches) {
                string temp = valueInBrache.ToString().Replace("(", "").Replace(")", "");
                function = function.Replace(valueInBrache.ToString(), Aufgabe1(temp, value));
            }            
 
            function = function.Replace("(", "").Replace(")", "");            
 
            foreach (char filterOperator in filterOperators) {
                do {
                    string filter = $@"{filterDigits}\{filterOperator}{filterDigits}";
 
                    var subTerm = Regex.Match(function, filter);
                    var subTermValues = Regex.Matches(subTerm.Value, filterDigits);
 
                    if (subTerm.Length <= 0)
                        break;
 
                    Func<double, double, double> calc = null;
 
                    switch (filterOperator) {
                        case '*':
                            calc = (x, y) => x * y;
                            break;
                        case '/':
                            calc = (x, y) => x / y;
                            break;
                        case '+':
                            calc = (x, y) => x + y;
                            break;
                        case '-':
                            calc = (x, y) => x - Abs(y);
                            break;
                        default:
                            break;
                    }
 
                    if (filterOperator == '/' && Double.Parse(subTermValues[1]?.Value) == 0)
                        return "Asymptote";
 
                    double ergebnis = calc(Double.Parse(subTermValues[0]?.Value), Double.Parse(subTermValues[1]?.Value));
                    function = function.Replace(subTerm.Value, ergebnis >= 0 ? "+" + ergebnis.ToString() : ergebnis.ToString());
                    function = function.Replace("+-", "-").Replace("-+", "-").Replace("++", "+");
                } while (true);
            }
            
            return function.TrimStart('+');
        }
 
        static string Aufgabe2(long input) {
            string temp = input.ToString();
 
            for (int i = 0; i < temp.Length - 1; i++) {                
                if (temp[i] <= temp[i + 1]) {
                    continue;
                } else {
                    /*
                     * Übertrag mittels Modulo zur Basis 10^i bestimmen.
                     * Sei { z, i aus N | z = 12345 und i = [0..5] }. Dann gilt,
                     * 00005 := 12345 mod (10^0)
                     * 00045 := 12345 mod (10^1)
                     * ...
                     * 12345 := 12345 mod (10^5)
                     */
                    long diff = Int64.Parse(temp.Substring(i, temp.Length - i));
                    diff %= (long)Pow(10, temp.Length - i - 1);
                    input -= diff + 1;
 
                    // Schleife Zurücksetzen
                    i = -1;
                    temp = input.ToString();
                }
            }
 
            return input.ToString();
        }
    }
}

Comments