Массивы в качестве параметров функций

Общие сведения о массивах

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

Массив представляет собой набор однотипных данных, имеющих общее имя (имя массива) и различающихся местоположением в массиве.

В С++ массив не является стандартным типом данных. Напротив, он сам имеет тип: int, char, float, double и т.д. Допускается создавать массивы массивов, указателей, структур и других данных.

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

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

int a[10]; // одномерный массив из 10 элементов

int b[3][4]; // двумерный массив из 3 строк и 4 столбцов

const int n = 10;

int a[n]; // размер массива задан константой

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

Чтобы определить размерность массива достаточно посмотреть на его объявление. Если в нём указан один индекс, то это одномерный массив, если два, то двумерный (или матрица), и т.д. Массивы более чем с одним индексом, называются многомерными.

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

Одномерный массив представляет собой совокупность однотипных элементов, доступ к которым определяется одним индексом. Все элементы массива сохраняются в памяти последовательно, первый элемент имеет нулевой индекс (далее 1, 2, и т.д.). Индекс – это порядковый номер элемента в массиве.

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

тип_элементов имя_массива[размер_массива];

где тип_элементов – допустимый в С++ тип элементов массива;

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

размер_массиваэто количество элементов массива.

Примеры объявления одномерных массивов различных типов:

int a[10];//массив из 10 элементов типа int

float array[3];//массив из 3 элементов типа float

char mas[40]; // массив из 40 элементов типа char

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

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

intmaxY, maxZ, ar[10], mas[5];

При объявлении массивов необходимо помнить, что индекс первого элемента всегда равен нулю. Допустимыми считаются значения индексов, находящиеся в диапазоне от 0 до размер_массива -1. Например, объявление

int mas[10];

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

mas[0] mas[1] ... mas[9]

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

Инициализация одномерных массивов

Инициализация массива означает присвоение начальных значений его элементам при объявлении.

Инициализация элементов массива осуществляется указанием его начальных значений в фигурных скобках:

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

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

int mas[10] = {1, 2, 3, 4, 5};

создаёт массив из 10 элементов целого типа, первые 5 из которых проинициализированы указанными значениями, а остальные – нулевыми. Этим можно воспользоваться для инициализации элементов массива нулевыми значениями:

int mas[20] = {0};

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

Во время инициализации можно не задавать количество элементов массива:

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

Размер массива при таком объявлении определяется количеством значений в списке инициализации. Количество элементов массива в этом случае можно определить как

constint n = (sizeof(mas) / sizeof(mas[0])); где

sizeof(mas) – количество байтов, занимаемое массивом mas, а

sizeof(mas[0]) – количество байтов, занимаемое одним элементом.

При необходимости можно задать массив констант следующим образом:

constint array[] = {5, 4, 3, 2, 1};

Тогда ни один из элементов массива array изменить будет нельзя.

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

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

· константа – mas[3];

· переменная – mas[i];

· выражение – mas[3 * ( i+2 )];

Элементы массива называют индексированными переменными. Индексированные переменные можно использовать как обычные переменные, например, с ними можно производить следующие действия:

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

mas[1] = 5;

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

i = 4; y = 2 * mas[i] * sin(mas[5]);

· вводить и выводить элементы массивов

cin>>mas[5]; cout<<mas[k];

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

Например, ввод массива можно выполнить следующим образом:

const int n = 10; // именованная константа

float mas[n]; // объявлен массив из 10 элементов

for(int i = 0; i < n; i++){ // цикл для ввода массива

cin>>mas[i];

}

В приведенном выше примере поэлементно вводится массив mas типа floatразмера n. Параметр оператора цикла forпеременная i изменяется от 0 до n-1.

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

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

cout<<mas[i]<< ' ';

// Пример 6.1. Ввести одномерный массив. Найти сумму элементов.

#include <iostream>

using namespace std;

const int DIM = 50;

