Една C++ програма започва изпълнението си от първото изявление във функцията main(). Това е първия израз завършващ с точка и запетая. Понякога ги наричаме команди. Продължава към следващия и така нататък докато функцията main() приключи. Това е потока на изпълнение в нашата програма.
Ние можем да правим разклонения в този поток като създаваме нови функции (подпрограми). Това ни позволява да не пишем един и същи код два пъти. Да не се повтаряме. Когато трябва да повторим един блок от кода няколко пъти използваме цикли. Когато трябва да вземем решение за логическо разклонение в кода използваме конструкцията if() else. Тази констрикция е много проста:
if( условие ) {
// този блок се изпълнява, когато
// условието == true
}
else {
// този блок се изпълнява, когато
// условието == false
}Частта else { … } е опционална. Не е задължителна. Къдравите скоби също не са задължителни, когато в блока имаме само едно изявление, команда. Но когато имаме къдрави скоби кода става по четлив. Следващите два примера правят едно и също нещо. Вие решете дали да използвате съкратения вариант.
Пример 1:
int myAge = 12;
if(myAge >= 18) {
cout << "You are adult." << endl;
}
else {
cout << "You are teenager." << endl;
}Пример 2 (съкратен вариант):
int myAge = 12;
if(myAge >= 18)
cout << "You are adult." << endl;
else
cout << "You are teenager." << endl;Запомнете, съкратения вариант е валиден само когато имаме една команда. Едно изявления завършващо с „;“. Когато командите са повече къдравите скоби са задължителни.
В долните примери има огромна разлика:
Промер 3 (грешно):
int myAge = 12;
if(myAge >= 18)
cout << "You are adult." << endl;
CheckPassword();Този пример е неправилно форматиран и логически грешен. Функцията CheckPassword() ще се изпълнява винаги.
Пример 4 (правилно):
int myAge = 12;
if(myAge >= 18) {
cout << "You are adult." << endl;
CheckPassword();
}Този пример е логически правилен. CheckPassword() ще се изпълни, ако сте на 18 или повече години.
Най – често срещаната грешка е, че забравяме отварящата или затварящата къдрава скоба на блока. Дали от незнание или бързина – няма значение. Първо пишете къдравите скоби, за да създадете блока и после пишете вътре в него.
Друга честа грешка е, че може да напишете = вместо == когато проверявате за равенство. И трето, може да забравите else частта. Когато тя е логически необходима. Но това ще откриете, по неправилното поведение на програмата. Тъй, че споко.
Вложени if – else
Условните структури могат да се влагат. Това означава, че в тялото на един if – else можем да вложим други if – else конструкции. Това ни позволява да проверяваме други условия стъпка по стъпка вместо да пишем едно огромно условие.
#include <iostream>
using namespace std;
int main() {
bool loggedIn = true;
bool isAdmin = true;
if (loggedIn) {
cout << "Потребителят е влязъл.\n";
if (isAdmin)
cout << "Достъп до админ панел.\n";
else
cout << "Ограничен достъп.\n";
}
else
cout << "Моля, влезте в системата.\n";
}Изпробвайте горния пример с различни стойности на булевите променливи.
Ето и един практичен пример. Ще проверим дали една зададена от потребителя година е високосна. За да бъде годината високосна трябва да изпълнява условията: Да се дели на 4. Да Не се дели на 100. Или да се дели на 400.
#include <iostream>
using namespace std;
int main() {
int year = 0;
cout << "Enter Year: ";
cin >> year;
cout << endl;
// check
bool isLeap = false;
if(year % 4 == 0) {
if(year % 100 == 0) {
if(year % 400 == 0)
isLeap = true;
else
isLeap = false;
}
else
isLeap = true;
}
else
isLeap = false;
// print
if(isLeap)
cout << year << " is a leap year." << endl;
else
cout << year << " is not a leap year." << endl;
}Последователни if – else
Когато трябва да проверяваме стойността на една променлива по добрия вариант е да го направим с последователни if – else кострукций. Тук новата конструкция започва от else на предходната. Това води до по лесно четим код. Но е важно да спазваме последователността.
Важното което трябва да запомните:
Изпълнява се само един блок при вярно условие. Останалите не се проверяват. Ако няма вярно условие се изпълнява последния else блок, ако има такъв.
Условията трябва да се изключват логически. Всяко следващо условие трябва да има смисъл само ако предишните са false.
#include <iostream>
using namespace std;
int main() {
int year;
cout << "Въведете година: ";
cin >> year;
if (year % 400 == 0) {
cout << "Високосна година";
}
else if (year % 100 == 0) {
cout << "НЕ е високосна година";
}
else if (year % 4 == 0) {
cout << "Високосна година";
}
else {
cout << "НЕ е високосна година";
}
}Кой подход кога да изберем?
При по детайлни проверки стъпка по стъпка – вложени конструкции.
При нормални задачи последователни if – else.
Задачи
1. Потребителя въвежда число от 0 до 10. Програмата ви трябва да изпише числото с текст на български.
Решение
#include <iostream>
using namespace std;
int main() {
int value = 0;
cout << "Въведи число: ";
cin >> value;
cout << endl;
if(value < 0 || value > 10)
cout << "Невалидно число" << endl;
else if(value == 0)
cout << "Нула" << endl;
else if(value == 1)
cout << "Едно" << endl;
else if(value == 2)
cout << "Две" << endl;
else if(value == 3)
cout << "Три" << endl;
else if(value == 4)
cout << "Четери" << endl;
else if(value == 5)
cout << "Пет" << endl;
else if(value == 6)
cout << "Шест" << endl;
else if(value == 7)
cout << "Седем" << endl;
else if(value == 8)
cout << "Осем" << endl;
else if(value == 9)
cout << "Девет" << endl;
else if(value == 10)
cout << "Десет" << endl;
}2. Напишете програма определяща дали въведена от потребителя година е високосна с една сложна if – else конструкция.
Решение
#include <iostream>
using namespace std;
// разделяме кода на подпрограми
bool isLeapYear(int year) {
if( (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0) )
return true;
else
return false;
}
int main() {
int year;
cout << "Въведете година: ";
cin >> year;
if (isLeapYear(year))
cout << "Високосна година\n";
else
cout << "Не е високосна година\n";
}3. Напишете програма, която използва променливите x и y. И отпечатва по – голямата от тях. Например имате x = 10, y = 20 -> 20.
Решение
#include <iostream>
using namespace std;
int main() {
int x = 22, y = 20;
if(x > y)
cout << x << endl;
else
cout << y << endl;
}4. Напишете програма, която използва променливите x, y и z. И отпечатва по – голямата от тях. Например имате x = 10, y = 20, z = 12 -> 20.
Отговор
#include <iostream>
#include <limits>
using namespace std;
int main() {
int x = 22, y = 42, z = 12;
int result = numeric_limits<int>::min();
if(x > result) result = x;
if(y > result) result = y;
if(z > result) result = z;
cout << result << endl;
}
// Ако изполозваме последователни if-else-if какъв ще бъде резултата? И защо?
// Отг: Грешен резултат. Логически не се връзва с това което искаме да направим.
// А именно да минем през всички сравнения без да излизаме от конструкцията при
// върнат true отговор. 5*. Потребителя въвежда ден, месец, година. Вашата програма трябва да определи дали датата е валидна.
Отговор
#include <iostream>
using namespace std;
// дали годината е високосна
bool IsLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
// брой дни в месеца
int DaysOfMonth(int month, int year) {
if(month == 1)
return 31;
else if(month == 2) {
if(IsLeapYear(year)) return 29;
else return 28;
}
else if(month == 3)
return 31;
else if(month == 4)
return 30;
else if(month == 5)
return 31;
else if(month == 6)
return 30;
else if(month == 7)
return 31;
else if(month == 8)
return 31;
else if(month == 9)
return 30;
else if(month == 10)
return 31;
else if(month == 11)
return 30;
else if(month == 12)
return 31;
else
exit(4);
}
int main() {
int year = 0, day = 0, month = 0;
// присвояване и основни проверки
cout << "Ден: "; cin >> day;
if(! (day >= 1 && day <= 31)) {
cout << "Невалидeн ден" << endl;
return 1;
}
cout << "Месец: "; cin >> month;
if(! (month >= 1 && month <= 12)) {
cout << "Невалиден месец" << endl;
return 2;
}
cout << "Година: "; cin >> year;
if(year < 0) {
cout << "Невалидна година" << endl;
return 3;
}
// проверка на деня от месеца
int max = DaysOfMonth(month, year);
if(day > max) {
cout << "Невалидeн ден" << endl;
return 5;
}
// всичко е наред
cout << "Датата е валидна" << endl;
}