Смекни!
smekni.com

Об’єктно-орієнтована програма обліку продуктового магазину (стр. 3 из 4)

Для великих проектів потрібні інструменти управління конфігурацією і контролю версій. Для управління конфігурацією кращими одиницями є категорії класів і підсистеми.

Інший інструмент, який є також важливим для об'єктно-орієнтованої розробки, - це бібліотекар класів. Бібліотека в С++ швидко розростається до таких розмірів, що розробники не можуть відшукати клас, що знадобився. Одна з причин швидкого зростання бібліотеки полягає в тому, що клас може мати декілька реалізацій з різними тимчасовими і просторовими семантиками.

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

Вибір даної мови програмування зумовлений через її переваги:

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

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

Вивчення численних випадків з практики підкріплює ці висновки; особливо часто указується на те, що об'єктний підхід може скоротити час розробки і розмір коду.

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

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

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

Висновки

В процесі роботи було створено програму - «Облік продуктового магазину». Програма реалізована в середовищі об’єктно-орієнтованого програмування BorlandС++Builder6.0, на основі мови програмування С++.

Було досліджено предметну область - «Продуктовий магазин», що внесло багато ясності для розробки програми.

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

Створена програма «Облік продуктового магазину» в процесі доопрацювання може бути використана за основу для створення більш складної та великої бази даних по роботі в даній предметній області.


Список використаних джерел

1. Гради Буч Объектно-ориентированный анализ и проектированиес примерами приложений на С++. Второе издание Rational Санта-Клара, Калифорния, перевод с английского под редакцией И. Романовского и Ф. Андреева.

2. Павловская Т.А.С++. Объектно-ориентированное программирование: практикум. СПб: Питер, 2005.

3. Б.С. Хусаинов. Структуры и алгоритмы обработки данных. – Примеры на языке Си: Учеб. Пособие, 2004.

4. Кнут, Дональд, Эрвин. Искуство програмирования в 3-х т.М.: Вильянс, 2003.

5. Катренко А.В. Системний аналіз об’єктів та процесів комп’ютеризації. Львів: Новий світ-2000, 2007.

6. Б.С. Хусаинов. Структуры и алгоритмы обработки данных. – Примеры на языке Си: Учеб. Пособие. Финансы и статистика, 2004.

7. Гайдаржи В.І. Основи проектування та використання баз даних. К.: Політехніка, ТОВ фірма Періодика, 2004.

8. Малевич Б.Я. Теория алгоритмов. М.: Машиностроение, 2004.

9. Прокудин Г.С. Основы программирования и алгоритмические язики. К.: Изд-во Европейського университета, 2003.

10. Озеров В. Советы по Delphi. Советы програмистов. СПб.: Символ-плюс,2002.


Додаток А

Результат роботи програми «Облік продуктового магазину»

Рис. 1 - Форма обліку продуктового магазину

Додаток Б

Лістинг програми

1. Table.cpp

#include <vcl.h>

#pragma hdrstop

#include "Table.h"

Table::Table()

{

list = new Record;

list->next = list->prev = list;

list->id = 0;

ID = 0;

}

Table::~Table()

{

Record *t,*q;

for(t=list->next;t!=list;t=q)

{

q = t->next;

delete t->data;

delete t;

}

delete list;

}

Table:Iterator Table:record()

{

Record *r = new Record;

ID++;

r->id = ID;

r->data = create();

r->next = list->next;

r->prev = list;

list->next->prev = r;

list->next = r;

return Iterator(r,this);

}

void Table::clear()

{

Record *t,*q;

for(t=list->next;t!=list;t=q)

{

q = t->next;

delete t->data;

delete t;

}

list->next = list->prev = list;

ID = 0;

}

void Table::save(FILE *f)

{

Fprintf(f,"%d&bsol;n",ID);

for(Record *t=list->next;t!=list;t=t->next)

{

fprintf(f,"%7d ",t->id);

t->data->save(f);

fprintf(f,"&bsol;n");

}

Fprintf(f,"END");

}

void Table::zvit(FILE *f)

{

fprintf(f,"Ціна Назва Виробник Вид Дата&bsol;n");

fprintf(f,"-----------------------------------------------&bsol;n");

for(Record *t=list->next;t!=list;t=t->next)

{

t->data->zvit(f);

}

}

void Table::load(FILE *f)

{

int id;

Record *t;

int rez = fscanf(f,"%d&bsol;n",&ID);

if((rez!=EOF)&&(rez!=0))

{

while(true)

{

t = new Record;

rez = fscanf(f,"%d",&t->id);

if((rez==EOF)||(rez==0))

{

delete t;

break;

}

t->data = create();

rez = t->data->load(f);

if((rez==EOF)||(rez==0))

{

delete t;

break;

}

t->next = list;

t->prev = list->prev;

list->prev->next = t;

list->prev = t;

}

}

}

void Table::Iterator::remove()

{

r->next->prev = r->prev;

r->prev->next = r->next;

delete r->data;

delete r;

}

void Table::Iterator::operator >>(Iterator &p)

