INFONKO.RU

Главной или побочной диагонали матрицы

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

Пусть дана матрица а(4,4).

a11, a22, a33, a44 – элементы главной диагонали матрицы. На главной диагонали индексы строки и столбца равны, то есть i = j. Элемент главной диагонали можно обозначать как a[i,i].

У элементов матрицы, лежащих выше главной диагонали, i < j, а у тех, которые ниже, i > j.

a14, a23, a32, a41 – элементы побочной диагонали матрицы. На побочной диагонали сумма индексов строки и столбца постоянна и на единицу больше размера матрицы, т. е. для матрицы a(4, 4) сумма индексов i + j = 5, поэтому элемент побочной диагонали можно обозначать как a[i,5 – i].

У элементов a[i, j], лежащих выше побочной диагонали сумма индексов i + j < 5, а у элементов a[i, j], лежащих ниже побочной диагонали, сумма индексов i + j > 5.

Задача 1. Найти сумму элементов, расположенных на главной диагонали матрицы a.

sum:=0; for i:=1 to 4 do for j:=1to 4 do if i=j then sum:=sum + a[i, j]; Другой вариант: sum:=0; for i:=1 to 4 do sum:=sum + a[i, i];

Задача 2. Найти сумму элементов матрицы а, расположенных выше ее главной диагонали.

sum = 0;

for i:=1 to 4 do

for j:=1 to 4 do

if i < j then sum:=sum + a[i, j];

Задача 3. Найти сумму элементов побочной диагонали матрицы a.

sum:=0; for i:=1 to 4 do for j:=1to 4 do if i+=5j then sum:=sum + a[i, j]; Другой вариант: sum:=0; for i:=1 to 4 do sum:=sum + a[i, 5-i];

sum = 0;

for i : = 1 to 4 do

sum : = sum + a[i, 5 – i];

Задача 4. Найти сумму элементов матрицы a, лежащих выше ее побочной диагонали.

sum = 0;

for i:=1 to 4 do

for j:=1 to 4 do

if i+j<5 then sum:=sum + a[i, j];

Пример выполнения задания 6

Дана матрица a(4, 4). Получить матрицу b(4, 4) по правилу:

а также произведение элементов строки, содержащей наименьший элемент матрицы.

program lab4;

uses crt;

var к, i, j : integer;

b, a : array [1 .. 4, 1 .. 4] of real;

p, min : real;

begin clrscr;

writeln (¢введите матрицу d¢);

for i:=1 to 4 do

for j:=1 to 4 do read (a[i, j]);

min:=a[l,1]; k:=1;

{формирование матрицы b и в этом же цикле}

{поиск минимального элемента и номера строки,

в которой он находится}

for i:=1 to 4 do

for j:=1 to 4 do

begin

if a[i, j] > 0 then b[i, j]:=2*a[i, j] else

b[i, j]:=0;

if a[i, j] < min then

begin min:=a[i, j];

к:=i

end

end;

p:=1;

for j:=1 to 4 do

p:=p*a[k, j];{вычисление произведения элементов

k-ойстроки}

writeln (¢вывод b(4, 4)¢);

for i:=1 to 4 do

begin

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

writeln

end;

writeln (¢минимальный элемент = ¢, min :8:2);

writeln (¢произведение элементов ¢, k,¢ строки =¢, p:5:2)

readkey

end.

Тема 7

Организация программ

С использованием функций

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



Описание функции содержится в главной программе после раздела описания переменных (var) и перед началом (begin) программы.

В общем виде функция записывается следующим образом:

function имя(формальные параметры) :тип результата;

Раздел описаний

Begin

Раздел операторов

end;

Формальные параметры – это наименования переменных (аргументы описываемой функции), через которые передаются входные данные из программы в функцию. Формальными параметрами функции, как правило, являются параметры – значения.

Само имя функции представляет собой идентификаторпараметр, значение которого после окончания работы функции равно результату вычисления. Тип результата (функции) указывается следом за списком параметров – после закрывающей скобки этого списка и двоеточия.

В разделе операторов функции обязательно должен присутствовать хотя бы один оператор присваивания, в котором переменной с именем, совпадающим с именем функции, присваивается определенное значение, тип которого совпадает с типом результата (функции). Если такого присваивание в разделе операторов функции не выполнено, то функция не возвращает никакого результата (точнее, возвратит произвольный результат).

