/lab2ppvis

Проектирование простой домашней библиотеки на C++.

Primary LanguageC++

Описание класса

Класс «Домашняя библиотека» объявлен следующим образом:
class HomeBibl{
public:
char *avtor;
char *name;
int year;
HomeBibl();
void SearchBook();
void SortBooks(int mode, bool HighLow);
void DelBook(int idx);
void DelAllBooks();
void AddBook();
void EditBook(int idx);
~HomeBibl(){};
};
Все методы и поля объявлены как public. Доступ к таким членам класса можно получить из любой части программы, они доступны любым объектам любых классов.
Далее объявлен массив объектов типа «класс»:
HomeBibl ob [Max_Num_Books];


Описание полей класса
Для хранения таких данных как ФИО автора и название книги используется тип данных – строка. Год издания хранится в переменной типа «целое число».
Строки рассматриваются как массив символов, оканчивающиеся нулевым символом (‘\0’). Функции работы со строками описаны в стандартном заголовочном файле "string.h"
Строку можно объявить как массив символов или как переменную типа char*. В данной работе используется второй вариант.
char *avtor;
Данное поле предназначено для хранения данных об авторе: ФИО автора. Используется тип данных – строка.
char *name;
Данное поле предназначено для хранения данных о названии книжки. Используется тип данных – строка.
int year;
Данное поле предназначено для хранения данных о годе издания книжки. Тип данных – целое число (int).
Описание методов класса

void SearchBook()
Метод предназначен для поиска книги в библиотеке. Алгоритм поиска выглядит следующим образом:
//сохраняем данные книги, которую надо найти
book.avtor = avtor;
book.name = name;
book.year = year;
// цикл по всем книгам
for (int i=0; i<Num;i++) {
//ищем книгу с заданными параметрами
if (book.avtor = book[i]. avtor) &&
(book.name = book[i]. name) &&
(book.year = book[i]. year) then Ok
}


void AddBook()
Метод предназначен для добавления книги в библиотеку. Алгоритм поиска выглядит следующим образом:
//записываем данные о новой книге в конец файла
Add(file);
//увеличиваем число книг в библиотеке
numRecords++;
//добавляем данные о новой книге в массив
ob[numRecords].avtor = this->avtor;
ob[numRecords].name = this->name;
ob[numRecords].year = this->year;


void DelAllBooks()

Метод предназначен для удаления всех книг из библиотеки. Алгоритм удаления книг выглядит следующим образом:
//цикл по всем книгам
for(int i = 0; i<numRecords; i++){
//присваиваем данным о книге пустые значения
ob[i].avtor = "";
ob[i].name = "";
ob[i].year = 0;
};
// очистить файл с данными о книгах
Del(file);


void DelBook (int idx)

Метод предназначен для удаления книги из библиотеки. Метод содержит один параметр – индекс удаляемой книги в массиве книг. Алгоритм удаления книги выглядит следующим образом:

//цикл по всем книгам
for (int i = 0; i < numRecords; i++){
// перемещяем данные о книге
ob[idx+i].avtor = ob[idx+i+1].avtor;
ob[idx+i].name = ob[idx+i+1].name;
ob[idx+i].year = ob[idx+i+1].year;
}
//уменьшаем число книг в библиотеке
numRecords--;
//удаляем книгу в файле
Del(file, book)


void EditBook (int idx)

Метод предназначен для редактирования книги из библиотеки. Алгоритм редактирования книги выглядит следующим образом:

//сохраним данные о редактируемой книге в переменную
HomeBibl book;
//найдем книгу и изменим ее данные
ob[idx].avtor = this->avtor;
ob[idx].name = this->name;
ob[idx].year = this->year;
//записываем данные в файл
Write(book, file)


void SortBooks(int mode, bool HighLow)

Метод предназначен для сортировки книг из библиотеки. Метод содержит два параметра: mode – режим сортировки (1 – по названию, 2 – по автору, 3 – по году издания); HighLow – может принимать два значения true – сортировка по возрастанию, false – сортировка по убыванию. Алгоритм сортировки книг выглядит следующим образом:

//цикл по всем книжкам
for (i = 0; i<numRecords; i++) {
switch (mode) {
case 1: s1 = ob[i].avtor;
case 2: s1 = ob[i].name;
case 3: s1 = ob[i].year;
}
//цикл по всем книжкам
for (j = i+1; j<numRecords; j++) {
case 1: s2 = ob[j].avtor;
case 2: s2 = ob[j].name;
case 3: s2 = ob[j].year;
if (HighLow)
//если в первой строке символ больше чем во второй то меняем местами имена
if (s1 > s2) change = true; else change = false;
else
//если в первой строке символ больше чем во второй то меняем местами имена
if (s1 < s2) change = true; else change = false;
}
if (change) {
//меняем местами элементы
t1 = s1; s1 = s2; s2 = t1;
}
change = false;
}
}


