Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Auto, extern, register, static, mutable 1 страница




Else

Else

Else

Else

Else

Else

Else

cout << "Ваш варіант є меншим від магічного числа.\n";

}

getch (); return 0;

}

4.1.3. Конструкція if-else-if

Дуже поширеною у програмуванні конструкцією, в основі якої знаходиться вкладена if -настанова, є "сходинки" if-else-if. Її можна представити в такому вигляді:

if (умова)

настанова;

if (умова)

настанова;

if (умова)

настанова;

настанова;

У цьому записі під елементом умова розуміють умовний вираз, який обчислюється зверху вниз. Як тільки у якій-небудь гілці виявиться істинний результат, то буде виконану настанову, пов'язану з цією гілкою, а всі решта "сходинки" опускаються. Якщо виявиться, що жодна з умов не є істинною, то буде виконано останню else -настанову (можна вважати, що вона виконує роль умови, яка діє за замовчуванням). Якщо останню else -настанову не задано, а всі інші виявилися помилковими, то взагалі ніяка дія не буде виконана.

"Сходинки" if-else-if – це послідовність вкладених if-else -настанов.

Робота if - else - if –"сходинок" продемонструємо у наведеній нижче |такій| програмі.

Код програми 4.5. Демонстрація механізму використання "сходинок" if-else-if

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

 

int main ()

{

int x;

for(x=0; x<6; x++) {

if (x==1) cout << "x дорівнює одиниці.\n";

else if (x==2) cout << "x дорівнює двом.\n";

else if (x==3) cout << "x дорівнює трьом.\n";

else if (x==4) cout << "x дорівнює чотирьом.\n";

else cout << "x не потрапляє в діапазон від 1 до 4.\n";

}

 

getch (); return 0;

}

Результати виконання цієї програми є такими:

х не потрапляє в діапазон від 1 до 4.

х дорівнює одиниці.

х дорівнює двом.

х дорівнює трьом.

х дорівнює чотирьом.

х не потрапляє в діапазон від 1 до 4.

Як бачимо, остання else -настанова виконується тільки у тому випадку, коли всі попередні if -умови дали помилковий результат.

4.2. Використання настанови багатовибірного розгалуження switch

Настанова switch – це настанова багатовибірного розгалуження, яка дає змогу вибрати одну з множини альтернатив.

Вона дає змогу робити вибір однієї з множини альтернатив. Хоча різноспрямоване тестування можна реалізувати за допомогою послідовності вкладених if -настанов, однак у багатьох ситуаціях настанова switch виявляється ефективнішим рішенням.

4.2.1. Особливості роботи настанови

Настанова багатовибірного розгалуження працює таким чином. Значення виразу послідовно порівнюється з константами із заданого переліку. Внаслідок виявлення збігу для однієї з умов порівняння виконується послідовність настанов, пов'язана з цією умовою. Загальний формат запису настанови switch є таким:

switch (вираз) {

case константа1:

послідовність настанов

break;

case константа2:

послідовність настанов

break;

case константа3:

послідовність настанов

break;

...

default:

послідовність настанов

}

Елемент вираз настанови switch під час обчислення повинен давати цілочисельне або символьне значення. Вирази, що мають, наприклад, тип з плинною крапкою, тут не дозволені. Дуже часто як керівний switch -вираз використовується одна змінна.

Настанова break завершує виконання коду програми, що визначається настановою switch.

Послідовності настанов default -гілки виконуються у тому випадку, якщо жодна із заданих case -констант не співпаде з результатом обчислення switch -виразу. Гілка default є необов'язковою. Якщо вона відсутня, то при неспівпаданні результату виразу ні з однією з case -констант ніякої дії виконано не буде. Якщо такий збіг все-таки виявиться, то виконуватимуться настанови, відповідні цій case -гілці, доти, доки не трапиться настанова break або не буде досягнуто кінець switch -настанови (або у default -, або в останній case -гілці).

Настанови default -гілки виконуються у тому випадку, якщо жодна з case -констант не співпаде з результатом обчислення switch -виразу.

Отже, для застосування switch -настанови необхідно знати таке:

● настанова switch відрізняється від настанови if тим, що switch -вираз можна тестувати тільки з використанням умови рівності (тобто на збіг switch -виразу із заданими case -константами), тоді як умовний if -вираз може бути будь-якого типу;

● ніякі дві case -константи в одній switch -настанові не можуть мати однакових значень;

