commit
d4f8f07e9e
11 changed files with 274 additions and 160 deletions
15
.idea/.idea.calculator/.idea/git_toolbox_prj.xml
generated
Normal file
15
.idea/.idea.calculator/.idea/git_toolbox_prj.xml
generated
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="GitToolBoxProjectSettings">
|
||||||
|
<option name="commitMessageIssueKeyValidationOverride">
|
||||||
|
<BoolValueOverride>
|
||||||
|
<option name="enabled" value="true" />
|
||||||
|
</BoolValueOverride>
|
||||||
|
</option>
|
||||||
|
<option name="commitMessageValidationEnabledOverride">
|
||||||
|
<BoolValueOverride>
|
||||||
|
<option name="enabled" value="true" />
|
||||||
|
</BoolValueOverride>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
|
|
@ -1,38 +0,0 @@
|
||||||
using calculator.Common;
|
|
||||||
using calculator.Model;
|
|
||||||
using calculator.Services;
|
|
||||||
|
|
||||||
namespace calculator.Commands;
|
|
||||||
|
|
||||||
public class CalculateCommand : ICommand
|
|
||||||
{
|
|
||||||
private readonly ICaculator _caculator;
|
|
||||||
private readonly CaculatorData _data;
|
|
||||||
private readonly double? _b;
|
|
||||||
private readonly Operation _operation;
|
|
||||||
private double? _previousValue;
|
|
||||||
|
|
||||||
public CalculateCommand(ICaculator caculator, CaculatorData data)
|
|
||||||
{
|
|
||||||
_caculator = caculator;
|
|
||||||
_data = data;
|
|
||||||
_operation = data.Operation.Value;
|
|
||||||
|
|
||||||
if (double.TryParse(data.Input, out var b))
|
|
||||||
_b = b;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Execute()
|
|
||||||
{
|
|
||||||
if (_data.Value is null)
|
|
||||||
return;
|
|
||||||
_previousValue = _data.Value;
|
|
||||||
_data.Value = _caculator.Calculate(_operation, _data.Value.Value, _b);
|
|
||||||
_data.Input = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Undo()
|
|
||||||
{
|
|
||||||
_data.Value = _previousValue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
54
Common/CalculatorExtensions.cs
Normal file
54
Common/CalculatorExtensions.cs
Normal file
|
|
@ -0,0 +1,54 @@
|
||||||
|
namespace calculator.Common;
|
||||||
|
|
||||||
|
public static class CalculatorExtensions
|
||||||
|
{
|
||||||
|
public static int Precedence(this Operation op)
|
||||||
|
{
|
||||||
|
switch (op)
|
||||||
|
{
|
||||||
|
case Operation.Add:
|
||||||
|
case Operation.Sub:
|
||||||
|
return 1;
|
||||||
|
case Operation.Mul:
|
||||||
|
case Operation.Div:
|
||||||
|
case Operation.Factorial:
|
||||||
|
return 2;
|
||||||
|
case Operation.PowY:
|
||||||
|
case Operation.SqrtY:
|
||||||
|
return 3;
|
||||||
|
case Operation.Cube:
|
||||||
|
case Operation.Pow:
|
||||||
|
case Operation.Sqrt:
|
||||||
|
case Operation.CubeRoot:
|
||||||
|
case Operation.Square:
|
||||||
|
case Operation.Log:
|
||||||
|
case Operation.Ln:
|
||||||
|
case Operation.Inv:
|
||||||
|
case Operation.OneDiv:
|
||||||
|
case Operation.Mod:
|
||||||
|
case Operation.Neg:
|
||||||
|
case Operation.Percent:
|
||||||
|
case Operation.Sinh:
|
||||||
|
case Operation.Sin:
|
||||||
|
case Operation.Cosh:
|
||||||
|
case Operation.Cos:
|
||||||
|
case Operation.Tanh:
|
||||||
|
case Operation.Tan:
|
||||||
|
return 4;
|
||||||
|
default:
|
||||||
|
case Operation.OpenBracket:
|
||||||
|
case Operation.CloseBracket:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool IsBigger(this Operation a, Operation b)
|
||||||
|
{
|
||||||
|
return Precedence(a) > Precedence(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool IsLowerOrEqual(this Operation a, Operation b)
|
||||||
|
{
|
||||||
|
return Precedence(a) <= Precedence(b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -18,7 +18,6 @@ public enum Operation
|
||||||
Ln,
|
Ln,
|
||||||
Exp,
|
Exp,
|
||||||
Inv,
|
Inv,
|
||||||
Pi,
|
|
||||||
OneDiv,
|
OneDiv,
|
||||||
Mod,
|
Mod,
|
||||||
Neg,
|
Neg,
|
||||||
|
|
@ -28,5 +27,16 @@ public enum Operation
|
||||||
Cosh,
|
Cosh,
|
||||||
Cos,
|
Cos,
|
||||||
Tanh,
|
Tanh,
|
||||||
Tan
|
Tan,
|
||||||
|
OpenBracket,
|
||||||
|
CloseBracket,
|
||||||
|
Int,
|
||||||
|
Dms,
|
||||||
|
FE,
|
||||||
|
PowX
|
||||||
|
}
|
||||||
|
public enum Constants
|
||||||
|
{
|
||||||
|
Pi,
|
||||||
|
Exp
|
||||||
}
|
}
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
using calculator.Commands;
|
using calculator.Common;
|
||||||
using calculator.Common;
|
|
||||||
using calculator.Model;
|
using calculator.Model;
|
||||||
using calculator.Services;
|
using calculator.Services;
|
||||||
using calculator.View;
|
using calculator.View;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
namespace calculator.Controller;
|
namespace calculator.Controller;
|
||||||
|
|
||||||
|
|
@ -12,7 +12,6 @@ public class CaculatorController
|
||||||
private readonly IInputService _inputService;
|
private readonly IInputService _inputService;
|
||||||
private readonly ICaculatorView _view;
|
private readonly ICaculatorView _view;
|
||||||
private readonly CaculatorData _data;
|
private readonly CaculatorData _data;
|
||||||
private ICommand? _currentCommand;
|
|
||||||
|
|
||||||
public CaculatorController(ICaculator caculator, IInputService inputService, ICaculatorView view,
|
public CaculatorController(ICaculator caculator, IInputService inputService, ICaculatorView view,
|
||||||
CaculatorData data)
|
CaculatorData data)
|
||||||
|
|
@ -27,14 +26,24 @@ public class CaculatorController
|
||||||
_view.ClearPressed += OnClearPressed;
|
_view.ClearPressed += OnClearPressed;
|
||||||
_view.CalculatePressed += OnCalculatePressed;
|
_view.CalculatePressed += OnCalculatePressed;
|
||||||
_view.SingleOperatorPressed += OnSingleOperationPressed;
|
_view.SingleOperatorPressed += OnSingleOperationPressed;
|
||||||
|
_view.Constants += OnConstantsPressed;
|
||||||
OnClearPressed(true);
|
OnClearPressed(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnSingleOperationPressed(Operation operation)
|
private void OnSingleOperationPressed(Operation operation)
|
||||||
{
|
{
|
||||||
OnOperatorPressed(operation);
|
if (double.TryParse(_data.Input, out var value) == false)
|
||||||
_currentCommand = new CalculateCommand(_caculator, _data);
|
{
|
||||||
OnCalculatePressed();
|
if (_data.Values.Count > 0)
|
||||||
|
{
|
||||||
|
value = _data.Values.Pop()!.Value;
|
||||||
|
}
|
||||||
|
else { return; }
|
||||||
|
}
|
||||||
|
|
||||||
|
_data.Values.Push(_caculator.Calculate(operation, value));
|
||||||
|
UpdateView(_data.Values.Peek()!.Value);
|
||||||
|
_data.Input = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnClearPressed(bool full)
|
private void OnClearPressed(bool full)
|
||||||
|
|
@ -42,60 +51,104 @@ public class CaculatorController
|
||||||
Clear(full: full);
|
Clear(full: full);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnCalculatePressed()
|
private void Calculate(bool fullAnswer = true)
|
||||||
{
|
{
|
||||||
if (_data.Operation is null)
|
if (_data.Operations.Count == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (_data.Value is null)
|
if (_data.Values.Count == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (_data is not { Caculated: true, Input: null } || _currentCommand == null)
|
if (TryGetValueFromInput() == false)
|
||||||
{
|
return;
|
||||||
_currentCommand = new CalculateCommand(_caculator, _data);
|
|
||||||
|
PerformCalculation(fullAnswer);
|
||||||
|
|
||||||
|
UpdateView(_data.Values.Peek()!.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
_currentCommand?.Execute();
|
private void OnCalculatePressed()
|
||||||
_data.Caculated = true;
|
{
|
||||||
UpdateView(_data.Value.Value);
|
Calculate();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void PerformCalculation(bool fullAnswer = true)
|
||||||
|
{
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
while (_data.Operations.Count > 0 && _data.Operations.Peek() != Operation.OpenBracket)
|
||||||
|
{
|
||||||
|
var b = _data.Values.Pop();
|
||||||
|
var a = _data.Values.Pop();
|
||||||
|
_data.Values.Push(_caculator.Calculate(_data.Operations.Pop(), a!.Value, b!.Value));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_data.Operations.Count > 0 && _data.Operations.Peek() == Operation.OpenBracket && fullAnswer)
|
||||||
|
{
|
||||||
|
_data.Operations.Pop();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_data.Operations.Count > 0 && fullAnswer)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Clear(string value = "0", bool full = true)
|
private void Clear(string value = "0", bool full = true)
|
||||||
{
|
{
|
||||||
if (full)
|
if (full)
|
||||||
{
|
{
|
||||||
_data.Value = null;
|
_data.Values.Clear();
|
||||||
_data.Operation = null;
|
_data.Operations.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
_data.Caculated = false;
|
|
||||||
_data.Input = null;
|
_data.Input = null;
|
||||||
_view.UpdateView(value);
|
_view.UpdateView(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnOperatorPressed(Operation operation)
|
private void OnOperatorPressed(Operation operation)
|
||||||
{
|
{
|
||||||
if (_data.Input == null && _data.Value == null)
|
if (_data.Operations.Count > 0)
|
||||||
return;
|
|
||||||
|
|
||||||
if (_data is { Caculated: false, Input: not null, Value: not null })
|
|
||||||
{
|
{
|
||||||
OnCalculatePressed();
|
if (operation == Operation.CloseBracket)
|
||||||
|
{
|
||||||
|
Calculate(false);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_data.Operation = operation;
|
if (operation != Operation.OpenBracket && operation.IsLowerOrEqual(_data.Operations.Peek()))
|
||||||
|
|
||||||
if (_data.Input != null)
|
|
||||||
{
|
{
|
||||||
_data.Value = double.Parse(_data.Input);
|
Calculate(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_data.Operations.Push(operation);
|
||||||
|
|
||||||
|
TryGetValueFromInput();
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool TryGetValueFromInput()
|
||||||
|
{
|
||||||
|
if (_data.Input is not null)
|
||||||
|
{
|
||||||
|
if (double.TryParse(_data.Input, out var value) == false)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
_data.Values.Push(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
_data.Input = null;
|
_data.Input = null;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnOperandPressed(char obj)
|
private void OnOperandPressed(char obj)
|
||||||
{
|
{
|
||||||
if (_data.Caculated)
|
if (_data.Operations.Count == 0 && _data.Input == null)
|
||||||
{
|
{
|
||||||
Clear(full: true);
|
Clear(full: true);
|
||||||
}
|
}
|
||||||
|
|
@ -113,4 +166,26 @@ public class CaculatorController
|
||||||
{
|
{
|
||||||
_view.UpdateView(input);
|
_view.UpdateView(input);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnConstantsPressed(Constants constants)
|
||||||
|
{
|
||||||
|
if (_data.Operations.Count == 0 && _data.Input == null)
|
||||||
|
{
|
||||||
|
Clear(full: true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double output = 0;
|
||||||
|
switch (constants)
|
||||||
|
{
|
||||||
|
case Constants.Pi:
|
||||||
|
output = Math.PI;
|
||||||
|
break;
|
||||||
|
case Constants.Exp:
|
||||||
|
output = Math.E;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
_data.Input = output.ToString("0.#####");
|
||||||
|
UpdateView(output);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
||||||
68
Form1.Designer.cs
generated
68
Form1.Designer.cs
generated
|
|
@ -29,7 +29,7 @@
|
||||||
private void InitializeComponent()
|
private void InitializeComponent()
|
||||||
{
|
{
|
||||||
panel1 = new Panel();
|
panel1 = new Panel();
|
||||||
button49 = new Button();
|
PowX = new Button();
|
||||||
Log_button = new Button();
|
Log_button = new Button();
|
||||||
Mod_button = new Button();
|
Mod_button = new Button();
|
||||||
Exp_button = new Button();
|
Exp_button = new Button();
|
||||||
|
|
@ -97,7 +97,7 @@
|
||||||
// panel1
|
// panel1
|
||||||
//
|
//
|
||||||
panel1.BackColor = Color.MediumSlateBlue;
|
panel1.BackColor = Color.MediumSlateBlue;
|
||||||
panel1.Controls.Add(button49);
|
panel1.Controls.Add(PowX);
|
||||||
panel1.Controls.Add(Log_button);
|
panel1.Controls.Add(Log_button);
|
||||||
panel1.Controls.Add(Mod_button);
|
panel1.Controls.Add(Mod_button);
|
||||||
panel1.Controls.Add(Exp_button);
|
panel1.Controls.Add(Exp_button);
|
||||||
|
|
@ -157,16 +157,17 @@
|
||||||
panel1.Size = new Size(573, 338);
|
panel1.Size = new Size(573, 338);
|
||||||
panel1.TabIndex = 0;
|
panel1.TabIndex = 0;
|
||||||
//
|
//
|
||||||
// button49
|
// PowX
|
||||||
//
|
//
|
||||||
button49.FlatStyle = FlatStyle.Flat;
|
PowX.FlatStyle = FlatStyle.Flat;
|
||||||
button49.Font = new Font("Segoe UI", 9.75F, FontStyle.Bold, GraphicsUnit.Point);
|
PowX.Font = new Font("Segoe UI", 9.75F, FontStyle.Bold, GraphicsUnit.Point);
|
||||||
button49.Location = new Point(232, 296);
|
PowX.Location = new Point(232, 296);
|
||||||
button49.Name = "button49";
|
PowX.Name = "PowX";
|
||||||
button49.Size = new Size(51, 37);
|
PowX.Size = new Size(51, 37);
|
||||||
button49.TabIndex = 55;
|
PowX.TabIndex = 55;
|
||||||
button49.Text = "10ᵜ";
|
PowX.Text = "10ᵜ";
|
||||||
button49.UseVisualStyleBackColor = true;
|
PowX.UseVisualStyleBackColor = true;
|
||||||
|
PowX.Click += OnPowXButtonClick;
|
||||||
//
|
//
|
||||||
// Log_button
|
// Log_button
|
||||||
//
|
//
|
||||||
|
|
@ -206,8 +207,11 @@
|
||||||
//
|
//
|
||||||
// button53
|
// button53
|
||||||
//
|
//
|
||||||
|
button53.Cursor = Cursors.No;
|
||||||
|
button53.Enabled = false;
|
||||||
button53.FlatStyle = FlatStyle.Flat;
|
button53.FlatStyle = FlatStyle.Flat;
|
||||||
button53.Font = new Font("Segoe UI", 9.75F, FontStyle.Bold, GraphicsUnit.Point);
|
button53.Font = new Font("Segoe UI", 9.75F, FontStyle.Bold, GraphicsUnit.Point);
|
||||||
|
button53.ForeColor = Color.Tomato;
|
||||||
button53.Location = new Point(4, 296);
|
button53.Location = new Point(4, 296);
|
||||||
button53.Name = "button53";
|
button53.Name = "button53";
|
||||||
button53.Size = new Size(51, 37);
|
button53.Size = new Size(51, 37);
|
||||||
|
|
@ -325,8 +329,12 @@
|
||||||
//
|
//
|
||||||
// dms_button
|
// dms_button
|
||||||
//
|
//
|
||||||
|
dms_button.BackgroundImageLayout = ImageLayout.None;
|
||||||
|
dms_button.Cursor = Cursors.No;
|
||||||
|
dms_button.Enabled = false;
|
||||||
dms_button.FlatStyle = FlatStyle.Flat;
|
dms_button.FlatStyle = FlatStyle.Flat;
|
||||||
dms_button.Font = new Font("Segoe UI", 9.75F, FontStyle.Bold, GraphicsUnit.Point);
|
dms_button.Font = new Font("Segoe UI", 9.75F, FontStyle.Bold, GraphicsUnit.Point);
|
||||||
|
dms_button.ForeColor = Color.Tomato;
|
||||||
dms_button.Location = new Point(4, 210);
|
dms_button.Location = new Point(4, 210);
|
||||||
dms_button.Name = "dms_button";
|
dms_button.Name = "dms_button";
|
||||||
dms_button.Size = new Size(51, 37);
|
dms_button.Size = new Size(51, 37);
|
||||||
|
|
@ -392,6 +400,7 @@
|
||||||
Int_button.TabIndex = 36;
|
Int_button.TabIndex = 36;
|
||||||
Int_button.Text = "Int";
|
Int_button.Text = "Int";
|
||||||
Int_button.UseVisualStyleBackColor = true;
|
Int_button.UseVisualStyleBackColor = true;
|
||||||
|
Int_button.Click += OnIntButtonClick;
|
||||||
//
|
//
|
||||||
// button23
|
// button23
|
||||||
//
|
//
|
||||||
|
|
@ -403,6 +412,7 @@
|
||||||
button23.TabIndex = 35;
|
button23.TabIndex = 35;
|
||||||
button23.Text = ")";
|
button23.Text = ")";
|
||||||
button23.UseVisualStyleBackColor = true;
|
button23.UseVisualStyleBackColor = true;
|
||||||
|
button23.Click += OnCloseBracketButtonClick;
|
||||||
//
|
//
|
||||||
// button30
|
// button30
|
||||||
//
|
//
|
||||||
|
|
@ -414,6 +424,7 @@
|
||||||
button30.TabIndex = 34;
|
button30.TabIndex = 34;
|
||||||
button30.Text = "(";
|
button30.Text = "(";
|
||||||
button30.UseVisualStyleBackColor = true;
|
button30.UseVisualStyleBackColor = true;
|
||||||
|
button30.Click += OnOpenBracketButtonClick;
|
||||||
//
|
//
|
||||||
// Ln_button
|
// Ln_button
|
||||||
//
|
//
|
||||||
|
|
@ -729,8 +740,11 @@
|
||||||
//
|
//
|
||||||
// button5
|
// button5
|
||||||
//
|
//
|
||||||
|
button5.Cursor = Cursors.No;
|
||||||
|
button5.Enabled = false;
|
||||||
button5.FlatStyle = FlatStyle.Flat;
|
button5.FlatStyle = FlatStyle.Flat;
|
||||||
button5.Font = new Font("Segoe UI", 9.75F, FontStyle.Bold, GraphicsUnit.Point);
|
button5.Font = new Font("Segoe UI", 9.75F, FontStyle.Bold, GraphicsUnit.Point);
|
||||||
|
button5.ForeColor = Color.Tomato;
|
||||||
button5.Location = new Point(517, 81);
|
button5.Location = new Point(517, 81);
|
||||||
button5.Name = "button5";
|
button5.Name = "button5";
|
||||||
button5.Size = new Size(51, 37);
|
button5.Size = new Size(51, 37);
|
||||||
|
|
@ -740,8 +754,11 @@
|
||||||
//
|
//
|
||||||
// button4
|
// button4
|
||||||
//
|
//
|
||||||
|
button4.Cursor = Cursors.No;
|
||||||
|
button4.Enabled = false;
|
||||||
button4.FlatStyle = FlatStyle.Flat;
|
button4.FlatStyle = FlatStyle.Flat;
|
||||||
button4.Font = new Font("Segoe UI", 9.75F, FontStyle.Bold, GraphicsUnit.Point);
|
button4.Font = new Font("Segoe UI", 9.75F, FontStyle.Bold, GraphicsUnit.Point);
|
||||||
|
button4.ForeColor = Color.Tomato;
|
||||||
button4.Location = new Point(460, 81);
|
button4.Location = new Point(460, 81);
|
||||||
button4.Name = "button4";
|
button4.Name = "button4";
|
||||||
button4.Size = new Size(51, 37);
|
button4.Size = new Size(51, 37);
|
||||||
|
|
@ -751,8 +768,11 @@
|
||||||
//
|
//
|
||||||
// button3
|
// button3
|
||||||
//
|
//
|
||||||
|
button3.Cursor = Cursors.No;
|
||||||
|
button3.Enabled = false;
|
||||||
button3.FlatStyle = FlatStyle.Flat;
|
button3.FlatStyle = FlatStyle.Flat;
|
||||||
button3.Font = new Font("Segoe UI", 9.75F, FontStyle.Bold, GraphicsUnit.Point);
|
button3.Font = new Font("Segoe UI", 9.75F, FontStyle.Bold, GraphicsUnit.Point);
|
||||||
|
button3.ForeColor = Color.Tomato;
|
||||||
button3.Location = new Point(403, 81);
|
button3.Location = new Point(403, 81);
|
||||||
button3.Name = "button3";
|
button3.Name = "button3";
|
||||||
button3.Size = new Size(51, 37);
|
button3.Size = new Size(51, 37);
|
||||||
|
|
@ -762,8 +782,11 @@
|
||||||
//
|
//
|
||||||
// button2
|
// button2
|
||||||
//
|
//
|
||||||
|
button2.Cursor = Cursors.No;
|
||||||
|
button2.Enabled = false;
|
||||||
button2.FlatStyle = FlatStyle.Flat;
|
button2.FlatStyle = FlatStyle.Flat;
|
||||||
button2.Font = new Font("Segoe UI", 9.75F, FontStyle.Bold, GraphicsUnit.Point);
|
button2.Font = new Font("Segoe UI", 9.75F, FontStyle.Bold, GraphicsUnit.Point);
|
||||||
|
button2.ForeColor = Color.Tomato;
|
||||||
button2.Location = new Point(346, 81);
|
button2.Location = new Point(346, 81);
|
||||||
button2.Name = "button2";
|
button2.Name = "button2";
|
||||||
button2.Size = new Size(51, 37);
|
button2.Size = new Size(51, 37);
|
||||||
|
|
@ -773,8 +796,11 @@
|
||||||
//
|
//
|
||||||
// button1
|
// button1
|
||||||
//
|
//
|
||||||
|
button1.Cursor = Cursors.No;
|
||||||
|
button1.Enabled = false;
|
||||||
button1.FlatStyle = FlatStyle.Flat;
|
button1.FlatStyle = FlatStyle.Flat;
|
||||||
button1.Font = new Font("Segoe UI", 9.75F, FontStyle.Bold, GraphicsUnit.Point);
|
button1.Font = new Font("Segoe UI", 9.75F, FontStyle.Bold, GraphicsUnit.Point);
|
||||||
|
button1.ForeColor = Color.Tomato;
|
||||||
button1.Location = new Point(289, 81);
|
button1.Location = new Point(289, 81);
|
||||||
button1.Name = "button1";
|
button1.Name = "button1";
|
||||||
button1.Size = new Size(51, 37);
|
button1.Size = new Size(51, 37);
|
||||||
|
|
@ -796,8 +822,11 @@
|
||||||
// radioButton3
|
// radioButton3
|
||||||
//
|
//
|
||||||
radioButton3.AutoSize = true;
|
radioButton3.AutoSize = true;
|
||||||
|
radioButton3.BackgroundImageLayout = ImageLayout.None;
|
||||||
|
radioButton3.Cursor = Cursors.No;
|
||||||
|
radioButton3.Enabled = false;
|
||||||
radioButton3.Font = new Font("Microsoft Sans Serif", 11.25F, FontStyle.Bold | FontStyle.Italic, GraphicsUnit.Point);
|
radioButton3.Font = new Font("Microsoft Sans Serif", 11.25F, FontStyle.Bold | FontStyle.Italic, GraphicsUnit.Point);
|
||||||
radioButton3.ForeColor = Color.FromArgb(255, 192, 255);
|
radioButton3.ForeColor = Color.Tomato;
|
||||||
radioButton3.Location = new Point(197, 13);
|
radioButton3.Location = new Point(197, 13);
|
||||||
radioButton3.Name = "radioButton3";
|
radioButton3.Name = "radioButton3";
|
||||||
radioButton3.Size = new Size(76, 22);
|
radioButton3.Size = new Size(76, 22);
|
||||||
|
|
@ -809,8 +838,11 @@
|
||||||
// radioButton2
|
// radioButton2
|
||||||
//
|
//
|
||||||
radioButton2.AutoSize = true;
|
radioButton2.AutoSize = true;
|
||||||
|
radioButton2.BackgroundImageLayout = ImageLayout.None;
|
||||||
|
radioButton2.Cursor = Cursors.No;
|
||||||
|
radioButton2.Enabled = false;
|
||||||
radioButton2.Font = new Font("Microsoft Sans Serif", 11.25F, FontStyle.Bold | FontStyle.Italic, GraphicsUnit.Point);
|
radioButton2.Font = new Font("Microsoft Sans Serif", 11.25F, FontStyle.Bold | FontStyle.Italic, GraphicsUnit.Point);
|
||||||
radioButton2.ForeColor = Color.FromArgb(255, 192, 255);
|
radioButton2.ForeColor = Color.Tomato;
|
||||||
radioButton2.Location = new Point(98, 13);
|
radioButton2.Location = new Point(98, 13);
|
||||||
radioButton2.Name = "radioButton2";
|
radioButton2.Name = "radioButton2";
|
||||||
radioButton2.Size = new Size(95, 22);
|
radioButton2.Size = new Size(95, 22);
|
||||||
|
|
@ -822,8 +854,11 @@
|
||||||
// radioButton1
|
// radioButton1
|
||||||
//
|
//
|
||||||
radioButton1.AutoSize = true;
|
radioButton1.AutoSize = true;
|
||||||
|
radioButton1.BackgroundImageLayout = ImageLayout.None;
|
||||||
|
radioButton1.Cursor = Cursors.No;
|
||||||
|
radioButton1.Enabled = false;
|
||||||
radioButton1.Font = new Font("Microsoft Sans Serif", 11.25F, FontStyle.Bold | FontStyle.Italic, GraphicsUnit.Point);
|
radioButton1.Font = new Font("Microsoft Sans Serif", 11.25F, FontStyle.Bold | FontStyle.Italic, GraphicsUnit.Point);
|
||||||
radioButton1.ForeColor = Color.FromArgb(255, 192, 255);
|
radioButton1.ForeColor = Color.Tomato;
|
||||||
radioButton1.Location = new Point(6, 13);
|
radioButton1.Location = new Point(6, 13);
|
||||||
radioButton1.Name = "radioButton1";
|
radioButton1.Name = "radioButton1";
|
||||||
radioButton1.Size = new Size(93, 22);
|
radioButton1.Size = new Size(93, 22);
|
||||||
|
|
@ -848,6 +883,7 @@
|
||||||
// linkLabel1
|
// linkLabel1
|
||||||
//
|
//
|
||||||
linkLabel1.AutoSize = true;
|
linkLabel1.AutoSize = true;
|
||||||
|
linkLabel1.Enabled = false;
|
||||||
linkLabel1.LinkColor = Color.FromArgb(255, 192, 255);
|
linkLabel1.LinkColor = Color.FromArgb(255, 192, 255);
|
||||||
linkLabel1.Location = new Point(16, 6);
|
linkLabel1.Location = new Point(16, 6);
|
||||||
linkLabel1.Name = "linkLabel1";
|
linkLabel1.Name = "linkLabel1";
|
||||||
|
|
@ -859,6 +895,7 @@
|
||||||
// linkLabel2
|
// linkLabel2
|
||||||
//
|
//
|
||||||
linkLabel2.AutoSize = true;
|
linkLabel2.AutoSize = true;
|
||||||
|
linkLabel2.Enabled = false;
|
||||||
linkLabel2.LinkColor = Color.FromArgb(255, 192, 255);
|
linkLabel2.LinkColor = Color.FromArgb(255, 192, 255);
|
||||||
linkLabel2.Location = new Point(49, 6);
|
linkLabel2.Location = new Point(49, 6);
|
||||||
linkLabel2.Name = "linkLabel2";
|
linkLabel2.Name = "linkLabel2";
|
||||||
|
|
@ -870,6 +907,7 @@
|
||||||
// linkLabel3
|
// linkLabel3
|
||||||
//
|
//
|
||||||
linkLabel3.AutoSize = true;
|
linkLabel3.AutoSize = true;
|
||||||
|
linkLabel3.Enabled = false;
|
||||||
linkLabel3.LinkColor = Color.FromArgb(255, 192, 255);
|
linkLabel3.LinkColor = Color.FromArgb(255, 192, 255);
|
||||||
linkLabel3.Location = new Point(102, 6);
|
linkLabel3.Location = new Point(102, 6);
|
||||||
linkLabel3.Name = "linkLabel3";
|
linkLabel3.Name = "linkLabel3";
|
||||||
|
|
@ -914,7 +952,7 @@
|
||||||
private LinkLabel linkLabel1;
|
private LinkLabel linkLabel1;
|
||||||
private LinkLabel linkLabel2;
|
private LinkLabel linkLabel2;
|
||||||
private LinkLabel linkLabel3;
|
private LinkLabel linkLabel3;
|
||||||
private Button button49;
|
private Button PowX;
|
||||||
private Button Log_button;
|
private Button Log_button;
|
||||||
private Button Mod_button;
|
private Button Mod_button;
|
||||||
private Button Exp_button;
|
private Button Exp_button;
|
||||||
|
|
|
||||||
28
Form1.cs
28
Form1.cs
|
|
@ -15,6 +15,7 @@ namespace calculator
|
||||||
public event Action<Operation>? SingleOperatorPressed;
|
public event Action<Operation>? SingleOperatorPressed;
|
||||||
public event Action<bool>? ClearPressed;
|
public event Action<bool>? ClearPressed;
|
||||||
public event Action? CalculatePressed;
|
public event Action? CalculatePressed;
|
||||||
|
public event Action<Constants>? Constants;
|
||||||
|
|
||||||
public void UpdateView(string input)
|
public void UpdateView(string input)
|
||||||
{
|
{
|
||||||
|
|
@ -83,7 +84,7 @@ namespace calculator
|
||||||
|
|
||||||
private void OnDotButtonClick(object sender, EventArgs e)
|
private void OnDotButtonClick(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
OperandPressed?.Invoke('.');
|
OperandPressed?.Invoke(',');
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnNegativeButtonClick(object sender, EventArgs e)
|
private void OnNegativeButtonClick(object sender, EventArgs e)
|
||||||
|
|
@ -198,7 +199,7 @@ namespace calculator
|
||||||
|
|
||||||
private void OnLogButtonClick(object sender, EventArgs e)
|
private void OnLogButtonClick(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
SingleOperatorPressed?.Invoke(Operation.Log);
|
OperatorPressed?.Invoke(Operation.Log);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnInvButtonClick(object sender, EventArgs e)
|
private void OnInvButtonClick(object sender, EventArgs e)
|
||||||
|
|
@ -213,13 +214,32 @@ namespace calculator
|
||||||
|
|
||||||
private void OnExpButtonClick(object sender, EventArgs e)
|
private void OnExpButtonClick(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
SingleOperatorPressed?.Invoke(Operation.Exp);
|
Constants?.Invoke(Common.Constants.Exp);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnPiButtonClick(object sender, EventArgs e)
|
private void OnPiButtonClick(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
SingleOperatorPressed?.Invoke(Operation.Pi);
|
Constants?.Invoke(Common.Constants.Pi);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnOpenBracketButtonClick(object? sender, EventArgs e)
|
||||||
|
{
|
||||||
|
OperatorPressed?.Invoke(Operation.OpenBracket);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnCloseBracketButtonClick(object? sender, EventArgs e)
|
||||||
|
{
|
||||||
|
OperatorPressed?.Invoke(Operation.CloseBracket);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnIntButtonClick(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
SingleOperatorPressed?.Invoke(Operation.Int);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnPowXButtonClick(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
SingleOperatorPressed?.Invoke(Operation.PowX);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
62
Form1.resx
62
Form1.resx
|
|
@ -120,78 +120,18 @@
|
||||||
<metadata name="panel1.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
<metadata name="panel1.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
<value>True</value>
|
<value>True</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
<metadata name="button49.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
<metadata name="PowX.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
<value>True</value>
|
|
||||||
</metadata>
|
|
||||||
<metadata name="button50.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<value>True</value>
|
|
||||||
</metadata>
|
|
||||||
<metadata name="button51.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<value>True</value>
|
|
||||||
</metadata>
|
|
||||||
<metadata name="button52.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<value>True</value>
|
<value>True</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
<metadata name="button53.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
<metadata name="button53.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
<value>True</value>
|
<value>True</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
<metadata name="button44.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<value>True</value>
|
|
||||||
</metadata>
|
|
||||||
<metadata name="button45.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<value>True</value>
|
|
||||||
</metadata>
|
|
||||||
<metadata name="button46.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<value>True</value>
|
|
||||||
</metadata>
|
|
||||||
<metadata name="button47.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<value>True</value>
|
|
||||||
</metadata>
|
|
||||||
<metadata name="button48.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<value>True</value>
|
|
||||||
</metadata>
|
|
||||||
<metadata name="button39.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<value>True</value>
|
|
||||||
</metadata>
|
|
||||||
<metadata name="button40.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<value>True</value>
|
|
||||||
</metadata>
|
|
||||||
<metadata name="button41.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<value>True</value>
|
|
||||||
</metadata>
|
|
||||||
<metadata name="button42.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<value>True</value>
|
|
||||||
</metadata>
|
|
||||||
<metadata name="button43.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<value>True</value>
|
|
||||||
</metadata>
|
|
||||||
<metadata name="button34.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<value>True</value>
|
|
||||||
</metadata>
|
|
||||||
<metadata name="button35.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<value>True</value>
|
|
||||||
</metadata>
|
|
||||||
<metadata name="button36.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<value>True</value>
|
|
||||||
</metadata>
|
|
||||||
<metadata name="button37.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<value>True</value>
|
|
||||||
</metadata>
|
|
||||||
<metadata name="button38.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<value>True</value>
|
|
||||||
</metadata>
|
|
||||||
<metadata name="button23.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
<metadata name="button23.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
<value>True</value>
|
<value>True</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
<metadata name="button30.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
<metadata name="button30.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
<value>True</value>
|
<value>True</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
<metadata name="button31.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<value>True</value>
|
|
||||||
</metadata>
|
|
||||||
<metadata name="button32.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<value>True</value>
|
|
||||||
</metadata>
|
|
||||||
<metadata name="button33.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
<metadata name="button33.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
<value>True</value>
|
<value>True</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ namespace calculator.Model;
|
||||||
public class CaculatorData
|
public class CaculatorData
|
||||||
{
|
{
|
||||||
public string? Input { get; set; }
|
public string? Input { get; set; }
|
||||||
public double? Value { get; set; }
|
public Stack<double?> Values { get; set; } = new();
|
||||||
public Operation? Operation { get; set; }
|
public Stack<Operation> Operations { get; set; } = new();
|
||||||
public bool Caculated { get; set; }
|
|
||||||
}
|
}
|
||||||
|
|
@ -31,6 +31,8 @@ namespace calculator.Services
|
||||||
return Math.Pow(a, b);
|
return Math.Pow(a, b);
|
||||||
case Operation.Mod:
|
case Operation.Mod:
|
||||||
return a % b;
|
return a % b;
|
||||||
|
case Operation.Log:
|
||||||
|
return Math.Log(a, b);
|
||||||
default:
|
default:
|
||||||
throw new ArgumentException($"Invalid operator: {token}");
|
throw new ArgumentException($"Invalid operator: {token}");
|
||||||
}
|
}
|
||||||
|
|
@ -75,16 +77,14 @@ namespace calculator.Services
|
||||||
return Math.Pow(a, 3);
|
return Math.Pow(a, 3);
|
||||||
case Operation.CubeRoot:
|
case Operation.CubeRoot:
|
||||||
return Math.Pow(a, 1 / 3);
|
return Math.Pow(a, 1 / 3);
|
||||||
case Operation.Log:
|
|
||||||
return Math.Log10(a);
|
|
||||||
case Operation.Ln:
|
case Operation.Ln:
|
||||||
return Math.Log(a);
|
return Math.Log(a);
|
||||||
case Operation.Exp:
|
|
||||||
return Math.Exp(a);
|
|
||||||
case Operation.Inv:
|
case Operation.Inv:
|
||||||
return 1 / a;
|
return 1 / a;
|
||||||
case Operation.Pi:
|
case Operation.Int:
|
||||||
return Math.PI;
|
return Math.Round(a);
|
||||||
|
case Operation.PowX:
|
||||||
|
return Math.Pow(10, a);
|
||||||
default:
|
default:
|
||||||
throw new ArgumentException($"Invalid operator: {token}");
|
throw new ArgumentException($"Invalid operator: {token}");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,5 +9,6 @@ public interface ICaculatorView
|
||||||
public event Action<bool> ClearPressed;
|
public event Action<bool> ClearPressed;
|
||||||
public event Action CalculatePressed;
|
public event Action CalculatePressed;
|
||||||
public event Action<Operation> SingleOperatorPressed;
|
public event Action<Operation> SingleOperatorPressed;
|
||||||
|
public event Action<Constants> Constants;
|
||||||
public void UpdateView(string input);
|
public void UpdateView(string input);
|
||||||
}
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue