Практическая работа №5
Основные теоретические положения
Section titled “Основные теоретические положения”1. Одномерные массивы
Массив — это набор элементов одного типа, расположенных последовательно в памяти.
Например:
int numbers[5] = {10, 20, 30, 40, 50};Массив numbers содержит пять элементов типа int.
Каждый элемент массива имеет индекс.
| Индекс | 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|---|
| Значение | 10 | 20 | 30 | 40 | 50 |
Индексация массива в C++ начинается с 0.
Для обращения к отдельному элементу используется его индекс:
cout << numbers[0];cout << numbers[3];Результат:
1040Значение элемента массива можно изменить:
numbers[2] = 100;После этого массив будет содержать:
10 20 100 40 502. Объявление и инициализация массива
Массив фиксированного размера:
int numbers[5];Массив с начальными значениями:
int numbers[5] = {4, 8, 15, 16, 23};Если все начальные значения задаются сразу, размер массива можно не указывать:
int numbers[] = {4, 8, 15, 16, 23};Компилятор самостоятельно определит количество элементов.
3. Определение количества элементов с помощью sizeof
Оператор sizeof возвращает размер объекта в байтах.
Например:
int numbers[] = {10, 20, 30, 40, 50};
cout << sizeof(numbers);Для определения количества элементов массива можно разделить размер всего массива на размер одного элемента:
int size = sizeof(numbers) / sizeof(numbers[0]);Общая запись:
sizeof(массив) / sizeof(массив[0])Например:
int numbers[] = {10, 20, 30, 40, 50};
int size = sizeof(numbers) / sizeof(numbers[0]);
cout << size;Результат:
54. Определение количества элементов с помощью std::size()
Начиная с C++17 количество элементов обычного массива можно определить с помощью std::size():
#include <iostream>#include <iterator>
using namespace std;
int main() { int numbers[] = {10, 20, 30, 40, 50};
cout << std::size(numbers);
return 0;}Результат:
5Оба способа:
sizeof(numbers) / sizeof(numbers[0])и:
std::size(numbers)возвращают количество элементов массива.
5. Перебор элементов массива с помощью for
Для обработки всех элементов массива можно использовать обычный цикл for.
int numbers[] = {5, 8, 2, 10, 7};
for (int i = 0; i < std::size(numbers); i++) { cout << numbers[i] << " ";}Переменная i содержит индекс текущего элемента.
Результат:
5 8 2 10 7Обычный for удобен, если требуется работать не только со значением элемента, но и с его индексом:
for (int i = 0; i < std::size(numbers); i++) { cout << "numbers[" << i << "] = " << numbers[i] << endl;}6. Перебор элементов с помощью range-based for (foreach)
Если индекс элемента не требуется, массив удобно перебирать с помощью range-based for.
int numbers[] = {5, 8, 2, 10, 7};
for (int number : numbers) { cout << number << " ";}Результат:
5 8 2 10 7Такой цикл часто называют foreach, так как действие выполняется для каждого элемента массива.
Общая форма:
for (тип переменная : массив) { // действия}Например:
for (int number : numbers) { cout << number << endl;}Переменная number последовательно получает значения всех элементов массива.
7. Использование foreach для вычислений
С помощью range-based for можно находить сумму элементов:
int sum = 0;
for (int number : numbers) { sum += number;}Подсчитывать элементы:
int count = 0;
for (int number : numbers) { if (number > 0) { count++; }}8. Изменение элементов в foreach
Рассмотрим следующий цикл:
for (int number : numbers) { number = 0;}Он не изменит исходный массив.
Переменная number получает копию значения элемента.
Для изменения элемента необходимо использовать ссылку:
for (int& number : numbers) { number = 0;}Например:
int numbers[] = {5, -8, 2, -10, 7};
for (int& number : numbers) { if (number < 0) { number = 0; }}После обработки:
5 0 2 0 79. Вычисление суммы элементов
Для накопления результата используется отдельная переменная:
int numbers[] = {5, 8, 2, 10, 7};
int sum = 0;
for (int i = 0; i < std::size(numbers); i++) { sum += numbers[i];}
cout << sum;То же вычисление с использованием foreach:
int sum = 0;
for (int number : numbers) { sum += number;}
cout << sum;10. Подсчёт элементов по условию
Например, определим количество положительных элементов:
int numbers[] = {5, -8, 2, -10, 7};
int count = 0;
for (int number : numbers) { if (number > 0) { count++; }}
cout << count;11. Поиск минимального и максимального элементов
Для поиска максимального элемента начальным значением можно сделать первый элемент массива:
int numbers[] = {7, 3, 12, 5, 9};
int maxValue = numbers[0];
for (int i = 1; i < std::size(numbers); i++) { if (numbers[i] > maxValue) { maxValue = numbers[i]; }}
cout << maxValue;Если необходимо определить индекс максимального элемента:
int maxIndex = 0;
for (int i = 1; i < std::size(numbers); i++) { if (numbers[i] > numbers[maxIndex]) { maxIndex = i; }}
cout << "Значение: " << numbers[maxIndex] << endl;cout << "Индекс: " << maxIndex << endl;12. Размер массива и количество используемых элементов
Необходимо различать полный размер массива и количество элементов, которые фактически используются программой.
Например:
const int MAX_SIZE = 10;
int numbers[MAX_SIZE];Массив рассчитан на десять элементов:
cout << std::size(numbers);Результат:
10Однако программа может использовать только часть массива:
int n;
cin >> n;
for (int i = 0; i < n; i++) { cin >> numbers[i];}Если пользователь ввёл:
5то фактически используются только первые пять элементов.
Задания для выполнения
Section titled “Задания для выполнения”Часть 1. Исследование одномерных массивов
Задание 1.1. Индексы и элементы массива
Объявите массив:
int numbers[] = {12, -5, 7, 0, 18, -3, 9};Выведите каждый элемент массива вместе с его индексом.
Результат должен иметь следующий вид:
numbers[0] = 12numbers[1] = -5numbers[2] = 7numbers[3] = 0...После этого измените значение элемента с индексом 3 на 25 и повторно выведите массив.
Ответьте на вопросы:
- Какой элемент массива является первым?
- Какой индекс имеет последний элемент массива?
- Чем индекс элемента отличается от его значения?
Задание 1.2. Исследование sizeof
Используйте массив:
int numbers[] = {12, -5, 7, 0, 18, -3, 9};Выведите:
- размер всего массива в байтах;
- размер одного элемента массива;
- количество элементов массива.
Используйте:
sizeof(numbers)sizeof(numbers[0])sizeof(numbers) / sizeof(numbers[0])Вывод программы оформите следующим образом:
Размер массива: ... байтРазмер одного элемента: ... байтКоличество элементов: ...Объясните, почему деление размера массива на размер одного элемента позволяет определить количество элементов.
Задание 1.3. Использование std::size()
Для того же массива определите количество элементов с помощью:
std::size(numbers)Сравните результат с:
sizeof(numbers) / sizeof(numbers[0])Программа должна вывести:
Количество через sizeof: ...Количество через std::size: ...Ответьте на вопросы:
- Одинаковый ли результат дают оба способа?
- Какой вариант записи проще читать?
- Начиная с какой версии стандарта C++ доступна функция
std::size()?
Задание 1.4. Перебор элементов массива
Дан массив:
int numbers[] = {5, 8, -2, 10, -7, 4, 11};Используя обычный цикл for:
- выведите все элементы массива;
- найдите сумму всех элементов;
- определите количество положительных элементов;
- определите количество отрицательных элементов.
Результат оформите следующим образом:
Массив: 5 8 -2 10 -7 4 11Сумма элементов: ...Положительных элементов: ...Отрицательных элементов: ...Задание 1.5. Использование foreach
Дан массив:
int numbers[] = {4, -7, 12, 3, -5, 8, 10};Не используя индексы массива и применяя range-based for:
- выведите все элементы массива;
- найдите сумму всех элементов;
- определите количество положительных элементов;
- определите количество отрицательных элементов;
- определите количество чётных элементов.
Результат оформите следующим образом:
Массив: 4 -7 12 3 -5 8 10Сумма: ...Положительных: ...Отрицательных: ...Чётных: ...Задание 1.6. Изменение элементов через foreach
Создайте массив:
int values[] = {5, -3, 8, -6, 4, -1};Выполните следующий код:
for (int value : values) { if (value < 0) { value = 0; }}Выведите массив после выполнения цикла.
Ответьте на вопрос:
Изменились ли элементы исходного массива? Почему?
После этого измените цикл:
for (int& value : values) { if (value < 0) { value = 0; }}Снова выведите массив.
Сравните результаты работы двух вариантов программы.
Задание 1.7. Сравнение for и foreach
Дан массив:
int numbers[] = {15, 4, 9, 21, 6};Выведите все элементы:
- с помощью обычного цикла
for; - с помощью range-based
for.
После этого выведите каждый элемент вместе с его индексом.
Ответьте на вопросы:
- В каком цикле проще получить значение элемента?
- В каком цикле проще получить индекс?
- В каких случаях удобнее использовать обычный
for? - В каких случаях удобнее использовать range-based
for?
Часть 2. Задания для самостоятельного выполнения
Требования к схеме алгоритма
Section titled “Требования к схеме алгоритма”В схеме алгоритма необходимо отобразить:
- начало и конец алгоритма;
- исходный массив;
- инициализацию необходимых переменных;
- цикл перебора элементов;
- используемые условия;
- выполняемые вычисления;
- вывод результата.
Вариант 1
Section titled “Вариант 1”int numbers[] = {7, -3, 12, 5, -8, 10, 4};Необходимо:
- найти сумму всех элементов массива;
- найти максимальный элемент и его индекс;
- найти сумму элементов, расположенных до максимального элемента.
Вариант 2
Section titled “Вариант 2”int numbers[] = {8, -4, 2, -7, 11, 6, -1};Необходимо:
- определить количество положительных и отрицательных элементов;
- найти минимальный элемент и его индекс;
- заменить все отрицательные элементы значением
0и вывести изменённый массив.
Вариант 3
Section titled “Вариант 3”int numbers[] = {4, 9, 2, 15, 7, 11, 6};Необходимо:
- найти минимальный элемент массива и его индекс;
- вычислить среднее арифметическое элементов;
- определить количество элементов, которые больше среднего арифметического.
Вариант 4
Section titled “Вариант 4”int numbers[] = {-2, 8, 0, -5, 12, 4, -1, 7};Необходимо:
- определить количество положительных, отрицательных и нулевых элементов;
- найти сумму положительных элементов;
- найти первый отрицательный элемент и вывести его индекс.
Вариант 5
Section titled “Вариант 5”int numbers[] = {6, 3, 10, 7, 12, 5, 8};Необходимо:
- определить количество чётных и нечётных элементов;
- найти сумму элементов, расположенных на чётных индексах;
- умножить элементы с нечётными индексами на
2и вывести изменённый массив.
Вариант 6
Section titled “Вариант 6”int numbers[] = {14, 3, 9, 2, 17, 6, 11};Необходимо:
- найти минимальный и максимальный элементы;
- определить их индексы;
- поменять минимальный и максимальный элементы местами и вывести массив.
Вариант 7
Section titled “Вариант 7”int numbers[] = {5, 8, 5, 2, 5, 10, 7, 5};Введите с клавиатуры число X.
Необходимо:
- определить, сколько раз
Xвстречается в массиве; - найти индекс первого элемента, равного
X; - заменить все элементы, равные
X, значением0.
Если число X отсутствует в массиве, вывести соответствующее сообщение.
Вариант 8
Section titled “Вариант 8”int numbers[] = {11, -3, 8, 6, -7, 10, 4};Необходимо:
- найти сумму положительных элементов;
- найти произведение отрицательных элементов;
- определить, каких элементов больше: положительных или отрицательных.
Если их количество одинаково, вывести соответствующее сообщение.
Вариант 9
Section titled “Вариант 9”int numbers[] = {2, 7, 4, 9, 6, 11, 8};Необходимо:
- определить количество элементов, которые больше
5; - найти сумму элементов, которые меньше
5; - все элементы, которые меньше
5, заменить значением0.
Вывести изменённый массив.
Вариант 10
Section titled “Вариант 10”int numbers[] = {12, 7, 4, 15, 6, 9, 2};Необходимо:
- найти сумму чётных элементов;
- найти максимальный нечётный элемент;
- определить количество элементов, которые меньше найденного максимального нечётного элемента.
Вариант 11
Section titled “Вариант 11”int numbers[] = {3, 6, 8, 7, 12, 15, 14};Необходимо:
- определить количество элементов, которые больше предыдущего элемента;
- определить количество элементов, которые меньше предыдущего элемента;
- проверить, расположен ли массив строго по возрастанию.
Пример строго возрастающего массива:
2 4 7 9 15Массив:
2 4 4 9 15не является строго возрастающим.
Вариант 12
Section titled “Вариант 12”int numbers[] = {5, 12, 3, 8, 14, 6, 10};Необходимо:
- вычислить среднее арифметическое элементов;
- определить количество элементов, которые больше среднего арифметического;
- найти сумму элементов, которые меньше среднего арифметического.
Вариант 13
Section titled “Вариант 13”int numbers[] = {6, 4, -3, 8, 10, -5, 7};Необходимо:
- найти первый отрицательный элемент и его индекс;
- найти сумму элементов, расположенных до первого отрицательного элемента;
- определить количество элементов, расположенных после первого отрицательного элемента.
Если отрицательных элементов нет, вывести соответствующее сообщение.
Вариант 14
Section titled “Вариант 14”int numbers[] = {4, 9, 2, 9, 6, 9, 3};Необходимо:
- найти максимальный элемент;
- определить количество повторений максимального элемента;
- вывести индексы всех элементов, равных максимальному.
Вариант 15
Section titled “Вариант 15”int numbers[] = {7, 2, 11, 5, 4, 9, 6};Необходимо:
- найти минимальный и максимальный элементы;
- определить разность между максимальным и минимальным элементами;
- найти сумму элементов, расположенных между минимальным и максимальным элементами.
Минимальный и максимальный элементы в сумму не включаются.
Дополнительное задание
Section titled “Дополнительное задание”Выполняется после завершения своего варианта.
Создайте массив:
int numbers[10];Введите количество используемых элементов n.
1 <= n <= 10После этого введите n целых чисел.
Программа должна:
- вывести полный размер массива с помощью
std::size(numbers); - вывести размер всего массива в байтах;
- вывести размер одного элемента;
- вывести количество фактически введённых элементов
n; - найти сумму введённых элементов;
- найти минимальный элемент;
- найти максимальный элемент.
Контрольные вопросы
Section titled “Контрольные вопросы”- Что называется массивом?
- Как объявить массив из пяти элементов типа
int? - С какого значения начинается индексация массива в C++?
- Как обратиться к третьему элементу массива?
- Чем индекс элемента отличается от его значения?
- Что возвращает оператор
sizeof? - Как определить количество элементов массива с помощью
sizeof? - Для чего используется
std::size()? - В чём различие между полным размером массива и количеством фактически используемых элементов?
- Почему при переборе массива используется условие
i < size, а неi <= size? - Что может произойти при обращении к элементу за пределами массива?
- Что представляет собой range-based
for? - Чем range-based
forотличается от обычного циклаfor? - В каких случаях удобнее использовать обычный
for? - В каких случаях удобнее использовать
foreach? - Почему
for (int value : numbers)не изменяет элементы исходного массива? - Для чего используется
for (int& value : numbers)? - Как найти минимальный или максимальный элемент массива?
- Как определить индекс минимального или максимального элемента?
- Для чего перед написанием программы составляется схема алгоритма?
Рекомендуемая литература
Section titled “Рекомендуемая литература”- LearnCpp — Introduction to containers and arrays
- LearnCpp — C-style arrays
- LearnCpp — Range-based for loops
- cppreference — Arrays
- cppreference — Range-based for loop
- cppreference —
std::size - cppreference —
sizeof - Стивен Прата. Язык программирования C++. Лекции и упражнения. 6-е изд.
- Бьерн Страуструп. Язык программирования C++. 4-е изд.