● настанова switch зазвичай ефективніша, ніж вкладені if -настанови;

● послідовність настанов, пов'язана з кожною case -гілкою, не є блоком. Проте повна switch -настанова визначає блок. Значущість цього твердження стане очевидною після того, як ми більше дізнаємося про мову програмування C++.

Згідно з стандартом мови програмування C++, switch -конструкція може мати не більше ніж 16 384 case -настанов. Але на практиці (виходячи з міркувань ефективності) зазвичай обмежуються набагато меншою їх кількістю.

Використання switch -настанови продемонстровано у наведеному нижче коді програми. Вона створює просту "довідкову" систему, яка описує призначення for -, if - і switch -настанов. Після відображення переліку пропонованих тем, згідно з якими можливе надання довідки, програма переходить в режим очікування доти, доки користувач не зробить свій вибір. Введене користувачем значення використовується в настанові switch для відображення інформації по вказаній темі[15].

Код програми 4.6. Демонстрація механізму використання switch-настанови на прикладі|зразку| "довідкової" системи

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

 

int main ()

{

int vybir;

cout << "Довідка на теми: \n\n";

cout << "1. for \n";

cout << "2. if \n";

cout << "3. switch \n\n";

cout << "Введіть номер теми (1-3): ";

cin >> vybir;

cout << "\n";

switch (vybir) {

case 1: cout << " for – це найуніверсальніший цикл в С++.\n";

break;

case 2: cout << " if – це настанова умовного розгалуження.\n";

break;

case 3: cout << " switch – це настанова багатовибірного

розгалуження.\n";

break;

default: cout << "програміст повинен ввести число від 1 до 3.\n";

}

getch (); return 0;

}

Ось один з варіантів виконання цієї програми.

Довідка на теми:

 

1. for

2. if

3. switch

 

Введіть номер теми (1-3): 2

if – це настанова умовного розгалуження.

Формально настанова break є необов'язковою, хоча здебільшого використання switch -конструкцій вона наявна. Настанова break, що знаходиться в послідовності настанов будь-якої case -гілки, призводить до виходу зі всієї switch -конструкції та передає керування настанові, розташованій відразу після неї. Але, якщо настанова break в case -гілці відсутня, то буде виконано всі настанови, пов'язані з даною case -гілкою, а також всі подальші настанови, що розташовані під нею, доти, доки все-таки не трапиться настанова break, що належить до однієї з подальших case -гілок, або не буде досягнуто кінець switch -конструкції.

Розглянемо уважно наведену нижче програму. Спробуйте передбачити, що буде відображено на екрані під час її виконання.

Код програми 4.7. Демонстрація механізму використання switch-конструкції

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

 

int main ()

{

int i;

for (i=0; i<5; i++) {

switch (i) {

case 0: cout << "менше 1\n";

case 1: cout << "менше за 2\n";

case 2: cout << "менше за 3\n";

case 3: cout << "менше за 4\n";

case 4: cout << "менше за 5\n";

}

cout << "\n";

}

getch (); return 0;

}

Ось як виглядають результати виконання цієї програми:

менше 1

менше 2

менше 3

менше 4

менше 5

 

менше 2

менше 3

менше 4

менше 5

 

менше 3

менше 4

менше 5

 

менше 4

менше 5

 

менше 5

З цих результатів видно, якщо настанова break в одній case -гілці відсутня, то виконуються настанови, що належать наступній case -гілці. Як це показано в цому прикладі, в switch -конструкцію можна помістити "порожні" case -гілки:

switch (izm) {

case 1:

case 2:

case 3: do_something();

break;

case 4: do_something_ else ();

break;

}

Якщо змінна izm цей фрагмент коду програми набуває значення 1, 2 або 3, то викликається функція do _something(). Якщо ж значення змінної izm дорівнює 4, то робиться звернення до функції do _something_ else (). Використання "пачки" декількох порожніх case -гілок характерне для випадків, коли вони використовують один і той самий програмний код.

4.2.2. Організація вкладених настанов багатовибірного розгалуження

Настанова багатовибірного розгалуження switch може бути використана як частина case -послідовності зовнішньої настанови switch. У цьому випадку вона називається вкладеною настановою switch. Необхідно відзначити, що case -константи внутрішніх і зовнішніх настанов switch можуть мати однакові значення, при цьому жодних конфліктів не виникне. Наприклад, такий фрагмент коду програми є цілком допустимим:

