Двумерные массивы.pptx
- Количество слайдов: 71
Тема 2. 4. Структурированные типы данных Понятие двумерного массива
Одним из основных направлений использования компьютеров является накопление и обработка данных – различных таблиц и справочников, словарей и другой информации. Для представления такой информации в программе удобно использовать массивы. Обработка таких данных осуществляется по одному и тому же закону, для чего удобно использовать циклические алгоритмы.
• В массив объединяется конечная последовательность компонентов одного типа и имеют общее имя. • Каждый отдельный компонент массива называется элементом. • Количество элементов называется размером массива. • Тип элементов определяет тип массива. • Размер и тип массива указываются при его описании, причем размер может быть указан либо конкретным значением, либо ранее определенной константой. • Номер элемента называется индексом. • Индексы могут быть целыми положительными константами или целыми переменными. • Чтобы обратиться к некоторому элементу массива, нужно рядом с идентификатором массива в скобках указать индекс элемента. ВСПОМНИМ
все компоненты массива данные одного типа; компоненты массива можно упорядочить можно обеспечить доступ к любому из компонентов массива простым указанием его порядкового номера. Отличительной особенностью массивов является то:
Пример двумерного массива
Данные в двумерном массиве организованы в виде таблицы (матрицы), где расположение каждой переменной определяется номером строки и номером столбца. Каждому элементу двумерного массива соответствует пара индексов. Первый индекс – это номер строки, а второй – номер столбца, где расположен элемент массива. Размер двумерного массива задается парой чисел: М*N, где М – число строк, а N – число столбцов в таблице
Пусть задан двумерный массив Matr, имеющий размер 7*6. Этот массив может быть описан следующим образом: VAR MATR: ARRAY [1. . 7, 1. . 6] OF INTEGER; Тогда запись MATR[3, 3] означает, что элемент, располагается в 3 -й строке и в 3 столбце. Описание двумерного массива
Операции работы с двумерными массивами аналогичны операциям работы с одномерными массивами, нужно только не забывать о различиях между массивами. Обычно при работе с двумерными массивами используются вложенные циклы
Дана таблица целых чисел, содержащая 10 строк и 20 столбцов. Подсчитать сумму всех чисел в таблице. Задание MAS 01
• Внутри цикла со счетчиком i организован цикл со счетчиком j. В результате суммируются в начале числа 1 -й строки (i=1, при j=1, 2, …, 20), затем суммируются числа 2 -й строки (i=2, при j=1, 2, …, 20) и т. д. • В данной программе в теле одного цикла содержится другой цикл. Такие циклы, называются вложенными. Причем цикл со счетчиком i является внешним, а цикл со счетчиком j – внутренним. Комментарий к задаче
Тема 2. 4. Структурированные типы данных Описание типа массива. Формирование значений элементов массива случайным образом
Любая константа, переменная, значение функции или выражение в Паскале характеризуется своим типом данных. Тип любого из этих объектов определяет множество допустимых значений, которые может иметь объект, а также множество допустимых операций, которые применимы к объекту. Кроме того, тип определяет и формат внутреннего представления значения объекта.
<имя типа> = array [<сп. инд. типов>] of <тип>; где: <имя типа> - правильный идентификатор, <сп. инд. типов> - список из одного или нескольких индексных типов, разделенных запятыми, <тип> - любой тип Паскаля. Имя типа - произвольный идентификатор. Объявление должно быть сделано в разделе Type: Описание типа массива
Массив можно описать как одномерный, элементами которого в свою очередь являются одномерные массивы. В данном случае переменная V объявлена как одномерный массив из трех элементов целого типа, а переменная А описана как двумерный массив из двух строк, в каждую из которых включено по три элемента. Пример 1.
Описание массива можно сократить, исключив определение массива My. Array 1 Пример 2.
Более краткое описание массива А можно получить, указывая имя массива и диапазоны изменения индексов для каждой размерности массива. Пример 3.
Если же указанный тип используется для определения одного массива в программе, то удобно объявление массива в разделе описания переменных. Пример 4.
Заполнить массив данными, а затем вывести их на экран в виде таблицы. Задача
Размерность массива (т. е. количество содержащихся в нем значений) определяется произведением количества строк на количество столбцов. В примере выше в массив помещается 15 значений. Когда пользователь вводит очередное число, то процедура read считывает его и помещает в ячейку с текущими индексами i и j. Когда i равна единице, значение j меняется пять раз, и, значит, заполняется первая строка таблицы. Когда i равна двум, значение j снова меняется пять раз и заполняется вторая строка таблицы. Аналогично заполняется третья строка таблицы. Внутренний цикл for в общей сложности совершает 15 итераций, внешний только 3. Как пользователь вводит значения – не важно. Он может их разделять либо пробелом, либо переходом на новую строку. Вывод значений двумерного массива организован в виде таблицы. Выводятся 3 строки по 5 чисел в каждой. Внутри строк числа разделяются пробелом. Пояснения к задаче
На самом деле, это не совсем корректно написанная программа. Мы несколько раз используем цифры 3 и 5. А что если мы захотим поменять размерность массива? Придется просмотреть всю программу (представьте, что она очень большая) и исправить значения. Это неэффективно. Поэтому в программе следует использовать константы. В случае чего их значения можно поменять всего лишь в одном месте. Вторая проблема – это «кривость» выводимой на экран таблицы значений матрицы, в случае если есть значения разной разрядности (однозначное, двузначное и т. д. числа). Неплохо бы под каждое число отводить равное количество знаков. Пояснения к задаче
1. Дать понятие массиву данных 2. Составьте программу вычисления суммы 7 чисел (без организации массива). 3. Составьте программу вычисления суммы 7 чисел (через одномерный массив) 4. Составьте программу вычисления суммы элементов двумерного массива. 5. Ниже приведен фрагмент решения некоторой задачи. Внимательно рассмотрев решение, сформулируйте решаемую задачу и оформите ее по всем правилам. Самостоятельная работа
Задание MAS 02.
Найти минимальный элемент в каждой строке и вычислить сумму элементов каждой введенной строки двумерного массива Задание MAS 02.
Задание MAS 02.
Положение элемента в двумерном массиве Паскаля определяется двумя индексами: номером строки и номером столбца. Это значит, что нам нужно будет последовательно изменять номер строки с 1 -й до последней и в каждой строке перебирать элементы столбцов с 1 -го до последнего. Потребуется два цикла for , причем один из них будет вложен в другой. ВВОД ЭЛЕМЕНТОВ ДВУМЕРНОГО МАССИВА
Двумерный массив Паскаля можно заполнить: • 1 способ: • с клавиатуры • 2 способ: • случайным образом • 3 способ: • присваиванием заданных значений Способ заполнения двумерного массива Паскаля выбирается в зависимости от поставленной задачи, но в любом случае должен быть определен каждый элемент в каждой строке и каждом столбце. В памяти компьютера элементы двухмерного массива расположены один за другим: после элементов первой строки следуют элементы второй строки и т. д. ВВОД ЭЛЕМЕНТОВ ДВУМЕРНОГО МАССИВА
1 способ: ВВОД ЭЛЕМЕНТОВ ДВУМЕРНОГО МАССИВА С КЛАВИАТУРЫ
Встроенные средства Паскаля: • Для инициализации датчика случайных чисел предназначена процедура: Randomize • Генерацию псевдослучайного числа обеспечивает функция: Random (W) или Random здесь W – переменная типа Word Результат выполнения функции Random существенно зависит от варианта ее вызова (одним параметром или без параметров): Random (W) возвращает псевдослучайное целое число х, равномерно распределенное в интервале 0<=х<=W Random возвращает псевдослучайное вещественное число х, равномерно распределенное в интервале 0<=х<=1. 2 способ: ФОРМИРОВАНИЕМ ЭЛЕМЕНТОВ МАССИВА СЛУЧАЙНЫМ ОБРАЗОМ
• Вывод элементов двумерного массива Паскаля также осуществляется последовательно. • При этом хотелось бы, чтобы элементы, стоящие в одной строке, печатались рядом, т. е. в строку, а элементы столбца располагались один под другим. Для этого необходимо выполнить следующую последовательность действий : ВЫВОД ЭЛЕМЕНТОВ ДВУМЕРНОГО МАССИВА
• Измените решение задачи MAS 02 (Найти минимальный элемент в каждой строке и вычислить сумму элементов каждой введенной строки двумерного массива) так, чтобы значения элементов матрицы задавались компьютером. • Вывести полученный массив на экран монитора. Задание MAS 03
Записывается в каждый элемент массива случайное число и затем выводит все эти числа на экран Задание MAS 04
USES CRT; CONST N=5; M=4; VAR X: ARRAY [1. . N, 1. . M] OF INTEGER; I, J: INTEGER; BEGIN CLRSCR; RANDOMIZE; FOR I: =1 TO N DO FOR J: =1 TO M DO X [I, J]: =RANDOM (100); FOR I: =1 TO N DO BEGIN FOR J: =1 TO M DO WRITE (' ', X[I, J]); WRITELN END; READLN END. Задание MAS 04
• В строке № 2 укажем значение для константы «N» и «M» . • В строке№ 3 запишем область двумерного массива, состоящего из N – строк и M – столбцов. Он записывается также как и одномерный массив, только в квадратных скобках указывается область хранения двумерного массива. Таким образом, наш массив будет состоять из 5 строк и 4 столбцов • В строке № 4 записываем переменные, для хранения индексов строки и столбца. • Строка № 7, 8, 9 – заполняем массив случайными числами (Все строки и столбцы заполнятся случайными числами). Как видно из программы, для того чтобы заполнить элементы двумерного массива различными значениями, необходимо использовать 2 цикла (один цикл вкладывается в другой). Во внешнем цикле счетчиком выступает индекс строки, во внутреннем цикле - индекс столбца. Внешний цикл выполнится один раз только когда внутренний цикл выполнится 4 раза. А так как внешний цикл должен выполниться 5 раз, то внутренний цикл за это время выполнится 20 раз, заполнив при этом все 20 элементов двумерного массива. • Строка № 10 -№ 15. Выводим значения всех элементов массива на экран. Причем, как только заполняются все ячейки одной строки массива, происходит переход на другую строку, и следующая строка массива выводится на другой строке. Комментарий к задаче
Тема 2. 4. Структурированные типы данных Обработка массива
1. Сумма всех элементов квадратной матрицы: sum: =0; for i: =1 to n do for j: =1 to n do sum: =sum+x[i, j]; writeln('Сумма=', sum); 2. Сумма элементов главной диагонали квадратной матрицы (элементы главной диагонали имеют одинаковые индексы - x[1, 1], x[2, 2] и т. д. ): sum: =0; for i: =1 to n do sum: =sum+x[i, i]; writeln('Сумма=', sum);
Вычислить сумму элементов главной диагонали квадратной матрицы • Если число строк таблицы равно числу столбцов, то такая таблица называется квадратной. • Главная диагональ квадратной таблицы проходит из левого верхнего угла в правый нижний. Алгоритм решения 1) Ввести таблицу в память 2) Найти сумму элементов главной диагонали 3) Напечатать результат Задание MAS 05
При вычислении суммы элементов диагонали следует обратить внимание на имена суммируемых элементов: Индексы i, j имеют одинаковые значения, что означает, что можно рассматривать диагональ, как одномерный массив, и использовать один цикл для вычислений. При вводе массива по строкам необходимо разделять числа в строке при помощи пробела, ввод строки завершать клавишей ENTER. Задание MAS 05
Задание MAS 05
3. Сумма элементов побочной диагонали (диагонали противоположной главной). Индексы элементов побочной диагонали в сумме равны n+1, т. е. i+j=n+1 или j=n+1 -i: sum: =0; for i: =1 to n do sum: =sum+x[i, n+1 -i]; writeln('Сумма=', sum);
4. Сумма элементов ниже главной диагонали квадратной матрицы (строго ниже): sum: =0; for i: =1 to n do for j: =1 to n do if i>j then sum: =sum+x[i, j]; writeln('Сумма=', sum); Можно не просматривать весь массив, а брать только нужные элементы: sum: =0; for i: =2 to n do for j: =1 to i-1 do sum: =sum+x[i, j]; writeln('Сумма=', sum);
5. Сумма элементов выше и на главной диагонали квадратной матрицы: sum: =0; for i: =1 to n do for j: =1 to n do if i<=j then sum: =sum+x[i, j]; writeln('Сумма=', sum); Здесь также можно не просматривать весь массив, а брать только нужные элементы: sum: =0; for i: =1 to n do for j: =i to n do sum: =sum+x[i, j]; writeln('Сумма=', sum);
Сумма элементов ниже побочной диагонали квадратной матрицы (строго ниже, рис. 1) : sum: =0; for i: =1 to n do for j: =1 to n do if i+j>n+1 then sum: =sum+x[i, j]; writeln('Сумма=', sum); Можно не просматривать весь массив, а брать только нужные элементы: sum: =0; for i: =2 to n do for j: =n+2 -i to n do sum: =sum+x[i, j]; writeln('Сумма=', sum);
7. Если надо посчитать сумму элементов ниже побочной диагонали и на ней, то в предыдущем примере, при просмотре всего массива в предыдущем примере надо заменить знак отношения > на >=, а при просмотре только нужных элементов применить такой код: sum: =0; for i: =1 to n do for j: =n+1 -i to n do sum: =sum+x[i, j]; writeln('Сумма=', sum); 8. При подсчете суммы элементов выше и на главной диагонали, выше и на побочной диагонали (рис. 2) возможно применение такого кода: sum: =0; for i: =1 to n do for j: =1 to n do if (i<=j) and (i+j<=n+1) then sum: =sum+x[i, j]; writeln('Сумма=', sum);
9. Подсчет сумм элементов по строкам: for i: =1 to n do begin sum: =0; for j: =1 to n do sum: =sum+x[i, j]; writeln('Сумма ', i, '-й строки', sum); end; : );
10. Подсчет сумм элементов по столбцам: for j: =1 to n do begin sum: =0; for i: =1 to n do sum: =sum+x[i, j]; writeln('Сумма ', j, '-го столбца ', sum); end; Безусловно суммы по строкам и столбцам можно записывать в одномерный массив. Например, для сумм по столбцам: for i: =1 to n do zum[j]: =0; for i: =1 to n do for j: =1 to n do zum[j]: =zum[j]+x[i, j]; {вывод сумм по столбцам} for i: =1 to n do write(zum[i]: 4); writeln;
11. Суммы элементов по диагоналям, параллельным главной диагонали. Очевидно, что таких сумм будет 2 n-1. Кроме того, разности индексов эдементов, стоящих на одной диагонали будут равны другу. Имеется в виду разность «номер строки минус номер столбца» . Эти разности будут меняться от -n+1 для самой верхней диагонали s 1, содержащей всего лишь один элемент, до n -1 для диагонали s 2 N-1, расположенной в самом низу матрицы и содержащей также всего один элемент. Таким образом, для подсчета сумм мы должны объявить массив Var zum: array[-n+1. . n-1] of integer; Число элементов в этом массиве будет 2 n-1. Код для подсчета этих сумм: for i: =-n+1 to n-1 do zum[i]: =0; for i: =1 to n do for j: =1 to n do z[i-j]: =z[i-j]+x[i, j]; for i: =-n+1 to n-1 do write(z[i]);
12. Суммы элементов по диагоналям, параллельным побочной диагонали. Очевидно, что таких сумм тоже будет 2 n-1. Кроме того, суммы индексов эдементов, стоящих на одной диагонали будут равны другу. Имеется в виду сумма «номер строки плюс номер столбца» . Эти разности будут меняться от 2 для самой верхней диагонали s 1, содержащей всего лишь один элемент, до 2 n для диагонали s 2 N-1, расположенной в самом низу матрицы и содержащей также всего один элемент. Таким образом, для подсчета сумм мы должны объявить массив Var zum: array[2. . 2*n] of integer; Число элементов в этом массиве будет 2 n-1. Код для подсчета этих сумм: for i: =2 to 2*n do zum[i]: =0; for i: =1 to n do for j: =1 to n do z[i+j]: =z[i+j]+x[i, j]; for i: =2 to 2*n do write(z[i]);
13. Суммы элементов по периметрам двумерного массива. Смысл задачи поясняется Рис. 5, 6. Cледует, различать четный или нечетный порядок матрицы n. Число сумм будет равно k=n div 2 при четном n и k=n div 2 +1 при нечетном значении n. Счет суммы начинается по строке i от столбца j равного i и заканчивается столбцом n-i+1, т. е. начинается с элемента находящегося на главной диагонали и заканчивается элементом на побочной диагонали. Одновременно учитываются элементы из параллельной строки, индекс которой равен n-i+1. Затем считаем элементы по двум параллельным столбцам i и n-i+1 (не учитывая элементы, стоящие в строках). Если n -нечетное число, то выводим значение центрального элемента массива x[k+1, k+1]. k: =n div 2; for i: =1 to k do begin sum: =0; {строки} for j: =i to n-i+1 do sum: =sum+x[i, j]+x[n-i+1, j]; {столбцы} for j: =i+1 to n-i do sum: =sum+x[j, i]+x[j, n-i+1]; writeln(sum); {вывод суммы} end; if n mod 2=1 then writeln(x[k+1, k+1]);
Поиск минимального элемента всей матрицы: Переменная min используется для хранения значений минимального элемента, k – номер строки, l – номер столбца, где он находится min: = a[1, 1]; k: =1; l: =1; for i: =1 to n do begin for j: =1 to m do if a[i, j]
Составить программу нахождения наибольшие элементов каждой строки таблицы Каждую строку таблицы можно рассматривать, как одномерный массив и использовать идею нахождения наибольшего значения. Найденные значения будем помещать в одномерный массив. Для каждой строки таблицы переменная а[i] играет такую же роль, как переменная max. Для каждой строки (ее задает переменная i) элемент a[i] получает значение первого элемента строки. Затем внутренний цикл по переменной j позволяет просмотреть все элементы данной строки и, если среди них встретится элемент, значение которого больше, чем заполненное в a[i], то оно присваивает a[i]. Для распечатки работы программы – массива а – используется цикл. Задание MAS 06
Задание MAS 06
Умножение матрицы а на вектор х, в результате получается новый вектор y: for i: =1 to n do begin S: =0; for j: =1 to m do S: =S+a[i, j]*x[i]; y[i]: =S; end;
Составить программу, которая вводит с клавиатуры квадратный массив целых чисел по строкам и формирует два вектора. В первый записываются элементы исходного массива, расположенные по главной диагонали и выше, а во второй – элементы, лежащие ниже главной диагонали. Предусмотрен вывод на экран. Задание MAS 07
Задание MAS 06
1. 2. 3. 4. 5. 6. 7. 8. 9. Найти среднее арифметическое элементов матрицы A( 3, 3). Найти среднее геометрическое элементов матрицы A( 3, 3). Заполнить массив нулями (обнулить). Заполнить двумерный массив чисел единицами. Заменить положительные элементы прямоугольной таблицы их целыми частями, а отрицательные – их модулями. Вывести на экран элементы двумерного вещественного массива, лежащие в промежутке [-5, 5] Найти количество элементов прямоугольной вещественной таблицы, превосходящих 10. Подсчитать число отрицательных, нулевых и положительных элементов прямоугольной таблицы. Подсчитать в двумерном массиве количество целых четных чисел. Самостоятельная работа
• Двумерный массив представляет собой массив, в котором положение элементов определяется 2 -мя индексами. Фактически, двумерный массив – это обычный (одномерный) массив, элементами которого являются другие одномерные массивы. • Поэтому двумерный массив можно задать следующим образом: b: array[1. . n] of array[1. . m] of integer. • Однако, подобная запись двумерного массива на практике используется нечасто. Наиболее предпочтительным является следующий вариант: b: array[1. . n, 1. . m] of integer. • Схематично, двумерный массив можно представить в виде матрицы, где первый индекс [1. . n] определяет количество строк, а второй индекс [1. . m] определяет количество столбцов. ИТОГ
• • • Двумерный массив - прямоугольная таблица однотипных данных. Адресация элементов двумерного массива осуществляется указанием сначала номера строки, а затем номера столбца. Объявление двумерного массива может быть осуществлено например так: Const n=10; Var x: array [1. . n, 1. . n] of integer; Здесь объявлен квадратный двумерный массив (квадратная целочисленная матрица). Ввод данных в двумерный массив: for i: =1 to n do for j: =1 to n do x[i, j]: =random(100); В массив вводятся случайные целые числа от 0 до 99. Вывод двумерного массива вещественных чисел размером n строк, m столбцов: for i: =1 to n do begin for j: =1 to m do write(x[i, j]: 5: 2); writeln; end;
• Найти произведение ненулевых элементов матрицы.
• http: //mojainformatika. ru/paskal/uroki-paskal-massivy/39 -ispolzovanie-dvumernyx-massivov. html • http: //informatics. mccme. ru/moodle/mod/book/view. php? id=531 • http: //levvol. ru/tpt 7. php


