Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

C _Учебник_МОНУ

.pdf
Скачиваний:
199
Добавлен:
12.05.2015
Размер:
11.12 Mб
Скачать

Програмування базових алгоритмів

129

Приклад 4.35 Написати програму наближеного обчислення інтегралу функції f x x3 x2 4.4x 4 трьома методами: прямокутників, трапецій та Сімпсона на заданому інтервалі x a,b із заданою точністю .

Розв‟язок. У багатьох наукових та інженерних задачах треба віднайти значення інтегралу функції f(x), де х змінюється на проміжку [a, b]. Якщо для неперервної на проміжку підінтегральної функції можна віднайти первісну функцію F(x), то визначений інтеграл легко обчислити за формулою Ньютона–Лейбніца:

b

f x dx F b F a

a

Але у багатьох випадках не вдається знайти первісну функцію або вона є настільки складною, що обчислювати інтеграл за її допомогою важче, аніж у інші способи. У таких випадках застосовують методи чисельного інтегрування, які базуються на тому, що значення інтегралу дорівнює площі криволінійної трапеції, розміщеної поміж лінією графіка функції та віссю абсцис (рис. 4.1). Згідно з цими методами, проміжок інтегрування [a, b] слід поділити на кілька відрізків (приміром, n відрізків), та замінити площу S зазначеної криволінійної трапеції на суму площин маленьких криволінійних трапецій si, на яких задану функцію f(x) замінено наближеною функцією fі (x), тобто

b

 

S

 

a

y

f(x)

n 1

f(x)dx si .

i0

si

 

 

 

 

х

0 a = x0

x1

x2

… xі

xі+1 xn-1 b = xn

Рис. 4.1.

Криволінійні трапеції для інтегрування

Залежно від того, якими є наближені функції fі(x), існують різні методи (формули) обчислення визначених інтегралів. В усіх цих методах інтеграл наближено обчислюють як певну сукупність значень підінтегральної функції f(xі), де хi = a + ih межі відрізків інтегрування, h = хi+1 хi, крок інтегрування, i = 0, 1, …, n. Найбільш відомими в інженерній практиці є методи чисельного інтегрування: прямокутників, трапецій та Сімпсона.

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

функцію f(x) на кожному відрізку h = хi+1 хi (де і = 0, 1, …, n) замінюють на прямі лінії, паралельні до осі абсцис (рис. 4.2). При цьому криволінійна трапе-

ція замінюється на n прямокутників.

130

Розділ 4

n 1

S si

i 0

y

f(x)

n 1

xi 1 xi f (xi ) h

i 0

n 1

f xi .

i 0

si

 

 

 

х

0 a = x0 x1

x2

… xі

xі+1 xn-1 b = xn

Рис. 4.2. Інтерпретація інтегрування методом прямокутників

В основу формули трапецій покладено заміну кривої підінтегральної функції на ламану, тобто з‟єднуються прямими лініями значення функцій на кінцях відрізків. Отже, площу криволінійної трапеції наближено замінюємо на суму площин n трапецій (рис. 4.3).

y

f(x)

si

 

 

 

х

0 a = x0 x1

x2

… xі

xі+1 xn-1 b = xn

Рис. 4.3. Інтерпретація інтегрування методом трапецій

Загальна площа трапецій S і відповідно наближене значення інтегралу за методом трапецій обчислюється за формулою

n 1

n 1

h

f xi f xi 1

 

h

 

n 1

 

S si

 

 

 

 

 

 

2

2

f a f b 2 f xi .

i 0

i 0

 

 

 

i 1

 

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

Програмування базових алгоритмів

131

проміжок інтегрування розбивають на парну кількість n відрізків [xi – h, xi + h]. Отже, площу криволінійної трапеції наближено замінюємо на суму n/2 площин під параболами (рис. 4.4).

y

f(x)

si

 

 

 

х

0 a = x0 x1

x2

… xі

xі+1 xn-1 b = xn

Рис. 4.4. Інтерпретація інтегрування методом Сімпсона

Остаточна формула обчислення інтегралу S методом Сімпсона:

 

h

 

n 1

S

