Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




Математическая модель

Значением атмосферного давления являются элементы массива D[24], значением времени – индексы элементов. Решение задачи сводится к поиску максимального элемента в массиве и определению его индекса.

Аргументы: D[24] – массив целого типа.

Результаты: imax целого типа – индекс максимального элемента;

D[imax] целого типа – значение максимального элемента.

Промежуточная величина: max целого типа – максимальное значение элемента массива.


 

2. Алгоритм 3. Программа
  #include <iostream> #include <conio.h> #include <math.h>   using namespace std;   void Input(int mass[24]); void Print(int mass[24]);   int main() { int D[24]; cout<<" Введите массив "<<endl; Input(D); cout<<" Массив значений давления:"<<endl; Print(D);   int max = D[0], imax = 1; for(int i=0; i<24; i++) { if (D[i]>max) { imax = i+1; max = D[i]; } }   cout<<" Максимальное значение давления: "<<D[imax-1]<<" в "<<imax<<" ч. "; _getch(); return 0; }   void Input(int mass[24]) { for(int i=0; i<24; i++) { cin>>mass[i]; } }   void Print(int mass[24]) { for(int i=0; i<24; i++) { cout<<mass[i]<<" "; } cout<<endl; }

4. Результат работы программы:

Массив значений давления:

748 743 756 748 741 760 748 743 757 748 756 756 751 760 754 756

752 758 758 757 750 747 759 750

Максимальное значение давления 760 в 6 ч.


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

Объявление переменной как одномерного массива (массива с размерностью 1) имеет вид:

тип_данных идентификатор [константное_выражение];

Например, оператор

int A[10];// объявляет массив с именем A, содержащий 10 целых чисел

Доступ к элементам этого массива осуществляется выражением A[i], где i - индекс, являющийся в данном примере целым числом в диапазоне 0 - 9. Например, A[0] - значение первого элемента, A[1] - второго, A[9] - последнего.

Напомним, что объявление переменной массива можно совмещать с заданием элементам массива начальных значений. Например, оператор:

int A[10] = {0};//присваивает нулевые значения всем элементам массива

int A[10] = {1,2,3,4,5,6,7,8,9,10};//A[0] = 1, A[2] = 2, …, A[9] = 10

Если начальных значений меньше, чем элементов в массиве, оставшиеся элементы автоматически получают нулевые начальные значения.

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

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

int A2[10][3];

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

Таким образом, двумерный массив – это массив, размерность которого равна 2. Визуально, двумерный массив – это обычная таблица, со строками и столбцами или матрица . Фактически двумерный массив – это одномерный массив одномерных массивов. Структура двумерного массива, с именем A, размером m на n показана ниже (см. рис. 8.1).

A[0][0] A[0][1] A[0][n-1]
A[1][0] A[1][1] A[1][n-1]
A[2][0] A[2][1] A[2][n-1]
A[m-1][0] A[m-1][1] A[m-1][n-1]

Рисунок 8.1 – Двумерный массив в виде таблицы (слева) или матрицы (справа)

На рисунке 8.1 m – количество строк двумерного массива;
n – количество столбцов двумерного массива;
m * n– количество элементов массива.

Общий вид описания двумерного массива:

тип_данных имя_массива [количество_строк][количество_столбцов];

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

· тип данных;

· имя массива.

Доступ к значениям элементов многомерного массива обеспечивается через индексы, каждый из которых заключается в квадратные скобки. Например, A2[3][2] - значение элемента, лежащего на пересечении четвертой строки и третьего столбца (помните, что индексы начинаются с 0).

Если многомерный массив инициализируется при его объявлении, список значений по каждой размерности заключается в фигурные скобки. Приведенный ниже оператор объявляет трехмерный массив A3 размерностью 4 на 3 на 2.

int A3[4][3][2] = {{{0,1},{2,3},{4,5}},

{{6,7},{8,9},{10,11}},

{{12,13},{14,15},{16,17}},

{{18,19},{20,21},{22,23}}};

Этот оператор создает массив A3, четыре строки которого являются матрицами вида

0 1 6 7 12 13 18 19

2 3 8 9 14 15 20 21

4 5 10 11 16 17 22 23

Например, элемент A3[0][1][0] равен 2, элемент A3[3][0][1] равен 19 и т.д.

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

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

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

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

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

а[1][4] a[i][j]

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

1. Инициализация двумерных массивов аналогична инициализации одномерных массивов:

а) инициализация:

const int n = 3; // число строк

const int m = 4; // число столбцов

// выделяем память под матрицу с одновременной

// инициализацией элементов

double a[n][m] =

{

{3, -3.1, 4.6, 5.5},

{2, 1.2, -10, -2.5},

{7.6, 3.1, 1.6, 0.5}

};

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

б) ввод данных с клавиатуры:

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

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

cin >> a[i][j];

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

в) формирование массива с помощью генератора псевдослучайных чисел;

г) непосредственное присваивание (вычисление по формуле):

2. Вывод матрицы надо реализовать в удобном для чтения виде, т.е. чтобы на одной строке экрана располагалась одна строка матрицы. С этой целью в тело внешнего цикла, помимо внутреннего, включается еще оператор cout << endl;, который переводит курсор к началу следующей строки экрана после вывода текущей строки матрицы.

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

