|
Представете си, че Ви е дадена задача да изчислите 2 на степен 10. Нашият първи опит би могъл да изглежда така: #include <striam.h> main() { // a first solution cout << 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2; cout << "n"; return 0; } Написаното работи, въпреки че ще ни се наложи да преброим два или три пъти дали сме записали константата 2 точно 10 пъти. Само тогава ще бъдем доволни. Нашата програма правилно дава отговор 1024. Сега обаче, ни се налага да изчислим 2, повдигнато на 17 степен, а след това на 23. Неприятно е да променяме програмата си всеки път. Още по-лошо, изглежда поразително лесно да се направи грешка като се постави една двойка в повече или по-малко. Обаче, понеже сме внимателни, ние избягваме грешките. Накрая ни се налага да направим таблица, която да съдържа степените на двойката от 0 до 31. Ако използуваме литерални константи в директни кодови последователности ще ни бъдат нобходими 64 реда от следния вид: cout << "2 raised to the power of Xt"; cout << 2 * ... * 2; където Х ще се увеличава с единица за всяка кодова двойка. В този момент, а може би и по-рано, ние осъзнаваме, че трябва да има по-добър начин. Както и наистина има. Решението изисква въвеждането на две понятия, които все още не са формално дефинирани: 1. Променливи, които позволяват да се съхраняват и възстановяват стойности. 2. Съвкупност от управляващи оператори, които позволяват многократното изпълнение на част от програмния код. Например, ето един втори начин за изчисляване на 2 на 10 степен: #include <stream.h> main() { // a second more general solution int value = 2; int pow = 10; cout << value << " raised to the power of " << pow << ": t"; for ( int i = 1, res = 1; i <= pow; ++i ) { res = res * value; } cout << res << "n"; return 0; } Операторът, започващ с for, се нарича оператор за цикъл: докато i е по-малко или равно на pow, се изпълнява тялото на for, затворено във фигурни скоби. Цикълът for се нарича поточно управляващ оператор. value, pow, res и i са променливи, които позволяват да се съхраняват, променят и възстановяват стойности. Те са тема на следващите подглави. Първо, обаче, нека приложим друго ниво на обобщанане на програмата като отделим част от програмата, която изчислява степента на величината и да я дефинираме като отделна функция. unsigned int pow ( int val, int exp ) { //compute val raised to exp power for ( unsigned int res = 1; exp > 0; --exp ); res = res * val; return res; } Всяка задача, която изисква изчисляването на някаква степен на дадена стойност, сега може просто да извика pow() с подходящо множество от аргументи. Исканата таблица от степени на двойката сега може да бъде получена по следния начин: #include <stream.h> extern unsigned int pow ( int, int ); main() { int val = 2; int exp = 16; cout << "mThe Power of 2n"; for ( int i = 0; i <= exp; ++i ) cout << i << ": " << pow ( val, i ) << "n"; return 0; } Таблица 1.1 представя резултата от изпълнението на тази програма. The Power of 2 0: 1 1: 2 2: 4 3: 8 4: 16 5: 32 6: 64 7: 128 8: 256 9: 512 10: 1024 11: 2048 12: 4096 13: 8192 14: 16384 15: 32768 16: 65536 Степени на 2 Тази реализация на pow() не проверява онези особени случаи, когато имаме повдигане на отрицателна степен или стойността - резултат е много голяма.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||