Например, описания вычисления функции тангенса угла:

function tg(x:real): real;

begin

tg := sin(x)/cos(x)

end;

Вызов и выполнение функции производится при вычислении указателя функции:

имя функции(фактические параметры ).

При этом вызов функции необходимо делать непосредственно внутри выражения, подобно тому, как используются стандартные встроенные функции, например синус sin(x). Фактические и формальные параметры должны согласовываться

¾ по порядку следования,

¾ количеству,

¾ типам.

Например, вызов ранее описанной функции tg можно произвести так:

a := tg(y);

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

Пример. Заданы стороны двух треугольников MNK (стороны m, n, k) и PLF (стороны p, l, f ). Переменной s присвоить значение –1, если площадь треугольника MNK меньше или равнa площади треугольника PLF, и значение 1 в противном случае.

Вычисление площади треугольников по формуле Герона оформить в виде функции pl.

Примечание. Формула Герона для вычисления площади треугольника со сторонами a, b, c:

,

где , где p – полупериметр треугольника.

program pr1;

uses crt;

var m, n, k, l, p, f, h, q: real;

s : integer;

function pl(a, b, c: real): real;

var r : real;

begin

r:= ( a + b + c ) / 2;

pl:= sqrt (r*(r – a)*(r – b)*(r – c));

end;

begin clrscr;

writeln(‘Введите стороны m, n, k, p, l, f’);

readln(m, n, k, p, l, f );

h := pl(m, n, k);

q := pl(p, l, f );

if h > q then s := 1 else s := –1;

writeln('s=' , s :3);

readkey;

end.

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

Нельзя записать так:

function sum(a: array[1..5] of real; var : real):real;

Пример. Пусть заданы два вектора а(8) и b(12). Вычислить для каждого вектора произведение его элементов.

program pr2;

type vect = array [ 1 .. 12 ] of real;

var a, b: vect;

ta, tb : real;

. . . . . . . . . . . . . .

function prl(var x: vect; n: integer): real;

var i: integer;

p: real;

begin p := 1;

for i:= 1 to n do

p := p * x[ i ];

pr := p

end;

begin

. . . . . . . . . . . . . . .

ta:= pr(a, 8);

tb:= pr(b, 12);

. . . . . . . . . . . . . . . . .

end.

Пример выполнения задания 7

Дана матрица А(4,4).

Вычислить

Z= X1X4 +X2X3 + X3X2+ X4X1,

где Xk – наибольшее из значений элементов K – го столбца матрицы A.

Вычисление наибольшего значения оформить в виде функции.

program lab6;

type matr = array[1..4,1..4] of real;

var a: matr; z: real;

x: array[1..4] of real;

i, j: integer;

function max(y:matr; k: integer): real;

var m: real; i: integer;

begin

m: = a[1,k];

for i:= 2 to 4 do

if a[i,k]> m then m:= a[i,k];

max:=m

end;

begin

writeln(‘введите матрицу a(4,4)’);

for i:= 1 to 4 do

for j:= 1 to 4 do read(a[i,j]);

for i:= 1 to 4 do x[i] :=max(a,i);

z:=0;

for i:= 1 to 4 do

z := z + x[i] * x[5 – i];

writeln(‘z=’,z:6:2);

readkey;

end.

Тема 8

Организация программ

С использованием процедур

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

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

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

Описание процедуры включает заголовок и тело процедуры. Заголовок состоит из зарезервированного слова procedure, идентификатора (имени) процедуры и заключенного в круглые скобки списка формаль­ных параметров с указанием типа каждого параметра.

В общем виде описание процедуры выглядит так:

procedure имя (формальные параметры);

Раздел описаний;

begin

Раздел операторов

end;

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

Нетрудно заметить, что структура процедуры копирует структуру программы в целом, т. е. состоит из заголовка, раздела описаний и раз­дела операторов. Различия лишь в заголовках и в том, что в конце про­цедуры ставится точка с запятой вместо точки в конце программы. Процедура помещается в основной программе после раздела описания переменных и перед разделом операторов основной программы.

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

