Работа с двумерными массивами. Задача 11. Сформировать единичную матрицу e размером n на n.

Задача 11. Сформировать единичную матрицу e размером n на n.

 

Единичной называется квадратная матрица, на главной диагонали которой элементы равны единице, а все остальные элементы равны нулю. eij= 1, если i = j, иначе eij= 0.

Алгоритм решения этой задачи (рис. 12) включает в себя: ввод размера матрицы n; формирование матрицы; вывод результата рсчета на экран дисплея.

 

Программа:

 

program matr1;

uses crt;

const

size = 10;

var

i,j,n : integer;

e : array [1..size,1..size] of integer;

begin

write(‘Введите размер матрицы’);

readln(n);

for i := 1 to n do

for j := 1 to n do

if i = j then e[i,j] := 1

else e[i,j] := 0;

clrscr;

gotoxy(3,3);

write(‘ Единичная матрица

размером ‘, n, ‘ на ‘, n);

for i := 1 to n do

for j := 1 to n do

begin gotoxy(3*i,5 + j);

write(e[i,j])

end

end.

 

Индексы i и j определяют номер строки и столбца, на пересечении которых находится каждый элемент матрицы, и кроме этого определяют положение курсора на экране в процедуре gotoxy(3*i,5+j).

 

Задача 12. Написать программу сложения двух матриц.

 

Две матрицы можно сложить, если они имеют одинаковый размер. В результате получается матрица тако­го же размера, каждый элемент которой равен сумме соответствующих элементов исходных матриц: cij= aij+ bij. Алгоритм решения задачи содержит следующие этапы: ввод исходной матрицы а; ввод исходной матрицы b; расчет элементов матрицы с и вывод результата на экран дисплея.

 

Программа:

 

program clgmatr;

uses crt;

const line = 20; column = 30;

type

t = array[1..column] of real;

var

i,j,n,m : integer;

a,b,c : array [1..line] of t;

begin

clrscr;

write(‘Число строк матрицы (менее 21)’); readln(n);

write(‘Число столбцов матрицы (менее 31)’); readln(m);

clrscr; {Ввод матрицы а}

for i:=1 to n do

for j:=1 to m do

begin

write(‘a[‘,i,’,’,j,’]’); readln(a[i,j])

end;

clrscr; {Ввод матрицы b}

for i:=1 to n do

for j:=1 to m do

begin

write(‘b[‘,i,’,’,j,’]’); readln(b[i,j])

end;

clrscr; {Расчет и вывод матрицы с}

for i:=1 to n do

begin

for j:=1 to m do

begin

c[i,j] := a[i,j] + b[i,j]; write(c[i,j]:6:2);

end;

writeln

end;

repeat until keypressed

end.

 

В программе определен новый тип данных – массивовый, состоящий из 30 элементов вещественного типа.

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

Функция keypressed из модуля crt дает значение true, если в буфере input не осталось несчитанных символов, и false в противном случае. Цикл repeat until keypressed включен в программу для задержки изображения на экране вывода. Цикл repeat ... until будет работать до тех пор, пока не будет нажата какая-либо клавиша.

 

Задача 13. Написать программу умножения двух матриц.

 

Перемножить две матрицы можно лишь в том случае, если число столбцов первой матрицы равно числу строк второй матрицы. Если первый сомножитель, матрица а, имеет размер m на p, второй сомножитель, матрица в, имеет размер p на n, то в результате расчета получится матрица с размером m на n, каждый элемент которой

Программа:

 

program umnmatr;{Умножение матриц}

const

m = 4; p = 3; n = 2;

var

i : 1..m;

j : 1..n;

k : 1..p;

a : array [1..m,1..p] of real;

b : array [1..p,1..n] of real;

c : array [1..m,1..n] of real;

begin

{Ввод матрицы а}

for i := 1 to m do

for k := 1 to p do

begin

write(‘a[‘,i,’,’,k,’]’); readln(a[i,k])

end;

{Ввод матрицы b}

for k := 1 to p do

for j := 1 to n do

begin

write(‘b[‘,k,’,’,j,’]’); readln(b[k,j])

end;

{Умножение}

for i:= 1 to m do

begin

for j := 1 to n do

begin

c[i,j] := 0;

for k := 1 to p do c[i,j] :=c[i,j] + a[i,k] * b[k,j];

end;

end;

{Вывод матрицы}

writeln(‘Результат’);

for i := 1 to m do

begin

for j := 1 to n do write(c[i,j]:8:2);

writeln

end;

end.

Строковые типы

Данные строкового типа – это последовательность символов переменной длины. Такой тип еще называют типом string. Он во многом похож на одномерный массив символов, однако, в отличие от последнего, количество символов в строке–переменной может меняться от 0 до N, где N – максимальное количество символов в строке.Тип данных string определяется следующим образом (рис. 13):

 

Рис. 13

 

Описание строкового типасостоит из ключевого слова string, после которого в квадратных скобках указано максимальное количество символов строки данного типа. Это количество может выражаться с помощью целой константы или имени целой константы. Если максимальный размер строки не указан, то он автоматически принимается равным 255 – максимально возможная длина строки. (Существуют еще ASCIIZ–строки, длина которых может достигать 65536 символов, но для работы с такими строками нужна особая директива компилятору). Длина переменной такого типа может динамически изменяться между 1 и значением константы. Символы в строке следует воспринимать как пронумерованные в интервале от 1 до значения константы.

