3. Разработка состава и структуры исходных данных и результата
Исходные данные и результат представляют собой однонаправленный динамический список. Элементом списка будет являться структура, состоящая из внутренней структуры и указателя на следующий элемент списка. Внутренняя структура состоит из полей:
1) название газеты (тип char)
2) название статьи (тип char)
3) номера страниц (тип int)
На экране исходные данные будут представлены:
Введите данные о 1 статье
Название: Комсомольская правда
Статья: О вреде курения
Страница: 12
………………………………
Результат будет представлен в виде таблицы:
╔═══════════════╦══════════════╦══════════════╗
║ газета ║ статья ║ страница ║
║Комсомольская правда ║ О вреде курения ║ 12 ║
7
4. Разработка алгоритма
4.1 Основная часть программы.
0. Начало
1 Очищаем экран
2 Присваиваем переменной а, которая является параметром последующего цикла и оператора множественного выбора значение равное единицы
3 Открываем цикл с предусловием (условие: переменная а не равна 5); в цикле будут выполняться шаги с 4 по 11
4 Вводим переменную а
5 Выполняем оператор множественного выбора с параметром а; оператор включает шаги с 6 по 10
6 Если а=1, вызываем процедуру ввода данных
7 Если а=2, вызываем процедуру вывода данных
8 Если а=3, вызываем процедуру удаления первого элемента
9 Если а=4, вызываем процедуру перемены мест элементов, которые заданы названиями
10 Если а не равно не одному из указанных раннее значений, то а присваиваем значение 5
11 Закрываем оператор множественного выбора
12 Закрываем цикл с предусловием
13 Конец
4.2 Процедура ввода данных
0 Начало процедуры
1 Резервируем область оперативной памяти размером равным размеру элемента и присваиваем указателю на последний элемент q адрес этой области.
2 Последовательно вводим данные внутренней структуры, на которую будит указывать указатель q.
3 Присваиваем указателю на первый элемент списка un и указателю на текущий элемент p значение указателя q. Присваиваем переменной i, которая содержит данные о числе элементов списка и переменной j, которая является параметром последующих циклов значение равное 1
4 Открываем цикл с предусловием (условие: переменная j равна 1); в цикле будут выполняться шаги с 5 по 9
8
5 Увеличиваем значение переменной i на единицу
6 Резервируем область оперативной памяти размером равным размеру элемента и присваиваем указателю q адрес этой области
7 Последовательно вводим данные внутренней структуры, на которую будит указывать указатель q
8 Устанавливаем указатель введенного ранее элемента n на элемент, введенный шагом 7, а указателю p значение указателя q
9 Вводим новое значение переменной j
10 Закрываем цикл с предусловием
11 Устанавливаем указатель n текущего элемента на NULL
12 Конец процедуры
4.3 Процедура вывода данных
0 Начало процедуры
1 Устанавливаем указатель p на первый элемент списка, а переменную j, которая будет параметром следующего цикла, устанавливаем в 1
2 Открываем цикл с предусловием (условие: переменная j меньше или равно i); в цикле будет выполняться шаги с 3 по 4
3 Последовательно выводим данные внутренней структуры, на которую будит указывать указатель p
4 Указатель текущего элемента p устанавливаем на следующий элемент, а значение переменной j увеличиваем на 1
5 Закрываем цикл с предусловием
6 Конец процедуры
4.4 Процедура удаления первого в списке элемента
0 Начало процедуры
1 Указатель текущего элемента p устанавливаем в начало, а указатель первого элемента в списке un устанавливаем на следующий элемент
2 Освобождаем область памяти, на которую указывает указатель текущего элемента p
9
3 Значение переменной i, которая содержит данные о числе элементов в списке, уменьшаем на 1
4 Конец процедуры
4.5 Процедура перемены мест элементов, которые заданы номерами
0 Начало процедуры
1 Вводим переменную k1, которая указывает на название первого элемента в операции перемены мест
2 Устанавливаем указатель p на первый элемент списка.
3 Открываем цикл с заданным числом повторений (j=0…k1); в цикле будет выполняться шаг 4
4 Указатель на текущий элемент p устанавливаем на следующий элемент списка
5 Закрываем цикл с заданным числом повторений
6 Вводим переменную k2, которая указывает на название второго элемента в операции перемены мест
7 Устанавливаем указатель p2 на первый элемент списка.
8 Открываем цикл с заданным числом повторений (j=0…k2); в цикле будет выполняться шаг 4
9 Указатель на текущий элемент p2 устанавливаем на следующий элемент списка
10 Закрываем цикл с заданным числом повторений
11 Переменной с присваиваем данные внутренней структуры, на которые указывает указатель текущего элемента p
12 Данные внутренней структуры, на которые указывает указатель текущего элемента p2, копируем в переменные внутренней структуры, на которые указывает указатель текущего элемента p.
13 Значение переменной с присваиваем переменным внутренней структуры, на которые указывает указатель текущего элемента p2.
14 Конец процедуры
10
5. Выбор языка
Язык программирования СИ++ является языком высокого уровня. Язык СИ++ был разработан на основе языка СИ Бьярном Страуструпом. Выбор языка СИ++ для решения данной задачи обусловлен наличием в языке СИ++ средств для динамического распределения памяти.
Динамическое распределение памяти осуществляется операциями new и delete. Это 2 особые унарные операции, появившиеся в языке СИ++ (в языке СИ этих операций не было). Операция new имя_типа или new имя_типа инициализатор позволяет выделить и сделать доступным свободный участок в основной памяти, размеры которого соответствуют типу данных, определяемому именем типа. В выделенный участок заносится значение, определяемое инициализатором, который не является обязательным элементом. В случае успешного выполнения операции new возвращает адрес начала выделенного участка памяти. Если участок нужных размеров не может быть выделен (нет памяти), то операция new возвращает нулевое значение адреса (NULL). Синтаксис применения операции: указатель=new имя_типа инициализатор.
Продолжительность существования выделенного с помощью операции new участка памяти – от точки создания до конца программы или до явного его освобождения.
Для явного освобождения выделенного операцией new участка памяти используется оператор delete указатель, где указатель адресует освобождаемый участок памяти, ранее выделенный с помощью операции new.
11
6. Разработка программы
6.1 Основная часть программы.
0 Начало. Описываем глобальные переменные и типы данных
1 Очищаем экран с помощью оператора clrscr()
2 Присваиваем переменной а, которая является параметром последующего цикла и оператора множественного выбора значение равное единицы: a=1
3 Открываем цикл с предусловием (условие: переменная а не равна 5); в цикле будут выполняться шаги с 4 по 11: while (a!=5)
4 Вводим переменную а: a=getch()
5 Выполняем оператор множественного выбора с параметром а; оператор включает шаги с 6 по 10: switch(a)
6 Если а=1, вызываем процедуру ввода данных: case '1':vvod(); break
7 Если а=2, вызываем процедуру вывода данных: case '2':vivod(); break
8 Если а=3, вызываем процедуру удаления первого элемента: case '3':dele(); break;
9 Если а=4, вызываем процедуру перемены мест элементов, которые заданы номерами: case '4':pomen(); break;
10 Если а не равно не одному из указанных раннее значений, то а присваиваем значение 5: default: a=5; break;
11 Закрываем оператор множественного выбора: }
12 Закрываем цикл с предусловием: }
13 Конец: }
6.2 Процедура ввода данных
0 Начало процедуры: void vvod(); Описываем локальные переменные
1 Резервируем область оперативной памяти размером равным размеру элемента и присваиваем указателю на последний элемент q адрес этой области: q=new(news)
2 Последовательно вводим данные внутренней структуры, на которую будет указывать указатель q. Ввод будем осуществлять с помощью последовательности операторов ввода scanf
12
3 Присваиваем указателю на первый элемент списка un и указателю на текущий элемент p значение указателя q. Присваиваем переменной i, которая содержит данные о числе элементов списка и переменной j, которая является параметром последующих циклов значение равное 1: un=q; p=q; j=1; i=1;
4 Открываем цикл с предусловием (условие: переменная j равна 1); в цикле будут выполняться шаги с 5 по 9: while (j==1)
5 Увеличиваем значение переменной i на единицу: i++
6 Резервируем область оперативной памяти размером равным размеру элемента и присваиваем указателю q адрес этой области: q=new(news);
7 Последовательно вводим данные внутренней структуры, на которую будет указывать указатель q. Ввод будем осуществлять с помощью последовательности операторов ввода scanf
8 Устанавливаем указатель введенного ранее элемента n на элемент, введенный шагом 7, а указателю p значение указателя q: p->n=q; p=q;
9 Вводим новое значение переменной j. Ввод будем осуществлять с помощью оператора ввода scanf
10 Закрываем цикл с предусловием: }
11 Устанавливаем указатель n текущего элемента на NULL: p->n=NULL;
12 Конец процедуры: }
6.3 Процедура вывода данных
0 Начало процедуры: void vivod(); Описываем локальные переменные
1 Устанавливаем указатель p на первый элемент списка, а переменную j, которая будет параметром следующего цикла, устанавливаем в 1: p=un; j=1;
2 Открываем цикл с предусловием (условие: переменная j меньше или равно i); в цикле будет выполняться шаги с 3 по 4: while (j<=i)
3 Последовательно выводим данные внутренней структуры, на которую будит указывать указатель p. Вывод осуществляем с помощью одного единственного оператора вывода printf
13
4 Указатель текущего элемента p устанавливаем на следующий элемент, а значение переменной j увеличиваем на 1: p=p->n; j++;
5 Закрываем цикл с предусловием: }
6 Конец процедуры: }
6.4 Процедура удаления элемента заданного по имени
0 Начало процедуры: void dele(); Описываем локальные переменные
1 Указатель текущего элемента p устанавливаем в начало, а указатель первого элемента в списке un устанавливаем на следующий элемент: p=un; un=un->n;
2 Освобождаем область памяти, на которую указывает указатель текущего элемента p: delete p;
3 Значение переменной i, которая содержит данные о числе элементов в списке, уменьшаем на 1: i=i-1;
4 Конец процедуры
6.5 Процедура перемены мест элементов, которые заданы номерами
0 Начало процедуры: void pomen();Описываем локальные переменные
1 Вводим переменную k1, которая указывает на название первого элемента в операции перемены мест. Ввод будем осуществлять с помощью оператора ввода scanf
2 Устанавливаем указатель p на первый элемент списка: p=un;
3 Открываем цикл с заданным числом повторений (j=0…k1); в цикле будет выполняться шаг 4: for(j=1;j<k1;j++)
4 Указатель на текущий элемент p устанавливаем на следующий элемент списка: p=p->n;
5 Закрываем цикл с заданным числом повторений: }
6 Вводим переменную k2, которая указывает на название второго элемента в операции перемены мест. Ввод будем осуществлять с помощью оператора ввода scanf
7 Устанавливаем указатель p2 на первый элемент списка: p2=un
8 Открываем цикл с заданным числом повторений (j=0…k2); в цикле будет выполняться шаг 4: for(j=1;j<k2;j++)
9 Указатель на текущий элемент p2 устанавливаем на следующий элемент списка: p2=p2->n;
14
10 Закрываем цикл с заданным числом повторений: }
11 Переменной с присваиваем данные внутренней структуры, на которые указывает указатель текущего элемента p: с=p->g;
12 Данные внутренней структуры, на которые указывает указатель текущего элемента p2, копируем в переменные внутренней структуры, на которые указывает указатель текущего элемента p: p->g=p2->g;
13 Значение переменной g1 присваиваем переменным внутренней структуры, на которые указывает указатель текущего элемента p2: p2->g=с;
14 Конец процедуры: }
15
7. Отладка и тестирование программы
Суть процесса тестирования и отладки программы заключается в проверке правильности программы и исправлении найденных ошибок. В ходе процесса отладки и тестирования возникали следующие ошибки:
Statement missing ; - отсутствие знака конца оператора.
16
Список используемой литературы
... Листинг программы представлен в приложении Д, а результаты работы программы в приложении Е. Заключение В процессе выполнения индивидуального задания и отчета по курсовой работе я ознакомился со способами обработки динамических структур данных. Анализируя полученное задание, я выбрал метод решения поставленной задачи, на основе которого получил алгоритмы в виде блок-схем (приложения А, Б, ...
... : M). Каждую дисциплину сдает множество студентов, поэтому связь между Дисциплины и Оценки также будет Один-ко-многим (1 : M). В результате получаем информационно-логическую модель базы данных, приведенную на Рис. 18 Студенты Дисциплины Преподаватели Оценки Рис. 18 Для создания логической модели нужно после создания, по крайней мере, структур таблиц в окне базы данных нужно ...
... строящий дерево. Структура этого дерева включает страницы двух типов – узловые, содержащие массивы ссылок на нижележащие страницы, и листовые, содержащие отсортированные списки данных. Такое дерево называется B+-деревом. Однако разбирать подробно реализацию B+-деревьев в этой статье я не буду. Реализация двухуровневого массива На практике в большинстве случаев достаточно двухуровневых массивов. ...
... Закрыть программу можно нажатием на кнопку «Закрыть» или F10. Заключение В квалификационной работе мы попытались раскрыть более полно и наглядно понятие линейного списка, однонаправленного и двунаправленного списков, стека, дека и очереди. Сформировать и закрепить познавательный интерес к данной теме у учащихся. Выявлять и развивать творческие способности в использовании полученного навыка при ...
0 комментариев