158 lines
6.5 KiB
C#
Executable File
158 lines
6.5 KiB
C#
Executable File
/*
|
||
Описание программного продукта
|
||
|
||
1) Функционал
|
||
|
||
Калькулятор предоставляет пользователям возможность выполнять базовые арифметические операции,
|
||
а также использовать функции для работы с памятью и дополнительными вычислениями.
|
||
Возможности калькулятора включают:
|
||
|
||
Арифметические операции:
|
||
- Сложение (+)
|
||
- Вычитание (-)
|
||
- Умножение (*)
|
||
- Деление (/)
|
||
- Процент от числа (%)
|
||
- Возведение в степень (^)
|
||
- Квадратный корень (sqrt)
|
||
- Обратное значение (1/)
|
||
- Возведение в квадрат (^2)
|
||
|
||
Функции работы с памятью:
|
||
- m+ — добавление текущего результата в память
|
||
- m- — вычитание текущего результата из памяти
|
||
- ms — сохранение текущего результата в память
|
||
- mc — очистка памяти
|
||
- mr — вывод сохранённого значения из памяти
|
||
- c — сброс текущего результата
|
||
|
||
2) Ограничения
|
||
|
||
Числовые ограничения:
|
||
- При выполнении операции квадратного корня (sqrt), число должно быть неотрицательным.
|
||
- При вычислении обратного значения (1/), делитель не должен быть равен нулю.
|
||
- При вычислении опраций деления, остатка от деления и обратного значения (/, %, 1/),
|
||
делитель не должен быть равен нулю.
|
||
|
||
Операции:
|
||
- Калькулятор поддерживает только указанные операции и функции.
|
||
- Не предусмотрены расширенные математические функции (тригонометрические, логарифмические и др.).
|
||
|
||
Ввод данных:
|
||
- Вводимые данные должны быть числовыми, неверный формат приводит к ошибкам.
|
||
- Программа не обрабатывает некорректные или неподдерживаемые команды.
|
||
|
||
3) Возможные ошибки
|
||
|
||
Формат ввода:
|
||
- Неверный формат числа: Появляется при вводе данных, которые не могут быть преобразованы в число.
|
||
|
||
Математические ошибки:
|
||
- Отрицательное число: Появляется при попытке вычислить квадратный корень от отрицательного числа.
|
||
- Деление на 0: Происходит при попытке деления на ноль или вычислении остатка от деления на ноль.
|
||
|
||
Неподдерживаемая операция:
|
||
- Появляется, если пользователь вводит операцию, которая не поддерживается калькулятором.
|
||
*/
|
||
|
||
using System;
|
||
|
||
class Calculator
|
||
{
|
||
static double memory = 0;
|
||
static double lastResult = 0;
|
||
|
||
static void Main()
|
||
{
|
||
Console.WriteLine("Калькулятор\n\nКоманды: +, -, *, /, %, ^, sqrt, 1/, ^2\nФункции: m+, m-, ms, mc, mr, c, ce\nДля выхода используйте 'exit'\n");
|
||
|
||
while (true)
|
||
{
|
||
Console.Write(":> ");
|
||
string userInput = Console.ReadLine().Trim().ToLower();
|
||
|
||
if (userInput == "exit") break;
|
||
|
||
if (ProcessFunction(userInput)) continue;
|
||
|
||
try
|
||
{
|
||
double result = Calculate(userInput);
|
||
lastResult = result;
|
||
Console.WriteLine($"Результат: {result}");
|
||
}
|
||
catch (Exception exception)
|
||
{
|
||
Console.WriteLine($"Ошибка: {exception.Message}");
|
||
}
|
||
}
|
||
}
|
||
|
||
static bool ProcessFunction(string command)
|
||
{
|
||
switch (command)
|
||
{
|
||
case "m+":
|
||
memory += lastResult;
|
||
Console.WriteLine($"M+: {memory}");
|
||
return true;
|
||
case "m-":
|
||
memory -= lastResult;
|
||
Console.WriteLine($"M-: {memory}");
|
||
return true;
|
||
case "ms":
|
||
memory = lastResult;
|
||
Console.WriteLine($"MS: {memory}");
|
||
return true;
|
||
case "mc":
|
||
memory = 0;
|
||
Console.WriteLine("MC: память очищена");
|
||
return true;
|
||
case "mr":
|
||
Console.WriteLine($"MR: {memory}");
|
||
return true;
|
||
case "c":
|
||
lastResult = 0;
|
||
Console.WriteLine("C: сброс");
|
||
return true;
|
||
default:
|
||
return false;
|
||
}
|
||
}
|
||
|
||
static double Calculate(string operation)
|
||
{
|
||
double first = ReadNumber("First");
|
||
|
||
switch (operation)
|
||
{
|
||
case "sqrt" when first >= 0: return Math.Sqrt(first);
|
||
case "sqrt": throw new ArgumentException("Отрицательное число");
|
||
case "1/" when first != 0: return 1 / first;
|
||
case "1/": throw new DivideByZeroException("Делить на 0 нельзя");
|
||
case "^2": return Math.Pow(first, 2);
|
||
}
|
||
|
||
double second = ReadNumber("Second");
|
||
|
||
switch (operation)
|
||
{
|
||
case "+": return first + second;
|
||
case "-": return first - second;
|
||
case "*": return first * second;
|
||
case "%": return second * first / 100;
|
||
case "^": return Math.Pow(first, second);
|
||
case "/" when second != 0: return first / second;
|
||
case "/": throw new DivideByZeroException("Делить на 0 нельзя");
|
||
default: throw new ArgumentException("Неподдерживаемая операция");
|
||
}
|
||
}
|
||
|
||
static double ReadNumber(string prompt)
|
||
{
|
||
Console.Write($"{prompt} :> ");
|
||
if (double.TryParse(Console.ReadLine().Trim(), out double value)) return value;
|
||
throw new FormatException("Неверный формат числа");
|
||
}
|
||
}
|