Создаём простое консольное приложение на C#

Прежде, чем мы начнём писать наше простое приложение на языке C#, нужно убедиться, что у Вас уже установлена среда Microsoft Visual Studio, которая используется для разработки программ на C#. Скачать среду разработки можно с официального сайта. В процессе установки мастер предложит Вам множество различных опций, которые можно отметить к установке, но одна из основных опций, которую Вы должны отметить, - это "Разработка классических приложений .NET" (без неё последующая часть статьи будет просто бессмысленна, поэтому обязательно оставьте эту галочку при установке):

 

Итак, когда Вы скачали и установили среду Microsoft Visual Studio с описанной выше опцией, можно пробовать приступать к разработке простого консольного приложения на языке C#.

Когда Вы запустите среду разработки, выберите опцию "Создание проекта":

 

В окне "Создание проекта" Вы увидите множество опций, в частности, первый выпадающий список, в котором перечислены доступные языки. Нам нужно выбрать C# из списка:

После выбора языка C# в качестве целевого для нашего проекта выбираем тип нашего будущего проекта - "Консольное приложение", как показано ниже на рисунке, и жмём "Далее":

На следующем шаге нужно указать имя нашего будущего проекта. В качестве примера для этой статьи давайте выберем имя "MyFirstConsoleApplication" (см. рисунок ниже). Обратите внимание на поле "Расположение" - в моём случае это "C:\Users\компьютер\source\repos", у Вас оно скорее всего будет отличаться. Это директория, в которую мастер предлагает сохранить все файлы нашего будущего проекта. При желании Вы можете изменить этот целевой каталог, но рекомендуется оставить его по умолчанию.

На следующем шаге мастер создания проекта предложит выбрать целевую платформу, в моём случае это значение выпадающего списка ".NET 5.0 (текущая версия)". Здесь можно оставить всё по умолчанию и ничего не менять.

Когда все настройки выполнены, нажимаем кнопку "Создать".

В результате мастер создаст для нас новый проект с выбранным нами именем "MyFirstConsoleApplication" и отобразит в обозревателе решений (маркер 3 на рисунке ниже):

Также обратим внимание, что по умолчанию мастер создания нового проекта уже сгенерировал для нас простую программу на C#! (см. маркер 1 на рисунке). Всё, что делает эта программа, - это вывод строки "Hello World!" на экране нашего консольного приложения. 

Для того, чтобы запустить подготовленную мастером программу и посмотреть результат её работы, достаточно навести курсор на зелёную стрелку с именем нашего проекта (см. маркер 2 на рисунке) и нажать её. Давайте так и сделаем: нажимаем иконку "зелёной стрелки" (или можно нажать клавишу F5 или комбинацию клавиш Ctrl + F5 - они также запустят нашу программу), и мы видим открывшееся консольное окно с надписью "Hello World!":

Уже неплохой результат - мы запустили автоматически сгенерированное мастером приложение на C# и смогли увидеть результат его работы.

Давайте теперь заменим простой вывод строки и напишем приложение, которое будет выполнять элементарные функции калькулятора:

  • складывать два целых числа
  • вычитать одно целое число из другого
  • перемножать два целых числа
  • делить одно целое число на другое

Для этого в файле, содержащем текст нашей программы, напишем следующий код:

class Program {
	static void Main(string[] args) {
		Console.WriteLine("Добро пожаловать в первую программу, написанную по уроку на сайте allineed.ru!");
		Console.WriteLine("Как тебя зовут ? (введи имя и нажми Enter)");
		
		string name = Console.ReadLine();
		Console.WriteLine("Привет, " + name + "! Надеюсь, тебе уже нравится язык C# за его простоту и изящность.");
		Console.WriteLine(name + ", я умею делать простые вычисления: ");
		Console.WriteLine("1. сложить два целых числа");
		Console.WriteLine("2. вычесть целое число из другого целого числа");
		Console.WriteLine("3. перемножить 2 целых числа");
		Console.WriteLine("4. разделить одно целое число на другое");
		Console.WriteLine("Что ты выберешь? (выбери одну из опций от 1 до 4):");

		string strOption;
		bool isEnteredPositiveNumber;
		bool isValidOption;
		int optionNumber = -1;
		string[] operations = new string[] { "сложение двух целых чисел", "вычитание двух целых чисел", "умножение двух целых чисел", "деление одного целого числа на другое" };

		do {
			ReadUserInputUntilEnterPressed(out strOption);
			Console.WriteLine();
			isEnteredPositiveNumber = IsPositiveNumber(strOption);
			isValidOption = false;
			if (!isEnteredPositiveNumber) {
				Console.WriteLine(name + ", Вы ввели не число (или ввели отрицательное)! Пожалуйста, повторите, ввод.");
			} else {                    
				isValidOption = IsValidOption(strOption, 1, 4, out optionNumber);
				if (isValidOption) {
					Console.WriteLine(name + ", отлично! Выбрана опция: " + strOption + "(" + operations[optionNumber - 1] + ")");
				} else {
					Console.WriteLine(name + ", к сожалению, на выбор только цифры от 1 до 4! Вы выбрали: " + strOption + ", поэтому повторите ввод.");
				}                    
			}
		} while (!isEnteredPositiveNumber || !isValidOption);

		Console.WriteLine(name + ", а теперь введи два числа (после ввода каждого числа нажимай Enter для завершения ввода):");

		string first, second;
		bool isFirstNumber, isSecondNumber;

		do {
			ReadUserInputUntilEnterPressed(out first);
			Console.WriteLine();
			isFirstNumber = IsAnyNumber(first);
			if (!isFirstNumber) {
				Console.WriteLine(name + ", прости, но это не число. Давай попробуем ещё разок:");
			}
		} while (!isFirstNumber);
		Console.WriteLine(name + ", супер! Итак, первое число: " + first);
		
		Console.WriteLine("Теперь введи второе число:");

		do {
			ReadUserInputUntilEnterPressed(out second);
			Console.WriteLine();
			isSecondNumber = IsAnyNumber(second);
			if (!isSecondNumber) {
				Console.WriteLine(name + ", прости, но это не число. Давай попробуем ещё разок:");
			}
		} while (!isSecondNumber);
		Console.WriteLine(name + ", отлично! Второе число: " + second);

		int firstNum = Convert.ToInt32(first);
		int secondNum = Convert.ToInt32(second);
		double result = 0;
		char operationSign = '?';

		switch (optionNumber) {
			case 1: // сложение двух чисел
				result = firstNum + secondNum;
				operationSign = '+';
				break;
			case 2: // вычитание двух чисел
				result = firstNum - secondNum;
				operationSign = '-';
				break;
			case 3: // умножение двух чисел
				result = firstNum * secondNum;
				operationSign = '*';
				break;
			case 4: // деление одного числа на другое
				result = firstNum / secondNum;
				operationSign = '/';
				break;
		}

		Console.WriteLine(name + ", а вот и результат операции: " + first + " " + operationSign + " " + second + " = " + result);
		Console.WriteLine(name + ", надеюсь, тебе понравилось. До скорой встречи!");
	}

	static bool IsValidOption(string option, int min, int max, out int optionNumber) {
		optionNumber = Convert.ToInt32(option);
		if (optionNumber >= min && optionNumber <= max) {
			return true;
		}
		return false;
	}

	/// <summary>
	/// Определяет, что входная строка содержит любое целое число (отрицательное или положительное)
	/// </summary>
	/// <param name="input">входная строка</param>
	/// <returns>true, если входная строка содержит отрицательное или положительное целое число, иначе false</returns>
	static bool IsAnyNumber(string input) {
		if (input == null) {
			return false;
		}
		if (input.Length == 1 && (input[0] < '0' || input[0] > '9')) {
			return false;
		}
		for (int i = 0; i < input.Length; i++) {
			if (input[i] == '-') {
				if (i > 0) {
					return false;
				}
			} else {
				if (input[i] < '0' || input[i] > '9') {
					return false;
				}
			}                
		}
		return true;
	}

	/// <summary>
	/// Определяет, что входная строка содержит положительное целое число
	/// </summary>
	/// <param name="input">входная строка</param>
	/// <returns>true, если входная строка содержит положительное целое число, иначе false</returns>
	static bool IsPositiveNumber(string input) {
		if (input == null) {
			return false;
		}
		for (int i = 0; i < input.Length; i++) {
			if (input[i] < '0' || input[i] > '9') {
				return false;
			}
		}
		return true;
	}

	/// <summary>
	/// Читает пользовательский ввод с консоли до тех пор, пока не будет нажата клавиша Enter
	/// </summary>
	/// <param name="param">Выходной параметр, содержащий ввод пользователя</param>
	static void ReadUserInputUntilEnterPressed(out string param) {
		param = "";
		ConsoleKeyInfo keyInfo;
		do {
			keyInfo = Console.ReadKey();
			if (keyInfo.Key != ConsoleKey.Enter) {
				param += keyInfo.KeyChar.ToString();
			}
		} while (keyInfo.Key != ConsoleKey.Enter);
	}
}

Теперь разберём части нашего приложения:

В первой части мы выводим на экран приветствие для пользователя и запрашиваем ввод имени пользователя (по этому имени, как видно далее, мы будем обращаться к пользователю). Также мы выводим основные функции нашей программы-"калькулятора":

