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

ПрЭВМ ЛР №3 Массивы

.pdf
Скачиваний:
16
Добавлен:
13.02.2015
Размер:
257.02 Кб
Скачать

ПрЭВМ, 1 семестр, направление «Прикладная математика и информатика»

1

Лабораторная работа №3.

Одномерные массивы. Многомерные массивы. Функции

Особенности работы с одномерными массивами

Массивы используют для хранения групп данных одного типа. Величины, хранящиеся в массиве, называют его элементами. К любому элементу массива можно обратиться, используя имя массива и номер элемента в этом массиве.

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

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

Для работы с массивами удобнее всего использовать цикл for. Помните, что массив нельзя вывести на печать или ввести сразу, нужно делать это поэлементно. То же самое верно для всех алгоритмов работы с массивами. Не забывайте, что в С++ существует возможность для цикла for задавать шаг счетчика цикла (а не только увеличивать или уменьшать его на единицу). Для многих задач это оказывается весьма полезным.

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

Указатель – это переменная, в которой хранится адрес области памяти. Имя массива является указателем на его нулевой элемент.

Использование динамических массивов в C++

Если до начала работы неизвестно, сколько в массиве элементов, следует использовать динамические массивы. В этом случае размерность массива задается при помощи переменной. Память для хранения массива выделяется в процессе выполнения программы при помощи операции new[]. Например:

int n = 10;

int *a = new int[n];

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

delete [] a;

Обнуления динамической памяти при ее выделении не происходит. Инициализировать при объявлении динамический массив нельзя.

Особенности работы с двумерными массивами

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

Подготовлено Латухиной Е.А., старшим преподавателем кафедры ПиВВ ИМИКТ САФУ

ПрЭВМ, 1 семестр, направление «Прикладная математика и информатика»

2

Двумерный массив представляется в С++ как массив, состоящий из массивов. Массив хранится по строкам в непрерывной области памяти. Строки массива ничем не отделены одна от другой, т.е. прямоугольной матрицей двумерный массив является только в нашем воображении. Первый индекс всегда представляет собой номер строки, второй – номер столбца. Каждый индекс может изменяться в заданных при объявлении массива размерах.

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

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

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

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

Использование динамических двумерных массивов

Память под динамические массивы можно выделять двумя способами.

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

int n;

cons tint m = 5; cin>>n;

int (*a)[m] = new int [n][m]; //Первый вариант

int **b = (int **) new int [n][m]; //Второй вариант

Варианты равнозначны, но в целом данный способ не всегда удобен.

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

int n, m; cin>>n>>m;

int **a = new int *[n];

for (int i = 0; i < n; i++) a[i] = new int [m];

Освобождение памяти из-под массива с любым количеством измерений выполняется с помощью операции delete[].

Особенности передачи массивов в качестве параметров в функции

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

тип_результата имя_функции(int *a, const int n);//одномерный тип_результата имя_функции(int **a, const int n, const int m);//двумерный

Подготовлено Латухиной Е.А., старшим преподавателем кафедры ПиВВ ИМИКТ САФУ

ПрЭВМ, 1 семестр, направление «Прикладная математика и информатика»

3

Задания для всех

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

За каждую задачу из этого раздела можно получить не более одного балла (если не сказано иначе).

Одномерные массивы:

1.Написать программу, организующую заполнение целого массива из n элементов случайными значениями (n – целая переменная) и корректный вывод массива.

2.Выполнить предыдущую задачу для вещественного массива.

Функции из задач 1 и 2 удобно использовать для решения всех последующих задач.

3.Написать программу, которая для целого массива из n элементов определяет номер максимального по модулю элемента.

4.Написать программу, которая для вещественного массива из 20 элементов определяет, сколько неположительных элементов располагается между его максимальным и минимальным элементами.

5.Написать программу, решающую задачу линейного поиска элемента в заданном целочисленном массиве.

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

