Об’єктно-орієнтоване програмування

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Украинский
    ,
    Формат файла:
    MS Word
    76,04 Кб
  • Опубликовано:
    2013-03-14
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Об’єктно-орієнтоване програмування














"Об’єктно-орієнтоване програмування"

текстовий редактор програмування

Вступ

Завдання до курсової роботи

Скласти програмну оболонку до заданої задачі, яка повинна містити меню з командами:

1. Виведення на екран повідомлення про програму.

2. Редагування за допомогою текстового редактора NotePad вхідного файлу.

3. Виконання exe-файлу другої програми.

4. Вихід з програми меню.

Задача:

У файлі задані координати вершин трикутників. Вивести на екран трикутники. Залишити у файлі тільки координати тупокутних трикутників. Трикутник з найбільшим і найменшим тупим кутом виділити окремим кольором. Визначити, чи перетинаються ці трикутники.

В даній курсовій роботі була виконана розробка програми на мові програмування С++ з використанням об’єктно-орієнтованого програмування, яка включала в себе роботу з файлами, класами, обробку числової інформації і роботу з графікою.

В ході цієї роботи було створено програмну оболонку вирішуваної задачі і розроблено метод перевірки на перетин прямих.

C++ - універсальна мова програмування, яка дозволяє зробити програмування приємнішим для серйозного програміста. С++ було розроблено на основі мови програмування С. Крім можливостей, які дає С, С++ представляє свої гнучкі і ефективні засоби визначення нових типів, застосування яких значно полегшує та спрощує технологію програмування. Використовуючи визначення нових типів програміст може розділяти свою програму на простіші частини, які легше проконтролювати. Такий метод побудови програм часто називають абстракцією даних. Інформація про типи міститься в деяких об’єктах типів, визначених користувачем. Все, чим ми маніпулюємо в програмі, може розглядатися як об’єкт. Програмування із застосуванням таких об’єктів називають об’єктно-орієнтованим. В результаті раціонального використання цього методу одержуємо набагато коротші, доступніші для роззуміння та легше контрольовані прорами.

Ключевим поняттям C++ є клас. Клас - це структури, які містять не тільки об’яви даних, а й функцій, що визначаються користувачем. Класи забезпечують приховування даних, гарантовану ініціалізацію даних, неявне перетворення типів для типів, визначених користувачем, динамічне задання типу, контрольоване користувачем управління пам’яттю і механізмом перегрузки операцій.

Основними поняттями об’єктно-орієнтованого програмування є:

інкапсуляція;

спадковість;

абстракція;

поліморфізм.

Інкапсуляція полягає утому, що кожний клас має три рівні доступу до елементів:- рівень, дані на якому можуть бути використані будь-якою функцією;- елементи цього рівня можуть бути використані функціями-членами даного класу або функціями-членами похідних класів;елементи цього рівня можуть бути використані функціями-членами даного класу.

Дані рівні класів називають полями

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

При цьому ті класи, на основі яких створені інші, називаються базовими, а ті, які будуються на основі базових - похідними, які створюються шляхом простого копіювання всіх елементів базових класів, тому при описі похідних класів вказуються тільки ті елементи, які є додатковими до базового класу. Похідний клас може мати декілька базових класів, а базовий - декілька похідних.

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

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

Об’ява класів

С++ підтримує об’яву класів, які інкапсулюють члени. Члени класа - члени даних і функцфії-члени. В членах-даних зберігаються значення, які представляють стан екземплярів класу(тобто об’єктів які належать класу). Функції - члени встановлюють і перевіряють стан екземплярів класа, керуючи значеннями в членах даних. Загальний синтаксис об’яви базового класу в С++ має такий вигляд:

className

{:

//відкриті члени даних

//відкриті функції члени:

//захищені члени даних

//захищені функції члени

};

Об’ява класа починається з ключового слова class, після якого слідує ім’я класу. Декларація членів класа заключається в пару фігурних дужок і закінчуються значком «крапка з комою».