int main(){

int a[DIM], n;

cout<<"Vvedi razmer massiva: "; cin>>n;

cout<<"Vvedi massiv "<<endl;

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

cin>>a[i];

int sum = 0;

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

sum = sum + a[i];

cout<<"Summa all elements = "<<sum<<endl;

system("pause");

}

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

for(int i = 0; i < n; i++) mas[i] = i;

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

// Пример 6.2. Заполнение массива случайным образом и вывод

// его на экран. Использование функций rand(), srand(n).

#include <iostream>

#include <stdlib.h>

const int DIM = 50;

using namespace std;

int main(){

int a[DIM], n;

while(true){

system("cls");

cout<<"Vvedi n:"; cin >> n;

if(n > 1 && n < DIM) break;

cout<<"Nocorrect n\n";

}

srand(n); // для получения разных послед. чисел

cout<<"\n\t 1___Massiv a(n)\n";

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

a[i] = rand() % 6 + 1; // числа от 1 до 6

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

cout<<a[i] << ' ';

cout<<"\n\t 2___ Massiv a(n)\n";

for(int i = 1; i <= 25; i++){ // вывод по 5 элементов в строку

cout.width(3);

cout<<rand() % 6 + 1;

if(i % 5 == 0)cout<<endl;

}

cout<<"\n\t 3___Massiv a(n)\n";

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

a[i] = rand(); // числа от 0 до RAND_MAX

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

cout<<a[i]<< ' ';

cout<<endl;

system("pause");

}

// Пример 6.3. Ввести одномерный массив. Разбить массив на два

// массива: – массив чётных и массив нечетных чисел.

#include<iostream>

using namespace std;

const int DIM = 50;

int main(){

int a[DIM], b[DIM], c[DIM];

int n;

cout<<"Vvedite razmer massiva: "; cin>>n;

cout<<"Vvedi massiv"<<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<<"Isxodni massiv mas\n";

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

cout<<a[i]<<' ';

cout<<"\nMassiv chetnix chisel b\n";

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

cout<<b[i]<<' ';

cout<<"\nMassiv nechetnix chisel c\n";

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

cout<<c[i]<< ' ';

cout<<endl;

system("pause");

}

// Пример 6.4. Одномерный целочисленный массив проинициализировать

// случайным образом. Найти и вывести на экран значения

// минимального и максимального элементов массива и их индексы.

// Обменять местами минимальный и максимальный элементы.

#include <iostream>

#include <stdlib.h>

using namespace std;

const int DIM = 50;

int main(){

double a[DIM]; int n;

while(true){

cout<<" Vvedi razmer massiva: (n): "; cin >> n;

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

cout<<"No Correct n!\n";

}

srand(n);

cout<<"\n\tIsxodni massiv\n";

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

a[i] = rand() % 15 - rand() % 10;

 

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

cout<<a[i]<<' ';

int max = a[0], min = a[0];

int imax = 0, imin = 0;

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

if(a[i] < min){min = a[i]; imin = i;}

if(a[i] > max){max = a[i]; imax = i;}

}

cout<<"\n max = "<<max; cout<<"\t imax = "<<imax;

cout<<"\n min = "<<min; cout<<"\t imin ="<<imin;

a[imin] = max; a[imax] = min;

cout<<"\n\tRezult massiv\n";

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

cout<<a[i] << ' ';

cout<<endl;

system("pause");

}

// Пример 6.5. Дан одномерный целочисленный массив.

// Отсортировать массив по не убыванию методом "пузырька".

#include <iostream>

using namespace std;

const int DIM = 50;

int main(){

double a[DIM];

int n, x;

cout<<" Vvdite razmer massiva n: "; cin>>n;

cout<<"\nVvedite massiv:"<<endl;

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

cout<<"a["<<i <<"] = "; cin>>a[i];

}

cout<<"\nIsxodni massiv\n";

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

cout<<a[i]<< ' ';

cout<<endl;

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

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

if(a[j] > a[j+1]){x = a[j]; a[j] = a[j+1]; a[j+1] = x;}

cout<<"\nOtsortirovanni massiv\n";

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