Формальные параметры – это наименование фиктивных переменных, через которые передается информация из программы в процедуру (входные параметры) либо из процедуры в программу (выходные параметры). Выходным параметрам присваиваются результаты вычислений.

Описание процедуры, расположенное в описательной части программы, само по себе никакого действия не производит. Выполнение программы начинается с выполнения раздела операторов основной программы. Для обращения к процедуре применяется оператор вызова процедуры, который имеет вид:

Имя процедуры(список фактических параметров).

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

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

Соответствие между фактическими и формальными параметрами должно быть следующим:

– число фактических параметров должно быть равно числу формальных параметров;

– соответствующие фактические и формальные параметры долж­ны совпадать по порядку следования и по типу.

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

Параметры

Параметры, перед которыми отсутствует зарезервированное слово var и за которыми следует тип, называются параметрами-значениями. Например, в описании

procedure korrect (s, к : real; x : integer);

s, k, x –параметры-значения. Фактический параметр, соответствующий параметру-значению, может быть выражением соответствующего типа, например:

korrect (2.5, (х + 2)/5, 1);

Изменение формальных параметров-значений не влияет на значе­ния соответствующих фактических параметров.

Параметры, перед которыми следует ключевое слово var и за кото­рым следует тип, называются параметрами-переменными. Например, в описании

procedure obr(var s, k: real; var x : integer);

s, k, x – параметры-переменные. Фактический параметр, соответствую­щий параметру-переменной, может быть только переменной, например:

obr(a, b, k);

где а, b – переменные вещественного типа, а k –целого типа.

Любые изменения в значении формального параметра-переменной отражаются на фактическом параметре.

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

Пример. Решить два квадратных уравнения и ,

считая, что его дискриминант неотрицателен.

program primer1;

uses crt;

var y1, y2, zl, z2 : real;

{текст процедуры для нахождения корней квадратного уравнения }

procedure sq( a, b, с : real; var xl, x2: real);

var d : real;

begin

d:=b*b – 4*a*c;

x1:=(–b + sqrt(d))/(2*a);

х2:=(–b – sqrt(d))/(2*a);

end;

{операторы основной программы}

begin clrscr;

sq(5.7, –1.2, –8.3, y1, y2);

sq(2.4, 3.4, –8.4, zl, z2);

writeln(¢корни y1, y2 =¢, yl : 6 : 2, y2 : 6 : 2);

writeln(¢корни zl, z2 =¢, zl : 6 : 2, z2 : 6 : 2);

readkey

end.

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

Нельзя (!) записать так:

procedure sum(a : array[l ..5] of real; var s : real);

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

Пример. Вычислить z = (s + к)*(s1+ k1), где s, k – сумма и количество отрицательных элементов a(10), s1, k1 – сумма и количество отрицательных элементов массива b(8).

program primer2;

uses crt;

type vect = array [1..10] of real;

{Значение верхней границы индекса равно максимальному числу элементов двух массивов а, b}

var а, b : vect; i, k, k1: integer; s, s1: real;

{Процедура для фиктивного массива х с числом элементов п, где п <= 10 вычисляет сумму (sum) и количество (col) отрицательных элементов}

procedure sumcol (x:vect; n:integer; var sum:real;

var col:integer);

var i:integer;

begin sum := 0; col := 0;

for i:=1 to n do

if x[i]< 0 then

begin sum := sum + x[i];

соl:=соl + 1;

end

end;

begin clrscr;

writeln(¢ввeдитe массив а(10)¢);

for i := 1to 10 do read(a[i]);

writeln(¢введите массив b(8)¢);

for i := 1 to 8 do read(b[i]);

{в процедуру передается массив а длиной 10}

sumcol(a, 10, s, к);

{в процедуру передается массив b длиной 8}

sumcol(b, 8, sl, k1);

z := (s + k)*(sl + kl);

writeln(¢z=¢, z : 6 : 2);

readkey

end.

Такой подход можно применить и для двумерных массивов.

Пример выполнения задания 8

Даны две вещественные матрицы a(7, 7) и b(5, 5). Из отрица­тельных элементов матрицы а сформировать одномерный массив с, а из отрицательных элементов матрицы b сформировать одномерныймассив d.

В программе использовать три процедуры:

