Генерація поліномів

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

Курсова робота
ГЕНЕРАЦІЯ ПОЛІНОМАХ

Зміст

Введення
Глава 1. Теоретична частина по генерації поліномів
1.1 Теорія поліномів
1.1.1 Основні визначення, які використовуються в теорії поліномів
1.1.2 Визначення полінома
1.1.3 Основні властивості поліномів
1.1.4 Використовувані в дослідженні теореми і їх доведення
1.2 Генерація поліномів
Глава 2. Практична частина по генерації поліномів
2.1 Алгоритм генерації поліномів.
2.2 Написання програми, що реалізує алгоритм генерації поліномів
2.2.1 Подолання проблем, що виникли при написанні програми
2.2.2 Опис та роз'яснення деяких частин програми
2.3 Лістинг програми, що реалізує алгоритм генерації поліномів
Висновок
Список використаних джерел та літератури
Додаток

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

Глава 1. Теоретична частина по генерації поліномів

1.1 Теорія поліномів

1.1.1 Основні визначення, які використовуються в теорії поліномів

У першому розділі цей пункт можна назвати одним з найважливіших, тому що в його змісті будуть наведені визначення основних понять алгебри та теорії поліномів, без яких не уявлялося б можливим розуміння всього того, про що буде говоритися в інших параграфах і розділах.
Визначення 1. Безліч - набір, сукупність, збори будь-яких об'єктів, званих його елементами, що володіють загальним для всіх них характеристичним властивістю. [4, С. 382]
Визначення 2. Бінарна операція - правило, за яким кожній парі (a, b) елементів множини G однозначно ставиться у відповідність певний елемент з того ж безлічі G. [7, С. 11]
Визначення 3. Безліч R, в якому задані дві бінарні операції + (додавання) і (множення), називається полем, якщо виконуються наступні умови (аксіоми поля):
Додавання:
1. Комутативність: a + b = b + a.
2. Асоціативність: a + (b + c) = (a + b) + c.
3. Існування нуля: існує такий елемент 0,
що а + 0 = а для будь-якого елемента а.
4. Існування протилежного: для будь-якого елемента, а існує такий елемент (-а), що а + (-а) = 0.
Множення:
1. Комутативність: a ∙ b = b ∙ a.
2. Асоціативність: a ∙ (b ∙ c) = (a ∙ b) ∙ c.
3. Існування одиниці: існує такий елемент 1, що а ∙ 1 = а для всякого елемента а.
4. Існування зворотного: для будь-якого елемента а ≠ 0 існує такий елемент а -1, такий що а ∙ а 1 = 1.
Додавання і множення:
Дистрибутивність: a ∙ (b + c) = a ∙ b + а ∙ c. [2, С. 16]
Визначення 4. Комутативним кільцем називається безліч, в якому виконуються аксіоми поля, крім, може бути, вимоги існування зворотного елемента а -1 для будь-якого а ≠ 0. [2, С. 23]
Визначення 5. Нехай S - безліч. Відображення S * S → S - закон композиції - загальна назва для операції, що виробляє з двох елементів a, b S третій елемент c S. [4, С. 279]
Визначення 6. Моноїдів - безліч G з асоціативним законом композиції. [4, С. 386]
Визначення 7. Якщо f (c) = 0, тобто многочлен f (x) звертається в нуль при підстановці в нього числа із замість невідомого, то з називається коренем многочлена f (x). [1, С. 144]
Визначення 8. Ненульовий елемент кільця, твір якого на деякий ненульовий елемент дорівнює нулю, називається дільником нуля. [4, С. 176]
Визначення 9. Кільце називається цілісним (або областю цілісності), якщо воно комутативне і не містить дільників нуля. [2, С. 26]
Визначення 10. Многочлен називається приводиться в кільці многочленів, якщо у нього існують дільники зі ступенем більше нуля, але менше ступеня полінома, інакше непріводімим. [6, С. 54]

1.1.2 Визначення полінома

