Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Семестр_1_С++.doc
Скачиваний:
2
Добавлен:
23.04.2019
Размер:
290.82 Кб
Скачать

5. Массивы

5.1.Понятие массива. Одномерные массивы

Массив - структура данных, состоящая из компонент одного типа и имеющая одно имя (имя массива). Компоненты массива называются его элементами. Для обозначения отдельного элемента массива, к имени массива добавляется индекс. Индекс - это порядковый номер элемента в массиве (индекс первого элемента всегда равен 0, далее 1, 2, и т. д.). Количество элементов массива называется размером массива. Отметим, что в памяти ПЭВМ каждому элементу массива отводится отдельный участок памяти в соответствии с типом элементов массива, при этом, все элементы массива расположены подряд.

Одномерным массивом называется массив, положение элемента в котором определяется одним индексом.

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

ТипМассива ИмяМассива [ КонстантноеВыражение ];

ТипМассива - любой допустимый в языке Си++ тип данных;

ИмяМассива - идентификатор, задаваемый по тем же правилам, что и имена обычных переменных;

КонстантноеВыражение, если оно присутствует, определяет размер массива (как правило, это целочисленная, именованная или неименованная, константа).

Примером одномерного массива может быть список средних температур за месяц, например, за январь. Такой массив можно объявить так: double Temperature [30];

Temperature [0]-температура за 1 января. Temperature [30] - температура за 31 января и т.д.

Примеры объявления массивов:

int A[10]; // Для задания размеров массивов используются

float Array[3]; // неименованные константы

const int DIM = 10;

char C[DIM]; // Для задания размера массива C используется

//именованная константа DIM

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

Массивы одного типа можно объявлять списком через запятую:

int A[10], B[5];

включая в этот список одновременно и переменные того же типа:

int A[10], MaxY, MaxZ, B[5];

В приведенном выше примере объявлены две переменные MaxY и MaxZ и два массива A и B типа int.

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

либо с указанием размерности массива в квадратных скобках

int A[5] = {1,-5,10,243,-58};

либо без конкретного указания размерности

char C[] = {'A', 'B', 'C', 'D'} .

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

Таким образом, примером обнуления элементов одномерного массива является инициализация вида:

int A[20] = {0};

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

В Си++ работать с массивами можно только поэлементно. Если A является массивом размерности N, то отдельный элемент обозначается с помощью имени массива, за которым следует индекс требуемого элемента, например, A[i]. Значение индекса может изменяться от 0 до N-1. Элементы массива называют индексированными переменными. Индексированные переменные можно использовать как обычные переменные, например, производить следующие действия:

1. присваивать элементу массива значение:

A[1] = 5;

2. использовать элементы массивов в выражениях:

i = 4;

y = 2 * A[i] * sin( B[5] );

3. вводить и выводить элементы массивов:

cin >> A[5];

cout << A[k];

Тот факт, что индексы массива относятся к определенному (скалярному) типу, имеет важное значение - индексы массива можно вычислять. Таким образом, в качестве номера элемента массива могут использоваться:

1. константа: A[3];

2. переменная: A[i];

3. математическое выражение: A[3*abs ( i+2 )].

Следует отметить, что в языке Си++ индексы элементов массива всегда начинаются с нуля и заканчиваются индексом, равным размеру массива минус один. Так объявление целочисленного массива A размера 10:

int A[10];

предполагает наличие десяти индексированных переменных:

A[0], A[1],..., A[9].

Ввод и вывод одномерных массивов

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

Например:

const int N=10;

float A[N];

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

{

cout << "Введите A[" << i<<"] = " ;

cin >> A[i];

}

В приведенном выше примере поэлементно вводится массив A типа float размерности N. Параметр цикла for переменная i изменяется от 0 до N-1. На каждом шаге с помощью оператора cout выводится поясняющее сообщение "Введите A[индекс] =", где в квадратных скобках указывается индекс вводимого элемента массива. В ответ на это сообщение с помощью оператора cin пользователь вводит значение элемента массива.

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

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

cout << A[i] << ' ';

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

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

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

A[i] = 0;

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

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

A[i] = random(10)/10.;

В приведенном примере элементы массива заполняются случайным образом вещественными значениями в диапазоне от 0 до 0.9.

