Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа №4. Одномерные массивы.docx
Скачиваний:
64
Добавлен:
23.03.2016
Размер:
108.81 Кб
Скачать
  1. Лабораторная работа № 4

    1. Обработка одномерных массивов

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

        1. Теоретический материал

При выполнении лабораторных работ 4 и 5 будет использоваться структурированный тип данных массив, который представляет собой фиксированное количество упорядоченных однотипных компонент, снабженных индексами. Он может быть однономерным и многомерным. В лабораторной работе № 4 будут использоваться одномерные массивы, в лабораторной работе № 5 – двумерные.

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

int array[10];

В этом коде мы определили массив с идентификатором (именем) array (массив) из десяти элементов типа int. В таком виде, все элементы массива ещё не инициализированы. Чтобы инициализировать их при объявлении, нужно использовать следующий синтаксис:

int array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

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

int array[10]; //определение массива

for (int i = 0; i < 10; i++)

{

array[i] = i;

}

Заметьте, что нумерация индексов начинается с нуля. Поэтому число индексов всегда на единицу меньше числа элементов массива.

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

int m[6] = {4, 3, 1, 4, 7, 8};

m[3] или (m + 3)[0] Обращение к 4-му элементу массива.

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

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

Необходимо помнить, что при передаче массива в функцию всегда происходит передача его адреса. Т.о. в C++ все массивы передаются по адресу.

        1. Пример выполнения лабораторной работы

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

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

В графическом виде этот алгоритм будет блок-схему, представленную на рисунке.

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

int n = 15;

int a[15];

cout << "Исходный массив: ";

srand(time(NULL));

for (int i = 0; i < n; i++)

{

a[i]=rand() % 100 - 50;

cout << a[i] << " ";

}

Генератор случайных чисел активизируется командой srand(time(NULL))(Для этого требуется подключить библиотеку time.h). Далее в цикле случайным образом задаются элементы массива. Функция rand() % 100 - 50 возвращает случайное число в диапазоне от -50 до 50. Сразу же выводим значение элемента массива на экран. В цикле все элементы будут выводиться в строчку, т. к.не используется ключевое слово endl. После генерации и вывода всех элементов массива осуществляется переход на новую строку.

Вторая часть алгоритма – поиск максимального элемента. Предположим, что первый элемент – максимальный, тогда в переменную i_max, где будет запоминаться положение максимального элемента, запишем 0. Далее организуется цикл, в котором ищется элемент, больший чем a[i_max].

int i_max = 0;

for (int i = 0; i < n; i++)

if(a[i] > a[i_max])

i_max = i;

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

Внутренний цикл сдвига можно проиллюстрировать на примере удаления шестого элемента из массива, содержащего 10 элементов.

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

int i = i_max;

while (i < n)

if (a[i] < 0)

{

for (int j = i; j < n -1; j++)

{

a[j] = a[j + 1];

}

n--;

}

else

i++;

Еще одна тонкость данного фрагмента состоит в том, что переход к следующему элементу (i++) для проверки осуществляется только тогда, когда элемент не удовлетворяет условию. Если же i-й элемент окажется отрицательным, то после удаления на его месте окажется i+1-й элемент, который и нужно проверять на следующей итерации цикла.

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

// Massive.cpp: определяет точку входа для консольного приложения.

//

#include "stdafx.h"

#include "iostream"

#include "conio.h"

#include <time.h>

using namespace std;

int main()

{

setlocale(LC_ALL, "Russian");

printf("Автор – Иванов И.И., студент гр. ИСЭбд-11\n");

printf("Вариант № 100\n");

printf("Дан одномерный массив целых чисел. Удалить все отрицательные элементы, расположенные справа от максимального \n");

int n = 15;

int a[15];

cout << "Исходный массив: ";

srand(time(NULL));

for (int i = 0; i < n; i++)

{

a[i]=rand() % 100 - 50;

cout << a[i] << " ";

}

int i_max = 0;

for (int i = 0; i < n; i++)

if(a[i] > a[i_max])

i_max = i;

cout << endl << " Индекс максимального элемента: " << i_max << endl;

int i = i_max;

while (i < n)

if (a[i] < 0)

{

for (int j = i; j < n -1; j++)

{

a[j] = a[j + 1];

}

n--;

}

else

i++;

cout << " Итоговый массив: ";

for (int i = 0; i < n; i++)

{

cout << a[i] << " ";

}

_getch();

return 0;

}