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

}
}
}
 
wahappen1 schrieb:
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 :(
Es fehlen aber nicht einfach nur ein paar Zeilen. Das Grundkonzept ist unzureichend. Man hat dich nun schon mehrfach darauf hingewiesen, dass du die Aufgabe gewissermaßen vorausschauend betrachten musst und nicht stur von vorne einzeln einlesen.

Wenn du vor kurzem deine Ausbildung begonnen hast, dann gehört "scheitern" im übrigen dazu. Man lernt durch Fehler. Würde dir jetzt jemand eine perfekte Lösung mittels Rekursion präsentieren, die im übrigen mit recht wenigen Zeilen auskäme, weil derselbe Code eben .. .. rekursiv aufgerufen wird, hättest du zwar etwas, das du deinem Ausbilder präsentieren könntest, aber bei der nächsten Aufgabe stündest du genau so wie der Ochs vorm Berg wie jetzt, weil du nichts davon gelernt hast.


Man nehme die Aufgabe "2+2*8"
Nun suche man den gesamten Aufgabenstring nach "*" ab.
Anschließend nimmt man die Operatoren davor und danach.
Produkt berechnen und im Aufgabenstring ersetzen.
Neuer Aufgabenstring lautet nun "2+16"
Nun suche man den gesamten Aufgabenstring nach "*" ab.
Kein "*" gefunden.
Aufgabe mit + fertig rechnen.


Die Stelle, an der man nach * sucht, ist ein Ansatzpunkt für eine Rekursion oder zumindest eine Schleife, weil ja mehrere * in der Aufgabe stecken können und sie alle der Reihe nach berechnet und ersetzt werden sollen. Ergänzen musst du das anschließend noch mit derselben Prozedur mit "/".

Klammern, so sie denn gefordert sind, müssen natürlich entsprechend vorher behandelt werden, also erstmal den Aufgabenstring nach "(" und ") durchsuchen und den Inhalt dazwischen sozusagen als Aufgabenstring2 berechnen, wie oben inkl. "*" und "/".
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Matzegr, Der Lord, JohnStorm und 2 andere
Matzegr schrieb:
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.
es geht nicht zum Beispiel wenn ich 2+3*2 rechne kommt 10 raus und nicht 8 :(
 
Bei mir kommt 8 raus wenn ich den Code im Online Compiler teste.
Irgendwas machst du wohl falsch.
 
wahappen1 schrieb:
es geht nicht zum Beispiel wenn ich 2+3*2 rechne kommt 10 raus und nicht 8 :(
In deinem Code ist das so, ja. Der ChatGPT Code rechnet richtig. Warum tut er das? Weil er mit Rekursion arbeitet. Das heißt, dass der Code sich immer wieder selbst aufruft und bei jedem Aufruf einen Teil der Aufgabe löst bis sich die Rekursion am Ende wieder aufribbelt und das Endergebnis berechnet wird.

Effektiv sucht der Code nach ( ) - falls vorhanden - nimmt sich den Kram dazwischen und guckt sich den Aufgabenstring an bzw. den Operator. Je nachdem welchen Operator er findet, rechnet er +- oder eben */.

Zugebenermaßen ist der Code meiner Meinung nach nicht besonders übersichtlich und man könnte es deutlich lesbarer umsetzen, aber es funktioniert. Schau dir den Code genau an und versuche ihn nachzuvollziehen.
 
Kläre doch nochmal mit dem Steller der Aufgabe, was genau gefordert ist.
Eine konkrete Aufgabenbeschreibung sieht definitiv anders aus ("Echtzeit Taschenrechner wie bei einem iPhone").

Kann der Taschenrechner beim iPhone nicht auch Dinge wie Wurzel, Potenzen, Klammern etc?
 
@tollertyp
In der Tat so ein Taschenrechner im iPhone kann sehr viel.
Ich vermute aber das es nur die Basisrechenarten sind.
Eigentlich müsste dazu sehr viel im Internet zu finden sein.
 

Anhänge

  • IMG_0597.png
    IMG_0597.png
    142,5 KB · Aufrufe: 34
Nur so zwischendurch als Kuriosum: der Windows Taschenrechner hat ja mehrere Betriebsarten - z.B. Standard und Wissenschaftlich. Die rechnen unterschiedlich:

1710414820803.png

1710414838031.png
 
  • Gefällt mir
Reaktionen: BeBur
tollertyp schrieb:
Kläre doch nochmal mit dem Steller der Aufgabe, was genau gefordert ist.
Eine konkrete Aufgabenbeschreibung sieht definitiv anders aus ("Echtzeit Taschenrechner wie bei einem iPhone").

Kann der Taschenrechner beim iPhone nicht auch Dinge wie Wurzel, Potenzen, Klammern etc?
ja ich muss es auch programmieren dass es Wurzel, Potenzen usw rechnet, ich bin aber noch nicht so weit, ich versuche es zuerst Punkt vor Strich zu rechnen, ja eure Antworten sind alle hilfreich aber ich verstehe nicht was ich in Code geben soll und wenn ich ChatGPT frage bekomme ich immer falsche Ergebnisse
Fujiyama schrieb:
Bei mir kommt 8 raus wenn ich den Code im Online Compiler teste.
Irgendwas machst du wohl falsch.
Mir kommt es 10 in Visual Studio, ich muss es dort auch machen
 
Was erwartest du eigentlich genau von uns?
Wie gesagt: Dein Code kann es grundlegen nicht. Du müsstet vieles, wenn nicht alles, neu schreiben.
Ein Beispiel wie es gehen könnte, wurde dir schon gepostet. So abgeben würde ich es aber nicht.
Einen anderen fertigen Code wird dir keiner liefern.
Wenn du selbst was neues geschrieben hast, oder gezielte Fragen hast, dann können wir dir auch gezielt helfen.
 
  • Gefällt mir
Reaktionen: Der Lord, Raijin, Fujiyama und eine weitere Person
wahappen1 schrieb:
eure Antworten sind alle hilfreich aber ich verstehe nicht was ich in Code geben soll
Ich hab dir die grundlegende Vorgehensweise doch dargelegt. Umsetzen musst du es natürlich selbst. Dazu benötigst du lediglich ein wenig mit String-Manipulation, Zeichen suchen, Substrings, etc. Der ChatGPT Code macht es ähnlich.
 
Hach, da kommen Nostalgiegefühle auf. So einen Taschenrechner hab ich früher mal in Turbo Pascal (das ist eine Programmiersprache, an die Jugend hier :D)geschrieben.
 
Aus dem Grund konvertiert man zuerst von Infix nach Postfix oder Präfix. Dann geht das ganze wesentlich einfacher.
Würde ich mir anschauen.
Aber das wie, musst du selber rausfinden.

Infix ExpressionPrefix ExpressionPostfix Expression
A + B · C + D+ + A · B C DA B C · + D +
(A + B) · (C + D)· + A B + C DA B + C D + ·
A · B + C · D+ · A B · C DA B · C D · +
A + B + C + D+ + + A B C DA B + C + D +
 
  • Gefällt mir
Reaktionen: titanskin
Naja, aber ich muss doch erstmal umwandeln. Dann kann ich doch auch gleich die entsprechenden Rechengesetze einbauen.

Ich verstehe den Vorteil der fehlenden Klammern. Aber programmatisch muss ich doch erst die Umrechnung einbauen und anschließend rechnen…
 
  • Gefällt mir
Reaktionen: Raijin
Und wenn die Anforderung ist einen Taschenrechner wie in iOS, dann weiß ich nicht, ob es um die Polnische Notation geht...
aber oft genug geht es eh gar nicht, was gebraucht wird, sondern nur darum, mit seinem Fachwissen etwas protzen zu können.

Der Taschenrechner in iOS beherrscht übrigens das exotische Konstrukt der Klammern.
 
  • Gefällt mir
Reaktionen: Raijin
Der_Picknicker schrieb:
Naja, aber ich muss doch erstmal umwandeln. Dann kann ich doch auch gleich die entsprechenden Rechengesetze einbauen.
In der Tat. Eine Umwandlung würde nahezu denselben Aufwand erfordern wie eine "normale" Berechnung, nur dass man eben nicht im letzten Schritt +-*/ rechnet, sondern den Aufgabenstring umbaut. Der Ansatz mit der Notation beginnt daher schon bei der Eingabe, was wiederum voraussetzt, dass der Eingebende weiß wie das geht ;)

Auf Seite #1 hatte ich die Notation auch schon angesprochen, aber zu dem Zeitpunkt war noch nicht klar, dass in der Aufgabe explizit der iPhone-Taschenrechner erwähnt wird - oder prinzipiell jeder "normale" Taschenrechner.

Der TE hat seinen Account im übrigen schon wieder abgemeledet. Er fand es wohl doof, dass wir ihm seine Hausaufgaben nicht abschreibfertig serviert haben.
 
  • Gefällt mir
Reaktionen: tollertyp und Incanus
Status
Für weitere Antworten geschlossen.
Zurück
Oben