so sollte es relativ einfach gehen
-eingabe (werte und operanten merken)
-anschließend aus dieser liste die operationen von der höchsten zur kleinsten priorität abarbeiten
-bleibt nurnoch ein wert und keine operation mehr hat man das ergebnis
zu tun
erstmal ein neues leeres form erstellen und 6 buttons adden und code einfügen
das beispielprojekt hat nur addition, multiplikation und potenzieren und als wert nur die zahl 3
-erweitern um ziffern {0..9}/3
-ziffern untereinander zu zahlen zusammenfassen (sind 2 werte an stelle i in der liste ohne rechenoperation benachbart wert=wert*10+wert[i+1], lösche wert[i+1])
-erweitern um subtraktion/division
-fehlerbehandlung (doppelte rechenoptoren abfangen etc)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication5
{
public partial class Form1 : Form
{
private List<Teil> m_teile;
public enum operation
{
plus,
minus,
mal,
durch,
hoch,
}
public Form1()
{
InitializeComponent();
button1.Text = "3";
button2.Text = "+";
button3.Text = "*";
button4.Text = "^";
button5.Text = "Neu";
button6.Text = "=";
m_teile = new List<Teil>();
}
private void button1_Click(object sender, EventArgs e)
{
m_teile.Add(new Teil(3));
}
private void button2_Click(object sender, EventArgs e)
{
m_teile.Add(new Teil(Operation.plus));
}
private void button3_Click(object sender, EventArgs e)
{
m_teile.Add(new Teil(Operation.mal));
}
private void button4_Click(object sender, EventArgs e)
{
m_teile.Add(new Teil(Operation.hoch));
}
private void button5_Click(object sender, EventArgs e)
{
m_teile = new List<Teil>();
}
private void button6_Click(object sender, EventArgs e)
{
//schrittweise aufloesen
//erster schritt die ziffern zu zahlen zusammenfassen
//!!!!todo im beispiel nur mit einstelligen ziffern gearbeitet
//zweiter schritt potenzen ausrechnen
//rechten und linken operand + rechenzeichen aus der liste löschen
//ergebnis an deren stelle einfügen
for (int i = 0; i < m_teile.Count; i++)
{
if (m_teile[i].Art == Teil.ArtEnum.RechenOperation && m_teile[i].Operation == Operation.hoch)
{
int erg = (int)Math.Pow(m_teile[i - 1].Wert, m_teile[i + 1].Wert);
m_teile[i - 1].Wert = erg; //wert vor dem operand wird überschrieben spart herrauslöschen und anschließendes neu einfügen
m_teile.RemoveRange(i, 2);
i--;//i um eins verringern da durch das löschen der aktuellen position dort nun ein noch nicht verarbeiteter wert steht
}
}
//dritter schritt multiplizieren (todo dividieren)
for (int i = 0; i < m_teile.Count; i++)
{
if (m_teile[i].Art == Teil.ArtEnum.RechenOperation && m_teile[i].Operation == Operation.mal)
{
int erg = m_teile[i - 1].Wert * m_teile[i + 1].Wert;
m_teile[i - 1].Wert = erg; //wert vor dem operand wird überschrieben spart herrauslöschen und anschließendes neu einfügen
m_teile.RemoveRange(i, 2);
i--;//i um eins verringern da durch das löschen der aktuellen position dort nun ein noch nicht verarbeiteter wert steht
}
}
//letzter schritt addieren (todo subtrahieren)
for (int i = 0; i < m_teile.Count; i++)
{
if (m_teile[i].Art == Teil.ArtEnum.RechenOperation && m_teile[i].Operation == Operation.plus)
{
int erg = m_teile[i - 1].Wert + m_teile[i + 1].Wert;
m_teile[i - 1].Wert = erg; //wert vor dem operand wird überschrieben spart herrauslöschen und anschließendes neu einfügen
m_teile.RemoveRange(i, 2);
i--;//i um eins verringern da durch das löschen der aktuellen position dort nun ein noch nicht verarbeiteter wert steht
}
}
//m_teile sollte nurnoch 1 eintrag haben dieser ist das ergebnis
MessageBox.Show(m_teile[0].Wert.ToString());
}
}
public enum Operation
{
plus,
minus,
mal,
durch,
hoch,
}
public class Teil
{
private ArtEnum m_art;
public ArtEnum Art
{
get { return m_art; }
}
private Operation m_operation;
public Operation Operation
{
get { return m_operation; }
}
private int m_wert;
public int Wert
{
get { return m_wert; }
set { m_wert = value; }
}
public Teil(Operation _op)
{
m_art = ArtEnum.RechenOperation;
m_operation = _op;
}
public Teil(int _wert)
{
m_wert = _wert;
m_art = ArtEnum.Wert;
}
public enum ArtEnum
{
RechenOperation,
Wert
}
}
}