Головна

лістинг 3.6

  1. Гнучка оцінка акцій, які не включені в лістинг
  2. лістинг 1.1
  3. лістинг 1.3
  4. лістинг 1.4
  5. лістинг 1.5
  6. лістинг 1.8
  7. лістинг 10.1

#include "stdafx.h"

#include

#include

using namespace std;

// Точність обчислень.

const double eps = 1e-10;

int _tmain (int argc, _TCHAR * argv [])

{

double x = 1., xp, a;

setlocale (LC_ALL, "Russian");

cout « "Введіть значення a:";

cin » a;

if (a <= 0)

{

cout « "Некоректна a! \ n";

return 1;

}

do

{

xp = x; // Попереднє значення x.

x = (x + a / x) / 2; // Поточне значення x.

} While (fabs (x - xp)> eps)

cout « "Квадратний корінь" « x « endl

"Точне значення" « sqrt (a) « endl;

getch ();

return 0;

}

Будь-який цикл while може бути приведений до еквівалентного йому циклу for і, навпаки, за наступною схемою:

for (b1; b2; b3) оператор;

b1;

while (b2)

{

оператор;

b3;

}

Помилки, що спостерігаються при програмуванні циклів - використання в тілі циклу неініціалізованих змінних і невірний запис умови виходу з циклу.

Щоб уникнути помилок, рекомендується:

- Перевірити, чи всім змінним, яке трапляється в правій частині операторів присвоювання в тілі циклу, присвоєні до цього початкові значення (а також чи можливо виконання інших операторів);

- Перевірити, чи змінюється в циклі хоча б одна змінна, що входить в умову виходу з циклу;

- Передбачити аварійний вихід з циклу по досягненню деякої кількості ітерацій

- Якщо в тілі циклу потрібно виконати більше одного оператора, потрібно укладати їх в фігурні дужки.

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

Оператор do while зазвичай використовують, коли цикл потрібно обов'язково виконати хоча б раз (наприклад, якщо в циклі проводиться введення даних).

Оператор for краще в більшості інших випадків (однозначно - для організації циклів з лічильниками).

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

У C ++ є чотири оператори, що змінюють природний порядок виконання обчислень:

- Оператор безумовного переходу goto;

- Оператор виходу з циклу break;

- Оператор переходу до наступної ітерації циклу continue;

- Оператор повернення з функції return.

Оператор безумовного переходу goto. Оператор безумовного переходу має вигляд:

goto ідентифікатор;

де ідентифікатор - ім'я мітки оператора, розташованого в тій же функції, де використовується оператор безумовного переходу.

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

goto В; // Помилковий перехід, минаючи опис

float х = 0,0; // Ініціалізація

// Нічого очікувати виконано

goto В; // Допустимий перехід, минаючи блок

{

int n = 10; / * Всередині блоку визначена

змінна * /

x = n * x + x;

}

В: cout « "\ tx =" « х;

Всі оператори блоку досяжні для переходу до них із зовнішніх блоків. Однак при таких переходах необхідно дотримуватися те ж саме правило: не можна передавати управління в блок, обходячи ініціалізацію. Отже, буде помилковим перехід до операторів блоку, перед якими вміщено описи з явною або неявній инициализацией. Це ж вимога обов'язкового виконання ініціалізації справедливо і при внутрішніх переходах в блоці.

Прийнята в даний час дисципліна програмування рекомендує або зовсім відмовитися від оператора goto, або звести його застосування до мінімуму і строго дотримуватися наступних рекомендацій:

- Не входить всередину блоку ззовні;

- Не входить всередину умовного оператора, тобто не передавати управління операторам, розміщеним після службових слів if або else;

- Не входить ззовні всередину перемикача (switch);

- Не передавати управління всередину циклу.

Дотримання перерахованих рекомендацій дозволяє виключити можливі небажані наслідки безсистемного використання оператора безумовного переходу. Повністю відмовлятися від оператора goto навряд чи варто. Є випадки, коли цей оператор забезпечує найбільш прості і зрозумілі рішення. Один з них - це ситуація, коли в рамках тексту однієї функції необхідно з різних місць переходити до одній ділянці програми. Якщо з яких-небудь причин цю частину програми можна оформити у вигляді функції (наприклад, це може бути текст на асемблері), то найбільш просте рішення - застосування безумовного переходу за допомогою оператора goto. Такий стан виникає, наприклад, при необхідності обробляти помилки, які виявляються в процесі виконання програми.

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

Оператор break. Оператор break служить для примусового виходу з циклу або перемикача. Визначення «примусовий» підкреслює безумовність переходу. Наприклад, в разі циклу не перевіряються і не враховуються умови подальшого продовження ітерацій. Оператор break припиняє виконання оператора циклу або перемикача і здійснює передачу управління (перехід) до наступного за циклом або перемикачем оператору. При цьому на відміну від переходу за допомогою goto оператор, до якого виконується передача керування, не повинен бути позначений. Оператор break можна використовувати ніде, крім циклів і перемикачів.

Необхідність у використанні оператора break в тілі циклу виникає, коли умови продовження ітерацій потрібно перевіряти не на початку ітерації (цикли for, while), не в кінці ітерації (цикл do), а в середині тіла циклу. У цьому випадку тіло циклу може мати таку структуру:

{

оператори;

if (умова) break;

оператори;

}

Цикли і перемикачі можуть бути багаторазово вкладеними. Однак слід пам'ятати, що оператор break дозволяє вийти тільки з самого внутрішнього циклу або перемикача.

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

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

while (умова)

{

...

if (условіе_прериванія) continue;

...

}

do

{

...

if (условіе_прериванія) continue;

...

} While (умова);

for (спісок_ініціалізаціі; умова;

Следующая_ітерація)

{

...

if (условіе_прериванія) continue;

...

}

У кожної з форм трьома крапками позначені оператори тіла циклу.

Слідом за ними розміщений порожній оператор з міткою continue. Якщо серед операторів тіла циклу є оператор continue і він виконується, то його дія еквівалентно оператору безумовного переходу на мітку continue.

Приклад 3.7. Обчислити значення спеціальної функції (інтегральної показовою функції)

.  (3.11)

по її розкладанню в ряд з точністю  , Аргумент функції  вводиться з клавіатури.

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

,  (3.12)

тоді як наступний член ряду може бути визначений таким чином

.  (3.13)

скориставшись властивістю факторіала  останній вираз може бути записано таким чином

.  (3.14)

Ставлення наступного і поточного членів ряду

,  (3.15)

отже

.  (3.16)

Перший член ряду

.  (3.17)

Умова завершення обчислення суми ряду може бути записано таким чином  . Програма має наступний вигляд:

лістинг 3.5 | лістинг 3.7


Операнд_1? операнд_2: операнд_3 | Хід роботи | лістинг 2.1 | лістинг 2.2 | лістинг 2.3 | Хід роботи | лістинг 3.1 | лістинг 3.2 | лістинг 3.3 | лістинг 3.4 |

© 2016-2022  um.co.ua - учбові матеріали та реферати