Разработка базы данных компьютеров


Оглавление

Введение

1. Общая характеристика работы

1.1 Актуальность работы

1.2 Цель работы

1.3 Задачи работы

2. Классы

3. Структуры

4. Стандартная библиотека шаблонов

5. Контейнеры

6. Описание глобальных переменных подпрограммы

7. Листинг программы

Заключение

Список литературы

Введение

Раньше, до того, как распространение получили первые ЭВМ, рабочий персонал испытывал трудности с хранением информацией о товарах, качеством обработки данной информации. С внедрением в торгово-промышленную структуру первых ЭВМ одновременно появились и программы, систематизирующие и ускоряющие работу и учёт товаров. Эти программы являются базами данных, в которых и происходит хранение всех данных о товарах. Современное программное обеспечение позволяет пользователям хранить огромные объёмы информации о продукции, вводить в базу данных значения введённые с клавиатуры, удалять любую строку по желанию пользователя, просматривать все записи, хранящиеся в базе данных, выводить количество всех записей на экран, легко и быстро находить нужный товар по необходимым параметрам, без сложной работы с документами производить быструю надбавку в процентном соотношении на нужный товар. Подобный программный продукт широко используется в большинстве современных сетей крупных магазинов и торговых центров.

База данных — представленная в объективной форме совокупность самостоятельных материалов (статей, расчётов, нормативных актов, судебных решений и иных подобных материалов), систематизированных таким образом, чтобы эти материалы могли быть найдены и обработаны с помощью электронной вычислительной машины. База данных «Компьютер» предоставляет возможность пользователю хранить и обрабатывать сведения о компьютерах.

Задачи работы: реализовать программу в виде класса, используя для хранения информации контейнеры стандартной библиотеки шаблонов (STL) языка C++. Программа должна включать следующие функции:

Создание новой базы данных;

Вывод информации о всех компьютерах;

Добавление в контейнер;

Удаление элементов контейнера;

Замены элементов контейнера;

Поиск по контейнеру по заданному критерию.

Запись о компьютере представляет собой структуру, с полями:

база компьютер поиск библиотека

Код товара

Произво-дитель

Тип процессора

Частота работы

Объём

ОЗУ

Объём жёсткого диска

Объём памяти видеокарты

Стои-мосnь

Коли-чество

1. Общая характеристика работы

1.1 Актуальность работы

Актуальность программного продукта «база данных» заключается в востребованности баз данных, хранящих информацию в памяти и предоставляющих пользователю широкий спектр возможностей по обработке данной информации. Разработанная на языке программирования высокого уровня C++, программа использует принципы объектно-ориентированного программирования и структурный подход к решению поставленных задач, обладает удобным интерфейсом, способностью к изменению под другие типы задач.

1.2 Цель работы

Целью данной курсовой работы является создание базы данных компьютеров, изучение алгоритмов, используемых при проектировании программы.

1.2 Задачи работы

1. Изучить теоретический материал по теме «Объектно-ориентированное программирование», а также практические особенности проектирования программы.

2. Реализовать программу в виде класса, используя для хранения информации контейнеры стандартной библиотеки шаблонов (STL) языка C++(с помощью стандартной библиотеки шаблонов).

3. Оформить результаты выполнения курсовой работы в соответствии с предъявляемыми требованиями.

2. Классы

Класс — составной тип данных, элементами которого являются функции и переменные. В основу понятия класс положен тот факт, что «над объектами можно совершать различные операции». Свойства объектов описываются с помощью полей классов, а действия над объектами описываются с помощью функций, которые называются методами класса. Класс имеет имя, состоит из полей, называемых членами класса и функций — методов класса.

Объекты — конкретное представление абстракции, имеющее свои свойства и методы. Созданные объекты на основе одного класса называются экземплярами этого класса. Эти объекты могут иметь различное поведение, свойства, но все равно будут являться объектами одного класса. В ООП существует три основных принципа построения классов:

