yup
…
using System;
using System.Numerics;
using
System.Windows.Forms;
using
System.Windows.Forms.DataVisualization.Charting;
using
System.Data;
namespace ScientificCalculator
{
public partial class Form1 : Form
{
private Complex result =
Complex.Zero;
private string currentOperation = "";
private bool isNewNumber = true;
private bool isDegree = true;
private TextBox display;
private Chart plotChart;
public Form1()
{
InitializeComponents();
}
private void InitializeComponents()
{
// Form settings
this.Text = "Scientific Calculator with Complex Numbers";
this.Size = new System.Drawing.Size(800, 600);
this.FormBorderStyle = FormBorderStyle.FixedSingle;
this.MaximizeBox = false;
// Display
display = new TextBox
{
Location = new System.Drawing.Point(10, 10),
Size = new System.Drawing.Size(360, 40),
Text = "0",
TextAlign = HorizontalAlignment.Right,
Font = new System.Drawing.Font("Arial", 16)
};
this.Controls.Add(display);
// Plot Chart
plotChart = new Chart
{
Location = new System.Drawing.Point(380, 10),
Size = new System.Drawing.Size(400, 500),
BackColor = System.Drawing.Color.White
};
ChartArea chartArea = new ChartArea
{
AxisX = { Title = "x", Minimum = -10, Maximum = 10, Interval = 2 },
AxisY = { Title = "y", Minimum = -10, Maximum = 10, Interval = 2 }
};
plotChart.ChartAreas.Add(chartArea);
plotChart.Series.Add("Real");
plotChart.Series["Real"].ChartType = SeriesChartType.Line;
plotChart.Series["Real"].Color =
System.Drawing.Color.Blue;
plotChart.Series.Add("Imaginary");
plotChart.Series["Imaginary"].ChartType = SeriesChartType.Line;
plotChart.Series["Imaginary"].Color =
System.Drawing.Color.Red;
this.Controls.Add(plotChart);
// Button layout
string[] buttonLabels = {
"sin", "cos", "tan", "√",
"7", "8", "9", "/",
"4", "5", "6", "*",
"1", "2", "3", "-",
"0", ".", "C", " ",
"ln", "log", "^", "=",
"Deg/Rad", "(", ")", "π",
"i", "conj", "Plot", ""
};
int buttonWidth = 80;
int buttonHeight = 50;
int startX = 10;
int startY = 60;
int spacing = 10;
for (int i = 0; i < buttonLabels.Length; i )
{
if (buttonLabels[i] == "") continue;
Button btn = new Button
{
Text = buttonLabels[i],
Size = new System.Drawing.Size(buttonWidth, buttonHeight),
Location = new System.Drawing.Point(
startX (i % 4) * (buttonWidth spacing),
startY (i / 4) * (buttonHeight spacing)
),
Font = new System.Drawing.Font("Arial", 12)
};
if ("0123456789.".Contains(buttonLabels[i]))
btn.Click = NumberButton_Click;
else if (buttonLabels[i] == "C")
btn.Click = ClearButton_Click;
else if (buttonLabels[i] == "=")
btn.Click = EqualsButton_Click;
else if (buttonLabels[i] == "Deg/Rad")
btn.Click = DegreeRadianToggle_Click;
else if (buttonLabels[i] == "Plot")
btn.Click = PlotButton_Click;
else if (buttonLabels[i] == "i")
btn.Click = ImaginaryButton_Click;
else if (buttonLabels[i] == "conj")
btn.Click = ConjugateButton_Click;
else
btn.Click = OperationButton_Click;
this.Controls.Add(btn);
}
}
private void NumberButton_Click(object sender, EventArgs e)
{
Button btn = (Button)sender;
if (isNewNumber)
{
display.Text = btn.Text == "." ? "0." : btn.Text;
isNewNumber = false;
}
else
{
if (btn.Text == "." && display.Text.Contains(".") && !display.Text.Contains(" "))
return;
if (display.Text == "0" && btn.Text != ".")
display.Text = btn.Text;
else
display.Text = btn.Text;
}
}
private void ImaginaryButton_Click(object sender, EventArgs e)
{
if (isNewNumber)
{
display.Text = "i";
isNewNumber = false;
}
else
{
display.Text = "i";
}
}
private void ConjugateButton_Click(object sender, EventArgs e)
{
try
{
Complex num = ParseComplex(display.Text);
result = Complex.Conjugate(num);
display.Text = FormatComplex(result);
isNewNumber = true;
}
catch
{
MessageBox.Show("Invalid complex number!");
}
}
private void OperationButton_Click(object sender, EventArgs e)
{
Button btn = (Button)sender;
string op = btn.Text;
if (!isNewNumber && currentOperation != "" && !"sin|cos|tan|√|ln|log|conj".Contains(currentOperation))
{
Calculate();
}
if ("sin|cos|tan|√|ln|log".Contains(op))
{
display.Text = op "(";
isNewNumber = true;
}
else if (op == "π")
{
display.Text = Math.PI.ToString();
isNewNumber = true;
}
else
{
if (!isNewNumber)
{
result = ParseComplex(display.Text);
currentOperation = op;
isNewNumber = true;
}
display.Text = " " op " ";
}
}
private void EqualsButton_Click(object sender, EventArgs e)
{
Calculate();
currentOperation = "";
isNewNumber = true;
}
private void ClearButton_Click(object sender, EventArgs e)
{
display.Text = "0";
result =
Complex.Zero;
currentOperation = "";
isNewNumber = true;
plotChart.Series["Real"].Points.Clear();
plotChart.Series["Imaginary"].Points.Clear();
}
private void DegreeRadianToggle_Click(object sender, EventArgs e)
{
isDegree = !isDegree;
((Button)sender).Text = isDegree ? "Deg/Rad" : "Rad/Deg";
}
private void PlotButton_Click(object sender, EventArgs e)
{
try
{
plotChart.Series["Real"].Points.Clear();
plotChart.Series["Imaginary"].Points.Clear();
string function = display.Text.Replace(" ", "");
// Plot from x = -10 to 10 with 0.1 step
for (double x = -10; x <= 10; x = 0.1)
{
Complex y = EvaluateFunction(function, x);
if (!double.IsNaN(y.Real) && !double.IsInfinity(y.Real))
plotChart.Series["Real"].Points.AddXY(x, y.Real);
if (!double.IsNaN(y.Imaginary) && !double.IsInfinity(y.Imaginary))
plotChart.Series["Imaginary"].Points.AddXY(x, y.Imaginary);
}
}
catch (Exception ex)
{
MessageBox.Show("Error plotting function: " ex.Message);
}
}
private Complex ParseComplex(string input)
{
input = input.Replace(" ", "");
if (input == "i") return Complex.ImaginaryOne;
if (input == "-i") return -Complex.ImaginaryOne;
if (!input.Contains("i"))
return new Complex(double.Parse(input), 0);
bool isNegative = input.StartsWith("-");
if (isNegative) input = input.Substring(1);
string[] parts = input.Split(new[] { " ", "-" }, StringSplitOptions.RemoveEmptyEntries);
double real = 0, imag = 0;
if (parts.Length == 1)
{
if (parts[0].Contains("i"))
{
string imagPart = parts[0].Replace("i", "");
imag = imagPart == "" ? 1 : double.Parse(imagPart);
if (input.Contains("-i")) imag = -imag;
}
else
{
real = double.Parse(parts[0]);
}
}
else if (parts.Length == 2)
{
real = double.Parse(parts[0]);
string imagPart = parts[1].Replace("i", "");
imag = imagPart == "" ? 1 : double.Parse(imagPart);
if (input.Contains("-" parts[1])) imag = -imag;
}
if (isNegative && parts.Length == 1 && !input.Contains("-i"))
real = -real;
return new Complex(real, imag);
}
private string FormatComplex(Complex c)
{
if (c.Imaginary == 0) return c.Real.ToString();
if (c.Real == 0) return c.Imaginary == 1 ? "i" : c.Imaginary == -1 ? "-i" : $"{c.Imaginary}i";
return $"{c.Real} {(c.Imaginary >= 0 ? " " : "-")} {Math.Abs(c.Imaginary)}i";
}
private Complex EvaluateFunction(string expression, double x)
{
expression = expression.Replace("x", x.ToString(System.Globalization.CultureInfo.InvariantCulture));
if (expression.StartsWith("sin("))
{
Complex value = ParseComplex(expression.Substring(4, expression.Length - 5));
return Complex.Sin(isDegree ? value * Math.PI / 180 : value);
}
if (expression.StartsWith("cos("))
{
Complex value = ParseComplex(expression.Substring(4, expression.Length - 5));
return Complex.Cos(isDegree ? value * Math.PI / 180 : value);
}
if (expression.StartsWith("tan("))
{
Complex value = ParseComplex(expression.Substring(4, expression.Length - 5));
return Complex.Tan(isDegree ? value * Math.PI / 180 : value);
}
if (expression.StartsWith("√("))
{
Complex value = ParseComplex(expression.Substring(2, expression.Length - 3));
if (value.Imaginary == 0 && value.Real < 0) throw new Exception("Negative square root");
return Complex.Sqrt(value);
}
if (expression.StartsWith("ln("))
{
Complex value = ParseComplex(expression.Substring(3, expression.Length - 4));
return Complex.Log(value);
}
if (expression.StartsWith("log("))
{
Complex value = ParseComplex(expression.Substring(4, expression.Length - 5));
return Complex.Log10(value);
}
if (expression.Contains("^"))
{
string[] parts = expression.Split('^');
Complex baseVal = ParseComplex(parts[0]);
Complex exponent = ParseComplex(parts[1]);
return Complex.Pow(baseVal, exponent);
}
return ParseComplex(expression);
}
private void Calculate()
{
try
{
string[] parts = display.Text.Split(' ');
if (parts.Length < 3) return;
Complex secondNumber = ParseComplex(parts[2]);
switch (currentOperation)
{
case " ":
result = secondNumber;
break;
case "-":
result -= secondNumber;
break;
case "*":
result *= secondNumber;
break;
case "/":
if (secondNumber ==
Complex.Zero)
{
MessageBox.Show("Cannot divide by zero!");
ClearButton_Click(null, null);
return;
}
result /= secondNumber;
break;
case "^":
result = Complex.Pow(result, secondNumber);
break;
}
display.Text = FormatComplex(result);
}
catch
{
MessageBox.Show("Invalid expression!");
ClearButton_Click(null, null);
}
}
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}