Пример 5.1. Ввести одномерный массив. Найти сумму элементов массива до первого нуля и номер этого первого нулевого элемента. Если в массиве нет нулевых элементов, найти сумму всех элементов массива.

#include <iostream.h>

#include <conio.h>

int main()

{

const int N = 10;

int A[N];

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

cin >>A[ i ];

int flag = -1 , sum =0;

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

{

if (!A[i]) {

flag = i;

break;

}

sum+=A[i];

}

if ( flag ==-1) cout<<"Summa all elements = "<<sum;

else

{

cout<<"Number of the first 0 = "<<flag;

if( flag !=0) cout<< ", Summa before the first 0 = "<<sum;

}

cout<<endl;

getch(); //Встроенная функция getch

return 0;

}

Пример 5.2. Ввести одномерный массив A. Разбить массив на два массива: B- массив четных; C-массив нечетных чисел.

#include <iostream.h>

#include <conio.h>

int main()

{

const int N = 10;

int A[N] , B[N] ,C[N] ;

cout<<"Введи массив из n чисел"<<endl;

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

cin >>A[ i ];

int indB = 0, indC = 0;

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

if (A[i] % 2) {

C[indC] = A[ i ];

indC++;

}

else {

B [indB] = A[ i ];

indB++;

}

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

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

cout << A[i] << ' ';

cout<<endl;

cout<<"Массив четных чисел В\n";

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

cout << B[i] << ' ';

cout<<endl;

cout<<"Массив нечетных чисел С\n";

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

cout << C[i] << ' ';

cout<<endl;

getch(); //Встроенная функция getch

return 0;

}

Пример 5.3. Одномерный целочисленный массив проинициализировать случайным образом. Найти и вывести на экран значения минимального и максимального элементов массива. Размер массива ввести с клавиатуры.

#include <iostream.h>

#include <stdlib.h>

int main()

{

const int DIM = 100;

double A[DIM];

int n;

while (true) //Определение конкретного размера массива

{

cout << "Введите размер массива (n):";

cin >> n;

if (n > 0 && n <= DIM) break;

cout << "Некорректные данные, попробуйте еще раз!\n";

system("pause");

}

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

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

{

A[i] = random(DIM)- random(DIM);

cout << A[i] << ' ';

}

int Max = A[0], Min = A[0];

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

{

if (A[i] < Min) Min = A[i];

if (A[i] > Max) Max = A[i];

}

cout << "\n Максимальный элемент массива A =" << Max;

cout << "\n Минимальный элемент массива A="<<Min<<endl;

system("pause");

return 0;

}

Пример 5.4. Одномерный целочисленный массив проинициализировать случайным образом. Найти и вывести на экран номер минимального и номер максимального элементов массива.

#include <iostream.h>

#include <stdlib.h>

int main()

{

const int DIM = 10;

double A[DIM];

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

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

{

A[i] = random(DIM)- random(DIM);

cout << A[i] << ' ';

}

int iMax =0, iMin =0;

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

{

if (A[i] < A[iMin]) iMin = i;

if (A[i] > A[iMax]) iMax = i;

}

cout << "\n Номер максимального элемента массива A =" << iMax;

cout << "\n Максимальный элемент массива A =" <<A[ iMax];

cout << "\n Номер минимального элемента массива A="<<iMin<<endl;

cout << "\n Минимальный элемент массива A="<<A[iMin]<<endl;

system("pause");

return 0;

}

Пример 5.5. Дан одномерный целочисленный массив. Отсортировать массив по не убыванию методом "пузырька".

#include <iostream.h>

#include <stdlib.h>

int main()

{

const int M = 10;

int A[M], x, n;

cout << "\nВведите элементы массива:"<<endl;

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

{

cout << "A[" << i << "] = ";

cin >> A[i];

}

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

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

cout << A[i] << ' ';

for(int i = 1; i < M; i++) //Сортировка массива

for(int j =0; j<M-i; j++)

if (A[j] > A[j+1] )

{

x = A[j];

A[j] = A[j+1];

A[j+1] = x;

}

cout << "\nОтсортированный массив\n";

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

cout << A[i] << ' ';

cout << endl;

system("pause");

return 0;

}