– для ввода матриц,

– для формирования одномерных массивов,

– для вывода одномерных массивов.

program lab5;

uses crt;

const n=7;

type matr=array [1..n, 1..n] of real;

vect = array[l..n*n] of real;

var a, b:matr; c, d:vect; t, q:integer;

{процедура для ввода квадратной матрицы с фиктивным именем х с числом строк k и с числом столбцов k, где k <= п}

procedure vvod (var x:matr; k:integer);

var i, j:integer:

begin

for i:=1 to k do

for j:=1 to k do read(x[i, j]);

end;

{процедура вывода одномерного массива с фиктивным именем y с числом элементов т, где т <= п*п}

procedure vyvod (y:vect; m:integer);

var i:integer:

begin

for i := 1to m do write(y[i]:6:2);

writeln

end;

{процедура формирования из матрицы х(k, k) одномерного массива у(т)}

procedure form (x:matr; k:integer; var у:vect; var m:integer);

var i ,,j:integer:

begin m:=0;

for i:=1 to k do

for j:=1 to k do

if x [i, j] <0 then

begin m:=m + 1;

y[m]:=x[i, j]

end

end;

{раздел операторов основной программы}

begin clrscr;

writeln (¢введите элементы матрицы а(7, 7)¢);

vvod (a, 7);

writeln (¢введите элементы матрицы b(5, 5)¢);

vvod (b, 5);

form(a, 7, с, t);

writeln (¢вывод одномерного массива с длиной t

элементов¢);

vyvod(c, t);

form (b, 5, d, q);

writeln (¢вывод одномерного массива d длиной

q элементов¢);

vyvod (d, q);

readkey

end.


Тема 9

Текстовые файлы

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

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

Бытовые примеры текстовых файлов просты. Если файл можно вывести на экран в текстовом режиме и прочитать его, то это – текстовый файл.

Для работы с текстовыми файлами необходимо определить файловую переменную:

type textfile = text;

var f:textfile;

или

var f:text;

Заметим, что слово text является не зарезервированным словом, а идентификатором стандартного типа, наряду с real, integer и т. п.

Любой файл имеет три характерные особенности.

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

Во-вторых, он содержит элементы одного типа.

В-третьих, длина вновь создаваемого файла никак не оговаривается при его объявлении и ограничивается только емкостью устройства внешней памяти. Так как число элементов файла заранее неизвестно, поэтому в конце файла автоматически формируется признак конца файла.

Последовательный доступ состоит в том, что по файлу можно дви­гаться только последовательно, начиная с первого его элемента, и кро­ме этого всегда существует возможность начать просмотр файла с его начала. Таким образом, всегда доступен лишь очередной его элемент. Если в процессе решения задачи необходим какой-либо из предыдущих элементов, то необходимо вернуться в начало файла и последовательно пройти все элементы до нужного.

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

Символьный тип данных

Набор символов в компьютере достаточно велик. Все символы упорядо­чены, т.е. каждый символ имеет свой порядковый номер (код символа).

Символьная константа (литера) – это символ, заключенный в апостро­фы, например: ¢А¢,¢+¢, ¢7¢. Символьная константа занимает один байт памяти. Ее можно обозначать именем и задавать в разделе констант, например:

const sim= ¢A¢; s= ¢*¢;

Символьная переменная принимает значение одного символа. Она должна быть объявлена в разделе описания переменных так:

имя : char;,

где имя – имя переменной символьного типа; char – ключевое слово обозначения символьного типа, например:

var s1, s2:char;

ch:char;

Переменная символьного типа может получить значение в результате выполнения оператора присваивания или ввода (read, readln) и значение переменной можно вывести (write, writeln).

Если переменная типа char получает значение в результате выполнения операции присваивания, то справа от знака = должно стоять выражение символьного типа, напрмер: s1:= s2; ch := ¢K¢;

К символьным данным можно применить встроенные функции:

ord(x:char): byte; – определяет порядковый номер символа х в кодовой таблице, например: ord(¢R¢)=82;
chr(n:integer): char; – по порядковому номеру п в кодовой таблице определяет символ, например: chr(68) = ¢D¢;
pred(x:char): char; – определяет предыдущий символ по отношению к х, например: pred(¢N¢) = ¢М¢;
succ(x:char): char;– – определяет последующий символ по отношению к х, например: succ(¢R¢) = ¢S¢;

