Добавлен: 28.03.2023
Просмотров: 365
Скачиваний: 8
Регистр T 0 0 0 0 0 0 0 0
Регистр Z 0 0 0 0 1 1 0 0
Регистр Y 0 0 1 1 2 2 1 0
Регистр X (дисплей) 0 1 1 2 2 3 6 7
Нажатая клавиша «1» «↑» «2» «↑» «3» «×» «+»
Выполняемая операция ввод сдвиг ввод сдвиг ввод «2×3» «1+6»
Иногда калькуляторы с RPN имеют ещё один дополнительный операционный регистр, в который после выполнении операции сохраняется предыдущее содержимое регистра X. При необходимости это значение можно извлечь с помощью специальной команды. Скобки в RPN не нужны, так как операции выполняются в порядке ввода.
RPN функционально аналогична обычной инфиксной записи со скобками, но при этом вычисления тех же самых выражений требуют меньшего числа нажатий на клавиши. Практика показывает, что научиться применять RPN достаточно просто, но для эффективного использования калькулятора с обратной бесскобочной логикой необходима предварительная тренировка и постоянное поддержание навыков. Среди обычных инженерных калькуляторов использование RPN является редкостью; из зарубежных можно назвать несколько моделей фирмы HP, из советских — единственную модель «Электроника Б3-19М» (в настоящее время не выпускается). Более популярна RPN в программируемых калькуляторах, в том числе благодаря достигаемому с её использованием сокращению размеров программ: для калькулятора с небольшим объёмом программной памяти экономия буквально одной-двух команд иногда определяет, поместится ли крайне необходимая программа в памяти, или её придётся сокращать, жертвуя возможностями и удобством использования.
Вычисление функций
Вычисление одноместных функций (фиксированных степеней и корней, тригонометрических, логарифмов и пр.), независимо от логики вычислений, чаще всего реализуется по постфиксной схеме:
Пользователь вычисляет или вводит с клавиатуры аргумент.
Пользователь нажимает клавишу (клавиши) вычисляемой функции.
Калькулятор вычисляет функцию, соответствующую нажатой клавише, и отображает результат вычисления на индикаторе.
Наиболее сложные калькуляторы с алгебраической логикой позволяют вводить вызов функций в естественном (алгебраическом) виде: сначала вводится знак функции, после него, в скобках — значение или выражение, от которого эта функция должна быть вычислена. То есть вычисление предыдущего примера в таком калькуляторе потребует нажатия клавиш:
В некоторых моделях открывающаяся скобка набирается автоматически при нажатии клавиши функции, а закрывающиеся скобки автоматически вставляются при нажатии на клавишу «равно».
Первый из описанных вариантов проще в реализации и одновременно более экономичен, так как для вычисления самой функции требуется нажать только клавишу функции. Но для вычислений по сложным формулам при этом требуется либо выработанный навык, либо предварительная роспись порядка ввода формулы на бумаге. Второй вариант нагляднее и проще для пользователя, так как всё алгебраическое выражение может быть введено полностью в естественном виде, но это удобно только при наличии достаточно крупного алфавитно-цифрового дисплея, отображающего всю вводимую формулу или хотя бы существенную её часть. К тому же при вводе обычно требуется нажать больше клавиш.
ОПИСАНИЕ
Язык программирования для разработки был выбран C#.
Работа была выполнена в виде консольного приложения в среде разработки Visual Studio Community 2019.
В калькуляторе реализованы такие операции как сложение, вычитание, умножение и деление.
В начале работы приложение должно объяснить пользователю как им пользоваться и каким образом из него выйти. Затем предоставляет возможность производить расчеты.
Общий функционал приложения, такой как: описание функционала, главный цикл работы и выход из приложения описан в классе Programm в файле Programm.cs .
Операции калькулятора и вспомогательный класс для представления уравнения описаны в классах Calculator и Equation соответственно в файле Calculator.cs .
Вычисления производятся до максимальной точности в 7 знаков после запятой (точность типа данных float в C#). Можно было бы достичь большей точности, используя тип данных double, но в рамках данного задания было сочтено это не целесообразным.
Тестирование будет производиться в 4 этапа:
- Целочисленные вычисления
- Вычисления дробных чисел
- Вычисления с отрицательными числами
- Критические значения
Значения ожидаемых результатов были получены на онлайн-калькуляторе kalkpro находящийся по адресу https://kalkpro.ru/scientific-calc/ , который способен вычислять результаты с точностью до 20 знаков после запятой.
ИСХОДНЫЙ КОД
Programm.cs
using System;
namespace CalculatorApp
{
class Program
{
static void Main(string[] args)
{
string exitCommand = "exit";
string title = $"Введите действие чтобы узнать результат или \"{exitCommand}\" для выхода из программы";
Equation ParseLineToEquation(string line)
{
char sign = default;
foreach (var calculatorSign in Calculator.signs)
{
if (line.Contains(calculatorSign))
{
sign = line[line.IndexOf(calculatorSign)];
}
}
if (sign == default)
{
return null;
}
string[] stringValues = line.Split(Calculator.signs);
float[] values = new float[stringValues.Length];
for (int i = 0; i < stringValues.Length; i++)
{
if (!float.TryParse(stringValues[i], out values[i]))
{
return null;
}
}
return new Equation(sign, values[0], values[1]);
}
Console.WriteLine(title);
string currentCommand = Console.ReadLine();
while (currentCommand != exitCommand)
{
Equation equation = ParseLineToEquation(currentCommand);
if (equation != null)
{
Console.WriteLine("=" + Calculator.Solve(equation));
}
else
{
Console.WriteLine("Пример введен неверно, попробуйте еще раз");
}
Console.WriteLine(title);
currentCommand = Console.ReadLine();
}
Console.WriteLine("Выход из программы");
}
}
}
Calculator.cs:
{
class Calculator
{
public static char[] signs = { '+', '-', '*', '/' };
public static float Solve(Equation equation)
{
float answer = default;
switch (equation.Sign)
{
case '+':
answer = equation.FirstNumber + equation.SecondNumber;
break;
case '-':
answer = equation.FirstNumber - equation.SecondNumber;
break;
case '*':
answer = equation.FirstNumber * equation.SecondNumber;
break;
case '/':
answer = equation.FirstNumber / equation.SecondNumber;
break;
default:
break;
}
return answer;
}
}
Equation.cs:
namespace CalculatorApp
{
class Equation
{
public char Sign;
public float FirstNumber;
public float SecondNumber;
public Equation(char sign, float firstNumber, float secondNumber)
{
Sign = sign;
FirstNumber = firstNumber;
SecondNumber = secondNumber;
}
}
}
Исходные данные тестирования:
- Целочисленные вычисления
Данные для ввода |
Результат из kalkpro |
Ожидаемый результат |
1234567 + 2345678 |
3580245 |
3580245 |
987456 – 789456 |
198000 |
198000 |
987456321 / 45 |
21943474 |
21943474 |
741852963 * 147258369 |
109251148369197347 |
1,0925148E+17 |
- Вычисления дробных чисел
Данные для ввода |
Результат из kalkpro |
Ожидаемый результат |
1234567 / 2345678 |
5.2631597346268328389… |
5.2631597 |
0,123456 + 9,654321 |
9,777777 |
9,777777 |
0,123456 * 9,654321 |
1,191883853376 |
1,1918838 |
9,654321 – 0,123456 |
9,530865 |
9,530865 |
- Вычисления с отрицательными числами
Данные для ввода |
Результат из kalkpro |
Ожидаемый результат |
-1234567 / 2345678 |
-5.2631597346268328… |
-5.2631597 |
0,123456 - 9,654321 |
-9,530865 |
-9,530865 |
- 0,123456 * - 9,654321 |
1,191883853376 |
1,1918838 |