Инкапсуляция — это свойство, позволяющее объединить в классе и данные, и методы, работающие с ними и скрыть детали реализации от пользователя.

Наследование — это свойство, позволяющее создать новый класс-потомок на основе уже существующего, при этом все характеристики класса родителя присваиваются классу-потомку.

Полиморфизм — свойство классов, позволяющее использовать объекты классов с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.

Пример инкапсуляции в С++:

class A

{

public:

int a, b; //данные открытого интерфейса

int ReturnSomething(); //метод открытого интерфейса

private:

int Aa, Ab; //скрытые данные

void DoSomething(); //скрытый метод

};

Класс А инкапсулирует свойства Aa, Ab и метод DoSomething, представляя внешний интерфейс ReturnSomething, a, b.

В наследовании класс-наследник реализует спецификацию уже существующего класса (базовый класс). Это позволяет обращаться с объектами класса-наследника точно так же, как с объектами базового класса.

Существуют два типа наследования.

В простом наследовании класс, от которого произошло наследование, называется базовым или родительским. Классы, которые произошли от базового, называются потомками, наследниками или производными классами.

В некоторых языках используются абстрактные классы. Абстрактный класс — это класс, содержащий хотя бы один абстрактный метод, он описан в программе, имеет поля, методы и не может использоваться для непосредственного создания объекта. То есть от абстрактного класса можно только наследовать. Объекты создаются только на основе производных классов, наследованных от абстрактного. Например, абстрактным классом может быть базовый класс «сотрудник вуза», от которого наследуются классы «аспирант», «профессор» и т. д. Так как производные классы имеют общие поля и функции (например, поле «год рождения»), то эти члены класса могут быть описаны в базовом классе. В программе создаются объекты на основе классов «аспирант», «профессор», но нет смысла создавать объект на основе класса «сотрудник вуза».

При множественном наследовании у класса может быть более одного предка. В этом случае класс наследует методы всех предков. Множественное наследование реализовано в C++.