Функція, опис якої знаходиться в опису класу називається inline-функцією. Але клас - це абстракктний набір правил, який існує тільки у вигляді потенційних можливостей. Для їх реалізації створюються об’єкти даного класу в пам’яті. Механізм створення об’єкту даного класу полягає у використанні спеціальної функції даного класу, яка називається конструктором класу.

Графiчнi засоби мови С

Мова С має достатньо шиpокi гpафiчнi можливостi. Всi необхiднi визначення для графiчного модуля мови С дано в файлi graphics.h i при виборi вiдповiдного режиму вiн повинен бути включеним в програму за допомогою директиви #include<graphics.h>. Стандартнi функцii для графiчноi системи знаходяться в бiблiотецi graphics.lib, яка повинна бути пiдключена або за допомогою командноi строки (якщо використовуеться компiлятор ТСС), або шляхом створення файла проекта (якщо використовуеться компiлятор ТС).

Перед початком роботи програми повинна бути виконана iнiцiалiзацiя графiчноi системи тобто вказанi графiчнi драйвер та режим роботи цього драйвера (graphdriver & graphmode). А в кiнцi роботи бажано вiдновити той вiдеорежим, в якому находився комп'ютер до запуску програми.

До основних функцiй, реалiзованих даним способом вiдносятся:

установка вiдеорежима;

малювання точки заданим кольором;

визначення кольору точки з заданими координатами;

очистка активноi сторiнки i т.п.

В програмi були використанi деякi iз вищеперерахованих можливостейстей.

Загальна структура роботи

Текст програм(menu.exe i main.exe) розбитий на декілька файлів для спрощення модифікації і сприйняття коду:.cpp - функція main програми, що реалізує задачу курсової роботи.h - об’ява класу Executer.cpp - реалізація класу Executer.h - об’ява класу Triangle.cpp - реалізація класу Triangle.h - об’ява класу Line.cpp - реалізація класу Line.h - об’ява класу Point.cpp - реалізація класу Point.cpp - код програми, що реалізує основне меню прогрманого компелксу

Всі файли вихідних даних знаходяться в підкаталозі Data каталогу курсової роботи:.dat - дані, необхідні програмі.txt - назви пунктів меню.txt - інформацію про програму та її розробника

Основу структури програмної реалізації завдання складає програма menu.exe, з якої можна редагувати вхідні дані і запускати програму main.exe, яка реалізує алгоритмічне виконання завдання.

Розробка алгоритму виконання основного завдання

Для виконання курсової роботи довелося розробити метод, який дозволяє перевірити, чи перетинаються два відрізки. Ідея: продовжуємо відрізки до прямих(, де кінці відрізку - це точки з координатами (x1,y1), (x1,y2), причому для кожної прямої визначаємо по дві змінні: ), і знаходимо точки перетину цих прямих. Якщо їх немає(прямі паралельні), то відрізки не перетинаються, якщо їх безліч, то відрізки накладаються. Якщо точка перетину одна, то її абсциса: , де b1, k1 та b2, k2 - це змінні b та k для першої та другої прямої. Потім ми перевіряємо, чи лежить X в межах від x1 до x2 включно для першого та другого відрізка, де x1 і x2 - абсциси кінців відрізка. Якщо лежить, то відрізки перетинаються, якщо не лежить, то не перетинаються. Для визначення того, чи перетинаються трикутники, визначається, чи перетинається хоч одна з сторін (відрізків) одного трикутника з будь-якою стороною другого(9 перевірок на перетин відрізків).

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

Програмна реалізація основного алгоритму з використанням засобів ООП

В процесі розробки програми були створені та використані наступні класи для реалізації основного алгоритму:

Executer {:( char* file );:delBad( Triangle* triangles[] , int& minAngle, int& maxAngle, char* file );drawAll( Triangle* triangles[] );areTheyCrossing( Triangle* triangles[], int minAngle, int maxAngle );

};

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

