Приклад 6.1. Середнє арифметичне і кількість позитивних елементів | лістинг 6.1 | Приклад 6.2. Номер стовпця з позитивних елементів | лістинг 6.2 | лістинг 6.3 | I. Вихідні дані, результати і проміжні величини. | лістинг 6.4 | Приклад 6.4. Згладжування заданої речової матриці, робота з файлами | лістинг 6.5 | лістинг 6.6 |

загрузка...
загрузка...
На головну

Приклад 7.1. Передача в функцію параметрів стандартних типів

  1. E. Числовий приклад
  2. F. Приклади сателітних рахунків
  3. Hnр - среднемаксімальная глибина промерзання, рівна, наприклад, 59 см.
  4. II. Приклади коагулограм і висновків про стан системи гемостазу
  5. III. Програма і тестові приклади
  6. IV. ПРИМІРНА ТЕМАТИКА КУРСОВИХ РОБІТ
  7. IV. Приклади загальних аналізів крові

Написати програму виведення таблиці значень функції Ch x (гіперболічний косинус) для аргументу, що змінюється в заданих межах з заданим кроком. Значення функції обчислювати за допомогою розкладання в ряд Тейлора з точністю r.

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

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

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

double cosh (double x, double eps);

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

include

#include

double cosh (double x, double eps); // Прототип ф-ції

int main ()

{

double Xn, Xk, dX, Eps;

printf ( "Enter Xn, Xk, dX, eps \ n");

scanf ( "% lf% lf% lf% lf. & Xn, & Xk, & dX, & eps);

printf (................................ \ n ");

printf ("| X | Y | \ n ");

printf (............................. \ n ");

for (double x = Xn; x <= Xk; x + = dX)

printf ( "|% 9.2] f |% 14.6g | \ n" \ x. cosh (x. eps));

printf ( "............................... \ n");

return 0;

}

double cosh (double x. double eps)

{

const int Maxlter - 500; / * Максимальну кількість ітерацій * /

double ch = 1. у = ch; / * Перший член ряду і поч. значення суми * /

for (Int n = 0; fabs (ch)> eps; n ++)

{

ch * - x * x / ((2 * n + 1) * (2 * n + 2)); // Член ряду

у + = ch; // Додавання члена ряду до суми

if (n> Maxlter)

{

puts ( "Ряд розходиться! \ n");

return 0;

}

}

return у;

}

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

Якщо визначення функції розміщується після її виклику, то перед функцією, в якій він виконується, розміщують прототип (заголовок). Зазвичай заголовки всіх використовуваних в програмі функцій розміщують на самому початку файлу або в окремому заголовки. Тема потрібен для того, щоб компілятор міг перевірити правильність виклику функції. Стандартні заголовки, які ми підключаємо до програм, містять прототипи функцій бібліотеки саме з цією метою.

У цій програмі для введення-виведення ми застосували не клас, а функції, успадковані з бібліотеки мови С, оскільки з їх допомогою форматований вивід записується більш компактно. Специфікація формату застосовується для виведення дійсних чисел в широкому діапазоні значень. Перше число модифікатора (14) задає, як і для інших специфікацій, ширину відведеного під число поля, а друге (6) - не точність, як в форматі f, а кількість значущих цифр. При цьому число виводиться або в форматі f, або в форматі е (з порядком) в залежності від того, який з них вийде коротше.

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

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

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

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

 



Хід роботи | лістинг 7.1
загрузка...
© um.co.ua - учбові матеріали та реферати