Розробка програм на мові С++
Крім інкапсуляції, яка застосовувалась і при розробці програми виконання основного завдання використовується механізм наслідування, який полягає у створенні нових класів на основі інших, вже створених, шляхом додавання нових полів. При цьому ті класи, на основі яких створені інші, називаються базовими, а ті, які будуються на основі базових — похідними. У програмній реалізації меню також… Читати ще >
Розробка програм на мові С++ (реферат, курсова, диплом, контрольна)
Вступ
З розвитком науки, різного роду технологій перед людиною постають все нові і нові задачі, які потрібно швидко і правильно вирішувати. Раніше багато працівників були змушені виконувати великі обсяги роботи вручну (за допомогою ручки, паперу, олівця і лінійки). Це було неефективно і нераціонально. Тому комп’ютери (і мови програмування) допомагають людям автоматизувати і прискорити процес виконання певних завдань. Обчислювальна техніка використовується зараз не тільки в інженерних розрахунках і економічних науках, але й таких традиційно нематематичних галузях, як медицина, лінгвістика, психологія. Тому можна впевнено сказати, що застосування ЕОМ придбало масовий характер. Комп’ютер став невід'ємною частиною людської діяльності.
Дана розробка не має глобального значення, але вирішує важливу задачу. Програма, яка має власне меню, зчитує числову інформацію з файлів, аналізує, обробляє її і виконує графічне відображення. Числовими даними є координати точок, які мають довільну орієнтацію у просторі. Обробляючи інформацію, програма перевіряє можливість побудови тупокутних трикутників через ці точки. Для написання програми використовувалась мова програмування С++, яка є універсальною і на додаток до якої розроблений набір різноманітних бібліотек. Тому вона дозволяє вирішити практично будь-яку задачу програмування. Проте, у силу різних причин (не завжди технічних) для якихось типів задач ця мова вживається частіше, а для якихось — рідше.
Дана розробка може бути корисною для розв’язування певних математичних задач, для виконання завдань, пов’язаних з планіметрією та різноманітними креслярськими планами, а також у навчальних цілях.
Розробка є досить актуальною. Для певних видів діяльності важливим етапом є знаходження сукупності кіл, що лежать в прямокутнику та пошук їх найбільшої послідовності перетину. Виконання цих дій вручну потребує надзвичайно багато часу, уваги і концентрації. Програма ж швидко реалізує поставлене завдання, обробляючи необмежену кількість вхідної інформації. Обмеженням є лише можливості і властивості самої електронно-обчислювальної машини. Крім того, програма представлена з зручним меню, за допомогою якого можна легко змінювати вхідні дані, редагувати код, і побачити графічне представлення отриманих результатів.
1 Аналіз сучасного стану технологій програмування та обґрунтування теми
При дослідженні модельного світу користувач може по-різному одержувати інформацію від комп’ютера. Йому може бути потрібна інформація про окремі властивості об'єктів або результати взаємодії певних об'єктів. Для цього йому необхідний програмний засіб, що виконує функції, які його цікавлять, або деяка інформаційна система, здатна обробляти інформацію про певні відносини, використовуючи при цьому відповідну базу даних. У початковий період розвитку комп’ютерної техніки такий підхід до використання комп’ютерів був цілком природнім. Саме він і провокував функціональний (реляційний) підхід до розробки програмного забезпечення.
Ідея цього підходу полягає в систематичному використанні декомпозиції функцій для побудови структури програмного засобу і текстів програм, що входять в нього. При цьому самі об'єкти, які використовувались реалізованими функціями, представлялися фрагментарно (у тому обсязі, що необхідний для виконання цих функцій) і у формі, зручній для реалізації цих функцій. Через це не забезпечувалося цільне й адекватне комп’ютерне відображення модельного світу, що цікавить користувача. Спроби незначного розширення обсягу й характеру інформації про модельний світ потребували великих затрат. Такий підхід є застарілим і підтримується мовами від асемблерів і процедурних мов (Паскаль) до функціональних мов (ЛИСП) і мов логічного програмування (ПРОЛОГ).
При іншому підході до дослідження модельного світу, використовуючи комп’ютер, користувача може цікавити спостереження за зміною станів об'єктів у результаті їхніх взаємодій. Це вимагає досить цільного і загального представлення об'єкта в комп’ютері. Програмні компоненти, що реалізують відносини, у яких бере участь цей об'єкт, явно зв’язуються з ним. Для виконання такого підходу доводилося будувати програмні засоби, що моделюють процеси взаємодії об'єктів (модельного світу). Для традиційних засобів розробки це було досить трудомістким завданням. Проте, з’явилися мови програмування, спеціально орієнтовані на таке моделювання. але це лише частково спростило завдання розробки необхідних програм. Найбільш повно відповідає рішенню цього завдання об'єктний підхід до розробки програмних засобів. Його ідея полягає у систематичному використанні декомпозиції об'єктів при побудові структури ПЗ і текстів програм, що входять у нього. При цьому функції, які виконуються такими засобами, виражалися через відносини об'єктів різних рівнів, тобто їхня декомпозиція істотно залежала від декомпозиції об'єктів.
C++ - універсальна мова програмування, що дозволяє реалізувати обидва із описаних підходів до розробки програмних засобів. Вона дозволяє розробляти досить ефективні з точки зору виконання програми. Мову С++ було розроблено на основі мови програмування С. Крім можливостей, які дає С, С++ представляє свої гнучкі і ефективні засоби визначення нових типів, застосування яких значно полегшує та спрощує технологію програмування. У визначенні нового типу основна ідея — відокремлення несуттєвого від тих якостей, що істотні для правильного використання. Робота зі структурою даних і внутрішніми адміністративними підпрограмами здійснюється через спеціальний інтерфейс. Використовуючи визначення нових типів програміст може розділяти свою програму на простіші частини, які легше проконтролювати. Такий метод побудови програм часто називають абстракцією даних. Інформація про типи міститься в деяких об'єктах типів, визначених користувачем. Програмування із застосуванням таких об'єктів називають об'єктно-орієнтованим.
Окрім С++ існують також інші мови програмування, які дозволяє реалізовувати об'єктно-орієнтовані технології. Так пакет Sketchpad був прикладом однієї з перших об'єктно-орієнтованих систем. Sketchpad був універсальною графічною системою для інтерактивного створення й редагування зображень на графічному дисплеї. Геометричні перетворення застосовувалися до визначених об'єктів, приводячи в результаті до екземпляра геометричного об'єкта.
Мова програмування С++ розвинулась із мови С, яка в свою чергу була створена на основі двох попередніх мов — ВСРL і В. Мова програмування ВСРL була створена в 1967 році Мартіном Ричардом як мова для написання компіляторів і програмного забезпечення операційних систем. Кен Томпсон передбачив багато можливостей в своїй мові В — копії ВСРL і використав В для створення ранніх копій операційної системи UNIX в Bell Laboratories в 1970 році. Мова програмування С була розвинута із В Деннісом Річчі в Bell Laboratories в 1972 році. С використовує багато важливих концепцій ВСРL і В, а також додає типи даних та інші особливості. С++ - розширений С — був розроблений Б`єрном Страуструпом на початку 80-х років в Bell Laboratories. С++ забезпечує можливість, що найважливіше, об`єктно-орієнтованого програмування. Це виявилось революційною ідеєю в світі програмного забезпечення. Об`єкти — це ефективні компоненти програмного забезпечення, що повторно використовуються, і в свою чергу моделюють елементи реального світу.
Система Smalltalk дослідницького центру в Пало-Альто (PARC) корпорації Xerox найбільше часто асоціюється з об'єктно-орієнтованим підходом. Система заснована на поняттях об'єктів, повідомлень і класів, які використовуються для створення середовища програмування й спеціального інтерфейсу. Smalltalk відрізняється від інших об'єктно-орієнтованих систем тим, що не має якої-небудь загальноприйнятої типізації й процедурних конструкцій, що могло б порушити строгість застосування об'єктів і передачі повідомлень. Єдиною конструкцією в цій системі є об'єкт, що навіть управляє програмним потоком. Кожний клас має методи, використовувані для обробки повідомлень, які генеруються усередині об'єктів. У системі допускається визначення нових класів шляхом додавання даних і методів до іншого класу, який називається суперкласом.
С++ поряд з Smalltalk, Lisp і іншими динамічними мовами володіє засобами для низькорівневої маніпуляції з комп’ютером. Вона дає можливість створити власний тип даних так, що компілятор не відрізнить його від вбудованого, керувати власними функціями, звертаннями до змінних класів, виділенням та звільненням пам’яті, ініціалізацією та знищенням об'єктів — і все це відбувається без втрат ефективності і безпеки типів. Саме тому С++ підходить для розв’язання найрізноманітніших задач.
2. Розробка програми виконання основного завдання
2.1 Розробка методу виконання основного завдання
Перш за все потрібно зчитати з файлу координати кіл. Ми їх зчитуємо і виводимо на екран. Для того щоб визначити чи перетинаються кола ми порівнюємо відстань між центрами кіл з радіусами. В тому випадку коли відстань менша за суму радіусів і більша за різницю, кола перетинаються (рис. 1).
Рис. 1 — Перетин кіл Відстань між точками шукається за формулою:
Площа знаходиться за формулою:
Рис. 2 — Площа кола
2.2 Структура даних і функцій
Тепер детальніше розглянемо програмну реалізацію рішення даної задачі.
Програма містить 1 клас, 1 структуру і кілька функцій.
struct point:
x, y — змінні типу int.
class Circle:
point Cоб'єкт структури, який позначає центр кола.
int radбint grзмінні, які позначають радіус і до якої групи відноситься
float Sплоща кола
void setdata (point p, int r) — функція, яка заповняє поля кола.
void draw () — функція, яка малює коло.
Функції:
int peret (Circle A, Circle B) — функція, що визначає чи перетинаються кола.
void Work () — функція, яка виконує обчислення
void main () — головна функція програми.
3. Розробка програми меню
Програма меню розроблена для полегшення використання розробки. Вона дозволяє легко змінювати вхідні дані, редагувати код, побачити графічне представлення отриманих результатів і отримати інформацію про автора розробки.
Крім інкапсуляції, яка застосовувалась і при розробці програми виконання основного завдання використовується механізм наслідування, який полягає у створенні нових класів на основі інших, вже створених, шляхом додавання нових полів. При цьому ті класи, на основі яких створені інші, називаються базовими, а ті, які будуються на основі базових — похідними. У програмній реалізації меню також використовуються віртуальні функції (функції, які об’являються в базовому класі, але в похідному класі можуть бути перевизначені). Поліморфізм — можливість перевизначення різних функцій та операцій у похідних класах. Переваги віртуальних функції полягають у можливості їх виклику із похідних класів через вказівники на базові класи. Таким чином абстракція дозволяє, звертаючись до однієї і тієї ж функції в різних об'єктах, виконувати різні дії, що збільшує універсальність програми.
Програма меню містить такі пункти:
Ш About — забезпечує виведення інформації про розробника програми;
Ш Change data — редагування файлу з вхідними даними DATA.TXT.
Ш Show text program — редагування файлу тексту програми — KUR.СPP.
Ш Run program — запускає програму виконання основного завдання — KUR.EXE.
Ш Exit — вихід із програми меню.
Розглянемо класи, які використовуються при розробці програми меню.
class Knopka — базовий клас.
int x1; - поля даного класу типу int. Координати вікна кнопки та масив символів str відповідають надпису на кнопці. Усі змінні описані в private області.
int y1;
int x2;
int y2;
char str[80]; - поле типу char.
public:
void setparam (int xx1, int yy1, int xx2, int yy2, char *sstr); - метод ініціалізації полів базового класу.
void show (int tcolor, int bcolor); - метод відображення кнопки з надписом на екрані.
virtual void run (void)=0; - чисто віртуальна функція касу, яка буде перевизначена у класах-нащадках, виконується при натисканні користувачем кнопки Enter для виконання певного пункту меню.
class knopka1: public Knopka — клас нащадок.
public:
void run (void); - перевизначена віртуальна функція, виводить дані про автора програми, які вона зчитує з файлу about.txt.
class knopka2: public Knopka — клас нащадок.
public:
void run (void); - перевизначена віртуальна функція, запускає програму notepad. exe для редагування файлу вхідних даних для програми виконання основного завдання kursova.TXT.
class knopka3: public Knopka — клас нащадок.
public:
class knopka4: public Knopka — клас нащадок.
public:
void run (void); - перевизначена віртуальна функція, яка запускає програму bc. exe для редагування текстового (*.срр) файлу програми виконання основного завдання KURSSSS.CPP.
class knopka5: public Knopka — клас нащадок.
public:
void run (void); - перевизначена віртуальна функція, яка використовується для запуску програми виконання основного завдання KURSSSS.exe.
class knopka6: public Knopka — клас нащадок.
public:
void run (void); - перевизначена віртуальна функція, яка виконує вихід з програми меню.
class Menu — клас Меню.
knopka1 kn1; - об'єкти класів-нащадків.
knopka2 kn2;
knopka3 kn3;
knopka4 kn4;
knopka5 kn5;
knopka6 kn6;
Knopka *maskn[6] - вказівники на об'єкти базового класу.
int x; - поля класу типу int.
int y;
int nomAct;
int actTextCol;
int actBgCol;
int pasTextCol;
int pasBgCol;
void show (void) — метод, який виводить на екран вікно заданих параметрів і виводить певний надпис.
void onLeft (void) — метод, який реагує на натискання користувачем клавіші <
void onRight (void) — метод, який реагує на натискання користувачем клавіші >
Функції призначені для зміни значення поля nomAct (тобто для зміни номера активного об'єкту).
void onDown (void) — метод, який реагує на натискання користувачем клавіші Enter. Виконує запуск віртуальної функції.
public:
Menu (int xx, int yy) — конструктор класу Меню. Ініціалізує поля класів, встановлює значення кольору тексту та тла для активної та пасивної кнопки та виводить на екран зображення меню за допомогою функції show ().
void getmessage (int msg) — функція обробки дії користувача. Вигляд меню змінюється у відповідності до натисненої кнопки користувачем.
4. Розробка та виконання тестового прикладу
Вхідні дані прямокутників знаходяться у файлі kursova. txt (рис. 3). Програма зчитує числові дані з даного файлу.
Рис. 3 — Вхідні дані з файлу DATA. txt
Після зчитування інформації з файлу програма виводить на екран ці прямокутники (рис. 4).
Рис. 4 — Виведення кіл на екран
Графічні результати роботи програми, а також вигляд програми-меню зображено на рисунках 5 та 6. Це свідчить про те, що програма працює коректно при довільних вхідних даних.
Рис. 5 — Результат роботи програми Рис. 6 — Вигляд текстового меню програми
5. Інструкція користувача
Дана програма не потребує особливих системних вимог. Тому для її нормального функціонування необхідна лише наявність процесора, відео карти, материнської плати, оперативної пам’яті і периферійних пристроїв, які не конфліктують між собою. З програмного забезпечення вимагається лише операційна система з можливістю емуляції MS-DOS, і встановлене середовище мови програмування Borland C++ (по замовчуванню програма-меню запускає середовище Borland C++ з диску С). Для інсталяції розробки достатньо лише скопіювати папочку KURS з носія інформації на жорсткий диск комп’ютера. Для використання розробки потрібно відкрити папку KURS і запустити файл Menu.exe. На екрані з’явиться меню даної розробки. Використовуючи клавіші користувач має можливість обрати певний пункт меню. Якщо натиснути Enter на пункті About, то на дисплеї з’явиться інформація про розробника. Пункт меню Change data дозволяє редагувати і змінювати вхідні дані для. Пункт Show text program необхідний для досвідчених користувачів, оскільки він дає можливість редагувати програму в середовищі Borland C++. Для запуску програми на виконання потрібно натиснути Run program. І нарешті для завершення роботи з даною розробкою і виходу в операційну систему необхідно вибрати Exit і натиснути Enter.
Висновки
У ході виконання курсової роботи була розроблена програма з інтерфейсним меню, яке допомагає користувачу легко виконати запуск розробки, змінити вхідні дані або саму програму. Задача була виконана відповідно індивідуального завдання. У результаті програма зчитує числову інформацію з файлу DATA. txt, аналізує, обробляє її і виконує графічне відображення. Розробка зручна у використанні і працює коректно при будь-яких вхідних даних.
Перелік посилань
Х.М. Дейтел, П.Дж. Дейтел, Как програмировать на С++.
Введение
в объектно-ориентированое програмирование с использованием UML. — Москва: Издательство БИНОМ, 2001. — 300 с.
Джефф Елджер, С++. — Москва: Библиотека програмиста, 2002. — 220 с.
В.П. Аверкин, А. И. Бобровский, Программирование на С++. — Москва: Библиотека программиста, 2001. — 252 с.
Н.С. Пискунов, Справочник по высшей математики, том 2. — Москва: Наука, 1976. — 520 с.
Р. Вайнер, Л. Пинсон, С++ изнутри. — Москва: Библиотека програмиста, 2003. — 290 с.
http://sources.ru/cpp/cpp_algoritms.shtml
http://softok.org/coding/c/4403prog.html
О.І. Черняк, О. М. Ткаченко, Методичні вказівки до виконання курсової роботи з дисципліни «Програмування» для студентів напрямів підготовки — «Комп'ютерна інженерія» та «Інформаційна безпека». Вінниця: ВНТУ, 2006 — 44 с.
Додаток А
Програма, що виконує індивідуальне завдання
#include
#include
#include
#include
struct point
{
int x, y;
};
class Circle
{
public:
point C;
int rad;
int gr;
void setdata (point p, int r)
{C=p; rad=r; S=(float) 3.14*r*r; gr=0; min=0;}
void draw () {circle (C.x, C. y, rad);};
float S;
int min;
};
int peret (Circle A, Circle B)
{
if (sqrt (pow (A.C.x-B.C.x, 2)+pow (A.C.y-B.C.y, 2))
if (sqrt (pow (A.C.x-B.C.x, 2)+pow (A.C.y-B.C.y, 2))>A.rad-B.rad)
return 1;
return 0;
}
void Work ()
{
int q=0, Y, X, radius;
char str[100], c;
int gdriver = DETECT, gmode, errorcode;
initgraph (&gdriver, &gmode, ««);
FILE *f1;
if ((f1=fopen («kursova.txt», «r+»))==NULL)
printf («ERROR»);
while ((c=(getc (f1)))≠EOF)
{
if (c=='=') q++;
}
q=(q)/3;
point temp;
Circle *C=new Circle[q];
rewind (f1);
for (int i=0; i
{
fscanf (f1, «%s % s % d % s % s % d % s % s % d % s%», str, str,&X, str, str,&Y, str, str,&radius, str);
temp.x=X;
temp.y=Y;
C[i]. setdata (temp, radius);
C[i]. draw ();
}
int g=0;
for (int k=0; k
{
for (int j=k+1; j
if (C[k]. gr==0)
if (C[j]. gr==0)
if (peret (C[k], C[j])==1)
{
g++;
C[k]. gr=g;
C[j].gr=g;
break;
}
for (int i=0; i
for (int j=i+1; j
if (C[i]. gr==g)
if (C[j]. gr==0)
if (peret (C[i], C[j])==1)
{
C[j]. gr=g;
}
}
getch ();
setcolor (GREEN);
for (k=1; k
{
for (int i=0; i
if (C[i]. gr==k)
C[i].draw ();
}
float *SQR=new float [g+1];
int *kilk=new int [g+1];
for (i=1; i<=g; i++)
{
SQR[i]=0;
kilk[i]=0;
}
for (int j=1; j<=g; j++)
for (i=0; i
if (C[i]. gr==j)
{
SQR[j]=abs (SQR[j]+C[i]. S);
kilk[j]++;
}
for (j=1; j<=g; j++)
if (kilk[j]≠0)
SQR[j]=(float) SQR[j]/kilk[j];
for (j=1; j<=g; j++)
for (i=0; i
if (C[i]. gr==j)
C[i].S=abs (C[i]. S-SQR[j]);
float m;
float n;
getch ();
for (j=1; j<=g; j++)
{
m=10 000;
n=0;
for (i=0; i
{
if (C[i]. gr==j)
{
if (C[i]. S
{
m=C[i].S;
n=i;
}
}
}
setcolor (RED);
C[n].draw ();
}
getch ();
closegraph ();
}
int main ()
{
Work ();
return 0;
}
Додаток Б
Програма-меню
#include
#include
#include
#include
#define LEFT 75
#define RIGHT 77
#define DOWN 13
class Knopka
{
int x1;
int y1;
int x2;
int y2;
char str[80];
public:
void setparam (int xx1, int yy1, int xx2, int yy2, char *sstr);
void show (int tcolor, int bcolor);
virtual void run (void)=0;
};
class knopka1: public Knopka
{
public:
void run (void);
};
class knopka2: public Knopka
{
public:
void run (void);
};
class knopka3: public Knopka
{
public:
void run (void);
};
class knopka4: public Knopka
{
public:
void run (void);
};
class knopka5: public Knopka
{
public:
void run (void);
};
class Menu
{
knopka1 kn1;
knopka2 kn2;
knopka3 kn3;
knopka4 kn4;
knopka5 kn5;
Knopka *maskn[5];
int x;
int y;
int nomAct;
int actTextCol;
int actBgCol;
int pasTextCol;
int pasBgCol;
void show (void);
void onLeft (void);
void onRight (void);
void onDown (void);
public:
Menu (int xx, int yy);
void getmessage (int msg);
};
void main ()
{
textbackground (0);
clrscr ();
Menu mnu (10,1);
while (1)
mnu.getmessage (getch ());
}
void Knopka: setparam (int xx1, int yy1, int xx2, int yy2, char *sstr)
{
x1=xx1;
y1=yy1;
x2=xx2;
y2=yy2;
strcpy (str, sstr);
};
void Knopka: show (int tcolor, int bcolor)
{
textcolor (tcolor);
textbackground (bcolor);
window (x1, y1, x2, y2);
clrscr ();
gotoxy (1,1);
printf («%s», str);
}
void knopka1: run (void)
{
char str[80], b1;
int kstr=1;
FILE* fin=fopen («about.txt», «r»);
textcolor (15);
textbackground (1);
window (2,7,78,22);
clrscr ();
while (feof (fin)==0)
{
fscanf (fin, «%c»,&b1);
if (b1=='n')
kstr++;
}
rewind (fin);
for (int i=0; i
{
fgets (str, 80, fin);
gotoxy (40−0.5*strlen (str), 1+i*2);
cputs (str);
}
textbackground (0);
getch ();
clrscr ();
}
void knopka2: run (void)
{
spawnl (P_WAIT, «notepad.exe», «notepad», «KURSOVA.txt», NULL);
}
void knopka3: run (void)
{
char adress[40]= «C:\bc31\bin\bc.exe»;
FILE *adrf=fopen («BCadress.txt», «r»);
if (adrf≠NULL)
fgets (adress, 40, adrf);
fclose (adrf);
spawnl (P_WAIT, adress, ««,
«KURSSSS.cpp», NULL);
}
void knopka4: run (void)
{
spawnl (P_WAIT, «KURSSSS.exe», NULL);
}
void knopka5: run (void)
{
exit (0);
}
void Menu: onLeft (void)
{
nomAct=(nomAct==0)? 4: (nomAct-=1);
}
void Menu: onRight (void)
{
nomAct=(nomAct==4)? 0: (nomAct+=1);
}
void Menu: onDown (void)
{
maskn[nomAct]->run ();
}
void Menu: show (void)
{
_setcursortype (_NOCURSOR);
for (int i=0; i<5; i++)
if (i==nomAct)
maskn[i]->show (actTextCol, actBgCol);
else
maskn [i]->show (pasTextCol, pasBgCol);
}
void Menu: getmessage (int msg)
{
switch (msg)
{
case LEFT:
onLeft ();
show ();
break;
case RIGHT:
onRight ();
show ();
break;
case DOWN:
onDown ();
show ();
}
}
Menu: Menu (int xx, int yy)
{
x=xx;
y=yy;
nomAct=0;
maskn[0]=&kn1;
maskn [1]=&kn2;
maskn[2]=&kn3;
maskn [3]=&kn4;
maskn[4]=&kn5;
actTextCol=15;
actBgCol=1;
pasTextCol=0;
pasBgCol=2;
FILE* fin=fopen («menu.txt», «r»);
char str[80];
for (int i=0; i<5; i++)
{
fgets (str, 80, fin);
maskn[i]->setparam (x, y, x+strlen (str) — 2, y, str);
x=x+strlen (str);
}
fclose (fin);
show ();
}
коло радіус програма меню