Добавлен: 05.04.2023
Просмотров: 70
Скачиваний: 1
Листинг 6. Класс Point
class Point {
private:
double x, y;
public:
Point(double _x,double _y):x(_x),y(_y){}
double get_x()const {
return x;
}
double get_y()const {
return y;
}
void set_x(double _x) {
x = _x;
}
void set_y(double _y) {
y = _y;
}
friend ostream& operator<<(ostream& os, Point& k) {
os << "x : " << k.x << " ; y : " << k.y;
return os;
}
};
В приведенном классе точка определены координаты на плоскости и геттеры, сеттеры для манипуляции ими, что дает нам доступ к закрытой части класса.
В таком случае если пользователь захочет напрямую обратится к закрытой части класса Point.x, то компилятор выдаст ошибку доступа, что дает уже хоть какую -то защищенность от внешнего вмешательства.
Ещё один пример можно привести на основе хеш-функции, которая преобразовывает массив входных данных произвольный длины в (выходную) битовую строку фиксированной длины, выполняемое определенным алгоритмом. Существует огромное множество хеш-функций, одни из которых работают на отлично ну а другие не очень (выдают один и тот же хеш при различных данных). Но большое внимание хотелось бы уделить хеш-таблице, которая будет хранить данные посредством вычисления хеш-функции.
Хеш-таблицу можно представить в следующем виде:
Рис 1. Хеш-таблица на основе метода цепочек
На рис 1. Можно видеть таблицу где каждый элемент такой таблицы представим в виде односвязного списка, это сделано для того чтобы разрешить ситуацию, при которой хеш-функция вычисляет один и тот же номер строки (хеш). Иначе говоря, такая ситуация называется коллизией и для того чтобы ещё разрешить используется односвязный список, но может также использоваться и метод открытой адресации, который основан на том что если возникнет коллизия, то будет производится поиск свободного места для вставки, после того элемента на который указывала вычисленная хеш-функция. Что касается защиты, то в обычном массиве пользователь может сразу обратится к несуществующему элементу и тем самым поймать out of range (выход за пределы массива) или ещё хуже получить какое-то немыслимое число, ну а в случае с хеш-таблицей такой ситуации не возникнет так-как введенная последовательность будет однозначно отображаться на отрезок допустимых значений массива.
1.6 Архивация
Организовать хранение данных можно по-разному, рассмотрим основные виды организации:
- Иерархический – представляет из себя древовидную структуру
- Объектно-ориентированный – данные представимы в виде объектов, имеющих свои атрибуты-свойства и методы.
- Реляционный – данные хранятся в виде таблиц, имеющих различные поля.
Вот наиболее часто используемые виды хранения и организации данных которые также находят свое применение и сегодня.
Рассмотрим для начала Объектно-ориентированный вид организации данных на примере диаграммы классов UML (undefined modeling language).
Рис 2. UML диаграмма классов
На рис 2 показана организация датчика температуры, который наследует интерфейс простого измерителя и использует дополнительные классы для своей работы. Такая структура организации данных свойственна языкам имеющих ООП парадигму: C++, С#, Java и тд.
В случае с реляционной организацией, рассмотрим следующую структуру:
Рис 3. Пример реляционной базы данных
Как видно здесь используются как первичные ключи, так и внешние (FK) по которым можно однозначно обратится к определенному полю в другой таблице данных. Такой подход хранения и организации данных свойственен реляционным базам данных и СУБД для их использования как например: MS Access, MySQL,Oracle и др.
В результате были рассмотрены основные хотя и не последние виды организации хранения данных.
1.7 Перемещение или транспортировка
Получение и отправление данных между участниками информационного процесса есть процесс повсеместный и обычно источником данных в информатике принято называть сервер, а сторону принимающую данные клиент.
Рассмотрим клиент-серверное взаимодействие на простой html форме которая после заполнения будет отправляться на сервер для дальнейшей обработки и возвращать ответ:
Рис 4. Форма регистрации
Пользователю предлагается заполнить форму регистрации, а после чего нажать “Проверить”. После нажатия на кнопку “Проверить” все данные введенные пользователем собираются в “кучу” и отправляются на сторону сервера, который в свою очередь их обрабатывает и если что-то не так то дает нам знать об этом см Рис 5.
Рис 5. Забыли ввести mail
Тем самым все что введено правильно подсвечивается зеленым, а остальное красным. Чтобы исправить эту ситуацию напишем наконец mail.
Рис 6. Правильно заполненная форма
Теперь на рис 6. Стала доступна регистрация нового пользователя в системе.
В данном случае применяется технология ajax и чтобы понять как она работает можно рассмотреть рисунок 7.
Рис 7. Взаимодействие технологии ajax с сервером
Таким образом данные от пользователя попадают сначала на сервер, там проходят проверку и по завершению отправляется ответ обратно на сторону пользователя как например на рис 6. Была заменена кнопка, нажав по которой пользователя может зарегистрироваться в системе.
Конечно в качестве примера все выглядит довольно просто и в реальных системах может не использоваться, но для объяснения операции транспортировки данных в интернете вполне приемлемо.
1.8 Преобразование
Перевод данных из одной формы в другую иногда бывает полезен в случае их транспортировки если принимающая часть ( сервер к примеру ) работает только с одним видом данных и больше не с каким.
На рисунке 6 ясно показано что пользователь ввел все данные потом нажал на кнопку “Проверить” и далее эти данные должны быть переданы на сервер, но для начала их нужно взять с формы поместить в переменные и только потом отправить одним пакетом на сервер, а уже там получить к ним доступ в зависимости от того каким запросом были переданы эти данные.
Ещё в качестве примера можно привести следующий рисунок, который также отвечает на вопрос преобразования данных.
Рис 8. Преобразования данных с бумажных носителей в
электронный (ноутбук)
Конечно в таком случае данные должны быть как минимум отсканированы, а уже потом производить их обработку чтобы в дальнейшем с ними можно было работать. Или как вариант поместить все в формат djvu.
2. СПИСОК ОСНОВНЫХ ОПЕРАЦИЙ НАД ДАННЫМИ
В данном разделе будут представлены основные операции над данными с которыми чаще всего приходится иметь дело.
Как известно процедура доступа к данным может быть инициирована как самим компьютером (для решения каких-либо своих технических задач), так и конечным пользователем. В последнем случае пользователь формирует запрос, куда включает, в частности, обозначение требуемого вида доступа или действия и указание на то, над какими данными это действие надо выполнить. Идентификация данных осуществляется с помощью ключей. В качестве же требуемого действия может производиться одно из следующих: добавление, удаление, изменение, просмотр элемента или обработка данных из элемента.
И чтобы лучше понять данные операции будет реализована структура данных на языке C++ которая обычно называется, как односвязный список или просто связный список.
Ниже приведен рисунок такого списка.
Рис 9. Односвязный список (структура данных)
Для такой структуры будут реализованы все основные операции, которые представлены выше.
Все блок-схемы будут выполнены в абстрактной форме, а примеры реализованы конкретно на языке C++.
2.1 Добавление
С операцией добавления можно также сравнить и получение, которое в какой-то мере выполняет туже работу по сбору информации из вне.
Блок-схема 5. Технология добавления элемента
Для односвязного списка данную операцию можно представить в следующем виде:
Листинг 7. Добавление элемента в односвязный список
void push(t item) {
shared_ptr<node> ptr(new node(item));
if (head == nullptr) {
head = move(ptr);
return;
}
else {
ptr->next = head;
head = ptr;
}
}
Отличие от схемы лишь в том, что не нужно проверять наличие элемента в таком списке так как хранится могут и одинаковые элементы.
2.2 Удаление
Блок-схема 6. Технология удаления элемента
Листинг 8. Удаление элемента в односвязном списке
void pop(t item) {
shared_ptr<node> ptr = head;
if (ptr->item == item) {
head = head->next;
return;
}
while (ptr->next != nullptr) {
if (ptr->next->item == item) {
ptr->next = ptr->next->next;
return;
}
ptr = ptr->next;
}
}
В случае с удалением схема 6 практически полностью соответствует листингу 8 с удалением элемента из списка.
2.3 Изменение
Блок-схема 7. Технология изменения элемента
Листинг 9. Модификация указанного элемента
shared_ptr<node> find(t item) {
shared_ptr<node> ptr = head;
while (ptr != nullptr) {
if (ptr->item == item) return ptr;
ptr = ptr->next;
}
return nullptr;
}
Таким образом если элемент для изменения найден, то его можно изменить, например, так:
auto ptr = indef.find(23);
ptr->item = 512;
При условии, что для node определен член класса item и шаблон класса инстанцирован числовым типом.
-
- Просмотр
Блок-схема 8. Технология просмотра элемента(ов)
Листинг 10. Вывод элементов связного списка
void print()const {
shared_ptr<node> root = head;
while (root != nullptr) {
cout << root->item << ' ';
root = root->next;
}
cout << endl;
}
Тут происходит вывод всех элементов от начала и до конца связного списка и поиск здесь не нужен.
2.4 Обработка данных
В качестве обработки данных можно привести пример с расчетом суммы элементов в заданном диапазоне связного списка.