Програма знаходження центру ваги однорідної усіченої призми
Знаходження центру ваги однорідної усіченої призми за допомогою чисельного методу Монте-Карло. Елементарні операції, які необхідно знати при роботі в середовищі С++. Опис змінних та функцій програми, математичний розв’язок. Результат роботи програми.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | украинский |
Дата добавления | 18.11.2011 |
Размер файла | 3,2 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
СУМСЬКИЙ ДЕРЖАВНИЙ УНІВЕРСИТЕТ
Кафедра моделювання складних систем
КУРСОВА РОБОТА
«Програмування та алгоритмічні мови»
Виконав
Студент Проданов М.В
Група ФЕ-31
Курс
Факультет фізико - технічний
Перевірив
ст. викл. Базиль О.О.
СУМИ 2004р.
Завдання
Знайти центр ваги однорідної усіченої призми, обмеженої координатними площинами та площинами x+y+z = 4, x=1,y=1. Побудувати малюнок.
Вступ
C++ - універсальна мова програмування, задумана так, щоб зробити програмування більш приємним для серйозного програміста. За винятком другорядних деталей C++ є надмножиною мови програмування C. Крім можливостей, що дає C, C++ надає гнучкі й ефективні засоби визначення нових типів. Використовуючи визначення нових типів, що точно відповідають концепціям прикладних програм, програміст може розділяти програму на частини, що легко піддаються контролеві. Такий метод побудови програм часто називають абстракцією даних. Інформація про типи міститься в деяких об'єктах типів, визначених користувачем. Такі об'єкти прості і надійні у використанні в тих ситуаціях, коли їх тип не можна встановити на стадії компіляції. Програмування із застосуванням таких об'єктів часто називають об'єктно-орієнтованим. За правильного використання цей метод дає більш короткі, більш зрозумілі і легше контрольовані програми.
C++ і його стандартні бібліотеки спроектовані так, щоб забезпечувати переносимість. Наявна на даний момент реалізація мови буде йти у більшості систем, що підтримують C. У C++ програмах можна використовувати C бібліотеки, і в C++ можна використовувати велику частину інструментальних засобів, що підтримують програмування на C.
Істотним критерієм при розробці мови була простота; там, де виникав вибір між спрощенням посібника з мови й іншої документації і спрощенням компілятора, вибиралося перше. Величезне значення також надавалося сумісності з C; це перешкодило видалити синтаксис C. По суті справи, основне, чим займається програмування на C++, - це визначення універсальних і спеціально-прикладних типів. Добре розроблений тип, визначений користувачем, відрізняється від убудованого типу тільки способом визначення, але не способом використання.
Як уже відмічалося, C++ була розвинута з мови програмування C і за дуже невеликими виключеннями зберігає C як підмножину. Базова мова C, підмножина C++, спроектована так, що мається дуже близька відповідність між її типами, операціями й операторами і комп'ютерними об'єктами, з якими безпосередньо приходиться мати справу: числами, символами й адресами. За винятком операцій вільної пам'яті new і delete, окремі вирази й оператори C++ звичайно не мають потреби в схованій підтримці під час виконання або підпрограмах.
Одним з первісних призначень C було застосування його замість програмування на асемблері в самих насущних задачах системного програмування. Коли проектувався C++, були прийняті міри, щоб не ставити під погрозу успіхи в цій області. Розходження між C і C++ складається в першу чергу в ступені уваги, що приділяється типам і структурам. C виразний і поблажливий. C++ ще більш виразний, але щоб досягти цієї виразності, програміст повинний приділити більше уваги типам об'єктів. Коли відомі типи об'єктів, компілятор може правильно обробляти вирази, тоді як у противному випадку програмістові довелося б задавати дії з болісними подробицями. Знання типів об'єктів також дозволяє компіляторові виявляти помилки, що у противному випадку залишилися б до тестування. Помітьте, що використання системи типів для того, щоб одержати перевірку параметрів функцій, захистити дані від випадкового перекручення, задати нові операції і т.д., саме по собі не збільшує витрат за часом виконання і пам'яті.
Особлива увага, приділена при розробці C++ структурі, відбилася на зростанні масштабу програм, написаних з часу розробки C. Маленьку програму (менше 1000 рядків) ви можете змусити працювати за допомогою грубої сили, навіть порушуючи всі правила гарного стилю. Для програм великих розмірів це не зовсім так. Якщо програма в 10 000 рядків має погану структуру, то ви знайдете, що нові помилки з'являються так само швидко, як видаляються старі. C++ був розроблений так, щоб дати можливість розумно структурувати великі програми таким чином, щоб для однієї людини не було непомірним справлятися з програмами в 25 000 рядків. Існують програми набагато більших розмірів, однак ті, котрі працюють, у цілому, як виявляється, складаються з великого числа майже незалежних частин, кожна з яких набагато нижче зазначених меж. Природно, складність написання і підтримки програми залежить від складності розробки, а не просто від числа рядків тексту програми, так що точні цифри, за допомогою яких були виражені попередні роздуми, не слід сприймати занадто серйозно. Не кожна частина програми, однак, може бути добре структурована, незалежна від апаратного забезпечення, легко читаєма і т.п. C++ має можливості, призначені для того, щоб безпосередньо й ефективно працювати з апаратними засобами, не турбуючись про безпеку або простоту розуміння. Він також має можливості, що дозволяють ховати такі програми за елегантними і надійними інтерфейсами.
Крім того, оскільки всі нетривіальні програми складаються з великого числа напівнезалежних частин, методи написання таких частин пригодяться і системним, і прикладним програмістам. У когось може з'явитися підозра, що специфікація програми за допомогою більш докладної системи типів приведе до збільшення вихідних текстів програми. У C++ це не так; C++ - програма, що описує типи параметрів функцій, що використовує класи і т.д., звичайно набагато коротше еквівалентної C програми, у якій ці засоби не використовуються.
Що стосується історії С++, то безумовно, мова програмування бере корені головним чином із C. C збережений як підмножина, тому акценту, зробленого в С на засобах низького рівня досить, щоб справлятися із самими насущними задачами системного програмування. C, у свою чергу, багато чим зобов'язаний своєму попередникові BCPL; насправді, коментарі // (заново) введені в C++ з BCPL. Ще одним джерелом натхнення послужила мова Simula67; з неї була запозичена концепція класу (разом з похідними класами і функціями членами). Це було зроблено, щоб сприяти модульності через використання віртуальних функцій. Можливості C++ по перевантаженню операцій і свобода в розташуванні описів скрізь, де може зустрічатися оператори, схожі на Алгол68.
Назва C++ - винахід зовсім недавній (літа 1983го). Більш ранні версії мови використовувалися починаючи з 1980го і були відомі як "C із Класами". Спочатку мова була придумана тому, що автор хотів написати моделі, керовані перериваннями, для чого був би ідеальним Simula67, якщо не брати до уваги ефективність. "C із Класами" використовувався для великих проектів моделювання, у яких строго тестувались можливості написання програм, що вимагають мінімального (тільки) простору пам'яті і часу на виконання. У "C із Класами" не вистачало перевантаження операцій, посилань, віртуальних функцій і багатьох деталей. C++ був уперше введений за межами дослідницької групи автора в липні 1983го; однак тоді багато особливостей C++ були ще не придумані.
Назву C++ видумав Рік Масіті. Назва вказує на еволюційну природу переходу до нього від C. "++" - це операція збільшення в C. Трохи більш коротке ім'я C+ є синтаксичною помилкою; крім того, воно вже було використано для зовсім іншої мови. Знавці семантики C знаходять, що C++ гірше, ніж ++C. Назви D мова не одержала, оскільки вона є розширенням C і в ній не робиться спроб звільнитися від проблем шляхом викидання різних особливостей.
Споконвічно C++ був розроблений, щоб авторові і його друзям не приходилося програмувати на асемблері, C або інших сучасних мовах високого рівня. Основним її призначенням було зробити написання гарних програм більш простим і приємним для окремого програміста. Плану розробки C++ на папері ніколи не було; проект, документація і реалізація рухалися одночасно. Зрозуміло, зовнішній інтерфейс C++ був написаний на C++. Ніколи не існувало "Проекту C++" і "Комітету з розробки C++". Тому C++ розвивався і продовжує розвиватися у всіх напрямках щоб справлятися зі складностями, з якими зустрічаються користувачі, а також у процесі дискусій автора з його друзями і колегами.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
1.2 Додаток до блок-схеми
Умовні позначення:
1 - виведення шапки;
2 - запитання про бажання починати програму;
3 - введення параметрів обмежуючих площин;
4 - перевірка умов існування усіченої призми (13) і (14). Якщо вони виконуються, то програма продовжує роботу;
5 - повідомлення про те, що усічена призма за даних значень параметрів на існує і запит щодо подальшого продовження програми;
6 - ініціалізація генератора випадкових чисел за допомогою функції randomize;
7 - zminna = random (1001);
8 - x = a*0.001*zminna;
9 - y = b*0.001*zminna;
10 - z = (f/c)*0.001*zminna;
11 - z <= (1/c)*(f - k*x - d*y);
12 - запит про бажання (або небажання) користувача щодо створення файлу, у який записуватимуться результати розрахунків;
13 - відкриття файлу „RESULTS”;
14 - виведення у файл „RESULTS” шапки і координат центру ваги хс, ус, zc;
15 - перевірка значень параметрів a, b, c, d, f, k площин. Якщо вони співпадають із заданими за умовою, то похибка чисельного методу обчислюється (оскільки відомий точний розв'язок задачі);
16 - повідомлення про те, що похибку необхідно знайти самостійно:
17 - dxc = 100*(0.472222 - xc)/xc;
18 - dyc = 100*(0.472222 - yc)/yc;
19 - dzc = 100*(1.472222 - zc)/zc;
20 - виведення похибок dxc, dyc, dzc на екран;
21 - виведення похибок dxc, dyc, dzc у файл „RESULTS”;
22 - питання про бажання побачити графічну ілюстрацію розв'язку задачі;
23 - ініціалізація графічного режиму;
24 - корегування масштабу графіка (кількості кроків і пік селів у кроці) в залежності від значень параметрів площин;
25 - побудова осей координат;
26 - виведення заголовку графічної ілюстрації і назв осей координат на екран;
27 - виведення кроку осей на екран;
28 - виведення на екран сторін і назв вершин призми.
Примітка: алгоритм реалізації графічної ілюстрації розв'язку, наведений у роботі, відображає тільки основні кроки, без подробиць, оскільки в противному випадку він є дуже громіздким і не відбиває суті дій, що виконує машина.
2 Опис змінних та функцій програми, математичний розв'язок
2.1 Опис змінних та функцій програми
1) a, b, c, d, f, k - параметри, за допомогою яких задається площина, тобто параметри, що входять у рівняння площин: x=a, y=b, cz+dy+kx=f;
2) x, y, z - допоміжні змінні, що відповідають координатам точок, які знаходяться методом статистичних випробувань;
3) zminna - змінна, якій привласнюється значення, отримане в результаті застосування генератора випадкових чисел;
4) xc, yc, zc - координати центра ваги призми;
5) dxc, dyc, dzc - відносні похибки, зроблені при реалізації методу статистичних випробувань (для заданої призми, тобто для значень параметрів a= b = c = d = k=1, f = 4);
6) nx, ny, nz - кількість потрапивших у заданий інтервал значень відповідно координат x, y, z точок, отриманих в результаті застосування генератора випадкових чисел; змінні nx, ny також використовуються при реалізації графічної ілюстрації розв'язку задачі, в якій їм привласнюються значення координат точки відліку;
7) s - змінна, якій привласнюється значення суми відповідних координат, що попали в заданий інтервал значень, отриманих в результаті застосування генератора випадкових чисел;
8) i - допоміжна змінна, яка використовується в циклах, як крок у циклі:
9) mx, my - змінні, яким при реалізації графічної ілюстрації розв'язку задачі привласнюється значення масштабу відповідно для координатних осей ox та oy;
10) symb - змінна, якій привласнюється значення введеного користувачем символу в тих частинах програми, в яких приймається до уваги бажання (або небажання) користувача щодо реалізаціі деяких дій;
11) userpat - змінна, яка використовується для позначення зразку лінії при застосуванні функції setlinestyle();
12) pk - покажчик на структуру FILE, що використовується при створенні файлу, в який записуються результати роботи програми.
2.2 Математичний розв'язок
2.2.1 Загальна математична модель
Центр ваги твердого тіла - це точка, яка визначається радіус-вектором , що знаходиться за формулою:
= (1)
де М - маса твердого тіла, - радіус-вектор, проведений із початку відліку в довільну точку твердого тіла.
Фактично, знайшовши вектор (його координати), ми знайдемо координати центру ваги твердого тіла, оскільки координати вектора знаходяться як різниця координат кінцевої і початкової точок, а в нашому випадку кінцева точка - це є центр ваги, а початкова - початок відліку О(0;0;0).
Розпишемо радіус-вектори і у вигляді:
= ++ (2)
= ++ (3)
де , , - це орти відповідно осей ox, oy, oz; , , - координати довільної точки твердого тіла; , , - координати центру ваги твердого тіла.
Підставимо (2) і (3) в (1), врахувавши, що =. Отримаємо:
++ =
де V - об'єм твердого тіла. Розбиваємо в останньому виразі інтеграл справа на три інтеграли:
++= () + () + () (4)
Із (4) випливає, що задача знаходження координат центру ваги твердого тіла звелась до знаходження інтегралів справа в (4), які, врахувавши те, що оскільки призма однорідна, то М = ?V, можна представити у виді:
= (5)
= (6)
= (7)
Формули (5) - (7) і є розрахунковими в даній роботі.
2.2.2. Застосування загальної математичної моделі до заданої умови задачі
З формул (5) - (7) випливає, що для знаходження координат центру ваги твердого тіла необхідно знати його об'єм V (фактично область інтегрування). За умовою призма обмежена площинами:
++ = 4 (8)
= 1, =1 (9)
З (8) випливає, що
= 4 - - (10)
Площини = 1, =1 - паралельні відповідно площинам yoz та xoz. Знайдемо точки і лінії перетину площини (10) з координатними осями і площинами:
1) точки перетину з осями ox: A (4;0;0), oy: B(0;4;0), oz: H (0;0;4);
2) рівняння ліній перетину з площинами
xoz: AH: z = - x+4;
xoy: AB: y = - x+4;
yoz: HB: z = - y+4.
Задана за умовою призма ODEFHGPK показана на рисунку 1. Очевидно, що координати вершин призми такі O (0;0;0), D (1;0;0), E (1;1;0), F (0;1;0), H(0;0;4), G (1;0;3), P (1;1;2), К (0;1;3).
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Рисунок 1. Задана призма ODEFHGPK.
В даній роботі не приводиться процес знаходження координат вершин призми, оскільки їх знаходження є елементарним: просто необхідно розв'язати систему рівнянь (8) - (9), поклавши рівними нулю відповідні координати для відповідних площин.
Знаючи значення координат вершин призми, а також за допомогою рисунка 1 ми можемо встановити область інтегрування V.
V: (11)
Тепер знаходимо за формулами (5) - (7) координати центру ваги призми. Будемо використовувати декартові прямокутні координати для яких = dx dy dz . Тоді маємо:
1) з формули (5) = = = = = = = * * = ()| = = ;
2) з формули (6) = = = = = = | = ;
3) з формули (7) = = = = = = = = =
= = = .
Знайдемо об'єм призми за формулою
V = = = = = == = = = .
Підставивши у знайдені вирази для координат центру ваги призми, отримаємо такі значення:
= = ? 0.472222, =? 1.472222
Ми отримали точний розв'язок задачі для заданої призми. Його ми будемо використовувати при знаходженні похибки чисельного методу розв'язку задачі.
2.2.3 Опис чисельного методу розв'язку задачі
Для програмного розв'язку задачі необхідно знайти інтеграли (5) - (7) за допомогою чисельного методу. У даній роботі використовується метод статистичних випробувань (або інша його назва - метод Монте-Карло).
Розглянемо більш загальну задачу знаходження координат центру ваги призми (нехай вона має такі ж самі назви вершин, як і в попередньому випадку), обмеженої координатними площинами, а також площинами x=a, y=b, cz+dy+kx=f. Точки перетину в цьому випадку з осями ox: A (;0;0), oy: B(0;;0), oz: H (0;0;); координати вершин призми ODEFHGPK (знаходяться так же елементарно, як і в попередньому випадку, тому процедуру знаходження теж не приводимо):
O (0;0;0), D (a;0;0), E (a;b;0), F (0;b;0), H (0;0; ), G (a;0;), P (a;b;), K (0;b;).
Рисунок 2
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Рисунок 3. Зображення площини хоу
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
З рисунків 2 і 3 випливає, що усічена призма існує лише у випадку, коли пряма AB не перетинає відрізки DЕ і EF, або якщо точка К на рис. 3 не лежить між точками О та Е. Знайдемо умову існування усіченої призми, яка має вигляд ОК > OE, виражену через параметри, якими задаються площини.
Введемо позначення: < LAK = ?, < AOK = ?. Також ми встановили, що
OB = , OA = , OF = b, OD = a.
? ODE: за теоремою Піфагора OE = (12)
tg(?)= , ? = arctg()
Із геометричного змісту похідної, відомо, що tg(?) дорівнює кутовому коефіцієнту в рівнянні прямої АВ. Рівняння прямої АВ має вид : y = -x, звідки випливає, що tg(?)= - , отже ? = arctg(-).
? OAK: < OAK = 180- ?; за теоремою про суму кутів трикутника <OKA = 180- (< OAK+ <AOK) = 180- (180- ? + ?) = ? - ?. Використаємо теорему синусів =звідки з урахуванням попередніх розрахунків отримаємо:
ОК=ОА ==
Отже умова існування усіченої призми ОК > OE з урахуванням останнього виразу і виразу (12) прийме вигляд:
> (13)
Також необхідно врахувати те, що усічена призма не існує, якщо площина cz+dy+kx=f співпадає з однією з координатних площин. Тобто ще група умов існування уліченої призми має вид:
x0, y0, z0 (14)
Умови (13) і (14) враховуються при написанні програми.
Тепер розглянемо суть методу статистичних випробувань. Як відомо, фізичний зміст потрійного інтегралу
І = (15)
- це маса М тіла об'єму V, якщо функція f(x;y;z) задає густину матеріалу, з якого зроблене це тіло. Це у випадку неоднорідного тіла. У випадку однорідного тіла, якщо відомий об'єм V , то вже ми відмічали, що
М = ? V (16)
У методі Монте-Карло використовується спрощення, що тіло однорідне, і, отже, працює формула (16). Для знаходження об'єму призми проведемо такі процедури: доповнюємо її до паралелепіпеда ODEFG`P`K`H`, де OH = DG`= =EP` = FK` = , G`H = P`K` = OD = EF = a , DE = OF = G`P` = HK` = b (на рисунках паралелепіпед не показаний, бо це не є принциповим). Об'єм цього паралелепіпеда, очевидно дорівнює
V=DE DG` G`H = b a=
Після цього проводимо статистичні випробування: рівномірно заповнюємо паралелепіпед великою кількістю точок N (тобто кожна точка може з однаковою ймовірністю знаходитися у довільній частині паралелепіпеда). Знаходимо точки, що попали всередину призми. Нехай кількість таких точок n. Тоді об'єм призми ODEFHGPK можна знайти як
V? V = (17)
У формулі (16) ? = const. У нашому випадку це не обов'язково так, але ми поступимо таким чином: просто покладемо густину ? рівною середньому значенню функції f(x;y;z) у точках, що попали всередину призми під час статистичних випробувань:
? = (18)
Підставляємо (17) і (18) в (16) і отримуємо наступне:
І = ? = (19)
Врахуємо те, що розрахункові формули (5) - (7) містять об'єм призми ODEFHGPK V. Тому підставимо вирази (17) і (19) у розрахункові формули і отримаємо формули методу статистичних випробувань для розв'язку задачі знаходження центру ваги однорідної призми, обмеженої координатними і заданими площинами:
= (20)
= (21)
= (22)
де x, y, z - це точки, що попали всередину призми під час статистичних випробувань, n - їх кількість.
Необхідно зауважити, що за таких досить грубих припущень у загальних випадках формули Монте-Карло (20) - (22) можуть давати досить значні похибки.
призма центр вага програма чисельний
3. Інструкція користувачу
Розглянемо елементарні операції, які необхідно знати при роботі в середовищі С++.
Запуск старих версій С++ (наприклад, компілятору версії Borland C++ 3.0) зручно проводити за допомогою файлового менеджера (Far, VC і т. д.). Для запуску необхідно відкрити файл bc.exe, що, як правило, розміщується за таким шляхом: „C > BCPP > BIN”. Якщо на комп'ютері встановлена версія компілятора Turbo C++ 3.0, то замість папки BCPP необхідно відкрити папку ТС, а замість файлу bc.exe - tc.exe.
Для запуску версій компіляторів, що мають графічний інтерфейс (наприклад, Borland C++ 5.02) необхідно з меню „Пуск > Програми” вибрати Borland C++ . Для старих версій також можна не використовувати файлового менеджера, а просто знайти на жорсткому диску відповідні папки і файли.
Після проведення однієї з вищенаведених процедури у вікні, що відкрилося, для подальшої роботи необхідно вибрати відповідну команду: New - створення нового файлу, Open - відкриття існуючого файлу. Часто виникає необхідність копіювання файлу С++ (має розширення *.срр) з гнучкого диску на комп'ютер. Для цього необхідно відкрити „Мой компьютер > диск А”, потім скопіювати файл (за допомогою контекстного меню, що з'являється після натиснення правої кнопки миші або іншим способом). Файл також можна скопіювати за допомогою файлового менеджера.
Не рекомендується працювати з файлами на гнучкому диску, попередньо не скопіювавши його на комп'ютер, оскільки іноді виникають помилки при роботі комп'ютера, в результаті яких інформація на дискеті може бути випадково знищена. Тому спочатку необхідно скопіювати файл на жорсткий диск комп'ютера, а потім уже розпочинати роботу.
Для збереження файлу необхідно з меню File вибрати Save або Save as (для перейменування), вказати папку, в якій буде знаходитися файл і зберегти його. При збереженні файлів на дискету рекомендується спочатку зберегти їх на жорсткий диск комп'ютера, а потім уже на дискету знову ж таки через ймовірність виникнення помилок в роботі комп'ютера.
Якщо необхідно розпечатати *.срр файл, то для старих версій компіляторів цей файл необхідно перевести в текстовий формат. Це можна зробити декількома способами:
1) змінити розширення файлу з срр на txt (навести курсор миші на файл, натиснути праву кнопку миші, у вікні, що відкрилося, вибрати „Свойства - Изменить” і вибрати із списку програм будь-який текстовий редактор, наприклад Microsoft Word);
2) якщо в контекстному меню є опція „Открыть с помощью”, То відкрити за допомогою будь-якого текстового редактора;
3) відкрити текстовий редактор, а в ньому відкрити *.срр файл;
4) у файлі *.срр виділити текст, скопіювати його в буфер обміну (за допомогою комбінацій клавіш Ctrl+Insert, а в нових версіях також Ctrl+C), а потім вставити текст із буфера в текстовий редактор (Shift+Insert або Ctrl+V).
Розглянемо роботу в середовищі С++. Для цього розглянемо основні гарячі клавіши:
Ctrl+F9 - запуск програми на компіляцію;
Alt+F5 - виведення на екран результатів роботи програми;
F4 - виконання програми до поточного розташування курсору;
F2 - збереження файлу (у версії 3.0);
Alt+Х - вихід із середовища С++;
Shift+Del - вирізати;
Alt+F7 - показати попередню помилку;
Alt+F8 - показати наступну помилку.
Необхідно зауважити, що при перенесенні програми з одного комп'ютера на інший можуть виникати помилки через те, що на іншому комп'ютері файли або папки, необхідні для роботи програми, не існують або мають іншу назву. Це може статися, наприклад, якщо в програмі виконуються операції з файлами або з графікою. Наприклад, у даній роботі драйвер, необхідний для роботи графічного режиму, знаходиться за шляхом, С:\\ТС\\BGI”. Тому якщо на іншому комп'ютері встановлена версія компілятора не Turbo C++ 3.0, а Borland C++ 3.0, то шлях розміщення драйвера необхідно змінити на „С:\\ВСРР\\ BGI”. Необхідно мати на увазі, що існує багато таких нюансів.
Що стосується даної роботи, то необхідно зауважити, що файл, в якому міститься текст програми, має ім'я “CURSOVA”.
Вищенаведеної інформації цілком достатньо для роботи у середовищі С++.
4 Програма
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<graphics.h>
#include<dos.h>
#include<stdlib.h>
#include<time.h>
# define N 10000
void main()
{
clrscr();
FILE *pk;
float a,b,c,d,f,k,x,y,z,zminna;
float xc,yc,zc,s,dxc,dyc,dzc;
int i,nx,ny,nz,mx,my;
char symb;
textcolor(13);
cprintf("\n\n\n\n\n\n The term paper\n");
cprintf("\n\r made by the student of the group FE-31\n");
cprintf("\n\r Prodanov Mykola Victorovich\n");
delay(7000);clrscr();
textbackground(1);
textcolor(RED);
cprintf(" This program helps to find coordinates");
cprintf("\n\r of the centre of mass of the truncated prism,");
cprintf("\n\r confined by planes: ");
textcolor(1);
textbackground(7);
cprintf("\n\n\r x=0, y=0, x=a, y=b, cz+dy+kx=f,");
textbackground(1);
textcolor(14);
cprintf("\n\n\r using the Monte-Carlo's method\n");
textcolor(12);
textbackground(BLACK);
cprintf("\n\r Let's start y/n\n");
scanf("%c",&symb);
if(symb=='n') exit(0);
textcolor(GREEN);
cprintf("\n\rPut the parameters of planes:\n");
label:
cprintf("\n\r a=");
scanf("%f",&a);
cprintf("\n\r b=");
scanf("%f",&b);
cprintf("\n\r c=");
scanf("%f",&c);
cprintf("\n\r d=");
scanf("%f",&d);
cprintf("\n\r k=");
scanf("%f",&k);
cprintf("\n\r f=");
scanf("%f",&f);
/*checking the condition of existing
of the truncated plane (13),(14)*/
if(((f/k)*sin(atan(-k/d))/sin(atan(-k/d)-atan(b/a))<=sqrt(a*a+b*b))||(x==0)||(y==0)||(z==0))
{
cprintf("\n\n\r The task doesn't have the solving,");
cprintf("\n\r because the prism doesn't exist");
cprintf("\n\r You have to put another parameters of planes");
cprintf("\n\r Would you like to do this? y/n");
scanf("%c",&symb);
if(symb=='n') exit(0);
else goto label;
}
//the beginning of calculation
// the integral (5) is found below
s=0;
nx=0;
randomize();
for(i=1;i<=N;i++)
{
zminna=random(1001);
x=a*0.001*zminna;
nx+=1;
s=s+x;
}
xc=s/nx;
//the integral (6) is found below
s=0;
ny=0;
randomize();
for(i=1;i<=N;i++)
{
zminna=random(1001);
y=b*0.001*zminna;
ny+=1;
s=s+y;
}
yc=s/ny;
// the integral (7) is found below
s=0;
nz=0;
randomize();
for(i=1;i<=N;i++)
{
zminna=random(1001);
x=a*0.001*zminna;
y=b*0.001*zminna;
z=(f/c)*0.001*zminna;
if(z<=(1/c)*(f-k*x-d*y))
{
nz+=1;
s=s+z;
}
}
zc=s/nz;
textcolor(5);
cprintf("\n\n\rThe results of calculatings:\n");
cprintf("\n\r xc=%f",xc);
cprintf("\n\r yc=%f",yc);
cprintf("\n\r zc=%f",zc);
textcolor(10);
cprintf("\n\n\rWould you like the program to creat a file");
cprintf("\n\rwhere results of calculations will be put? y/n\n");
symb=getche();
if (symb=='y')
{
//opening of the file where the results of calculations we'll put
if((pk=fopen("C:\\Results.txt","w"))==NULL)
cprintf("\n\n\rOpening error");
fprintf(pk," The results of solving the task");
fprintf(pk,"\n\n The coordinates of the centre of mass of the truncated prism");
fprintf(pk,"\n\n xc=%f",xc);
fprintf(pk,"\n yc=%f",yc);
fprintf(pk,"\n zc=%f",zc);
}
if((a==1)&&(b==1)&&(c==1)&&(d==1)&&(k==1)&&(f==4))
{
textcolor(RED);
cprintf("\n\n\rRelative accurasy:\n");
dxc=100*(0.472222-xc)/xc;
dyc=100*(0.472222-yc)/yc;
dzc= 100*(1.472222-zc)/zc;
if(dxc<0) dxc=dxc*(-1);
if(dyc<0) dyc=dyc*(-1);
if(dzc<0) dzc=dzc*(-1);
cprintf("\n\r dxc=%.2f\%",dxc);
cprintf("\n\r dyc=%.2f\%",dyc);
cprintf("\n\r dzc=%.2f\%",dzc);
if (symb=='y')
{
fprintf(pk,"\n\nRelative accurasy:");
fprintf(pk,"\n\n dxc=%f\%",dxc);
fprintf(pk,"\n dyc=%f\%",dyc);
fprintf(pk,"\n dzc=%f\%",dzc);
}
}
else
{
textcolor(14);
cprintf("\n\n\rif you want to know the relative accurasy");
cprintf("\n\rof calculations, find it yourself");
}
textcolor(12);
cprintf("\n\n\rWould you like to see the graphical");
cprintf("\n\rillustration of solving the task? y/n\n");
symb=getche();
if (symb=='n') exit(0);
//the graphical illustration of solving of the task
cprintf("\n\n\rWait for some seconds and ");
cprintf("\n\rthen you'll see the graphical illustration");
cprintf("\n\rof solving the task");
delay(7000);
int gdriver=DETECT;
int gmode,n;
initgraph(&gdriver,&gmode,"C:\\TC\\BGI\\");
nx=300;
ny=300;
/*below there is a correlation of the scale
of the graphic depending on the input parameters */
if(((f/c)<=6)&&((f/c)>=4)||((f/c)<=0)&&((f/c)>=-4))
{
mx=40;
my=40;
n=7;
}
if(((f/c)>6)&&((f/c)<12))
{
mx=15;
my=15;
n=11;
}
else if(((f/c)<4)&&((f/c)>0))
{
mx=80;
my=80;
n=4;
}
else if(((f/c)>12)&&((f/c)<=19))
{
mx=10;
my=10;
n=20;
}
else if(((f/c)>19)&&((f/c)<=80))
{
mx=5;
my=5;
n=81;
}
int userpat=4;
setcolor(WHITE);
setlinestyle(DOTTED_LINE,userpat,1);
line(300,ny,300+b*mx,ny); //dotted part of the axe ox
setlinestyle(SOLID_LINE,userpat,1);
line(300+b*mx,ny,600,ny); //solid part of the axe ox
setlinestyle(SOLID_LINE,userpat,1);
line(nx,10,nx,ny-(f/c)*my); //solid part of the axe oy
setlinestyle(DOTTED_LINE,userpat,1);
line(nx,ny-(f/c)*my,nx,ny); //dotted part of the axe oy
setlinestyle(DOTTED_LINE,userpat,1);
line(nx,ny,nx-a*mx/2,ny+a*my/2); //dotted part of the axe oz
setlinestyle(SOLID_LINE,userpat,1);
line(nx-a*mx/2,ny+a*my/2,nx-(n+1)*mx/2,ny+(n+1)*my/2);//solid part of the axe oz
//titles of graphic and axes
moveto(400,4);
setcolor(RED);
outtext("Graphical illustration");
setcolor(10);
moveto(nx-10,10);
outtext("z");
moveto(600,ny+5);
outtext("y");
moveto(nx-(n+1)*mx/2+5,ny+(n+1)*my/2+1);
outtext("x");
//scale of the axe ox
setcolor(RED);
for(i=0;i<=n;i++)
line(nx+i*mx-1,ny,nx+i*mx+1,ny);
if((a==1)&&(b==1)&&(c==1)&&(d==1)&&(k==1)&&(f==4))
{
setcolor(10);
outtextxy(nx+mx,ny-10,"1");
outtextxy(nx+2*mx,ny-10,"2");
outtextxy(nx+3*mx,ny-10,"3");
outtextxy(nx+4*mx,ny-10,"4");
outtextxy(nx-10,ny-my,"1");
outtextxy(nx-10,ny-2*my-1,"2");
outtextxy(nx-10,ny-3*my-1,"3");
outtextxy(nx-10,ny-4*my-1,"4");
outtextxy(nx-mx/2-5,ny+my/2-7,"1");
outtextxy(nx-2*mx/2-5,ny+2*my/2-7,"2");
outtextxy(nx-3*mx/2-5,ny+3*my/2-7,"3");
outtextxy(nx-4*mx/2-5,ny+4*my/2-7,"4");
}
//scale of the axe oy
setcolor(RED);
for(i=0;i<=n;i++)
line(nx,ny-i*my-1,nx,ny-i*my+1);
//scale of the axe oz
setcolor(RED);
for(i=0;i<=n;i++)
line(nx-i*mx/2+1,ny+i*my/2-1,nx-i*mx/2-1,ny+i*my/2+1);
//plotting the prism
//side DG
setcolor(GREEN);
line(nx-a*mx/2,ny+a*my/2,nx-a*mx/2,ny+a*my/2-my*(f-k*a)/c);
//point D
setcolor(13);
moveto(nx-a*mx/2,ny+a*my/2+7);
outtext("D");
//point G
moveto(nx-a*mx/2-10,ny+a*my/2-my*(f-k*a)/c);
setcolor(13);
outtext("G");
//side DE
setcolor(GREEN);
line(nx-a*mx/2,ny+a*my/2,nx-a*mx/2+b*my,ny+a*my/2);
//point E
moveto(nx-a*mx/2+b*my,ny+a*my/2+5);
setcolor(13);
outtext("E");
//side EF
setcolor(GREEN);
line(nx-a*mx/2+b*my,ny+a*my/2,nx+b*mx,ny);
//point F
moveto(nx+b*mx+5,ny+5);
setcolor(13);
outtext("F");
//side EP
setcolor(GREEN);
line(nx-a*mx/2+b*my,ny+a*my/2,nx-a*mx/2+b*my,ny+a*my/2-(1/c)*(f-b*d-k*a)*my);
//point P
moveto(nx-a*mx/2+b*my+5,ny+a*my/2-(1/c)*(f-d*b-k*a)*my);
setcolor(13);
outtext("P");
//side FK
setcolor(GREEN);
line(nx+b*mx,ny,nx+b*mx,ny-my*(f-b*d)/c);
//point K
moveto(nx+b*mx+5,ny-my*(f-b*d)/c);
setcolor(13);
outtext("K");
//side KP
setcolor(GREEN);
line(nx+b*mx,ny-my*(f-b*d)/c,nx-a*mx/2+b*my,ny+a*my/2-(1/c)*(f-b*d-k*a)*my);
//side GP
setcolor(GREEN);
line(nx-a*mx/2,ny+a*my/2-my*(f-k*a)/c,nx-a*mx/2+b*my,ny+a*my/2-(1/c)*(f-b*d-k*a)*my);
//side GH
setcolor(GREEN);
line(nx-a*mx/2,ny+a*my/2-my*(f-k*a)/c,nx,ny-(f/c)*my);
//point H
moveto(nx+6,ny-(f/c)*my-7);
setcolor(13);
outtext("H");
//side KH
setcolor(GREEN);
line(nx+b*mx,ny-my*(f-b*d)/c,nx,ny-(f/c)*my);
// point C
setcolor(RED);
line(nx-a*xc*mx/2+yc*my-3,ny+a*yc*my/2-zc*my,nx-a*xc*mx/2+yc*my+3,ny+a*yc*my/2-zc*my);
line(nx-a*xc*mx/2+yc*my,ny+a*yc*my/2-zc*my-3,nx-a*xc*mx/2+yc*my,ny+a*yc*my/2-zc*my+3);
moveto(nx-a*xc*mx/2+yc*my-1-4,ny+a*yc*my/2-zc*my-13);
outtext("C");
//point O
moveto(nx+7,ny-13);
setcolor(13);
outtext("O");
getch();
closegraph();
}
5. Результат роботи програми
У даному розділі розглядаються результати роботи програми тільки для параметрів, заданих за умовою.
Спочатку програма виводить на екран повідомлення, що має вигляд:
The term paper
made by the student of the group FE-31
Prodanov Mykola Victorovich
Після деякої затримки екран очищується і програма починається із заголовка, що має вигляд:
This program helps to find coordinates
of the centre of mass of the truncated prism,
confined by planes:
x=0, y=0, x=a, y=b, cz+dy+kx=f,
using the Monte-Carlo's method
Let's start y/n
y
Put the parameters of planes:
a=1
b=1
c=1
d=1
k=1
f=4
The results of calculatings:
xc=0.500391
yc=0.500391
zc=1.329947
Would you like the program to creat a file
where results of calculations will be put? y/n
y
Relative accurasy:
dxc=5.63%
dyc=5.63%
dzc=10.70%
Would you like to see the graphical
illustration of solving the task? y/n
y
Wait for some seconds and
then you'll see the graphical illustration
of solving the task
Як і очікувалось, метод Монте-Карло дав досить великі похибки: 5.63% і 10.70%. Але зрозуміло, що ці результати можуть дещо змінюватись і при незмінних параметрах площин (пропонуємо перевірити це самостійно), оскільки в програмі використовується генератор випадкових чисел.
Вищенаведені результати відповідають випадку коли користувач згодився на те, щоб створювався файл, у який будуть поміщатися результати роботи програми, а також виявив бажання продивитись графічну ілюстрацію розв'язку задачі.
Також можна зауважити, що на початку програми користувачеві пропонується погодитися (або не погодитися) на продовження роботи програми. У разі натиснення клавіші “y” програма продовжує роботу, а в разі натиснення “n” відбувається вихід із програми. Аналогічна альтернатива існує і після проведення обчислень, коли користувачеві пропонується проглянути графічну ілюстрацію розв'язку задачі (після згоди на це має місце невелика затримка і попередження про цю затримку), а також коли пропонується створити файл, у якому будуть міститися результати обчислень (ім'я файлу - „RESULTS”).
Іще необхідно додати, що якщо значення параметрів відрізняються від заданих за умовою, то в разі, якщо вони задовольняють умовам існування призми (13) і (14), то програма проводить обчислення, також ілюструє розв'язок графічно (графік є коректним лише для призм, що знаходяться в першій чверті системи координат), але похибку пропонує знайти самостійно, оскільки для цього необхідно обчислити точні значення за формулами (5) - (7). Також, якщо параметри не задовольняють умовам існування призми (13) і (14), то програма повідомляє про помилку і пропонує або заново ввести параметри площин, або завершити роботу.
Графічна ілюстрація розв'язку задачі показана на рисунку 4.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Рисунок 4. Графічна ілюстрація розв'язку задачі
Висновок
Виконавши роботу, я розв'язав задачу знаходження центру ваги однорідної усіченої призми аналітично і за допомогою чисельного методу Монте-Карло, а також виконав програмну реалізацію чисельного розв'язку за допомогою мови програмування С++.
Можливості складеної програми:
1). повертає чисельні значення координат центру ваги усіченої призми, заданої користувачем шляхом введення параметрів обмежуючих площин x =a, y = b, cz + dy + kx = f;
2). повертає похибку, отриману в результаті застосування наближеного чисельного методу, для заданої за умовою призми (тобто для значень параметрів a = b = c =d =k =1, f =4). Для інших значень параметрів програма пропонує знайти похибку самостійно;
3). у разі, якщо введені параметри не задовольняють умовам існування усіченої призми (13) і (14), програма виводить повідомлення про необхідність введення інших значень параметрів і запитує в користувача про бажання (або небажання робити це);
4). в залежності від бажання користувача створює файл з ім'ям “RESULTS”, у який записуються результати обчислень;
5). реалізує графічну ілюстрацію розв'язку задачі: на екран виводиться задана призма, побудована в декартовій прямокутній системі координат oxyz, а також центр ваги цієї призми (точка С).
Необхідно зауважити, що алгоритм програми має усі властивості алгоритмів. Але важливо пам'ятати, що властивість масовості в даному разі має досить велику обмеженість, оскільки обчислюються координати центру ваги тільки усіченої призми, обмеженої координатними і заданими площинами, параметри яких задовольняють умовам (13) і (14). У випадку призм, обмежених іншими площинами програма буде повертати невірні значення (якщо взагалі буде їх повертати). Що стосується графічної ілюстрації, то масовість алгоритму у цьому випадку ще вужче, і програма працює коректно лише для призм, що лежать у першій чверті координатного простору (для інших розташувань призми програма значно ускладнюється, і їх розгляд не вимагається за умовою задачі).
Результати роботи програми можуть бути корисними у задачах, пов'язаних із знаходженням координат центру ваги усіченої призми. Але необхідно пам'ятати, що метод статистичних випробувань що застосовується в програмі, дає досить значні похибки (5 - 15 %), тому результати роботи програми не рекомендується використовувати в задачах, у яких вимагається висока точність розрахунків.
Список використаних джерел
1. http://www.citmgu.ru
2. http://cpp3.virtualave.net/cpp3comm/toc
3. Громов Ю.Ю.,Татаренко С.И. Программирование на языке СИ: Учебное пособие. - Тамбов,1995.- 169 с.
4. Конспект лекцій з програмування.
5. Конспект лекцій з обчислювальної математики.
Размещено на Allbest.ru
Подобные документы
Побудування блок-схеми рішення завдання зі знайдення центра ваги однорідної усіченої призми. Розробка програми за допомогою язика програмування C++, опис змінних та функцій програми та загальної математичної моделі. Розробка інструкції користувача.
курсовая работа [1,1 M], добавлен 04.01.2012Розв’язання нелінійних алгебраїчних рівнянь методом хорд. Опис структури програмного проекту та алгоритмів розв’язання задачі. Розробка та виконання тестового прикладу. Інші математичні способи знаходження коренів рівнянь, та опис виконаної програми.
курсовая работа [4,1 M], добавлен 28.09.2010Створення програми розв’язку розгалужених прикладів. Типи комп'ютерів та пристроїв, що використовуються при роботі програми. Попередня підготовка вхідних даних. Формат, описання та спосіб їх кодування. Опис і тестування програми, її виклик і завантаження.
курсовая работа [150,3 K], добавлен 01.04.2016Знаходження площі фігури методом трапеції. Обчислення площ криволінійних трапецій. Геометричний сенс чисельника. Розробка програми для демонстрації нижчезазначеної математичної функції. Використання базових бібліотек класів, написаних на мові С++.
курсовая работа [1,0 M], добавлен 24.12.2013Призначення ігрової програми "Змійка" для розвитку уваги та логічного мислення гравців. Розробка програми в середовищі C++ Builder 6, її функціонування в ОС Windows. Опис алгоритму та основних функцій програми. Основні переваги та недоліки мови С++.
реферат [1,7 M], добавлен 17.12.2014Програма клавіатурний тренажер. Застосування C++ BUILDER для створення інтерфейсних програм. Опис VCL компонентів. Робота з графікою GDI. Опис роботи та лістинг програми. Результат роботи програми. Інтегроване середовище розробки. Компоненти закладок.
курсовая работа [2,7 M], добавлен 24.03.2009Розробка програми для вирішення графічної задачі. При вирішенні задачі необхідно cтворювати програму у середовищі програмування Turbo Pascal. Розробка алгоритму функціонування програми і надання блок-схеми алгоритму. Демонстрація роботи програми.
курсовая работа [1,3 M], добавлен 23.06.2010Основні теоретичні відомості про метод знаходження значення функції у міжвузловій точці за допомогою інтерполяційної формули Бесселя та приклад його застосування. Розробка алгоритму за даним методом. Опис програми, лістинг та результати тестування.
курсовая работа [70,3 K], добавлен 03.12.2009Методи, засоби та алгоритми розв'язування задачі. Розробка інтерфейсу програми для забезпечення діалогу: ком'ютер - користувач при роботі з базою даних довідкової системи навчальних закладів. Програма та її опис, призначення. Логічна структура програми.
курсовая работа [234,8 K], добавлен 14.03.2010Загальна характеристика методів проектування та документації додатків. Розробка інтерфейсу програми для медичного діагностичного центру. Вибір архітектури. Описання логічної структури програми. Розробка структури бази даних проекту, полів таблиць.
курсовая работа [2,0 M], добавлен 21.08.2015