c# Taschenrechner

Status
Für weitere Antworten geschlossen.
W

wahappen1

Gast
Kann mir bitte jemand helfen ich versuche seit lange Zeit die Punkt vor Strich Rechnung in diesen Code reinzugeben aber es funktioniert nicht.

Hier ist mein Code in Library:


using System;

namespace TaschenrechnerLib
{
public class Taschenrechner
{
private string eingabespeicher = "0";
private char alteroperator = '+';
private decimal erstesZahl = 0;
private bool input = true;

public string AddZahl(char zahl)
{
input = true;
if (eingabespeicher == "0")
eingabespeicher = zahl.ToString();
else
eingabespeicher += zahl;

return eingabespeicher;
}

public string NewOperator(char op)
{
erstesZahl = Convert.ToDecimal(eingabespeicher);
eingabespeicher = "0";
alteroperator = op;
input = false;

return eingabespeicher;
}

public decimal Gleich()
{
decimal zweitesZahl = Convert.ToDecimal(eingabespeicher);
decimal result = 0;

switch (alteroperator)
{
case '+':
result = erstesZahl + zweitesZahl;
break;
case '-':
result = erstesZahl - zweitesZahl;
break;
case '*':
result = erstesZahl * zweitesZahl;
break;
case '/':
if (zweitesZahl != 0)
result = erstesZahl / zweitesZahl;
break;
}

// Reset for the next calculation
eingabespeicher = result.ToString();
erstesZahl = result;

return result;
}

public string GetInput()
{
if (input)
return eingabespeicher;
return erstesZahl.ToString();
}

public string AddKomma()
{
if (!eingabespeicher.Contains(","))
eingabespeicher += ",";

return eingabespeicher;
}

}
}

Und hier ist Console:

using TaschenrechnerLib;
namespace GruppeB;

internal class Program
{
static void Main(string[] args)
{
Taschenrechner taschenrechner = new Taschenrechner();
Console.Clear();
Console.WriteLine(taschenrechner.GetInput());
bool quit = false;
while (!quit)
{
var key = Console.ReadKey(true);
if (key.Key == ConsoleKey.Escape)
{
quit = true;
}
else if (key.KeyChar >= '0' && key.KeyChar <= '9')
{
taschenrechner.AddZahl(key.KeyChar);
}
else if (key.KeyChar == '+' || key.KeyChar == '-' ||
key.KeyChar == '*' || key.KeyChar == '/')
{
taschenrechner.NewOperator(key.KeyChar);
}
else if (key.KeyChar == '.' || key.KeyChar == ',')
{
taschenrechner.AddKomma();
}
Console.Clear();
Console.WriteLine(taschenrechner.GetInput());

}
}
}
 
Bitte Code in [CODE=csharp][/CODE]Klammern.

Was geht denn genau nicht? Mal ChatGPT gefragt? Bei so Codeschnipseln ist das oft ganz hilfreich.
 
  • Gefällt mir
Reaktionen: konkretor, Der Lord, guzzisti und 2 andere
wahappen1 schrieb:
Kann mir bitte jemand helfen ich versuche seit lange Zeit die Punkt vor Strich Rechnung in diesen Code reinzugeben aber es funktioniert nicht.
Dafür müsstest du ja sicherstellen, dass Multiplikation und Division zuerst ausgeführt werden. Aktuell ist diese Priorität nicht drin. An welcher Stelle versuchst du das also?
 
  • Gefällt mir
Reaktionen: Der Lord und tollertyp
Ich bin mal so frei das zu formatieren...

Library:
C#:
using System;

namespace TaschenrechnerLib
{
    public class Taschenrechner
    {
        private string eingabespeicher = "0";
        private char alteroperator = '+';
        private decimal erstesZahl = 0;
        private bool input = true;
    }