Работа со строками

Стандартная библиотека предоставляет средства вычисления длины строки, копирования, сравнения, поиска вхождений одной строки в другую и т.д.. Функции описаны в стандартном заголовочном файле "string.h"
Для работы со строками в программе используются следующие функции:
Определение длины строки:
size_t strlen(const char *s);
Копирование строк:
char *strcpy(char *dst, const char *src); копировать строку src в строку dst;
Сравнение строк:
int strcmp(const char *s1, const char *s2); - лексикографическое сравнение строк s1 и s2. Результат нулевой, если строки равны, отрицательный, если первая строка меньше второй, и положительный, если первая строка больше второй;



Используемые компоненты


Все компоненты в C++Builder создаются при помощи классов. Каждому компоненту соответствует класс. Множество визуальных компонентов составляют иерархию классов.
Основными понятиями при работе с визуальными компонентами являются свойства, события и методы компонентов.
Свойства компонентов хранят характеристики компонента, такие как размер, цвет, положение на экране, шрифт и т.д.
Методы компонента – методы класса, от которого образован компонент. Методы компонентов обычно служат для работы со свойствами данного компонента.
События в C++Builder служат для управления работой программы при помощи функций. Эти функции называются обработчиками событий. Они задают действие программы на такие события как создание окна, манипуляции мышью, нажатие клавиш и т.д. Некоторые события могут быть вызваны действиями пользователя, другие – программно.
Форма
Форма является основным компонентом приложений. На формах располагаются все остальные компоненты. Первая форма приложения является главной. По умолчанию при запуске программы только первая форма будет видимой. При закрытии главной формы завершается работа всего приложения.
Как и любой визуальный компонент, форма содержит свойства и методы, а также «умеет» обрабатывать события.
Некоторые свойства формы:
Align – задаёт выравнивание формы на экране.
AutoScroll – разрешает или запрещает автоскроллирование.
AutoSize – разрешает автоизменение размеров окна для того, чтобы оно умещало все компоненты.
Caption – заголовок окна. Отображается в верхней части окна.
ClientHeight и ClientWidth – высота и ширина клиентской части окна.
Color – цвет окна.
Font – шрифт по умолчанию для компонентов формы..
Height – высота окна.
HorzScrollBar – задаёт внешний вид и параметры горизонтальной линейки прокрутки.
Menu – задаёт главное меню формы.
Name – имя компонента.
VertScrollBar – задаёт внешний вид и параметры вертикальной линейки прокрутки.
Visible – разрешает или запрещает показ окна на экране.
Width – ширина окна.
StringGrid
Предназначен для представления текстовых данных в табличной форме.
Каждая ячейка таблицы имеет ассоциированную с ней текстовую строку. Если ячейки не умещаются в пределах окна, то можно использовать линейки прокрутки для перемещения по таблице.
Можно назначить фиксированные заголовки строк и столбцов, которые не будут перемещаться линейками прокрутки. Ширину столбцов (и высоту строк) таблицы можно задавать независимо друг от друга для каждого столбца (строки). Значения ячеек нельзя задать в режиме проектирования, а только в работающей программе.
При помощи обработчиков событий можно управлять обработкой вводимых данных и отображением ячеек таблицы.
Основные свойства:
Cells – двухмерный массив, содержащий строки таблицы;
Cols – массив указателей на объекты TStringList, хранящие данные столбцов;
Rows – массив указателей на объекты TStringList, хранящие данные строк;
Col – столбец, в которой находится курсор;
ColCount – количество столбцов в таблице;
FixedCols – количество столбцов, которые не скроллируются;
FixedRows – количество фиксированных строк;
Options –набор флагов, задающих режимы таблицы;
Row – строка, в которой находится курсор;
RowCount – число строк в таблице;
RowHeights – массив, содержащий значения высоты каждой строки таблицы;
ScrollBars – задаёт наличие линеек прокрутки;

Особые обработчики событий:
OnColumnMoved – при перемещении столбца (свойство Options должно содержать goRowMoving);
OnGetEditText – задаёт текст для редактирования ячейки; вызывается при переходе в режим редактирования;
OnRowMoved – при перемещении строки;
OnSelectCell – вызывается перед выбором ячейки таблицы; возможен запрет выбора произвольных ячеек или другие операции в зависимости от выбранной ячейки;
OnSetText – вызывается, когда пользователь редактирует содержимое ячеек; можно задать дополнительные проверки при изменении текста;