Лабораторна робота № 1 (2 сем.) Тема: Покажчики на функції; передача покажчика на функцію в якості аргументу у викликах іншої функції. Ціль : Придбання умінь та навичок у таких питаннях: - використання покажчика на функцію; - реалізація ітераційних алгоритмів уточнення кореня рівняння. Вимоги до реалізації: 1)Перевірити умови збігання та записати розрахункові формули для знаходження кореня рівняння з точністю ε = 10 -4. 2)Скласти блок-схему алгоритму. 3)Вибрати початкове наближення до кореня на заданому проміжку. 4)Скласти програму розв`язання задачі. Вимоги: а)Програма повинна складатися не менш ніж з 3-х функцій: із першої функції викликається друга функція, в неї в якості параметра передається покажчик на третю функцію (для забезпечення гнучкості виклику функції для обчислень конкретних алгебраїчних виразів – значень функції). б)Всі вхідні дані передавати у допоміжні функції через список формальних параметрів. в)Функція, що реалізує метод знаходження (уточнення) кореня рівняння, повинна мати у списку параметрів: - межі проміжку, де знаходиться корінь, - точність, з якою треба наблизитися до значення кореня, - максимальна кількість ітерацій, - покажчик на функцію, яка буде здійснювати обчислення рівняння у точці, - кількість ітерацій, що зроблено для наближення до кореня із заданою точністю. г)Функція повинна вибирати початкове наближення до кореня на заданому проміжку. 5)У головній функції передбачити: запрошення і введення меж проміжку, значення точності наближення, максимальної кількості ітерацій; виклик функції уточнення значення кореня, відображення результату. Також програмно виконати перевірку, чи є знайдене значення коренем рівняння (шляхом підстановки у рівняння). Якщо так, вивести результати на екран з відповідним коментарем (з точністю 4 знаки після крапки), інакше – значення для аналізу ситуації (з коментарем). 6)Програма супроводжується коментарем, якій містить в собі: П.І.Б., шифр групи, умову завдання, примітки (якщо необхідно). Допоміжні функції повинні супроводжуватися коментарем, якій містить в собі: пояснення щодо призначення результату та аргументів функції, назву їх типів та розподіл аргументів на вхідні, вихідні та(або) вхідні-вихідні (тобто ті, що змінюються). 7)Тестування програми провести на варіантах вхідної інформації, які передбачають різні ситуації у границях обмежень у постановці задачі. Аналіз результатів необхідно провести самостійно до демонстрації програми викладачу та зафіксувати тестиу зошиті з розрахунками або посиланнями на відповідні текстові файли. 8)Перед здачею завдання викладачу в зошиті автора необхідно підготувати: a)повний текст умови індивідуального завдання, b)алгоритм розв`язання задачі у вигляді функціональної схеми із зазначенням параметрів кожної функції, c)результати не менш ніж 3-х різних тестів програми (з визначенням для кожного тесту початкових даних і аналізу результатів виконання). Індивідуальні завдання: № варианта | Уравнение | Отрезок, содержащий корень | Метод численного решения | Приближенное значение корня | 1 - a) | arccos (x) – (1 – 0.3 * x 3) 1 / 2 = 0 | [ 0 ; 1 ] | итераций | 0.56291 | 1 - б) | 1.8*x4-sin(10*x)=0 | [0.5 ; 0.75] | итераций | 0.664 | 2 - a) | – 3 * x + 4 * ln (x) + 5 = 0 | [ 2 ; 4 ] | Ньютона | 3.2300 | 2 - б) | e x – e – x – 2 = 0 | [ 0 ; 4 ] | Ньютона | 0.8814 | 3 - a) | cos (x/2) – 2 * sin (1/x) + 1/x = 0 | [ 1 ; 2.5 ] | половинного деления | 2.3 | 3 - б) | 1.8*x4-sin(10*x)=0 | [0.25 ; 0.45] | половинного деления | 0.3125 | 4 - а) | (1 – 0.4 * x 2) 1 / 2 – arcsin (x) = 0 | [ 0 ; 1 ] | итераций | 0.7672 | 4 - б) | -x + x 2 = 0 | [ 0.5 ; 1.5 ] | итераций | 1.0 | 5 - а) | e x – e - x – 2 = 0 | [ 0 ; 1 ] | Ньютона | 0.8814 | 5 - б) | 1.8*x4-sin(10*x)=0 | [-0.5 ; -0.2] | Ньютона | -0.316 | 6 –a) | cos (ln (x)) – sin (ln(x)) – 2 * ln (x)=0 | [ 1 ; 3 ] | половинного деления | 1.3749 | 6 – б) | 3* sin(x) + 2*cos(3*x) = 0 | [ 5.5 ; 6.5 ] | половинного деления | | 7 – a) | х – 2 + sin (1/x) = 0 | [ 1.2 ; 2 ] | итераций | 1.3077 | 7 – б) | e x – 2 * x2 = 0 | [ 1 ; 2 ] | итераций | 1.49 | 8 – a) | e x + ln (x) – 10 * x = 0 | [ 3 ; 4 ] | Ньютона | 3.5265 | 8 – б) | 3 * ln 2 (x) + 6 * ln (x) – 5 = 0 | [ 1 ; 3 ] | Ньютона | 1.8832 | 9 – а) | cos (x) – e – x * x / 2 + x – 1 = 0 | [ 1 ; 2 ] | половинного деления | 1.0804 | 9 – б) | 3 * ln 2 (x) + 6 * ln (x) – 5 = 0 | [ 1 ; 3 ] | половинного деления | 1.8832 | 10 - а) | 1 – x + sin (x) – ln (1 + x) = 0 | [ 0 ; 1.5 ] | итераций | 1.1474 | 10 – б) | x3 –2*x2 + x - 3 = 0 | [ 0.5; 2.8 ] | половинного деления | 2.17456 | 11 - а) | 3 * x – 14 + e x – e - x = 0 | [ 1 ; 3 ] | Ньютона | 2.0692 | 11 - б) | 2 * x * sin ( x ) – cos ( x ) = 0 | [ 2.5 ; 5 ] | Ньютона | 3.29 | 12 – а) | (1 – x) 1 / 2 – tg (x) = 0 | [ 0 ; 1 ] | половинного деления | 0.5768 | 12 – б) | x3 –2*x2 + x - 3 = 0 | [ 0.5; 2.8 ] | половинного деления | 2.17456 | 13 – a) | x + cos (x 0.52 + 2) = 0 | [ 0.5 ; 1 ] | итераций | 0.9892 | 13 – б) | e x – e – x – 2 = 0 | [ 0 ; 4 ] | итераций | 0.8814 | 14 – а) | 3 * ln 2 (x) + 6 * ln (x) – 5 = 0 | [ 1 ; 3 ] | Ньютона | 1.8832 | 14 –б) | 1.8*x4-sin(10*x)=0 | [ 0.1 ; 1 ] | Ньютона | 0.22 | 15 – а) | sin (x 2) + cos (x 2) – 10 * x = 0 | [ 0 ; 1 ] | половинного деления | 0.1010 | 15 – б) | sin(x2) – 0.5 = 0 | [1 ; 2] | половинного деления | 1.55 | 16 –а) | x 2 – ln (1+x) – 3 = 0 | [ 2 ; 3 ] | итераций | 2.0267 | 16 –б) | z3-z-0.8=0 | [ 0 ; 2 ] | итераций | 0.5 | 17 – a) | 2* x * sin (x) – cos (x) = 0 | [ 0.4 ; 1 ] | Ньютона | 0.6593 | 17 – б) | x3 –2*x2 + x - 3 = 0 | [ 0.5; 2.8 ] | Ньютона | 1.5 | 18 –a) | e x + (1 + e 2 * x) 1 / 2 – 2 = 0 | [ -1 ; 0 ] | половинного деления | –0.2877 | 18 - б) | 2* x * sin (x) – cos (x) = 0 | [ 0.4 ; 1 ] | половинного деления | 0.6593 | 19 – а) | ln (x) – x + 1.8 = 0 | [ 2 ; 3 ] | итераций | 2.8459 | 19 – б) | z3-z-0.9=0 | [ 0 ; 2 ] | итераций | 0.5 | 20 – а) | x * tg (x) – 1/3 = 0 | [ 0.2 ; 1 ] | Ньютона | 0.5472 | 20 – б) | sin(x2) – 0.5 = 0 | [1 ; 2] | Ньютона | 1.618 | 21 – a) | tg (x/2) – ctg (x/2) + x = 0 | [ 1 ; 2 ] | половинного деления | 1.0769 | 21 – б) | х2 – 3 = 0 | [ 1 ; 2,5 ] | половинного деления | 1.75 | 22 –а) | 0.4 + arctg (x 1 / 2) – x = 0 | [ 1 ; 2 ] | итераций | 1.2388 | 22 – б) | z3-z-1.1=0 | [ 0 ; 2 ] | итераций | 0.5 | 23 – а) | (1 – x) 1 / 2 – cos ( (1 – x) 1 / 2 ) = 0 | [ 0 ; 1 ] | Ньютона | 0.4538 | 23 – б) | 3 * ln 2 (x) + 6 * ln (x) – 5 = 0 | [ 1 ; 3 ] | Ньютона | 1.8832 | 24 – а) | 0.6 * 3 x – 2.3 *x – 3 = 0 | [ 2 ; 3 ] | половинного деления | 2.4200 | 24 – б) | e x – e – x – 2 = 0 | [ 0 ; 4 ] | половинного деления | 0.8814 | 25 –а) | x 3 – x – 1 = 0 | [ 0 ; 2 ] | половинного деления | 1.1 | 25 –б) | sin(x)-x+0.15=0 | [ 0.5 ; 1 ] | половинного деления | 0.7 | 26 – а) | e x – e – x – 2 = 0 | [ 0 ; 4 ] | Ньютона | 0.8814 | 26 – б) | x * tg (x) – 1/3 = 0 | [ 0.2 ; 1 ] | Ньютона | 0.5472 | 27 – а) | x * ln ( x * x + 1 ) – 2 = 0 | [ 1 ; 2 ] | итераций | 1.52 | 27 –б) | 1.8 * x 4 – sin ( 10 * x ) = 0 | [ 0.2 ; 0.3 ] | итераций | 0.24 | 28 – а) | sin ( x ) – x + 0.15 = 0 | [ 0.5 ; 1 ] | половинного деления | 0.7 | 28 –б) | 3 * x – 14 + e x – e - x = 0 | [ 1 ; 3 ] | половинного деления | 2.0692 | 29 – а) | 2 * x * sin ( x ) – cos ( x ) = 0 | [ 0.4 ; 1 ] | Ньютона | 0.6593 | 29 –б) | x3 – x - 1.1 =0 | [ 0 ; 2 ] | Ньютона | 1.1 | 30 – а) | 1.8 * x 4 – sin ( 10 * x ) = 0 | [ 0.2 ; 0.3 ] | итераций | 0.24 | 30 –б) | x + cos (x 0.52 + 2) = 0 | [ 0.5 ; 1 ] | итераций | 0.9892 | Література 1. Г.И. Светозарова, Е.В. Сигитов, А.В. Козловский. Практикум по программированию на алгоритмических языках. Краткое теоретическое введение. – стр. 35. 2. С/С++. Программирование на языке высокого уровня / Т.А. Павловская. – СПб.: Питер, 2001. – 464 с.: ил. Додаток 1 Из кн. «С/С++. Программирование на языке высокого уровня / Т. А. Павловская. – СПб.: Питер, 2001. – 464 с.: ил.»: Указатели – с.51 … «Итак, указатели предназначены для хранения адресов областей памяти. В С++ различают три вида указателей – указатели на объект, на функцию и на void, отличающиеся свойствами и набором допустимых операций. Указатель не является самостоятельным типом, он всегда связан с каким-либо другим конкретным типом. Указатель на функцию содержит адрес в сегменте кода, по которому располагается исполняемый код функции, то есть адрес, по которому передается управление при вызове функции. Указатели на функции используются для косвенного вызова функции (не через ее имя, а через обращение к переменной, хранящей ее адрес), а также для передачи имени функции в другую функцию в качестве параметра. Указатель функции имеет тип «указатель функции, возвращающей значение заданного типа и имеющей аргументы заданного типа»: тип (*имя) ( список_типов_аргументов ); Например, объявление: int (*fun) (double, double); Указатель на void применяется в тех случаях, когда конкретный тип объекта, адрес которого требуется хранить, не определен (например, если в одной и той же переменной в разные моменты времени требуется хранить адреса объектов различных типов). Указателю на void можно присвоить значение указателя любого типа, а также сравнивать его с любыми указателями, но перед выполнением каких-либо действий с областью памяти, на которую он ссылается, требуется преобразовать его к конкретному типу явным образом. с.231: Операция приведения типов в стиле С может записываться в двух формах: тип (выражение) (тип) выражение Явное преобразование типа является источником возможных ошибок, поскольку вся ответственность за его результат возлагается на программиста. Поэтому в С++ введены операции, позволяющие выполнять частичный контроль выполняемых преобразований или сделать намерения программиста более явными для понимания: const_cast, dynamic_cast, reinterpret_cast, ststic_cast. с.80: |