$ sudo teach IT
Модуль 2 · Примитивные операции

Урок 2.1 — Переменные и вывод

Научимся создавать переменные, разберём типы данных и освоим главный инструмент отладки — вывод на экран.

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

📦

Что такое переменная в C#

Когда программа работает, ей нужно где-то хранить данные: имя пользователя, результат вычисления, счёт в игре, цену товара. Для этого используется оперативная память (RAM) — быстрое временное хранилище компьютера.

Переменная — это именованная область в памяти, в которой хранится значение определённого типа. В отличие от Python, в C# ты обязан указать тип переменной при её создании. Это называется статической типизацией.

Общая схема:

тип имя = значение;

Пример: int age = 25; — «создай переменную age типа int (целое число) и положи туда 25».

C# · Создание переменных
int age = 25;                // целое число
double price = 1499.99;       // дробное число
string name = "Анна";          // строка текста
bool isStudent = true;        // логическое значение (истина/ложь)

Важно понять: в отличие от Python, ты не можешь написать age = 25 без указания типа. C# строг: если переменная объявлена как int, ты не сможешь положить в неё строку.

Переменная может менять своё значение. Но тип остаётся тем же:

C# · Изменение значения переменной
int score = 0;         // в начале игры счёт равен 0
Console.WriteLine(score);  // → 0

score = 10;            // игрок набрал 10 очков
Console.WriteLine(score);  // → 10

score = score + 5;     // прибавляем ещё 5
Console.WriteLine(score);  // → 15

// ❌ Ошибка! Нельзя положить строку в int:
// score = "привет";   // compilation error!
💡 Строка score = score + 5 читается так: «возьми текущее значение score (10), прибавь 5, и результат (15) запиши обратно в score». Сначала вычисляется правая часть, потом записывается в левую.
✏️

Имена переменных и стиль camelCase

В C# действуют строгие правила для имён переменных, а также соглашения, принятые в .NET-сообществе.

Правила (нарушать нельзя — ошибка компиляции):

  • Имя может содержать буквы (включая Unicode), цифры и символ подчёркивания _
  • Имя не может начинаться с цифры
  • Имя не может содержать пробелы или спецсимволы (-, +, @ и т.д.)
  • Имя не может быть ключевым словом C# (int, class, if, for и т.д.)
  • C# чувствителен к регистру: age и Age — разные переменные

Соглашения (рекомендуется соблюдать):

  • camelCase — первое слово с маленькой буквы, каждое следующее с большой: userName, maxSpeed, totalPrice
  • Имя должно быть осмысленным: customerName, а не cn или x
  • Не используй сокращения без необходимости: buttonColor, а не btnClr

✅ Правильно

  • userName
  • totalPrice
  • maxSpeed
  • isActive
  • itemsCount