cout<<a[i] << ' ';

cout<<endl;

system("pause");

}

Двумерные массивы

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

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

тип_элементов имя_массива[размер1][размер2]; где

тип_элементов – допустимый в С++ тип данных;

имя_массива – идентификатор, задаваемый правилами языка;

размер1количество строк; размер2 – количество столбцов.

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

floatb[4][3];

определяет двумерный массив (матрицу), первый индекс которого изменяется от 0 до 3, второй – от 0 до 2. Элементы этого массива можно перечислить следующим образом:

b[0][0], b[0][1], b[0][2], b[1][0],...,b[1][2],…,b[3][0], …,b[3][2]

Отметим ещё раз, что нумерация элементов по каждому из индексов начинается с нуля.

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

Инициализация двумерных массивов

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

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

int a[2][3] = {{1, 2, 3}, {4, 5, 6}};

Эта запись эквивалентна следующей записи:

a[0][0] = 1; a[0][1] = 2; a[0][2] = 3; a[1][0] = 4; a[1][1] = 5; a[1][2] = 6;

Тот же результат можно получить с одним списком инициализации:

int a[2][3] = {1, 2, 3, 4, 5, 6};

С помощью инициализации можно присваивать значения не всем элементам многомерного массива. Например, чтобы инициализировать только элементы первого столбца матрицы, её можно объявить так:

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

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

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

y = a[1][4] * 3;

a[3][1] = 15 * x;

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

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

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

cin>>a[i][j];

Параметр i в ходе выполнения цикла изменяется от 0 до n-1, таким образом, перебираются все строки. Для каждого значения параметра i выполняется вложенный цикл, в котором параметр j изменяется от 0 до m-1, таким образом, в каждой строке перебираются все её элементы.

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

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

for(int j = 0; j < m; j++){

cout.width(4); // задаём ширину поля для элемента

cout<<a[i][j];

}

cout << endl;

}

Аналогичным образом можно присвоить всем элементам массива некоторое случайное значение:

const int N = 3, M = 5;

int a[N][M];

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

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

a[i][j] = rand() % 10 – 5;

// Пример 6.6. Дана матрица a[n][m]. Вычислить сумму элементов

// нижнего треугольника матрицы и произведение элементов

// главной диагонали матрицы.

#include <iostream>

using namespace std;

const int DIM = 20;

int main(){

int a[DIM][DIM], n;

cout<<" Vvdite razmer massiva n: "; cin >> n;

srand(n);

cout<<"\n\tMatrix==\n";

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

for(int j = 0; j < n; j++){

a[i][j] = rand() % 9 - 3;

cout.width(4); cout<<a[i][j];

}

cout << endl;

}

int sum = 0;

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

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

sum = sum + a[i][j]; // сумма элементов нижнего

cout<<"sum = "<<sum<<endl; // треугольника матрицы

long mult = 1;

for(int i = 0; i < n; i++) // произведение элементов

mult = mult * a[i][i]; // главной диагонали матрицы

cout<<"mult = "<<mult<<endl;

system("pause");

}

// Пример 6.7. Дана матрица a[n][m]. Вычислить суммы

// элементов строк матрицы, записав их в массив sum[n].

#include <iostream>

using namespace std;

const int D1 = 10, D2 = 10;

int main(){

int a[D1][D2], sum[D1], n, m;

cout<<" Vvdite razmer massiva: (n, m): "; cin>>n>>m;

srand(n+m);

cout << "\n\tIsxodnaya matrix\n";

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

for(int j = 0; j < m; j++){

a[i][j] = rand() % 20 - 5;

cout.width(6); cout<<a[i][j];

}

cout<<endl;

}

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

sum[i] = 0;

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

sum[i] = sum[i] + a[i][j];

}

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

cout<<"\nsum "<<i<<" stroki matrix = "<<sum[i]<<endl;

system("pause");

}

// Пример 6.8. Дана матрицаa[n][m]. Найти максимальный и

