So, wie der hier steht, kann er gar nicht laufen:
private static char GetOperator(string gleichung)
{ //mal rechnung
for (int i = 0; i < gleichung.Length; i++)
{
char zeichen = gleichung;
[...]
}
[...]
}
Der Parameter "gleichung" dieser Methode ist ein string. Die Variable "zeichen" ist aber ein char und dennoch wird Variable mit "gleichung" intialisiert.
char zeichen = gleichung;
Beides sind aber unterschiedliche Typen.
so wie ich das verstanden habe, kommt das mit den Schleifen von seinem Chef.
So wie ich da sehe fehlen hier noch grundlegende Kenntnisse.
Bitte erst mal ein wenig üben, bevor du an dem Rechner weitermachst.
https://www.codecademy.com/learn/learn-c-sharp
https://docs.microsoft.com/de-de/dotnet/csharp/getting-started/
Lies/Arbeite dich erstmal in die Sprache ein
Lagere das Zeug aus deiner Main() erstmal ein eine eigene Methode, die dann so lange läuft, wie deine Methode true zurückgibt (also an die Schleife). Ob true oder false zurückkommen entscheidet halt der Benutzer, wenn du abfragst, ob er noch eine Rechnung machen will.
Übrigens: Das hättest du locker in den anderen Thread packen können. Ist schließlich das gleiche Thema.
Die Lösung werde ich dir hier nicht präsentieren, aber vielleicht ein etwas anschaulicheres Bild:
solange (Bedingung!=Erfuellt)
{
Rechne,Rechne,Rechne()
wenn (fertiggerechnet)
{
Bedingung=Erfuellt
}
ansonsten
{
Bedingung=NichtErfuellt
}
}
Du kannst das Programm solange laufen lassen, wie $answer=false ist. Am Ende des Programms lässt du dann mit einer Eingabe die Varible $answer befüllen. Entweder mit true oder false, je nachdem was dein User eingibt.
Das sollte für so ein Basis-Tutorial denke mal Okay sein.
Hey du Totengräber, achte mal aufs Datum.
Aber ich bin mal so nett:
http://www.ne555.at/2014/index.php/pc-programmierung/einfuehrung-c/215-programmierbeispiel-quadratische-gleichung.html
Warum schreibst Du nicht zuerst einmal Deine komplette Berechnung in einen Syntaxbaum und traversierst diesen dann entsprechend. In den Blättern stehen die Zahlen, in den Knoten die Operatoren. Damit hast direkt Punkt vor Strichrechnung usw, sowie korrekte Klammerverarbeitung?
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
}
}
}
Meine Postings beziehen sich nicht auf eine Umsetzung in C# sondern um die theoretischen Grundlagen für die Problemlösung
Sicher. Ich verstehe es so, dass eine Konsolenanwendung ausreichend ist, obwohl man ja auch ein Form machen kann, in dem man die zu berechnende Funktion auch als String in ein Textfeld eingeben kann. Die Progammlogik bleibt gleich