    public string AddZahl(char zahl)
    {
        input = true;

        if (eingabespeicher == "0")
        {
            eingabespeicher = zahl.ToString();
        }
        else
        {
            eingabespeicher += zahl;
        }

        return eingabespeicher;
    }

    public string NewOperator(char op)
    {
        erstesZahl = Convert.ToDecimal(eingabespeicher);
        eingabespeicher = "0";
        alteroperator = op;
        input = false;

        return eingabespeicher;
    }

    public decimal Gleich()
    {
        decimal zweitesZahl = Convert.ToDecimal(eingabespeicher);
        decimal result = 0;

        switch (alteroperator)
        {
            case '+':
                result = erstesZahl + zweitesZahl;
                break;
            case '-':
                result = erstesZahl - zweitesZahl;
                break;
            case '*':
                result = erstesZahl * zweitesZahl;
                break;
            case '/':
                if (zweitesZahl != 0)
                {
                    result = erstesZahl / zweitesZahl;
                }
                break;
        }

        // Reset for the next calculation
        eingabespeicher = result.ToString();
        erstesZahl = result;

        return result;
    }

    public string GetInput()
    {
        if (input)
        {
            return eingabespeicher;
        }

        return erstesZahl.ToString();
    }

    public string AddKomma()
    {
        if (!eingabespeicher.Contains(","))
        {
            eingabespeicher += ",";
        }

        return eingabespeicher;
    }
}

Main
C#:
using System;
using TaschenrechnerLib;
namespace GruppeB;

internal class Program
{
    static void Main(string[] args)
    {
        Taschenrechner taschenrechner = new Taschenrechner();
        Console.Clear();
        Console.WriteLine(taschenrechner.GetInput());
        bool quit = false;
        while (!quit)
        {
            var key = Console.ReadKey(true);
            if (key.Key == ConsoleKey.Escape)
            {
                quit = true;
            }
            else if (key.KeyChar >= '0' && key.KeyChar <= '9')
            {
                taschenrechner.AddZahl(key.KeyChar);
            }
            else if (key.KeyChar == '+' || key.KeyChar == '-' ||
            key.KeyChar == '*' || key.KeyChar == '/')
            {
                taschenrechner.NewOperator(key.KeyChar);
            }
            else if (key.KeyChar == '.' || key.KeyChar == ',')
            {
                taschenrechner.AddKomma();
            }
            Console.Clear();
            Console.WriteLine(taschenrechner.GetInput());
        }
    }
}
 
  • Gefällt mir
Reaktionen: Physikbuddha, JohnStorm, mfJade und eine weitere Person
Ohne mir den Code ohne Code Tags im Detail anschauen zu wollen:

Wenn du Punkt vor Strich rechnen willst, musst du entsprechend innerhalb der eingegebenen Aufgabe nach * bzw. / suchen und die dazugehörigen Parameter davor bzw. danach als erstes berechnen. Das heißt du kannst den String der Aufgabe nicht einfach von vorne angehen, sondern musst ihn in die Teilaufgaben splitten.
Erschwert wird das ganze am Ende natürlich noch durch Klammern, die noch eine höhere Priorität haben.

So wie es auf den ersten Blick aussieht, nimmst du aber jede Zahl und jeden Operator einzeln auf und rechnest das anschließend auch der Reihe nach so ab. Klar, dass der Taschenrechner dann + vor * berechnet, weil er die Aufgabe stur von vorne rechnet.
 
Ich bin Anfänger und habe von nichts Ahnung also bitte kann mir jemand helfen ich brauche es sehr dringend in C# also besser gesagt brauche ich einen Echtzeit Taschenrechner wie bei einem iPhone. Meine Note hängt davon ab, also kann mir bitteeee bitte jemand helfen bei dem Teil mit Punkt vor Strich besser gesagt KLAPUSTRI Regel. Bitte ich brauche Hilfe
 
