Додаток Б. Завдання для розрахункової роботи
Мета завдання
•використання динамічних структур даних;
•використання процедурних типів;
•закріплення навиків роботи з типом “запис”.
Постановка задачі
Визначити структуру даних відповідно до завдання. Розмістити структури в динамічній пам'яті, об'єднавши їх в групу. Зберегти групу у файлі.
Теоретичні відомості
Група – це об'єкт (структура), до якого включені інші об'єкти (структури). Об'єкти, що входять до групи, називаються елементами групи. Елементи групи, у свою чергу, можуть бути групою.
Приклади груп:
1)Вікно в інтерактивній програмі, яке містить такі елементи, як поля введення і редагування даних, кнопки, списки вибору, діалогові вікна і так далі.
2)Агрегат, що складається з дрібніших вузлів.
3)Город, що складається з рослин, системи поливу і плану вирощування.
4)Деяка організаційна структура (наприклад, ФАКУЛЬТЕТ, КАФЕДРА, СТУДЕНТСЬКА ГРУПА).
Реалізувати групу можна таким чином. Створюється зв'язаний список записів типу TItem:
Type
PItem=^TItem;
TItem=record
next :PItem; item :PObject;
end;
Поле item вказує на об'єкт, включений в групу. Група містить поле last типа PItem, яке вказує на початок зв'язаного списку об'єктів, включених в групу.
Для роботи з групою мають бути визначені такі процедури і функції:
1)Procedure GroupInsert(var group:TGroup;p:PObject);
Включає в групу group структуру, на яку вказує р.
2)Procedure GroupShow(group:TGroup);
Дозволяє проглянути групу.
3)Function GroupEmpty(group:TGroup):boolean;
Показує, чи є хоча б один елемент в групі.
4)Procedure GroupDelete(var group:TGroup; p:PObject);
Видаляє елемент з групи.
52
un = knun−1 , u0 =1, n=1,2,…,
де kn = xn – коефіцієнт рекурентності.
Дійсно, при n=1,2… |
u |
= u |
|
x |
= x ; |
u |
|
= u |
x |
= |
x2 |
; u |
|
= u |
|
x |
= |
x3 |
;… |
|
1 |
|
0 |
1 |
|
|
2 |
1 2 |
2 |
|
3 |
|
2 |
3 |
6 |
|
Початок
Введіть x i eps
x, eps
n=0
u=1
s=1
|u|>=eps
так
n=n+1
n>m
ні
u=u*x/n
Блок-схема алгоритму
ні ‘Cума ряду S=’, S, ‘при n=’, n
Кінець
так |
‘Точність не досягнуто за‘, |
|
m, ‘ітерацій’ |
s=s+u
13
Лістинг програми (мова Фортран)
*Використання циклу з передумовою (DO WHILE)
Program SUMM
*Надання константи, що обмежує кількість ітерацій
PARAMETER (M=100) WRITE(*, *) ‘Введить x i eps’ READ(*, *) x, eps
N=0
U=1.
S=1.
*Перевірка умови виходу із циклу
DO WHILE (ABS(U).GE.EPS) N=N+1
*Запобігання “зациклювання”
IF (N>M) THEN
WRITE(*, *) ‘Точність не досягнуто за’, m, ‘ітерацій’
STOP ELSE U=U*X/N S=S+U
ENDIF
ENDDO
WRITE(*, 33) S, N
33FORMAT(‘Cума ряда S=’, F15.9, ‘при n=’, I3) STOP
END
Лістинг програми (мова C/C++)
// Застосування циклу з передумовою (while)
#include <iostream> #include <math.h> #include <locale> #include <conio.h> #include <iomanip.h> #include <stdlib.h> using namespace std; int main(){
// Надання константи, що обмежує кількість ітерацій const int m=100;
float x, eps;
//Підключення кирилиці setlocale(LC_ALL, “rus”);
//Введення-вивід в стилі С++
cout<<"Введіть X: "; cin>>x; cout<<endl; cout<<"Введіть EPS: "; cin>>eps;
//Опис та ініціалізація змінних int n=0; float u=1, s=1;
//Перевірка умови виходу із циклу while (fabs(u)>=eps) {
n++;
//Запобігання «зациклювання»
if (n>m) {
14
Bn = cos xBn−1 , B0 = cos x, n =1,2,3...
Cn =( 2n +1)2nCn−1 , C0 =1, n =1,2,3...
Загальний член ряду дорівнює un =( An Bn )Cn .
Тестування проведемо при x = 2π . В результаті обчислення шості перших складових бачимо низпадання їх значень
u0 = 1, u1 = -0.1666667, u2 = 0.0083333, u3 = -0.0001984, u4 = 0.0000028, u5 = -0.000000025455,
при цьому отримаємо S = 0.0841471.
3. Структурна блок-схема алгоритму
4. Інструкція щодо експлуатації програми
Програма summ.срр знаходиться на дискеті у кореневому каталозі.
Вхідні дані:
x – аргумент; EPS – задана точність ε .
Вихідні дані:
S – значення обчисленої суми ряду; N – кількість складових ряду при зданої точності.
На екран вхідні та вихідні дані виводяться у вигляді
|
x = |
, EPS = |
|
|
|
||
|
S = |
, |
N= |
|
|
|
|
|
5. Результати розрахунків і аналіз |
x = 2π , знайдених для рі- |
|||||
|
Значення суми ряду і кількість складових при |
||||||
зних значень EPS, надано у табл. 1. |
|
Таблиця 1 |
|||||
|
|
|
|
|
|
||
|
|
EPS |
|
S |
|
N |
|
|
|
|
|
|
|
|
|
|
|
0.001 |
|
0.8416667 |
|
2 |
|
|
|
|
|
|
|
|
|
|
|
0.0001 |
|
0.8414682 |
|
3 |
|
|
|
|
|
|
|
|
|
|
|
0.00001 |
|
0.8414710 |
|
4 |
|
|
|
|
|
|
|
|
|
|
|
0.000001 |
|
0.8414710 |
|
4 |
|
|
|
|
|
|
|
|
|
Із табл. 1 видно, що при зростанні EPS зростає кількість складових і стабілізується значення суми S.
51
ЗМІСТ
Анотація………………………………………………………………………...………..............2 Основна частина…………………………………………………………..........................2
1.Постановка задачі………………………………………………………………...3
2.Аналіз задачі………………………………………………………………………...4
3.Структурна блок-схема алгоритму………………………………………….6
4.Інструкція щодо експлуатації програми…………………..................6
5.Результати розрахунків і аналіз……………………………...................7 Список використаної літератури…………………………………………….................8 Додаток. Лістинг програми…………………………………………………….................8
АНОТАЦІЯ
1. Постановка задачі
|
∞ |
n |
n+1 |
x |
|
Обчислити суму нескінченого ряду |
S = ∑ |
( −1) cos |
|
зі заданою точ- |
|
( 2n +1)! |
|
||||
|
n=0 |
|
|
ністю ε і видати значення S і n.
2. Тип комп’ютера. Операційна система
Програма розрахована для ПК типу Pentium IV. Реалізована в ОС Windows XP.
3. Мова програмування –С/С++.
4. Допоміжні програми – немає.
5. Стан програми – відлагоджена.
ОСНОВНА ЧАСТИНА
1. Постановка задачі Розробити структурну схему алгоритму і програму обчислення суми не-
скінченного ряду
|
cos |
2 |
x |
|
cos |
3 |
x |
|
cos |
4 |
x |
∞ |
n |
n+1 |
x |
S = cos x − |
|
+ |
|
− |
|
+... = ∑ |
( −1) cos |
|
|||||||
|
|
|
|
|
|
|
|
|
( 2n +1)! |
|
|||||
3! |
|
5! |
|
7! |
|
n=0 |
|
зі заданою точністю ε ( ε =10-3; 10-4; 10-5; 10-6 ) вважаючи, що задана точність досягнута, якщо чергова складова за абсолютним значенням стане менше, ніж ε, і видати вхідні дані – x i ε , та вихідні дані – S і N на екран.
2. Аналіз задачі Для зменшення витрат машинного часу на визначення суми нескінче-
ного ряду S чергову складову будемо обчислювати за рекурентними залежностями. Введемо позначки:
An =( −1)n , Bn = cosn+1 x , Cn =( 2n +1)!
Рекурентні формули мають вигляд
An = −An−1 , A0 =1, n =1,2,3...
50
cout<<" Точність не досягнута за <<"<<m<<" ітерацій "<<endl; return 0;
}
else { u*=x/n; s+=u;
}
}
cout<<" Сума ряду S= "<<setprecision(9)<<setiosflags(ios::fixed | ios::showpoint)<<s<<endl<<" при N= "<<n<<endl;
getch(); return 0;
}
Приклад 5. Розглянемо наведене завдання для нескінченного ряду:
∞ |
( −1)n+1 x2 cosn+2 x |
|
|||
S = ∑ |
|
|
|
. |
(2) |
( n +1)(2n)!+n |
2 |
2n+1 |
|||
n=0 |
|
3 |
|
|
Для організації циклічної структури алгоритму застосуємо оператор безумовного переходу GOTO.
З метою зменшення витрат комп’ютерного часу на визначення суми ряду (2) чергову складову будемо обчислювати за рекурентними залежностями. Введемо позначення:
A =( −1)n+1 x2 |
, |
B =( 2n )!, |
C |
n |
= cosn+2 |
x, |
D = 32n+1. |
n |
|
n |
|
|
|
n |
Рекурентні залежності набувають вигляд:
A |
=( −1)A |
−1 |
, |
|
A |
|
= −x2 , n =1,2...; |
|||
|
n |
n |
|
|
0 |
|
|
|
|
|
Bn |
= 2n( 2n −1)Bn−1 , |
B0 =1, |
n =1,2...; |
|||||||
C |
n |
= cos x C |
n−1 |
, |
C |
0 |
= cos2 x, |
n =1,2...; |
||
|
|
|
|
|
|
|
||||
Dn |
= 9 Dn−1 , |
|
D0 |
= 3, |
n =1,2... . |
Загальний член ряду обчислюється за формулою
un = |
AnCn |
, n = 0,1,2... . |
|
( n +1)B |
+n2 D |
||
|
n |
n |
|
15
|
Блок-схема алгоритму |
|
Додаток А. Зразок оформлення звіту |
Початок |
про виконання лабораторних робіт |
|
|
|
МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ |
Введіть |
Дніпропетровський національний університет імені Олеся Гончара |
x i eps |
Механіко-математичний факультет |
|
Кафедра обчислювальної механіки і міцності конструкцій |
x, eps |
|
З В І Т
про виконання лабораторної роботи № m=100, n=0, s=0, A=-x*x, <НАЗВА>
B=1, cs=cos(x), C=cs*cs, D=3, u=(A*C)/((n+1)*B+n*n*D), s=s+u
|
|
|
|
|
ШИФР <номер> |
|
|
|
|
‘Cума ряду S=’, S, |
Виконавець: студент групи МХ-08-1 |
<П.І.Б> |
|
|
|
|
|
|||
|
|u|<eps |
Прийняв: |
<П.І.Б викладача> |
|||
|
|
та |
‘при n=’, n |
|
|
|
|
ні |
|
|
|
|
|
|
|
|
|
|
Завдання отримано |
<дата> |
|
n=n+1 |
|
|
|
||
|
|
|
|
Звіт здано |
<дата> |
|
|
|
|
|
Кінець |
||
|
|
|
‘Точність не досягнута |
|
|
|
|
n>m |
|
|
|||
|
|
|
|
|||
|
|
та |
за‘, m, ‘ітерацій’ |
|
|
|
ні
A=-A, B=2*n*(2*n-1)*B, C=cs*C, D=9*D, u=(A*C)/((n+1)*B+n*n*D) u=u*x/((2*n-1)*(2*n))
s=s+u
16
Дніпропетровськ
2012
49