|
Інструкції циклу
Будь-який цикл – це можливість повторення блока коду (ітерація). Без інтерацій жодна мова прогамування особливої цінності немає.
Цикл в мові С/С++ можна реалізувати інструкціями трьох видів:
Ø for;
Ø while;
Ø do…while.
Кожна з цих інструкцій, в свою чергу, виконує інструкцію, названою тілом циклу, поки умова продовження циклу не прийме значенняfalse, або поки програміст не припинить виконання циклу іншим методом.
Зауваження 1
Перервати послідовність виконання інструкції будь якого циклу з допомогою: break (передає управління на наступну за циклом інструкцію), continue (перериває виконання поточної ітерації і переходить до наступної), return (повертає управління викликаної функції) і throw (генерує виключення).
Зауваження 2
Якщо тіло циклу складається з декількох інструкцій то таку послідовність потрібно вводити в фігурні дужки {…}. В деяких організаціях обов’язковою вимогою є заключення тіла циклу в фігурних дужках, навіть якщо тіло складається з одної інструкції. Це дозволяє запобігти помилкам при модифікації програми.
4.3.1. Інструкція while
Інструкція while зазвичай використовується для так званих нерегулярних циклів, тобто циклів, для яких кількість ітерації наперед невідомо.
Синтаксис:
while(умова_продовження_циклу) (тіло_циклу)
Умова продовження циклу вираховується на початку виконаної інструкції while (рис. 4.5). Вираження, яке використовується в якості умови повинно не приводитись до цілого типу. Якщо ця умова одразу ж не виконається (fasle), то тіло циклу не буде виконане жодного разу!
Приклад 1.
Потрібно підрахувати суму значень x/n, починаючи з n=1, поки розбіжність між двома сусідніми значеннями не стане менше деякого початкового значення.
Розв’язок наведено в лістингу 4.1.
{
Const double delta = … // d
int n = 1;
double x = …;
double sum = x;
while ((x/n – x/ (n+1)) > delta) //
{
n++;
sum += x /n; //
}
}
Приклад 2.
Потрібно вводити і рахувати кількість введенних символів, пока користувач не введе смивло *. Розв’язок наведено в лістингу.
{
Int n=0; //Ініціалізація лічильника
char ch; //змінна для вводу
while (str::cin>>ch, ch1=’*’) // використання в умовах оператора ‘кома ‘
{n++;}
}
str::cout<<”n=”<<n;
Приклад 3.
Модифікуємо попереднє завдання – підрахуємо загальну кількість введеним користувачем символів(в т.ч. пробілів і ком.) Розв’язок зображений в лістингу 4.3.
Лістинг 4.3. Підрахунок загальної кількості введених символів (в т.ч. пробілів і ком)
{
int iTotal=0, iSpaces=0, iCommas=0; //лічильники
char ch; //змінні для вводу
while (str:: cin>>ch, ch1=”*”)
{
switch (ch)
{
case ‘ ’: // пробіл
iSpaces++;
break;
case ‘,’: // кома
iCommas++;
break;
}
iTotal++; //в загальній кількості слід враховувата будь-який символ
}
str:cout<<”Total ”<<iTotal<< str::end1;
str:cout<<”Spaces ”<<iSpaces<< str::end1;
str:cout<<”Commas ”<<iCommas<< str::end1;
}
Застереження 1
Одна із самих не приємних особливостей цикла заключається в змозі створення безкінечного циклу. Будьте уважні!
Приклад:
while(i=1) {тіло_циклу}// частно зустрічається помилка використання оператора присвоєння замість оператора порівняння на рівенство. Така умова завжди true, и, відповідно, ваша программа зациклиться!
Це також дуже розповсюдженна помилка.
Подумайте, скільки разів виконується цикл?
int i=100;
while (i>0);
{ i--; }
Застереження 2
Будьте обережні з умовами, в яких фігурують плаваючі змінні (float або double), т.к.
умава типа while (<вираз>!= 1.1111) може через округлення перетворити цикл в
нескінчений.
Зауваження
Іноді програміст в явному вигляді задає нескінченний цикл: while(true)
{тіло_цикла}. Такий цикл обов’язково має бути зупинений, наприклад, інструкцією
Break.
Подумайте, чи має сенс такий цикл?
while (false) {тіло_циклу}
Якщо програміст ніяким чином не втручається в природнє виконання циклу, то вихід відбувається тільки в тому випадку, коли умова продовження циклу приймає значення false. Бувають ситуації, коли природнє виконання циклу необхідно перервати при виникнені деякої додаткової умови в тілі циклу. Для цих цілей можна скористатися інструкціями break і continue (див. рис. 4.5)
Використання інструкції continue демонструє лістинг 4.4, а інструкції break – лістинг 4.5.
Лістинг 4.4. Підрахунок кількості символів без урахування пробілів
{
Int iTotal=0; // лічильник символів без урахування пробілів
Char ch; // змінна для вводу
While(std::cin>>ch, ch!=’*’)
{
If(ch==’ ‘) continue;// перериваєм поточну ітерацію, передаєм управління на
Передаєм управління на наступну ітерацію. При цьому залишок
Тіла циклу ігнорується
iTotal++;// а решту символів рахуємо
}
Std::cout<<”Without spaces”<<iTotal<<std::endl;
}
Лістинг 4.5. Підрахуємо кількість символів до першого пробілу
{
int iTotal=0;
char ch;
while(std::cin>>, ch!=’*’)
{
if(ch==’ ’) break;
iTotal++;
}
std::cout<<”Up to first space ”<<iTotal<< std::endl;
}
4.3.2. Інструкція do...while
Інструкція do...while аналогічна інструкції while (рис. 4.6).
Синтаксис:
do {тіло_циклу} while (умова_продовження_циклу)
Основна відміна (і причина помилок) складається в тому, що спочатку виконується тіло циклу, а потім перевіряється умова, тому незалежно від значення умови тіло циклу завжди виконується хоча би один раз. Як наслідок, в багатьох випадках виявляється необхідна додаткова перевірка в середині тіла циклу. В лістингу 4.6 демострується подібна ситуація.
Лістинг 4.6. Знаходження суми натуральних чисел до вказуваних користувачем значень без перевірки введеного значення
{
int n; // в цій змінні користувач формує значення
std::cout<<”Input integer positive value: “; //запропонуємо йому ввести ціле позитивне значення
std::cin:>>n; //но він може не послухатись і ввести негативне!
int sum=0; //тут будемо накопичувати суму
do{
sum +=n; //при негативному значенні n змінна sum все одно буде модифікована!
n--;
} while(n>0); //умова продовження циклу
}
Якщо користувач ввів негативне значення, то результат отриманий невірно, тому в тілі циклу потрібна додаткова перевірка. Модифікуємо попередній приклад з урахуванням перевірки (лістинг 4.7).
Лістинг 4.7. Знаходження суми натуральних чисел с перевіркою введеного значення
{
int n;
std::cout<<”Input integer positive value: ”;
std::cin>>n;
int sum=0;
do{
if(n<=0) break; //додаткова перевірка
sum +=n;
n--;
} while(n>0); //умова продовження циклу
}
Бувають ситуації, коли логічно використовувати цикл do.while. Наприклад, користувачу пропонують ввести 2 значення: top і bottom, причому значення top повинно бути більше, ніж bottom (але користувач може знехтувати цією умовою і ввести значення з точністю до навпаки). З допомогою циклу do…while заставим його вводити значення до тих пір, поки він не сформує їх правильно (лістинг 4.8).
Лістинг 4.8. Використання циклу do.while для правильного формування введеного користувачем діапазону
{
int top, bottom;
do
{
std::cout<<”Input bottom::”;
cin>>bottom;
std::cout<<”Input top (it must be larger than bottom)::”;
cin>>top;
}while(top<=bottom); // а якщо користувач ввів невірно значення, відправляємо його на нову ітерацію…
…
}
4.3.3. Інструкція for
Якщо інструкції while i do…while використовуються в основному (хоча це необов'язково) для нерегулярних циклів (коли кількість повторень явно не задано), то інструкція for слугує (хоча це необов’язково) для організації регулярного циклу (з відомим числом повторень).
Синтаксис:
For ([знаходження_ініціалізаторів]; [вираз1, зазвичай умова];
[вираз2]) {тіло_циклу}
На відміну від while i do…while в інструкції for всі частини, керуючі циклом (зміна циклу, умова продовження і вираз, модифікуючи змінну циклу), зосереджені в одному місті, що покращує прийняття коду. Порядок виконання функції for(мал.. 4.7)
1. Спочатку один раз вираховується ініціалізуюча частина (зазвичай тут вказуютю початкове значення).
2. Потім вираховуються вираз 1 (умова продовження циклу), і якшо умова приймає значення true, то виконується поточна ітерація:
Виконується тіло циклу;
Вираховується вираз 2 (звичайно тут модифікується змінна циклу).
Дата добавления: 2015-07-08; просмотров: 155 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Задача 29 | | | Б) драматургічні твори |