Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

Операции, производимые с данными

Содержание:

ВВЕДЕНИЕ

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

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

Из возможных операций над данными можно выделить следующие:

  1. Получение - или сбор информации с целью обеспечения достаточной полноты для принятия решений.
  2. Формализация - приведение данных к одному виду для повешения уровня доступности к ним.
  3. Сортировка - упорядочение данных по заданному признаку с целью их удобного использования и дальнейшей обработки.
  4. Фильтрация – отбрасывание лишних данных которые не несут никакой ценной информации.
  5. Защита - меры, направленные на то чтобы запретить несанкционированное изменение, удаление и добавление данных в системе.
  6. Архивация - организация хранения данных, служит для снижения экономические затраты и повышает общую надежность информационного процесса в целом.
  7. Перемещение - прием и передача данных между удаленными участками информационного процесса.
  8. Преобразование – перевод данных из одной формы в другую что довольно часто связано с изменением типа носителя, например, видеоряд может хранится как в виде кассеты, так и в электронном виде в памяти компьютера.

Список приведенных здесь операций является далеко не полным и вполне, может быть пополнен ещё какой-либо операций, но в данном случае будут рассмотрены именно они.

Так как операций в таком списке достаточно обширное множество, то для того, чтобы в той или иной мере раскрыть каждую будет использоваться язык программирования высокого уровня C++ (также в некоторых случаях будут приведены блок-схемы) и веб технологии. Можно было использовать Pascal или скажем Python, но в первом случае язык является слишком формальным для реализации, а во втором довольно простым.

Для рассмотрения основных операций над данными будут приведены упрощенные блок-схемы, по которым также будет частично написан код на языке C++.

Список таких операций:

  1. Добавление
  2. Удаление
  3. Изменение
  4. Просмотр
  5. Обработка

Все эти операции можно считать фундаментальными которые выполнимы как для реляционных баз данных, так и скажем структур данных.

1. СПИСОК ВОЗМОЖНЫХ ОПЕРАЦИЙ НАД ДАННЫМИ

1.1  Получение

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

C:\Users\vados\Desktop\Снимок.JPG

Блок-схема 1. Получение информации от пользователя

Листинг 1. Ввод данных пользователем

vector<int> mas;

//ввод данных

for (int i = 0,k = 0; i < 10; i++) {

cin >> k;

mas.push_back(k);

}

//вывод массива

for (auto& i : mas) {

cout << i << ' ';

}

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

Так же данные можно брать из файла.

C:\Users\vados\Desktop\Снимок.JPG

Блок-схема 2. Получение данных из файла

Листинг 2. Ввод данных из файла

vector<int> mas;

//открываем файл для чтения

ifstream ios("file.txt");

//если открыли то

if (ios.is_open()) {

int k = 0;

//считываем все до конца файла

while (ios >> k) {

mas.push_back(k);

}

}

else {

cout << "Ошибка открытия файла" << endl;

}

ios.close();

//вывод массива

for (auto& i : mas) {

cout << i << ' ';

}

Здесь происходит считывание данных из файла пока не будет достигнуть конец (eof).

Ещё есть возможность получения данные по сети как пример взаимодействия клиент-серверного приложения, где клиент получает от сервера запрашиваемою страничку, которая в свою очередь передается ему с откомпилированными скриптами (если имеется компилятор php на сервере) и прочими стилями. Или ajax взаимодействие которое будет рассматриваться в пункте 1.7. данной курсовой работы.

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

​​​​​​​1.2 Формализация

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

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

Листинг 3. Пример задачи формализации

vector<string> dmas;

vector<int> imas;

//открываем файлы для чтения

ifstream ios("file.txt");

ifstream ios_d("dfile.txt");

//получаем информацию из файлов

get_info(dmas, ios_d);

get_info(imas, ios);

ios.close();

ios_d.close();

merge(imas, dmas);

//вывод массива

for (auto& i : imas) {

cout << i << ' ';

}

Метод get_info выполняет считывание информации с файла в массив аналогичный блок-схеме 2.