Triangle : public Line {:( int a1, int b1, int a2, int b2, int a3, int b3 );isObtuse() const;draw();operator+ ( Triangle& right ) const;retValues( int& a1, int& b1, int& a2, int& b2, int& a3, int& b3 ) {= x1; b1 = y1;= x2; b2 = y2;= x3; b3 = y3;

}:x3, y3;isCrossing( long x1, long y1, long x2, long y2, long a1, long b1, long a2, long b2 ) const;

};

Цей клас являє собою клас трикутників і містить в собі дані трикутника(координати вершин) та функції, необхідні іншій частині коду класу співпрацювати з цим класом. В цьому класі перегружена операція +, вона визначає, чи перетинаються два об’єкти(операнди операції) даного класу.

class Line : public Point {:( int a1, int b1, int a2, int b2 );:x2, y2;

};

Цей клас являє собою клас відрізків і містить в собі дані відрізка(координати кінців) та функції, необхідні іншій частині коду класу співпрацювати з цим класом.

Point {:( int a1, int b1 );setColor( int col );:x1, y1, color;

};

Цей клас являє собою клас точок і містить в собі дані точки(координати і колір) та функції, необхідні іншій частині коду класу співпрацювати з цим класом.

В процесі розробки була використана важлива можливість мови С++ - спадковість, яка дає можливість повторного використання коду.

Ієрархія спадковості:

Рис.

Розробка допоміжних програмних засобів

Для спрощення роботи з програмою, що реалізує основний алгоритм було створено програму, яка реалізує інтерфейсне меню, за допомогою якого є можливість запускати основну програму(main.exe), редагувати вхідні дані(за допомогою програми NotePad) та отримати коротку відомість про програму(About). В ході розробки меню були використані віртуальні функції та поліморфізм. Поліморфізм - дуже важлива можливість мови C++, яка дає можливість повторного використання коду та збільшує здатність програмних продуктів до розширення без значних змін коду(динамічне зв’язування).

Весь код програми меню знаходиться в файлі menu.cpp.

Назви кнопок меню знаходяться в файлі names.txt. З фйла about.txt програма меню бере текст для виконання пункту меню About.

Висновки

В результаті виконання курсової роботи розроблено програмний засіб, який реалізує зчитування координта трикутникiв з файлу, видалення з нього не тупокутних трикутників, визначення, чи перетинаються трикутники(тупокутні) з найбiльшим та найменшим тупими кутами. Програма наділена дружнім графічним інтерфейсом, що спрощує роботу з роботу з програмою. Може використовуватись для навчальних цілей та для допомоги у розв’язанні деяких планіметричних задач.

Список використаної літератури

.Х.М. Дейтел, П.Дж. Дейтел «Как программировать на С++» Москва 2001

.Намир К. Шаммас «Основы С++ и объектно ориентированого програмирования». «Диалектика» Киев 1996.

Додаток

Лістинги файлів

.cpp:

#include <iostream.h>

#include <graphics.h>

#include <stdlib.h>

#include <conio.h>

#include "executer.h"

#include "triangle.h"()

{ex( "data\\tri.dat" );();0;

}.h:

#ifndef EXECUTER_H

#define EXECUTER_H

#include <iostream.h>

#include <stdio.h>

#include "triangle.h"{:( char* file );:delBad( Triangle* triangles[] , int& minAngle, int& maxAngle, char* file );drawAll( Triangle* triangles[] );areTheyCrossing( Triangle* triangles[], int minAngle, int maxAngle );

};

#endif.cpp:

#include <iostream.h>

#include <stdlib.h>

#include <ctype.h>

#include <stdio.h>

#include <string.h>

#include <graphics.h>

#include "executer.h"

#include "triangle.h"

#define PI 3.141592654::Executer( char* file ) {*fPtr;* triangles[50] = {0};c, i, count, maxAngle, minAngle, flag, step, val[6] = {0};integer[10] = {'\0'};gdriver = DETECT, gmode, errorcode;(&gdriver, &gmode, "");= graphresult();(errorcode != grOk)