@tollertyp : Das habe ich jetzt im formatierten Code (thx @fexxianosch) auch gesehen. Aber ich gehe jede Wette ein, dass das die nächste Stufe der Aufgabe sein wird, also warum nicht gleich mit berücksichtigen ;)

Prinzipiell gibt es mehrere Ansätze wie man das Problem lösen kann. Einer davon wäre die Polnische Notation, ein anderer die Rekursion. Beides beinhaltet aber eine grundlegende Umstrukturierung des bestehenden Codes.
 
KLAPUSTRI? Das ding verarbeitet ja nicht mal klammern...
 
wahappen1 schrieb:
Ich bin Anfänger und habe von nichts Ahnung
Aber Du hast im Kurs oder Unterricht C# gelernt?
wahappen1 schrieb:
Meine Note hängt davon ab
Deine Note hängt davon ab nicht unsere. Daher ist es auch Dein Job das umzusetzen. Bisher sieht man leider keinerlei Ansatz Deiner Arbeit, wobei man Dich unterstützen könnte. Dir die Arbeit komplett abzunehmen, wäre gegen die Forenrichtlinien.

Wir kennen zudem nicht einmal die Aufgabe, da könnten Voraussetzungen drinstehen, die sich direkt auf die Lösungsansätze auswirken.
 
  • Gefällt mir
Reaktionen: BAGZZlash, JohnStorm, Der Lord und 3 andere
wahappen1 schrieb:
Ich bin Anfänger und habe von nichts Ahnung
[..]
Meine Note hängt davon ab
Das ist traurig, aber daran können wir leider auch nichts ändern. Es ist ja nicht so, dass bei dir nur etwas "nicht funktioniert", du hast es ja gar nicht versucht. Gemäß der Forenregeln dürfen wir dir gar nicht helfen, wenn keine erkennbare Eigenleistung erbracht wurde. Und bisher sehe ich die leider nicht. Wir können maximal Hinweise geben wie du vorgehen musst, aber dir wird hier (hoffentlich) niemand fertigen Code präsentieren.

Noten sind dazu da, deine Leistung zu bewerten. Und wenn du es nicht kannst, ist die schlechte Note Sinn der Sache, so leid es mir tut.

Du hast aber immerhin Lösungsansätze bekommen, Stichworte nach denen du suchen kannst, um eine Lösung zu finden - von mir aus auch eine fertige. Du musst selbst wissen ob es dich weiterbringt, wenn du eine mäßig-gute Note bekommst, aber eigentlich auf dem Stand einer 5 bist. Sowas rächt sich eher früher als später, weil das Bisherige als gegeben vorausgesetzt wird.
 
  • Gefällt mir
Reaktionen: Oelepoeto, BAGZZlash, tollertyp und 5 andere
Amaoto schrieb:
Du kannst z.B. das hier als Idee nehmen:
http://www.crystaltenn.com/2016/08/simple-calculator-with-order-of.html

