Тема: "Нахождение суммы элементов заданного столбца (строки) матрицы".
Цель работы:
Получение практических навыков по разработке алгоритмов
на вычисление суммы элементов заданного столбца (строки) матрицы.
Количество часов на выполнение работы
Продолжительность выполнения данной
практической работы составляет 2 академических часа.
Оборудование
Аппаратное обеспечение: персональный
компьютер следующей конфигурации:
-
процессор не ниже Intel i3;
-
жесткий диском со свободным объемом не менее 1 Гб;
Программное обеспечение:
-
операционная система Windows 7
/ 8 / 8.1 / 10.
-
установленная среда программирования PascalABC.
Краткие теоретические сведения
В практике программирования часто встречаются задачи,
в которых требуется применение регулярных, пронумерованных данных: таблицы,
результаты наблюдений, проекции векторов, числовые матрицы, каталоги библиотек
и т.д. Для работы с такими данными практически во всех языках программирования
существует понятие массива.
Массив – это регулярная структура данных, которая
состоит из пронумерованных компонент одного и того же типа. Этот тип мы будем
называть базовым типом.
Массивы могут быть одномерными:
и многомерными (например, двумерными) :
С точки зрения машинной реализации, все массивы –
одномерные, разница лишь в том, как пронумерованы элементы массива. Описание
одномерного массива, если считать его элементы целыми числами выглядит
следующим образом:
A : array [1..8] of
integer;
здесь array – ключевое слово, которое
и обозначает собственно массив, в квадратных скобках указан диапазон первого и
единственного индекса.
В Pascal’е в качестве диапазона индекса может
выступать любой отрезок перечислимого типа, например ‘A’..’H’, либо 0..7.
Однако на практике чаще всего удобнее в качестве индексов использовать отрезок
целого типа, причем нижний (меньший) индекс разумно выбирать единицей или
нулем.
Одной из самых неприятных ошибок программирования –
является ошибка обращения к несуществующему элементу массива, или как говорят,
ошибка выхода индекса за допустимый диапазон. Поэтому предыдущее определение
массива A лучше переписать так:
Const N = 8;
Var A : array [1..N] of integer;
и в дальнейшем в программе при работе с массивом
использовать не конкретные числа, а константы, которые определяют диапазон
индексов, кроме того, программу можно будет легко модифицировать для работы с
массивом другой размерности, так как необходимо будет изменить всего лишь одну
строчку!
Иногда формальность описания следует развить, выделив
описание типа отдельно, это будет абсолютно необходимо, если вы собираетесь
использовать в процедурах и функциях параметры-массивы.
Const N = 8;
Type TA = array [1..N] of integer;
Var A : TA;
Дополнительные удобства этого подхода заключаются в
том, что массивы, описанные в разных местах как массивы типа TA, будут являться
совместимыми по типу, а в случае описания массивов A и B одинаковым способом,
но без объявления типамассива, они будут считаться несовместимыми. Например,
Const N = 8;
Type TA = array [1..N] of integer;
Var A : TA;
Var B : TA;
здесь A и B – массивы одного и того же типа. А здесь:
Const N = 8;
Var A : array [1..N] of integer;
Var B : array [1..N] of integer;
здесь A и B – массивы будут считаться разных типов.
Хотя следующее описание определяет массивы одинаковых типов:
Const N = 8;
Var A,B : array [1..N] of integer;
В качестве базового типа допустим абсолютно любой тип,
в том числе и массив, т.е. допустим массив массивов:
Const M = 5; N = 8;
Var A : array [1..M] of array
[1..N] of integer;
Подобная ситуация встречается довольно часто, поэтому
для нее существует разумное сокращение:
Const M = 5;
N = 8;
Var A : array [1..M,1..N] of
integer;
Следует учесть, что многомерные массивы, даже при
небольших диапазонах индексов имеют тенденцию занимать много памяти.
Основные приемы работы с массивами
Рассмотрим выполнение элементарных манипуляций с
массивами. Самая простая задача – заполнение всех элементов одним и тем же
значением:
{Инициализация массива}
for i:=1 to N do
A[i]:=0;
Обратите внимание, как осуществляется доступ к
элементам массива – после имени массива в квадратных скобках указывается
индекс, который может быть произвольным выражением, лишь бы его значение не
выходило за указанный при описании диапазон.
Подобная конструкция допустима везде, где допустима
простая переменная.
Цикл for – чрезвычайно удобная и
полезная вещь при работе с массивами.
Оператор вида for i:=1 to
N do – можно «переводить» как «выполнить для всех элементов
массива».
Если два массива одного типа, то допустимо
присваивание одного массива другому одним оператором:
B:=A;
Следующие два примера показывают, как осуществить
ввод-вывод с небольшим сервисом:
{ввод массива}
for i:=1 to N do
begin
write('Ввeдите ',i,'-й элемент: ');
readln(A[i])
end;
Из этого примера видно, что массив вводится
поэлементно, и как организовать нехитрый сервис. Вывод производится аналогично:
{вывод массива}
for i:=1 to N do writeln
('A[ ',i,']=',A[i]);
Теперь рассмотрим самую первую нашу задачу на обработку
массива – поиск максимального элемента. Поступим следующим образом: пусть
максимальный элемент массива – первый, заведем для него специальную переменную;
затем будем просматривать поочередно последующие элементы, и если окажется, что
нам встретится элемент больший, чем уже определенное число, то заменим его на
этот элемент массива.
Таким образом, когда мы просмотрим весь массив,
окажется, что наша переменная содержит искомое значение:
{определение максимального значения}
max:=A[1];
for i:=2 to N do if
A[i]>max then max:=A[i]; writeln('Maximum=',max);
Напишем теперь целиком программу, использовав
полученные знания:
Program Massiv;
Const N = 10;
Var A : array [1..N] of integer;
i, max : integer;
begin
for i:=1 to
N do // Ввод массива
begin
write( 'Ввeдите ',i,'-й элемент: ');
readln(A[i])
end;
max:=A[1]; // Поиск
максимального значения
for i:=2 to
N do
if A[i]>max then
max:=A[i];
writeln( 'Maximum=',max);
end.
Первой серьезной задачей программирования, с которой
сталкивается начинающий программист – это задача сортировки массива. Под
сортировкой понимается упорядочивание элементов массива по возрастанию (или по
убыванию) без создания копии массива (т.е. «на месте»).
Самый простой алгоритм – это линейная сортировка.
Проведем последовательно сравнение первого элемента со
всеми последующими, при если при очередном сравнении (например сразу 4 и 2)
выяснится, что элементы стоят в «неправильном» порядке – переставим их местами,
затем продолжим сравнение. По окончании одного прохода, можно сказать, что в
первом элементе массива находится минимальный элемент.
Далее применим указанную процедуру к
неотсортированному «остатку» массива до тех пор, пока не переставим два
последних элемента.
Алгоритм линейной сортировки очень прост, но не экономичен,
среднее число просмотров и перестановок пропорционально квадрату числа
элементов (точнее -N2 /2 ).
Приведем программу сортировки. Обратите внимание, что
мы использовали массив в качестве параметра процедуры. Для этого необходимо
создать тип Massiv. Часто для экономии памяти массив передают через
var-параметр, даже если не предполагается его модифицировать в подпрограмме.
Т.е. заголовок процедуры print мог бы выглядеть следующим образом:
procedure print (var m : Massiv); .
Program LinerSort;
Const N = 10; // Число элементов массива
Type Massiv = array [1..N] of
integer; // Определение типа Massiv
procedure
swap(var x,y: integer); // Перестановка элементов местами
var z : integer;
begin
z:=x; x:=y; y:=z;
end;
procedure print(m : Massiv); // Вывод массива
var i : integer;
begin
for i:=1 to
N do write(m[i]:5);
writeln; // Новая строка
end;
// Переменные главной программы
var a : Massiv; i,j : integer;
begin
// Заполнение массива случайными числами в диапазоне
от 0 до 99
for i:=1 to
N do a[i]:=random(100);
print(a); // Вывод массива
for i:=1 to N-1 do // Внешний цикл до
N-1 (обратите внимание!)
for j:=i+1 to N do // Внутренний цикл от
i+1 (обратите внимание!)
if
(a[i]>a[j]) then swap(a[i],a[j]); // Перестановка элементов
print(a); // Вывод
отсортированного массива
end.
Задания по практической работе
1.
Дана матрица размера M ×N и целое число K (1≤K≤M).
Найти сумму и произведение элементов K-й строки данной матрицы.
2.
Дана матрица размера M ×N и целое число K (1 ≤ K ≤
N). Найти сумму и произведение элементов K-го столбца данной матрицы.
3.
Дана матрица размера M × N. Для каждой строки
матрицы найти сумму ее элементов.
4.
Дана матрица размера M ×N. Для каждого столбца
матрицы найти произведение его элементов.
5.
Дана матрица размера M ×N. Для каждой строки
матрицы с нечетным номером (1, 3, ...) найти среднее арифметическое ее
элементов. Условный оператор не использовать.
6.
Дана матрица размера M × N. Для каждого столбца
матрицы с четным номером (2, 4, ...) найти сумму его элементов. Условный оператор
не использовать.
Оставьте свой комментарий
Авторизуйтесь, чтобы задавать вопросы.