|
Главной или побочной диагонали матрицыСуществует множество задач, в которых необходимо использовать элементы главной или побочной диагонали матрицы (эти понятия имеют смысл только для квадратных матриц!). Пусть дана матрица а (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.
Задача 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 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.
Если в процедуру необходимо передать массив, то в этом случае фактическим параметром является имя массива. Обратим внимание на то, что в заголовке процедуры для указания типов формальных параметров могут использоваться только имена типов. Нельзя (!) записать так:
Как же написать одну процедуру для обработки двух массивов одного типа, имеющих разное число элементов?
Пример. Вычислить 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 ¢; К символьным данным можно применить встроенные функции:
Переменную типа 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 символов}
Что делать, если нет взаимности? А теперь спустимся с небес на землю. Приземлились? Продолжаем разговор... Живите по правилу: МАЛО ЛИ ЧТО НА СВЕТЕ СУЩЕСТВУЕТ? Я неслучайно подчеркиваю, что место в голове ограничено, а информации вокруг много, и что ваше право... ЧТО ПРОИСХОДИТ, КОГДА МЫ ССОРИМСЯ Не понимая различий, существующих между мужчинами и женщинами, очень легко довести дело до ссоры... Что способствует осуществлению желаний? Стопроцентная, непоколебимая уверенность в своем... Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:
|