{("Graphics error: %s\n", grapherrormsg(errorcode));("Press any key to halt:");.get();(1);

}( ( fPtr = fopen( file, "r" ) ) == NULL ) {<< "Can't open file!" << endl;( 1 );

}= 0;= 0;= 0;= 0;( ( c = getc( fPtr ) ) != EOF ) {( (c == 'A' || c == 'a') && flag == 0 )= 1;( (c == 'N' || c == 'n') && flag == 1 )= 2;( (c == 'G' || c == 'g') && flag == 2 )= 3;( flag == 3 ) {( c == '=' ) {( (c = getc( fPtr )) == ' ' );[count++] = c;( isdigit( c = getc( fPtr ) ) )[count++] = c;= 0;[step++] = atoi( integer );(int j = 0; j < 10; j++)[j] = '\0';

}

}( step == 6 ) {[i++] = new Triangle( val[0], val[1], val[2], val[3], val[4], val[5] );= 0;= 0;

}

}( fPtr );( triangles, minAngle, maxAngle, file );( triangles );( triangles, minAngle, maxAngle );

}Executer::delBad( Triangle* triangles[], int& minAngle, int& maxAngle, char* file )

{*fPtr;angle, min = 999.0, max = -1.0;i, val[6] = {0};temp0[5] = {'\0'}, temp1[5] = {'\0'}, temp2[5] = {'\0'},[5] = {'\0'}, temp4[5] = {'\0'}, temp5[5] = {'\0'} ;( ( fPtr = fopen( file, "w" ) ) == NULL ) {<< "Can't open file!" << endl;( 1 );

}( i = 0; triangles[i] != 0; i++ )( ( angle = (*triangles[i]).isObtuse() ) > PI / 2 ) {( angle < min ) {= angle;= i;

}( angle > max ) {= angle;= i;

}("Triangle\n", fPtr);

(*triangles[i]).retValues( val[0], val[1], val[2], val[3], val[4], val[5] );( val[0], temp0, 10);( val[1], temp1, 10);( val[2], temp2, 10);( val[3], temp3, 10);( val[4], temp4, 10);( val[5], temp5, 10);( fPtr, "Tri1: x = %s; y = %s\nTri2: x = %s; y = %s\nTri3: x = %s; y = %s\n",, temp1, temp2, temp3, temp4, temp5 );

}( fPtr );( max >= 0.0 )

(*triangles[maxAngle]).setColor(12);( min < 900.0 )

(*triangles[minAngle]).setColor(10);

}Executer::drawAll( Triangle* triangles[] )

{i = 0;( triangles[i] != 0 )

(*triangles[i++]).draw();.get();();

}Executer::areTheyCrossing( Triangle* triangles[], int minAngle, int maxAngle )

{( triangles[0] == 0 )<< "Трикутники вiдсутнi." << endl;if ( minAngle == maxAngle )<< "Трикутники з максимальним i мiнiмальним тупими кутами СПIВПАДАЮТЬ." << endl;if ( *triangles[minAngle] + *triangles[maxAngle] == YES )<< "Трикутники з максимальним i мiнiмальним тупими кутами ПЕРЕТИНАЮТЬСЯ." << endl;<< "Трикутники з максимальним i мiнiмальним тупими кутами НЕ ПЕРЕТИНАЮТЬСЯ." << endl;.get();

}.h:

#ifndef TRIANGLE_H

#define TRIANGLE_H

#include "line.h"

#define YES 1

#define NO 0Triangle : public Line {:( int a1, int b1, int a2, int b2, int a3, int b3 );isObtuse() const;draw();operator+ ( Triangle& right ) const;retValues( int& a1, int& b1, int& a2, int& b2, int& a3, int& b3 ) {= x1; b1 = y1;= x2; b2 = y2;= x3; b3 = y3;

}:x3, y3;isCrossing( long x1, long y1, long x2, long y2, long a1, long b1, long a2, long b2 ) const;

};

#endif

#include "triangle.h"

#include <math.h>

#include <stdlib.h>

#include <conio.h>

#include <graphics.h>