У математиці та її розділах існує кілька визначень такого поняття як поліном. Тут і далі будемо називати поліном також статечним многочленом або просто многочленом. Наведемо деякі з них.
Перше визначення взято з [3, С. 60]
Нехай R - деяке кільце. Побудуємо за допомогою нового, що не належить кільцю R, символу х вираз виду f (х) = Σа v x v, в яких підсумовування ведеться за якимось кінцевому безлічі цілочисельних значень індексу v ≥ 0 і «коефіцієнти» а v належать кільцю R. Такі вирази називаються многочленами; символ х називається змінною, v - ступенем полінома.
Друге визначення взято з [7, С. 131-133]
Нехай S - деяка множина і N - моноїд натуральних чисел. Позначимо через N (S) безліч функцій S → N, які дорівнюють 0 для майже всіх елементів із S. Нехай х S і t N. Кожен елемент р N (S) має єдине подання у вигляді добутку , Де v: S → N - відображення, для якого v (x) = 0 при майже всіх х. Таке твір назвемо примітивним многочленом і будемо позначати або просто .
Нехай А - комутативне кільце. Тоді можна утворити безліч моноїд A [N (S)] над А, яку будемо називати кільцем многочленів від S над A. За визначенням будь-який елемент з A [N (S)] має єдине подання у вигляді лінійної комбінації , Де (v) пробігає всі відображення безлічі S в N, які звертаються в нуль для майже всіх (v). Елементи з А [N (S)] називаються многочленами від S над А. Елементи називаються коефіцієнтами многочлена. Якщо S складається з одного символу Х, то кожен многочлен може бути записаний у вигляді
,
де і n - деяке ціле число ≥ 0, що називається ступенем полінома.
Нижче наведене визначення взято з [1, С. 130]
Многочленом (або поліномом) n-го ступеня від невідомого х називається сума виразів з цілими ступенями:
.
Коефіцієнти будемо вважати довільними числами, причому старший коефіцієнт повинен бути відмінний від нуля. Для скороченою записи многочленів вживаються символи f (x), g (x) і т.д.
У даній курсовій роботі можна використовувати будь-яке з наведених визначень полінома, але загалом останнє визначення полінома простіше для розуміння, але має не менше глибокий сенс, ніж інші, тому що дозволяє поглянути на поліном як на деякий формальне вираження цілком певне набором своїх коефіцієнтів (що набагато спрощує роботу з поліномами при їх генерації) з одного боку і як на функцію від змінного Х (з точки зору математичного аналізу) з іншого боку.

1.1.3 Основні властивості поліномів

1. Рівність одного полінома іншому.
Два многочлена f (x) і g (x) будуть вважатися рівними (або тотожне рівними), f (x) = g (x), в тому випадку, якщо рівні їх коефіцієнти при однакових ступенях невідомого. [1, С. 131]
2. Додавання та множення поліномів.
Нехай і , Де , , N, s - ступеня многочленів f (x) і g (x). Якщо n ≥ s (інакше переобозначив ступеня поліномів), то їх сумою називається многочлен , Коефіцієнти якого виходять складанням коефіцієнтів f (x) і g (x), що стоять при однакових ступенях змінного, тобто , I = 0, 1, ..., n. Ступінь суми дорівнює n, якщо n ≥ s, але при n = s вона може виявитися менше n, а саме в тому випадку якщо . [1, С. 132]
Твором многочленів f (x) і g (x) називається многочлен , Коефіцієнти якого визначаються наступним чином , Так як , , То , Тому ступінь твори многочленів дорівнює n + s. [1, С. 132]
3. Замкнутість щодо додавання і множення. Виходячи з перших двох властивостей многочлена, очевидно, що складаючи або перемножая два яких-небудь многочлена від одного і того ж змінного з коефіцієнтами з К, ми отримаємо однозначно многочлен з коефіцієнтами з того ж кільця К.

1.1.4 Використовувані в дослідженні теореми і їх доведення

Т1. [1, С. 134]
Для будь-яких двох многочленів f (x) і g (x) можна на знайти такі многочлени q (x) і r (x), що
f (x) = g (x) ∙ q (x) + r (x), (1.1)
причому ступінь r (x) менше ступеня g (x) або ж r (x) = 0. Поліноми q (x) і r (x), що задовольняють цій умові визначаються однозначно.
Доказ. [1, С. 134-135]
Доведемо спершу другу половину теореми. Нехай існують ще многочлени q1 (x) і r1 (x), також задовольняють рівності
f (x) = g (x) ∙ q1 (x) + r1 (x), (1.2)
причому ступінь r1 (x) менше ступеня g (x) або дорівнює нулю. Прирівнюючи один одному праві частини рівностей (1.1) і (1.2), отримаємо:
g (x) ∙ [q (x) - q1 (x)] = r1 (x) - r (x).
Ступінь правій частині цієї рівності менше ступеня g (x), ступінь ж лівій частині була б при більше або дорівнює ступеня g (x). Тому має бути q (x) - q1 (x) = 0, тобто q (x) = q1 (x), а тоді й r (x) = r1 (x), що й потрібно було довести.
Переходимо до доведення першої половини теореми. Нехай многочлени f (x) і g (x) мають відповідно до ступеня n і s. Якщо n <s, то можна покласти q (x) = 0, r (x) = f (x). Якщо ж n ≥ s, то скористаємося методом поділу многочленів з дійсними коефіцієнтами, розташованих по убутним ступенями невідомого. Нехай

