Най-четените учебни материали
Най-новите учебни материали
***ДОСТЪП ДО САЙТА***
ДО МОМЕНТА НИ ПОСЕТИХА НАД 2 500 000 ПОТРЕБИТЕЛИ
БЕЗПЛАТНИТЕ УЧЕБНИ МАТЕРИАЛИ ПРИ НАС СА НАД 7 700
Ако сме Ви били полезни, моля да изпратите SMS с текст STG на номер 1092. Цената на SMS е 2,40 лв. с ДДС.
Вашият СМС ще допринесе за обогатяване съдържанието на сайта.
SMS Login
За да използвате ПЪЛНОТО съдържание на сайта изпратете SMS с текст STG на номер 1092 (обща стойност 2.40лв.)УПРАВЛЯВАЩИ ОПЕРАТОРИ |
![]() |
![]() |
![]() |
З. УПРАВЛЯВАЩИ ОПЕРАТОРИУправляващите оператори в C++ са следните: блок (съставен оператор), if, if—else, switch, break, continue, goto и трите вида цикли - while, do . . . while, и for. 3.1. БЛОК (СЪСТАВЕН ОПЕРАТОР) Блокът представлява фрагмент от програма, разположен между две фигурни скоби. Блоковете участвуват като елементи в много синтактични конструкции, като интерпретацията им в различните случаи е различна. Един от случаите, в които се използуват блокове, са управляващите оператори if, if … else и трите вида цикли, разгледани по-надолу. В този случай блокът се интерпретира като съставен оператор, т.е. като обединение на множество оператори, които се третират като един оператор. В синтактичните конструкции на управляващите оператори, разгледани в тази глава, терминът "оператор" означава както обикновен, така и съставен оператор. 3.2. ОПЕРАТОР IF Чрез оператора if се прави избор на един от два възможни клона програмата. Той има следния синтаксис: if ( условие ) оператор или if ( условие ){ Oператор 1; Оператор 2; . . . . . . Оператор n; } Условието представлява израз (условен израз), чиято стойност е true или false. Припомняме, че всяка стойност, различна от нула, се интерпретира като true, а нулата се интерпретира като false. Поради това, условието може да бъде както логически, така и аритметичен израз. При изпълнението на оператора if първо се изчислява неговото условие. Ако стойността на условието се окаже true, се изпълнява и неговият оператор. В противен случай неговият оператор се прескача. Не бива да се забравя, че операторът на оператора if може да е съставен, т.е. да се състои от няколко оператора, разположени между две фигурни скоби. По този начин чрез оператора if може да се прескочи цял фрагмент от програмата. Програма 3.1 Използуване на оператор if #include #include main() { int x, y, z; coutx; couty; if(x>10) cout<<"Първото число е по-гаолямо от 10\n"; if(y<0) { cout<< "Второто число е отрицателно\n"; z = y; } getch(); } Тази проста програма илюстрира използуването на оператора if. Програмата изисква да се въведат две числа. След това се проверявa дали първото от тях е по-голямо от 10. (Първият оператор if ). Акo е така, на екрана се извежда съобщението "Първото число е пo-голямо от 10". В противен случай това съобщение не се извежда, тъй като операторът cout се прескача. След това се проверява дали второто число е отрицателно (условието на втория оператор if). Ако е така, се изпълнява съставният оператор, намиращ се след втория if. Този съставен оператор се състои от двата оператора: cout < < "Второто число е отрицателно"; и z = у;. Ако условието не е изпълнено, т.е. второто число е неотрицателно, тези два оператора не се изпълняват и програмата завършва. 3.2.1. Влагане на оператори IF Възможно е един оператор if да бъде вложен в рамките на друг оператор if, както е в следния програмен фрагмент: char ch, chl; cin >> ch; //Въвеждане на стойност на ch if ( ch >= '0' && ch <= '9' ){ cout<< "Символът е цифра\n"; if ( ch > '5' ){ cout<< "Цифрата е по-голяма от 5. Ще я запомня\n"; chl = ch; // Запомняне на ch } } С първия if се проверява дали въведеният символ с цифра. Ако това не e така, т.е. въведен е друг символ, то проверката дали цифрата е по-голяма от 5 се обезсмисля. Именно поради това вторият оператор if е вложен в първия и ще се изпълни, само ако условието на първия if бъде удовлетворено. 3.3. ОПЕРАТОР IF...ELSE Операторът if…else служи за избор на една от две възможни алтернативи в зависимост от стойността на зададен условен израз. Операторът if…else има следния синтаксис: if ( условие ) onepamop1; else onepamop2; Ако зададеното условие има стойност true се изпълнява оператор1, а оператор2 не се изпълнява. В противен случай (ако условието има стойност false) се изпълнява оператор2, а оператор1 не се изпълнява. Ако оператор1 и оператор2 са съставни оператори, операторът if…else изглежда по следния начин: if ( условие ){ оператор; . . . . . оператор; } else { оператор; . . . . . оператор; } Използуването на оператора if…else се илюстрира от програма 3.2, която извежда съответноо съобщение в зависимост от това дали натиснатият клавиш е цифра или друг символ. Програма 3.2. Използуване на оператор if...else #include #include main() { char ch; coutch; if(ch>='0' && ch<='9') cout<<"Натиснатият клавиш е цифра\n"; else cout<< "Натиснатият клавиш не е цифра\n"; getch(); } 3.3.1. Последователност от IF...ELSE...IF оператори Използуването на последователност от if...else...if оператори e един похват, чрез който се реализира избор на един оператор (или груpa оператори) от няколко възможни. Програма 3.3 илюстрира използуването на последователност от if...else...if оператори. Програма 3.3. Разпознаване на натиснат клавиш чрез if...else...if #include #include main() { char ch; cout<<"Натиснете клавиш и след това клавиша ENTER\n"; cin>>ch; if (ch=='x'||ch=='X' ) cout<< "Натиснатият клавиш е х\n"; else if (ch=='y'||ch=='Y') cout<<"Натиснатият клавиш е у\n"; else if (ch=='z'||ch=='Z') cout<< "Натиснатият клавиш е z\n"; else cout<< "Натиснат е непознат клавиш\n"; getch(); } Тази програма установява кой от клавишите х, у или z е бил натиснат и извежда съответно съобщение. Ако е бил натиснат някой друг клавиш, различен от посочените, се извежда съобщението "Непознат клавиш". 3.4. ОПЕРАТОР SWITCH Чрез оператора switch се избора един от няколко възможни варианта. Операторът switch има следния синтаксис: switch ( израз ){ case : onepamop1; operator2; . . . ; case : onepamop1; operator2; . . . ; . . . . . . . . . . . . . . . . . . . . . . . . . . . . case : onepamop1; operator2;...; [default: onepamop1;onepamop2; . . . ] //He е задължително } Отделните варианти се изброяват между две фигурни скоби. Описанието на всеки вариант се състои от ключовата дума case, константен израз, т.е. израз който се изчислява по време нa компилация, двоеточие и множество от оператори, формиращи тялото на варианта. При изпълнение на оператора switch изразът, указан след ключовата дума switch (switch-израза) се изчислява и стойността му се сравнява последователно със стойностите на всеки от константните изрази на вариантите (case-изразите). При съвпадение се изпълняват операторите на съответния вариант. Сред вариантите може да има един специален, който се означава, с ключовата дума default и няма константен израз. Този вариант (ако е включен в оператора switch) се изпълнява при условие, че никой от останалите варианти не е бил изпълнен. Обикновено последният оператор на всеки от вариантите е операторът break. Той предизвиква завършване на оператора switch. По този начин се гарантира, че след изпълнението на един oт вариантите, останалите няма да бъдат проверявани, т.е. ще бъде избран само един от възможните варианти. Ако не се използува операторът break, работа на оператора switch е несигурна, непредвидима. В някои случаи операторът switch е еквивалентен на последователност от if...else...if оператори. Например, последователността oт if...else...if оператори в програма 3.3 може да се замени с един switch оператор, както с показано в програма 3.4. Програма 3.4. Разпознаване на натиснат клавиш чрез използуване на switch #include #include main() { char ch; coutch; switch(ch) { case 'X': case 'х':cout<<"Натиснатият клавиш е х\n";break; case 'Y': case 'y':cout<<"Натиснатият клавиш е у\n";break; case 'Z': case 'z':cout<<"Натиснатият клавиш е z\n";break; default :cout<<"Натиснат е непознат клaвuш\n"; } getch(); } В общия случай обаче, последователност от if...else...if оператори и оператора switch не са еквивалентни, тъй като операторът switch има следните особености: - Условието за избор на даден вариант e само съвпадение на стойностите на switch-израза и case-израза на варианта, докато при if...else операторите условията могат да бъдат произволни. - В оператора switch, case-изразите могат да бъдат само константни изрази (които се изчисляват но време на компилация), следователно условието, което се проверява в оператора switch, е само съвпадение на стойност на израз с константа. Операторът switch допуска наличие на празни варианти, както е показано в програми 3.4 и 3.5. Няколко последователно наредени празни варианта са еквивалентни на логическо или. Програма 3.5.Програма за намиране броя на дните на зададен месец #include #include void main() { int M,G,D; coutM; coutG; switch(M) { case 1:case 3:case 5:case 7:case 8: case 10:case 12: D=31;break; case 4:case 6:case 9:case 11: D=30;break; case 2:if (G%400==0||G%4==0&&G%100!=0) D=29; else D=28;break; default :cout<<"Въведен е несъществуващ месец!!!\n"; } cout<<"Броят на дните е "< getch(); } 3.5. ЦИКЛИ В C++ Циклитe са основен инструмент в програмирането. С тяхна помощ определено множество от оператори може да бъде изпълнявано многократно. Езикът C++ поддържа три вида цикли: цикъл while, цикъл do…while и цикъл for. 3.5.1. Цикъл WHILE Синтаксисът на цикъла while е следния: while ( условие ) оператор; или while ( условие ) { оператор-1; оператор-2; . . . . . . . . . . . оператор-n; } Тъй като най-напред се проверява условието, то тялото на цикъла while може да не бъде изпълнено нито веднъж. Така се получава, ако още при първото изчисление на условието резултатът е false. Следният фрагмент от програма реализира отпечатването на числата от 1 до 20 чрез използуване на цикъл while: int counter = 0; //Брояч while ( counter != 20 ) cout << ++counter < Програма 3.6 Програмата изчислява средно-аритметичното на последователно задавани цели положителни числа до задаването на определено контролно число А. #include #include main() { int n=0,A,K; float S=0,C=0; coutA; coutK; while (K!=A) // Цикъл while { S+=K; n+=1; coutK; } if (n>0) { C=S/n; cout<<"Средно-аритметичното е "< } else cout<<"Не са въведени числа, различни от контролното число.\n"; getch(); return (0); } Програма 3.7 Програмата обръща реда на цифрите в зададаено число. #include #include main() { long int M,N,L; short C; coutM; L=M; N=0; while (L > 0) { C=L % 10; N=N*10+C; L=L/10; } cout<<"Обърнатото цисло е "< getch(); return (0); } Програма 3.8. Програмата намира броя дни между две зададени дати, като отчита високосните години. #include #include main() { int Dn,Mn,Gn,Dk,Mk,Gk,BrDni,M,G,D; cout<<"Въведете началната дата:"< coutDn; coutMn; coutGn; cout<<"Въведете крайната дата:"< coutDk; coutMk; coutGk; G=Gn; M=Mn; BrDni=0; while (!(G==Gk && M==Mk)) { switch(M) { case 1:case 3:case 5:case 7:case 8: case 10:case 12: D=31;break; case 4:case 6:case 9:case 11: D=30;break; case 2:if ((G%400==0)||(G%4==0)&&(G%100!=0)) D=29; else D=28;break; } BrDni+=D; if (++M==13) { M=1;G+=1;} } BrDni+=Dk-Dn; cout<<"Броят на дните е "< getch(); return (0); } 3.5.2. Цикъл DO…WHILE Синтаксисът на цикъла do…while е следния: do оператор; while ( условие ); или do { оператор-1; оператор-2; . . . . . . . . . . оператор-n } while ( условие ); Операторът (прост или съставен), намиращ се между ключовите думи do и while, се нарича тяло на цикъла. Изпълнението на цикъла do…while се свежда до изпълнение на операторите от тялото му до тогава, докато зададеното условие след ключовата дума while има стойност true. Тъй като условието се проверява след изпълнението на тялото, то тялото на цикъла се изпълнява поне веднъж. Цикълът do…while e подобен на разгледания цикъл while. Единствената разлика между тях се състои в това, че при цикъла while най-напред се проверява условието, а след това се изпълнява тялото на цикъла, докато при цикъла do…while е обратно. Програма 3.9. Програма за последователно въвеждане и обработване на цели числа. Когато се въведат N ненулеви или три нулеви числа, въвеждането се прекратява и се извежда средно аритметичното на нечетните и броят на четните от въведените числа. #include #include main() { int x,N, BrNul=0, //Брой на нулевите числа BrNeNul=0, //Брой на ненулевите числа BrChet=0, //Брой на четните числа BrNeChet=0, //Брой на нечетните числа SumNeChet=0; //Сума на нечетните числа float C; coutN; do { coutx; if (x==0) BrNul+=1; else { BrNeNul+=1; if (x%2==1) { SumNeChet+=x; BrNeChet+=1; } else BrChet+=1; } } while (!((BrNeNul==N) || (BrNul==3))); if (BrNeChet>0) { C=SumNeChet/(float)BrNeChet; cout<<"Средно-аритметичното на нечетните числа е "< } else cout<<"Не са въведени нечетни числа.\n"; cout<<"Броят на четните числа е "< getch(); return (0); } 3.5.3. Цикъл FOR Синтаксисът на цикъла for e следния: for (; ;) оператор; или for (; ;) { оператор-1; оператор-2; . . . . . . . . . . оператор-n; } Секция1 и секцияЗ се състоят от един или няколко оператора, а секция2 трябва да бъде условен израз. Изпълнението на цикъла for протича по следния начин: Най-напред еднократно се изпълняват операторите от секция1. След това се изпълнява един или повече пъти следната последователност от действия: изчисляване на секция2, изпълнение на операторите от тялото на цикъла, изпълнение на секцияЗ, ново изчисляване на секция2 и т.н. Този процес се повтаря докато резултатът от изчислението на секция2 има стойност true, той се прекратява, когато резултатът от изчислението на секция2 се окаже със стойност false. Операторите в секция1 и секцияЗ могат да бъдат произволни, но най-чссто в секция1 се инициализират един или няколко индекса на цикъла (обикновено променливи от тип int), а в секцияЗ се променят техните стойности след всяка итерация. Възможно е индексите на цикъла да бъдат дефинирани в рамките на секция1. Ето как изглежда фрагментът за извеждане на екрана на числата от 1 до 20, ако използува цикъл for for ( int i = 1; i <= 20; i++ ) // i e индекc на цикъла cout << i << '\n'; Когато секция1 и секцияЗ съдържат повече от един оператор, тези оператори се разделят чрез запетаи, например: int i,j; for (i=1,j=5; i<=10; i++,j+=5)cout<
В резултат от изпълнението на този цикъл на екрана се извеждат числата от 1 до 10 през интервал 1 и до тях - числата от 5 до 50 през интервал 5, т.е. резултатът ще бъде: 1 5 2 10 3 15 . . . . . . . . 10 50 Цикълът for допуска някоя, или всички секции да бъдат празни, но разделителите (;) между тях трябва да присъстват. Ако секция2 е празна, условието на цикъла е true. Ето някои примери: Пример 1 i = 1; for ( ; i <= 10; i++ ) //Cekция1 е празна cout << i << ‘\n’; for ( int i = 1; ; i++ ){ //Cekцuя2 е празна cout << i << ’\n’; if ( i >= 10 ) break; //Операторът break npeguзвukвa излизане от цикъла //и е разгледан по-надолу for ( int i = 1; i <= 10 ; ){ //Секция3 е празна cout << i << ‘\n’; i++; } И трите показани фрагмента извеждат на екрана числата от 1 до 10. В първия случай инициализацията на променливата i е изнесена извън цикъла. Във втория случай проверката на условието е в тялото на цикъла, а в третия случай инкрeментирансто на променливата i е в тялото на цикъла. 3.5.4. Цикли с празно тяло, безкрайни цикли В някои случаи не е необходимо тялото на един цикъл да съдържа изпълними оператори, т.е. тялото на цикъла може да бъде празно. Такива са случаите, при които всички необходими действия могат да бъдат зададени чрез условието на цикъла или чрез секция1 и секцияЗ, ако се използува цикъл for. Езикът C++ позволява организиране на безкрайни цикли. Този ефект се постига чрез използуване на условия на циклите, които винаги имат стойност true. В качеството на такива условия могат да се използуват ненулеви константи, както е показано в следните примери: while ( 1 ) // Безкраен цикъл cout << "Безкраен цикъл\n"; do // Безкраен цикъл cout<< "Безкраен цикъл\n"; while ( -1 ); for ( ; 1 ; ) // Безкраен цикъл cout<< "Безкраен цикъл\n"; for( ; ; ) // Без краен цикъл. Пропуснато условие е true cout<< "Безкраен цикъл\n"; Безкрайните цикли могат да се прекратяват чрез използуване на оператора break. Обикновено комбинацията безкраен цикъл и оператор break се използува в случаи, при които не е удобно условието за завършване на цикъла да бъде зададено чрез стандартните условни изрази, които поддържа езикът C++. 3.5.5. Оператор BREAK Операторът break предизвиква излизане от всеки от трите вида цикли и от оператора switch. Той предава управлението на първия оператор, намиращ се след затварящата скоба на циклите while, do...while и for или оператора-switch. Когато операторът break бъде използуван в някой цикъл, който е част от поредица вложени цикли, той предава управлението на обхващащия цикъл, а не предизвиква излизане от цялата поредица вложени цикли. Програма 3.10. Пример за използване на процедурата Break.Програмата намира средно-аритметичното на ппоследователно въвеждани числа до въвеждане на определено контролно число А или до въвеждане на M числа. #include #include main() { int i,n=0,M; float K,S=0,C,A; coutA; coutM; for (i=1;i<=M;i++) { coutK; if (K==A) break; S+=K; n+=1; } if (n>0) { C=S/n; cout<<"Средно-аритметичното е "< } else cout<<"Не са въведени положителни числа.\n"; getch(); } 3.5.6. Оператор CONTINUE Операторът continue може да бъде включван в телата на трите вида цикли. Той предизвиква начало на нова итерация, без да бъдат изпълнени операторите от тялото на цикъла, разположени след оператора continue. Програма 3.11. Пример за използване на процедурата Continue.Програма за намиране средно-аритметичното на положителните от последователно зададени m числа. #include #include main() { int i,n=0,M; float K,S=0,C; coutM; for (i=1;i<=M;i++) { coutK; if (K<=0) continue; S+=K; n+=1; } if (n>0) { C=S/n; cout<<"Средно-аритметичното е "< } else cout<<"Не са въведени положителни числа.\n"; getch(); } 3.5.7. Влагане на цикли Влагането на цикли е термин, който означава, че даден цикъл се съдържа в тялото на друг цикъл. Влагането на цикли е широко разпространена техника в програмирането. Програма 3.12. Програмата извежда всички числа в интервала М..N, чиито цифри образуват строго нарастваща последователност.Програмата е с два цикъла: - външен, който последователно предлага за проверка числата от М до N; - вътрешен, който проверява всяко число, като му отделя цифрите и ги сравнява #include #include main() { int i,K,M,N,newC,oldC; coutM; coutN; for ( i=M; i<=N; i++ ){ //Начало на външния цикъл K=i; newC=K % 10; do { //Начало на вътрешния цилъл oldC=newC; K=K / 10; newC=K % 10; } while (K!=0 && newC if (K==0) cout<
} //Край на външния цилъл} cout< getch(); return (0); } 3.6. ОПЕРАТОР GOTO Операторът goto предизвиква безусловен преход на определено място в програмата, маркирано чрез етикет. Етнкетът е поредица от символи, завършваща с двоеточие, например: labell: // Това е етикет 1: // Това също е emukem Езикът C++ е проектиран за структурно програмиране, което изключва употребата на оператора goto, но за пълнота този оператор, е включен в езика. Програми, написани на С++, в които е включен операторът goto, са признак за лош стил и ниска квалификация. Разбира се, изключването на оператора goto не бива да се абсолютизира и в отделни случаи използуването му е оправдано. |