f a f b 4

 

3

 

i 1

 

 

 

де i – непарні числа, j – парні числа.

n 2

 

 

f xi 2 f x j

,

 

 

 

j 1

 

 

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

Зображення інтегралу на формі організовано за допомогою компонента

Image . Зображення у форматі bmp завантажено до властивості Picture цього компонента.

Текст програми:

// Підінтегральна функція double f(double x)

{ return x*x*x-x*x-4.4*x+4;

}

// Метод прямокутників

double integral_Pr(double a, double b,double eps)

{double h=eps,s,x;

for(s=0, x=a; x<b ; x+=h) s+=f(x); return h*s;

}

// Інтеграл методом прямокутників
// Інтеграл методом трапецій
// Інтеграл методом Сімпсона

132 Розділ 4

// Метод трапецій

double integral_Trap(double a,double b,double eps)

{double h=eps,s,x;

for(s=0, x=a+h; x<b ; x+=h) s+=f(x);

return h/2*(f(a)+f(b)+2*s);

}

// Метод Сімпсона

double integral_Simp(double a,double b,double eps)

{double h=eps,s1,s2,x; int i, n; n=(int)((b-a)/h)+1;

if(n%2==0) {n++;h=(b-a)/(n-1);}

for(s1=0, i=1,x=a+h; i<n-1 ; i+=2,x+=2*h) s1+=f(x); for(s2=0, i=2,x=a+2*h; i<n-2 ;i+=2, x+=2*h) s2+=f(x) ; return h/3*(f(a)+f(b)+4*s1+2*s2);

}

//-------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender) {double a,b,i_bar,i_trap,i_simp,eps; a=StrToFloat(Edit1->Text); b=StrToFloat(Edit2->Text); eps=StrToFloat(Edit3->Text);

i_bar= integral_Pr(a,b,eps); Edit4->Text=FloatToStr(i_bar); i_trap= integral_Trap(a,b,eps); Edit5->Text=FloatToStr(i_trap); i_simp= integral_Simp(a,b,eps); Edit6->Text=FloatToStr(i_simp);

}

Приклади консольних програм з оператором циклу for

Приклад 4.36 Обчислити суму всіх двоцифрових чисел, кратних до числа 3.

Розв‟язок. Двоцифрові числа – це цілі числа від 10 до 99 включно. Змінюючи параметр циклу від 12 (перше двоцифрове число, кратне до 3) до 99 (останнє двоцифрове число, кратне до 3) із кроком 3, можна використовувати його як число для додавання до суми.

Текст програми:

#include <vcl.h> #pragma hdrstop #include <iostream.h> #include <conio.h> #pragma argsused

//-------------------------------------------------------------

int main(int argc, char* argv[])

{int i, s=0; // Спочатку сума дорівнює 0 for(i=12;i<=99;i+=3) s+=i;// Обчислити суму чисел від 12 до 99 з кроком 3

Програмування базових алгоритмів

133

cout << "Сума двоцифрових чисел, кратних до числа 3, дорівнює"

<< s << endl; // Виведення значення суми getch(); return 0;

}

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

Сума двоцифрових чисел, кратних до числа 3, дорівнює 1665

Приклад 4.37 У програмі організовано введення 12 цілих чисел та обчислюється добуток парних з цих чисел.

Розв‟язок. У циклі, який повторюється 12 разів, виконуються такі дії:

виводиться запрошення для введення наступного числа;

вводиться нове число;

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

Текст програми:

#include <vcl.h> #pragma hdrstop #include <iostream.h> #include <conio.h> #pragma argsused

//-------------------------------------------------------------

int main(int argc, char* argv[])

{ int i, x, p = 1;

// Спочатку добуток дорівнює 1.

for(i = 1; i <= 12; i++)

// У циклі 12 разів повторити дії:

{ cout << "Ввести " << i << " число: ";//вивести запрошення,

cin >> x;

// вести число, і,

if(x%2==0 && x!=0) p *= x;// якщо число парне, перемножити його.

}

cout << "Добуток парних чисел: " << p << endl; getch(); return 0;

}

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