7.Написать программу, которая упорядочивает вещественный массив методом выбора.

8.Написать программу, решающую задачу бинарного поиска в отсортированном

вещественном массиве. Двумерные массивы:

9.Написать программу, организующую заполнение массива размерностью n*m элементов случайными целыми значениями (n, m – именованные константы) и корректный вывод массива.

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

11.Написать программу для подсчета суммы элементов двумерного массива.

12.Написать программу, которая для вещественной матрицы 4х7 определяет среднее арифметическое ее элементов и количество отрицательных элементов в каждой строке.

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

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

15.Написать программу, реализующую умножение прямоугольных целочисленных матриц.

Индивидуальные задания

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

Подготовлено Латухиной Е.А., старшим преподавателем кафедры ПиВВ ИМИКТ САФУ

ПрЭВМ, 1 семестр, направление «Прикладная математика и информатика»

4

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

Решите следующие задачи:

1.(1 балл) В одномерном массиве, состоящем из n вещественных элементов, вычислить: Вариант 1: сумму отрицательных элементов массива.

Вариант 2: сумму элементов массива с четными номерами.

Вариант 3: сумму модулей элементов массива, меньших С (вводится с клавиатуры). Вариант 4: произведение элементов массива с четными номерами.

Вариант 5: количество элементов массива, равных 0. Вариант 6: количество положительных элементов массива.

Вариант 7: сумму модулей элементов массива с нечетными номерами. Вариант 8: произведение элементов массива с нечетными номерами. Вариант 9: сумму элементов массива с нечетными номерами.

Вариант 10: количество элементов массива, больших С (вводится с клавиатуры). Вариант 11: произведение отрицательных элементов массива.

Вариант 12: номер минимального элемента массива.

Вариант 13: количество элементов массива, попадающих в интервал [а, b]. Вариант 14: количество элементов массива, меньших С (вводится с клавиатуры). Вариант 15: сумму положительных элементов массива.

Вариант 16: сумму элементов массива, больших С (вводится с клавиатуры). Вариант 17: номер максимального элемента массива.

Вариант 18: произведение положительных элементов массива. Вариант 19: сумму элементов массива, попадающих в интервал [a, b]. Вариант 20: сумму модулей элементов массива с четными номерами. Вариант 21: номер максимального по модулю элемента массива. Вариант 22: произведение не равных нулю элементов массива.

Вариант 23: сумму элементов массива, меньших С (вводится с клавиатуры). Вариант 24: количество отрицательных элементов массива.

Вариант 25: номер минимального по модулю элемента массива.

Вариант 26: сумму модулей элементов массива, больших С (вводится с клавиатуры). Вариант 27: сумму модулей элементов массива, попадающих в интервал [a, b].

2.(1 балл) В одномерном массиве, состоящем из n целых элементов, найти:

Вариант 1: произведение элементов массива, расположенных между минимальным и максимальным элементами.

Вариант 2: произведение элементов массива, расположенных между минимальным по модулю и максимальным по модулю элементами.

Вариант 3: произведение элементов массива, расположенных между первым и последним отрицательными элементами.

Вариант 4: сумму элементов массива, расположенных между первым и последним положительными элементами.

Вариант 5: произведение элементов массива, расположенных после первого отрицательного элемента массива.

Вариант 6: произведение элементов массива, расположенных после минимального элемента массива.

Вариант 7: произведение элементов массива, расположенных между первым и последним положительными элементами.

Подготовлено Латухиной Е.А., старшим преподавателем кафедры ПиВВ ИМИКТ САФУ

ПрЭВМ, 1 семестр, направление «Прикладная математика и информатика»

5

Вариант 8: сумму элементов массива, расположенных между первым и последним нулевыми элементами.

Вариант 9: произведение элементов массива, расположенных после минимального по модулю элемента массива.

Вариант 10: произведение элементов массива, расположенных после максимального по модулю элемента массива.

