- •Строки Строковый тип данных
- •Процедуры и функции для работы со строками
- •Val(st: string; X: числовая переменная; var code: integer)
- •Введение
- •Объявление строчных типов и строчных переменных
- •Операции со строками
- •Стандартные процедуры и функции для строк
- •Практический пример применения процедур, работающих со строками
- •Хранение строк
- •Работа с элементами переменной строкового типа
- •Двумерные массивы Паскаля – матрицы
- •Описание двумерного массива Паскаля.
- •Основные действия с двумерными массивами Паскаля
- •Ввод двумерного массива Паскаля.
- •Вывод двумерного массива Паскаля на экран.
- •Представление двумерного массива Паскаля в памяти
- •Сколько памяти выделяется для массива?
- •Примеры решения задач с двумерными массивами Паскаля
- •Двумерные массивы
- •Найти сумму элементов
- •Работа с несколькими массивами
- •Суммы в двумерных массивах
Работа с несколькими массивами
Пример 5
Составить программу вычисления произведения двух квадратных целочисленных матриц А и В размером 5*5 соответственно. Элементы результирующей, также целочисленной, матрицы С (размером 5*5) определяются по формуле
c[i, j] = |
где n - размерность матриц А и В.
Решение
Формирование матриц будем производить с помощью генератора случайных чисел, вычисление элементов результирующей матрицы С - с помощью вложенных циклов, где во внутреннем цикле (по параметру k) будет накапливаться сумма, определяющая элемент с[i,j].
Program Exampl_46; Const n = 5; Type dmyarray = Array[1..n, 1..n] Of Integer; Var A, B, C : dmarray;
Procedure Init(Var x: dmyarray);
...
Procedure Print(x: dmyarray);
...
Procedure Mult(x,y: dmyarray; Var z: dmyarray); Var k, i, j : Integer; Begin For i:=1 To n Do For j:=1 To m Do Begin z[i,j]:=0; For k:=1 To n Do z[i,j]:=z[i,j]+x[i,j]*y[k,j]; End; End;
Begin {основная программа} Writeln('массив А:'); Init(A); Print(A); Writeln('массив В:'); Init(B); Print(B); Mult(A, B, C); Writeln('массив С:'); Print(c); Readln; End.
Определить, отвечает ли заданный массив некоторым требованиям
Пример 6
Определить, есть ли в данном массиве элемент, равный 0.
Решение
Опишем логическую функцию, значение которой равно истине, если такой элемент есть, и ложь - в противном случае. Самый простой способ - это просматривать элементы, и если найден искомый, то присвоить функции значение True, иначе - False.
Function Check1(x: dmyarray): Boolean; Var i, j : Integer; t: Boolean; Begin t:= true; {предполагаем, что искомого элемента в массиве нет} i:=1; {начальные значения} While t And (i<=n) Do Begin j:=1; While (j<=m) And (x[i,j]<>0) Do Inc(j); t:=(j=m+1); {определяем, найден ли искомый элемент, если просмотрена вся строка, то значение j=m+1 и t:= True, иначе элемент не найден и t:= False} Inc(i); End; check1:=not t; {t=False, если элемент в массиве есть поэтому значению функции присваиваем not t} End;
Пример 7
Определить, является ли данный квадратный массив симметричным относительно своей главной диагонали.
Решение
Если он является симметричным, то для него выполняется равенство a[i, j] = a[i, j] для всех i = 1,...,n и j = 1,...,n при условии, что i>j. Поэтому можно составить следующую функцию:
Function Check2(x: dmyarray): Boolean; Var i, j : Integer; t : Boolean; Begin t:= True; {предположим, что матрица симметрична} i:=2; While t And (i<n) Do Begin j:=1; While (j<i) And (x[i,j]=x[j,i]) Do Inc(j); t:=(j=i); Inc(i); End; Check2:=t; End;
Таким образом, если встретится хотя бы одна такая пара, что соответствующие элементы не будут равны, то значение функции будет ложь(false)
Суммы в двумерных массивах
Двумерный массив - прямоугольная таблица однотипных данных. Адресация элементов двумерного массива осуществляется указанием сначала номера строки, а затем номера столбца.
Объявление двумерного массива может быть осуществлено например так:
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;
-
Сумма всех элементов квадратной матрицы:
sum:=0; for i:=1 to n do for j:=1 to n do sum:=sum+x[i,j]; writeln('Сумма=',sum);
-
Сумма элементов главной диагонали квадратной матрицы (элементы главной диагонали имеют одинаковые индексы -x[1,1], x[2,2] и т.д.):
sum:=0; for i:=1 to n do sum:=sum+x[i,i]; writeln('Сумма=',sum);
-
Сумма элементов побочной диагонали (диагонали противоположной главной). Индексы элементов побочной диагонали в сумме равны 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);
-
Сумма элементов ниже главной диагонали квадратной матрицы (строго ниже):
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);
-
Сумма элементов выше и на главной диагонали квадратной матрицы:
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
-
Сумма элементов ниже побочной диагонали квадратной матрицы (строго ниже, рис.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);
-
Если надо посчитать сумму элемсентов ниже побочной диагонали и на ней, то в предыдущем примере, при просмотре всего массива в предыдущем примере надо заменить знак отношения > на >=, а при просмотре толко нужных элементов применить такой код:
sum:=0; for i:=1 to n do for j:=n+1-i to n do sum:=sum+x[i,j]; writeln('Сумма=',sum);
-
При подсчете суммы элементов выше и на главной диагонали, выше и на побочной диагонали (рис. 2) возможно применине такого кода:
Рис.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);
-
Подсчет сумм элементов по строкам:
for i:=1 to n do begin sum:=0; for j:=1 to n do sum:=sum+x[i,j]; writeln('Сумма ',i,'-й строки',sum); end;
-
Подсчет сумм элементов по столбцам:
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;
-
Суммы элементов по диагоналям, параллельным главной диагонали.
Рис.3
Очевидно, что таких сумм будет 2n-1. Кроме того, разности индексов эдементов, стоящих на одной диагонали будут равны друг другу. Имеется в виду разность «номер строки минус номер столбца». Эти разности будут меняться от -n+1 для самой верхней диагонали s1, содержащей всего лишь один элемент, до n-1 для диагонали s2N-1, расположенной в самом низу матрицы и содержащей также всего один элемент. Таким образом, для подсчета сумм мы должны объявить массив
Var zum:array[-n+1..n-1] of integer; Число элементов в этом массиве будет 2n-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]);
-
Суммы элементов по диагоналям, параллельным побочной диагонали.
Рис.4
Очевидно, что таких сумм тоже будет 2n-1. Кроме того, суммы индексов эдементов, стоящих на одной диагонали будут равны друг другу. Имеется в виду сумма «номер строки плюс номер столбца». Эти разности будут меняться от 2 для самой верхней диагонали s1, содержащей всего лишь один элемент, до 2n для диагонали s2N-1, расположенной в самом низу матрицы и содержащей также всего один элемент. Таким образом, для подсчета сумм мы должны объявить массив
Var zum:array[2..2*n] of integer; Число элементов в этом массиве будет 2n-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]);
-
Суммы элементов по периметрам двумерного массива. Смысл задачи поясняется Рис.5,6.
Рис.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]);