Лабораторная работа № 2_6. Списки, массивы, векторы
Цель: Знакомство с динамическими информационными структурами на примере одно- и двунаправленных списков, динамических массивов и векторов.
1. Краткие теоретические сведения
Массивы, Списки |
минимально – в PDF-документах с соответствующими названиями, «как |
|
положено» – читайте книги; например, Страуструп Б. |
|
Программирование, Принципы и практика с использованием C++; |
|
Прата С. Язык программирования C++. Лекции и упражнения; |
Векторы |
Липпман С., Лажойе Ж., Му Б. Язык программирования С++. Вводный |
|
курс |
2. Порядок выполнения работы
Ознакомиться с текстом данного документа настолько, чтобы ответить на вопросы преподавателя о требованиях к разрабатываемой программе, критериях оценивания и алгоритмах работы с динамическим массивом, списком или вектором.
Получить вариант задания.
Определить, какие функции из приведённых в пункте «Постановка задачи» потребуются для выполнения заданий варианта.
Подготовить тестовые данные, демонстрирующие правильность работы программы для каждого задания.
Реализовать задание своего варианта и продемонстрировать корректность работы программы на подготовленных тестовых данных.
Ответить на вопросы преподавателя о назначении функций, используемых в программе; об оптимальной декомпозиции задачи.
3. Постановка задачи
Написать пять программ, реализующие действия, перечисленные в таблице вариантов заданий. Для каждой из программ должно быть обеспечено:
Многократное повторение любого из заданий до тех пор, пока не будет дана команда завершения либо список (вектор, массив) не опустеет в результате удаления элементов.
Меню, содержащее условия заданий (какие элементы удалять; перед (или после) каких элементов производить вставку). Меню выводится первый раз перед тем, как заполняется список (массив, вектор), после чего пользователь выбирает способ заполнения (с клавиатуры, случайными числами, из файла), а затем каждый раз перед выбором задания.
Список (массив, вектор) заполняется один раз, над ним производятся выбранные действия до тех пор, пока не будет дана команда завершения или не будут удалены все данные.
При выполнении каждого задания должно быть показано состояние списка (массива, вектора) до выполнения действия и после такового.
При выполнении заданий подразумевается, что среднее арифметическое, минимальный (максимальный) элемент и другие величины, получаемые в результате прохода по списку (вектору, массиву), вычисляются один раз, до того, как будет вызвана функция удаления или вставки элементов.
Для реализации заданий должны быть написаны функции, обеспечивающие:
работу с односвязным списком (читайте книги!):
•добавление элемента перед первым;
•удаление первого элемента;
•проверка списка на пустоту;
•вывод списка (голову выделить цветом или обозначить другим способом);
•поиск элемента по ключу;
•добавление элемента после заданного;
•удаление заданного элемента.
работу с двусвязным списком:
•добавление элемента перед первым и после последнего;
•удаление первого (последнего) элемента;
•проверка списка на пустоту;
•вывод списка (голову выделить цветом или обозначить другим способом);
•поиск элемента по ключу;
•добавление элемента после заданного и перед заданным;
•удаление заданного элемента.
работу с динамическим массивом:
•указатель на рабочий динамический массив создаётся один раз, в начале программы, там же создаётся указатель на временный динамический массив, куда требуется переписать элементы рабочего массива, не подлежащие удалению, либо элементы рабочего массива вместе с добавленными по условию задания;
•при удалении элементов из рабочего массива необходимо выяснить, сколько их останется после удаления, объявить временный динамический массив полученного размера и переписать в него нужные элементы из рабочего массива; после этого рабочий массив удаляется (очищается память, указатель остаётся!), объявляется рабочий массив того же размера, как временный, из временного элементы копируются в рабочий, после чего временный массив очищается
Имя |
Размер Песочным цветом обозначены индексы, белым – значения элементов, розовым – |
||||||||||||
|
удаляемые элементы |
|
|
|
|
|
|
|
|
|
|||
|
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
arr |
10 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
temp |
0 |
|
|
|
|
|
|
|
|
|
|
Удалить числа, кратные 4 (прошли по массиву arr, обнаружили, что их два, останется 8 элементов)
arr |
10 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
|
|
|
temp |
8 |
|
|
|
|
|
|
|
|
|
|
|
|
|
Прошли |
по массиву |
arr и |
переписали в temp только числа, не кратные 4 |
|
|
|
|
|||||||
arr |
10 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
|
|
|
temp |
8 |
1 |
2 |
3 |
5 |
6 |
7 |
9 |
10 |
|
|
|
|
|
Сдвиг |
|
0 |
0 |
0 |
1 |
1 |
1 |
1 |
2 |
2 |
2 |
|
|
|
Очистить |
память, |
занимаемую массивом arr |
|
|
|
|
|
|
|
|
|
|||
arr |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
temp |
8 |
1 |
2 |
3 |
5 |
6 |
7 |
9 |
10 |
|
|
|
|
|
Выделить |
память на массив arr такую же, как на массив temp |
|
|
|
|
|
|
|||||||
arr |
8 |
|
|
|
|
|
|
|
|
|
|
|
|
|
temp |
8 |
1 |
2 |
3 |
5 |
6 |
7 |
9 |
10 |
|
|
|
|
|
Скопировать в массив arr элементы из temp |
|
|
|
|
|
|
|
|
|
|||||
arr |
8 |
1 |
2 |
3 |
5 |
6 |
7 |
9 |
10 |
|
|
|
|
|
temp |
8 |
1 |
2 |
3 |
5 |
6 |
7 |
9 |
10 |
|
|
|
|
|
Очистить |
память, |
занимаемую массивом temp |
|
|
|
|
|
|
|
|
||||
arr |
8 |
1 |
2 |
3 |
5 |
6 |
7 |
9 |
10 |
|
|
|
|
|
temp |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
Можно выполнять очередную задачу (добавлять или удалять элементы массива arr)
•при добавлении элементов в рабочий массив необходимо выяснить, сколько их станет после вставки, объявить временный динамический массив полученного размера и переписать в него нужные элементы из рабочего массива и вставляемые элементы; после этого рабочий массив удаляется (очищается память, указатель остаётся!), объявляется рабочий массив того же размера, как временный, из временного элементы копируются в рабочий, после чего временный массив очищается
Имя |
Размер Песочным цветом обозначены индексы, белым – значения элементов, красным – |
||||||||||||
|
добавляемые элементы |
|
|
|
|
|
|
|
|
|
|||
|
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
arr |
8 |
1 |
2 |
3 |
5 |
6 |
7 |
9 |
10 |
temp |
0 |
|
|
|
|
|
|
|
|
Вставить после чисел, кратных 3 число 8 (прошли по массиву arr, чисел, делящихся на 3 обнаружили 3 из 8, следовательно, в массиве temp будет 11)
arr |
8 |
1 |
2 |
3 |
5 |
6 |
7 |
9 |
10 |
|
|
|
|
|
temp |
11 |
|
|
|
|
|
|
|
|
|
|
|
|
|
Прошли по массиву arr и переписали в temp все числа, но если число делилось на 3, то после него надо вставлять 8)
arr |
8 |
1 |
2 |
3 |
5 |
6 |
7 |
9 |
10 |
|
|
|
|
|
Сдвиг |
|
0 |
0 |
0 |
1 |
1 |
2 |
2 |
3 |
|
|
|
|
|
temp |
11 |
1 |
2 |
3 |
8 |
5 |
6 |
8 |
7 |
9 |
8 |
10 |
|
|
Очистить |
память, |
занимаемую массивом arr |
|
|
|
|
|
|
|
|
|
|||
arr |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
temp |
11 |
1 |
2 |
3 |
8 |
5 |
6 |
8 |
7 |
9 |
8 |
10 |
|
|
Выделить |
память на массив arr такую же, как на массив temp |
|
|
|
|
|
|
|||||||
arr |
11 |
|
|
|
|
|
|
|
|
|
|
|
|
|
temp |
11 |
1 |
2 |
3 |
8 |
5 |
6 |
8 |
7 |
9 |
8 |
10 |
|
|
Скопировать в массив arr элементы из temp |
|
|
|
|
|
|
|
|
|
|||||
arr |
8 |
1 |
2 |
3 |
8 |
5 |
6 |
8 |
7 |
9 |
8 |
10 |
|
|
temp |
8 |
1 |
2 |
3 |
8 |
5 |
6 |
8 |
7 |
9 |
8 |
10 |
|
|
Очистить |
память, |
занимаемую массивом temp |
|
|
|
|
|
|
|
|
||||
arr |
8 |
1 |
2 |
3 |
8 |
5 |
6 |
8 |
7 |
9 |
8 |
10 |
|
|
temp |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
Можно выполнять очередную задачу (добавлять или удалять элементы массива arr)
функции для заполнения вектора с клавиатуры можно реализовать двумя способами:
•по значению передаётся количество элементов вектора, а сам вектор возвращается как результат;
•по значению передаётся количество элементов вектора, а сам вектор передаётся по ссылке;
•функции для заполнения вектора из файла или случайными числами – аналогично, только в качестве параметров передаются имя файла или диапазон;
•функция вывода вектора на экран принимает вектор по константной ссылке;
•функции удаления\добавления\поиска заданного элемента в STL есть, их надо знать и уметь ими пользоваться;
работу с массивом фиксированного размера:
•удаление происходит путём сдвига влево, верхняя граница уменьшается на количество удалённых элементов (добиться удаления всех элементов за один проход);
•добавление происходит путём сдвига вправо (также за один проход);
|
а также другие функции, необходимые для правильной декомпозиции заданий варианта |
||||
|
|
(в частности, булевы функции для проверки числа на соответствие условиям задания). |
|||
|
|
|
|
|
|
|
Критерии оценивания заданий |
Процент |
|||
|
Наличие синтаксических ошибок (программа не транслируется), реализация без |
баллы*0 |
|
||
|
функций, функции без параметров = 0 % выполнения |
|
|
||
|
Наличие логических ошибок, например, зацикливание программы или |
баллы*0 |
|
||
|
возникновение ошибки времени выполнения = 0 % выполнения |
|
|||
|
|
|
|||
|
Небрежное оформление, отсутствие сведений о разработчике, |
|
|
||
|
отсутствие вывода текста задачи, отсутствие номера варианта, |
баллы*0 |
|
||
|
наличие предупреждений, отсутствие защиты от некорректного ввода, |
|
|||
|
|
|
|||
|
отсутствие набора тестовых данных, недружелюбный интерфейс |
|
|
||
|
Объявлены и определены функции, обеспечивающие работу с односвязным списком |
|
100% |
|
|
|
− добавление элемента в начало списка |
5 |
|
||
|
− вывод списка на экран |
5 |
|
||
|
− поиск элемента по ключу |
5 |
|
||
|
− |
добавление элемента после указанного |
10 |
|
|
|
− |
удаление указанного элемента |
|
|
|
|
|
|
|
|
10 |
|
|||
|
|
− проверка списка на пустоту |
|
|
|
|
|
|
|
|
5 |
|
||||
|
|
Объявлены и определены функции, обеспечивающие решение задания №1.1 |
|
|
|
|
|
30 |
|
|||||||
|
|
Объявлены и определены функции, обеспечивающие решение задания №2 |
|
|
|
|
|
30 |
|
|||||||
|
|
Объявлены и определены функции, обеспечивающие работу с двусвязным списком |
|
|
|
100% |
|
|||||||||
|
|
− добавление элемента в начало списка |
|
|
|
|
|
|
|
|
5 |
|
||||
|
|
− добавление элемента в конец списка |
|
|
|
|
|
|
|
|
5 |
|
||||
|
|
− вывод списка на экран |
|
|
|
|
|
|
|
|
5 |
|
||||
|
|
− поиск элемента по ключу |
|
|
|
|
|
|
|
|
5 |
|
||||
|
|
− |
добавление элемента после указанного |
|
|
|
|
|
|
|
|
5 |
|
|||
|
|
− |
добавление элемента перед указанным |
|
|
|
|
|
|
|
|
5 |
|
|||
|
|
− |
удаление указанного элемента |
|
|
|
|
|
|
|
|
5 |
|
|||
|
|
− проверка списка на пустоту |
|
|
|
|
|
|
|
|
5 |
|
||||
|
|
Объявлены и определены функции, обеспечивающие решение задания №1.1 |
|
|
|
|
|
20 |
|
|||||||
|
|
Объявлены и определены функции, обеспечивающие решение задания №1.2 |
|
|
|
|
|
20 |
|
|||||||
|
|
Объявлены и определены функции, обеспечивающие решение задания №2 |
|
|
|
|
|
20 |
|
|||||||
|
|
Объявлены и определены функции для работы с динамическими массивами |
|
|
|
|
|
|
100% |
|
||||||
|
|
− |
заполнение массива |
|
|
|
|
|
|
|
|
|
5 |
|
||
|
|
− вывод массива на экран |
|
|
|
|
|
|
|
|
5 |
|
||||
|
|
− подсчёт количества элементов, обладающих заданным свойством |
|
|
|
|
|
5 |
|
|||||||
|
|
− копирование одного массива в другой |
|
|
|
|
|
|
|
|
5 |
|
||||
|
|
Объявлены и определены функции, обеспечивающие решение задания №1.1 |
|
|
|
|
|
30 |
|
|||||||
|
|
Объявлены и определены функции, обеспечивающие решение задания №1.2 |
|
|
|
|
|
30 |
|
|||||||
|
|
Объявлены и определены функции, обеспечивающие решение задания №2 |
|
|
|
|
|
20 |
|
|||||||
|
|
Объявлены и определены функции для работы с вектором |
|
|
|
|
|
|
100% |
|
||||||
|
|
− |
заполнение вектора |
|
|
|
|
|
|
|
|
|
5 |
|
||
|
|
− вывод вектора на экран |
|
|
|
|
|
|
|
|
5 |
|
||||
|
|
Объявлены и определены функции, обеспечивающие решение задания №1.1 |
|
|
|
|
|
30 |
|
|||||||
|
|
Объявлены и определены функции, обеспечивающие решение задания №1.2 |
|
|
|
|
|
30 |
|
|||||||
|
|
Объявлены и определены функции, обеспечивающие решение задания №2 |
|
|
|
|
|
30 |
|
|||||||
|
|
Объявлены и определены функции для работы с массивом фиксированного размера |
|
|
100% |
|
||||||||||
|
|
− |
заполнение массива |
|
|
|
|
|
|
|
|
|
5 |
|
||
|
|
− вывод массива на экран |
|
|
|
|
|
|
|
|
5 |
|
||||
|
|
Объявлены и определены функции, обеспечивающие решение задания №1.1 |
|
|
|
|
|
30 |
|
|||||||
|
|
Объявлены и определены функции, обеспечивающие решение задания №1.2 |
|
|
|
|
|
30 |
|
|||||||
|
|
Объявлены и определены функции, обеспечивающие решение задания №2 |
|
|
|
|
|
30 |
|
|||||||
|
1. |
|
Варианты заданий |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
||||||||
|
Вари- |
Тип ключевого |
|
1.1 Добавить элементы после указанного элемента |
2 Удалить элементы |
|
||||||||||
|
ант |
|
поля |
|
1.2 Добавить элементы перед указанным элементом |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
Что добавить |
Перед / после чего |
|
|
|
|
|
|
|
||
|
|
|
|
|
|
(при его отсутствии – |
добавлять |
|
|
|
|
|
|
|
||
|
|
|
|
|
|
число, заданное с |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
клавиатуры) |
|
|
|
|
Все элементы, |
|
||||
|
1. |
|
double |
|
первый отрицательный |
числа, в целой части |
|
|
||||||||
|
|
|
|
|
|
элемент |
которых встречается |
|
меньшие среднего |
|
||||||
|
|
|
|
|
|
|
заданная цифра |
|
арифметического. |
|
||||||
|
2. |
|
unsigned int |
|
Элемент, являющийся |
элемент, который |
|
Все числа, |
|
|
||||||
|
|
|
|
|
|
минимальным среди |
больше среднего |
|
являющиеся полными |
|
||||||
|
|
|
|
|
|
полных квадратов, |
геометрического |
|
квадратами |
|
|
|||||
|
3. |
|
short int |
|
Максимальное простое |
Двузначные числа |
|
Все элементы, у |
|
|||||||
|
|
|
|
|
|
число в списке |
|
|
|
|
которых значение |
|
Вари- |
Тип ключевого |
1.1 Добавить элементы после указанного элемента |
|
2 Удалить элементы |
|
ант |
поля |
1.2 Добавить элементы перед указанным элементом |
|
|
|
|
|
Что добавить |
Перед / после чего |
|
|
|
|
(при его отсутствии – |
добавлять |
|
|
|
|
число, заданное с |
|
|
|
|
|
клавиатуры) |
|
|
кратно заданному |
|
|
|
|
|
|
|
|
|
|
|
числу |
4. |
float |
Среднее арифметическое |
Числа, целая часть |
|
Максимальный |
|
|
положительных чисел |
которых заканчивается |
|
элемент и элемент, |
|
|
|
заданной цифрой |
|
второй по величине |
5. |
unsigned short |
Максимальное среди |
числа, являющиеся |
|
Все простые числа |
|
int |
двузначных чисел списка |
полным квадратом |
|
Все элементы, |
6. |
double |
Сумму всех элементов |
Числа, целая часть |
|
|
|
|
списка |
которых кратна |
|
принадлежащие |
|
|
|
заданному числу |
|
диапазону, указанному |
|
|
|
|
|
пользователем |
7. |
unsigned int |
Первый элемент, |
числа, являющиеся |
|
Все элементы, |
|
|
являющийся полным |
палиндромом |
|
превосходящие |
|
|
квадратом |
(например, 5, 11, 101, |
|
среднее |
|
|
|
1331) |
|
арифметическое. |
8. |
short int |
Первый элемент, |
отрицательные числа |
|
Все элементы, которые |
|
|
кратный заданному |
|
|
не являются простыми |
|
|
пользователем числу |
|
|
числами |
9. |
float |
Число, равное корню |
Положительные числа |
|
Все элементы, целая |
|
|
квадратному из суммы |
|
|
часть которых |
|
|
квадратов элементов, |
|
|
оканчивается заданной |
|
|
|
|
|
цифрой |
10. |
unsigned short |
Первый элемент, |
трёхзначные числа |
|
Все числа, |
|
int |
являющийся простым |
|
|
являющиеся |
|
|
числом |
|
|
палиндромами |
|
|
|
|
|
(например, 5, 11, 101, |
|
|
|
|
1331) |
|
11. |
double |
Среднее арифметическое |
числа, принадлежащего |
|
Все элементы, |
|
|
целых частей |
заданному диапазону |
|
большие полусуммы |
|
|
|
|
|
минимального и |
|
|
|
|
|
максимального |
12. |
unsigned int |
максимальное число в |
Числа, не являющихся |
|
«Счастливые» числа |
|
|
списке |
простыми (0 , 1 и |
|
(шестизначные, сумма |
|
|
|
отрицательные – |
|
первых трёх цифр |
|
|
|
простыми тоже не |
|
равна сумме трёх |
|
|
|
являются) |
|
последних) |
13. |
short int |
Первый элемент, |
числа, в которых нет |
|
Все числа Фибоначчи |
|
|
являющийся полным |
заданной цифры |
|
|
|
|
квадратом |
|
|
самое большое и самое |
14. |
float |
Первое число, которое не |
Числа, целая часть |
|
|
|
|
превосходит заданное |
которых является |
|
маленькое значение |
|
|
пользователем |
простым числом |
|
Числа, кратные сумме |
15. |
unsigned short |
Первое число, в котором |
Числа, в которых такой |
|
|
|
int |
есть заданная цифра |
цифры нет |
|
своих цифр |
Двунаправленный список имеет два адресных поля, которые указывают на следующий элемент списка и на предыдущий. Поэтому двигаться по такому списку можно как слева направо, так и справа налево.