mirea-projects/Third term/Programming of corporate systems/1/main.cs

158 lines
6.5 KiB
C#
Raw Normal View History

2024-09-23 23:22:33 +00:00
/*
Описание программного продукта
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("Неверный формат числа");
}
}