switch (ch1) {

case 'А1: cout << "Ця константа А – частина"

<< " зовнішньої настанови switch ";

switch (ch2) {

case 'A': cout << "Ця константа А – частина"

<< " внутрішньої настанови switch ";

break;

case 'В1: //...

}

break;

case 'B1: //...

}

4.3. Використання настанови організації циклу for

Цикл for – найуніверсальніший цикл мови програмування C++.

У розд. 2 було використано просту форму циклу for. У цьому розділі розглядається цей цикл детальніше, тобто дізнаємося, наскільки потужним і гнучким засобом програмування він є. Почнемо з традиційних форм його використання.

Отже, загальний формат запису циклу for для багатократного виконання однієї настанови має такий вигляд:

for (ініціалізація; вираз; інкремент) настанова;

Якщо цикл for призначений для багатократного виконання не однієї настанови, а програмного блоку, то його загальний формат має такий вигляд:

for (ініціалізація; вираз; інкремент) {

послідовність настанов

}

Елемент ініціалізація зазвичай є настановою присвоєння, яка встановлює керівній змінній циклу початкове значення, що дорівнює нулю. Ця змінна діє як лічильник, який керує роботою циклу. Елемент вираз є умовним виразом, у якому тестується значення керівної змінної циклу. Результат цього тестування визначає, виконається цикл for ще раз чи ні. Елемент інкремент – це вираз, який визначає, як змінюється значення керівної змінної циклу після кожної ітерації. Звернемо Вашу увагу на те, що всі ці елементи циклу for повинні відділятися крапкою з комою. Цикл for виконуватиметься доти, доки обчислення елемента вираз дає істинний результат. Як тільки цей умовний вираз стане помилковим, цикл завершиться, а виконання програми продовжиться з настанови, що є наступною за циклом for.

У наведеному нижче коді програми цикл for використовують для виведення значень квадратного кореня з чисел від 1 до 99. Звернемо Вашу увагу на те, що у наведеному прикладі керівна змінна називається num.

Код програми 4.8. Демонстрація механізму використання настанови організації циклу for

#include <iostream> // Для потокового введення-виведення

#include <cmath> // Для використання математичних функцій

using namespace std; // Використання стандартного простору імен

 

int main ()

{

int num;

double sq_root;

for (num=1; num < 100; num++) {

sq_root = sqrt ((double) num);

cout << num << " " << sq_root << "\n";

}

getch (); return 0;

}

Ось як виглядають перші рядки результатів, що виводяться цією програмою:

1 1

2 1.41421

3 1.73205

4 2

5 2.23607

6 2.44949

7 2.64575

8 2.82843

9 3

10 3.16228

11 3.31662

У цій програмі використано ще одну стандартну функцію мови програмування C++: sqrt (). Ця функція повертає значення квадратного кореня зі свого аргументу. Аргумент повинен мати тип double, і саме тому під час виклику функції sqrt () параметр num приводиться до типу double. Сама функція також повертає значення типу double. Звернемо Вашу увагу на те, що у програму внесено заголовок <cmath>, оскільки цей заголовний файл забезпечує підтримку функції sqrt ().

Варто знати! Окрім функції sqrt (), мова програмування C++ підтримує широкий набір інших математичних функцій, наприклад sin(), cos(), tan(), log(), ceil() і floor(). Необхідно також пам'ятати, що всі математичні функції вимагають приєднання до програми заголовка <cmath>.

Керівна змінна циклу for може змінюватися як з позитивним, так і з негативним приростом, причому величина цього приросту також може бути будь-якою. Наприклад, наведений нижче код програми виводить числа в діапазоні від 100 до -100 з декрементом, що дорівнює 5.

Код програми 4.9. Демонстрація механізму використання настанови організації циклу for з декрементом, що дорівнює 5

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

 

int main ()

{

int i;

for (i=100; i>=-100; i=i-5) cout << i << " ";

 

getch (); return 0;

}

Важливо розуміти, що умовний вираз завжди тестується на початку виконання циклу for. Це означає, що коли перша ж перевірка умови дасть значення ФАЛЬШ, програмний код тіла циклу не виконається жодного разу. Ось приклад:

for (pm=10; pm < 5; pm++)

cout << pm; // Ця настанова не виконається.

Цей цикл ніколи не виконається, оскільки вже під час входу в нього значення його керівної змінної pm більше п'яти. Це робить умовний вираз (pm < 5) помилковим із самого початку. Тому навіть одна ітерація цього циклу не буде виконана.

