Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







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





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

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

 

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

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

a 14, a 23, a 32, a 41 – элементы побочной диагонали матрицы. На побочной диагонали сумма индексов строки и столбца постоянна и на единицу больше размера матрицы, т. е. для матрицы 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 y 1, y 2, z l, z 2: real;

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

procedure sq(a, b, с: real; var x l, x 2: real);

var d: real;

begin

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

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

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

end;

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

begin clrscr;

sq(5.7, –1.2, –8.3, y 1, y 2);

sq(2.4, 3.4, –8.4, z l, z 2);

writeln(¢корни y 1, y 2 =¢, y l: 6: 2, y 2: 6: 2);

writeln(¢корни z l, z 2 =¢, z l: 6: 2, z 2: 6: 2);

readkey

end.

 

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

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

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

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

 

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

program primer 2;

uses crt;

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

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

var а, b: vect; i, k, k 1: integer; s, s 1: 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, s l, k 1);

z:= (s + k)*(s l + k l);

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 s 1, s 2:char;

ch:char;

 

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

Если переменная типа char получает значение в результате выполнения операции присваивания, то справа от знака = должно стоять выражение символьного типа, напрмер: s 1:= s 2; 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 или с символьной константой. Отношение s l > s 2будет иметь значение истина (true), если ord(s l) > ord(s 2), и ложь (false) при ord(s 1) < ord(s 2), например: ¢0¢ < ¢1¢ — истина, так как код символа ¢0¢ 48 < 49 – кода символа ¢1¢.

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

 

read(s l);

case s 1of

¢ a ¢.. ¢n¢: s 1:= chr(ord(s l) – 32);

¢ p ¢.. ¢ я ¢: s 1:= chr(ord(s l) – 80);

¢ e ¢: s 1:= ¢ E ¢

end;

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

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

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

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

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

var <имя переменной>: <имя типа>;

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

var <имя переменной>: string [максимальная длина строки];

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

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

type Ast= string [125];

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

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

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

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







ЧТО ТАКОЕ УВЕРЕННОЕ ПОВЕДЕНИЕ В МЕЖЛИЧНОСТНЫХ ОТНОШЕНИЯХ? Исторически существует три основных модели различий, существующих между...

Что делает отдел по эксплуатации и сопровождению ИС? Отвечает за сохранность данных (расписания копирования, копирование и пр.)...

Конфликты в семейной жизни. Как это изменить? Редкий брак и взаимоотношения существуют без конфликтов и напряженности. Через это проходят все...

Система охраняемых территорий в США Изучение особо охраняемых природных территорий(ООПТ) США представляет особый интерес по многим причинам...





Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2024 zdamsam.ru Размещенные материалы защищены законодательством РФ.