Вважаючи
(1.3)
ми отримуємо многочлен, ступінь якого менше n. Позначимо цей ступінь через n1, а старший коефіцієнт многочлена f 1 (x) - через а n 1. Покладемо, далі, якщо все ще n1 ≥ s,
(1.4)
Позначимо цей ступінь через n2, а старший коефіцієнт многочлена f 2 (x) - через а n 2. Покладемо, далі, якщо все ще n2 ≥ s,
(1.5) і т.д.
Так як ступінь многочленів f 1 (x), f 2 (x), ... убувають, n> n1> n2> ..., то ми дійдемо після кінцевого числа кроків до такого многочлена f k (x),
(1.k)
ступінь якого nk менше s, після чого наш процес зупиняється. Складаючи тепер рівності (1.3), (1.4), (1.5), ..., (1.k) ми отримаємо:

тобто многочлени


Дійсно задовольняють рівності (1.2), причому ступінь r (x) дійсно менше ступеня g (x).
Т2. [1, С. 135]
Многочлен g (x) тоді і тільки тоді буде дільником многочлена f (x), якщо існує многочлен q (x), що задовольняє рівності
f (x) = g (x) q (x) (2.1)
Доказ. [1, С. 135-136]
Якщо g (x) є дільником для f (x), то в якості q (x) слід взяти частка від ділення f (x) на g (x).
Зворотно, нехай многочлен q (x), що задовольняє рівності (2.1), існує. З Т1 про одиничність многочленів q (x) і r (x), що задовольняють рівності f (x) = g (x) ∙ q (x) + r (x) і умові, що ступінь r (x) менше ступеня g (x ), у нашому випадку слід, що частка від ділення f (x) на g (x) дорівнює q (x), а залишок дорівнює нулю.
Т3. [3, С. 106]
Якщо а - корінь многочлена f (x), то f (x) ділиться на х - а.
Доказ. [3, С. 106 -107]
Розподіл f (x) на х - а дає рівність f (x) = (x-a) ∙ q (x) + r (x). Підставимо в цю рівність х = а: 0 = r (x), звідки f (x) = (x-a) ∙ q (x).
Т4. Основна теорема алгебри. [1, С. 147]
Всякий многочлен з будь-якими числовими коефіцієнтами, ступінь якого не менше одиниці має хоча б один корінь, в загальному випадку комплексний.
Доказ.
Див. [1, C.147 - 156]
Слідство 4.1 [1, С. 156]
Многочлен f (x) ступеня n над полем комплексних чисел має канонічне розкладання з точністю до множника нульової ступеня виду f (x) = c ∙ (x - a 1) ∙ (x - a 2) ∙ ... ∙ (x - a n) . Причому це розкладання єдине.
Доказ.
Див. [1, С. 156-157]
Слідство 4.2
Всякий многочлен f (x) ступеня n, n ≥ 1, з будь-якими числовими коефіцієнтами має n коренів, якщо кожен корінь вважати стільки разів, яка його кратність.
Доказ.
Див. [1, С. 157]
З усіх наведених теорем і наслідків найбільше значення для даної курсової роботи мають слідства 4.1 та 4.2, так як в них говориться, що будь-який многочлен у загальному випадку може розкладатися на многочлени першого ступеня з точністю до множника нульової ступеня, тобто з точністю до числового коефіцієнта, і їх кількість з урахуванням кратності дорівнює ступеня розкладаного многочлена і що многочлени, що входять в канонічне розкладання, містять в собі всі корені розкладаного полінома, відповідно з урахуванням їх кратності.
Це не маловажно, оскільки тепер можна говорити про те, що, маючи ступінь генерується полінома та його коріння, ми можемо з точністю до числового коефіцієнта визначити і отримати необхідний поліном зазначеної ступеня.

1.2 Генерація поліномів

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

Глава 2. Практична частина по генерації поліномів

2.1 Алгоритм генерації поліномів

