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

Массивы

.pdf
Скачиваний:
17
Добавлен:
07.06.2015
Размер:
614.4 Кб
Скачать

Министерство образования и науки РФ

Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования

«Тихоокеанский государственный университет»

РАБОТА С МАССИВАМИ В C/C++

Методические указания к выполнению лабораторных работ по курсу «Алгоритмические языки и программирование» для студентов специальности «Программное обеспечение вычислительной техники и автоматизированных систем» дневной формы обучения

Хабаровск Издательство ТОГУ

2011

УДК 511.3

Работа с массивами в C/C++: методические указания к выполнению лабораторных работ по курсу «Алгоритмические языки и программирование» для студентов специальности «Программное обеспечение вычислительной техники и автоматизированных систем» дневной формы обучения / сост. В. В. Стригунов. – Хабаровск: Изд-во Тихоокеан. гос. ун-та, 2011. – 24 с.

Методические указания составлены на кафедре «Информатика». В них приведены задания к двум лабораторным работам, посвященным одномерным и двумерным массивам в языках программирования C/C++, основным алгоритмам сортировки и поиска.

Печатается в соответствии с решениями кафедры «Информатика» и методического совета факультета компьютерных и фундаментальных наук.

© Тихоокеанский государственный университет,

2011

РАБОТА С МАССИВАМИ В C/C++

Методические указания к выполнению лабораторных работ по курсу «Алгоритмические языки и программирование» для студентов

специальности «Программное обеспечение вычислительной техники и автоматизированных систем» дневной формы обучения

Стригунов Валерий Витальевич

Главный редактор Л. А. Суевалова Редактор Л. А. Суевалова Компьютерная верстка В. В. Стригунов

Подписано в печать 07.10.11. Формат 60x84 1/16. Бумага писчая. Гарнитура «Калибри». Печать офсетная. Усл. печ. л. 1,39. Тираж 100 экз. Заказ .

Издательство Тихоокеанского государственного университета. 680035, Хабаровск, ул. Тихоокеанская, 136.

Отдел оперативной полиграфии издательства Тихоокеанского государственного университета. 680035, Хабаровск, ул. Тихоокеанская, 136.

2

Общие вопросы

Целью курса лабораторных занятий по дисциплине «Алгоритмические языки и программирование» является приобретение практических навыков по составлению алгоритмов решения задач и написания программ на высокоуровневых языках С или С++.

В данных методических указаниях приведены задания к двум лабораторным работам, посвященным работе с массивами в языках программирования C и С++. В них подробно описаны принципы работы с одномерными массивами, основные алгоритмы сортировки массивов,

поиска в массиве заданного значения, работа с двумерными массивами. Все примеры и алгоритмы снабжены детальным описанием и программным кодом на С++.

В ходе выполнения каждого лабораторного задания разрабатывается и отлаживается консольная программа, написанная на языке C или С++.

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

титульный лист;

текст задания на лабораторную работу;

краткую теоретическую часть по заданию и алгоритм;

текст программы;

пример выполнения программы (введенные данные и полученный результат);

вывод по проделанной работе.

3

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

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

Примеры описания массива:

int mas[10]; //описан массив с именем mas, состоящий из 10 //целочисленных элементов

double A[5], B[7]; //описаны два вещественных массива A и B, //состоящие из 5 и 7 элементов

Примечание.

При описании массива используются те же модификаторы класса памяти, const, что и для простых переменных.

*класс памяти+ *const+ тип идентификатор [размер] *инициализация+;

Одномерный массив соответствует математическому понятию векторастроки или вектора-столбца.

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

Например,

const int N = 100; double Ar1[N]; long int Ar2[2*N];

Примечание.

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

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

4

Например,

int mas[10] = {-3, 1, 5}; //первые 3 элемента массива mas //инициализируются значениями -3, 1, 5, //а остальные значением 0

double A[5] = {0.1, 0.2, 0.3, 0.4, 0.5},

B[7] = {0.0}; //все элементы массива A инициализированы //значениями из списка, все 7 элементов //массива B инициализированы значением 0

Примечание.

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

int C[] = {9, 5, 1}; //описан массив C из трех элементов

Для доступа к элементу массива используется операция индексации: после имени массива в квадратных скобках указывается индекс (номер) элемента. Элементы массива нумеруются с нуля, т.е. индекс может принимать значения от 0 до количества элементов массива минус единицу. Обработка массива, как правило, производится в циклах.

Например,

A[0] = A[0] + 10;

A[1] = A[2]*B[6];

for (int i = 0; i < 10; i++) mas[i] *= 2;

В оперативной памяти элементы массива располагаются непрерывно в соседних ячейках.

Примечание.

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

Рассмотрим принципы работы с одномерными массивами на следующих примерах.

5

Пример 1. Вычисление суммы квадратов элементов массива.

#include "iostream" int main()

{

const int N = 10; int i;

double mas[N] = {0.0}, Sum = 0.0;

//ввод массива

cout << "Введите элементы массива:\n"; for (i = 0; i < N; i++)

{

cout << "mas[" << i << "] -> "; cin >> mas[i];

}

//подсчет суммы квадратов элементов массива

for (i = 0; i < N; i++) Sum = Sum + mas[i]*mas[i];

cout << "Сумма квадратов элементов равна " << Sum << "\n"; return 0;

}

На рис. 1 показана экранная форма приложения с введенными исходными данными и результатом выполнения.

Рис. 1. Экранная форма приложения

Пример 2. Вычисление диапазона значений элементов массива (диапазон значений равен разности значения максимального элемента и значения минимального элемента).

...

const int N = 10; int i;

double mas[N], masMin, masMax, range;

6

//ввод массива

...