4.3.1. Варіанти використання настанови організації циклу for

Цикл for – одна з найбільш гнучких настанов у мові програмування С++, оскільки вона дає змогу отримати широкий діапазон варіантів її використання. Наприклад, для керування циклом for можна використовувати декілька змінних. Для розуміння сказаного розглянемо такий фрагмент коду програми:

for (x=0, y=10; х<=10; ++х, --y) cout << х << " " << y << "\n";

У цьому записі комами відокремлюються дві настанови ініціалізації та два інкрементні вирази. Це робиться для того, щоб компілятор "розумів", що існує дві настанови ініціалізації та дві настанови інкремента (декремента). У мові програмування C++ кома є оператором, який, по суті, означає "зроби це і те". Інші застосування оператора "кома" ми розглянемо нижче у цьому навчальному посібнику, але найчастіше він використовується в циклі for. Під час входу у цей цикл ініціалізувалися обидві змінні – х і y. Після виконання кожної ітерації циклу змінна х інкрементується, а змінна y декрементується. Використання декількох керівних змінних у циклі іноді дає змогу спростити алгоритми. У розділах ініціалізації та інкремента циклу for можна використовувати будь-яку кількість настанов, але зазвичай їх кількість не перевищує двох.

Умовним виразом, який керує циклом for, може бути будь-який допустимий С++-вираз. При цьому він не обов'язково повинен містити керівну змінну циклу. У наведеному нижче прикладі цикл виконуватиметься доти, доки користувач не натисне на клавішу клавіатури. У цій програмі представлена ще одна (дуже важлива) бібліотечна функція: kbhit(). Вона повертає значення ФАЛЬШ, якщо жодна клавіша не була натиснута на клавіатурі, і значення ІСТИНА – в іншому випадку. Функція чекає натиснення клавіші, даючи змогу тим самим циклу виконуватися доти, доки натискання не відбудеться. Функція kbhit() не визначається стандартом мови програмування C++, але включена в розширення мови програмування C++, яке підтримується більшістю компіляторів. Для її використання у програму необхідно внести заголовок <conio>.

Код програми 4.10. Демонстрація механізму використання у циклі for функції,
яка реагує на натискання клавіші

#include <vcl>

#include <iostream> // Для потокового введення-виведення

#include <conio> // Для консольного режиму роботи

using namespace std; // Використання стандартного простору імен

 

int main ()

{

int i;

// Виведення чисел на екран до натиснення будь-якої клавіші.

for (i=0;! kbhit (); i++) cout << i << " ";

 

getch (); return 0;

}

На кожній ітерації циклу викликається функція kbhit(). Якщо після запуску програми натиснути на будь-яку клавішу, то ця функція поверне значення ІСТИНА, внаслідок чого вираз! kbhit() дасть значення ФАЛЬШ, і цикл зупиниться. Але, якщо не натискати на клавішу, то функція поверне значення ФАЛЬШ, а вираз! kbhit() дасть значення ІСТИНА, що дасть змогу циклу продовжувати "крутитися".

Варто знати! Функція kbhit() не входить до складу стандартної бібліотеки мови програмування C++. Йдеться про те, що стандартна бібліотека визначає тільки мінімальний набір функцій, який повинні мати всі С++-компілятори. Функція kbhit() не включена в цей мінімальний набір, оскільки не всі середовища можуть підтримувати взаємодію з клавіатурою. Проте функцію kbhit() підтримують практично всі серійно випущені C++-компілятори. Виробники компіляторів можуть забезпечити підтримку більшої кількості функцій, ніж це необхідно для дотримання мінімальних вимог стосовно стандартної бібліотеки мови програмування C++. Додаткові ж функції дають змогу ширше використовувати можливості середовища програмування. Якщо для Вас не проблематичне питання переносності коду програми в інше середовище виконання, то Ви можете вільно використовувати всі функції, які підтримуються Вашим компілятором.

4.3.2. Відсутність елементів у визначенні циклу

У мові програмування C++ дозволено опустити будь-який елемент заголовка циклу (ініціалізація, умовний вираз, інкремент) або навіть все відразу. Наприклад, ми хочемо написати цикл, який повинен виконуватися доти, доки з клавіатури не буде введене число 123. Ось як виглядає така програма.

Код програми 4.11. Демонстрація відсутності елементів у визначенні циклу for

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

 

