Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пояснювальна записка Кузнецов Костянтин.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
453 Кб
Скачать
☆

Розділ 1 Формулювання умови задачі, вихідні дані та креслення геометричної фігури

Умова задачі: У трикутнику (рис.1) задано сторони a, с та периметр P. Обчислити та вивести всі інші елементи трикутника, площу S.

Вихідними даними є значення двох сторін а, с та периметру Р.

Розрахункові формули та пояснення щодо способу вирішення завдання та хід розв’язання

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

Отже, знайшовши третю сторону, можна обчислити площу трикутника за трьома сторонами. Для цього скористаюся формулою Герона:

, де р – півпериметр, або Р/2

Зі знайденою площею можна знайти й висоту. Для цього є формула:

, звідки . Таким чином, можна знайти й дві інші висоти.

Також можемо знайти й кути. Для цього скористуємося теоремою косинусів:

Ще один спосіб знаходження кутів:

Але цей спосіб небажаний, бо синус може приймати однакові значення на різних кутах (наприклад, 60 та 120). З косинусом такого не буде, бо в різних чвертях (1 та 2, можливі у трикутнику) він приймає різні знаки. Також треба відмітити й те, що знайдене значення буде показано в радіанах. Для переводу його в градуси, домножемо знайдений кут на 180 і поділемо на

Розділ 2 Обчислення з поясненнями параметрів заданої фігури для довільних вихідних даних (засобами MathCad)

Створено файл MathCad (.xcmd). Перед тим, як написати виведені формули, було введено відомі змінні, а саме: а, с, Р. Цим змінним було присвоєно випадкові значення, але логічні у плані розгляду трикутника. Було розглянуто окремий випадок – єгипетський трикутник, бо само в ньому найлегше перевірити правильність своїх розрахунків.

Інтерфейс програмного середовища MathCad досить нескладний і зрозумілий інтуїтивно. Для того, щоб почати роботу, треба навести курсор на потрібне місце та почати вводити значення. Для того, щоб задати змінній певне значення, потрібно скористатися комбінацією клавіш Shift+; (укр. – Шифт + Ж).

Майже всі значення єгипетського трикутника розраховуються усно, тому я мав можливість перевірити введені формули. Всі значення отримані коректно.

Для того, щоб змінити вхідні значення, треба зробити подвійне натискання на одному (або декількох) значень и власноруч задати нові. Але потрібно бути уважним: периметр, третя задана величина, не повинен бути менше ніж сума перших двох сторін. Він також не повинен дорівнювати їм.

Щоб побачити грецьку символіку (символи альфа, бета, гама і т.і.), потрібно скористатися чергою команд «Вид – Панель инструментов – Греческий».

Розділ 3 Опис програмного продукту

Створена у середовищі Borland C++ програма розраховує невідомі елементи трикутника (а саме – третю сторону, площу, висоту та кути) за двома уведеними за клавіатури сторонами та периметром. Після цього програма креслить цю фігуру з відповідними параметрами. Отже:

Створення програми почалося з створення нового файлу (.СРР). Для цього потрібно виконати команду File/New. Наступним кроком йде підключення бібліотек. У мові програмування C++ термін Бібліотека означає колекцію класів і функцій, написаних базовою мовою. Бібліотека підтримує кілька основних контейнерів, функцій для роботи з цими контейнерами, об'єктів-функції, основних типів рядків і потоків (включаючи інтерактивний і файловий ввід-висновок), підтримку деяких мовних особливостей, і часто використовувані функції для виконання таких завдань, як, наприклад , знаходження квадратного кореня числа. Отже, до програми було підключено шість бібліотек, а саме:

1. stdio.h. заголовний файл стандартної бібліотеки мови Сі, що містить визначення макросів, констант та оголошення функцій і типів, що використовуються для різних операцій стандартного введення і виведення. Функції у програмі: printf i scanf

2. conio.h - заголовний файл для роботи з текстовим екраном. В створеній програмі використовуються такі функції: getch, clrscr, window, cprintf, gotoxy, textbackground, textcolor.

3. stdlib.h - заголовний файл стандартної бібліотеки мови Сі, який містить в собі функції, які займаються виділенням пам'яті, контроль процесу виконання програми, перетворення типів та інші.

4. math.h - заголовний файл стандартної бібліотеки мови програмування С, розроблений для простих математичних операцій. Функції у програмі: pow, sqrt, acos.

5. graphics.h - заголовний файл, що використовується для роботи з графічним режимом. Функції у програмі: initgraph, closegraph, clearviewport, setbkcolor,setcolor,setlinestyle, line, outtextxy.

6. time.h - заголовний файл стандартної бібліотеки мови програмування С, що містить типи і функції для роботи з датою і часом. З її допомогою використовується функції clock, спеціальний тип змінних clock_t та макрос CLK_TCK.

Функція KKU(char ch) відповідає за горизонтальні грані таблиці, що будуть відображені у вигляді зірок (ch=*). Сама абревіатура – ініціали ПІБ виконавця. Наступний крок – функція main() (точка входу в програму) та саме тіло програми.

Функція clrscr() (функція для очищення екрана, що викликається бібліотекою <conio.h>) зафарбовує екран відповідним кольором (за умовчанням – чорним). Далі в тілі програми визначаються всі змінні, що надалі будуть використовуватися. Змінним, що відповідають параметрам трикутника, треба надати тип float (бо кожен елемент трикутника може бути дробовим числом). Всі ідентифікатори відображені в тілі програми, їх введення здійснюється з клавіатури. Наступні ідентифікатори start та end введені для знаходження часу виконання програми. Вони використовуватися функцією clock().

Наступна функція start=clock() розпочинає відлік часу на здійснення програми.

Функція printf() – функція введення та виведення (підключається бібліотекою <stdio.h>). За допомогою цієї функції можна вивести на екран монітора рядок символів, число, значення змінної тощо. Вона була використана для введення значень, що набувають елементи трикутника. Згідно з синтаксисом, бажаний текст набирається в лапках, а перед ним (чи після нього) ставиться \n – перехід на нову строку.

Функція scanf() – зчитування. Вона зчитує введені дані для їх подальшого використання. Символи %f в операторі означають, що дана змінна набуває типу значення float. В конкретному випадку всі значення, окрім першого, набувають цього типу значення.

Наступним кроком треба перевірити існування трикутника. Його периметр не може бути менше або дорівнювати суми двох введених сторін. Також жодна введена сторона не має бути менше нуля та більше суми двох інших сторін. Для цього в коді програми було використано оператор умовного переходу if. Оператор || - це умова І (також, одночасно). Сам оператор if працює наступним чином: if(умова) {наслідки}, тому наслідках я скористався операторами printf та goto. Перший виводить повідомлення про помилку (початковий символ \n, як вже було зазначено, означає перехід на нову строку). Другий – переводить користувача в зазначене місце, в конкретному випадку – в умову введення елементів трикутника. Отже, якщо хоча б одна з шести умов буде відповідати, програма поверне користувача до моменту вводу даних. Якщо ж жодна з умов не виконується, програма починає обчислювати значення інших елементів трикутника.

Для того, щоб програма могла зчитувати елементарні математичні дії (корінь та степінь), треба підключити бібліотеку math.h. За допомогою цієї бібліотеки було обчислено площу трикутника: S=sqrt(p*(p-a)*(p-b)*(p-c)) (формула Герона), де sqrt – квадратний корінь, р – півпериметр, або Р/2. Останньої змінної можна було й уникнути, увівши Р/2 безпосередньо у головну формулу, але вона значно полегшує введення. р=Р/2 було введено до обчислення загальної формули.

Наступним кроком – пошук висот. Трикутник має три висоти, але для того, щоб не відбувалось нагромадження, на графіку була відображена лише одна.