Вариант 11: сумму элементов массива, расположенных после первого отрицательного элемента массива.

Вариант 12: произведение элементов массива, расположенных до первого отрицательного элемента массива.

Вариант 13: произведение элементов массива, расположенных после первого положительного элемента массива.

Вариант 14: сумму элементов массива, расположенных между первым и последним отрицательными элементами.

Вариант 15: произведение элементов массива, расположенных до минимального по модулю элемента массива.

Вариант 16: произведение элементов массива, расположенных до максимального по модулю элемента массива.

Вариант 17: произведение элементов массива, расположенных после максимального элемента массива.

Вариант 18: сумму элементов массива, расположенных после максимального элемента массива.

Вариант 19: произведение элементов массива, расположенных между первым и последним нулевыми элементами.

Вариант 20: произведение элементов массива, расположенных до максимального элемента массива.

Вариант 21: сумму элементов массива, расположенных до первого положительного элемента массива.

Вариант 22: сумму элементов массива, расположенных после первого положительного элемента массива.

Вариант 23: произведение элементов массива, расположенных до минимального элемента массива.

Вариант 24: сумму элементов массива, расположенных после минимального элемента массива.

Вариант 25: произведение элементов массива, расположенных до первого положительного элемента массива.

Вариант 26: произведение элементов массива, расположенных между первым и последним нулевыми элементами.

Вариант 27: произведение элементов массива, расположенных до первого нулевого элемента массива.

3. (1 балл) В одномерном массиве, состоящем из n вещественных элементов, заменить: Вариант 1: все положительные элементы на противоположные.

Вариант 2: все нулевые элементы на случайно сгенерированные отрицательные. Вариант 3: все элементы, меньшие чем введенное с клавиатуры число С, на ноль.

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

Вариант 5: все ненулевые элементы на обратные.

Подготовлено Латухиной Е.А., старшим преподавателем кафедры ПиВВ ИМИКТ САФУ

ПрЭВМ, 1 семестр, направление «Прикладная математика и информатика»

6

Вариант 6: все элементы, меньшие чем введенное с клавиатуры число С, на противоположные.

Вариант 7: все ненулевые элементы на случайно сгенерированные положительные. Вариант 8: все положительные элементы на среднее арифметическое соседних (если нулевой элемент является первым или последним, заменить на половину соседнего). Вариант 9: все отрицательные элементы на противоположные.

Вариант 10: все элементы, попадающие в интервал [а, b], на максимальный.

Вариант 11: все элементы, меньшие чем введенное с клавиатуры число С, на обратные. Вариант 12: все элементы, попадающие в интервал [а, b], на случайно сгеренерированные отрицательные.

Вариант 13: все отрицательные элементы на обратные.

Вариант 14: все элементы, попадающие в интервал [а, b], на минимальный.

Вариант 15: все элементы, большие чем введенное с клавиатуры число С, на противоположные.

Вариант 16: все элементы, попадающие в интервал [а, b], на нулевые.

Вариант 17: все элементы, большие чем введенное с клавиатуры число С, на ноль. Вариант 18: все ненулевые элементы на среднее арифметическое соседних (если нулевой элемент является первым или последним, заменить на половину соседнего).

Вариант 19: все нулевые элементы на случайно сгенерированные положительные. Вариант 20: все положительные элементы на обратные.

Вариант 21: все элементы, большие чем введенное с клавиатуры число С, на обратные. Вариант 22: все ненулевые элементы на случайно сгенерированные отрицательные. Вариант 23: все элементы, попадающие в интервал [а, b], на противоположные (если в этот интервал попадает нулевой, его не заменять).

Вариант 24: все отрицательные элементы на среднее арифметическое соседних (если нулевой элемент является первым или последним, заменить на половину соседнего). Вариант 25: все элементы, попадающие в интервал [а, b], на случайно сгеренерированные положительные.

Вариант 26: все элементы, попадающие в интервал [а, b], на обратные.

