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 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(); } } }