//находим минимальное и максимальное значение элементов массива masMin = mas[0]; masMax = mas[0];

for (i = 1; i < N; i++)

{

if (mas[i] < masMin) masMin = mas[i]; if (mas[i] > masMax) masMax = mas[i];

}

//вычисляем диапазон range = masMax – masMin;

Пример 3. Поиск индекса минимального элемента.

...

const int N = 10; int i, indMin; double mas[N];

...

//находим индекс минимального элемента массива indMin = 0;

for (i = 1; i < N; i++)

if (mas[i] < mas[indMin]) indMin = i;

...

Методы сортировки массива

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

Сортировка методом выбора

Алгоритм состоит в следующем. Среди элементов массива выбирается наименьший и меняется местами с первым. Далее рассматриваются элементы, начиная со второго, и наименьший из них меняется местами со вторым элементом. Так продолжается N-1 раз. При последнем проходе цикла при необходимости меняются местами предпоследний и последний элементы массива.

7

#include "iostream" int main ()

{

const int N = 9;

int mas[N] = {420, 79, 429, 53, 908, 140, 897, 594, 682}; int i, j, indMin, temp;

for (i = 0; i < N-1; i++)

{

//принимаем за наименьший первый из рассматриваемых //элементов

indMin = i;

//поиск номера минимального элемента из неупорядоченных for (j = i + 1; j < N; j++)

if (mas[j] < mas[indMin]) indMin = j;

//обмен элементов с номерами i и indMin temp = mas[i];

mas[i] = mas[indMin]; mas[indMin] = temp;

}

return 0;

}

На рис. 2 продемонстрирован процесс выполнения алгоритма сортировки методом выбора. Минимальные во время поиска элементы выделены полужирным шрифтом. Как видно, массив из 9 элементов сортируется за 8 проходов внешнего цикла for.

Исходный массив

 

 

 

 

 

 

 

 

 

indMin

 

|420

79

429

53

908

140

897

594

682

3

1-й проход цикла

53

|79

429

420

908

140

897

594

682

1

2-й проход цикла

53

79|429

420

908

140

897

594

682

5

3-й проход цикла

53

79

140|420

908

429

897

594

682

3

4-й проход цикла

53

79

140

420|908

429

897

594

682

5

5-й проход цикла

53

79

140

420

429|908

897

594

682

7

6-й проход цикла

53

79

140

420

429

594|897

908

682

8

7-й проход цикла

53

79

140

420

429

594

682|908 897

8

8-й проход цикла

53

79

140

420

429

594

682

897|908

 

Рис. 2. Пример сортировки методом выбора

8

Сортировка методом «пузырька»

Метод «пузырька» (или метод простого обмена) заключается в сравнении пары соседних элементов и замене их местами, если первый оказался больше второго. После этого сравнивается следующая пара и т.д. При выполнении этой последовательности действий элементы с большими значениями будут продвигаться (“всплывать” как пузырьки) в конец массива.

#include “iostream” int main ()

{

const int N = 9;

int mas[N] = {420, 79, 429, 53, 908, 140, 897, 594, 682}; int bound, t, j, temp;

bound = N – 1; do

{

t = 0;

for(j = 0; j <= bound – 1; j++) if (mas[j] > mas[j + 1])

{

temp = mas[j]; mas[j] = mas[j + 1]; mas[j + 1] = temp;

t = j;

}

bound = t;

} while (t); return 0;

}

Вначале сортировки ничего не известно о порядке размещения элементов.

Впеременной bound хранится индекс самого правого элемента массива,

окотором не известно, занял ли он свою окончательную позицию или нет.

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

Пример выполнения сортировки методом пузырька для массива из 9

элементов ,420, 79, 429, 53, 908, 140, 897, 594, 682приведен на рис. 3.

9

Исходный массив

 

 

 

 

 

 

bound

420

79

429

53 908

140 897

594

682|

8

1-й проход

 

 

 

 

 

 

 

цикла do-while

 

 

 

 

 

 

 

79 420

53

429 140

897 594

682

|908

7

2-й проход

 

 

 

 

 

 

 

цикла do-while

 

 

 

 

 

 

 

79

53

420

140 429

594 682

|897 908

6

3-й проход

 

 

 

 

 

 

 

цикла do-while

 

 

 

 

 

 

 

53

79

140

|420 429 594 682 897 908

2

4-й проход

 

 

 

 

 

 

 

цикла do-while

 

 

 

 

 

 

 

|53

79

140

420 429

594 682

897

908

0

Рис. 3. Пример сортировка методом «пузырька»

Как видно, после каждого прохода массива все элементы, расположенные правее самого последнего, который участвовал в обмене, и сам этот элемент занимают свои окончательные позиции (на рис. 3 эта часть массива отделена вертикальной чертой). При следующих просмотрах их проверять уже не нужно. Обратите внимание на то, что после третьего прохода еще четыре правых элемента ,420, 429, 594, 682сразу заняли свои позиции, а при последнем проходе перемещений элементов вообще не было.

Сортировка методом простых вставок

Пусть существующие m из N элементов массива уже упорядочены, т.е. mas*0+ ≤ mas*1+ ≤ … ≤ mas[m-1],

а элементы mas[m], mas[m+1+, …, mas[N-1+ не известны. Метод сортировки вставкой применяется в тех случаях, когда массив надо заполнить так, чтобы после вставки каждого нового элемента сохранилась его упорядоченность. Для этого осуществляется поиск подходящего для вставки места в уже заполненной части массива. Место для нового элемента освобождается путем сдвига больших элементов к концу массива.

#include "iostream" int main ()

{

const int N = 9;

int mas[N] = {79, 420, 429}; int i, j, m, el;

m = 3;

10