❌ Неправильно

  • 2name — цифра в начале
  • user-name — дефис запрещён
  • user name — пробел запрещён
  • int — ключевое слово
  • user_name — это snake_case (стиль Python, не C#)

⚠️ Зарезервированные слова C#

Вот ключевые слова, которые нельзя использовать как имена переменных:

abstract   as   base   bool   break   byte   case   catch   char   checked   class   const   continue   decimal   default   delegate   do   double   else   enum   event   explicit   extern   false   finally   fixed   float   for   foreach   goto   if   implicit   in   int   interface   internal   is   lock   long   namespace   new   null   object   operator   out   override   params   private   protected   public   readonly   ref   return   sbyte   sealed   short   sizeof   stackalloc   static   string   struct   switch   this   throw   true   try   typeof   uint   ulong   unchecked   unsafe   ushort   using   var   virtual   void   volatile   while
🔢

Базовые типы данных: int, double, string, bool

В C# каждое значение имеет тип. Тип определяет, какие данные можно хранить и какие операции выполнять. В отличие от Python, C# требует объявления типа — зато компилятор ловит ошибки до запуска.

int Целые числа

Целые числа без дробной части. Занимает 4 байта (32 бита). Диапазон: от −2 147 483 648 до 2 147 483 647. Этого достаточно для большинства задач: возраст, количество товаров, счёт в игре.

C# · Тип int
int age = 17;
int temperature = -5;
int itemsInCart = 0;
int year = 2026;

Console.WriteLine(age + 1);   // 18 — можно складывать
Console.WriteLine(age * 2);   // 34 — умножать
Console.WriteLine(age * age); // 289 — квадрат числа
double Дробные числа (с плавающей точкой)

Числа с дробной частью. Занимает 8 байт. Точность: около 15-16 знаков после запятой. Используй для цен, координат, научных расчётов.

C# · Тип double
double price = 1499.99;    // цена товара
double height = 1.75;      // рост в метрах
double pi = 3.1415926535;  // число π

// Деление целых чисел может дать неожиданный результат:
int a = 5;
int b = 2;
Console.WriteLine(a / b);  // → 2 (не 2.5!) — целочисленное деление!

// Чтобы получить дробный результат, нужен double:
double x = 5.0;
double y = 2.0;
Console.WriteLine(x / y);  // → 2.5
💡 Если разделить одно целое число на другое — C# вернёт целое число, отбросив дробную часть. Это одна из самых частых ошибок новичков. Запомни: int / int = int (с отбрасыванием остатка).
string Строки (текст)

Строка — это последовательность символов, заключённая в двойные кавычки "...". В C# строка — это ссылочный тип (хранится в куче, а не на стеке).

C# · Тип string
string firstName = "Анна";
string lastName = "Смирнова";
string city = "Москва";

// Конкатенация — склеивание строк через +
string fullName = firstName + " " + lastName;
Console.WriteLine(fullName);    // Анна Смирнова

// Важно: "5" и 5 — разные вещи!
string numStr = "5";
int numInt = 5;
// Console.WriteLine(numStr + numInt);  // ОШИБКА! Нельзя сложить string и int
💡 "42" — это строка (текст). 42 — это число. Внешне похожи, но C# работает с ними по-разному. Строку нельзя умножать, делить или вычитать.
bool Логические значения

Самый простой тип: только два значения — true и false (строчными буквами). Используется для условий, флагов, переключателей.

C# · Тип bool
bool isLoggedIn = true;
bool isPremium = false;
bool hasDiscount = true;

// Bool возникает при сравнениях:
int age = 20;
bool isAdult = age >= 18;
Console.WriteLine(isAdult);   // True

double price = 500;
bool isExpensive = price > 1000;
Console.WriteLine(isExpensive);  // False

Как узнать тип переменной?

Используй метод GetType() или оператор typeof():

C# · Определение типа
Console.WriteLine(42.GetType());       // System.Int32
Console.WriteLine(3.14.GetType());     // System.Double
Console.WriteLine("привет".GetType()); // System.String
Console.WriteLine(true.GetType());     // System.Boolean
🖨️

Вывод данных: Console.WriteLine() и Console.Write()

Console.WriteLine() — это метод, который выводит данные на экран и переводит курсор на новую строку. Console.Write() делает то же самое, но без переноса строки.

C# · WriteLine vs Write
Console.WriteLine("Привет, мир!");  // → Привет, мир! (и перенос строки)
Console.Write("Привет, ");         // → Привет, (без переноса)
Console.WriteLine("мир!");         // → мир! (дописывает в ту же строку и переносит)
// Вывод: Привет, мир!

Можно выводить несколько значений, передавая их через + (конкатенация) или через запятую:

C# · Разные способы вывода
string name = "Ольга";
int age = 28;
string city = "Питер";

// Через конкатенацию (+):
Console.WriteLine("Имя: " + name + ", возраст: " + age);

// Через форматирование (подстановка):
Console.WriteLine("Имя: {0}, возраст: {1}", name, age);

// Через интерполяцию (лучший способ!):
Console.WriteLine($"Имя: {name}, возраст: {age}");
🔤

Интерполяция строк: $"..."

Интерполяция строк — это самый удобный и современный способ вставить переменную в текст в C#. Ставишь знак $ перед строкой и пишешь имя переменной в фигурных скобках:

C# · Интерполяция строк
string name = "Катя";
int age = 22;
string city = "Казань";

Console.WriteLine($"Меня зовут {name}, мне {age} лет, я из {city}");
// → Меня зовут Катя, мне 22 лет, я из Казань

// Внутри {} можно писать выражения:
Console.WriteLine($"Через 5 лет мне будет {age + 5} лет");
// → Через 5 лет мне будет 27 лет

// Можно даже вызывать методы:
Console.WriteLine($"Моё имя в верхнем регистре: {name.ToUpper()}");
// → Моё имя в верхнем регистре: КАТЯ
💡 Интерполяция появилась в C# 6.0 (2015 год). Сегодня это — стандарт. Используй её всегда вместо конкатенации через +. Код становится чище и читабельнее.
💬

Комментарии в коде: //, /* */, ///

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

В C# есть три вида комментариев:

C# · Виды комментариев
// 1. Однострочный комментарий — начинается с двойного слеша
// Всё, что после // до конца строки, игнорируется

int x = 10;  // комментарий в конце строки

// 2. Многострочный комментарий /* ... */
/* Этот комментарий
   может занимать
   несколько строк */

// 3. XML-комментарий /// — для документации
/// <summary>
/// Этот метод вычисляет скидку для клиента.
/// </summary>
static double CalculateDiscount(double price)
{
    return price * 0.9;
}

Когда писать комментарии?

  • Объясни почему, а не что. Разбери сам: // +1 потому что массив начинается с 0 — полезно. // прибавляем 1 — бесполезно.
  • Временно отключи строку при отладке: // Console.WriteLine("тест");
  • Оставь заметку TODO: // TODO: добавить обработку ошибок
  • Обозначь секции кода: // ====== РАЗДЕЛ: РАСЧЁТ ЦЕНЫ ======
🧩

Всё вместе — реальный пример

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

C# · Карточка покупки
using System;

class Program
{
    static void Main()
    {
        // ============================================
        // Программа: Карточка покупки товара
        // ============================================

        // Данные покупателя
        string customerName = "Виктория";
        int customerAge = 31;
        bool isPremium = true;

        // Данные товара
        string productName = "Наушники Sony";
        double productPrice = 7990.0;
        int quantity = 2;

        // Подсчёт скидки: премиум-клиенты получают 15%
        double discountRate = isPremium ? 0.15 : 0.0;

        // Итоговая сумма
        double subtotal = productPrice * quantity;
        double discountAmount = subtotal * discountRate;
        double total = subtotal - discountAmount;

        // Вывод красивого чека
        Console.WriteLine("=".PadRight(40, '='));
        Console.WriteLine($"  Добро пожаловать, {customerName}!");
        Console.WriteLine("=".PadRight(40, '='));
        Console.WriteLine($"  Товар:    {productName}");
        Console.WriteLine($"  Цена:     {productPrice} руб. x {quantity} шт.");
        Console.WriteLine($"  Скидка:   {(int)(discountRate * 100)}%  (-{discountAmount} руб.)");
        Console.WriteLine("-".PadRight(40, '-'));
        Console.WriteLine($"  ИТОГО:    {total} руб.");
        Console.WriteLine("=".PadRight(40, '='));
    }
}
💡 string.PadRight() — дополняет строку символами до нужной длины. "=".PadRight(40, '=') создаёт строку из 40 знаков «=». Это один из встроенных методов работы со строками.
📌

Что важно запомнить

1️⃣
В C# нужно указывать тип переменной. int x = 5; — это статическая типизация. Тип изменить нельзя.
2️⃣
Имена в стиле camelCase. Буквы, цифры, подчёркивание. Начинается не с цифры. Нельзя использовать ключевые слова.
3️⃣
4 базовых типа: int (целые), double (дробные), string (текст в двойных кавычках), bool (true/false).
4️⃣
Console.WriteLine() выводит с переносом строки. Console.Write() — без переноса. Интерполяция $"..." — лучший способ вставить переменную.
5️⃣
Комментарии: // — однострочный, /* */ — многострочный, /// — XML-документация. Пиши для людей, объясняя «почему».

Тест: 2.1: Переменные и вывод

7 вопросов

Переменные

Premium