Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2 курс / 6 / 06

.pdf
Скачиваний:
20
Добавлен:
21.08.2019
Размер:
283.84 Кб
Скачать

Лабораторная работа № 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

есть заданная цифра

цифры нет

 

своих цифр

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

Соседние файлы в папке 6
  • #
    21.08.2019283.84 Кб2006.pdf
  • #
    21.08.20191.42 Кб176.sln