#define MAX3( a, b, c ) ( a > b ? ( a > c ? a : c ) : ( b > c ? b : c ) )

#define MAX( a, b ) ( a > b ? a : b )

#define MIN( a, b ) ( a < b ? a : b )

#define LENGTH( x1, y1, x2, y2 ) sqrt( (double)( (double)((double)x1-x2)*(x1-x2) + (double)((double)y1-y2)*(y1-y2) ) )::Triangle( int a1, int b1, int a2, int b2, int a3, int b3 ) : Line( a1, b1, a2 , b2 )

{= 15;= ( a3 >= 0 ? a3 : 0 );= ( b3 >= 0 ? b3 : 0 );

}Triangle::isObtuse() const

{a = 0, b = 0, c = 0, max = 0;cosa = 0;= (long)LENGTH( x1, y1, x2, y2 );= (long)LENGTH( x2, y2, x3, y3 );= (long)LENGTH( x1, y1, x3, y3 );= MAX3( a, b, c );( max == a )= (double)( b*b + c*c - a*a ) / ( 2 * b * c );if ( max == b )= (double)( c*c + a*a - b*b ) / ( 2 * a * c );if ( max == c )= (double)( b*b + a*a - c*c ) / ( 2 * a * b );<< "ERROR!!" << endl;acos( cosa );

}Triangle::draw()

{(color);(x1, y1, x2, y2);(x2, y2, x3, y3);(x3, y3, x1, y1);

}Triangle::operator+ ( Triangle& right ) const

{ans = NO;( x1, y1, x2, y2, right.x1, right.y1, right.x2, right.y2 ) ? ans = YES : ans = ans;( x1, y1, x2, y2, right.x2, right.y2, right.x3, right.y3 ) ? ans = YES : ans = ans;( x1, y1, x2, y2, right.x1, right.y1, right.x3, right.y3 ) ? ans = YES : ans = ans;( x2, y2, x3, y3, right.x1, right.y1, right.x2, right.y2 ) ? ans = YES : ans = ans;( x2, y2, x3, y3, right.x2, right.y2, right.x3, right.y3 ) ? ans = YES : ans = ans;( x2, y2, x3, y3, right.x1, right.y1, right.x3, right.y3 ) ? ans = YES : ans = ans;( x1, y1, x3, y3, right.x1, right.y1, right.x2, right.y2 ) ? ans = YES : ans = ans;( x1, y1, x3, y3, right.x2, right.y2, right.x3, right.y3 ) ? ans = YES : ans = ans;( x1, y1, x3, y3, right.x1, right.y1, right.x3, right.y3 ) ? ans = YES : ans = ans;ans;

}Triangle::isCrossing( long x1, long y1, long x2, long y2, long a1, long b1, long a2, long b2 ) const

{f = YES;k1, c1, k2, c2, X;( x1 == x2 )( a1 == a2 )( x1 == a1 )YES;NO;{= x1;= NO;

}( a1 == a2 )( x1 == x2 )( x1 == a1 )YES;NO;{= a1;= NO;

}( f == YES) {= ((double)y2 - y1) / (x2 - x1);= ((double)x2*y1 - x1*y2) / (x2 - x1);= ((double)b2 - b1) / (a2 - a1);= ((double)a2*b1 - a1*b2) / (a2 - a1);( k1 == k2 )( c1 == c2 )YES;NO;= ( c2 - c1 ) / ( k1 - k2 );( ( X >= MIN( x1, x2 ) ) && ( X <= MAX( x1, x2 ) ) && ( X >= MIN( a1, a2 ) ) && ( X <= MAX( a1, a2 ) ) )YES;NO;

}.h:

#ifndef LINE_H

#define LINE_H

#include "point.h"Line : public Point {:( int a1, int b1, int a2, int b2 );:x2, y2;

};

#endif.cpp:

#include "line.h"::Line( int a1, int b1, int a2, int b2 ) : Point( a1, b1 )

{= ( a2 >= 0 ? a2 : 0 );= ( b2 >= 0 ? b2 : 0 );

}.h:

#ifndef POINT_H

#define POINT_H

#include <iostream.h>Point {:( int a1, int b1 );setColor( int col );:x1, y1, color;

};

#endif.cpp

#include "point.h"::Point( int a1, int b1 )

{= ( a1 >= 0 ? a1 : 0 );= ( b1 >= 0 ? b1 : 0 );

}Point::setColor( int col )

{= ( col > 15 || col < 0 ? 15 : col );

}.dat:: x = 100; y = 100: x = 110; y = 0: x = 200; y = 0: x = 400; y = 100: x = 110; y = 10: x = 30; y = 0: x = 30; y = 100: x = 340; y = 50: x = 210; y = 80: x = 200; y = 100: x = 140; y = 60: x = 110; y = 180

Результат виконання основної програми, якщо файл tri.dat містить наведені вище дані:

Рис.

Рис.

Після виконання програми у файлі tri.dat залишились такі дані:

.dat:: x = 100; y = 100: x = 110; y = 0: x = 200; y = 0: x = 400; y = 100: x = 110; y = 10: x = 30; y = 0: x = 30; y = 100: x = 340; y = 50: x = 210; y = 80: x = 300; y = 200: x = 240; y = 140: x = 280; y = 290

Лістинг файлу menu.cpp

#include <conio.h>

#include <stdio.h>

#include <dos.h>

#include <process.h>

#include <string.h>

#define LEFT 75

#define RIGHT 77

#define ENTER 13Button

{x1,x2,y1,y2;str[20];:setparam(int X1,int Y1,int X2,int Y2,char *st);show(int tcolor,int bcolor);void run()=0;

};Button::setparam(int X1,int Y1,int X2,int Y2,char *st)

{=X1;y1=Y1;=X2;y2=Y2;(str,st);

}Button::show(int tcolor,int bcolor)

{(tcolor);(bcolor);(x1,y1,x2,y2);();(1,1);("%s",str);

}Button1:public Button

{:run();

};Button1::run()

{(P_WAIT,"c:\\windows\\notepad.exe","notepad","data\\tri.dat",NULL);

}Button2:public Button

{:run();

};Button2::run()

{i,j;();(15);(0);(1,23,80,25);();(9,25);("Loading: \n\n");(i=0; i < 20; i++)

{("\\\r");(10);("|\r");(10);("/\r");(100);

}();(P_WAIT,"main.exe",NULL);

_setcursortype(_NOCURSOR);();

}Button3:public Button

{:run();

{(7);(22,8,62,18);();(1);(20,7,60,17);(10);();* fin=fopen("data\\about.txt","r");str[80];(int i=0;i<4;i++)

{(1,i+2);(str,80,fin);("%s",str);

}(fin);();(0);(1,1,80,25);();

}Button4:public Button

{:run();

};Button4::run()

{(0);

}

Menu

{B1;B2;B3;B4;*masB[4];x,y;numAct;show();onLeft();onRight();onEnter();:(int X,int Y);getmessage(int msg);

};Menu::show()

{(int i=0;i<4;i++)(i==numAct)[i]->show(15,1);[i]->show(0,7);

}Menu::onLeft()

{=(numAct==0)?3:(numAct-=1);

}Menu::onRight()

{=(numAct==3)?0:(numAct+=1);

}Menu::onEnter()

{[numAct]->run();

}Menu::getmessage(int msg)

{(msg)

{LEFT:();;RIGHT:();;ENTER:();;

};();

}::Menu(int X,int Y)

{=X;=Y;=0;[0]=&B1;[1]=&B2;[2]=&B3;[3]=&B4;* fin=fopen("data\\names.txt","r");str[80];(int i=0;i<4;i++)

{(str,80,fin);[i]->setparam(x,y,x+strlen(str)-2,y,str);=x+strlen(str);

}(fin);();

}main()

{(0);();mnu(20,1);

_setcursortype(_NOCURSOR);(1).getmessage(getch());

}.txt:.txt:

Похожие работы на - Об’єктно-орієнтоване програмування

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!