Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lekcija-12.pdf
Скачиваний:
26
Добавлен:
10.02.2016
Размер:
367.6 Кб
Скачать

 

Лекция 12

 

 

 

 

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

 

 

 

Основные определения.............................................................................................................

 

 

1

Операции над массивами..........................................................................................................

 

 

3

Массивы и указатели.................................................................................................................

 

 

6

Варианты обращения к элементам массива........................................................................

 

 

6

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

 

 

8

Передача одномерного массива в функцию в качестве параметра....................................

 

10

Способы передачи одномерного массива в качестве параметра....................................

 

11

Массив указателей на функцию.............................................................................................

 

 

14

Динамические одномерные массивы.....................................................................................

 

 

15

Способы определения динамических одномерных массивов.........................................

 

15

Пример нахождения среднего значения элементов динамического массива ...............

16

Перегрузка функций при работе с массивами......................................................................

 

 

16

Шаблоны функций при работе с массивами.........................................................................

 

 

17

Поиск в массиве.......................................................................................................................

 

 

19

Сортировка массивов..............................................................................................................

 

 

20

Сортировка обменом («пузырьковая» сортировка).....................................................

 

 

21

Сортировка одномерного массива по некоторому признаку..................................

 

24

Сортировка вставкой.......................................................................................................

 

 

25

Сортировка выбором.......................................................................................................

 

 

26

Примеры...................................................................................................................................

 

 

 

26

Нахождение номера первого вхождения числа y в массив Х.........................................

 

26

Проверка элементов массива на некоторую закономерность.........................................

 

27

Построение элементов массива в соответствии с некоторой закономерностью. ........

29

Нахождение количества положительных элементов между максимальным и

 

минимальным элементами целочисленного массива ......................................................

 

 

29

Нахождение суммы элементов вещественного массива, расположенных правее

 

последнего отрицательного элемента ...............................................................................

 

 

31

Основные определения

 

 

 

Массив

– однородная, фиксированная по

размеру

и конфигурации,

последовательность элементов простой или составной структуры, упорядоченных по

индексам и расположенных в памяти подряд. Элементы этой последовательности

данных называются элементами массива. Нумерация элементов выполняется

индексными последовательностями: каждый элемент массива имеет свой индекс, чем и

отличается от других элементов.

 

 

 

Массив определяется именем и размерностью – количеством индексов,

необходимых для указания местонахождения элемента массива (для одномерного массива

– одним, для

двухмерного – двумя и т.д.). Массив

называется

многомерным

при

количестве индексов больше одного.

 

 

 

В С++ признаком одномерного массива является наличие парных скобок [ ], в

которых указывается количество элементов массива (его длина, размер),

зафиксированное в определении массива и в процессе работы программы не изменяемое.

Размер может быть задан только целой положительной константой или

константным выражением.

 

 

 

Определение одномерного массива:

 

 

 

 

тип имя [размер массива];

 

 

 

В некоторых случаях допустимо описание массива без указания количества его

 

элементов:

 

 

 

 

Программирование – лекция 12 (лекции Стрикелевой Л.В.)

 

 

1

extern int array[ ];

К отдельному элементу массива можно обратиться при помощи переменной с индексом: имени массива (единого для всех элементов) и одного или нескольких индексов, в зависимости от размерности массива. Индекс может меняться от 0 до n-1, где n – количество элементов массива, его размер. Максимальный индекс элемента всегда на 1 меньше размера массива.

Например:

char buffer[81]; //массив состоит из элементов buffer[0], … buffer[80] типа char; int key[4]; //массив состоит из элементов key[0], … key[3] типа int;

float a[10]; //массив состоит из элементов key[0], … key[3] типа float;

Доступ к элементу массива:

 

 

buffer[80]

key[3]

a[1]

a[9]

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

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

Если элементов в массиве больше, чем инициализаторов, элементы, для которых

значения не указаны, обнуляются:

 

int b[5]={3, 2, 1};

//массив целых значений, занимает 5*4=20 байтов

 

//b[0]=3; b[1]=2; b[2]=1; b[3]=0; b[4]=0;

float f[10];

//массив занимает 10*4=40 байтов

double x [ ] = {1.5, 2.8, 3.4, 0.5, 7.3} ;

 

//массив вещественных значений занимает 5*8=40 байтов

char str [ ] = {‘a’, ‘b’, ‘+’};

//массив символов, занимает 3 байта

Если элементов в массиве меньше, чем инициализаторов, то определение массива будет ошибочным:

double B[]; //ошибка в определении – нет размера double B[3]={1, 2, 3, 4, 5};//ошибка инициализации

Для статических или внешних массивов компилятор выполняет инициализацию по умолчанию (всем элементам присваиваются нулевые значения).

Наиболее часто массив используется для хранения значений векторов. Например, структура из трех значений типа float, проиндексированных заданным диапазоном целых чисел от 0 до 2 объявляется записью: float V [3];

В памяти элементы V[0], V[1], V[2] располагаются последовательно:

V[0]

V[1]

V[2]

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