Пример:

type

cities = string [20];

names = string [12].

Переменные типа cities – строкового типа, то есть строки символов, состоящие максимально из 20 символов. Переменные типа names максимально могут состоять из 12 символов. Переменные можно объявить следующим образом:

var

ci: array [1..20] of char;

na: array [1..12] of char.

В этом случае говорят, что ci и na – символьные вектора. Символьные вектора можно рассматривать как строковые переменные, представляющие последовательности постоянной длины. Благодаря такой интерпретации имена символьных векторов и имена их элементов могут использоваться в строковых выражениях там, где могут использоваться имена строковых переменных.

Каждая величина строкового типа занимает в памяти на один байт больше, чем максимальное количество символов в строке данного типа. В дополни­тельном байте хранится информация о текущей длине строки. Если n – текущая длина строки, то в компоненте 0 помещается номер n последнего символа относительно начала строки.

Тип данных string предназначен для обработки строк. С данными типа string связан целый набор операций. Строки могут выводиться на экран монитора посредством стандартных процедур Write и Writeln и вводиться с помощью стандартных процедур Read и Readln. Далее программа демонстрирует считывание строки.

 

program string_test;

var s: string[10];

begin

writeln(‘Задайте несколько символов’);

readln (s);

writeln(s,’ длина:’ , ord(s[0]):5);

end.

 

В этом примере при вводе можно записать сколько угодно символов, но с помощью readln(s) можно считать максимум 10 символов, так как по описанию переменная s может содержать максимум 10 символов. Прочие символы игнорируются. Считываемых символов может быть и меньше 10.

Операции над строками

Строки можно присваивать, сливать и сравнивать.

Присваивание последовательности символов строковым переменным осуществляется с помощью оператора присваивания. С правой стороны оператора присваивания может находиться произвольное строковое выражение, а с левой имя строковой переменной.

В Турбо Паскале существуют два пути обработки переменных типа string. Первый путь предполагает обработку всей строки как единого целого, то есть единого объекта. Второй путь рассматривает строку как составной объект, состоящий из отдельных символов, то есть элементов типа char, которые при обработке доступны каждый в отдельности. Так, первый путь предоставляет возможность присвоения строковой переменной за одну операцию значения целой строки символов:

str_1 := ‘Это строка!’.

Присваиваемое значение строки, так же как и отдельный символ типа char, заключается в апострофы. Если апострофы опущены, то компилятор рассматривает приведенный фрагмент текста как числовую величину или как идентификатор.

Второй подход обеспечивает доступ к отдельным символам строки по номеру их позиции:

str_1 [1] := ‘Э’; str_1 [2] := ‘т’; str_1 [3] := ‘o’; str_1 [4] :=’ ‘;

str_1 [5] := ‘c’; str_1 [6] := ‘т’; str_1 [7] := ‘p’; str_1 [7] := ‘o’;

str_1 [8] := ‘к’; str_1 [9] := ‘a’; str_1 [10] := ‘!’

Переменная str_1 приобретает то же самое значение, что и при первом подходе. Для доступа к отдельному символу в строке необходимо указать имя строки и в квадратных скобках номер позиции элемента (символа) в строке. При этом по отношению к отдельному символу строки возможны все те же операции, что и к переменной типа char. Необходимо напомнить, что, кроме классической записи символьной переменной в одинарных кавычках, Турбо Паскаль вводит еще две формы. Одна из них – представление символа его кодом ASCII с помощью специального префикса #, вторая, для управляющих символов, – значок ^ и буква алфавита с тем же номером (см. главу 1). При необходимости включения в строку управляющих кодов можно пользоваться “клавиатурными” обозначениями. В этом случае значение состоит как бы из склеенных кусков:

^G’После сигнала нажмите ‘^J’ клавишу пробела ‘

В такой записи не должно быть пробелов вне кавычек.

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

Пример.

type

name = string [7]

var

fname, lname : name;

begin

fname := ‘Наталья’; lname := ‘Кучинская’;

write (fname,’ ‘,lname)

end.

В результате выполнения программы будет выведено: Наталья Кучинск, так как максимальная длина строки 7.

Согласно описанию

var a: string [5]; b: string [10];

можно присвоить значение b := a, хотя типы переменных различны. При присвоении a := b, в “а” запишутся только первые 5 символов строки “b”.

Объединение двух строк в одну может быть осуществлено с помощью оператора конкатенации.Этот оператор записывается с помощью знака + (плюс). Объединенная строка представляет собой строку, состоящую из всех символов первой строки и следующих за ними всех символов второй строки. Например:

 

Выражение Результат

‘adam’ + ‘eva’ ‘adameva’

‘5’ + ‘.’ + ‘4’ ‘5.4’

‘Это’ + ‘ ‘ + ‘строка’ + ‘!’ ‘Это строка!’

 

Произвольные пары строк могут сравниваться с помощью операторов отношений. Две строки сравниваются посимвольно слева направо. При обнаружении первого несовпадающего символа принимается решение в соответствии с таблицей кодов ASCII. Отношение ‘balkon’ > ‘balken’ дает результат true, так как символ ‘о’ стоит в таблице кодов после символа ‘e’. Отношение ‘Pascal’ = ‘pascal’ дает результат false, так как у прописной буквы код больше, чем у заглавной. Символ ‘+’ стоит в таблице кодов перед символом ‘–’, поэтому сравнение ‘+’ < ‘–’ дает в результате true.

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