Для того, щоб відшукати кути, була задіяна теорема косинусів. Щоб піднести число у степінь, потрібно представити його у такому вигляді: pow(a,x), де а – число, х – степінь. Щоб знайти арккосинус – acos, але значення, що надається у дужках, не переведено в градуси. Тому останньою дією треба помножити знайдене значення на 180 та розділити на Пі (останній на мові програмування виглядає як макрос M_PI).

Далі – координати вершин трикутника. Вони знадобляться для графічного відображення фігури. Точка відліку – вершина А (100,350). Координати взяті довільні. Координати точки В: xb=xa+a*cos(C*M_PI/180), yb=ya-a*sin(C*M_PI/180). Тобто до координат ха (в моєму випадку – 100) було прибавлено значення a*cos(C*M_PI/180) (що є одним з катетів уявного прямокутного трикутника), а від координат уа віднімаємо (тому що лінія прямує наверх) значення a*sin(C*M_PI/180) (що є другим катетом уявного прямокутного трикутника). Для того, щоб програма зчитувала синус не в радіанах, а в градусах, було здійснено переведення у вигляді *M_PI/180. Координати останньої точки: xc=xa+b; yc=ya. Це горизонтальна пряма, основа трикутника, тому значення у в неї не зміниться (залишиться таким же, як і в точці відліку), а к координаті точці ха потрібно прибавити довжину знайденого відрізка b. Також на графіку було відображено одну з трьох висот, тобто ту, яка є паралельно осі у. Вона перетинає основу у точці М, координати якої мають наступний вигляд: xm=xa+a*cos(C*M_PI/180); ym=ya. Ось у залишається незмінною, а х такі ж самі, як і в точці, з якої висоту й було опущено.

Для того, щоб вивести дані на екран, я зробив окреме вікно функцією window(х1,у1,х2,у2), де х1 – координати початкової точки по осі х, у1 - координати початкової точки по осі у, х2 - координати кінцевої точки по осі х, у2 - координати кінцевої точки по осі у. В даному випадку вікно було створено таким чином, щоб не перекривати введені дані. Для того, щоб зафарбувати таблицю певним кольором, була задіяна функція clrscr() і зазначено, якими саме кольорами потрібно зафарбовувати виділену область. Отже:

window(40,1,80,25) ; – вікно з координатами початкової точки (40,1) та кінцевої (80,25) (слід відмітити, що таблиця, в зв’язку зі своєю довжиною, розташована не в центрі, а з правого боку),

textbackground(BROWN); - колір заднього фону,

textcolor(CYAN); - колір тексту,

clrscr(); - власне зафарбування.

Виведення результату відбувається наступним чином: після кожного виведення на екран отриманого значення, програма передає керування функції користувача KKU() (оголошується після підключення бібліотек). Згідно варіанту параметром, що передається функції, є символ «=». Виклик цієї функції в тілі програми відбувається командою KKU('='). При визначенні функції користувача вона записується так само, як і при оголошенні, але в цьому випадку не ставиться крапка з комою наприкінці. Цією функцією потрібно вивести горизонтальні лінії таблиці, тому для цього було використано оператор циклу for, тобто:

{int i;

for(i=0;i<40;i++)cprintf("%c",ch);return 0;}

де і – лічильник циклу. Отже від значення 0 до 40 з шагом 1 функція буде заповняти потрібним символом, в даному випадку – символом «=», де і – лічильник циклу. Значення 40 – пораховане значення, тобто оптимальна кількість символів «=». %c – тип значення char (знаковий тип), return 0 – повернення значення в головну функцію.

