Laden...

Wie kann ich die jeweilige Rechenart von der Methode Mathoperator nutzen?

Erstellt von PresidentOfNoobistan vor 3 Jahren Letzter Beitrag vor 3 Jahren 349 Views
P
PresidentOfNoobistan Themenstarter:in
6 Beiträge seit 2021
vor 3 Jahren
Wie kann ich die jeweilige Rechenart von der Methode Mathoperator nutzen?

Hallo liebe Community,

aufgrund meines Pflichtpraktikums habe ich soweit mit der Programmiersprache C# angefangen und habe so meine Probleme. Vor allem fehlt es mir an der Programmierlogik, Tipps hierfür sind mehr als willkommen 🙂

Aber kommen wir mal zu meinem eigentlichen Anliegen, ich möchte einen Taschen mit einer grafischen Oberfläche programmieren und stehe jetzt vor mehreren Problemen.

Zuerst meine Logik; es befinden sich 2 Textboxen, die Erste ist oben und ist etwas kleiner als die Zweite. In der oberen sollen die ganzen Eingaben angezeigt werden und in der unteren nur das Ergebnis. Ich habe mir soweit 2 Listen erstellt, eine für die eingegebenen Zahlen und eine für die Operatoren. Dort soll das abgespeichert werden und dann nochmals überprüft werden ob eine Punkt-vor-Strich-Methode notwendig ist, hierfür müsste ich auch noch einiges tun. Mein Problem ist jetzt der folgende, wie entnehme ich all diese Eingaben und füge sie zu einer logischen Rechnung zusammen? Und es soll erst das Ergebnis im großen Textbox angezeigt werden nachdem man auf "=" geklickt hat. Könnt ihr mir ein paar Tipps für die Punkt-vor-Strich Methode geben? Wie kann ich die jeweilige Rechenart von der Methode Mathoperator nutzen? Wobei die auch erweitern werden müsste, da ich mit mehr als 2 Zahlen rechnen möchte..

Ich bedanke mich schon mal ganz herzlich für die Hilfestellungen.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Taschenrechner
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private double x = 0;
        String zahl = "";

        List<double> zahlenListe = new List<double>();
        List<string> operatorenListe = new List<string>();        
        
        private void CmdClearAll_Click(object sender, EventArgs e)
        {
            txtUnten.Text = "";
            txtOben.Text = "";
        }

        private void CmdLoeschen_Click(object sender, EventArgs e)
        {
            txtOben.Text = txtOben.Text.Substring(0, txtOben.TextLength - 1);
        }

        private void CmdEins_Click(object sender, EventArgs e)
        {
            txtOben.Text += "1";
            txtUnten.Text += "1";
            zahl = zahl += "1";
        }

        private void CmdZwei_Click(object sender, EventArgs e)
        {
            txtOben.Text += "2";
            txtUnten.Text += "2";
            zahl = zahl += "2";
        }

        private void CmdDrei_Click(object sender, EventArgs e)
        {
            txtOben.Text += "3";
            txtUnten.Text += "3";
            zahl = zahl += "3";
        }

        private void CmdVier_Click(object sender, EventArgs e)
        {
            txtOben.Text += "4";
            txtUnten.Text += "4";
            zahl = zahl += "4";
        }

        private void CmdFuenf_Click(object sender, EventArgs e)
        {
            txtOben.Text += "5";
            txtUnten.Text += "5";
            zahl = zahl += "5";
        }

        private void CmdSechs_Click(object sender, EventArgs e)
        {
            txtOben.Text += "6";
            txtUnten.Text += "6";
            zahl = zahl += "6";
        }

        private void CmdSieben_Click(object sender, EventArgs e)
        {
            txtOben.Text += "7";
            txtUnten.Text += "7";
            zahl = zahl += "7";
        }

        private void CmdAcht_Click(object sender, EventArgs e)
        {
            txtOben.Text += "8";
            txtUnten.Text += "8";
            zahl = zahl += "8";
        }

        private void CmdNeun_Click(object sender, EventArgs e)
        {
            txtOben.Text += "9";
            txtUnten.Text += "9";
            zahl = zahl += "9";
        }

        private void CmdNull_Click(object sender, EventArgs e)
        {
            txtOben.Text += "0";
            txtUnten.Text += "0";
            zahl = zahl += "0";
        }

        private void CmdKomma_Click(object sender, EventArgs e)
        {
            txtOben.Text += ",";
            zahl = zahl += ".";
        }        

        private void CmdSin_Click(object sender, EventArgs e)
        {
            txtUnten.Text += "" + Math.Sin(x / 180 * Math.PI);
        }

        private void CmdPlus_Click(object sender, EventArgs e)
        {
            zahlenListe.Add(double.Parse(zahl));
        }        
      
        private double MathOperation(double y, double x, string op)
        {
            switch (op)
            {
                case "+":
                    return x + y;
                    break;
                case "-":
                    return x - y;
                    break;
                case "*":
                    return x * y;
                    break;
                case "/":
                    return x / y;
                    break;
            }
            return 0;
        }

        private void CmdTan_Click(object sender, EventArgs e)
        {
            txtUnten.Text += "" + Math.Tan(x / 180 * Math.PI);
        }

        private void CmdCos_Click(object sender, EventArgs e)
        {
            txtUnten.Text += "" + Math.Cos(x / 180 * Math.PI);
        }

        private void CmdGleich_Click(object sender, EventArgs e)
        {
            zahlenListe.Add(double.Parse(txtUnten.Text));
            double ergebnis = zahlenListe[0] + zahlenListe[1];
            txtUnten.Text = "" + ergebnis;
        }
    }
}