Вариант 27: все нулевые элементы на величины, обратные их номерам (если нулевой по номеру элемент окажется равен нулем, его не заменять).

4.(1 балл) Дан одномерный массив, состоящий из n вещественных элементов. Выполнить следующую задачу:

Вариант 1: Преобразовать массив таким образом, чтобы сначала располагались все положительные элементы, а потом все остальные.

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

Вариант 3: Преобразовать массив таким образом, чтобы сначала располагались все отрицательные элементы, а потом все остальные.

Вариант 4: Сжать массив, удалив из него все элементы, величина которых лежит в интервале [а, b]. Освободившиеся в конце массива элементы заполнить нулями.

Вариант 5: Преобразовать массив таким образом, чтобы сначала располагались все не равные нулю элементы, а потом все остальные.

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

Вариант 7: Преобразовать массив таким образом, чтобы сначала располагались все равные нулю элементы, а потом все остальные.

Подготовлено Латухиной Е.А., старшим преподавателем кафедры ПиВВ ИМИКТ САФУ

ПрЭВМ, 1 семестр, направление «Прикладная математика и информатика»

7

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

Вариант 9: Преобразовать массив таким образом, чтобы сначала располагались все большие введенного с клавиатуры числа С элементы, а потом все остальные.

Вариант 10: Упорядочить по возрастанию отдельно элементы, стоящие на четных местах, и элементы, стоящие на нечетных местах.

Вариант 11: Преобразовать массив таким образом, чтобы сначала располагались все меньшие введенного с клавиатуры числа С элементы, а потом все остальные.

Вариант 12: Преобразовать массив таким образом, чтобы сначала располагались четные элементы, а потом нечетные.

Вариант 13: Преобразовать массив таким образом, чтобы сначала располагались все равные введенному с клавиатуры числа С элементы, а потом все остальные.

Вариант 14: Заменить все нечетные элементы массива обратными и упорядочить массив по убыванию.

Вариант 15: Преобразовать массив таким образом, чтобы сначала располагались все попадающие в интервал [a, b] элементы, а потом все остальные.

Вариант 16: Сжать массив, удалив из него все элементы, целая часть которых лежит в интервале [а, b]. Освободившиеся в конце массива элементы заполнить нулями.

Вариант 17: Преобразовать массив таким образом, чтобы сначала располагались элементы, модуль которых не превышает 1, а потом все остальные.

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

Вариант 19: Преобразовать массив таким образом, чтобы сначала располагались элементы, модуль которых превышает 1, а потом все остальные.

Вариант 20: Заменить все отрицательные элементы массива их квадратами и упорядочить массив по возрастанию.

Вариант 21: Преобразовать массив таким образом, чтобы сначала располагались элементы, стоявшие на четных позициях, а потом все остальные.

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

Вариант 23: Преобразовать массив таким образом, чтобы сначала располагались элементы, стоявшие на нечетных позициях, а потом все остальные.

Вариант 24: Изменить порядок следования элементов в массиве на обратный.

Вариант 25: Преобразовать массив таким образом, чтобы сначала располагались элементы, отличающиеся от максимального не более чем на 20%, а потом все остальные. Вариант 26: Сжать массив, удалив из него все меньшие числа С элементы. Освободившиеся в конце массива элементы заполнить нулями.

Вариант 27: Преобразовать массив таким образом, чтобы сначала располагались элементы, отличающиеся от минимального не более чем на 15%, а потом все остальные.

5.(2 балла) Вариант 1-20 – см. стр. 85 – 88 Практикума. Варианты с 21 по 27 – задания для 5-11 вариантов соответственно.

6.(4 балла, задание повышенной сложности) Вариант 1-20 – см. стр.142-144 Учебника. Варианты с 21 по 27 – задания для 13-19 вариантов соответственно.

Подготовлено Латухиной Е.А., старшим преподавателем кафедры ПиВВ ИМИКТ САФУ