Теория
До момента програмите ни се изпълняваха ред по ред, отгоре надолу. Условните конструкции позволяват на програмата да поеме по различен път според данните — точно както човек взема решение: "ако вали → взимам чадър, иначе → не".
Конструкцията 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 == 5 → true |
!= | Различно ли е | 5 != 3 → true |
> / < | По-голямо / по-малко | 5 > 7 → false |
>= / <= | По-голямо или равно / по-малко или равно | 5 >= 5 → true |
Код за анализ и пренаписване
if-else стълбица и switch-case
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).
Тернарен оператор и вложени проверки
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.&& (И), || (ИЛИ), ! (НЕ) — комбинират или обръщат булеви стойности.условие ? приTrue : приFalse.case-ове в switch, които "пропадат" към следващия — така няколко стойности споделят един код.a && b, ако a е false, b изобщо не се проверява (резултатът вече е ясен). Аналогично за || при true.Провери знанията
Бърз тест с избор от отговори върху термините на модула — с точки и моментална обратна връзка.
Провери знанията си
8 въпроса върху термините от модула. Показваме определение — ти избираш правилния термин.
Препоръки за този модул
- Първо изговорете условието на български ("ако оценката е поне 5 → отличен"), после го преведете на C#.
- Проверявайте граничните стойности: при условие
score >= 5тествайте точно с 5, с 4.99 и с 6. - Ако имате повече от 3-4
else ifсрещу една и съща променлива — помислете заswitch. - Таблица на истинност помага: разпишете всички комбинации от true/false, когато условието стане сложно.