Ввести 1 число: 3 Ввести 2 число: 1 Ввести 3 число: –7 Ввести 4 число: 6 Ввести 5 число: 3 Ввести 6 число: –2 Ввести 7 число: 4 Ввести 8 число: 7 Ввести 9 число: 11 Ввести 10 число: –4 Ввести 11 число: –5 Ввести 12 число: 3

Добуток парних чисел: 192

134

Розділ 4

У цієї програми є один суттєвий недолік. Якщо парних чисел немає, то результатом обчислення добутку буде виведено 1. Замість цього бажано вивести повідомлення, що парних чисел введено не було. Для цього слід вести підрахунок кількості введених парних чисел. Якщо після циклу ця кількість становитиме 0, то слід вивести повідомлення. Для обчислення кількості візьмемо ще одну цілу змінну, значення якої спочатку є 0 (парних чисел ще нема). Якщо введене число є парне, кількість збільшується на 1.

Текст програми: int main()

{int i, x, p = 1;

for(i = 1; i <= 12; i++)

{ cout << "Ввести " << i << " число: ";

cin >> x;

// Введення числа.

if(x%2==0 && x!=0)

// Для парних чисел

{ p *= x;

// обчислюватиметься їхній добуток

k++;

// і кількість таких чисел.

} }

 

if(k > 0) // Якщо кількість парних чисел є більше за 0, виведеться на екран cout << "Добуток парних чисел: " << p << endl; // добуток,

else // інакше – виведеться повідомлення, що парних чисел немає. cout << "Парних чисел немає." << endl;

getch(); return 0;

}

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

Ввести 1 число: 3 Ввести 2 число: 1 Ввести 3 число: –7 Ввести 4 число: 5 Ввести 5 число: 3 Ввести 6 число: –7 Ввести 7 число: 3 Ввести 8 число: 7 Ввести 9 число: 11 Ввести 10 число: –17 Ввести 11 число: –5 Ввести 12 число: 3 Парних чисел немає.

Приклад 4.38 Увести шість дійсних чисел та віднайти найбільше з них. Розв‟язок. Алгоритм пошуку максимального числа:

1)ввести перше число x;

2)вважаємо, що воно є максимальним:

max = x;

Програмування базових алгоритмів

135

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

if (x > max) max = x;

Текст програми: int main()

{int i;

float x, max;

cout << "Ввести 1-ше число: "; cin >> x;

max = x;

for (i = 2; i <= 6; i++)

{cout << "Ввести " << i << " число ";

cin >> x;

if (x > max) max = x;

}

cout << "Найбільше число: " << max << endl; getch();

return 0;

}

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

Ввести 1 число: 5 Ввести 2 число: 2 Ввести 3 число: –7 Ввести 4 число: 3 Ввести 5 число: 15 Ввести 6 число: –1 Найбільше число: 15

Приклад 4.39 Вивести таблицю степенів двійки від нульової до десятої.

Розв‟язок. Для обчислення і виведення усіх значень степенів двійки достатньо організувати лише один цикл.

Текст програми: int main()

{ int

n;

// Показник степеня

int

st;

// Значення 2 у степені n

printf("\n Таблиця степенів двійки \n"); for(n=0, st=1; n<=10; n++)

{ printf("%3i %5i\n", n, st); st*=2;

}

printf("\n Для завершення натисніть <Enter>\n"); getch();

return 0;

}

136

Розділ 4

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

Таблиця степенів двійки

01

12

24

38

416

532

664

7128

8256

9512

101024

Для завершення натисніть <Enter>

Приклад 4.40 Написати програму, яка обчислює часткову суму ряду: 11 3 1 5 1 7 1 9 ... для заданої кількості членів ряду, яка вводиться корис-

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

Розв‟язок. Для обчислення запишемо формулу для обчислення доданка

ряду

1

, де і = 1, 2, 3, …

2i 1

Текст програми: int main()