Es ist etwas kompakter mit RegEx, aber es würde auch mit gewöhnlichem Pattern-Matching funktionieren. Im Ausdruck nach "*" und "/" suchen, diese Operationen zuerst ausführen, den Teil mit dem Ergebnis ersetzen und von Anfang wiederholen.
Ich habe damit versucht aber ChatGPT versetzt es immer noch falsch. Die Aufgabe ist ein Echtzeit Taschenrechner wie bei einem iPhone zu machen. Falls möglich bitte schreibt die Zeilen die mir in dem Code fehlen. Ich habe vor kurzen die Ausbildung begonnen und ich verstehe nicht ganz was ihr schreibt :(
 
wahappen1 schrieb:
Nicht mal ChatGPT kann es.

Also wenn man bei ChatGPT nach einen Taschenrechner in C# fragt, der Klammer vor Punkt vor Strich beherrschen soll, kommt direkt ein Code raus der Funktioniert.

C#:
using System;

class Calculator
{
    static void Main(string[] args)
    {
        Console.WriteLine("Welcome to the Calculator!");
        while (true)
        {
            Console.Write("Enter an expression (or 'exit' to quit): ");
            string input = Console.ReadLine();
            if (input.ToLower() == "exit")
                break;

            try
            {
                double result = EvaluateExpression(input);
                Console.WriteLine($"Result: {result}");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error: {ex.Message}");
            }
        }
    }

    static double EvaluateExpression(string expression)
    {
        // Parsing the expression
        expression = expression.Replace(" ", ""); // Removing spaces
        return EvaluateAdditionSubtraction(expression);
    }

    static double EvaluateAdditionSubtraction(string expression)
    {
        int lastOperatorIndex = -1;
        char[] operators = { '+', '-' };

        for (int i = 0; i < expression.Length; i++)
        {
            char currentChar = expression[i];
            if (currentChar == '(')
            {
                int closingBracketIndex = FindClosingBracket(expression, i);
                double result = EvaluateAdditionSubtraction(expression.Substring(i + 1, closingBracketIndex - i - 1));
                expression = expression.Remove(i, closingBracketIndex - i + 1).Insert(i, result.ToString());
                i--;
            }
            else if (Array.IndexOf(operators, currentChar) != -1)
            {
                lastOperatorIndex = i;
            }
        }

        if (lastOperatorIndex != -1)
        {
            char op = expression[lastOperatorIndex];
            double left = EvaluateAdditionSubtraction(expression.Substring(0, lastOperatorIndex));
            double right = EvaluateAdditionSubtraction(expression.Substring(lastOperatorIndex + 1));
            return op == '+' ? left + right : left - right;
        }
        else
        {
            return EvaluateMultiplicationDivision(expression);
        }
    }

    static double EvaluateMultiplicationDivision(string expression)
    {
        int lastOperatorIndex = -1;
        char[] operators = { '*', '/' };

        for (int i = 0; i < expression.Length; i++)
        {
            char currentChar = expression[i];
            if (currentChar == '(')
            {
                int closingBracketIndex = FindClosingBracket(expression, i);
                double result = EvaluateMultiplicationDivision(expression.Substring(i + 1, closingBracketIndex - i - 1));
                expression = expression.Remove(i, closingBracketIndex - i + 1).Insert(i, result.ToString());
                i--;
            }
            else if (Array.IndexOf(operators, currentChar) != -1)
            {
                lastOperatorIndex = i;
            }
        }

        if (lastOperatorIndex != -1)
        {
            char op = expression[lastOperatorIndex];
            double left = EvaluateMultiplicationDivision(expression.Substring(0, lastOperatorIndex));
            double right = EvaluateMultiplicationDivision(expression.Substring(lastOperatorIndex + 1));
            if (op == '*')
                return left * right;
            else if (op == '/')
            {
                if (right == 0)
                    throw new DivideByZeroException("Division by zero error.");
                return left / right;
            }
        }
        return double.Parse(expression);
    }

    static int FindClosingBracket(string expression, int openingBracketIndex)
    {
        int count = 0;
        for (int i = openingBracketIndex; i < expression.Length; i++)
        {
            if (expression[i] == '(')
                count++;
            else if (expression[i] == ')')
            {
                count--;
                if (count == 0)
                    return i;
            }
        }
        throw new ArgumentException("No closing bracket found.");
    }
}

Und nein du sollst jetzt nicht den Code kopieren, dass würde definitiv auffallen und als Betrugsversuch gewertet.
 
wahappen1 schrieb:
Die Aufgabe ist ein Echtzeit Taschenrechner wie bei einem iPhone zu machen.
Dafür solltest du ggf. auch schauen, wie du die Konsole in der art pro Tastenanschlag "aktualisierst". Dazu kommt es noch Fehler abzufangen, damit man keinen Murks anzeigt. Ansonsten gehen die hier bereits geposteten Lösungsansätze bereits in die richtige Richtung.
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben