[Autumn Series] Оператори, цикли и условия

Отговори
Потребителски аватар

Автор на темата
Autumn Shade EA\DICE
Developer
Developer
Мнения: 166
Регистриран: 14 мар 2019, 13:20
Се отблагодари: 26 пъти
Получена благодарност: 102 пъти

[Autumn Series] Оператори, цикли и условия

Мнение от Autumn Shade EA\DICE » 14 авг 2019, 13:58

Съдържание:
  • Оператори
  • Цикли
  • Условни блокове
  • Упражнение
  • Какво следва?

Оператори?

Операторите биват четири вида - логически, аритметически, оператори за сравнение и оператори за присвояване(все още наричани комбинирани с изключение на един оператор). Те са доста важна част от това как нашата програма функционира. Нека дадем примери за тези оператори и да започнем първо с по-важните и по-лесните - аритметическите оператори. Чрез тях можем да създаваме различни изрази.

Аритметическите оператори биват:
  • Събиране - Изписва се чрез символа + - Извършва събиране между две променливи/константи.
  • Изваждане - Изписва се чрез символа - - Извършва изваждане между две променливи/константи.
  • Деление - Изписва се чрез символа / - Извършва деление между две променливи/константи.
  • Деление на цели числа с остатък - Изписва се чрез символа % - Извършва деление с остатък между две променливи/константи и връща остатъка.
  • Умножение - Изписва се чрез символа * - Извършва умножение между две променливи/константи.
Нека дадем пример за една операция, пък вие ще направите другите за упражнение. Нека имаме следната задача:

Да се съберат числата 5 и 8 и да се изведе резултата на екрана.

Код: Избери всички

int a = 5;
int b = 8;

cout << (a + b) << endl;
Доста е простичко, не мисля, че има нужда да обяснявам какво точно се случва отдолу. По същият начин можете да видите и за останалите оператори какво ще излезе.

Нека продължим нататък с операторите за сравнение и да видим как можем да ги използваме. Операторите за сравнение в C++ са:
  • По-голямо от - Изписва се чрез симолва > - Сравнява дали една променлива/констана е по-голяма от друга.
  • По-голямо от или равно на - Изписва се чрез симолва >= - Сравнява дали една променлива/констана е по-голяма от или равна на друга.
  • Равно на - Изписва се чрез симолва == - Сравнява дали една променлива/констана е равна на друга.
  • По-малко от - Изписва се чрез симолва < - Сравнява дали една променлива/констана е по-малка от друга.
  • По-малко от или равно на - Изписва се чрез симолва > - Сравнява дали една променлива/констана е по-голяма от друга.
Тези оператори се използват за създаването на условия. Условията се използват в условните блокове, например. Нека да дадем пример за едно сравнение:

Задачата е същата като горната, разликата е, че тук използваме оператор за сравнение (по-голямо от), а не аритметически оператор.

Код: Избери всички

int a = 5;
int b = 8;

cout << (a > b) << endl;

Можете да го направите за упражнение за останалите оператори същото. Ще преминем на логическите и комбинираните оператори, понеже там ще има малко повече примери.

Комбинираните оператори служат за спестяване на време за писане и място. Изглеждат малко нечетливо първоначално, но с времето се свиква.
  • Събиране и присвояване - Изписва се чрез += - Извършва действие събиране с друга променлива/константа и запазва резултата в себе си. Например:

    Искаме да съберем а и b в променливата a. Това ще се случи по следният начин:

    Код: Избери всички

    int a = 5;
    int b = 8;
    
    a += b; // Този ред се равнява на a = a + b и се чете а присвоява досегашната си стойност + стойността на променливата b
    
  • Изваждане и присвояване - Изписва се чрез -= - Извършва действие изваждане с друга променлива/константа и запазва резултата в себе си. Например:
  • Деление и присвояване - Изписва се чрез /= - Извършва действие деление с друга променлива/константа и запазва резултата в себе си. Например:
  • Деление с остатък и присвояване - Изписва се чрез %= - Извършва действие деление с остатък с друга променлива/константа и запазва резултата в себе си. Например:
  • Умножение и присвояване - Изписва се чрез *= - Извършва действие умножение с друга променлива/константа и запазва резултата в себе си. Например:
  • Нарастване - Изписва се чрез ++ - Извършва действието събиране и присвояване, но само с едно. Тоест, ако имаме променливата int a = 1, когато извършим a++ тя ще стане 2. Представете си го като a = a + 1;
  • Намаляване - Изписва се чрез -- - Извършва действието изваждане и присвояване, но само с едно. Тоест, ако имаме променливата int a = 1, когато извършим a-- тя ще стане 0. Представете си го като a = a - 1;
Можете да опитате задачката с другите оператори, за да видите какво излиза и как точно работят. Опитайте и двата варианта - с комбинирани оператори и без. Като за начало, ще е добре да се свикне първо без комбинираните оператори, за да знаете точно как работят.

И сега отиваме на логическите оператори. Логическите оператори се използват в логически изрази, които могат да бъдат условия. Най-често ги използваме в условия, когато искаме да проверим няколко неща едновременно. Нека дадем пример:

Да кажем, че отиваме в един автосалон и си казваме, че ако има бяла или червена кола, то това ще е тя. Ако няма, просто ще си тръгнем. Как това може да се случи? В главата ни реално се случва една проверка, която ние не осъзнаваме, защото е елементарна. Реално, мозъка ни прави една проверка чрез очите. Като огледаме целият салон ние виждаме една бяла кола, но не виждаме червена. Това ни устройва, защото сме си го наумили.

Какво се опитвам да кажа? Искам да кажа, че ние правим тази проверка неусетно, докато при програмирането трябва сами да си я напишем. Нека видим един поток на работа:
  • Влизаме в автосалона
  • Оглеждаме колите
  • Търсим специфичен цвят
  • Ако го намерим, си казваме "Супер, точно това търся"
  • Ако не го намираме, просто си тръгваме и продължаваме към следващият автосалон
Горе-долу това представлява представено кратко и просто. Нека видим сега тези логически операции какви биват:
  • ИЛИ - Изписва се чрез || - Условието изпълнено ако една от двете страни е изпълнена. Нека се върнем на примера по-горе с колите. Спомняте си, че още при влизането ни в автосалона си казахме, че ако има кола с червен или бял цвят, тя ще е колата, която ще си вземем. Ето това е примерна проверка. Влизаме в салона, няма кола с червен цвят, но има с бял. Това ни удовлетворява и нашето условие е изпълнено.
  • И - Изписва се чрез && - Условието изпълнено ако и двете страни са изпълнена. Горе-долу същото каквото казах по-горе, но с една промяна. Искаме сега да влезем наново в друг автосалон и да търсим бяла кола, която да е под 50 000 лева. Тук условието се променя малко, защото имаме две неща, които искаме да се случат. Искаме колата да е бяла и да е под 50 палки.
  • Отрицание - Изписва се чрез ! - Малко трудно би се обяснило това, поне от моя гледна точка, но нека го обясня така. Представете си го като жена в цикъл - казва ти едно, прави обратното. :coolface: Тоест, ако имаме една проверка, която връща, че е истина - примерно, намерили сме кола, която е бяла и е под 50 000 лева, то ако приложим отрицанието, това означава, че израза от истина става неистина, ако това въобще има някаква логика. Нека го дадем като пример в програмирането:

    Имаме една булева променлива със стойност true . Искаме да обърнем резултата да е false.

    Код: Избери всички

    bool check = true;
    
    check = !check; // Тоест, тук на check присвояваме неговата обратна стойност, която на true е false
    
Дотук бяхме с операторите. Ако нещо не се доразбрали, прочетете го отново, ако и тогава не го разберете, пишете, защото не съм от хората, които обясняват добре. Нека преминем към циклите и условните блокове.

Цикли

Циклите представяват женски изблик на нервност и нужда за глад, дължащ се на разли- майтапя се. :coolface:
Циклите представляват набор от действия повторени даден брой пъти. Например, отиваме да бягаме на стадион и си казваме, че ще направим три обиколки. Ние извършваме действието бягане за три обиколки. Това представлява един цикъл. Нека видим различните видове цикли и кога да ги използваме.

Видовете цикли са три в C++:
  • for - За този цикъл трябва да знаем колко пъти ще искаме да се изпълни преди да го използваме. Примерно: Ние обикаляме стадиона и сме си го задали, че три пъти ще го обиколим. Ние знаем колко пъти ще го обиколим и този цикъл ще ни свърши работа, за да извършим действието чрез програма. Ето самият синтаксис и начин на използване на този цикъл:

    Синтаксис:

    Код: Избери всички

    for(<тип данни> <име на променливата, която ще служи за брояч>; <променливата ни, която е брояч> <оператор за сравнение> <променлива/константа, която съдържа в себе си края на цикъла, тоест докога да върти самият брояч>; <променливата ни, която е брояч> <оператор за нарастване или намаляване, или комбиниран за присвояване>) {
    	<действия>
    }
    
    Нека сега да го обясним набързо:
    • <тип данни> - Най-често е int, защото все пак ни трябва брояч, а брояча нараства с единица примерно.
    • <име на променливата, която ще служ за брояч>, <променливата ни, която е брояч> - Как ще се казва променливата ни, която ще използваме за брояч.
    • <оператор за сравнение> - Оператор, по който да сравняваме
    • <променлива/константа, която съдържа в себе си края на цикъла, тоест докога да върти самият брояч> - Докога този цикъл ще се изпълнява. Приемете го като условие
    • <оператор за нарастване или намаляване, или комбиниран за присвояване> - Приемете го като стъпка. Нека го дадем и в реален пример.

    Код: Избери всички

    int laps = 3; // Обиколки, които ще правим на стадиона
    
    for(int index = 0; index < laps; index++ ) {
    	// Бягаме
    }
    
    Принципът на работата на този цикъл е да проверява всеки път стойността си и да я нараства. Тоест, ако първоначално стойността на index е 0, той проверява дали нулата е по-малка от стойността на нашата променлива laps и тогава нараства, след като приключи своето действие. Тоест, ако имаме нула първоначално, след като избягаме една обиколка, то брояча ни ще стане единица, заради стъпката, която е index++.
     ! Съобщение от: Autumn Shade
    Най-често този цикъл го използвате, за да обходите един масив. (Означава да вземете всеки елемент един по един и да извършите дадено действие с него)
  • while - Този цикъл го използвайте, когато не знаете определен край или брой. Тоест, сега ще дам пример с магаазин. Отивате в магазина и си избирате продукт, отивате на опашката. Вие сте пети. Окей, но след вас може да дойде още един човек, след този човек, който идва зад вас може да дойдат още трима и така до безкрай. Как се решава този проблем? Лесно е. Точно затова служи този цикъл. Тук ще използвам неща, за които ще говорим по-късно, за да мога да го покажа като пример как би изглеждало това с опашката в магазина, но първо нека видим синтаксиса на цикъла:

    Код: Избери всички

    while(<условие>) {
    	<действия>
    }
    
    Простичко нали? Условието може да бъде всякакво - от булев израз до най-простата проверка. Нека го покажем и като пример по-горният вариант:

    Код: Избери всички

    #include <queue> // Това ще го обясняваме по-нататък, служи за показване на примера за опашката.
    
    // Създаваме си опашката от хора
    queue<int> people;
    
    // Добавяме хора на опашката, не гледайте, че са цифри - представете си ги като хора
    people.push_back(3);
    people.push_back(1);
    people.push_back(4);
    
    // Използваме цикъла и задаваме условие
    // Условието гласи, че цикълът ще се изпълнява, докато опашката не се изпразни или докато хората не си тръгнат и не останат хора на //опашката.
    while(!people.empty()) {
    	cout << "The person " << people.back() << " payed and went out!" << endl;
    	people.pop_back(); // Човекът сие платил и излиза.
    }
    
    Това е най-простичкото обяснение като цяло. Отново, използвайте го само, когато не знаете кога трябва да приключи цикъла.
  • do-while - Или така нареченият от мене глупакоустойчив цикъл. Този цикъл първо изпълнява действията, после проверява условието. Доста добър начин е за валидация на вход. Например: Искаме да събираме числа въведени от нас, докато не въведем 0. Но нека преди това да видим синтаксис:

    Код: Избери всички

    do {
    	<действия>
    } while(<условие>);
    
    Сега и примерната задачка - Нека напишем програма, която да събира числа въведени от нас, докато не въведем 0. Ето и как би изглеждала програмата:

    Код: Избери всички

    
    int sum = 0, input;
    
    do {
    	cout << "Enter number: " << endl;
    	cin >> input;
    	
    	sum += input // или sum = sum + input;
    } while(input > 0);
    
     ! Съобщение от: Autumn Shade
    Внимание! Когато използвате този цикъл много внимавайте с проверките, защото един знак за сравнение може да доведе до зацикляне!

Условни блокове
Нека поговорим малко и за условните блокове. Те са доста често срещано нещо в нашият живот. Всеки ден ние правим избори на базата на две или повече неща при дадени условия. Например: Аз днеска избрах да не ходя с автобус на работа, а да отида пеша. Тези така наречени условни блокове са все още известни като разклонени алгоритми, защото на базата на избор, вие правите нещо коренно различно от успоредното действие и резултатът става различен. Как така? Ето как - аз казах, че днес съм ходил пеша до работа? Добре, по пътя си видях едно момченце, което имаше нужда от помощ - Изниква още един условен блок - Да му помогна ли или да си продължа? - Аз реших да му помогна, помогнах му, резултатът е различен от този, ако бях си продължил по пътя. То нямаше да ми се усмихне, нямаше да ми каже благодаря на неговият език, нямаше да го видя този резултат. Същото е и с тези условни блокове.Нека видим примери за такива и как да ги използваме:
  • if-else - Това е най-простият условен блок, който може да срещнете и се използва много често в програмирането. Превежда се Ако това се случи, то ще се изпълни следното действие, в противен случай, ще стане нещо друго. Фактически, предадено като синтаксис е следното:

    Код: Избери всички

    if(<условие>) {
    	<първи действия>
    } else {
    	<втори действия>
    }
    
    Чете се по следният начин: Ако условието е изпълнено, ще изпълня първите действия, в противен случай ще изпълня вторите действия
    Толкова е простичко и няма нужда да става по-сложно. Можете да ги и комбинирате, за да стане с малко повече условия. Можете и да ги слагате един в друг условен блок. Пример за един в друг условен блок:

    Код: Избери всички

    if(<условие едно>) {
    	if(<условие две>) {
    		<първи действия>
    	} else {
    		<втори действия>
    	}
    } else {
    	<трети действия>
    }
    
    Работи по същата логика като горното обяснение. Просто влиза по-навътре. Относно комбинациите на условия, можете да правите така:

    Код: Избери всички

    if(<условие едно>) {
    	<първи действия>
    } else if(<условие две>) {
    	<втори действия>
    } else {
    	<трети действия>
    }
    
    Предполагам е ясна каква е логиката.

    Нека продължим напред със следващото и да обясним каква е разликата между двата условни блока. Следващото, с което ще продължим е switch. Реално, if и switch могат да работя по един и същи начин, просто единият в дадени ситуации е много по-компактен и лесен за употреба, красив откъм четене на пръв поглед и практичен спрямо другият. Например, if би се използвал за нещо, което искаш да провериш дали има стойност в него, нещо за по-голямо или по-малко, нещо за сравнение, но той не е удобен, ако трябва да се проверяват стойности на изброим тип. Това означава да имаме поне по три реда за всяка проверка, която трябва да е нещо от вида: if-else if-else , а това е безумно. Ето тук идва приложението на този условен блок под името switch. Нека видим синтаксиса му и да дадем пример:

    Синтаксис:

    Код: Избери всички

    switch(<променлива>) {
    	case <Предполагаема стойност на променливата за условие>:
    		<действия>
    		break;
    	default:
    		<действия>
    		break;
    }
    Как работи?
    Да кажем, че имаме една променлива, която ни служи да си направим избора. И имаме различни варианти. Ние си избираме един вариант и ако той е описан в case, то тогава ще се изпълни действието вътре в този case. Ако не, ще отиде по подразбиране в default и ще изпълни действията на default. Нека го дадем като пример:

    Код: Избери всички

    int choice = 1;
    
    switch(choice) {
    
    	case 0:
    		cout << "You chose 0!" << endl;
    		break;
    		
    	case 1:
    		cout << "You chose 1!" << endl;
    		break;
    		
    	case 2:
    		cout << "You chose 2!" << endl;
    		break;
    				
    	default:
    		cout << "No options were found like your choice!" << endl;
    		break;
    }
    
    Какво се случва? По подразбиране сме задали стойност единица на нашата променлива choice. Влизаме с нея в условният блок и той започва да проверява дали стойността на променливата ни съвпата с някой от нашите case-ове, които сме задали. Ако съвпада отива на този case, с който съвпада и изпълнява неговите действия, ако не намери отива в default.

Упражнение
Няма да има упражнение за тази тема, понеже е доста дълга, вярно, сложна е, но поразгледайте задачите отново, пробвайте ги, попроменете ги и така вижте кое, как и защо работи или не работи по този начин.

Какво следва?
В следващият пост ще разгледаме символните низове и ще видим приложение на for циклите.

Отговори

Върни се в “Системно Програмиране”

Кой е на линия

Потребители, разглеждащи този форум: Няма регистрирани потребители и 1 гост