Модул 2

Условни конструкции (if-else, switch-case)

Как програмата избира какво да направи — конструкциите if, else if и else, сравняване на стойности, комбиниране на условия с логически оператори и кога switch-case е по-добрият избор.

Теория

До момента програмите ни се изпълняваха ред по ред, отгоре надолу. Условните конструкции позволяват на програмата да поеме по различен път според данните — точно както човек взема решение: "ако вали → взимам чадър, иначе → не".

Конструкцията if проверява булев израз — нещо, което е или true, или false. Ако е true, се изпълнява блокът в къдравите скоби. С else задаваме какво да стане в противен случай, а с else if нареждаме няколко проверки една след друга — изпълнява се само първата вярна.

Сложни условия строим с логическите оператори: && (И) изисква всички условия да са верни, || (ИЛИ) — поне едно, а ! (НЕ) обръща стойността. C# използва "мързеливо" оценяване: при a && b, ако a е false, b изобщо не се проверява.

switch-case е специализирана конструкция за случая "една променлива срещу много конкретни стойности". Вместо дълга стълбица от else if, изброяваме case-ове. Всеки завършва с break, а default хваща всичко останало — като else.

За кратък избор между две стойности има тернарен оператор: условие ? стойностАко : стойностИначе. Например string status = score >= 3 ? "взет" : "невзет"; замества цял if-else блок. Ползвайте го само за прости случаи — при сложна логика обикновеният if е по-четим.

Конструкциите могат да се влагат: if вътре в if. Това е нормално, но дълбочина над 2-3 нива е сигнал, че логиката може да се опрости — чрез комбиниране на условия с &&/|| или чрез ранен изход.

Златни правила

Условието винаги е булево

Условието в if винаги трябва да връща булев резултат (true или false). В C# не може да се пише if (5) както в някои други езици.

= не е ==

Внимавайте: = е за присвояване на стойност, а == е за сравнение. if (a = 5) е грешка при компилация, търсите if (a == 5).

Кога switch?

switch конструкцията е идеална, когато имате една променлива, която искате да сравните с множество фиксирани стойности (дни от седмицата, менюта, кодове).

Не забравяйте break

Всеки case (с код в него) трябва да завършва с break; — иначе компилаторът ще откаже да компилира. Празните case-ове могат да "пропадат" към следващия и така няколко стойности споделят един код.

Бърз справочник

Логически оператори

ОператорЗначениеПример
&&Логическо И (AND) — всички условия трябва да са верни.a > 5 && b < 10
||Логическо ИЛИ (OR) — поне едно условие трябва да е вярно.day == 6 || day == 7
!Логическо НЕ (NOT) — обръща стойността.!(a > b)

Оператори за сравнение

ОператорЗначениеПример (резултат)
==Равно ли е5 == 5true
!=Различно ли е5 != 3true
> / <По-голямо / по-малко5 > 7false
>= / <=По-голямо или равно / по-малко или равно5 >= 5true

Код за анализ и пренаписване

if-else стълбица и switch-case

Program.cs
using System;

namespace ModuleTwo
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("Въведете оценка (2-6): ");
            int score = int.Parse(Console.ReadLine());

            // 1. Пример с if-else
            if (score >= 5)
            {
                Console.WriteLine("Отличен резултат!");
            }
            else if (score >= 3 && score < 5)
            {
                Console.WriteLine("Добър резултат, но може и по-добре.");
            }
            else
            {
                Console.WriteLine("Слаб резултат. Трябва да се учи повече!");
            }

            // 2. Пример със switch-case
            Console.Write("Въведи ден от седмицата (1-7): ");
            int day = int.Parse(Console.ReadLine());

            switch (day)
            {
                case 1:
                case 2:
                case 3:
                case 4:
                case 5:
                    Console.WriteLine("Работен ден.");
                    break;
                case 6:
                case 7:
                    Console.WriteLine("Уикенд!");
                    break;
                default:
                    Console.WriteLine("Невалиден ден!");
                    break;
            }
        }
    }
}

Какво се случва тук?

  • Проверките в if-else if-else се изпълняват отгоре надолу и спират на първото вярно условие — затова редът им има значение.
  • Условието score >= 3 && score < 5 показва комбиниране с &&: и двете трябва да са верни. Всъщност тук score < 5 е гарантирано (иначе щеше да влезе в първия if), но е оставено за яснота.
  • Последният else няма условие — той хваща всичко, което не е минало през горните проверки.
  • В switch-а case 1 до 5 са празни и "пропадат" надолу — и петте стойности изпълняват един и същ код. Това е законно само когато case-ът е празен.
  • default играе ролята на else — изпълнява се, когато никой case не съвпада (напр. потребителят въведе 9).

Тернарен оператор и вложени проверки

Program.cs
using System;

namespace ModuleTwoExtra
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("Въведи възраст: ");
            int age = int.Parse(Console.ReadLine());

            // Тернарен оператор: кратък if-else за избор на стойност
            string category = age >= 18 ? "пълнолетен" : "непълнолетен";
            Console.WriteLine($"Ти си {category}.");

            // Вложен if - проверка вътре в проверката
            if (age >= 14)
            {
                if (age < 18)
                {
                    Console.WriteLine("Имаш лична карта, но не и книжка.");
                }
                else
                {
                    Console.WriteLine("Имаш всички права на възрастен.");
                }
            }
            else
            {
                Console.WriteLine("Още нямаш лична карта.");
            }

            // Същото, но по-плоско - с && вместо влагане
            if (age >= 14 && age < 18)
            {
                Console.WriteLine("(казано иначе: между 14 и 17 си)");
            }
        }
    }
}