Console.WriteLine("Добро пожаловать в первую программу, написанную по уроку на сайте allineed.ru!");
Console.WriteLine("Как тебя зовут ? (введи имя и нажми Enter)");
            
string name = Console.ReadLine();
Console.WriteLine("Привет, " + name + "! Надеюсь, тебе уже нравится язык C# за его простоту и изящность.");
Console.WriteLine(name + ", я умею делать простые вычисления: ");
Console.WriteLine("1. сложить два целых числа");
Console.WriteLine("2. вычесть целое число из другого целого числа");
Console.WriteLine("3. перемножить 2 целых числа");
Console.WriteLine("4. разделить одно целое число на другое");
Console.WriteLine("Что ты выберешь? (выбери одну из опций от 1 до 4):");

Что мы делаем дальше - определяем строковую переменную strOption, которая будет хранить ввод доступной опции (от 1 до 4) именно в виде строкового типа данных. Также мы потом преобразуем это строковое значение в целочисленное и сохраним в переменной optionNumber (пока ей присваивается некоторое значение по умолчанию: -1). Также нам нужны два флага - ввёл ли пользователь положительное число (isEnteredPositiveNumber) и ввёл ли он корректно номер доступной опции (isValidOption). Также мы сохраним краткое описание доступных операций в виде небольшого строкового массива с именем operations:

string strOption;
bool isEnteredPositiveNumber;
bool isValidOption;
int optionNumber = -1;
string[] operations = new string[] { "сложение двух целых чисел", "вычитание двух целых чисел", "умножение двух целых чисел", "деление одного целого числа на другое" };

Дальше мы предлагаем пользователю ввести, собственно, два числа - делаем это за счёт цикла do-while, который будет "крутиться" до тех пор, пока пользователь не введёт корректное число (если пользователь введёт сразу корректное число, то цикл выполняться не будет). Метод с именем ReadUserInputUntilEnterPressed говорит сам за себя - он считывает пользовательский ввод с клавиатуры до тех пор, пока не нажата клавиша Enter, и сохраняет результат в выходной переменной first (обратите внимание на использование ключевого слова C# out для достижения этой цели):

Console.WriteLine(name + ", а теперь введи два числа (после ввода каждого числа нажимай Enter для завершения ввода):");

string first, second;
bool isFirstNumber, isSecondNumber;

do {
   ReadUserInputUntilEnterPressed(out first);
   Console.WriteLine();
   isFirstNumber = IsAnyNumber(first);
   if (!isFirstNumber) {
      Console.WriteLine(name + ", прости, но это не число. Давай попробуем ещё разок:");
   }
} while (!isFirstNumber);

Console.WriteLine(name + ", супер! Итак, первое число: " + first);

Аналогичным образом программа считывает второе число. Для краткости этот участок кода я описывать не буду, он аналогичен вышеописанному.

В заключительной части программы мы производим перевод строкового представления введённых пользователем чисел в целочисленный тип int, также задаём переменную типа double (тип C# для хранения десятичных дробей), где будет храниться результат - result. Также мы производим конкретное действие над введёнными числами, в зависимости от выбранной пользователем опции и отображаем на экране консоли.

int firstNum = Convert.ToInt32(first);
int secondNum = Convert.ToInt32(second);
double result = 0;
char operationSign = '?';

switch (optionNumber) {
	case 1: // сложение двух чисел
		result = firstNum + secondNum;
		operationSign = '+';
		break;
	case 2: // вычитание двух чисел
		result = firstNum - secondNum;
		operationSign = '-';
		break;
	case 3: // умножение двух чисел
		result = firstNum * secondNum;
		operationSign = '*';
		break;
	case 4: // деление одного числа на другое
		result = firstNum / secondNum;
		operationSign = '/';
		break;
}

Console.WriteLine(name + ", а вот и результат операции: " + first + " " + operationSign + " " + second + " = " + result);
Console.WriteLine(name + ", надеюсь, тебе понравилось. До скорой встречи!");

Давайте запустим наше приложение - снова по клику мышью на "зелёную стрелку", или нажав F5. Ниже показан пример взаимодействия нашей программы с пользователем (обратите внимание, что когда вместо первого числа мы пробовали ввести строку "ва", программа выдала нам ошибку и не пропустила дальше):

Попробуйте запустить программу и самостоятельно вводить различные значения и понаблюдать за результатом работы. 

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

Надеюсь, что статья понравилась и дала общее понимание того, как с помощью среды разработки Microsoft Visual Studio создать простое консольное приложение. Не стесняйтесь задавать ваши вопросы в комментариях к статье, если интересуют какие-то нюансы. Также буду благодарен моим читателям за обратную связь по статье.

Спасибо за внимание и до встречи в следующих статьях, посвящённых языку программирования C#!

Яндекс.Метрика