Ім'я файлу: ЛР8.doc
Розширення: doc
Розмір: 131кб.
Дата: 20.05.2023
скачати

ЛАБОРАТОРНА РОБОТА №8

ОПЕРАТОРИ ЦИКЛУ В МОВІ С++

1. Мета роботи:

отримання практичних навиків в роботі з операторами циклу мови C++

2. Теми для попереднього опрацювання:

  • Оператори циклу мови C++.

3. Завдання для виконання:

3.1. Умова задачі

Для ряду, члени якого обчислюються за формулою, відповідною Вашому індивідуальному завданню, підрахувати суму членів ряду з точністю до 0.000001 і суму перших 10 членів ряду. Якщо Ви вважаєте це за необхідне, можете спростити або перетворити вираз.

п/п

Загальній член ряду

1



2



3



4



5



6



7



8



9



10



11



12



13



14



15



16



17



18



19



20



3.2. Приклад розв’язання задачі

3.2.1. Розробка алгоритму розв’язання

Загальний метод розв’язання

Очевидно, що процес підрахунку суми членів ряду повинен бути ітераційним: слід повторювати обчислення по одній і тій же формулі при значеннях n=0, 1, 2 ... . У кожній ітерації циклу слід виконувати обчислення по заданій формулі для поточного значення n, тобто підраховувати черговий член ряду. Набутого значення слід додавати до змінної, яка представляє суму. Ця змінна в кожній ітерації міститиме в собі суму всіх вже оброблених членів ряду, отже, її початкове значення (коли жоден член ще не оброблений) повинне бути 0. Після обчислення суми при значенні n=9 слід вивести значення суми – це один з результатів програми відповідно до завдання (береться значення 9, оскільки перший член ряду обчислюється при n=0, таким чином, дев’ятий – при n=9). Після обчислення кожного члена ряду (але до збільшення його значення до суми) слід порівняти набутого значення із заданою межею точності. Через те, що значення члена ряду може бути як позитивним, так і негативним, при порівнянні слід використовувати абсолютне значення. Якщо абсолютне значення члена ряду не перевищує межі точності, слід закінчити обчислення: вийти з циклу надрукувати значення суми і завершити програму.

Алгоритм обчислення 2n

Для виконання зведення в ступінь можна застосувати бібліотечну функцію C++ pow(x,y). Але є можливість отримання цього значення ефективнішим способом. У кожній наступній ітерації циклу значення цього виразу удвічі більше, ніж в попередній. Отже, буде доцільно виділити окрему змінну для збереження значення 2n. Її початкове значення повинне бути 20 = 1, а в кінці кожної ітерації воно повинне подвоюватися.

Алгоритм обчислення (-1)n

В цьому випадку також недоцільно застосовувати функцію зведення в ступінь. Значення цього виразу буде 1 при парних значеннях n і -1 – при непарних. Отже, можна виділити змінну для збереження значення цього виразу. Її початкове значення повинне бути (-1) 0=1, а в кінці кожної ітерації воно повинне міняти знак на протилежний.

3.2.2. Визначення змінних програми

Всі змінні нашої програми відповідають змінним, які введені в схемі алгоритму. Додатково визначимо їх типи.

n – параметр ряду; за умовами завдання це – ціле число; оскільки наперед невідомо, скільки ітерацій циклу буде потрібні для досягнення межі точності, оголосимо його як "довге ціле":

long n;

Відзначимо, що хоча по умові завдання n – ціле, результати виразів, в яких фігурує n, матимуть дробову частину. Перетворення типів можна виконувати безпосередньо при обчисленні виразу, але щоб наперед виключити помилки, введемо ще одну змінну – dbln, яка представлятиме значення n як числа з плаваючою крапкою:

double dbln;

term – значення поточного члена ряду. Оголосимо його як:

double term;

sum – поточне значення суми ряду з початковим значенням 0. Оголосимо його як:

double sum=0;

k2 – змінна для збереження поточного значення 2n з початковим значенням 1 (див. пп.5.1.2). Вона повинна бути "довгою цілою" – з тих же міркувань, що і n:

long k2=1;

k1 – змінна для збереження поточного значення (-1) n з початковим значенням 1 (див. пп.5.1.3). Для неї досить бути "коротким цілим":

short k1=1;

eps – змінна для представлення заданої межі точності. Вона повинна мати початкове (незмінне) значення 0.000001, тому може бути оголошена як const. Використання змінної для представлення константи замість вживання константи безпосередньо в операторах програми може підвищити гнучкість програми:

const double eps=0.000001;

3.2.3. Розробка тексту програми

Починаємо розробку тексту програми із заголовка головної функції main():

int main(void)

Далі відкривається тіло функції, і в нього включаються визначення змінних (див. п.5.2). Визначення змінних реалізують блок 2 схеми алгоритму. На додаток до змінних, визначених в схемі алгоритму, оголошуємо робочу змінну dbln і константу eps. Оскільки правила мови C дозволяють привласнювати змінним початкові значення, в оголошенні змінних частково реалізований також і блок 3. Блоки 4 – 9 схеми алгоритму утворюють цикл. У мові З є два "прості" оператори циклу: цикл з передумовою – while і цикл з умовою поста – do-while. Але по схемі алгоритму видно, що вихід з циклу відбувається у середині тіла циклу (блок 5): після обчислення члена ряду, але до додавання його значення до суми. Отже, "прості" цикли застосувати не можна. "Складний" оператор циклу – for – є циклом з передумовою, але задавати умову в самому операторі циклу необов’язково. До того ж цей оператор дає можливість визначити дії, які потрібно виконати до початку циклу і дії, які виконуються в кінці кожної ітерації. Таким чином, відкриття циклу матиме вигляд:

for (n=0; ; n++, k2*=2, k1=-k1) {

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

У тілі циклу перший оператор:

dbln=n;

ця дія не передбачена в схемі алгоритму, але його необхідність ми пояснили в п.5.2.

Далі обчислюється значення поточного члена ряду:

term=k1*(dbln+1)/(dbln*dbln+k2);

цей оператор повністю реалізує блок 4 і формулу з індивідуального завдання (враховуючи пп.5.1.2, 5.1.3) за винятком того, що замість операції зведення в ступінь 2 ми застосовуємо множення.

Наступна дія – перевірка досягнення межі точності – на схемі алгоритму представлена блоком 5 і виконується умовним оператором, який починається з:

if (fabs(term)>=eps)

Слід зазначити, що порівнюється абсолютне значення term, а функція для отримання абсолютного значення змінної типу doublefabs(). Ця функція описана у файлі math.h, отже ми повинні включити цей файл почало програми:

#include

Продовження умовного оператора, дія, яка виконується при виконанні умови, – додавання значення члена до суми (блок 6):

sum+=term;

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

else break;

По схемі алгоритму нам треба перевірити, чи не досягла змінна n значення 9 (блок 7), і, якщо так, – друкувати значення суми (блок 8). Це реалізується умовним оператором:

if (n==9) printf("Сума 10 членів ряду = %10.7lf\n",sum);

Оскільки при невиконанні умови не робиться нічого, частина else для цього оператора не потрібна.

При виклику функції printf() завжди виникає проблема форматизации висновку. Ми включили у формат текст, який пояснює висновок, а значення змінної sum виводимо по специфікації %10.7lf. Тип специфікації відповідає типу змінної – double, а числові параметри ми вибрали довільно, оскільки в завданні не обумовлені вимоги до точності висновку. Перед крапкою ми залишаємо 2 позиції – для знаку і цілої частини (яка повинна бути 0), після крапки – 7 позицій, що на 1 перевищує точність заданої межі точності. Функція printf() описана у файлі stdio.h, тому ми включаємо цей файл в почало програми:

#include

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

Вихід з циклу відбувається по оператору break у складі умовного оператора. Після виходу з циклу ми повинні надрукувати остаточне значення суми (блок 10), що ми і робимо оператором:

printf("Повна сума ряду = %10.7lf\n",sum);

При визначенні формату висновку працюють ті ж міркування, що і у попередньому випадку.

Реалізація алгоритму закінчена, ми ставимо операторну дужку, яка закриває тіло функції main().

Повний текст програми приведений нижче.

/****************************************************/

/* Лабораторна робота |6 */

/* Обчислення суми ряду */

/* Приклад виконання. Варіант |30. */

/****************************************************/

#include

#include

int main(void){

long n; /* параметр ряду */

double dbln; /* параметр ряду у формі з плаваючою крапкою */

double sum=0; /* сума членів ряду */

double term; /* значення поточного члена */

const double eps=0.000001; /* межа точності */

long k2=1; /* pow(2,n)*/

short k1=1; /* pow(-1,n)*/

/* основний цикл; у модифікаціях обчислюються наступні значення pow(2,n) і pow(-1,n)*/

for (n=0; ; n++, k2*=2, k1=-k1) {

/* перетворення n у форму з плаваючою крапкою */

dbln=n;

/* обчислення чергового члена */

term=k1*(dbln+1)/(dbln*dbln+k2);

/* перевірка досягнення межі точності */

if (fabs(term)>=eps)

/* якщо не досягнутий – накопичення суми */

sum+=term;

/* якщо досягнутий – вихід з циклу */

else break;

/* якщо 10 членів – виведення суми */

if (n==9) printf("Сума 10 членів ряду = %10.7lf\n",sum);

}

/* кінець основного циклу */

/* виведення остаточної суми */

printf("Повна сума ряду = %10.7lf\n",sum);

return 0;

} /* кінець програми */

3.2.4. Відладка програми

При відладці програми доцільно використовувати покроковий режим з відстежуванням значень змінних – перш за все: n, term, sum. Слід виконати крок за кроком декілька ітерацій циклу, переконувавшись, що ці змінні набувають правильного значення. У такому режимі неважко виконати 10 ітерацій і переконатися в правильному формуванні першого результату. Якщо виникають помилки при обчисленні найбільш складного виразу в програмі: term=k1*(dbln+1)/(dbln*dbln+k2); можна включити в програму тимчасові додаткові змінні і розбити вираз на прості складові, перевіряючи на крок за кроком значення цих змінних. Наприклад:

double temp1, temp2; /* тимчасові змінні */

. . .

temp1=dbln+1;

temp2=dbln*dbln;

temp2=temp2+k2;

temp1=temp1/temp2;

term=k1*temp1;

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

printf("%ld %10.7lf\n",n,term);

3.2.5. Результати роботи програми

При роботі програми на екран були виведені такі результати:

Сума 10 членів ряду = 0.5600899

Повна сума ряду = 0.5663245
Завдання 2 (усно)

Визначте результати виконання таких команд:




















скачати

© Усі права захищені
написати до нас