ВСТУП
У даний момент існує багато програм для вирішення рівнянь, обчислення інтегралів і диференціалів: MathCAD, MATLAB, і т.д. Вони мають високу точність обчислення, високу функціональність, але мають і свої недоліки. Головні з них - складний незрозумілий інтерфейс, висока багатофункціональність недоступна рядовому користувачеві.Ринок потребує більш простих аналогах наведених вище програм. Створений програмний продукт здатний розв'язувати рівняння з однією змінною методом Ньютона (дотичних). Він простий в експлуатації, має інтуїтивно зрозумілий інтерфейс і здатний вибудовувати графік рівняння, що є дуже важливим для користувача.
Програма буде корисна всім, як студентам вищих навчальних закладів, так і школярам.
1. ПОСТАНОВКА ЗАВДАННЯ
Мета створення програмного продуктуГоловною метою роботи є розробка програми здатної розв'язувати рівняння з однією змінною методом Ньютона (дотичних), що повинно бути посібником для студентів вищих навчальних закладів і для учнів математичних класів середньоосвітніх шкіл в зниженні непотрібного навантаження, пов'язаної з численними масивами обчислень.
1.2. Постановка завдання
У даному програмному продукті необхідно реалізувати рішення двох видів рівнянь: y (x) = aЧln (bЧx), y (x) = ax2 + bx + c. Замість коефіцієнтів повинні використовуватися параметри a, b, c, які приймають значення, що вводяться користувачем. Для знаходження коренів, обов'язковим є зазначення проміжків, на яких визначена функція, тому користувач обов'язково вводить проміжки функції m, n. Метод Ньютона є ітераційним методом, отже, повинна вказуватися похибка обчислення ε. Обов'язковою є побудова графіка обраної функції на заданому проміжку.2. МАТЕМЕТІЧЕСКАЯ МОДЕЛЬ
Дисципліна "Чисельні методи" містить набір методів і алгоритмів наближеного (чисельного) вирішення різноманітних математичних завдань, для яких точне аналітичне рішення або не існує, або занадто складно для використання на практиці. При чисельному рішенні завдань завжди виникає похибка.Виділяють абсолютну і відносну похибку. Нехай р - точне значення шуканого відповіді, а p - наближене значення, отримане за допомогою чисельного методу.
Тоді
На першому етапі необхідно знайти відрізок [a, b], на якому функція має рівно один корінь. На другому етапі відбувається уточнення кореня на відрізку з заданою точністю за допомогою одного з чисельних методів.
Метод, що реалізовується в РУОП, називається методом Ньютона. Інша назва методу - метод дотичних.
Початкове умова:
Дано:
рівняння f (x) = 0,
де f (x) ÎC''[m, n], f (m) × f (n) <0,
f '(x) і f''(x) знакопостоянни на відрізку [m, n];
точність e.
Знайти: рішення рівняння з заданою точністю.
Нехай корінь
f (ξ) = 0 = f (xi + hi) ≈ f (xi) + f '(xi) × hi.
Звідси:
Закон отримання наближень до кореня:
Початкове наближення x0 вибирається з умови:
x |
f (x) |
m |
n |
Графічна ілюстрація методу наведена на малюнку 2.1. Початкова точка в цьому випадку збігається з n.
Малюнок 2.1. - Метод Ньютона
Ідея методу полягає в тому, що послідовність наближень до кореня будується шляхом проведення дотичних до графіка функції і знаходження їх точок перетину з віссю ОХ.
Алгоритм методу.
Крок 1. Знайти перше наближення до кореня x0 за формулою (2.2).
Крок 2. Знаходити такі наближення до кореня за формулою (2.1), поки не виконається умови закінчення:
| Xi-xi +1 | <e.
Остання знайдене наближення і буде коренем.
3. ОПИС І ОБГРУНТУВАННЯ ВИБОРУ МЕТОДУ РІШЕННЯ
Для обгрунтування вибору методу Ньютона для знаходження коренів рівнянь з однією змінною розглянемо два інші ітераційні методу.3.1. Метод половинного поділу
Інша назва методу - метод дихотомії.Дано:
рівняння f (x) = 0,
де f (x) ÎC [m, n], f (m) × f (n) <0;
точність e.
Знайти: рішення рівняння з заданою точністю.
Іншими словами, необхідно знайти нуль функції на відрізку з заданою точністю. При цьому функція неперервна і в кінцях відрізка приймає значення різних знаків.
Алгоритм методу:
Крок 1. Відрізок ділиться навпіл. Знаходиться крапка з: = (b + a) / 2 (див. рисунок 3.1).
f (x)
f (n)
0mkn
x
f (m)
Малюнок 3.1. - Метод половинного ділення
Крок 2. Перевіряються такі умови.
1. Якщо f (c) = 0 - корінь знайдений.
2. Якщо f (a) × f (c) <0 - корінь на [a, c], тому b: = c.
3. Якщо f (c) × f (b) <0 - корінь на [c, b], тому a: = c.
Крок 3. Перевіряється умова | ab | <ε. Якщо умова виконана, то вважається, що корінь знайдений. У цьому випадку він приймається рівним а (хоча можна прийняти його рівним b або навіть (a + b) / 2). Інакше перехід до кроку 1.
3.2. Метод ітерацій
Дано:рівняння f (x) = 0,
де f (x) ÎC '[m, n], f (m) × f (n) <0,
f '(x) знакопостоянна на відрізку [a, b];
точність e.
Знайти: рішення рівняння з заданою точністю.
Ідея методу полягає в тому, що від рівняння f (x) = 0 переходимо з допомогою рівносильних перетворень до рівняння виду x = φ (x). Т. е. завдання зводиться до знаходження абсциси ξ точки перетину двох графіків функції (див. рис.2). У загальному випадку φ (x) = xf (x) * C.
х |
у |
у = х |
у = j (х) |
ξ |
Малюнок 3.2. - Корінь рівняння
Точка ξ, для якої виконується ξ = φ (ξ), називається нерухомою точкою процесу ітерацій. Очевидно, що ця точка є коренем рівняння f (x) = 0.
Константа З підбирається таким чином, щоб функція φ (x) задовольняла умовам збіжності методу ітерацій:
1)
2) значення
3)
Якщо
Метод полягає в побудові послідовності наближень до кореня. В якості початкового наближення вибирається будь-яка точка x0Î [a, b]. Для визначеності можна брати середину відрізка [a, b]. Як формули отримання подальших наближень виступає сама φ (x):
Алгоритм методу:
Крок 1. Знайти перше наближення до кореня x0 як середину відрізка [m, n].
Крок 2. Знаходити такі наближення до кореня за формулою, поки не виконається умови закінчення:
| Xi - xi +1 | <e.
Остання знайдене наближення і буде коренем.
3.3. Обгрунтування вибору методу
При розгляді обох методів видно, що швидкість збіжності методу Ньютона (дотичних) вище швидкості збіжності методу січних (хорд) і методу ітерацій, отже, оптимальним для реалізації в програмі є метод Ньютона.
4. ОБГРУНТУВАННЯ ВИБОРУ МОВИ ПРОГРАМУВАННЯ
Реалізація поставленої задачі здійснюється на мові програмування Turbo Pascal 7.0.Система програмування Turbo Pascal, розроблена американською корпорацією Borland, залишається однією з найпопулярніших систем програмування в світі. Цьому сприяє простота що лежить в основі мови програмування Pascal, а також підтримка графічного і текстового режимів, що робить Turbo Pascal потужної сучасної професійної системою програмування.
5. ОПИС ПРОГРАМНОГО РЕАЛІЗАЦІЇ
5.1 Інформаційні потоки
Для наочності роботи програми, руху інформації і взаємодіють програмної частини з апаратною, розроблена схема інформаційних потоків (рисунок 5.1). Підказки при введенні даних |
Повідомлення про помилку введення |
Вхідні дані |
Введення проміжків |
Введення параметрів |
Введення похибки |
Блок виведення результатів на екран |
Вибір рівняння |
Блок обчислень |
Варіанти збереження результатів |
Значення кореня рівняння |
Варіанти продовження |
1 |
2 |
ПРОГРАМА
Малюнок 5.1 - Схема інформаційних потоків
Блок побудови графіка |
Блок допомоги та довідкової інформації |
Файл довідкової інформації |
Графік |
Допомога і довідкова інформація |
Блок виходу з програми |
1 |
2 |
Малюнок 5.1 - Схема інформаційних потоків (продовження)
Умовні позначення:
- Дані, ввіденіе яких можливе
як з файлів, розташованих на
жорсткому диску, так і з клавіатури;
-Дані, виведені на екран;
Дані, що вводяться з файлу.
5.2. Опис функціонування програми
При запуску програми на екрані з'являється титульний лист, що відображає інформацію про студента; далі завантажується меню програми, що складається з п'яти пунктів: ЗАСТАВКА |
Довідка |
y (x) = a * ln (b * x) |
y (x) = a * x ^ 2 + b * x + c |
Побудова графіка |
Вхід |
Малюнок 5.2 - Схема функціонування програми
- Довідка
- Y (x) = a * ln (b * x)
- Y (x) = a * x ^ 2 + b * x + c
- Побудова графіка
- Вихід
Пункт "Довідка" включає в себе інформацію про метод Ньютона. Пункти "y (x) = a * ln (b * x)" і "y (x) = a * x ^ 2 + b * x + c" є рішеннями рівнянь, де задаються проміжки m і n, параметри a, b (, c), похибка E і виконується збереження у файли. Пункт "Побудова графіка" будує графік обраного рівняння в залежності від введених параметрів і проміжків. Пункт "Вихід" - вихід з програми. Схема функціонування представлена на малюнку 5.2.
5.3. Опис процедур і функцій програми
Procedure title () - виводить титульну сторінку на екран монітора;Procedure graphica () - ініціалізує графіком.
Procedure pro () - містить в собі змінну р, яка відповідає за кімнату виділеної кнопки, передається як параметр у procedure key (p) і в procedure eat (p, bool), а також містить у собі змінну bool, що відповідає за цикл у рамках procedure pro, передається як параметр у procedure eat (p2, bool);
Procedure eat (p2: byte; var bool: boolean) - в залежності від параметра p2 виконує один з п'яти варіантів подальших дій програми. Змінна bool передається як параметр назад в procedure pro;
Procedure key (p1: byte) - вибудовує графічну картинку меню в залежності від параметра р1;
Procedure equation_1 () - рішення рівняння виду y (x) = aЧln (bЧx). Змінна Е (похибка) приймається як параметр з procedure load_file_3 (E), передає змінну Е як параметр у procedure save_file (E);
Procedure equation_2 () - рішення рівняння виду y (x) = aЧx2 + bЧx + c. Змінна Е (похибка) приймається як параметр з procedure load_file_3 (E), мінлива Е передається як параметр у procedure save_file (E);
Procedure load_file_1 () - завантажує змінні m і n (проміжки функції) з файлу, чи для якої їх введення з клавіатури, в залежності від бажання користувача. m, n - глобальні змінні в рамках програми;
Procedure load_file_2 () - завантажує змінні a і b або a, b, c (залежно від виду функції) (коефіцієнти рівняння) з файлу, чи для якої їх введення з клавіатури, в залежності від бажання користувача. a, b, c - глобальні змінні в рамках програми;
Procedure load_file_3 (var E: real) - завантажує змінну Е (похибка функції) з файлу, чи для якої їх введення з клавіатури, в залежності від бажання користувача. Е передається як параметр і приймається як змінна в procedure equation_1 і equation_2;
Procedure save_file (E: real) - зберігає змінні a, b, (c,) m, n - глобальні в рамках програми в файли або не зберігає, зберігає змінну Е у вигляді параметра в файл, або не зберігає;
Procedure groffunc () - вибудовує графік за значеннями глобальних в рамках програми змінних a, b, (c,) m, n, із зазначеними на осі х наближеннями і коренем рівняння. Містить у собі function f (x: real): real, вираховують значення однієї з функцій у залежності від аргументу х. Змінні у0 (масштаб) і у2 (максимальне значення функції) передаються у вигляді параметрів в procedure setka (y0, y2);
Procedure setka (yn: integer; y2: real) - вибудовує координатну сітку і оцифровку осей x і y в залежності від глобальних в рамках програми змінних m, n і параметрів yn і y2;
Procedure help () - надає користувачеві безпосередню методологічну допомогу.
5.4. Схема взаємодії процедур програми
Для наочності роботи підпрограм програми необхідно зобразити у вигляді схеми їх взаємодія між собою. Взаємодія підпрограм зображено на малюнку 5.3. procedure pro; |
procedure eat (p2: integer; var bool: boolean); |
procedure help; |
procedure equation_1; |
procedure equation_2; |
procedure groffunc; |
procedure key; |
Procedure save_file (E: real); |
load_file_1; |
load_file_2; |
load_file_3 (var E: real); |
procedure setka (yn: integer; y2: real);; |
procedure title; |
procedure graphica; |
Малюнок 5.3 - Взаємодія процедур програми
Умовні позначення:
- Запуск процедури на яку вказує стрілка, з процедури з якої вона походить.
5.5. Перелік позначень
5.5.1 Позначення даних, що вводяться
m, n - проміжки функції;a, b, c - коефіцієнти рівняння, представлені у вигляді параметрів;
E - похибка, аналог ε в розділі "Описі математичної моделі" і в розділі "Опис (і обгрунтування вибору) методу розв'язання".
5.5.2 Позначення виведених даних
y (x) = a * ln (b * x), y (x) = a * x ^ 2 + b * x + c - рівняння використовуються в програмі;
x - невідома, корінь рівняння;
ln - логарифм;
x ^ 2 - невідома x в степені 2.
5.6 Вхідні і вихідні дані
5.6.1 Вхідні дані
y (x) = a * ln (b * x), y (x) = a * x ^ 2 + b * x + c - функція;
m, n: real - лівий і правий проміжки функції відповідно;
a, b, c: real - параметри, коефіцієнти рівняння;
E: real - похибка;
"Допомога і довідкова інформація".
5.6.2 Вихідні дані
x1: real - значення кореня рівняння;
st: string - текстові повідомлення, що виникають в процесі виконання програми (помилки і варіанти подальшого продовження).
5.6.3 Проміжні дані
Bool_of: Boolean - визначає цикл виконання алгоритму рішення;
mass: real - масив [1. . 20];
number: byte - глобальна змінна, номер функції;
code_of: byte - змінна, що відповідає за необхідність пошуку кореня рівняння;
root: real - різниця наближень.
5.7. Алгоритм розв'язання задачі
5.7.1. Алгоритм знаходження кореня рівняння y (x) = aЧln (bЧx)
Алгоритм рішення рівняння виду y (x) = aЧln (bЧx) наводиться на малюнку 5.4.виконувати
введення поки ((m <= n) і (((m <0) і (n <0)) або ((m> 0) і (n> 0 )))); |
m, n; |
введення поки (b * m> 0); |
a, b; |
якщо (a = 0) то
введення поки (E> 0); |
Всі х на проміжку - корені рівняння; |
E; |
2 |
1 |
number: = 0;
інакше
виконувати
i: = 1; якщо (a * ln (b * m) * (-a/sqr (m)))> 0 то
mass [i]: = m;
code_of: = 1;
інакше
Малюнок 5.4 - Алгоритм рішення рівняння виду y (x) = aЧln (bЧx)
2 |
1 |
Рівняння не має коренів; |
Рівняння не має коренів; |
x1; |
якщо (a * ln (b * n) * (-a/sqr (n)))> 0 то
mass [i]: = n;
code_of: = 1;
інакше
висновок
number: = 0; code_of: = 0;
якщо (code_of = 1) те
виконувати
x1: = mass [i]-a * ln (b * mass [i]) /
(A / mass [i]);
root: = Abs (x1-mass [i]);
i: = i +1;
mass [i]: = x1;
поки (root <E);
якщо (x1 <m) або (x1> n) то
висновок
number: = 0; code_of: = 0;
висновок
Малюнок 5.4 - Алгоритм рішення рівняння виду y (x) = aЧln (bЧx) (продовження)
5.7.2. Алгоритм знаходження кореня рівняння y (x) = aЧx2 + bЧx + c
Алгоритм рішення рівняння виду y (x) = aЧx2 + bЧx + c наводиться на малюнку 5.5.
виконувати
введення поки (m <= n); |
введення поки (E> 0); |
Всі х на проміжку - корені рівняння; |
a, b, c; |
m, n; |
E; |
2 |
1 |
введення
якщо (a = 0) і (b = 0) і (c = 0) то
висновок
number: = 0;
інакше
виконувати
i: = 1;
якщо (a * sqr (m) + b * m + c) * (2 * a)> = 0 то
mass [i]: = m;
code_of: = 1;
інакше
Малюнок 5.5 - Алгоритм рішення рівняння виду y (x) = aЧx2 + bЧx + c
2 |
1 |
Рівняння не має коренів; |
Рівняння не має коренів; |
x1; |
якщо (a * sqr (n) + b * n + c) * (2 * a)> = 0 то
mass [i]: = n;
code_of: = 1;
інакше
висновок
number: = 0; code_of: = 0;
якщо (code_of = 1) те
виконувати
x1: = mass [i] - ((a * sqr (mass [i]) +
b * mass [i] + c) / (2 * a * mass [i] + b));
root: = Abs (x1-mass [i]);
i: = i +1;
mass [i]: = x1;
поки (root <E);
якщо (x1 <m) або (x1> n) то
висновок
number: = 0; code_of: = 0;
висновок
Малюнок 5.5 - Алгоритм рішення рівняння виду y (x) = aЧx2 + bЧx + c (продовження)
Алгоритми рішення рівнянь ріс.5.4 і рис.5.5 відповідають procedure equation_1 і procedure equation_2 в програмі відповідно.
6. КОМПЛЕКТАЦІЯ І ЗАВАНТАЖЕННЯ ПРОГРАМИ
6.1. Комплектація
Папка my_stuff, в якій міститься:- RUOP. exe - основний файл програми;
- Help. asc - файл з методологічною інформацією;
- M_n. txt - файл, що містить значення проміжків m і n;
- A_b_c. txt - файл, що містить значення параметрів a, b, c;
- E. txt - файл, що містить значення похибки E;
- Egavga. bgi - файл для роботи з графікою;
- Keyrus. com - файл для роботи з російською мовою;
- Trip. chr - файл, що містить російський шрифт.
6.2. Порядок інсталяції і запуск програми
Потрібно скопіювати папку my_stuff з містяться в ній файлами в папку "c: \ temp \". Для запуску програми необхідно запустити файл RUOP. exe, розташований в папці my_stuff.При копіюванні програми в іншу папку, неможливими стають робота "Довідки" завантаження і автоматичне збереження інформації у файли.
7. ТЕСТОВІ ПРИКЛАДИ
Тестові приклади необхідні користувачу для того, щоб довідатися про можливості, які надає даний програмний продукт або протестувати його на правильність рішення рівнянь.Тестові приклади для вирішення рівняння виду y (x) = a * ln (b * x) наводяться в таблиці 6.1.
Таблиця 7.1. Тестові приклади для рівняння виду y (x) = a * ln (b * x)
m | n | a | b | E | Результат |
1 | 10 | 1 | 0.5 | 0.01 | 2 |
-20 | -0.01 | 9 | -2 | 0.01 | -0.2 |
9 | 14 | 100 | 1 | 0.01 | Рівняння не має коренів |
Таблиця 7.2. Тестові приклади для рівняння виду y (x) = a * x ^ 2 + b * x + c
m | n | a | b | c | E | Результат |
-10 | 10 | 5 | 29 | 3 | 0.01 | -0.1054 |
-10 | 10 | 0 | 4 | 10 | 0.01 | -2.5 |
5 | 20 | 5 | 29 | 4 | 0.01 | Рівняння не має |
Якщо рівняння не має коренів, то побудова графіка і збереження даних, результатів стає неможливим.
При введенні в програму даних, що відповідають вимогам, будуть з'являтися супровідні повідомлення (ради) щодо подальших варіантів продовження.
Якщо рівняння має корінь, то побудова графіка і збереження даних, результатів стає можливим.
ВИСНОВКИ
У процесі створення була написана програма, що здійснює рішення рівняння з однією змінною методом Ньютона (дотичних). Програма здатна вирішувати два види рівнянь, а також вибудовувати графік по вводиться даними.У програмі реалізована робота з графікою і з файлами, має інтуїтивно зрозумілий інтерфейс, реалізована можливість довідки.
Коректна робота програми забезпечується строгою відповідністю методичних вказівок, а також надійною системою перевірки проміжних результатів у ході виконання самої програми.
Однак відчутними недоліками є розрахунок результатів за все для двох функцій і відсутність дотичних до графіку при побудові графіка функції, усунення яких планується найближчим часом.
У цілому вийшов програмний продукт є відмінним посібником для студентів вищих навчальних закладів і для учнів математичних класів середньоосвітніх шкіл.
ПЕРЕЛІК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ
1. Фаронов В.В. "Turbo Pascal 7.0. Початковий курс": навчальний посібник. - М.: КНОРУС, 2006. - 576 с.2. Сухарєв М. Turbo Pascal 7.0. Теорія й практика програмування. - СПб: "Наука і техніка", 2003. - 576 с.
3. Методичні вказівки з оформлення студентських робіт для студентів спеціальностей 080403 "Програмне забезпечення автоматизованих систем", 080404 "Інтелектуальні системи прийняття рішень", 050103 "Економічна кібернетика"; Затверджено на засіданні вченої ради ДонДІШІ протокол № 7 від 23.02. 2004 р. - Донецьк: ДонДІШІ, 2004, 46 с.
Додаток А
ТЕХНІЧНЕ ЗАВДАННЯА.1 Загальні відомості
Повна назва програмного продукту: "Чисельні методи. Рішення рівнянь з однією змінною методом Ньютона (дотичних)". Її умовне позначення РУОП. Робота виконується студентом 1-го курсу Донецького державного інституту штучного інтелекту (ДонДІШІ), факультету СКІТ, групи СУА-05, Ніколаєвим Олексієм Сергійовичем.
Підставою для розробки РУОП є завдання, видане кафедрою Програмного забезпечення інтелектуальних систем (поїсом).
Плановий термін початку роботи: 17 лютого 2006 року.
Дата захисту роботи: 22 травня 2006 року.
А.2 Призначення та мета створення програми
Дана програма створена як навчальний посібник для студентів вищих навчальних закладів і для учнів математичних класів середньоосвітніх шкіл. Дозволяє вирішувати рівняння виду y (x) = aЧln (bЧx) і y (x) = ax2 + bx + c методом Ньютона (дотичних).
А.3 Вимоги до програмного продукту
А.3.1. Загальні вимоги
Програма повинна виконувати наступні вимоги:
1) вирішувати два види рівнянь: y (x) = aЧln (bЧx) і y (x) = ax2 + bx + c методом Ньютона (дотичних);
2) підтримку графічного меню, що складається з п'яти пунктів:
- Допомога і довідкова інформація;
- Y (x) = aЧln (bЧx);
- Y (x) = aЧx ^ 2 + bЧx + c;
- Побудова графіка;
- Вихід;
3) за вводиться значенням проміжків рівняння і за що вводиться значенням коефіцієнтів рівняння:
- Обчислювати корінь рівняння в залежності від вводяться даних;
- Вибудовувати графік рівняння, відзначаючи, на осі абсцис, проміжні корені рівняння, виводити значення кореня рівняння.
А.3.2. Функціональні вимоги
Для реалізації програмного продукту необхідно розробити:
1) підтримку файлів, надання можливості вирішувати користувачеві самому, вводити початкові дані з файлу або з клавіатури, необхідність збереження даних і отриманих результатів у файли;
2) систему довідкової інформації з реалізується в РУОП методом Ньютона.
А.3.2. Вимоги до технічного забезпечення
Рекомендовані характеристики апаратних засобів:
- КПУ: i486;
- ОЗУ: 4 мб;
- Відеоадаптер VGA, EGA;
- Монітор: VGA, EGA;
- Клавіатура;
- Вільний дисковий простір - близько 100 кілобайт.
А.3.3. Вимоги до програмного забезпечення
Для успішного завантаження програми потрібна наявність операційної системи MS DOS 6.0.
А.3.5. Вимоги до організаційного забезпечення
Організаційне забезпечення включає в себе пояснювальну записку з додатками: технічне завдання, керівництво користувача, екранні форми, тексти програми.
Додаток Б
КЕРІВНИЦТВО КОРИСТУВАЧАГоловне меню з'являється після титульного аркуша. Меню складається з п'яти пунктів. Скролінг здійснюється клавішами "z" і "x". Вхід в підменю здійснюється клавішею "Enter".
У пункті "Довідка" міститься методологічна інформація за методом Ньютона.
У пункті "y (x) = a * ln (b * x)" здійснюється рішення рівняння y (x) = a * ln (b * x) за вводиться параметрами, проміжкам і похибки. У пункті здійснюється завантаження даних з файлів і збереження даних у файли за бажанням користувача.
У пункті "y (x) = a * x ^ 2 + b * x + c" здійснюється рішення рівняння y (x) = a * x ^ 2 + b * x + c по вводиться параметрами, проміжкам і похибки. У пункті здійснюється завантаження даних з файлів і збереження даних у файли за бажанням користувача.
У пункті "Побудова графіка" здійснюється побудова графіка по вводиться в рівняння даними.
У пункті "Вихід" здійснює вихід з програми.
Додаток В
ЕКРАННІ ФОРМИРисунок В.1 - Заставка, титульна сторінка
Рисунок В.2 - Меню
Малюнок В.3 - Загальний вигляд вікна "y (x) = a * ln (b * x)"
Рисунок В.4 - Загальний вигляд вікна "y (x) = a * x ^ 2 + b * x + c"
Рисунок В.5 - Графік функції y (x) = 1 * ln (0.5 * x) на проміжку [1; 10]
Малюнок В.6 - Графік функції y (x) = 5 * sqr (x) +29 * x +3 на проміжку [-10; 10]
Додаток Г
Лістинг програмprogram Restorant;
uses CRT, Graph;
var a, b, c, m, n: real;
number, i: byte;
mass: array [1. . 20] of real;
{************************************************* **************************}
procedure title;
begin
textcolor (2);
writeln ('Міністерство освіти України ");
writeln ('Донецький державний інститут штучного інтелекту');
writeln;
writeln ('Кафедра поїсом');
writeln;
writeln;
writeln ('Курсова робота');
writeln ('За курсом "АЯ та П"');
writeln ('На тему: "Рішення нелінійних рівнянь методом Ньютона');
writeln ('(методом січних) "');
writeln;
writeln;
writeln ('Виконав:');
writeln ('Студент групи СУА-05');
writeln ('Миколаїв А.С.');
writeln ('Перевірив:');
writeln ('cт. преп. кафедри поїсом');
writeln ('Бичкова Є.В.');
writeln ('ас. кафедри поїсом');
writeln ('Волченко EB');
writeln;
writeln ('2005');
writeln;
writeln;
textcolor (red);
writeln ('Натисніть "Введення" для продовження "');
textcolor (lightgray); Readln;
end;
{************************************************* **************************}
procedure pro; FORWARD;
{************************************************* **************************}
procedure graphica;
var d, r, e: integer;
begin
d: = detect;
InitGraph (d, r,'');
e: = GraphResult;
if e <> grOK then WriteLn (GraphErrorMsg (e)) else pro;
end;
{************************************************* **************************}
procedure setka (yn: integer; y2: real);
var x, y, cross, dcross: integer;
lx, ly, dlx, dly: real;
st: string;
begin
If abs (m) <abs (n) then
dlx: = Abs (n/6.25) else dlx: = Abs (m/6.25);
dly: = y2 / ((yn-110) / 40);
dcross: = 0;
lx: = 6 * dlx;
SetColor (LightGray);
For cross: = 1 to 7 do
begin
Str (lx: 0: 1, st);
If lx> = 0 then
OutTextXY (535-dcross, yn +7, st) else
OutTextXY (525-dcross, yn +7, st);
lx: = lx-2 * dlx;
dcross: = dcross +80;
end;
x: = 80;
Repeat
SetLineStyle (DottedLn, 0, NormWidth);
Line (x, yn-3, x, 110); Line (x, yn +3, x, 360);
SetLineStyle (SolidLn, 0, NormWidth);
Line (x, yn-3, x, yn +3);
x: = x +40;
Until x = 600;
ly: = 0;
y: = yn;
Repeat
If ly> 0 then
begin
Line (317, y, 323, y);
Str (ly: 0: 1, st);
OutTextXY (295, y +7, st);
end;
ly: = ly + dly;
SetLineStyle (DottedLn, 0, NormWidth);
Line (323, y, 570, y); Line (70, y, 317, y);
SetLineStyle (SolidLn, 0, NormWidth);
y: = y-40;
Until (y <110);
ly: = 0;
y: = yn;
Repeat
If ly <0 then
begin
Line (317, y, 323, y);
Str (ly: 0: 1, st);
OutTextXY (285, y +7, st);
end;
ly: = ly-dly;
SetLineStyle (DottedLn, 0, NormWidth);
Line (323, y, 570, y); Line (70, y, 317, y);
SetLineStyle (SolidLn, 0, NormWidth);
y: = y +40;
Until (y> 360);
end;
{************************************************* **************************}
{************************************************* **************************}
procedure groffunc;
var l, y0: integer;
y1, y2, x, y, mx, my: real;
gr, grand: string;
{************************************************* **************************}
function f (x: real): real;
begin
Case number of
1: f: = a * ln (b * x);
2: f: = a * sqr (x) + b * x + c;
end;
end;
{************************************************* **************************}
begin
If number = 0 then OutTextXY (300, 20, 'Введіть спочатку дані в рівняння!') Else
begin
ClearDevice;
SetBKColor (black);
case number of
1: grand: = ('y (x) =* ln (* x)');
2: begin grand: = ('y (x) =* sqr (x) + * x +');
str (c: 0: 2, gr); insert (gr, grand, 17); end;
end;
str (b: 0: 2, gr); insert (gr, grand, (6 + number * 4));
str (a: 0: 2, gr); insert (gr, grand, 6);
OutTextXY (300, 40, grand);
y1: = 0; y2: = 0;
x: = m;
Repeat
y: = f (x);
if y <y1 then y1: = y;
if y> y2 then y2: = y;
x: = x +0.01;
Until (x> = n);
my: = 250/abs (y2-y1);
If (abs (m)> abs (n)) then mx: = 250/abs (m) else
mx: = 250/abs (n);
y0: = 360-abs (Round (y1 * my));
setka (y0, y2);
SetColor (blue);
Line (320, 360, 320, 90);
Line (70, y0, 590, y0);
Line (320, 90, 317, 93); Line (320, 90, 323, 93);
Line (590, y0, 587, y0-3); Line (590, y0, 587, y0 +3);
OutTextXY (595, y0-5, 'x'); OutTextXY (315, 80, 'y');
OutTextXY (400, 450, 'Натисніть "Введення" для виходу ");
If Abs (m)> Abs (n) then y1: = Abs (m) else y1: = Abs (n);
SetColor (Red);
str (mass [i]: 5: 4, grand);
OutTextXY (300 + Round ((250/y1) * mass [i]), 400, grand);
Line (320 + Round ((250/y1) * mass [i]), y0, 320 + Round ((250/y1) * mass [i]), 390);
For l: = 1 to i-1 do
begin
SetColor (2 + l);
Line (320 + Round ((250/y1) * mass [l]), y0 +10, 320 + Round ((250/y1) * mass [l]), y0-10);
end;
x: = m;
Repeat
y: = f (x);
PutPixel (320 + Round (x * mx), y0-Round (y * my), 15);
x: = x +0.01;
Until (x> = n);
ReadLn;
pro;
end;
end;
{************************************************* **************************}
{************************************************* **************************}
procedure load_file_1;
var mistake: byte;
k: char;
st: string;
f: text;
begin
Repeat
If number = 1 then
WriteLn ('Введіть проміжки [m, n] одного знаку') else
WriteLn ('Введіть проміжки [m, n]');
WriteLn ('Натисніть "1" для введення даних з клавіатури');
WriteLn ('Натисніть "2" для введення даних з файлу');
k: = ReadKey;
Case k of
'1 ': Begin
WriteLn ('Введення:');
{$ I-}
ReadLn (m, n);
{$ I +}
mistake: = IOResult;
If mistake <> 0 then WriteLn ('Помилка введення');
end;
'2 ': Begin
WriteLn ('Натисніть "1" для вказівки розташування свого файлу');
WriteLn ('Натисніть "2" для введення з файлу, створеного автоматично');
k: = ReadKey;
If k = '1 'then begin
WriteLn ('Введіть шлях до файлу з розширенням. Txt');
ReadLn (st);
Assign (f, st);
end else
If k = '2 'then assign (f,' c: \ temp \ my_stuff \ m_n. Txt ');
{$ I-}
Reset (f);
{$ I +}
mistake: = IOResult;
If mistake <> 0 then
WriteLn ('Немає файлу не існує') else
begin
{$ I-}
Read (f, m, n);
{$ I +}
mistake: = IOResult; Close (f); If mistake <> 0 then
WriteLn ('Інформація у файлі не відповідає потрібному типу') else
begin
WriteLn (m: 0: 2);
WriteLn (n: 0: 2);
end;
end; WriteLn ('Натисніть "Введення для продовження"'); ReadLn;
end;
end;
Until mistake = 0;
end;
{************************************************* **************************}
procedure load_file_2;
var mistake: byte;
k: char;
st: string;
f: text;
begin
Repeat
WriteLn ('Натисніть "1" для введення з клавіатури');
WriteLn ('Натисніть "2" для введення даних з файлу');
k: = ReadKey;
Case k of
'1 ': Begin
WriteLn ('Введення:');
If number = 1 then {$ I-} ReadLn (a, b) {$ I +} else
If number = 2 then {$ I-} ReadLn (a, b, c) {$ I-};
mistake: = IOResult;
If mistake <> 0 then WriteLn ('Помилка введення');
end;
'2 ': Begin
WriteLn ('Натисніть "1" для вказівки розташування свого файлу');
WriteLn ('Натисніть "2" для введення з файлу, створеного автоматично');
k: = ReadKey;
If k = '1 'then begin
WriteLn ('Введіть шлях до файлу розширенням. Txt');
ReadLn (st);
assign (f, st);
end else
If k = '2 'then assign (f,' c: \ temp \ my_stuff \ a_b_c. Txt ');
{$ I-}
Reset (f);
{$ I +}
mistake: = IOResult;
If mistake <> 0 then
WriteLn ('Немає файлу не існує') else
begin
If number = 1 then {$ I-} Read (f, a, b) {$ I +} else
{$ I-} Read (f, a, b, c); {$ I +}
mistake: = IOResult; Close (f); If mistake <> 0 then
WriteLn ('Інформація у файлі не відповідає потрібному типу') else
begin
WriteLn (a: 0: 2);
WriteLn (b: 0: 2);
If number = 2 then WriteLn (c: 0: 2);
end;
end; WriteLn ('Натисніть "Введення для продовження"'); ReadLn;
end;
end;
Until mistake = 0;
end;
{************************************************* **************************}
procedure load_file_3 (var E: real);
var mistake: byte;
k: char;
st: string;
f: text;
begin
Repeat
WriteLn ('Натисніть "1" для введення даних з клавіатури');
WriteLn ('Натисніть "2" для введення даних з файлу');
k: = ReadKey;
Case k of
'1 ': Begin
WriteLn ('Введення:');
{$ I-}
ReadLn (E);
{$ I +}
mistake: = IOResult;
If mistake <> 0 then WriteLn ('Помилка введення');
end;
'2 ': Begin
WriteLn ('Натисніть "1" для вказівки розташування свого файлу');
WriteLn ('Натисніть "2" для введення з файлу, створеного автоматично');
k: = ReadKey;
If k = '1 'then begin
WriteLn ('Введіть шлях до файлу з розширенням. Txt');
ReadLn (st);
assign (f, st);
end else
If k = '2 'then assign (f,' c: \ temp \ my_stuff \ E. txt ');
{$ I-}
Reset (f);
{$ I +}
mistake: = IOResult;
If mistake <> 0 then
WriteLn ('Немає файлу не існує') else
begin
{$ I-}
Read (f, E);
{$ I +}
mistake: = IOResult; Close (f); If mistake <> 0 then
WriteLn ('Інформація у файлі не відповідає потрібному типу') else
begin
WriteLn (E: 0: 3);
end;
end; WriteLn ('Натисніть "Введення для продовження"'); ReadLn;
end;
end;
Until mistake = 0;
end;
{************************************************* **************************}
procedure save_file (E: real);
var k: char;
mistake: byte;
f: text;
st: string;
begin
Repeat
WriteLn ('Якщо хочете зберегти дані та результати натисніть "1"');
WriteLn ('Якщо не хочете зберігати дані та результати натисніть "2"');
k: = ReadKey;
Case k of
'1 ': Begin
WriteLn ('Якщо хочете зберегти дані в зазначені вами файли натисніть "1"');
WriteLn ('Якщо хочете, щоб збереження відбулося автоматично натисніть "2"');
k: = ReadKey;
If k = '1 'then begin
Repeat
WriteLn ('Введіть шлях та ім'я файлу c для збереження проміжків [m, n]');
ReadLn (st);
Assign (f, st);
{$ I-}
ReWrite (f);
{$ I +}
mistake: = IOResult;
If mistake <> 0 then WriteLn ('Файл не може бути створений') else
begin
Write (f, m: 3, n: 3); Close (f); WriteLn ('Інформація збережена. Натисніть "Введення"'); ReadLn;
end;
Until mistake = 0;
Repeat
If number = 1 then
WriteLn ('Введіть шлях та ім'я файлу для збереження коефіцієнтів "a", "b"')
else
If number = 2 then
WriteLn ('Введіть шлях та ім'я файлу для збереження коефіцієнтів "a", "b", "c"');
ReadLn (st);
Assign (f, st);
{$ I-}
ReWrite (f);
{$ I +}
mistake: = IOResult;
If mistake <> 0 then WriteLn ('Файл не може бути створений') else
begin
If number = 1 then begin
Write (f, a: 3, b: 3); Close (f); WriteLn ('Інформація збережена. Натисніть "Введення"'); ReadLn;
end else
If number = 2 then begin
Write (f, a: 3, b: 3, c: 3); Close (f); WriteLn ('Інформація збережена. Натисніть "Введення"'); ReadLn;
end;
end;
Until mistake = 0;
Repeat
WriteLn ('Введіть шлях та ім'я файлу для збереження похибки "Е"');
ReadLn (st);
Assign (f, st);
{$ I-}
ReWrite (f);
{$ I +}
mistake: = IOResult;
If mistake <> 0 then WriteLn ('Файл не може бути створений') else
begin
Write (f, E: 3); Close (f); WriteLn ('Інформація збережена. Натисніть "Введення"'); ReadLn;
end;
Until mistake = 0;
Repeat
WriteLn ('Введіть шлях та ім'я файлу для збереження кореня');
ReadLn (st);
Assign (f, st);
{$ I-}
ReWrite (f);
{$ I +}
mistake: = IOResult;
If mistake <> 0 then WriteLn ('Файл не може бути створений') else
begin
Write (f, mass [i]: 3); Close (f); WriteLn ('Інформація збережена. Натисніть "Введення"'); ReadLn;
end;
Until mistake = 0;
end else
If k = '2 'then begin
Assign (f, 'c: \ temp \ my_stuff \ m_n. Txt');
{$ I-} ReWrite (f); {$ I +}
mistake: = IOResult;
If mistake <> 0 then WriteLn ('Каталога для збереження не існує') else
begin
Write (f, m, n); Close (f);
Assign (f, 'c: \ temp \ my_stuff \ a_b_c. Txt');
ReWrite (f); If number = 1 then Write (f, a, b) else
Write (f, a, b, c); Close (f);
Assign (f, 'c: \ temp \ my_stuff \ E. txt');
ReWrite (f); Write (f, E); Close (f);
Assign (f, 'c: \ temp \ my_stuff \ x. txt');
ReWrite (f); Write (f, mass [i]); Close (f);
WriteLn ('Інформація збережена. Натисніть "Введення"'); ReadLn;
end;
end;
end;
'2 ': Mistake: = 0;
end;
Until mistake = 0;
end;
{************************************************* **************************}
{************************************************* **************************}
procedure equation_1;
var mistake, code_of: byte;
E, x1, root: real;
bool_of: boolean;
k: char;
{************************************************* **************************}
begin
closegraph;
bool_of: = false;
Repeat
number: = 1;
clrscr;
WriteLn ('Рівняння виду: y (x) = a * ln (b * x)');
Repeat
load_file_1;
If m> n then begin
WriteLn ('Введіть "m" <"n"');
WriteLn ('Натисніть "Введення" для подолженія'); ReadLn;
end else
If (m <0) and (n> 0) or (m = 0) or (n = 0) then
begin
WriteLn ('"m" і "n" повинні бути одного знака і нерівні 0');
WriteLn ('Натисніть "Введення" для продовження'); ReadLn;
end;
Until (((m <0) and (n <0)) or ((m> 0) and (n> 0))) and (m <= n);
Repeat
WriteLn ('Введіть коефіцієнти рівняння "a", "b"');
load_file_2;
If m * b <= 0 then begin
WriteLn ('спробуйте "b" іншого знака і нерівне 0');
WriteLn ('Натисніть "Введення" для продовження'); ReadLn;
end;
Until m * b> 0;
If a = 0 then begin
WriteLn ('Все "x" на проміжку [', m: 0: 1, ';', n: 0: 1, '] - рішення рівняння');
number: = 0; end else
begin
Repeat
WriteLn ('Введіть похибка "E"');
load_file_3 (E);
If E <= 0 then begin WriteLn ('Введіть "Е" більше 0');
WriteLn ('Натисніть "Введення" для продовження "');
end;
Until E> 0;
i: = 1;
If (a * ln (b * m) * (-a/sqr (m)))> 0 then begin mass [i]: = m; code_of: = 1 end else
If (a * ln (b * n) * (-a/sqr (n)))> 0 then begin mass [i]: = n; code_of: = 1 end else
begin WriteLn ('Рівняння не має коренів'); number: = 0; code_of: = 0; end;
If code_of = 1 then
begin
Repeat
x1: = mass [i]-a * ln (b * mass [i]) / (a / mass [i]);
root: = Abs (x1-mass [i]);
i: = i +1;
mass [i]: = x1;
Until root <E;
If (x1 <m) or (x1> n) then
begin WriteLn ('Рівняння не має коренів'); number: = 0; code_of: = 0; end else
WriteLn ('Коренем рівняння y (x) =', a: 0: 1, '* ln (', b: 0: 1, '* x) є:', x1: 5: 4);
end;
end;
WriteLn ('Натисніть "Введення"'); ReadLn; If code_of = 1 then save_file (E) else
WriteLn ('Так як рівняння не має коренів, то збереження не виконується');
WriteLn ('Якщо хочете вийти, то натисніть "ESC"');
WriteLn ('Якщо хочете ввести інші дані, то натисніть "Введення"');
k: = ReadKey;
code_of: = ord (k);
case code_of of
27: begin
bool_of: = true; graphica;
end;
13: bool_of: = false;
end;
Until bool_of;
end;
{************************************************* **************************}
{************************************************* **************************}
procedure equation_2;
var mistake, code_of: byte;
E, x1, root: real;
bool_of: boolean;
k: char;
{************************************************* **************************}
begin
closegraph;
bool_of: = false;
Repeat
number: = 2;
clrscr;
WriteLn ('Рівняння виду: y (x) = a * x ^ 2 + b * x + c');
Repeat
load_file_1;
If m> n then WriteLn ('Введіть "m" <"n"');
Until (m <= n);
WriteLn ('Введіть коефіцієнти рівняння "a", "b", "c"');
load_file_2;
If (a = 0) and (b = 0) and (c = 0) then begin
WriteLn ('Все "х" на проміжку [', m: 0: 1, ';', n: 0: 1, '] - рішення рівняння');
number: = 0; end else
begin
Repeat
WriteLn ('Введіть похибка "Е"');
load_file_3 (E);
If E <= 0 then begin WriteLn ('Введіть E> 0');
WriteLn ('Натисніть "Введення" для продовження');
end;
Until E> 0;
i: = 1;
If (a * sqr (n) + b * n + c) * (2 * a)> = 0 then begin mass [i]: = n; code_of: = 1 end else
If (a * sqr (m) + b * m + c) * (2 * a)> = 0 then begin mass [i]: = m; code_of: = 1 end else
begin WriteLn ('Рівняння не має коренів'); number: = 0; code_of: = 0; end;
If code_of = 1 then
begin
Repeat
x1: = mass [i] - ((a * sqr (mass [i]) + b * mass [i] + c) / (2 * a * mass [i] + b));
root: = Abs (x1-mass [i]);
i: = i +1;
mass [i]: = x1;
Until (root <E);
If (x1 <m) or (x1> n) then
begin WriteLn ('Рівняння не має коренів'); number: = 0; code_of: = 0; end else
WriteLn ('Коренем рівняння y (x) =', a: 0: 1, '* x ^ 2 +', b: 0: 1, '* x +', c: 0: 1, 'є:', x1: 0: 4);
end;
end;
WriteLn ('Натисніть "Введення"'); ReadLn; If code_of = 1 then save_file (E) else
WriteLn ('Так як рівняння не має коренів, то збереження не виконується');
WriteLn ('Якщо хочете вийти, то натисніть "ESC"');
WriteLn ('Якщо хочете ввести інші дані, то натисніть "Введення"');
k: = ReadKey;
code_of: = ord (k);
case code_of of
27: begin
bool_of: = true; graphica;
end;
13: bool_of: = false;
end;
Until bool_of;
end;
{************************************************* **************************}
procedure key (p1: byte);
Var y1, y2: integer;
name: string;
i: byte;
begin
ClearDevice;
SetColor (white);
OutTextXY (250, 435, '"Введення" - вхід "z", "x" - переміщення по меню');
y1: = 15;
y2: = 70;
for i: = 1 to 5 do
begin
Setcolor (blue);
Rectangle (16, y1-1, 251, y2-1);
RecTangle (17, y1-2, 252, y2-2);
RecTangle (18, y1-3, 253, y2-3);
SetFillStyle (1, lightblue);
Bar (15, y1, 250, y2);
case i of
1: Name: = 'Довідка';
2: Name: = 'y = a * ln (b * x)';
3: Name: = 'y = a * x ^ 2 + b * x + c';
4: Name: = 'Побудова графіка';
5: Name: = 'Вихід';
end;
SetColor (white);
OutTextXY (45, y1 +25, Name);
y1: = 20 + y2;
y2: = 75 + y2;
end;
SetColor (white);
p1: = p1-1;
Rectangle (18, 19 +75 * p1, 246, 66 +75 * p1);
end;
{************************************************* **************************}
procedure help;
var st: string;
f: text;
y: integer;
mistake: byte;
begin
ClearDevice;
Assign (f, 'c: \ temp \ My_stuff \ help. Asc');
{$ I-}
Reset (f);
{$ I +}
mistake: = IOResult; SetTextStyle (0, 0, 0);
If mistake <> 0 then OutTextXY (250, 220, 'Немає файлу не існує') else
begin
y: = 0;
Repeat
y: = 15 + y;
ReadLn (f, st);
OutTextXY (45, y, st);
Until EOf (f);
Close (f);
end;
OutTextXY (400, 450, 'Натисніть "Введення" для виходу ");
ReadLn; pro;
end;
{************************************************* **************************}
procedure eat (p2: byte; var bool: boolean);
begin
if p2 = 1 then help else
if p2 = 2 then equation_1 else
if p2 = 3 then equation_2 else
if p2 = 4 then groffunc else
if p2 = 5 then bool: = true;
end;
{************************************************* **************************}
procedure pro;
var p, code: byte;
k: char;
bool: boolean;
begin
ClearDevice;
p: = 1;
key (p);
bool: = false;
repeat
SetBKColor (lightgray);
SetTextStyle (1, 0, 4); SetColor (blue);
OutTextXY (390, 130, 'МЕНЮ');
SetTextStyle (0, 0, 0);
k: = ReadKey;
code: = ord (k);
Case code of
122: begin
p: = p-1; if p = 0 then p: = 5;
key (p);
end;
120: begin
p: = p +1; if p = 6 then p: = 1;
key (p);
end;
13: eat (p, bool);
end;
until bool;
CloseGraph;
end;
{************************************************* **************************}
begin
title;
number: = 0;
graphica;
end.
writeln ('На тему: "Рішення нелінійних рівнянь методом Ньютона');
writeln ('(методом січних) "');
writeln;
writeln;
writeln ('Виконав:');
writeln ('Студент групи СУА-05');
writeln ('Миколаїв А.С.');
writeln ('Перевірив:');
writeln ('cт. преп. кафедри поїсом');
writeln ('Бичкова Є.В.');
writeln ('ас. кафедри поїсом');
writeln ('Волченко EB');
writeln;
writeln ('2005');
writeln;
writeln;
textcolor (red);
writeln ('Натисніть "Введення" для продовження "');
textcolor (lightgray); Readln;
end;
{************************************************* **************************}
procedure pro; FORWARD;
{************************************************* **************************}
procedure graphica;
var d, r, e: integer;
begin
d: = detect;
InitGraph (d, r,'');
e: = GraphResult;
if e <> grOK then WriteLn (GraphErrorMsg (e)) else pro;
end;
{************************************************* **************************}
procedure setka (yn: integer; y2: real);
var x, y, cross, dcross: integer;
lx, ly, dlx, dly: real;
st: string;
begin
If abs (m) <abs (n) then
dlx: = Abs (n/6.25) else dlx: = Abs (m/6.25);
dly: = y2 / ((yn-110) / 40);
dcross: = 0;
lx: = 6 * dlx;
SetColor (LightGray);
For cross: = 1 to 7 do
begin
Str (lx: 0: 1, st);
If lx> = 0 then
OutTextXY (535-dcross, yn +7, st) else
OutTextXY (525-dcross, yn +7, st);
lx: = lx-2 * dlx;
dcross: = dcross +80;
end;
x: = 80;
Repeat
SetLineStyle (DottedLn, 0, NormWidth);
Line (x, yn-3, x, 110); Line (x, yn +3, x, 360);
SetLineStyle (SolidLn, 0, NormWidth);
Line (x, yn-3, x, yn +3);
x: = x +40;
Until x = 600;
ly: = 0;
y: = yn;
Repeat
If ly> 0 then
begin
Line (317, y, 323, y);
Str (ly: 0: 1, st);
OutTextXY (295, y +7, st);
end;
ly: = ly + dly;
SetLineStyle (DottedLn, 0, NormWidth);
Line (323, y, 570, y); Line (70, y, 317, y);
SetLineStyle (SolidLn, 0, NormWidth);
y: = y-40;
Until (y <110);
ly: = 0;
y: = yn;
Repeat
If ly <0 then
begin
Line (317, y, 323, y);
Str (ly: 0: 1, st);
OutTextXY (285, y +7, st);
end;
ly: = ly-dly;
SetLineStyle (DottedLn, 0, NormWidth);
Line (323, y, 570, y); Line (70, y, 317, y);
SetLineStyle (SolidLn, 0, NormWidth);
y: = y +40;
Until (y> 360);
end;
{************************************************* **************************}
{************************************************* **************************}
procedure groffunc;
var l, y0: integer;
y1, y2, x, y, mx, my: real;
gr, grand: string;
{************************************************* **************************}
function f (x: real): real;
begin
Case number of
1: f: = a * ln (b * x);
2: f: = a * sqr (x) + b * x + c;
end;
end;
{************************************************* **************************}
begin
If number = 0 then OutTextXY (300, 20, 'Введіть спочатку дані в рівняння!') Else
begin
ClearDevice;
SetBKColor (black);
case number of
1: grand: = ('y (x) =* ln (* x)');
2: begin grand: = ('y (x) =* sqr (x) + * x +');
str (c: 0: 2, gr); insert (gr, grand, 17); end;
end;
str (b: 0: 2, gr); insert (gr, grand, (6 + number * 4));
str (a: 0: 2, gr); insert (gr, grand, 6);
OutTextXY (300, 40, grand);
y1: = 0; y2: = 0;
x: = m;
Repeat
y: = f (x);
if y <y1 then y1: = y;
if y> y2 then y2: = y;
x: = x +0.01;
Until (x> = n);
my: = 250/abs (y2-y1);
If (abs (m)> abs (n)) then mx: = 250/abs (m) else
mx: = 250/abs (n);
y0: = 360-abs (Round (y1 * my));
setka (y0, y2);
SetColor (blue);
Line (320, 360, 320, 90);
Line (70, y0, 590, y0);
Line (320, 90, 317, 93); Line (320, 90, 323, 93);
Line (590, y0, 587, y0-3); Line (590, y0, 587, y0 +3);
OutTextXY (595, y0-5, 'x'); OutTextXY (315, 80, 'y');
OutTextXY (400, 450, 'Натисніть "Введення" для виходу ");
If Abs (m)> Abs (n) then y1: = Abs (m) else y1: = Abs (n);
SetColor (Red);
str (mass [i]: 5: 4, grand);
OutTextXY (300 + Round ((250/y1) * mass [i]), 400, grand);
Line (320 + Round ((250/y1) * mass [i]), y0, 320 + Round ((250/y1) * mass [i]), 390);
For l: = 1 to i-1 do
begin
SetColor (2 + l);
Line (320 + Round ((250/y1) * mass [l]), y0 +10, 320 + Round ((250/y1) * mass [l]), y0-10);
end;
x: = m;
Repeat
y: = f (x);
PutPixel (320 + Round (x * mx), y0-Round (y * my), 15);
x: = x +0.01;
Until (x> = n);
ReadLn;
pro;
end;
end;
{************************************************* **************************}
{************************************************* **************************}
procedure load_file_1;
var mistake: byte;
k: char;
st: string;
f: text;
begin
Repeat
If number = 1 then
WriteLn ('Введіть проміжки [m, n] одного знаку') else
WriteLn ('Введіть проміжки [m, n]');
WriteLn ('Натисніть "1" для введення даних з клавіатури');
WriteLn ('Натисніть "2" для введення даних з файлу');
k: = ReadKey;
Case k of
'1 ': Begin
WriteLn ('Введення:');
{$ I-}
ReadLn (m, n);
{$ I +}
mistake: = IOResult;
If mistake <> 0 then WriteLn ('Помилка введення');
end;
'2 ': Begin
WriteLn ('Натисніть "1" для вказівки розташування свого файлу');
WriteLn ('Натисніть "2" для введення з файлу, створеного автоматично');
k: = ReadKey;
If k = '1 'then begin
WriteLn ('Введіть шлях до файлу з розширенням. Txt');
ReadLn (st);
Assign (f, st);
end else
If k = '2 'then assign (f,' c: \ temp \ my_stuff \ m_n. Txt ');
{$ I-}
Reset (f);
{$ I +}
mistake: = IOResult;
If mistake <> 0 then
WriteLn ('Немає файлу не існує') else
begin
{$ I-}
Read (f, m, n);
{$ I +}
mistake: = IOResult; Close (f); If mistake <> 0 then
WriteLn ('Інформація у файлі не відповідає потрібному типу') else
begin
WriteLn (m: 0: 2);
WriteLn (n: 0: 2);
end;
end; WriteLn ('Натисніть "Введення для продовження"'); ReadLn;
end;
end;
Until mistake = 0;
end;
{************************************************* **************************}
procedure load_file_2;
var mistake: byte;
k: char;
st: string;
f: text;
begin
Repeat
WriteLn ('Натисніть "1" для введення з клавіатури');
WriteLn ('Натисніть "2" для введення даних з файлу');
k: = ReadKey;
Case k of
'1 ': Begin
WriteLn ('Введення:');
If number = 1 then {$ I-} ReadLn (a, b) {$ I +} else
If number = 2 then {$ I-} ReadLn (a, b, c) {$ I-};
mistake: = IOResult;
If mistake <> 0 then WriteLn ('Помилка введення');
end;
'2 ': Begin
WriteLn ('Натисніть "1" для вказівки розташування свого файлу');
WriteLn ('Натисніть "2" для введення з файлу, створеного автоматично');
k: = ReadKey;
If k = '1 'then begin
WriteLn ('Введіть шлях до файлу розширенням. Txt');
ReadLn (st);
assign (f, st);
end else
If k = '2 'then assign (f,' c: \ temp \ my_stuff \ a_b_c. Txt ');
{$ I-}
Reset (f);
{$ I +}
mistake: = IOResult;
If mistake <> 0 then
WriteLn ('Немає файлу не існує') else
begin
If number = 1 then {$ I-} Read (f, a, b) {$ I +} else
{$ I-} Read (f, a, b, c); {$ I +}
mistake: = IOResult; Close (f); If mistake <> 0 then
WriteLn ('Інформація у файлі не відповідає потрібному типу') else
begin
WriteLn (a: 0: 2);
WriteLn (b: 0: 2);
If number = 2 then WriteLn (c: 0: 2);
end;
end; WriteLn ('Натисніть "Введення для продовження"'); ReadLn;
end;
end;
Until mistake = 0;
end;
{************************************************* **************************}
procedure load_file_3 (var E: real);
var mistake: byte;
k: char;
st: string;
f: text;
begin
Repeat
WriteLn ('Натисніть "1" для введення даних з клавіатури');
WriteLn ('Натисніть "2" для введення даних з файлу');
k: = ReadKey;
Case k of
'1 ': Begin
WriteLn ('Введення:');
{$ I-}
ReadLn (E);
{$ I +}
mistake: = IOResult;
If mistake <> 0 then WriteLn ('Помилка введення');
end;
'2 ': Begin
WriteLn ('Натисніть "1" для вказівки розташування свого файлу');
WriteLn ('Натисніть "2" для введення з файлу, створеного автоматично');
k: = ReadKey;
If k = '1 'then begin
WriteLn ('Введіть шлях до файлу з розширенням. Txt');
ReadLn (st);
assign (f, st);
end else
If k = '2 'then assign (f,' c: \ temp \ my_stuff \ E. txt ');
{$ I-}
Reset (f);
{$ I +}
mistake: = IOResult;
If mistake <> 0 then
WriteLn ('Немає файлу не існує') else
begin
{$ I-}
Read (f, E);
{$ I +}
mistake: = IOResult; Close (f); If mistake <> 0 then
WriteLn ('Інформація у файлі не відповідає потрібному типу') else
begin
WriteLn (E: 0: 3);
end;
end; WriteLn ('Натисніть "Введення для продовження"'); ReadLn;
end;
end;
Until mistake = 0;
end;
{************************************************* **************************}
procedure save_file (E: real);
var k: char;
mistake: byte;
f: text;
st: string;
begin
Repeat
WriteLn ('Якщо хочете зберегти дані та результати натисніть "1"');
WriteLn ('Якщо не хочете зберігати дані та результати натисніть "2"');
k: = ReadKey;
Case k of
'1 ': Begin
WriteLn ('Якщо хочете зберегти дані в зазначені вами файли натисніть "1"');
WriteLn ('Якщо хочете, щоб збереження відбулося автоматично натисніть "2"');
k: = ReadKey;
If k = '1 'then begin
Repeat
WriteLn ('Введіть шлях та ім'я файлу c для збереження проміжків [m, n]');
ReadLn (st);
Assign (f, st);
{$ I-}
ReWrite (f);
{$ I +}
mistake: = IOResult;
If mistake <> 0 then WriteLn ('Файл не може бути створений') else
begin
Write (f, m: 3, n: 3); Close (f); WriteLn ('Інформація збережена. Натисніть "Введення"'); ReadLn;
end;
Until mistake = 0;
Repeat
If number = 1 then
WriteLn ('Введіть шлях та ім'я файлу для збереження коефіцієнтів "a", "b"')
else
If number = 2 then
WriteLn ('Введіть шлях та ім'я файлу для збереження коефіцієнтів "a", "b", "c"');
ReadLn (st);
Assign (f, st);
{$ I-}
ReWrite (f);
{$ I +}
mistake: = IOResult;
If mistake <> 0 then WriteLn ('Файл не може бути створений') else
begin
If number = 1 then begin
Write (f, a: 3, b: 3); Close (f); WriteLn ('Інформація збережена. Натисніть "Введення"'); ReadLn;
end else
If number = 2 then begin
Write (f, a: 3, b: 3, c: 3); Close (f); WriteLn ('Інформація збережена. Натисніть "Введення"'); ReadLn;
end;
end;
Until mistake = 0;
Repeat
WriteLn ('Введіть шлях та ім'я файлу для збереження похибки "Е"');
ReadLn (st);
Assign (f, st);
{$ I-}
ReWrite (f);
{$ I +}
mistake: = IOResult;
If mistake <> 0 then WriteLn ('Файл не може бути створений') else
begin
Write (f, E: 3); Close (f); WriteLn ('Інформація збережена. Натисніть "Введення"'); ReadLn;
end;
Until mistake = 0;
Repeat
WriteLn ('Введіть шлях та ім'я файлу для збереження кореня');
ReadLn (st);
Assign (f, st);
{$ I-}
ReWrite (f);
{$ I +}
mistake: = IOResult;
If mistake <> 0 then WriteLn ('Файл не може бути створений') else
begin
Write (f, mass [i]: 3); Close (f); WriteLn ('Інформація збережена. Натисніть "Введення"'); ReadLn;
end;
Until mistake = 0;
end else
If k = '2 'then begin
Assign (f, 'c: \ temp \ my_stuff \ m_n. Txt');
{$ I-} ReWrite (f); {$ I +}
mistake: = IOResult;
If mistake <> 0 then WriteLn ('Каталога для збереження не існує') else
begin
Write (f, m, n); Close (f);
Assign (f, 'c: \ temp \ my_stuff \ a_b_c. Txt');
ReWrite (f); If number = 1 then Write (f, a, b) else
Write (f, a, b, c); Close (f);
Assign (f, 'c: \ temp \ my_stuff \ E. txt');
ReWrite (f); Write (f, E); Close (f);
Assign (f, 'c: \ temp \ my_stuff \ x. txt');
ReWrite (f); Write (f, mass [i]); Close (f);
WriteLn ('Інформація збережена. Натисніть "Введення"'); ReadLn;
end;
end;
end;
'2 ': Mistake: = 0;
end;
Until mistake = 0;
end;
{************************************************* **************************}
{************************************************* **************************}
procedure equation_1;
var mistake, code_of: byte;
E, x1, root: real;
bool_of: boolean;
k: char;
{************************************************* **************************}
begin
closegraph;
bool_of: = false;
Repeat
number: = 1;
clrscr;
WriteLn ('Рівняння виду: y (x) = a * ln (b * x)');
Repeat
load_file_1;
If m> n then begin
WriteLn ('Введіть "m" <"n"');
WriteLn ('Натисніть "Введення" для подолженія'); ReadLn;
end else
If (m <0) and (n> 0) or (m = 0) or (n = 0) then
begin
WriteLn ('"m" і "n" повинні бути одного знака і нерівні 0');
WriteLn ('Натисніть "Введення" для продовження'); ReadLn;
end;
Until (((m <0) and (n <0)) or ((m> 0) and (n> 0))) and (m <= n);
Repeat
WriteLn ('Введіть коефіцієнти рівняння "a", "b"');
load_file_2;
If m * b <= 0 then begin
WriteLn ('спробуйте "b" іншого знака і нерівне 0');
WriteLn ('Натисніть "Введення" для продовження'); ReadLn;
end;
Until m * b> 0;
If a = 0 then begin
WriteLn ('Все "x" на проміжку [', m: 0: 1, ';', n: 0: 1, '] - рішення рівняння');
number: = 0; end else
begin
Repeat
WriteLn ('Введіть похибка "E"');
load_file_3 (E);
If E <= 0 then begin WriteLn ('Введіть "Е" більше 0');
WriteLn ('Натисніть "Введення" для продовження "');
end;
Until E> 0;
i: = 1;
If (a * ln (b * m) * (-a/sqr (m)))> 0 then begin mass [i]: = m; code_of: = 1 end else
If (a * ln (b * n) * (-a/sqr (n)))> 0 then begin mass [i]: = n; code_of: = 1 end else
begin WriteLn ('Рівняння не має коренів'); number: = 0; code_of: = 0; end;
If code_of = 1 then
begin
Repeat
x1: = mass [i]-a * ln (b * mass [i]) / (a / mass [i]);
root: = Abs (x1-mass [i]);
i: = i +1;
mass [i]: = x1;
Until root <E;
If (x1 <m) or (x1> n) then
begin WriteLn ('Рівняння не має коренів'); number: = 0; code_of: = 0; end else
WriteLn ('Коренем рівняння y (x) =', a: 0: 1, '* ln (', b: 0: 1, '* x) є:', x1: 5: 4);
end;
end;
WriteLn ('Натисніть "Введення"'); ReadLn; If code_of = 1 then save_file (E) else
WriteLn ('Так як рівняння не має коренів, то збереження не виконується');
WriteLn ('Якщо хочете вийти, то натисніть "ESC"');
WriteLn ('Якщо хочете ввести інші дані, то натисніть "Введення"');
k: = ReadKey;
code_of: = ord (k);
case code_of of
27: begin
bool_of: = true; graphica;
end;
13: bool_of: = false;
end;
Until bool_of;
end;
{************************************************* **************************}
{************************************************* **************************}
procedure equation_2;
var mistake, code_of: byte;
E, x1, root: real;
bool_of: boolean;
k: char;
{************************************************* **************************}
begin
closegraph;
bool_of: = false;
Repeat
number: = 2;
clrscr;
WriteLn ('Рівняння виду: y (x) = a * x ^ 2 + b * x + c');
Repeat
load_file_1;
If m> n then WriteLn ('Введіть "m" <"n"');
Until (m <= n);
WriteLn ('Введіть коефіцієнти рівняння "a", "b", "c"');
load_file_2;
If (a = 0) and (b = 0) and (c = 0) then begin
WriteLn ('Все "х" на проміжку [', m: 0: 1, ';', n: 0: 1, '] - рішення рівняння');
number: = 0; end else
begin
Repeat
WriteLn ('Введіть похибка "Е"');
load_file_3 (E);
If E <= 0 then begin WriteLn ('Введіть E> 0');
WriteLn ('Натисніть "Введення" для продовження');
end;
Until E> 0;
i: = 1;
If (a * sqr (n) + b * n + c) * (2 * a)> = 0 then begin mass [i]: = n; code_of: = 1 end else
If (a * sqr (m) + b * m + c) * (2 * a)> = 0 then begin mass [i]: = m; code_of: = 1 end else
begin WriteLn ('Рівняння не має коренів'); number: = 0; code_of: = 0; end;
If code_of = 1 then
begin
Repeat
x1: = mass [i] - ((a * sqr (mass [i]) + b * mass [i] + c) / (2 * a * mass [i] + b));
root: = Abs (x1-mass [i]);
i: = i +1;
mass [i]: = x1;
Until (root <E);
If (x1 <m) or (x1> n) then
begin WriteLn ('Рівняння не має коренів'); number: = 0; code_of: = 0; end else
WriteLn ('Коренем рівняння y (x) =', a: 0: 1, '* x ^ 2 +', b: 0: 1, '* x +', c: 0: 1, 'є:', x1: 0: 4);
end;
end;
WriteLn ('Натисніть "Введення"'); ReadLn; If code_of = 1 then save_file (E) else
WriteLn ('Так як рівняння не має коренів, то збереження не виконується');
WriteLn ('Якщо хочете вийти, то натисніть "ESC"');
WriteLn ('Якщо хочете ввести інші дані, то натисніть "Введення"');
k: = ReadKey;
code_of: = ord (k);
case code_of of
27: begin
bool_of: = true; graphica;
end;
13: bool_of: = false;
end;
Until bool_of;
end;
{************************************************* **************************}
procedure key (p1: byte);
Var y1, y2: integer;
name: string;
i: byte;
begin
ClearDevice;
SetColor (white);
OutTextXY (250, 435, '"Введення" - вхід "z", "x" - переміщення по меню');
y1: = 15;
y2: = 70;
for i: = 1 to 5 do
begin
Setcolor (blue);
Rectangle (16, y1-1, 251, y2-1);
RecTangle (17, y1-2, 252, y2-2);
RecTangle (18, y1-3, 253, y2-3);
SetFillStyle (1, lightblue);
Bar (15, y1, 250, y2);
case i of
1: Name: = 'Довідка';
2: Name: = 'y = a * ln (b * x)';
3: Name: = 'y = a * x ^ 2 + b * x + c';
4: Name: = 'Побудова графіка';
5: Name: = 'Вихід';
end;
SetColor (white);
OutTextXY (45, y1 +25, Name);
y1: = 20 + y2;
y2: = 75 + y2;
end;
SetColor (white);
p1: = p1-1;
Rectangle (18, 19 +75 * p1, 246, 66 +75 * p1);
end;
{************************************************* **************************}
procedure help;
var st: string;
f: text;
y: integer;
mistake: byte;
begin
ClearDevice;
Assign (f, 'c: \ temp \ My_stuff \ help. Asc');
{$ I-}
Reset (f);
{$ I +}
mistake: = IOResult; SetTextStyle (0, 0, 0);
If mistake <> 0 then OutTextXY (250, 220, 'Немає файлу не існує') else
begin
y: = 0;
Repeat
y: = 15 + y;
ReadLn (f, st);
OutTextXY (45, y, st);
Until EOf (f);
Close (f);
end;
OutTextXY (400, 450, 'Натисніть "Введення" для виходу ");
ReadLn; pro;
end;
{************************************************* **************************}
procedure eat (p2: byte; var bool: boolean);
begin
if p2 = 1 then help else
if p2 = 2 then equation_1 else
if p2 = 3 then equation_2 else
if p2 = 4 then groffunc else
if p2 = 5 then bool: = true;
end;
{************************************************* **************************}
procedure pro;
var p, code: byte;
k: char;
bool: boolean;
begin
ClearDevice;
p: = 1;
key (p);
bool: = false;
repeat
SetBKColor (lightgray);
SetTextStyle (1, 0, 4); SetColor (blue);
OutTextXY (390, 130, 'МЕНЮ');
SetTextStyle (0, 0, 0);
k: = ReadKey;
code: = ord (k);
Case code of
122: begin
p: = p-1; if p = 0 then p: = 5;
key (p);
end;
120: begin
p: = p +1; if p = 6 then p: = 1;
key (p);
end;
13: eat (p, bool);
end;
until bool;
CloseGraph;
end;
{************************************************* **************************}
begin
title;
number: = 0;
graphica;
end.