{// Обчислення числа з використанням властивості ряду 1 – 1/3 + 1/5 – 1/7 + ...

float

x; int n;

// Член ряду та кількість доданків у сумі

float

sum=0;

// Часткова сума, значення якої при підсумовуванні

// вельми значної (понад 1000) кількості елементів ряду, наближається до /4 printf("Обчислення суми ряду 1 -1/3 + 1/5 - 1/7 + ...\n"); printf("Введіть кількість членів ряда для суми ->" ); scanf("%i", &n);

for(int i = 1; i <= n; i++) { x = 1./(2*i - 1) ;

if((i % 2)==0) x = -x; sum += x;

}

printf("Сума ряду: %2.6f\n", sum);

printf("Обчислене значення числа ПІ = %2.6f\n", sum * 4); printf("\nДля завершення натисніть <Enter>");

getch(); return 0;

}

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

Обчислення суми ряду 1 -1/3 + 1/5 - 1/7 + ...

Введіть кількість членів ряду для суми -> 10000

Сума ряду: 0.785375

Обчислене значення числа ПІ = 3.141499 Для завершення натисніть <Enter>

Програмування базових алгоритмів

137

Приклад 4.41 Послідовно ввести вісім дійсних чисел і обчислити середнє арифметичне додатних з цих чисел.

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

Текст програми:

#include <vcl.h> #pragma hdrstop #include <stdio.h> #include <conio.h> #pragma argsused

//-------------------------------------------------------------

int main(int argc, char* argv[])

{int i, k = 0; float x, s = 0, sred; for(i = 1; i <= 8; i++)

{cout << "Ввести " << i << " число "; cin >> x;

if(x > 0) {s += x; k++;} // Накопичення суми і кількості додатних

}

if(k > 0)

{sred = s / k;

cout << "Середнє арифметичне додатних: " << sred << endl;

}

else cout << "Додатних чисел нема" << endl; getch();

return 0;

}

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

Ввести 1 число: 5 Ввести 2 число: 2 Ввести 3 число: -7 Ввести 4 число: 3 Ввести 5 число: 5 Ввести 6 число: -1 Ввести 7 число: 3 Ввести 8 число: 7

Середнє арифметичне додатних: 4.16667

Приклад 4.42 Написати програму, яка переведе введене користувачем десяткове число до двійкової системи числення.

Розв‟язок. Алгоритм такого переведення розглядався в п. 1.4.4 (див. стор. 19).

Текст програми:

#include <vcl.h> #pragma hdrstop #include <stdio.h>

138

Розділ 4

 

#include <conio.h>

 

#pragma argsused

 

//-------------------------------------------------------------

 

int main(int argc, char* argv[])

 

{int dec; // Десяткове число

int v, i; // Вага і номер формованого розряду printf("\nПереведення десяткового числа до двійкового \n");

printf("Введіть ціле число від 0 до 255 і натисніть <Enter>"); printf("\n -> ");

scanf("%i", &dec);

printf("Десятковому числу %i відповідає двійкове ", dec) ; v = 128; // Вага старшого (восьмого) розряду

for(i = 1; i <= 8; i++)

{if(dec >= v)

{printf("1");

dec -= v;

}

else printf("0");

v = v / 2; // Вага наступного розряду удвічі менше

} printf("\n\nДля завершення натисніть <Enter>"); getch (); return 0;

}

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

Переведення десяткового числа до двійкового Введіть ціле число від 0 до 255 і натисніть <Enter>

-> 200

Десятковому числу 200 відповідає двійкове 11001000 Для завершення натисніть <Enter>"

Приклад 4.43 Написати програму-тест для перевірки знань таблиці множення. Програма має вивести 10 прикладів і виставити оцінку: за 10 правильних відповідей – “відмінно”, за 9 та 8 – “добре”, за 7 та 6 – “задовільно”, за 5 і менш – “погано”.

Текст програми:

#include <vcl.h> #pragma hdrstop #include <stdio.h> #include <conio.h>

#include <stdlib.h> // Для доступу до srand та rand (див. підрозд. 3.7)

#include <time.h> #pragma argsused

//-------------------------------------------------------------

int main(int argc, char* argv[])

{// Програма перевіряє знання таблиці множення.

int numbl,numb2;//

Оголошення змінних для зберігання значень співмножників,

int res;

//

добутку,

int otv;

//

відповіді,

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]