Дослідивши теоретичну частину з проблеми генерації поліномів, приступив до практичного застосування отриманих знань. Перш, ніж приступати до написання коду програми, яка генерує поліноми по введеної користувачем ступеня і коріння, склав алгоритм для вирішення даної задачі.
Алгоритм.
1. Ввести ступінь генерується полінома.
2. Якщо ступінь не була введена або був введений символ, який не є цифрою, чи було введено число менше двох, то видати повідомлення про помилку і перейти до пункту 1, інакше, при коректному вводі, перейти до пункту 3.
3. Організувати цикл (кількість ітерацій дорівнює ступеня генерується полінома) для введення коренів генерується полінома.
4. Ввести коріння генерується полінома.
5. Якщо корінь не був введений або був введений символ, який не є цифрою, то видати повідомлення про помилку і перейти до пункту 4, інакше, при коректному вводі, перейти до пункту 6.
6. Після закінчення роботи циклу зробити перемножування введених коренів генерується полінома відповідно до правил перемноження поліномів (див. пункт 1.1.3.2)
7. Вивести вийшов поліном в порядку убування ступенів змінної на екран.

2.2 Написання програми, що реалізує алгоритм генерації поліномів

2.2.1 Подолання проблем, що виникли при написанні програми

При написанні коду програми, що реалізує алгоритм генерації поліномів, зіткнулися з рядом труднощів.
По-перше, необхідно було реалізувати перевірку даних, що вводяться, щоб вводяться значеннями були тільки цифри і числа. Для подолання першої проблеми був розроблений наступний алгоритм, реалізація якого буде наведена нижче.
1. Ініціалізувати цикл з постусловіем.
2. Ввести значення у вигляді рядка.
3. Ініціалізувати цикл (кількість ітерацій дорівнює довжині введеної користувачем рядка).
4. Переміщатися у введеної рядку посимвольно.
5. Якщо символ цифра перейти до пункту 6, інакше перейти до пункту 8.
6. Переводимо символ в цифру.
7. Додаємо цифру до числа, яке буде перекладом введеного рядка, якщо вона число, попередньо помножене його на десять.
8. Видаємо повідомлення про помилку і переходимо до пункту 2.
9. Запам'ятовуємо число, що вийшло при коректному вводі.
Другою проблемою стало переповнення типу даних - long при перемножуванні (у даній програмі, написаній на мові С). Однак вона була вирішена при написанні функцій перевірки при перемножуванні і спільної перевірки коефіцієнтів генерується полінома, які будуть приведені нижче.
Третя проблема - переповнення буфера. При написанні програми довелося збільшити буфер для введення значень, але при зчитуванні розглядати тільки перші дев'ять символів, щоб свідомо не перевищити максимальне значення використовуваного типу, і, якщо було введено більше дев'яти символів, то видати повідомлення про помилку і попросити користувача заново ввести значення.
Четверта проблема - зберігання введених даних. Для її подолання було використано чотири масиву; у першому (масив m) будуть зберігатися всі корені генерується полінома (його розмір - 2 ∙ n, де n - ступінь генерується полінома), другий і третій - допоміжні (беруть участь в перемножуванні), в третьому ( масив b) буде зберігатися корінь генерується многочлена, взятий із першого масиву, (його розмір - 2), у другому (масив a) спочатку зберігатися корінь генерується многочлена з першого масиву, а після першого множення у нього буде перезаписуватися результат перемноження для наступного виконання цієї операції (розмір - n +1); останній масив (масив c) - результуючий, містить всі коефіцієнти генерується многочлена після перемножування (розмір n +1).

2.2.2 Опис та роз'яснення деяких частин програми

