C# :: Aufgabe #249 :: Lösung #3

3 Lösungen Lösungen öffentlich
#249

Taschenrechner in einer Konsole

Fortgeschrittener - C# von Gelöschte Person - 30.03.2019 um 19:29 Uhr
Programmiere einen Taschenrechner der folgende Rechenarten kann:
Plus
Minus
Mal
Geteilt
Wurzel
Hoch
Prozent
Quersumme
#3
vote_ok
von JKooP (18090 Punkte) - 02.04.2020 um 14:40 Uhr
NET Core 3.x

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

namespace CS_Aufgabe_249_Taschenrechner
{
    class Program
    {
        static void Main(string[] args)
        {
            PrintInfo();
            Write("Bitte Operation eingeben: "); // 144° (Wurzel aus 144)
            var calc = new Calculator(ReadLine());
            WriteLine(calc); // 144° = 12
        }
        static void PrintInfo()
        {
            WriteLine("Mögliche Operationen:");
            WriteLine("(+) Addition\n(-) Subtraktion\n(*) Multiplikation\n(/) Division");
            WriteLine("(^) Hoch\n(°) Wurzel\n(%) Prozent\n(#) Quersumme");
            WriteLine("(&) Bitweises UND (nur INT)\n");
            WriteLine("Nur 2 Operanden und ein Operator möglich!\n");
            WriteLine("Beispiele: 2+2; -2 - -3; 4^2; 27°3; 20,4 % 84,5; 2&2; 123456789#\n");
            WriteLine("Leerzeichen zwischen Zahlen und Operatoren möglich!\n");
        }
    }
}


Quellcode ausblenden C#-Code
using System;
using System.Text.RegularExpressions;
using System.Linq;

namespace CS_Aufgabe_249_Taschenrechner
{
    class Calculator
    {
        private readonly string _mathProblem;

        public Calculator(string mathProblem) => _mathProblem = mathProblem;

        private double GetResult(char op, (double a, double b) v)
        {
            var (s, d, p, q) = MyMath.Operation(v.a, v.b);
            return op switch
            {
                '+' => s,
                '&' => (int)v.a & (int)v.b,
                '-' => d,
                '*' => p,
                '/' => q,
                '°' => Math.Pow(v.a, 1 / Math.Abs(v.b)),
                '^' => Math.Pow(v.a, v.b),
                '%' => v.b * v.a / 100,
                '#' => MyMath.DigitSum((int)v.a),
                _ => 0
            };
        }

        private char GetOperator()
        {
            var r = new Regex(@"[+°*^/%#&\-]{1}");
            var m = r.Matches(_mathProblem).Cast<Match>().Select(x => x.Value[0]).ToArray();
            return m.Length switch
            {
                0 => '0',
                1 => m[0],
                _ => m[0] == '^' ? m[0] : m[1]
            };
        }

        private (double v1, double v2) GetValues()
        {
            var v1 = 0.0;
            var v2 = 2.0;
            var r = new Regex(@"[\-]?[0-9,]+").Matches(_mathProblem);
            if (r.Count > 0)
                _ = double.TryParse(r[0].ToString(), out v1);
            if (r.Count > 1)
                _ = double.TryParse(r[1].ToString(), out v2);
            return (v1, v2);
        }

        public override string ToString() => $"{_mathProblem} = {GetResult(GetOperator(), GetValues())}";
    }
}



Quellcode ausblenden C#-Code
namespace CS_Aufgabe_249_Taschenrechner
{
    static class MyMath
    {
        public static (double s, double d, double p, double q) Operation(double a, double b) =>
            (a + b, a - b, a * b, a / (b == 0 ? 1 : b));

        public static int DigitSum(int n) =>
            n != 0 ? n % 10 + DigitSum(n / 10) : 0;
    }
}

Kommentare:

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

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

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.