c# Taschenrechner

wahappen1

Grünschnabel
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());

}
}
}
 
Erstmal, bitte Quellcode mit enstprechender Syntaxansicht anzeigen:
C#:
// C# Code
(über die 3 Punkte in der Menüleiste (Mehr Optionen ...))

dann, wenn du Punkt vor Strich Rechnung beachten willst musst du anders vorgehen.
Wenn ichs richtig sehe gibst du Zahl ein 123 dann den entsprechenden Operator +-*/ die 2te Zahl 456 und errechnest das ergebnis

Zur Beachtung von Punkt vor Strichrechnung musst du anders vorgehen.
Zuerst muss die komplette Formel angegeben werden
123+456*2-3
nach der Eingabe analysiert du die eingegebene formel

C#:
string ausgangsformel = "123+456*2-3"
string wert=rechnen(ausgangsformel, true); //zuerst nur Multiplikator und Division
wert=rechnen(wert, false); //jetzt mit neuer Formel/Wert rest/alles

string rechnen(string formel, bool punktVorStrich)
{
    for(int i = 0; i < formel.Length; i++)
    {
        if(formel[i] == '*')
        {
            //Ermittlung Zahl vor dem MUltiplikator
            int startZeichen;
            for(int j=i-1; j<=0; j--)
            {
                if(formel[j] == '+' || formel[j] == '-' || formel[j] == '*' || formel[j] == '/')
                {
                    startZeichen=j+1;
                   break;
                }
            }
            int ersteZahl=int.Parse(formel.SubString(startZeichen, i-startZeichen-1)); //unsere erste Zahl aus dem String ziehen
    
            //Ermittlung Zahl nach dem Multiplikator
            int endeZeichen;
            for(int j=i+1; j>formel.Length; j++)
            {
                if(formel[j] == '+' || formel[j] == '-' || formel[j] == '*' || formel[j] == '/')
                {
                    endeZeichen=j-1;
                   break;
                }
            }
            int zweiteZahl=int.Parse(formel.SubString(i+1, i-endeZeichen-1)); //unsere zweite Zahl aus dem String ziehen
    
            formel=formel.Replace(formel.SubString(startZeichen, endeZeichen-startZeichen), (ersteZahl*zweiteZahl).ToString()); //wir ersetzen in der Formel jetzt den Teil mit der ersten Zahl den Multipliator und der 2ten zahl und schreiben unser ergebnis rein
            i=-1; //wir setzen i auf -1 damit die formel wieder von vorne geprüft wird
        }
        else if(formel[i] == '/')
        {
            //todo ähnlich verwahren wie der Multiplikator nur das beide zahlen geteilt werden
        }
        else if(formel[i] == '+' && punktVorStrich == false)
        {
            //todo ähnlich verwahren wie der Multiplikator nur das beide zahlen addiert werden
        }
        else if(formel[i] == '-' && punktVorStrich == false)
        {
            //todo ähnlich verwahren wie der Multiplikator nur das beide zahlen subtrahiert werden
        }
    }

return formel;
}
ungetesteter Quellcode, und hab versucht es eifnach zu halten damit du siehst wie du vorgehen könntest
die formel wird solange analysiert wie es rechenoperationen findet

achtung, wenn die formel zu beginn mit einer negativenzahl beginnt funtkioniert es nicht da uns die erste Zahl dazu fehlt, da könnte man jetzt zum beispiel prüfen ob die formel mit - beginnt und einfach noch eine 0 bei der formel am anfang mit zu hängen, das wir anstatt z.B. -2+3 dann 0-2+3 als formel haben
 
Zuletzt bearbeitet:
Da wir hier ohne Klammern arbeiten, wäre Rekursion ne Variante?
Hab jetzt nicht wirklich lang darüber nachgedacht
Im Sinne von:
1) Fange an, den gesamten "Input"-String zu parsen, Zeichen für Zeichen, bis wir auf einen Operator stossen (egal welchen) --> Führendes Minus (unäres Minus) mal jetzt aussen vor. Siehe Antwort von Spyke
2) Ist Operator gefunden, haben wir den "linken" Operanden
3) Prüfung auf Operator-Präzedenz (Punkt vor Strich).
3a) Ist der Operator "Punkt" prüfe/parse im restlichem Input-String bis zum nächsten Operator. Jetzt haben wir den "rechten" Operanden. Bilde das Ergebnis, und gib es zurück
3b) Ist der Operator "Strich" springe in die Rekursion, mit übergabe des restl. Input-Strings als neue "Quelle"
4) Goto 1
 

Neue Beiträge

Zurück