У даному пункті будуть приведені деякі частини програми, що реалізує алгоритм генерації поліномів, з поясненнями.
1. Функція реалізує знаходження модуля числа типу long
long Modul (long a)
{
if (a <0)
return (-a);
else
return (a);
}
Якщо функція отримала негативне число, то вона повертає число з протилежним знаком, в іншому випадку саме число.
Вхідні дані - число типу long.
Вихідні дані - число типу long.
2. Функція перевірки можливості виходу за діапазон типу long при перемножуванні коренів генерується полінома.
int provper (long a, long b)
{
if (b == 0 | | a == 0)
return (1);
else
if (Modul (a) <MAXLONG / Modul (b))
return (1);
else
return (0);
}
Якщо одне з переданих функції значень дорівнює нулю, то функція повертає одиницю, інакше, якщо абсолютне значення одного з отриманих функцій значень менше, ніж число, що дорівнює частці від ділення максимального значення типу long на інше введене значення, тобто, якщо при перемножуванні отриманих функцією значень, їх твір не виходить за діапазон типу long, то функція повертає одиницю, в іншому випадку - нуль.
Вхідні дані - два числа типу long.
Вихідні дані - число типу int (одиниця чи нуль).
3. Функція перевірки виходу за діапазон при додаванні коефіцієнтів генерується полінома при однакових ступенях змінного.
int provsum (long a, long b)
{
if (Modul (a) <(MAXLONG-Modul (b)))
return (1);
else
return (0);
}
Якщо одне з переданих функції значень менше, ніж різниця максимального значення типу long та іншого переданого значення, то функція повертає одиницю, в іншому випадку - нуль.
Вхідні дані - два числа типу long.
Вихідні дані - число типу int (одиниця чи нуль).
4. Функція, перемножуються два многочлена.
void peremnoz (long * a, int n, long * b, long * c)
{
long z = 0;
int i, j;
for (i = 0; i <n; i + +)
for (j = 0; j <2; j + +)
{
if (provper (* (a + i), * (b + j)) == 1)
z = (* (a + i )*(*( b + j)));
else
* (C + (i + j)) = MAXLONG;
if (provsum (z, * (c + (i + j )))== 1)
* (C + (i + j)) + = z;
else
* (C + (i + j)) = MAXLONG;
}
}
У функції инициализируются два цикли, один з яких вкладений в інший. Зовнішній пробігає по всіх коефіцієнтам першого многочлена, що бере участь в перемножуванні (у програмі реалізується у вигляді масиву a, а коефіцієнти многочлена - елементи масиву а), внутрішній - за коефіцієнтами другого многочлена (у програмі - у вигляді масиву b, коефіцієнти многочлена - елементи масиву b ). Якщо перемножування коефіцієнтів (елементів масивів) можливо (починає роботу функція int provper (long a, long b)), тобто не відбудеться вихід за діапазон типу long, то результат перемноження записуємо в змінну z, у противному випадку, відповідному коефіцієнту результуючого многочлена (у програмі - масив c, коефіцієнти многочлена - елементи масиву) присвоюється максимальне значення (MAXLONG) типу long і внутрішній цикл припиняє свою роботу. Якщо твір коефіцієнтів масиву не вийшло за діапазон типу long, то перевіряємо: чи не станеться вихід за діапазон типу long при додаванні вийшло значення (зберігатися у змінній z) з коефіцієнтом результуючого многочлена (елемент масиву c) (починає роботу функція int provsum (long a , long b)); якщо складання можливо, то до відповідного коефіцієнту результуючого многочлена (елемент масиву c) додається результат перемноження коефіцієнтів перших двох многочленів (значення змінної z), інакше, відповідному коефіцієнту результуючого многочлена присвоюється максимальне значення (MAXLONG) типу long.
Робота функції перемноження заснована на властивостях полінома (див. пункт 1.1.3).
Вхідні дані: три покажчики типу long (на масиви, беруть участь у перемножуванні, і на результуючий масив), число типу int (кількість елементів першого масиву).
5. Функція перевірки знаходження коефіцієнтів генерується полінома в діапазоні використовуваного типу.
int prov (long * a, int n)
{
int i, y = 0;
for (i = 0; i <n +1; i + +)
if (Modul (* (a + i)) == MAXLONG) y + +;
return (y);
}
У функції ініціалізується цикл (кількість ітерацій дорівнює ступеня генерується многочлена, збільшеної на одиницю). Виробляємо рух за коефіцієнтами генерується многочлена (елементам масиву a); якщо абсолютне значення якого-небудь коефіцієнта генерується многочлена дорівнює максимальному значенню (MAXLONG) типу long, то значення прапора (змінної y), спочатку рівне нулю, збільшуємо на одиницю.
Вхідні дані: покажчик типу long (на масив a), число типу int (ступінь генерується полінома, збільшена на одиницю).
Вихідні дані: число типу int.
6. Частина програми, переводить символ, що є цифрою, на число.
{
w = s [i] - "0";
q = 10 * q + w;
x = 1;
}
Якщо введений символ - цифра, то з коду цього символу віднімаємо з коду символу код нуля і отримуємо число, відповідне введеному символу.

2.3 Лістинг програми, що реалізує алгоритм генерації поліномів

