Перейти к основному содержимому

Калькулятор на C#

Калькулятор на C#

Калькулятор на C# — это учебное консольное приложение, демонстрирующее базовые принципы обработки пользовательского ввода, выполнения арифметических операций и управления потоком программы. Такой пример полезен для начинающих разработчиков, изучающих синтаксис языка, работу с типами данных и структурами управления.


Простая реализация

Простейший калькулятор запрашивает у пользователя два числа и операцию, после чего выводит результат:

using Система;

class SimpleCalculator
{
static void Main()
{
Console.WriteLine("=== Простой калькулятор ===");
Console.Write("Введите первое число: ");
double num1 = Convert.ToDouble(Console.ReadLine());

Console.Write("Введите операцию (+, -, *, /): ");
string operation = Console.ReadLine();

Console.Write("Введите второе число: ");
double num2 = Convert.ToDouble(Console.ReadLine());

double result = 0;
bool validOperation = true;

switch (operation)
{
case "+":
result = num1 + num2;
break;
case "-":
result = num1 - num2;
break;
case "*":
result = num1 * num2;
break;
case "/":
if (num2 != 0)
result = num1 / num2;
else
{
Console.WriteLine("Ошибка: деление на ноль.");
return;
}
break;
default:
validOperation = false;
Console.WriteLine("Неизвестная операция.");
break;
}

if (validOperation)
Console.WriteLine($"Результат: {num1} {operation} {num2} = {result}");
}
}

Эта версия:

  • Поддерживает четыре основные арифметические операции.
  • Проверяет деление на ноль.
  • Использует double для работы с дробными числами.
  • Завершает выполнение при ошибке.

Расширенная реализация с циклом и повторным использованием

Более удобный вариант позволяет выполнять несколько вычислений подряд без перезапуска программы:

using Система;

class AdvancedCalculator
{
static void Main()
{
Console.WriteLine("=== Расширенный калькулятор ===");
Console.WriteLine("Поддерживаемые операции: +, -, *, /");
Console.WriteLine("Введите 'exit', чтобы завершить работу.\n");

while (true)
{
Console.Write("Первое число: ");
string input1 = Console.ReadLine();
if (input1?.ToLower() == "exit") break;

if (!double.TryParse(input1, out double num1))
{
Console.WriteLine("Некорректное число. Попробуйте снова.\n");
continue;
}

Console.Write("Операция (+, -, *, /): ");
string op = Console.ReadLine();
if (op?.ToLower() == "exit") break;

Console.Write("Второе число: ");
string input2 = Console.ReadLine();
if (input2?.ToLower() == "exit") break;

if (!double.TryParse(input2, out double num2))
{
Console.WriteLine("Некорректное число. Попробуйте снова.\n");
continue;
}

double? result = PerformCalculation(num1, op, num2);
if (result.HasValue)
{
Console.WriteLine($"Результат: {num1} {op} {num2} = {result.Value}\n");
}
else
{
Console.WriteLine("Ошибка: неверная операция или деление на ноль.\n");
}
}

Console.WriteLine("Работа калькулятора завершена.");
}

static double? PerformCalculation(double a, string operation, double b)
{
return operation switch
{
"+" => a + b,
"-" => a - b,
"*" => a * b,
"/" when b != 0 => a / b,
_ => null
};
}
}

Особенности этой реализации:

  • Использует double.TryParse для безопасного преобразования строк в числа.
  • Позволяет выйти из программы, введя exit на любом этапе.
  • Выделяет логику вычислений в отдельный метод PerformCalculation.
  • Применяет pattern matching через switch выражение (C# 8+).
  • Возвращает null, если операция недопустима или произошло деление на ноль.

Объектно-ориентированная версия

Для демонстрации принципов ООП можно инкапсулировать функциональность калькулятора в класс:

using Система;

public class Calculator
{
public double Add(double a, double b) => a + b;
public double Subtract(double a, double b) => a - b;
public double Multiply(double a, double b) => a * b;
public double Divide(double a, double b)
{
if (b == 0) throw new DivideByZeroException("Деление на ноль невозможно.");
return a / b;
}

public double? Calculate(double a, string operation, double b)
{
return operation switch
{
"+" => Add(a, b),
"-" => Subtract(a, b),
"*" => Multiply(a, b),
"/" => Divide(a, b),
_ => null
};
}
}

class Program
{
static void Main()
{
var calc = new Calculator();
Console.WriteLine("=== ООП-калькулятор ===");

while (true)
{
try
{
Console.Write("Число 1 (или 'q' для выхода): ");
string s1 = Console.ReadLine();
if (s1 == "q") break;

double x = double.Parse(s1);
Console.Write("Операция (+, -, *, /): ");
string op = Console.ReadLine();
Console.Write("Число 2: ");
double y = double.Parse(Console.ReadLine());

double? res = calc.Calculate(x, op, y);
if (res.HasValue)
Console.WriteLine($"= {res.Value}");
else
Console.WriteLine("Неизвестная операция.");
}
catch (DivideByZeroException ex)
{
Console.WriteLine($"Ошибка: {ex.Message}");
}
catch (FormatException)
{
Console.WriteLine("Ошибка: введите корректное число.");
}
catch (Exception ex)
{
Console.WriteLine($"Неожиданная ошибка: {ex.Message}");
}

Console.WriteLine();
}
}
}

Преимущества ООП-подхода:

  • Чёткое разделение ответственности.
  • Возможность расширения (например, добавление новых операций как методов).
  • Лёгкость тестирования отдельных методов.
  • Обработка исключений на уровне вызова.

Возможные улучшения

  • Поддержка скобок и приоритетов операций — реализация парсера выражений (например, через алгоритм Дейкстры или рекурсивный спуск).
  • История вычислений — сохранение последних N операций в списке.
  • Графический интерфейс — создание оконного приложения с помощью Windows Forms, WPF или MAUI.
  • Локализация — поддержка разных языков и форматов чисел.
  • Настройка точности — ограничение количества знаков после запятой.

См. также

Другие статьи этого же раздела в боковом меню (как на странице «О разделе»).