Программирование – лекция 12 (лекции Стрикелевой Л.В.)

2

Любой полином можно описать массивом его коэффициентов a0, a1, … , ak-1, ak, в котором роль индекса играет степень переменной х: a[0], a[1], …a[k-1], a[k].

Характеристики массива

Вкачестве характеристик массива выступают:

Тип – общий тип элементов массива.

Размерность – количество индексов массива (a[10] – одномерный массив; b[3][5] – двухмерный массив; с[2][3][5] – трехмерный и т.д.)

Размер (количество элементов) по каждой из размерностей.

Тип компонентов. Тип индексов

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

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

#define k 50 const int n=10; const int m=20; double a [n]; char b [m]; double ar[k];

Операции над массивами

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

Наиболее часто при работе с массивами решаются следующие типы задач:

1.анализ массива (всего или части) для нахождения некоторой его характеристики;

2.поиск в массиве, т.е. определение элемента (первого, последнего, всех) с некоторым условием и нахождение его индекса;

3.построение массива по некоторому правилу, используя индексы, числа или массивы;

4.преобразование массива (изменение значения, перестановка элементов, добавление или удаление элементов и т.п.);

5.сортировка массива по некоторому критерию;

6.вывод массива в специальном виде.

Рассмотрим более подробно работу с массивами.

Инициализация массива – присваивание каждому элемента массива значения, соответствующего базовому типу. Возможна явная инициализация массивa только при его

Программирование – лекция 12 (лекции Стрикелевой Л.В.)

3

определении:

int intarray[5] = { 31, 54, 77, 52, 93 };

или:

int ar [5] = {0, 0, 0, 0, 0};

Размер массива указывать необязательно (компилятор вычислит его по количеству инициализирующих значений):

int V[ ] = {12, 1, -5, 22, -4};

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

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

Так как все элементы массива имеют одинаковый размер, то количество элементов в массиве позволяет определить выражение:

sizeof (имя_массива) / sizeof (имя_массива[0]).

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

const int n=5;

 

int A[n];

 

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

 

{

//в стиле С

printf ("input A[%d]\n", i);

scanf ("%d",&A[i])

 

}

 

или

int age[4];

 

for(int j=0; j<4; j++)

 

{

 

cout << "Enter an age: ";

//в стиле С++

cin >> age[j];

}

 

Если точное количество элементов в массиве неизвестно, то память можно выделить по максимуму (например, const int n = 100;), а затем заполнять только часть ее. Несмотря на то, что значение константы n определяется с запасом, надежная программа должна обязательно содержать проверку на количество вводимых элементов.

#include "iomanip"

void Vvod (int mas[], int kol_a); //прототипы функций ввода-вывода void Vyvod (int mas[], int kol_a);

const int n = 1000;

 

int main ()

 

{

 

int a[n];

 

int kol_а;

 

cout << "kol_a=??? ";

 

cin >> kol_а;

//проверка

if (kol_а > n) {

cout << "size > n " << endl;

_getch();

 

return 1;

 

}

 

Vvod (a,kol_а);

 

Vyvod (a,kol_а);

 

_getch();

 

return 0;

 

}

4

Программирование – лекция 12 (лекции Стрикелевой Л.В.)

void Vvod (int mas[], int kol_а) //функция ввода элементов

{for(int j=0; j<kol_а; j++) {cout << "Enter an a: ";

cin >> mas[j];

}

}

void Vyvod (int mas[], int kol_а) //функция вывода элементов

{int j;

for(j=0; j<kol_а; j++)

cout << setw(4) << mas[j]; }if ( !((j+1)% 5) ) cout << endl;

Вывод элементов массива можно организовать по-разному.

Вывод элементов одномерного массива по одному в строке:

#include "stdafx.h"

int main()

{

int intarray[5] = { 31, 54, 77, 52, 93 }; for(int j=0; j<5; j++)

cout << intarray[j] << endl; _getch();

return 0;

}

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

int main()

{

int intarray[5] = { 31, 54, 77, 52, 93 }; for (int i=0; i<5; i++)

cout << intarray[i] << " ";

cout << endl; _getch();

return 0;

}

Вывод элементов одномерного целочисленного массива по K в строке

#include

<iomanip>

 

const int n=10;

 

int K =5;

 

//в стиле С++

int A[n];

j=0; j<n; j++)

for (int

//заполнение массива

for (int

A[j] = j * 10;

i=0; i<n; i++)

 

{cout << setw(7) << A[i];

//на элемент отводится 7

позиций

if (!((i+1)% K)) cout << endl;

 

элементов

//перевод строки происходит после вывода K=5

}

Например, в предположении, что на значение отводится 8 позиций – вместе со знаком и отступом от предыдущего значения, имеем:

#include <iomanip>

 

#include <stdlib.h>

 

const

int n=10;

 

int main ()

 

{

Random_array[n];

 

int

 

int

a=5, b=10;

 

for

(int index =0; index < n; index++)

//заполнение массива

Random_array [index] = a + rand() % b;

Программирование – лекция 12 (лекции Стрикелевой Л.В.)

5

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]