158 lines
6.5 KiB
C#
158 lines
6.5 KiB
C#
|
/*
|
|||
|
Описание программного продукта
|
|||
|
|
|||
|
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("Неверный формат числа");
|
|||
|
}
|
|||
|
}
|