Процедура merge принимает два разнотипных массива и переводит все двоичные числа из массива dmas в десятичные после чего добавляет каждое в imas.

Более подробно данный процесс представлен на Блок-схеме 3.

C:\Users\vados\Desktop\Снимок.JPG

Блок-схема 3. Процедура merge (перевод чисел из двоичной систему в десятичную)

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

Довольно часто операция формализации применяется специалистами по большим данным для которых представление данных в одном каком-то виде существенно упрощает решение задачи.

​​​​​​​1.3 Сортировка

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

Рассмотрим, как пример сортировку пузырьком написанную на языке C++.

C:\Users\vados\Desktop\Снимок.jpg

Блок-схема 4. Алгоритм сортировки пузырьком

Листинг 4. Программная реализация алгоритма сортировки

vector<int> a;

int n = 10;

//ввод

for (int i = 0,k = 0; i < n; i++) {

cin >> k;

a.push_back(k);

}

//вывод

cout << "Исходный массив : ";

for (auto& i : a) {

cout << i << ' ';

}

//сортировка пузырьком

for (int i = 0; i < n; i++) {

for (int j = n-1; j > i; j--) {

if (a[j - 1] > a[j]) {

int t = a[j];

a[j] = a[j-1];

a[j - 1] = t;

}

}

}

//вывод

cout << endl << "Упорядоченный : ";

for (auto& i : a) {

cout << i << ' ';

}

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

Даже если нужно к примеру, отсортировать какую-то довольно сложную структуру содержащую информацию о пользователе и его возраст, то по полю возраст такая сортировка вполне может пригодится.

Конечно уже мало где используется такая сортировку если только в плане научить основам алгоритмизации (субъективный взгляд), а в довольно серьезных проектах может использоваться, например, быстрая сортировка или TimSort сортировка, которая совмещает в себе сразу и сортировку слиянием, и сортировку вставками, что на деле показывает довольно хорошие результаты.

​​​​​​​1.4 Фильтрация

Очищение данных от “шума” есть довольно важная операция способная не только правильно классифицировать данные (если требуется), но и улучшить их общую информативность.

Здесь можно рассмотреть такую задачу:

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

Листинг 5. Выявление чисел из переданной строки

vector<int> a;

string ss;

string num;

cout << "Введите строку : ";

cin >> ss;

//берем только цифры

for (int i = 0; i < ss.size(); i++) {

//если дошли до конца

if (i == (ss.size() - 1) && num.size()) {

if (isdigit(ss[i])) {

num.push_back(ss[i]);

}

a.push_back(atoi(num.c_str()));

num.clear();

break;

}

//если это цифра

if (isdigit(ss[i])) {

num.push_back(ss[i]);

}

else {

if (num.size()) {

a.push_back(atoi(num.c_str()));

num = "";

}

}

}