int main ()

{

int x;

 

for (x=0; x!= 123;) {

cout << "Введіть число: ";

cin >> x;

}

 

getch (); return 0;

}

У цій програмі в заголовку циклу for відсутній вираз інкремента. Це означає, що під час кожного повторення циклу виконується тільки одна дія: значення змінної х порівнюється з числом 123. Але, якщо ввести з клавіатури число 123, умовний вираз, що перевіряється в циклі, стане помилковим, і цикл завершиться. Оскільки вираз інкремента в заголовку циклу for відсутній, то керівна змінна циклу не модифікується.

Наведемо ще один варіант організації циклу for, в заголовку якого, як це показує такий фрагмент коду програми, відсутній розділ ініціалізації:

cout << "Введіть номер позиції: ";

cin >> х;

for (; х < limit; x++) cout << " ";

У цьому записі порожній розділ ініціалізації, а керована змінна х ініціалізується значенням, що вводиться користувачем, з клавіатури до входу в цикл.

До розміщення виразу ініціалізації за межами циклу, як правило, вдаються тільки у тому випадку, коли початкове значення генерується складним процесом, який незручно помістити у визначення циклу. Окрім того, розділ ініціалізації залишають порожнім і у разі, коли керування циклом здійснюється за допомогою параметра певної функції, а як початкове значення керівної змінної циклу використовується значення, яке отримує параметр під час виклику функції.

4.3.3. Нескінченний цикл

Нескінченний цикл – це цикл, який ніколи не закінчується.

Залишивши порожнім умовний вираз циклу for, можна створити нескінченний цикл (цикл, який ніколи не закінчується). Спосіб запису такого циклу показаний на прикладі такої конструкції циклу for.

for (;;)

{

//...

}

Цей цикл працюватиме без кінця. Незважаючи на наявність деяких задач програмування (наприклад, командних процесорів операційних систем), які вимагають наявність нескінченного циклу, більшість "нескінченних циклів" – це просто цикли із спеціальними вимогами до завершення. Ближче до кінця цього розділу буде показано, як завершити цикл такого типу. (Підказка: за допомогою настанови break.)

4.3.4. Цикли часової затримки

У програмах часто використовують так звані цикли часової затримки. Їх завдання – просто "убити час". Для запису таких циклів достатньо залишити порожнім тіло циклу, тобто опустити ті настанови, які повторює цикл на кожній ітерації. Ось приклад:

for (x=0; x<1000; x++);

Цей цикл тільки інкрементує значення змінної х і не робить нічого більше. Крапка з комою (в кінці рядка) необхідна внаслідок того, що цикл for чекає отримати настанову, яка може бути порожньою (як у цьому випадку).

Перш ніж рухатися далі, не завадило б проекспериментувати з власними варіаціями на тему циклу for. Це Вам допоможе переконатися в його гнучкості і потужності.

4.4. Використання інших ітераційних настанов

4.4.1. Ітераційна настанова while

Настанова while – один із способів організації ітераційних циклів у мові програмування C++.

Загальна форма організації циклу while має такий вигляд:

while (вираз) настанова;

У цьому записі під елементом настанова розуміють або одиночну настанову, або блок настанов. Роботою циклу керує елемент вираз, який є будь-яким допустимим С++-виразом. Елемент настанова виконується доти, доки умовний вираз повертає значення ІСТИНА. Як тільки цей вираз стає помилковим, то керування передається настанові, яка знаходиться за цим циклом.

Використання циклу while можна продемонструвати на прикладі такої невеликої програми. Практично всі компілятори підтримують розширений набір символів, який не обмежується символами ASCII. У розширеному наборі часто містяться спеціальні символи і деякі букви з алфавітів іноземних мов. ASCII-символи використовують значення, що не перевищують число 127, а розширений набір символів – значення з діапазону 128-255. У процесі виконання цієї програми виводяться всі символи, значення яких лежать в діапазоні 32-255 (32 – це код пропуску). Виконавши цю програму, програміст повинен побачити ряд дуже цікавих символів.

Код програми 4.12. Демонстрація виведення усіх друкованих символів, в т.ч. розширений набір символів, якщо такі існують

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

 

int main ()

{

unsigned char ch;

ch = 32;

while (ch) {

cout << ch;

ch++;

}

getch (); return 0;




Поделиться с друзьями:


Дата добавления: 2014-11-29; Просмотров: 498; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.011 сек.