Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы / C++ / C++ / 04_массивы_a5.doc
Скачиваний:
40
Добавлен:
17.04.2013
Размер:
126.98 Кб
Скачать

Лабораторная работа № 4 Составление программ с использованием массивов

Цель работы: 1) изучить описание, ввод и вывод статических массивов на языке С++; 2) освоить обработку массивов с использованием вложенных циклов.

Теоретические сведения

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

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

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

Синтаксис для объявления одномерного массива:

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

Пример 4.1. Объявление одномерных массивов

int MyArr [10];

char Literal [31];

double x_arr [100];

При объявлении одномерных массивов в языке С++ необходимо соблюдение правил:

1) в объявлении массива указывается количество элементов;

2) индекс первого элемента массива равен 0. Это значение нельзя изменить или переопределить;

3) индекс последнего элемента определяется как количество элементов минус 1.

Доступ к элементам массива осуществляется через имя массива и индекс элемента, указываемый в квадратных скобках: a[1], b[25].

При работе с массивами рекомендуется проверять допустимость значения индекса массива. Допустимыми являются значения индексов в диапазоне от 0 до число_элементов – 1.

Ввод массива осуществляется с использованием цикла:

Пример 4.2. Ввод массива с клавиатуры.

. . .

int main ( )

{ const int M=30;

double x[M];

. . .

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

{ cout << "\n x[" << i << "]=";

cin >> x[i];

}

return 0;

}

Mожно организовать ввод массива, пользуясь генератором случайных чисел.

Пример 4.3. Ввод массива с помощью генератора случайных чисел.

randomize ( ); // инициализировать генератор случайных чисел

int x[M];

. . .

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

x[i]=random (100);

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

Пример 4.4. Инициализация одномерного массива

. . .

int main ( )

{ const int M=10;

double x[M]= {12.2, 45.4, 67.2, 12.2, 34.6, 87.4, 83.6, 12.3, 14.8, 55.5};

. . .

}

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

Точное число начальных значений можно не указывать, так как язык С++ позволяет задавать размер массива автоматически, используя количество элементов в соответствующем списке начальных значений. Следовательно, число в квадратных скобках при описании массива может отсутствовать. В этом случае размер массива определит компилятор, например, double x[ ]= {1,2,3};

Многомерные массивы

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

Общий синтаксис для объявления двумерных и трехмерных массивов:

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

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

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

Пример 4.5. Объявление многомерных массивов

double matrix A [100][10];

char table [41][22][3];

int index [7][12];

Большинство компиляторов хранит элементы многомерного массива друг за другом, т.е. как длинный одномерный массив. Исполняемый модуль вычисляет, где расположен искомый элемент в этом массиве.

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

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

Пример 4.6. Инициализация матрицы

. . .

int main ( )

{ const int MAX_COL=4;

const int MAX_ROW=3;

double x[MAX_ROW][MAX_COL]= {{ 1, 2, 3, 4}, // строка # 1

{ 5, 6, 7, 8}, // строка # 2

{ 9,10,11,12}}; // строка # 3

. . .

return 0;

}

Пример 4.7. Ввод многомерных массивов с клавиатуры.

. . .

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

{ for (j=0; j<MAX_COL; j++)

{ cout << "x[" << i <<"][" << j<<"]=";

cin >> x[i][ j]; }

}

. . .

Пример 4.8. Ввод многомерных массивов с помощью генератора случайных чисел.

. . .

randomize ( ); //<stdlib.h>

. . .

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

{ for (j=0; j<MAX_COL; j++) x[i][ j]=random (10);

}

. . .

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

Пример 4.9. Вывод матриц

. . .

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

{ for (j=0; j<MAX_COL; j++)

{ cout << setw(5) << x[i][ j];

}

cout << endl;

}

При обработке матриц чаще всего встречаются следующие типы задач:

  1. работа с матрицей в целом;

  2. работа со строкой (столбцом) матрицы;

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

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

Пример 4.10. Определить среднее арифметическое значение элементов матрицы x[6][7] целого типа.

#include <iostream.h>

#include <stdlib.h>

#include <conio.h>

#include <iomanip.h>

int main()

{ const int MAX_COL=6;

const int MAX_ROW=7;

int x[MAX_ROW][MAX_COL];

int i,j,sum=0;

float sred;

randomize(); // Инициализация генератора случайных

// чисел

clrscr();

for(i=0; i<MAX_ROW; i++) // Заполнение массива случайными

for(j=0; j<MAX_COL; j++) // числами

x[i][j]=random(10);

for(i=0; i<MAX_ROW; i++) // Вывод матрицы на экран

{ cout << endl;

for(j=0; j<MAX_COL; j++)

{ cout << setw(5) << x[i][j]; // и вычисление суммы

sum+=x[i][j]; // ее элементов

}

}

sred= float (sum)/(MAX_ROW*MAX_COL);

cout << "\nСумма = " << sum << "\nСреднее арифметическое = " << sred;

return 0;

}

Для поиска элемента строки (столбца) объектом сравнения является первый элемент строки с индексами i,0 или столбца с индексами 0,j и обработка идет до конца строки (столбца). Обычно результатом такой обработки массива является вектор-столбец или вектор-строка.

Пример 4.11. Определить минимальный элемент каждой строки действительной матрицы matr [8][4].

#include <iostream.h>

#include <stdlib.h>

#include <conio.h>

#include <iomanip.h>

int main()

{ const int COL=4;

const int ROW=8;

float matr[ROW][COL]; //объявление матрицы вещественного типа

int i,j;

float min[ROW];

randomize();

clrscr();

for (i=0; i<ROW; i++) // заполнение и вывод матрицы

{ for (j=0; j<COL; j++) // на экран

{ matr[i][j]=random(100);

cout << setw(6) << matr[i][j];

}

cout << endl;

}

for (i=0; i<ROW; i++) // формирование вектора-столбца

{ min[i]=matr[i][0]; // из минимальных элементов строк

for (j=0; j< COL; j++)

if (matr[i][j]<min[i]) min[i]=matr[i][j];

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

}

cout <<endl ;

for (i=0; i< ROW; i++) cout << setw(6) << min[i];

}

При работе с диагональными элементами учитывают, что индексы элементов, стоящих на главной диагонали, удовлетворяют условию i = j.

Элементы, стоящие на побочной диагонали, имеют индексы, удовлетворяющие условию

i=n - j - 1,

если n - порядок матрицы (предполагается, что матрица - квадратная).

Пример 4.12. Найти количество четных элементов целочисленной квадратной матрицы порядка 9, стоящих ниже побочной диагонали.

#include <iostream.h>

#include <stdlib.h>

#include <conio.h>

#include <math.h>

#include <iomanip.h>

void main()

{ const int RANG=9;

int matr[RANG][RANG];

int i,j,kol=0;

randomize();

clrscr();

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

{ for (j=0;j<RANG;j++)

{ matr[i][j]=random(10);

cout << setw(4) << matr[i][j];

}

cout <<endl;

}

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

{ for (j=0; j<RANG; j++) if ((i>RANG-j-1) && (matr[i][j]%2==0)) kol++; }

cout << "Количество четных элементов под главной диагональю равно " << kol;

}

Соседние файлы в папке C++