Помогни ни да направим Uroci.net по - богат! Добави урок

C++ част.3 (Изрази и оператори)

C++ » C++
fix3d   трудност:    видян: 62817



3.12. Оператори за управление

Подразбиращият се начин за изпълнение на операторите в една програма е последователен. Изпълнението на всяка С++ програма започва от първия оператор на main(). След това се изпълнява всеки следващ оператор. Когато се изпълни последния оператор изпълнението на програмата приключва.

Като изключим най-простите програми, последователното изпълнение на програмата не съответствува на проблемите, които трябва да бъдат решавани. В примерните програми, които вече разгледахме, се запознахме с условния оператор if и операторите за цикъл while и for. Следващият раздел преглежда целият набор от С++ оператори.

3.13. Операторът if

Всеки оператор if проверява някакво условие. Винаги, когато условието има стойност истина се изпълнява някакво действие или набор от действия. Иначе тези действия се игнорират.

Синтаксисът на оператора if има вида:

if ( expression )
statement;

Изразът expression трябва да бъде затворен в скоби. Ако той има ненулева стойност се приема, че условието има стойност истина и се изпълнява оператора statement.

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

1. Ако текущата стойност е равна на минималната стойност трябва броячът да бъде увеличен с единица.
2. Ако текущата стойност е по-малка от минималната стойност на минималната се присвоява текущата и броячът става 1. Стойностите на масива ще бъдат преглеждани като се използува оператора for. За намирането на най-малкия елемент трябва да бъде прегледан всеки елемент на масива.

На тази функция са необходими две променливи: една, която да съдържа минималната стойност и втора - за брояч. Размерът на масива определя максималния брой появи на минималната стойност. Следователно данновият тип на брояча на появите й трябва да има същия размер като този на size членът - данни на IntArray, който описва размерността на масива.

int minVal = ? // what value
?int occurs = ? // what value ?

minVal трябва да бъде инициализирана с една начална стойност, спрямо която да бъдат сравнявани елементите на масива. Един подход при инициализирането на minVal е да се използува най-голямото възможно цяло число. Инициализирането на occurs с 0 би работило във всички случаи. Това, обаче, не е най-добрата стратегия.

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

Ако масивът е записан в низходящ ред, то последният елементе минималната стойност на масива. В този случай са необходими n присвоявания на стойност на minVal.

Масивът не е подреден и елементите са въведени в произволен ред. Може да се каже, че минималната стойност ще бъде намерена някъде в средата. При този среден случай вероятно половината от елементите ще бъдат присвоени на minVal. Във всички случаи ако minVal бъде инициализирана със стойността на първия елемент на масива със сигурност ще бъде спестено едно присвояване. Освен това ще е необходимо сравняването само на n-1 елемента. Такава ще бъде и стратегията на функцията. Ще бъдат необходими два оператора if:

if minVal > ia[ i ] ... // new minVal
if minVal == ia[ i ] ... // another occurence of//
minVal

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

if ( minVal > ia[ i ] )
minVal = ia[ i ];
occurs = 1; // not part of if statement

В противоречие с намерението на пограмиста операторът

occurs = 1;

не се разглежда като част от оператора if, а се изпълнява безусловно след изпълнението на if. Ето правилния запис:

if ( minVal > ia[ i ] ) {
minVal = ia[ i ];
occurs = 1;
}

Вторият оператор if изглежда така:

if ( minVal == ia[ i ] )
++occurs;

Забележете, че реда на операторите if е съществен. Във функцията ни occurs винаги ще има стойност над 1 ако поставим операторите в следния ред:

if ( minVal > ia[ i ] ) {
minVal = ia[ i ];
occurs = 1; }// potential error
//iff minVal// has just been set to ia[i]
if ( minVal == ia[ i ] )++occurs;

Изпълнението на двата оператора if за една и съща стойност е не само потенциално опасно, но и ненужно. Един и същ елемент не може да бъде едновременно по-малък от minVal и равен на него. Ако едното условие има стойност истина, то другото спокойно може да бъде игнорирано. За този вид условия операторът if предлага и else клауза.

if-else операторът има следния синтаксис:
if ( expression ) statement-1;
else statement-2;

Ако expresson има ненулева стойност, условието се приема за истинно и се изпълнява statement-1; иначе се изпълнява statement-2. Забележете, че ако statement-1 не е съставен оператор той трябва за бъде завършен с точка и запетая. Програмистът, запознат с Pascal или Ada, при които записът с точка и запетая е неправилен, често пропускат да ги напишат. Например,

if ( minVal == ia[ i ] )++occurs; // terminating ‘;’
required else if ( minVal > ia[ i ] ) {
minVal = ia[ i ];
occurs = 1;
}

В този пример операторът statement-2 е също оператор if. Ако minVal е по-малко от елемента не се прави нищо.

В следващия пример винаги се изпълнява един от трите оператора:

if ( minVal < ia[ i ] ); // null
statement else if ( minVal > ia[ i ] ) {
minVal = ia[ i ];
occurs = 1;
}else // minVal == ia[ i ]
++occurs;

Операторът if-else внася известно двусмислие в текста на програмата, което се нарича проблем на объркващото else. Този проблем се появява когато един оператор има повече if отколкото else клаузи. Въпроса, който възниква е с кое if се свързва допълнителната else клауза. Например,

if ( minVal <= ia[ i ] )
if ( minVal == ia[ i ] )
++occurs;
else {
minVal = ia[ i ];
occurs = 1;
}

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

if ( minVal <= ia[ i ]) {
// effect of dangling-else resolution
if ( minVal == ia[ i ] ) ++occurs;
else {
minVal = ia[ i ];
occurs = 1;
}}

Един метод за заобикаляне на подразбиращото се свързване на клаузите if и else е последният срещнат if да бъде поставен в съставен оператор.

if ( minVal <= ia[ i ]) {
// override the default resolution
if ( minVal == ia[ i ] ) ++occurs;}else{
minVal = ia[ i ];
occurs = 1;
}

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


Страници: «5 6 7 8 9 10 11 »

Сподели урока:



Коментари (1)

Zemoch на 18.01 2011 в 17:30ч.
Мнооого дълъг урок ! По полезно щеше да е да се направят 10тина теми от това вместо една наблъскана догоре.... Иначе полезно ама много хубаво( на едно място :) ) не е на хубаво !

Регистрирайте се, за да добавите коментар


Калдейта Ком ЕООД - © 2003-. Всички права запазени.
Препоръчваме: IT Новини