// минимальный элементы матрицы и их индексы.

#include <iostream>

using namespace std;

const int D1 = 10, D2 = 10;

int main(){

float a[D1][D2];

int n, m;

cout<<" Vvеdite razmer massiva (n, m): "; cin>>n>>m;

srand(n + m);

cout << "\nSourse matrix\n";

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

for(int j = 0; j < m; j++) {

a[i][j] = rand() % 15 - 5;

cout.width(4); cout<<a[i][j];

}

cout<<endl;

}

int max = a[0][0], imax = 0, jmax = 0;

int min = a[0][0], imin = 0, jmin = 0;

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

for(int j = 0; j < m; j++){

if(a[i][j] >= max){ max = a[i][j]; imax = i; jmax = j; }

if(a[i][j] <= min){ min = a[i][j]; imin = i; jmin =j; }

}

cout<<"Maximum element of matrix: ";

cout<<"a[" << imax << "," << jmax << "] = "<<a[imax][ jmax]<<endl;

cout<<"Minimum element of matrix: ";

cout<<"a[" << imin << "," << jmin << "] = "<<a[imin][jmin]<<endl;

system("pause");

}

// Пример 6.9. Дана матрицаa[n][m]. Поменять местами элементы

// 0-й и (n-1)-й, 1-ой и (n-2)-й и т.д. строк матрицы.

#include <iostream>

using namespace std;

const int D1 = 10, D2 = 10;

int main(){

int a[D1][D2];

int n, m, temp;

cout<<"\ Vvdite razmer massiva (n, m): "; cin>>n>>m; srand(n + m);

cout << "\nSourse matrix\n";

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

for(int j = 0; j < m; j++){

a[i][j] = rand() % 15 - 5;

cout.width(4); cout<<a[i][j];

}

cout<<endl;

}

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

for(int j= 0; j < m; j++){

temp = a[i][j];

a[i][j] = a[n-1-i][j];

a[n-1-i][j] = temp;

}

cout<<"\n\tRezult matrix\n";

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

for(int j = 0; j < m; j++){

cout.width(4);

cout<<a[i][j];

}

cout<<endl;

}

}

Массивы в качестве параметров функций

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

Пример 1. Параметр функции – массив заданного типа и размера.

int data[5], i;

for(i = 0; i < 5; i++)

data[i] = i;

vivod(data); // передаём функции массив data

void vivod(int mas[5]){ // функция выводит массив на экран

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

cout<<mas[i]<<' ';

cout<<endl;

}

В приведённом примере заранее известно число элементов – 5, поэтому в вызове функции всего один аргумент – имя массива data.

Пример 2. Параметр функции – одномерный массив с произвольным

числом элементов.

vivod(data, n); // передаём массив dataи размер nв функцию

...

void vivod( int mas[], int size){

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

cout<<mas[i]<<' ';

cout<<endl;

}

В функции vivod() размер входного массива не указывается напрямую. Пустые квадратные скобки обозначают, что параметр mas[] представлен в виде безразмерного массива. Размер массива передаётся через целочисленный параметр size. Данная функция является универсальной, поскольку может быть использована для вывода на экран целочисленного массива любого размера.

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

Кроме одномерных массивов функциям можно передавать многомерные массивы, в частности – двумерные. При передаче двумерных массивов в качестве параметров функции следует задавать минимум информации, необходимой компилятору для получения передаваемых адресов памяти. Например, если в функцию надо передать матрицу matr[n][m], где n – количество строк, а m – количество столбцов, то функцию можно объявить как

void fun(int matr[5][4]); // где n = 5; m = 4;

или

void fun(int matr[][4]);

причём второй вариант более предпочтителен. Но объявление вида

void fun(int matr[5][]);

скомпилировано не будет, как и объявление

void fun(int matr[][]);

<== предыдущая лекция | следующая лекция ==>
Что такое клеточная селекция | Некоторые особенности использования указателей

Дата добавления: 2022-05-27; просмотров: 98;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.08 сек.