Таким образом последовательность: dsdu78v^(Db83b0s8xv&D759IN902

после фильтрации будет такой: 78, 83, 0, 8, 759, 902;

​​​​​​​1.5 Защита

Наряду с другими операциями является не столько нужной как сама собой разумеющейся.

Например, C++ в основном является объектно-ориентированным языком программирования, который включает в себя такие принципы как инкапсуляция, полиморфизм и наследование. Из этого списка к операции защита более относится инкапсуляция, которая накладывает на класс права доступа в следствии чего не каждый пользователь может получить данные которые относятся к закрытой части или к защищенной.

Листинг 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, то компилятор выдаст ошибку доступа, что дает уже хоть какую -то защищенность от внешнего вмешательства.

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

Хеш-таблицу можно представить в следующем виде:

C:\Users\vados\Desktop\fig1.gif

Рис 1. Хеш-таблица на основе метода цепочек

На рис 1. Можно видеть таблицу где каждый элемент такой таблицы представим в виде односвязного списка, это сделано для того чтобы разрешить ситуацию, при которой хеш-функция вычисляет один и тот же номер строки (хеш). Иначе говоря, такая ситуация называется коллизией и для того чтобы ещё разрешить используется односвязный список, но может также использоваться и метод открытой адресации, который основан на том что если возникнет коллизия, то будет производится поиск свободного места для вставки, после того элемента на который указывала вычисленная хеш-функция. Что касается защиты, то в обычном массиве пользователь может сразу обратится к несуществующему элементу и тем самым поймать out of range (выход за пределы массива) или ещё хуже получить какое-то немыслимое число, ну а в случае с хеш-таблицей такой ситуации не возникнет так-как введенная последовательность будет однозначно отображаться на отрезок допустимых значений массива.

​​​​​​​1.6 Архивация

Организовать хранение данных можно по-разному, рассмотрим основные виды организации:

  1. Иерархический – представляет из себя древовидную структуру
  2. Объектно-ориентированный – данные представимы в виде объектов, имеющих свои атрибуты-свойства и методы.
  3. Реляционный – данные хранятся в виде таблиц, имеющих различные поля.

Вот наиболее часто используемые виды хранения и организации данных которые также находят свое применение и сегодня.

Рассмотрим для начала Объектно-ориентированный вид организации данных на примере диаграммы классов UML (undefined modeling language).

C:\Users\vados\Desktop\classdiagram.png

Рис 2. UML диаграмма классов

На рис 2 показана организация датчика температуры, который наследует интерфейс простого измерителя и использует дополнительные классы для своей работы. Такая структура организации данных свойственна языкам имеющих ООП парадигму: C++, С#, Java и тд.

В случае с реляционной организацией, рассмотрим следующую структуру:

C:\Users\vados\Desktop\Proekt80.gif

Рис 3. Пример реляционной базы данных

Как видно здесь используются как первичные ключи, так и внешние (FK) по которым можно однозначно обратится к определенному полю в другой таблице данных. Такой подход хранения и организации данных свойственен реляционным базам данных и СУБД для их использования как например: MS Access, MySQL,Oracle и др.

В результате были рассмотрены основные хотя и не последние виды организации хранения данных.

​​​​​​​1.7 Перемещение или транспортировка

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

Рассмотрим клиент-серверное взаимодействие на простой html форме которая после заполнения будет отправляться на сервер для дальнейшей обработки и возвращать ответ:

C:\Users\vados\Desktop\Снимок.jpg

Рис 4. Форма регистрации

Пользователю предлагается заполнить форму регистрации, а после чего нажать “Проверить”. После нажатия на кнопку “Проверить” все данные введенные пользователем собираются в “кучу” и отправляются на сторону сервера, который в свою очередь их обрабатывает и если что-то не так то дает нам знать об этом см Рис 5.

C:\Users\vados\Desktop\Снимок.jpg

Рис 5. Забыли ввести mail

Тем самым все что введено правильно подсвечивается зеленым, а остальное красным. Чтобы исправить эту ситуацию напишем наконец mail.

C:\Users\vados\Desktop\Снимок.jpg

Рис 6. Правильно заполненная форма

Теперь на рис 6. Стала доступна регистрация нового пользователя в системе.

В данном случае применяется технология ajax и чтобы понять как она работает можно рассмотреть рисунок 7.

C:\Users\vados\Desktop\ajax-diagram.png

Рис 7. Взаимодействие технологии ajax с сервером

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

Конечно в качестве примера все выглядит довольно просто и в реальных системах может не использоваться, но для объяснения операции транспортировки данных в интернете вполне приемлемо.

​​​​​​​1.8 Преобразование

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

На рисунке 6 ясно показано что пользователь ввел все данные потом нажал на кнопку “Проверить” и далее эти данные должны быть переданы на сервер, но для начала их нужно взять с формы поместить в переменные и только потом отправить одним пакетом на сервер, а уже там получить к ним доступ в зависимости от того каким запросом были переданы эти данные.

Ещё в качестве примера можно привести следующий рисунок, который также отвечает на вопрос преобразования данных.

C:\Users\vados\Desktop\662800.jpg

Рис 8. Преобразования данных с бумажных носителей в

электронный (ноутбук)

Конечно в таком случае данные должны быть как минимум отсканированы, а уже потом производить их обработку чтобы в дальнейшем с ними можно было работать. Или как вариант поместить все в формат djvu.

2. СПИСОК ОСНОВНЫХ ОПЕРАЦИЙ НАД ДАННЫМИ

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

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

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

Ниже приведен рисунок такого списка.

C:\Users\vados\Desktop\svyazannyi-spisok-java.png

Рис 9. Односвязный список (структура данных)

Для такой структуры будут реализованы все основные операции, которые представлены выше.

Все блок-схемы будут выполнены в абстрактной форме, а примеры реализованы конкретно на языке C++.

​​​​​​​2.1 Добавление

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

C:\Users\vados\Desktop\39c97d8f9d0549377b85c5e4f8397bb2.jpg

Блок-схема 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 Удаление

C:\Users\vados\Desktop\e673c90deb781af89f0ecafe11dadb2a.jpg

Блок-схема 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 Изменение

C:\Users\vados\Desktop\a9f933c7d0b5bdb3133df17220b040e0.jpg

Блок-схема 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 и шаблон класса инстанцирован числовым типом.

    1. Просмотр

C:\Users\vados\Desktop\c19434694db231d8b8530447f9eafa62.jpg

Блок-схема 8. Технология просмотра элемента(ов)

Листинг 10. Вывод элементов связного списка

void print()const {

shared_ptr<node> root = head;

while (root != nullptr) {

cout << root->item << ' ';

root = root->next;

}

cout << endl;

}

Тут происходит вывод всех элементов от начала и до конца связного списка и поиск здесь не нужен.

​​​​​​​2.4 Обработка данных

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

Листинг 11. Метод расчета суммы элементов с указанным диапазоном

t obr(t left, t right) {

shared_ptr<node> ptr = head;

t sum = 0;

while (ptr != nullptr) {

if (ptr->item >= left && ptr->item <= right) {

sum += ptr->item;

}

ptr = ptr->next;

}

return sum;

}

Таким образом были рассмотрены основные операции с данными как в виде блок-схем, так и на примере кода.

Листинг включающий в себя программу целиком вы можете найти в Приложении А.

ЗАКЛЮЧЕНИЕ

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

СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ

  1. Язык программирования С++ Бьерн Страуструп Издательство: «Бином» 2012 г.
  2. Роберт Седжвик: Фундаментальные алгоритмы C++. Издательство «Диасофт» Год издания: 2001 г.
  3. Информатика: Учебник для вузов/ А.С. Грошев – Архангельск, Арханг.гос.техн.ун-т 2010.-470с https://narfu.ru/university/library/books/0690.pdf
  4. Технология программирования/ Г.С. Иванова - Москва Издательство МГТУ имени Н.Э. Баумана 2002 г.
  5. Информатика. Базовый курс/ С.В. Симонович. Год издания: 2013. Издательство: Питер.
  6. Технология программирования на C++. Начальный курс

Автор: Н. А. Литвиненко. Год издания 2005г.

  1. HTML и CSS. Разработка и дизайн веб-сайтов. Автор: Джон Даккет. Год выпуска: 2017. Издательство: Эксмо.

Приложение А.

Листинг кода на языке С++ реализующий связный список

template<typename t>

class spisok {

private:

class node {

public:

t item;

shared_ptr<node> next;

node(t it) :item(it) {}

friend spisok;

};

shared_ptr<node> head;

public:

spisok() {

head = nullptr;

}

spisok(t item) {

head = make_shared<node>(node(item));

}

void push(t item) {

shared_ptr<node> ptr(new node(item));

if (head == nullptr) {

head = move(ptr);

return;

}

else {

ptr->next = head;

head = ptr;

}

}

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;

}

}

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;

}

t obr(t left, t right) {

shared_ptr<node> ptr = head;

t sum = 0;

while (ptr != nullptr) {

if (ptr->item >= left && ptr->item <= right) {

sum += ptr->item;

}

ptr = ptr->next;

}

return sum;

}

void clear() {

while (head != nullptr) {

head = head->next;

}

}

void print()const {

shared_ptr<node> root = head;

while (root != nullptr) {

cout << root->item << ' ';

root = root->next;

}

cout << endl;

}

~spisok() {

clear();

}

};