# Include <stdio.h>
# Include <conio.h>
# Include <math.h>
# Include <string.h>
# Include <ctype.h>
# Include <stdlib.h>
# Include <values.h>
# Include <time.h>
long Modul (long a)
{
if (a <0) return (-a);
else return (a);
}
int provper (long a, long b)
{
if (b == 0 | | a == 0) return (1);
else
if (Modul (a) <MAXLONG / Modul (b)) return (1);
else return (0);
}
int provsum (long a, long b)
{
if (Modul (a) <(MAXLONG-Modul (b))) return (1);
else return (0);
}
void peremnoz (long * a, int n, long * b, long * c) {
long z = 0;
int i, j;
for (i = 0; i <n; i + +)
for (j = 0; j <2; j + +)
{
if (provper (* (a + i), * (b + j)) == 1)
z = (* (a + i )*(*( b + j)));
else * (c + (i + j)) = MAXLONG;
if (provsum (z, * (c + (i + j )))== 1)
* (C + (i + j)) + = z;
else * (c + (i + j)) = MAXLONG;
}
}
int prov (long * a, int n)
{
int i, y = 0;
for (i = 0; i <n +1; i + +)
if (Modul (* (a + i)) == MAXLONG) y + +;
return (y);
}
void main ()
{
int stepen = 0, n = 2, w, x = 0, i, k, f = 1;
long * a, * b, * m, * c, q = 0, z;
char * s;
s = (char *) calloc (900, sizeof (char));
clrscr ();
do {
printf ("Введіть ступінь не меншу, ніж 2 і не більшу, ніж 100:");
gets (s);
if (strlen (s) <1)
{
printf ("\ nне було введено значення. раз введіть \ n");
x = 0;
}
if (strlen (s)> 9)
{
printf ("\ nВведіть більше 9 символів. раз введіть \ n");
x = 0;
}
else
{
for (i = 0; i <strlen (s); i + +)
if (isdigit (s [i])! = 0)
{
w = s [i] - "0";
q = 10 * q + w;
x = 1;
}
else
{
printf ("\ nВведіть символ або пробіл. раз введіть \ n");
x = 0;
break;
}
stepen = q;
free (s);
s = (char *) calloc (900, sizeof (char));
q = 0;
w = 0;
}
} While (stepen <2 | | stepen> 100 | | x == 0);
clrscr ();
a = (long *) calloc (stepen +1, sizeof (long));
b = (long *) calloc (2, sizeof (long));
m = (long *) calloc ((stepen) * 2, sizeof (long));
c = (long *) calloc (stepen +1, sizeof (long));
for (i = 0; i <stepen * 2; i + +)
{
if (i% 2 == 0)
{
do {
q = 0;
printf ("Введіть корінь многочлена #% d", (i / 2) +1);
gets (s);
if (strlen (s) <1)
{
printf ("\ nне було введено значення. раз введіть \ n");
x = 0;
}
if (strlen (s)> 9)
{
printf ("\ nВведіть більше 9 символів. раз введіть \ n");
x = 0;
}
else
{
if (s [0 ]=='-')
for (k = 1; k <strlen (s); k + +)
if (isdigit (s [k])! = 0)
{
w = s [k] - "0";
q = 10 * q + w;
x = 1;
f =- 1;
}
else
{
printf ("\ nВведіть символ або пробіл. раз введіть \ n");
x = 0;
break;
}
else
for (k = 0; k <strlen (s); k + +)
if (isdigit (s [k])! = 0)
{
w = s [k] - "0";
q = 10 * q + w;
x = 1;
f = 1;
}
else
{
printf ("\ nВведіть символ або пробіл. раз введіть \ n");
x = 0;
break;
}
}
free (s);
s = (char *) calloc (900, sizeof (char));
} While (x == 0);
if (f == 1)
{
* (M + i) = q;
q = 0;
w = 0;
* (M + i )=-*( m + i);
}
else
if (f ==- 1)
{
* (M + i) = q;
q = 0;
w = 0;
}
}
else * (m + i) = 1;
}
for (i = 0; i <2; i + +)
{
* (A + i) =* (m + i);
* (B + i) =* (m +2 + i);
}
for (k = 0; k <stepen-1; k + +)
{
peremnoz (a, n, b, c);
for (w = 0; w <n +1; w + +)
{
* (A + w) =* (c + w);
* (C + w) = 0;
}
for (w = 0; w <2; w + +)
* (B + w) =* (m + (i * n) + w);
n + +;
}
clrscr ();
if (prov (a, stepen)! = 0)
{
printf ("\ nПроізошел вихід за діапазон типу.");
printf ("\ n \ nПрі наступному використанні даного програмного продукту будьте обережні з \ n вводяться значенням ступеня і коріння");
printf ("\ n \ nДякуємо, що користувалися моїм прогаммним продуктом !:)");
printf ("\ n \ nНатисніть будь-яку кнопку.");
}
else
{
printf ("\ Генеріремий поліном: \ n");
printf ("x ^% d", stepen);
for (i = stepen-1; i> 0; i -)
{
if (i == 1)
if (* (a + i) ==- 1) printf ("-x");
else
if (* (a + i) == 1) printf ("+ x");
else
if (* (a + i) <0) printf ("% ldx", * (a + i));
else
if (* (a + i)> 0) printf ("+% ldx", * (a + i);
else n + +;
else
if (* (a + i) ==- 1) printf ("-x ^% d", i);
else
if (* (a + i) == 1) printf ("+ x ^% d", i);
else
if (* (a + i) <0)
printf ("% ldx ^% d", * (a + i), i);
else
if (* (a + i)> 0)
printf ("+% ldx ^% d", * (a + i), i);
else n + +;
}
if (a [0] <0) printf ("% ld", a [0]);
else
if (a [0]> 0) printf ("+% ld", a [0]);
else n -;
printf ("= 0");
printf ("\ n \ nДякуємо, що користувалися моїм прогаммним продуктом !:)");
printf ("\ n \ nНатисніть будь-яку кнопку.");
}
free (a);
free (b);
free (c);
free (m);
free (s);
getch ();
}
Вхідні дані: числа типу long.
Вихідні дані: числа типу long.
1. При введених значеннях ступеня і коренів генерується полінома, що не допускають вихід за діапазон типу long, - коефіцієнти генерується многочлена з відповідними ступенями змінних.
2. При не коректно введених значеннях:
1. Якщо при введенні ступеня введено число менше двох і більше 100, то видається повідомлення про не коректному вводі з проханням повторити введення заново.
2. Якщо не було введено значення ступеня або кореня полінома, то видається повідомлення про не коректному вводі з проханням повторити введення заново.
3. Якщо було введено більше дев'яти символів, то видається повідомлення про не коректному вводі з проханням повторити введення.
4. Якщо був введений символ або пробіл, то видається повідомлення про не коректному вводі з проханням повторити введення.
5. Якщо стався вихід за діапазон типу long, то видається повідомлення про не коректному вводі з проханням при наступному використанні даного програмного продукту бути акуратними при введенні ступеня генерується полінома і його коріння, щоб не допустити вихід за діапазон використовуваного типу.
Результати тесту даного програмного продукту можна побачити в Додатку.

Висновок

На закінчення даної курсової роботи хотілося б коротко сказати про виконану роботу, про проблеми, з якими зіткнувся при виконанні поставленої мети, і про перспективи розвитку та покращення даного програмного продукту.
Метою даної курсової роботи було скласти алгоритм генерації поліномів по введеної ступеня і коріння і написати програму, що реалізовує цей алгоритм.
Щоб виконати поставлену мету, необхідно було вирішити три завдання:
1. Пошук літератури з предмету даної курсової роботи.
2. Складання алгоритму для виконання поставленої мети.
3. Написання програми, що реалізує складений алгоритм.
При вирішенні третього завдання зіткнувся з низкою труднощів:
1. Організацією введення значень і перевірки його коректності. Необхідно було перевіряти, щоб введені значення були лише числами.
2. Організацією зберігання введених даних для зручного звернення до них у ході написання і роботи програми.
3. Перевірки, щоб при роботі програми не відбувся вихід за діапазон використовуваного типу.
Основними джерелами, що допомагали виконати поставлену мету, були:
1. Книги з лінійної алгебри, в яких містився матеріал з теорії поліномів.
2. Книги з інформатики та програмування.
3. Курс лекцій, прочитаних в рамках дисциплін «Програмування на мові Сі», «Інформатика», «Структури та алгоритми комп'ютерної обробки даних», «Алгебра і теорія чисел».
Результатом даної курсової роботи став алгоритм генерації поліномів і написана на його основі програма. Дана програма призначена для роботи з цілими числами, хоча алгоритм є дієвим і при роботі з числами, а при деяких його вдосконалення (організації роботи з уявною частиною) і з комплексними. Отже, однією з перспектив розвитку даного алгоритму є його поліпшення для роботи з комплексними числами, а програми - написання її для роботи з усіма числами: цілими, речовими, комплексними.
Так само реально поліпшити тимчасову характеристику алгоритму і програми, якщо після перевірки «не вийшло чи твір або сума коефіцієнтів многочлена» за діапазон типу, якщо все ж таки вихід стався, відразу ж зупинити роботу алгоритму і програми та видати користувачеві повідомлення про помилку.
Щоб більш повно використовувати можливості алгоритму, його краще реалізовувати на тих мовах програмування, у яких типи даних мають досить великі діапазони.
Вирішивши останню завдання, можна відразу вирішити такі завдання, як збільшення значення, що вводиться ступеня генерується полінома та кількості символів, що вводять і буфера.
Не важко помітити, що при перемножуванні дійсних чисел з дробовою частиною кількість цифр у дробовій частині їх твори буде одно, в загальному випадку, сумі кількості символів перемножуваних чисел, тому кількість символів в дробової частини твору при великій кількості символів в дробової частини перемножуваних чисел досить швидко збільшується.
Отже, однією з найсерйозніших проблем при роботі з речовими та комплексними числами постає проблема точності, яку, в принципі на всі сто відсотків дозволити ніколи не вдасться, оскільки програміст завжди буде обмежений в ресурсах, тому уявити речові можна тільки лише з певною точністю, іноді цілком достатньою.
Сподіваюся, що мій досвід в розробці подібних програмних продуктів буде корисний іншим людям, і дана програма з області дослідження при виконанні курсової роботи, за умови, звичайно ж, його удосконалення, вийде у світ як повністю готовий до використання програмний продукт і буде затребуваний не тільки з метою методичних розробок.

Список використаних джерел та літератури
1. КурошА.Г. Курс вищої алгебри / О.Г. Курош. - М.: Наука, 1968. - 431с.
2. Шафаревич І.Р. Основні поняття алгебри / І.Р. Шафаревич. - К.: Іжевська республіканська друкарня, 1999. - 348с.
3. Варден ван дер Б.Л. Алгебра / Б.Л. ван дер Варден. - М.: Наука, 1979. - 623с.
4. Математика. Великий енциклопедичний словник / Гол. ред. Ю.В. Прохоров. - 3-е вид. - М.: Велика Російська енциклопедія, 1998. - 848 с.: Іл.
5. Подбельський В.В. Мова Сі + +: Навчальний посібник. - 5-е вид. / В.В. Подбельський. - М.: Фінанси і статистика, 2003. - 560с.: Іл.
6. Устян А.Є. Методичні матеріали з курсу «Алгебра і теорія чисел» для студентів - державників / А.Є. Устян. - Тула: Тул.гос.пед.ун-т ім. Л.М. Толстого, 1992. - 86с.
7. Зарісскій О. Коммутативная алгебра. Том I / О. Зарісскій, П. Самюель. - М.: Видавництво іноземної літератури, 1963. - 371с.
8. Ленг С. Алгебра / С. Ленг. - М.: Наука, 1999. - 564с.

Додаток
Таблиця тестів
У таблиці наведено результати деяких тестів програми.
Зверніть увагу на те, що в дужках показані некоректно введені дані та повідомлення програми про помилки з проханнями повторити введення.
номер тесту
вхідні дані
вихідні дані
1
2;
1, 2
x ^ 2-3x +2 = 0
2
3;
1, 2, 3
x ^ 3-6x ^ 2 +11-6 = 0
3
10;
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
x ^ 10-10x ^ 9 +45 x ^-120x ^ 7 +210 x ^ 6 -
-252x ^ 5 +210 x ^ 4-120x ^ 3 + 45x ^ 2-10x +1
4
4;
1234, 4321, 23, 32
Стався вихід за діапазон типу
5
2;
999999999, 1
x ^ 2-10000000000x +999999999
6
2;
0, 0
x ^ 2 = 0
7
(-4), (1), 3;
(Q), (), 0, 1, 100
(Введено символ або пробіл повторіть введення), (Введіть ступінь не меншу, ніж 2, і не більшу, ніж 100), (Введено символ або пробіл повторіть введення), (Не було введено значення),
x ^ 3-101x ^ 2 +100 x = 0
8
5;
-1, 1, -2, 2, 0
x ^ 5-5x ^ 3 +4 x = 0
9
10;
0, 1, 2, 3, 4, 5, 6, 7, 8, 9
x ^ 10-45x ^ 9 +870 x ^ 8-9450x ^ 7 +63273 x ^ 6 -
-269325x ^ 5 +723680 x ^ 4-1172700x ^ 3 +
+1026576 X ^ 2-362880x
10
25;
1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1, 2, 3, 4, 5, 6, 7
Стався вихід за діапазон типу
Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Курсова
84.2кб. | скачати


Схожі роботи:
Методи знаходження коренів поліномів
Генерація матриць
Генерація комбінаторних об`єктів
Генерація дидактичних матеріалів з математики
Розробка методичного посібника на тему Генерація простих чисел
Діти індиго Нова генерація людей сучасного соціуму
Аналіз фінансово економічної діяльності Новосибірської НТЕЦ 4 філії Генерація
© Усі права захищені
написати до нас