KKU(‘=’) - функція користувача, верхня границя таблиці, в якій виводитимуться результати. В текстовому вікні функцією виводу є функція cprintf(), за допомогою якої був створений рядок Rezul`tat. Також у керуючому рядку функції були використані символи \r та \n – початок нового рядка.

Для того, щоб таблиця була рівна, треба дотримати однакову кількість символів у кожному рядку. Недостаючи символи заповнюються пробілами. Далі програма виводить на екран чергову межу таблиці через функцію KKU(‘=’). Почергово виводяться знайдені значення. Для всіх змінних специфікатором формату було обрано 8.2f, тобто 8 комірок для цілої частини та 2 для дробової. В списку аргументів – змінні, що відповідають певним значенням.

Функція end=clock() зупиняє таймер лічильника виконання роботи. Це є кінцевим викликом функції clock(), що повертає час. Щоб дізнатися час виконання, треба скористуватися функцією cprintf("\r\nChas vykonannja roboty: %4.2f sekund",(end-start)/(CLK_TCK)), де CLK_TCK – спеціальний макрос, що визначає кількість годин у секундах. Для того, щоб завершити роботу в текстовому режимі, була використана функція getch().

Для того, що б програма малювала заданий трикутник, було встановлено драйвер графічного пристрою. Отже:

int driver=DETECT,gmode,errorcode; - визначення оптимального графічного режиму,

initgraph(&driver,&gmode,"C:\\BORLANDC\\BGI"); - зчитування відповідного драйвера та визначення маршруту до його директорії.

setbkcolor(MAGENTA); - колір заднього фону, в моєму випадку – MAGNETA, або темно-рожевий,

clearviewport(); - переміщує курсор у верхній лівий кут,

setcolor(LIGHTBLUE); - встановлює колір тексту (світло-голубий).

setlinestyle(SOLID_LINE,1,NORM_WIDTH); перший аргумент означає, що лінії суцільні, другий – що їх заповнення повинно бути суцільним заданим кольором, третій – що лінії будуть товстої ширини (для зручності перегляду).

Функція line(x1,y1,x2,y2) малює відрізки трикутника, починаючи з точки х1, у1 та закінчуючи х2, у2. Координати точок були враховані в тілі програми, тому дані підставлені без жодних змін:

line(xa,ya,xb,yb); - бокова сторона AB, або а, що була задана початковою умовою,

line(xa,ya,xc,yc); - основа АС, або b, що була знайдена в тілі програми за формулою b=P-(a+c),

line(xb,yb,xc,yc); - бокова сторона ВС, або с, що була задана початковою умовою,

line(xm,ym,xb,yb); - висота ВМ, або h2, що була знайдена в тілі програми за формулою h2=2*S/b.

Функція outtextxy() виводить текст у певній координаті. Для цього в дужках написала координати позиції, з якої починати виведення інформації на екран, а потім у лапках що саме виводиться на екран. Отже, функція outtextxy() в програмі має наступний вигляд:

outtextxy(xa-5,ya+3,"A"); - координати вершини А та невелике зсування літери, щоб уникнути нагромадження,

outtextxy(xb,yb-8,"B"); - координати вершини В,

outtextxy(xc+5,yc+3,"C"); - координати вершини С,

outtextxy(xm,ym+5,"M"); - координати точки перетину висоти з основою М,

outtextxy(150,380,"AB=a,BC=c,AC=b"); - пояснення до використаних літер,

outtextxy(140,410,"Vykonav student 141-oi grupy ICIT Kuznetsov Constantine"); - інформація про виконавця,

outtextxy(200,430,"Variant #13"); - варіант,

closegraph(); - завершення роботи з графічним режимом.

getch(); return 0;} – завершення роботи з програмою.

Наприкінці слід відмітити, що для того, щоб графік мав великий розмір, треба задавати значення сторін від 100 до 500. Або власноруч помножити кожне вхідне значення на певне число у тілі програми. Для останнього потрібно змінити координати точок xb,yb,xc,yc,xm,ym на:

xb=xa+?*a*cos(C*M_PI/180);

yb=ya-?*a*sin(C*M_PI/180);

xc=xa+?*b;

yc=ya;

xm=xa+?*a*cos(C*M_PI/180);

ym=ya;

де ? – множник, або той показник, який визначає розмір отриманого графіка.