Множественное наследование — потенциальный источник ошибок, которые могут возникнуть из-за наличия одинаковых имен методов в предках. В языках, которые позиционируются как наследники C++ (Java, C# и др.), от множественного наследования было решено отказаться в пользу интерфейсов. Практически всегда можно обойтись без использования данного механизма. Однако, если такая необходимость все-таки возникла, то, для разрешения конфликтов использования наследованных методов с одинаковыми именами, возможно, например, применить операцию расширения видимости — «::» — для вызова конкретного метода конкретного родителя.

Попытка решения проблемы наличия одинаковых имен методов в предках была предпринята в языке Эйфель, в котором при описании нового класса необходимо явно указывать импортируемые члены каждого из наследуемых классов и их именование в дочернем классе.

Большинство современных объектно-ориентированных языков программирования (C#, Java, Delphi и др.) поддерживают возможность одновременно наследоваться от класса-предка и реализовать методы нескольких интерфейсов одним и тем же классом. Этот механизм позволяет во многом заменить множественное наследование — методы интерфейсов необходимо переопределять явно, что исключает ошибки при наследовании функциональности одинаковых методов различных классов-предков.

Пример наследования в C++:

class A{ //базовый класс

};

class B : public A{ //public наследование

};

class C : protected A{ //protected наследование

};

class Z : private A{ //private наследование

};

В C++ существует три типа наследования: public, protected, private. Спецификаторы доступа членов базового класса меняются в потомках следующим образом.

Если класс объявлен как базовый для другого класса со спецификатором доступа public, тогда public члены базового класса доступны как public члены производного класса, protected члены базового класса доступны как protected члены производного класса.

Если класс объявлен как базовый для другого класса со спецификатором доступа protected, тогда public и protected члены базового класса доступны как protected члены производного класса.

Если класс объявлен как базовый для другого класса со спецификатором доступа private, тогда public и protected члены базового класса доступны как private члены производного класса.

Одним из основных преимуществ public-наследования является то, что указатель на классы-наследники может быть неявно преобразован в указатель на базовый класс, то есть для примера выше можно написать:

A* a = new B();

Язык программирования поддерживает полиморфизм, если классы с одинаковой спецификацией могут иметь различную реализацию — например, реализация класса может быть изменена в процессе наследования.

Кратко смысл полиморфизма можно выразить фразой: «Один интерфейс, множество реализаций».

Полиморфизм позволяет писать более абстрактные программы и повысить коэффициент повторного использования кода. Общие свойства объектов объединяются в систему, которую могут называть по-разному — интерфейс, класс. Общность имеет внешнее и внутреннее выражение:

внешняя общность проявляется как одинаковый набор методов с одинаковыми именами и сигнатурами (именами методов, типами аргументов и их количеством);

внутренняя общность — одинаковая функциональность методов. Её можно описать интуитивно или выразить в виде строгих законов, правил, которым должны подчиняться методы. Возможность приписывать разную функциональность одному методу (функции, операции) называется перегрузкой метода (перегрузкой функций, перегрузкой операций).

В объектно-ориентированных языках класс является абстрактным типом данных. Полиморфизм реализуется с помощью наследования классов и виртуальных функций. Класс-потомок наследует сигнатуры методов класса-родителя, а реализация, в результате переопределения метода, этих методов может быть другой, соответствующей специфике класса-потомка. Другие функции могут работать с объектом как с экземпляром класса-родителя, но если при этом объект на самом деле является экземпляром класса-потомка, то во время исполнения будет вызван метод, переопределенный в классе-потомке. Это называется поздним связыванием.

Класс-потомок сам может быть родителем. Это позволяет строить сложные схемы наследования— древовидные или сетевидные. [1[,[2]

Абстрактные (или чисто виртуальные) методы не имеют реализации вообще (на самом деле некоторые языки, например C++, допускают реализацию абстрактных методов в родительском классе). Они специально предназначены для наследования. Их реализация должна быть определена в классах-потомках.

Пример полиморфизма в С++:

class ClassOne {

protected:

int num;

public:

ClassOne(){num=0;};

void func(){num++; cout << num << »
«;};

};

class ClassTwo : public ClassOne {

public:

void func(){num—; cout << num << »
«;};

};

void main(){

ClassOne *One = new ClassOne;

ClassTwo *Two = new ClassTwo;

One->func(); // Оригинальный метод

Two->func(); } // Полиморфный метод

3. Структуры

Структурой в языке C называется совокупность логически связанных переменных различных типов, сгруппированных под одним именем для удобства дальнейшей обработки.

Структура — это способ связать воедино данные разных типов и создать пользовательский тип данных.

Структура — тип данных, задаваемый пользователем. В общем случае при работе со структурами следует выделить четыре момента:

— объявление и определение типа структуры,

— объявление структурной переменной,

— инициализация структурной переменной,

— использование структурной переменной.

Определение типа структуры представляется в виде

struct ID

{

<тип> <имя 1-го элемента>;

<тип> <имя 2-го элемента>;

…………

<тип> <имя последнего элемента>;

};

Определение типа структуры начинается с ключевого слова struct и содержит список объявлений, заключенных в фигурные скобки. За словом struct следует имя типа, называемое тегом структуры (tag — ярлык, этикетка). Элементы списка объявлений называются членами структуры или полями. Каждый элемент списка имеет уникальное для данного структурного типа имя. Однако следует заметить, что одни и те же имена полей могут быть использованы в различных структурных типах.

Определение типа структуры представляет собой шаблон (template), предназначенный для создания структурных переменных.

Объявление переменной структурного типа имеет следующий вид:

struct ID var1. [3]

4. Стандартная библиотека шаблонов

Стандартная библиотека шаблонов (STL) — набор согласованных обобщённых алгоритмов, контейнеров, средств доступа к их содержимому и различных вспомогательных функций в C++.

Стандартная библиотека шаблонов до включения в стандарт C++ была сторонней разработкой, в начале — фирмы HP, а затем SGI. Стандарт языка не называет её «STL», так как эта библиотека стала неотъемлемой частью языка, однако многие люди до сих пор используют это название, чтобы отличать её от остальной части стандартной библиотеки (потоки ввода/вывода (iostream), подраздел Си и др.).

Проект под названием STLPort, основанный на SGI STL, осуществляет постоянное обновление STL, iostream и строковых классов. Некоторые другие проекты также занимаются разработкой частных применений стандартной библиотеки для различных конструкторских задач. Каждый производитель компиляторов C++ обязательно поставляет какую-либо реализацию этой библиотеки, так как она является очень важной частью стандарта и широко используется.

Библиотека содержит пять основных видов компонентов:

алгоритм (algorithm): определяет вычислительную процедуру.

контейнер (container): управляет набором объектов в памяти.

итератор (iterator): обеспечивает для алгоритма средство доступа к содержимому контейнера.

функциональный объект (function object): инкапсулирует функцию в объекте для использования другими компонентами.

адаптер (adaptor): адаптирует компонент для обеспечения различного интерфейса.

Разделение позволяет уменьшить количество компонентов. Например, вместо написания отдельной функции поиска элемента для каждого типа контейнера обеспечивается единственная версия, которая работает с каждым из них, пока соблюдаются основные требования. [4]

5. Контейнеры

Контейнеры библиотеки STL можно разделить на четыре категории: последовательные, ассоциативные, контейнеры-адаптеры и псевдоконтейнеры.

Контейнер

Описание

Последовательные контейнеры

vector

C-подобный динамический массив произвольного доступа с автоматическим изменением размера при добавлении/удалении элемента. Доступ по индексу за. Добавление-удаление элемента в конец vector занимает амортизированное время, та же операция в начале или середине vector — . Стандартная быстрая сортировка за. Поиск элемента перебором занимает. Существует специализация шаблона vector для типа bool, которая требует меньше памяти за счёт хранения элементов в виде битов, однако она не поддерживает всех возможностей работы с итераторами.

list

Двусвязный список, элементы которого хранятся в произвольных кусках памяти, в отличие от контейнера vector, где элементы хранятся в непрерывной области памяти. Поиск перебором медленнее, чем у вектора из-за большего времени доступа к элементу. Доступ по индексу за. В любом месте контейнера вставка и удаление производятся очень быстро — за.

deque

Дэк. Контейнер похож на vector, но с возможностью быстрой вставки и удаления элементов на обоих концах за. Реализован в виде двусвязанного списка линейных массивов. С другой стороны, в отличие от vector, дек не гарантирует расположение всех своих элементов в непрерывном участке памяти, что делает невозможным безопасное использование арифметики указателей для доступа к элементам контейнера.

Ассоциативные контейнеры

set

Упорядоченное множество уникальных элементов. При вставке/удалении элементов множества итераторы, указывающие на элементы этого множества, не становятся недействительными. Обеспечивает стандартные операции над множествами типа объединения, пересечения, вычитания. Тип элементов множества должен реализовывать оператор сравнения operator< или требуется предоставить функцию-компаратор. Реализован на основе самобалансирующего дерева двоичного поиска.

multiset

То же что и set, но позволяет хранить повторяющиеся элементы.

map

Упорядоченный ассоциативный массив пар элементов, состоящих из ключей и соответствующих им значений. Ключи должны быть уникальны. Порядок следования элементов определяется ключами. При этом тип ключа должен реализовывать оператор сравнения operator<, либо требуется предоставить функцию-компаратор.

multimap

То же что и map, но позволяет хранить несколько одинаковых ключей.

Контейнеры-адаптеры

stack

Стек — контейнер, в котором добавление и удаление элементов осуществляется с одного конца.

queue

Очередь — контейнер, с одного конца которого можно добавлять элементы, а с другого — вынимать.

priority_queue

Очередь с приоритетом, организованная так, что самый большой элемент всегда стоит на первом месте.

Псевдоконтейнеры

bitset

Служит для хранения битовых масок. Похож на vector<bool> фиксированного размера. Размер фиксируется тогда, когда объявляется объект bitset. Итераторов в bitset нет. Оптимизирован по размеру памяти.

basic_string

Контейнер, предназначенный для хранения и обработки строк. Хранит в памяти элементы подряд единым блоком, что позволяет организовать быстрый доступ ко всей последовательности. Элементы должны быть POD‘ами. Определена конкатенация с помощью +.

valarray

Шаблон служит для хранения числовых массивов и оптимизирован для достижения повышенной вычислительной производительности. В некоторой степени похож на vector, но в нём отсутствует большинство стандартных для контейнеров операций. Определены операции над двумя valarray и над valarray и скаляром (поэлементные).

Все «полноценные» стандартные контейнеры удовлетворяют определенному набору требований (или соглашений). В приведенной ниже таблице полагается, что С — класс контейнера, содержащий объекты типа Т.

Выражение

Возвращаемый тип

Сложность

Примечание

C::value_type

T

Время компиляции

C::reference

T

Время компиляции

C::const_reference

Время компиляции

C::pointer

Тип указателя, указывающего на C::reference

Время компиляции

Указатель на Т

C::iterator

Тип итератора, указывающего на C::reference

Время компиляции

Итератор любого типа, кроме итератора вывода

C::const_iterator

Тип итератора, указывающего на C::const_reference

Время компиляции

Итератор любого типа, кроме итератора вывода

C::size_type

Беззнаковый целочисленный тип

Время компиляции

C obj;

Постоянная

После: obj. size() == 0

C obj1; obj1 = obj2;

Линейная

После: obj1 == obj2

C obj; (&obj)->~C();

Результат не используется

Линейная

После: a. size() == 0.

obj. begin()

Постоянная

obj. end()

Постоянная

obj1 == obj2

Обратимый в bool

Линейная

obj1 != obj2

Обратимый в bool

Линейная

obj. size()

size_type

Зависит от типа

Не рекомендуется применять для проверки, пуст ли контейнер

obj. empty()

Обратимый в bool

Постоянная

obj1 < obj2

Обратимый в bool

Линейная

obj1 > obj2

Обратимый в bool

Линейная

obj1 <= obj2

Обратимый в bool

Линейная

obj1 >= obj2

Обратимый в bool

Линейная

obj. swap(obj2)

void

Постоянная

6. Описание глобальных переменных подпрограммы

class computer

{

public:

char code[20];

char producer;

int frequency;

char type[15];

int cost;

char Vozu[5];

char Vvideo[5];

int Vhard;

int quantity;

};

— код компьютера

— производитель

— частота процессора

— тип процессора

— цена процессора

— объём ОЗУ

— объём памяти видеокарты

— объём памяти жёсткого диска

— количество компьютеров

7. Листинг программы

#include <iostream>

#include <conio. h>

#include <vector>

using namespace std;

class computer

{ public:

char code[20];

char producer;

int frequency;

char type[15];

int cost;

char Vozu[5];

char Vvideo[5];

int Vhard;

int quantity;

};

int main()

{

int vibor, i,bul;

computer buf, buf2;

char vect[35];

vector <computer> v;

for(;;){

cout<< «1 add computer
«;

cout<< «2 display all data about computers
«;

cout<< «3 search of processor type
«;

cout<< «4 search of OZU volume
«;

cout<< «5 search of hardware volume
«;

cout<< «6 delete position
«;

cout<< «7 change position
«;

cout<< «8 exit
«;

cin >> vibor;

if ((vibor==1)||(vibor==7))

{

if (vibor==7)

{

cout << «pass the processor code which will be changed
«;

cin >> vect;

vector<computer>::iterator elem1 = v. begin();

vector<computer>::iterator elem2 = v. begin();

for( i=0; i<v. size(); i++)

{

buf = v[i];

bul=strcmp(vect, buf. code);

if (bul==0)

{

elem2=v. erase(elem1+i);

}

}

if (vibor==7){

if((i+1)==v. size()) cout<<«does not exists
«;

}

}

cout<<«pass the processor code
«;

cin >> buf. code;

cout<<«pass the producter of the processor
«;

cin >> buf. producer;

cout<<«pass frequency of the processor
«;

cin >> buf. frequency;

cout<<«pass type of the processor
«;

cin >> buf. type;

cout<<«pass the processor cost
«;

cin >> buf. cost;

cout <<«pass the volume of OZU
«;

cin >>buf. Vozu;

cout <<«pass the volume of hardware
«;

cin >>buf. Vhard;

cout <<«pass the volume of videocard
«;

cin >>buf. Vvideo;

cout <<«pass the quantity of processors
«;

cin >>buf. quantity;

cout << »
«;

v. push_back(buf);

}

if (vibor==3)

cout << «pass type of the processor
«;

if (vibor==4)

cout << «pass the volume of OZU
«;

if (vibor==5)

cout << «pass the volume of hardware
«;

if ((vibor==2)||(vibor==3)||(vibor==4)||(vibor==5))

{

if ((vibor==3)||(vibor==4)||(vibor==5))cin>>vect;

if (vibor==2)bul=0;

for( i=0; i<v. size(); i++)

{

buf = v[i];

if (vibor==3){bul=strcmp(vect, buf. type);}

if (vibor==4){bul=strcmp(vect, buf. Vozu);}

if (vibor==5){bul=strcmp(vect, buf. Vvideo);}

if (bul==0)

{

cout <<buf. code<<» «

<<buf. producer<<» «

<<buf. frequency<<» «

<<buf. type<<» «

<<buf. cost<<» «

<<buf. Vozu<<» «

<<buf. Vhard<<» «

<<buf. Vvideo<<» «

<<buf. quantity<<»
«;

}

if ((vibor==3)||(vibor==4)||(vibor==5))

{

if((i+1)==v. size())cout<<«does not exists
«;

}

}

if (vibor==2)_getch();

}

if (vibor==6)

{

cout << «pass the processor code which will be deleted
«;

cin >>vect;

vector<computer>::iterator elem1 = v. begin();

for( i=0; i<v. size(); i++)

{

buf = v[i];

bul=strcmp(vect, buf. code);

if (bul==0)

{

v. erase(elem1+i);

}

}

if((i+1)==v. size()) cout<<«does not exists
«;

}

if (vibor==8){

return 0;

}

}

}

8. Пример работы программы

Заключение

В современном мире создание баз данных очень востребовано. Группировка материалов и их хранение в специально созданной программе в памяти компьютера облегчает процесс работы с информацией. Ввиду многочисленных плюсов базы данных сегодня широко распространены, а значит и актуален вопрос защиты баз данных от любых негативных последствий.

Написанная мною программа «компьютер» написана в духе стандартных программ баз данных. Она обладает функцией ввод, обработки и поиска данных в базе. Также программа включает в себя следующие процедуры: создание новой базы данных, просмотр существующей базы данных, редактирование данных, их добавление и удаление, поиск записей.

В ходе проведённой работы мною были изучены основы объектно-ориентированного программирования.

Список литературы

Р. Лафоре. Объектно-ориентированное программирование в С++. М, 2011 [1]

Голицына О. Л., Максимов Н. В., Партыка Т. Л., Попов И. И. Информационные технологии 2008

Шаллоуей А. Шаблоны проектирования. Новый подход к объектно-ориентированному анализу и проектированию. М, 2010