mirea-projects/Third term/Programming of corporate systems/1/main.cs
2024-09-24 02:22:33 +03:00

158 lines
6.5 KiB
C#
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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