309 Beiträge seit 2020
vor 3 Jahren

aufgrund meines Pflichtpraktikums habe ich soweit mit der Programmiersprache C# angefangen und habe so meine Probleme. Vor allem fehlt es mir an der Programmierlogik, Tipps hierfür sind mehr als willkommen 🙂

Dein Quelltext ist ohne Kommentare echt schwer zu lesen.

Willst du Terme mit mehreren Operatoren wie "34243+(34/322)" lösen können? Das ist nicht gerade trivial wenn man es selbst parsen will 😁
Ich denke das Pflichtpraktikum will ehr X OPERATION Y = ? oder?

4.939 Beiträge seit 2008
vor 3 Jahren

Hallo,

da hast du dir aber eine für Anfänger schwierige Aufgabe gestellt.
Du solltest ersteinmal deinen Taschenrechner so programmieren, daß direkt nach Eingabe des Operators die Rechnung ausgeführt wird (also ohne Punkt-vor-Strich).

Üblicherweise wird ein Rechner mit Beachtung der Operatorprioritäten (Punkt-vor-Strich) mithilfe eines Operatorstacks implementiert, der sich an Umgekehrte polnische Notation (UPN) orientiert, s. z.B. Simple Arithmetic Expression Evaluator oder Stack-based calculator (auch wenn der Code in C++ ist).

Alternativ könntest du, wie auch schon von @JimStark angesprochen, einen Parser benutzen, z.B. meinen Parser für mathematische Formeln.

P
PresidentOfNoobistan Themenstarter:in
6 Beiträge seit 2021
vor 3 Jahren

Hallo,

das es schwierig habe ich soweit schon gemerkt. Ich habe mich auch schon dazu entschieden das Gesamte nur auf Zwei eingegebene zu verrechnen, reduziert. In diesem Fall verstehe ich es aber nicht wie ich es hinbekomme den Operator einzulesen, so das es dann die dazugehörige Rechnung aus des Methode "MathOperation" entnimmt und verrechnet...
Fällt dir noch weiteres auf, was falsch ist?

P
PresidentOfNoobistan Themenstarter:in
6 Beiträge seit 2021
vor 3 Jahren

Eigentlich wollte der Praktikumsbetrieb was anderes aber ich dachte mir hiermit fange ich mal an und dann weiter geht´s...
Ach ist der Code wirklich so schlecht zu lesen?

4.939 Beiträge seit 2008
vor 3 Jahren

In der Methode CmdGleich_Click mußt du nur MathOperation mit den passenden Parametern (aus deinen Listen) aufrufen.
Dazu mußt du aber noch in CmdPlus_Click (und den anderen zweistelligen Operatormethoden) den ausgewählten Operator in die operatorenListe eintragen (bzw. wie schon geschrieben, wäre hier Stack<string> besser, so daß du die Elemente mittels Push und Pop hinzufügen und wieder davon entfernen kannst).

PS: Schlecht zu lesen finde ich deinen Code nicht, jedoch hast du noch ziemlich viele Code-Wiederholungen drin.
Du könntest z.B. folgenden Zeilen in eine eigene Methode AddDigit (mit Parameter) auslagern:


txtOben.Text += "1";
txtUnten.Text += "1";
zahl = zahl += "1";

Und du könntest sogar alle 10 Ziffernbuttons mit derselben Ereignismethode verknüpfen und dann dessen Text (Ziffer) auslesen:


private void CmdDigit_Click(object sender, EventArgs e)
{
  Control control = sender as Control;
  if (control != null)
  {
    string digit = control.Text;    
    AddDigit(digit); // obige Methode mit Parameter aufrufen
  } 
}

(ähnlich ginge es dann auch für alle Operatoren)

P
PresidentOfNoobistan Themenstarter:in
6 Beiträge seit 2021
vor 3 Jahren

Hey Th69,
vielen lieben Dank für deine Hilfe, du hast mir definitiv weitergeholfen!
Ich habe es soweit erfolgreich beendet und habe mich an mein Zweites Projekt gewagt.
BTW da gibt es auch ein Pröblemchen😜 (es wird definitiv nicht der letzte sein........)