Переменную типа char можно сравнить с другой переменной типа char или с символьной константой. Отношение sl > s2будет иметь значение истина (true), если ord(sl) > ord(s2), и ложь (false) при ord(s1) < ord(s2), например: ¢0¢ < ¢1¢ — истина, так как код символа ¢0¢ 48 < 49 – кода символа ¢1¢.

Код строчной буквы больше кода прописной. Ниже приведен фрагмента программы, которая преобразует строчную русскую букву в прописную:

read(sl);

case s1of

¢a¢.. ¢n¢ : s1:= chr(ord(sl) – 32);

¢p¢.. ¢я¢ : s1 := chr(ord(sl) – 80);

¢e¢ : s1:= ¢E¢

end;

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

Строка – это последовательность символов кодовой таблицы компьютера. При использовании в выражениях строка заключается в апострофы. Количество символов в строке (длина строки) может динамически изменяться от 0 до 255. Для определения данных строкового типа используется идентификатор string, за которым следует заключенное в квадратные скобки значение максимально допустимой длины строки данного типа. Если это значение не указывается, то по умолчанию дли­на строки равна 255 символам.

Переменную строкового типа можно определить через описание типа в разделе описания типов type или непосредственно в разделе опи­сания переменных. Строковые данные могут использоваться в про­грамме также в качестве констант.

Определение строкового типа устанавливает максимальное коли­чество символов, которое может содержать строка.

type = string [максимальная длина строки];

var : ;

Переменную типа string можно задать и без описания типа:

var : string [максимальная длина строки];

Примеры описания:

const adres=¢ул. Короленко, 5¢; {строковая константа}

type Ast= string [125];

var Fstr:Ast; {описание с заданием типа}

Stl:string; {no умолчанию длина строки = 255}

St2, St3:string [50]; {строка с максимальной длиной 50 символов}

Nazv:string[280]; {ошибка, длина строки превышает 255}



infonko.ru/rol-i-mesto-kursa-proizvodstvennij-menedzhment-v-podgotovke-menedzherov-i-ekonomistov.html infonko.ru/rol-i-mesto-patentnoj-i-nauchno-tehnicheskoj-informacii.html infonko.ru/rol-i-mesto-studencheskih-trudovih-otryadov-v-socialno-professionalnom-samoopredelenii-molodezhi.html infonko.ru/rol-i-mesto-teorii-gosudarstva-i-prava-v-sisteme-yuridicheskih-nauk.html infonko.ru/rol-i-mesto-tilovih-gospitalej-v-sovremennoj-sisteme-lechebno-evakuacionnih-meropriyatij.html infonko.ru/rol-i-mesto-valeologii-i-medicini-v-zavisimosti-ot-urovnya-zdorovya-i-sostoyaniya-organizma.html infonko.ru/rol-i-mesto-v-sovremennoj-sisteme-mo.html infonko.ru/rol-immunnoj-zashiti-igraemaya-fasciyami.html infonko.ru/rol-informacii-v-formirovanii-politicheskogo-nastroeniya-obshestva.html infonko.ru/rol-informacii-v-prinyatii-ur.html infonko.ru/rol-innovacij-v-epohu-globalizacii-mirovoj-ekonomiki.html infonko.ru/rol-institutov-v-funkcionirovanii-ekonomiki.html infonko.ru/rol-integrativnih-sistem-organizma.html infonko.ru/rol-i-osnovnie-funkcii-aptekarskogo-prikaza.html infonko.ru/rol-iskusstva-i-literaturi-v-zhizni-cheloveka.html infonko.ru/rol-iskusstva-nauki-sredstv-massovoj-informacii-v-duhovnoj-zhizni-obshestva.html infonko.ru/rol-iskusstva-v-poznanii-mira-novatorstvo-i-tradicii-v-kulture.html infonko.ru/rol-i-sootnoshenie-kochevogo-skotovodstva-i-zemledeliya-u-razlichnih-plemen.html infonko.ru/rol-i-struktura-gosudarstva.html infonko.ru/roli-s-visokim-i-nizkim-statusom.html