{

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

cout << a[i][j] << "\t ";

cout << endl;

}

Пример. Дана прямоугольная матрица действительных чисел размером n × m. Пронормировать эту матрицу, т.е. поделить значение всех элементов матрицы на максимальный по модулю элемент.

Возможный текст программы:

#include <iostream>

using namespace std;

#include <cmath>

int main()

{

const int n = 3; // число строк

const int m = 4; // число столбцов

double a[n][m]; // выделяем память под матрицу

int i, j;

double max;

 

// Ввод матрицы с клавиатуры

cout << "Matriza A("<< n << "*" << m << "):" << endl;

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

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

cin >> a[i][j];

 

// Поиск в матрице максимального по модулю значения

max = fabs(a[0][0]);

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

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

if(fabs(a[i][j]) > max)

max = fabs(a[i][j]);

cout << "max=" << max << endl;

 

// Нормируем матрицу

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

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

a[i][j] /= max;

 

// Вывод матрицы в виде таблицы на экран монитора

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

{

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

cout << a[i][j] << "\t ";

cout << endl;

}

return 0;

}

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


Лабораторная работа №8
Двумерные массивы

ЦЕЛЬ РАБОТЫ: приобретение навыков объявления, организации ввода-вывода и обработки двумерного массива.

Выполнение работы: в соответствии с вариантом составить и реализовать программу.

Задание

1. Составить программу формирования матрицы, число строк и столбцов которой определяется как случайное натуральное число в промежутке [3, 8], а элементы - случайные целые числа от -50 до 50. Заменить неотрицательные числа полученной матрицы единицей, а отрицательные - нулем.

2. В целочисленной прямоугольной матрице числа, кратные заданному числу m, вводимому с клавиатуры, заменить частным от деления на m, а остальные числа заменить их остатками от деления на m.

3. В квадратной матрице порядка n найти сумму всех тех элементов, сумма индексов которых равна n.

4. Определить, является ли заданная квадратная матрица симметричной относительно главной диагонали. Найти след данной матрицы. Элементы матрицы вводить с клавиатуры.

5. Найти число элементов в каждой из нечетных строк матрицы, равных заданному числу, вводимому с клавиатуры.

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

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

8. Даны вещественные числа a 1, a 2, …, an и вещественная квадратная матрица порядка n (n > 5). Сформировать вещественную матрицу размером n x (n + 1), вставив в исходную матрицу между пятым и шестым столбцами новый столбец с элементами a 1, a 2, …, an.

9. Дана вещественная квадратная матрица порядка n. Преобразовать эту матрицу по правилу: строку с номером k сделать столбцом с номером k, а столбец с номером k сделать строкой с тем же номером.

10. В данной вещественной матрице размером n x m (n > 2, m > 2) поменять местами строки с номерами n - 2 и n - 1.

11. Положительные элементы первой строки прямоугольной матрицы умножить на первый элемент этой же строки, а отрицательные - на последний ее элемент; то же самое проделать с остальными строками.

12. Заменить все элементы строки с номером s и столбца с номером k прямоугольной матрицы на противоположные по знаку (элемент, стоящий на пересечении выбранной строки и выбранного столбца, не изменять).

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

14. Дан целочисленный одномерный массив: a 1, a 2, …, an. Сформировать квадратную матрицу порядка n, у которой элементы, расположенные на главной диагонали, равны соответственно a 1, a 2, …, an; элементы, расположенные выше главной диагонали, равны единице, а элементы, расположенные ниже главной диагонали, равны минус единице.

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

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

17. Из прямоугольной матрицы размером m x n удалить строку с номером s и столбец с номером k (0 < s < m +l, 0 < k < n + l).

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

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

20. Вывести на экран максимальные элементы каждой строки двумерного массива с указанием их индексов.

21. Задать два двумерных массива, содержащих положительные и отрицательные элементы. Определить, в каком из них больше положительных элементов.

22. Задан массив целых случайных чисел, принадлежащих промежутку [0, 200]. Определить, каких элементов в нём больше: превышающих k 1 или не превышающих k 2.

23. Задан массив целых случайных чисел, принадлежащих промежутку
[-50, 50]. Найти сумму тех элементов массива, которые больше a, но меньше b, а также вычислить количество этих элементов.

24. Поменять местами максимальный и минимальный элемент заданного двумерного массива. Результат вывести на экран в виде матрицы.

25. Дана целочисленная матрица. Сформировать матрицу, получающуюся из данной перестановкой первого столбца с последним, второго - с предпоследним.

26. Из данной матрицы получить другую следующим образом: на место первой строки поместить вторую, на место второй - третью и т.д., на место последней поместить первую.

Контрольные вопросы

1. Дайте определение массива.

2. Какие типы данных не допустимы для компонентов массива?

3. Может ли левая граница индексов массива быть отрицательной?

4. Какой массив называется двумерным?

5. Правила описания двумерного массива.

6. Как осуществляется доступ к элементам двумерного массива?

7. Как осуществляется ввод двумерного массива?

8. Какие способы ввода двумерного массива вы знаете?

9. Размещение массива в памяти ЭВМ.

10. Вывод двумерного массива.

11. Может ли процедура read(x) ввести массив х целиком?




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


Дата добавления: 2014-11-16; Просмотров: 1867; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.071 сек.