Какво се случва тук?

  • Тернарният оператор се чете: "възрастта поне 18 ли е? ако да → пълнолетен, иначе → непълнолетен". Резултатът е стойност, която направо присвояваме.
  • Вложеният if стъпва на вече доказаното: щом сме вътре в if (age >= 14), знаем, че възрастта е поне 14, и проверяваме само горната граница.
  • Последният пример показва, че влагането често може да се "сплеска" с && — двата записа са еквивалентни, но плоският е по-лесен за четене.
  • Изборът тернарен срещу if-else: тернарният е за избор на стойност в един ред; ако трябва да се изпълняват команди — ползвайте if-else.

Внимавай! Чести грешки

Грешките, които почти всеки прави в тази тема — виж разликата между грешния и правилния код.

Присвояване вместо сравнение

Грешно

if (score = 5)
{
    Console.WriteLine("Точно 5!");
}

Правилно

if (score == 5)
{
    Console.WriteLine("Точно 5!");
}

= присвоява, == сравнява. В C# if (score = 5) не се компилира (условието не е bool) — за щастие компилаторът ни пази, но навикът да пишете == в условия е важен.

Точка и запетая след if

Грешно

if (score >= 5);
{
    Console.WriteLine("Отличен!");
}

Правилно

if (score >= 5)
{
    Console.WriteLine("Отличен!");
}

; веднага след if (...) е празна команда — тя става "тялото" на проверката, а блокът отдолу се изпълнява винаги, независимо от условието. Най-коварното: това се компилира без грешка!

Сравнение на низове с различен регистър

Грешно

string answer = Console.ReadLine();
if (answer == "Da") // "da" и "DA" не минават

Правилно

string answer = Console.ReadLine();
if (answer.ToLower() == "da")

C# различава главни и малки букви и при сравнение на низове. Нормализирайте входа с ToLower() (или ToUpper()), за да приемете всички варианти на изписване.

&& там, където трябва ||

Грешно

if (day == 6 && day == 7)
{
    Console.WriteLine("Уикенд!");
} // никога не се изпълнява

Правилно

if (day == 6 || day == 7)
{
    Console.WriteLine("Уикенд!");
}

Една променлива не може да е едновременно 6 И 7 — условието с && е винаги false. Когато проверяваме дали стойността е "една от няколко", връзката е ИЛИ (||).

Задачи за самостоятелна работа

Опитай първо сам — подсказката е там само ако наистина закъсаш.

Задача 1: Магазин за плодове

Потребителят въвежда плод и количество. Направете ценоразпис (напр. banana = 2.50, apple = 1.20). Програмата трябва да изведе общата цена.

Задача 2: Валидно време

Потребителят въвежда час и минути като две отделни числа. Програмата проверява дали часът е валиден (часове 0-23, минути 0-59).

Задача 3: Прост калкулатор

Потребителят въвежда две числа и операция (+, -, *, /). Използвайте switch, за да изпълните операцията и отпечатате резултата. При делене проверете дали делителят не е 0.

Мини-тест за проверка

Отговори си наум (или на глас!) и чак тогава разкрий отговора.

1. Кога е по-добре да използваме switch-case пред if-else?

2. Какво прави ключовата дума break в switch конструкцията?

3. Какъв ще е резултатът от израза: !(5 > 3) && (2 == 2)?

4. Какво прави тернарният оператор ?: и кога е удачно да се ползва?

Речник на термините

Виж пълния речник на курса
Условие
Израз, който се изчислява до true или false и определя кой клон от кода ще се изпълни.
Булев израз
Всеки израз с резултат от тип bool — сравнение (a > 5), логическа комбинация (a > 5 && b < 10) или булева променлива.
Разклонение
Точка, в която програмата избира между два или повече пътя на изпълнение (if-else, switch).
Оператор за сравнение
==, !=, >, <, >=, <= — сравняват две стойности и връщат bool.
Логически оператор
&& (И), || (ИЛИ), ! (НЕ) — комбинират или обръщат булеви стойности.
Тернарен оператор
Съкратен if-else за избор на стойност: условие ? приTrue : приFalse.
Fall-through (пропадане)
Празни case-ове в switch, които "пропадат" към следващия — така няколко стойности споделят един код.
Мързеливо оценяване
При a && b, ако a е false, b изобщо не се проверява (резултатът вече е ясен). Аналогично за || при true.

Провери знанията

Бърз тест с избор от отговори върху термините на модула — с точки и моментална обратна връзка.

Провери знанията си

8 въпроса върху термините от модула. Показваме определение — ти избираш правилния термин.

Препоръки за този модул

  • Първо изговорете условието на български ("ако оценката е поне 5 → отличен"), после го преведете на C#.
  • Проверявайте граничните стойности: при условие score >= 5 тествайте точно с 5, с 4.99 и с 6.
  • Ако имате повече от 3-4 else if срещу една и съща променлива — помислете за switch.
  • Таблица на истинност помага: разпишете всички комбинации от true/false, когато условието стане сложно.

Начален курс по C# — учебен наръчник и бърз справочник за студенти.

Натисни Ctrl K или / отвсякъде, за да търсиш.