{

if((t==p.t)&&(p.r!=r)&&(p.r!=r->next)&&(p.r!=t->list))

{

p.r->next->prev = p.r->prev;

p.r->prev->next = p.r->next;

p.r->next = r->next;

p.r->prev = r;

r->next->prev = p.r;

r->next = p.r;

}

}

void Table::Iterator::operator <<(Iterator &p)

{

if((t==p.t)&&(p.r!=r)&&(p.r!=r->prev)&&(p.r!=t->list))

{

p.r->next->prev = p.r->prev;

p.r->prev->next = p.r->next;

p.r->next = r;

p.r->prev = r->prev;

r->prev->next = p.r;

r->prev = p.r;

}

}

2. Table.h

#ifndef TableH

#define TableH

#include <stdlib.h>

#include <stdio.h>

#include "Date.h"

#include "My_date.h"

class Table

{

public:

class Data

{

public: virtual ~Data(){}

virtual void save(FILE *f){}

virtual void zvit(FILE *f) {}

virtual int load(FILE *f){return 1;}

};

private:

struct Record

{

int id;

Data *data;

Record *next;

Record *prev;

} *list;

int ID;

public:

class Iterator;

friend class Iterator;

class Iterator

{

friend class Table;

Record *r;

Table *t;

protected:

Iterator(Record *R,Table *T):r(R),t(T){}

Data* data() {return r->data;}

Iterator the_next() {return Iterator(r->next,t);}

Iterator the_prev() {return Iterator(r->prev,t);}

public: Iterator(){}

int id(){return r->id;}// повертає номер запису в таблиці

voidoperator++() {r = r->next;}// переміщує ітератор на наступний запис

voidoperator--() {r = r->prev;}// переміщує ітератор на попередній запис

bool operator==(const Iterator &p){return r==p.r;}// порівнює з іншим ітератором

bool operator!=(const Iterator &p){return r!=p.r;}// порівнює з іншим ітератором

bool valid() {return r!=t->list;}// true - вказує на дійсний елемент;false - вказує на нульовий елемент

void operator>>(Iterator &p);// перемістити p після даного ітератора

void operator<<(Iterator &p);// перемістити p до даного ітератора

voidremove();// видалити запис з таблиці

};

protected:

Iterator the_first() {return Iterator(list->next,this);}

Iterator the_last() {return Iterator(list->prev,this);}

Iterator record();

virtual Data* create(){return new Data;};

public: Table();

virtual ~Table();

void clear();// очистити таблицю

void save(FILE *f);// зберегти таблицю

void zvit(FILE *f);

void load(FILE *f);// завантажити таблицю

};

template<class MyData> class MyTable : public Table

{

public:

class Iterator : public Table::Iterator

{

friend class MyTable;

Iterator(const Table::Iterator &p):Table::Iterator(p){}

public: Iterator(){}

MyData& operator*() {return *(MyData*)data();}// доступ до полів MyData

MyData* operator->() {return (MyData*)data();}// доступ до полів MyData

Iterator next() {return Iterator(the_next());}// повертає ітератор на наступний елемент

Iterator prev() {return Iterator(the_prev());}// повертає ітератор на попередній елемент

};

protected:

virtual Data* create(){return new MyData;}

public: Iterator record() {return Iterator(Table::record());}// створює новий запис і повертає ітератор на нього

Iterator first() {return Iterator(the_first());}// повертає ітератор на перший запис в таблиці

Iterator last() {return Iterator(the_last());}// повертає ітератор на останній запис в таблиці

};

3. Number.cpp

#include <vcl.h>

#pragma hdrstop

#include "Number.h"

void Number::save(FILE *f)

{char s[1000];

char s1[1000];

char s2[1000];

sprintf(s,"%s",str.c_str());

sprintf(s1,"%s",str1.c_str());

sprintf(s2,"%s",str2.c_str());

for(int i=0;s[i];i++) if(s[i]==' ') s[i]='_';

fprintf(f,"%d %s %s %s %d %d %d ",d,s,s1,s2,day,month,year);

}

void Number::zvit(FILE *f)

{

char s[1000];

char s1[1000];

char s2[1000];

sprintf(s,"%s",str.c_str());

sprintf(s1,"%s",str1.c_str());

sprintf(s2,"%s",str2.c_str());

fprintf(f,"%5d %10s %10s %10s %2d %2d %4d ",d,s,s1,s2,day,month,year);

fprintf(f,"&bsol;n");

}

int Number::load(FILE *f)

{ char s[1000];

char s1[1000];

char s2[1000];

int rez = fscanf(f,"%d %s %s %s %d %d %d",&d,s,s1,s2,&day,&month,&year);

if(rez==7)

{ for(int i=0;s[i];i++) if(s[i]=='_') s[i]=' ';

for(int i=0;s1[i];i++) if(s1[i]=='_') s1[i]=' ';

for(int i=0;s2[i];i++) if(s2[i]=='_') s2[i]=' ';

str = AnsiString(s);

str1 = AnsiString(s1);

str2 = AnsiString(s2);

}

return rez;

}


4. Number.h

#ifndef NumberH

#define NumberH

#include "Table.h"

#include "Date.h"

#include "My_date.h"

class Number : public Table::Data

{

public: int d;

intday; // число випуска

intyear; // год випуска

intmonth; // месяц випуска