МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ Белорусский национальный технический университет Кафедра «Металлургия литейных сплавов» ИНФОРМАТИКА Лабораторный практикум для студентов специальности 1-42 01 01 «Металлургическое производство и материалообработка» В 2 частях Часть 2 Минск БНТУ 2013 УДК 004(075.8) ББК 32.97.7 И74 Составители : И. В. Рафальский, А. В. Арабей Рецензенты : М. М. Татур, В. Д. Василенок Информатика : лабораторный практикум для студентов специ- альности 1-42 01 01 «Металлургическое производство и материало- обработка» : в 2 ч. / сост. : И. В. Рафальский, А. В. Арабей. – Минск : БНТУ, 2009–2013. – Ч. 2. – 2013. – 69 с. ISBN 978-985-550-251-8 (Ч. 2). Лабораторный практикум предназначен для закрепления и углубления теоретиче- ской базы знаний студентов при изучении дисциплин «Информатика», «Прикладная информатика», а также приобретения практических навыков работы с современными электронно-вычислительными и программными средствами, алгоритмами и компью- терными методами поиска, использования, хранения и обработки информации. Часть 1 вышла в БНТУ в 2009 году. УДК 004(075.8) ББК 32.97.7 ISBN 978-985-550-251-8 (Ч. 2) © Белорусский национальный ISBN 978-985-525-213-0 технический университет, 2013 И74 3 Лабораторная работа № 1 МАТРИЧНОЕ ИСЧИСЛЕНИЕ: ДЕЙСТВИЯ НАД МАТРИЦАМИ Матрица – математический объект, записываемый в виде пря- моугольной таблицы элементов (например, целых, действительных или комплексных чисел), которая представляет собой совокупность строк и столбцов, на пересечении которых находятся ее элементы. Количество строк и столбцов матрицы задают размер матрицы. Для матрицы определены следующие алгебраические операции:  сложение матриц, имеющих один и тот же размер;  умножение матриц соответствующего размера (матрицу, имеющую n столбцов, можно умножить справа на матрицу, имею- щую n строк);  умножение на матрицу вектора (по обычному правилу мат- ричного умножения; вектор является частным случаем матрицы);  умножение матрицы на число. Также выполняют элементарные преобразования матрицы:  умножение какой-нибудь строки (столбца) на отличное от ну- ля число;  прибавление к какой-нибудь строке (столбцу) другой ее стро- ки (столбца), умноженной на произвольное число;  перестановку местами любых двух строк (столбцов). Сложение матриц. Суммой матриц А = (aij) и B = (bij) одинако- вых размеров называется матрица С = (Сij) тех же размеров, у кото- рой ijijij baC  . Обозначение: C = А + В. Вычитание матриц. А – В = А + (–В). Умножение матрицы на число. Произведением матрицы А = (aij) на число b называется матрица С = (Сij) тех же размеров, у которой ijij bac  . Обозначение: bAC  . Умножение матриц. Произведением матрицы А = (aik) раз- мером m × n на матрицу B = (bik) размером n × p назвается матрица С = (Сij) размером m × p, у которой 4    n k kjiknjinjijiij babababac 1 2211 ... . Обозначение: C = AB. Для матриц А и B, где BAAB  . Транспонирование матиц. Если          mnnn n n aaa aaa aaa A ... ............ ... ... 21 22121 11211 , то транспонированная матрица          mnnn m m r aaa aaa aaa A ... ............ ... ... 21 22212 12111 . В программировании матрица представляет собой двумерный массив. 1.1. Операции над векторами Цель работы: изучить способы описания одномерных массивов (векторов) и приемы работы с ними. Матрица, состоящая из одной строки или одного столбца, назы- вается соответственно вектор-строкой или вектор-столбцом. Век- тор-столбцы и вектор-строки называют просто векторами: ]...[ 11211 naaa – матрица-строка; 5         1 21 11 ... ma a a – матрица-столбец. В программировании вектор – это одномерный массив. Чтобы использовать массив в программе на языке Паскаль, требуется оп- ределить параметры массива и описать переменную-массив. Описа- ние типа массива задается следующим образом: <имя массива> = array [тип индексов] of [тип элементов массива]; Тип индексов массива заключается в квадратные скобки после служебного слова array, а тип элементов (компонентов) массива за- дается после служебного слова of. Для типа индексов обычно ис- пользуют тип-диапазон, который определяет границы изменения индексов. Ниже приведены примеры описания одномерных массивов: var f :array[1..20] of integer; mas:array[0..50] of word;; а:array[-7..7] of real; dis:array[1..30] of byte; Как и тип-диапазон, перечисляемый и структурированные типы можно, а иногда необходимо объявлять в разделе описания типов (например, при описании формальных параметров в подпрограм- мах), который начинается с ключевого слова type: type mas1 = array[1..20] of real; mas2 = array[0..40] of byte; var a:mas1; b,c:mas2; 6 В разделе описания типов с типом сопоставляется некоторое имя и в дальнейшем вместо явного указания типа можно использовать введенный для данного типа идентификатор. Имя типа обозначает- ся идентификатором, а сам тип описывается согласно определен- ным для него правилам. Чаще всего в реальных задачах индексы изменяются от 1. В этом случае индекс элемента совпадает с его порядковым номером. Раз- мерность массива – величина произвольная, однако суммарная дли- на любого массива не может быть больше 65520 байт. Если количе- ство элементов массива неизвестно, то этой величиной можно за- даться через раздел описания констант: Const N = 5; Var x, y : array [1..N*10] of real; z : array [1..N, 1..N*2] of integer; Обращение к элементам массива осуществляется по их индек- сам, т.е. при упоминании в программе любого элемента массива сразу за именем массива должен следовать индекс элемента в квад- ратных скобках, например: f[1]:=0; mas[100]:=555. Ввод/вывод одномерных массивов Определение значений элементов массивов может быть произве- дено различными способами: с использованием клавиатуры, фай- лов, оператора присваивания. Способ задания элементов массива с использованием оператора присваивания: Begin В[1]:=1.6; В[2]:=18.1; В[3]:=0.04; или 7 Const А : array [1..3] of real = ( 1.6, 18.1,0.04); Ввод массива поэлементно с клавиатуры осуществляется с по- мощью оператора ввода read: begin read(B[1]); read(B[2]); ... Недостаток описанных способов – громоздкость программного кода. Так как операции ввода/вывода относятся к алгоритмам после- довательной обработки элементов массива, чаще всего использует- ся организация ввода с помощью операторов цикла: for i:=1 to 5 do begin write(‘введите А(‘ , i ’)=’); readln( А[i] ); end; При использовании в программе такого способа ввода элементов массива будет необходимо пять раз, по мере остановки программы и запроса вводимого элемента, набирать значения элементов масси- ва и нажимать клавишу Enter. Примеры обработки одномерных массивов При обработке одномерных массивов чаще всего возникают та- кие задачи, как нахождение суммы элементов массива, произведе- ния, среднего значения, поиск заданного элемента массива, сорти- ровка элементов массива, ввод и вывод элементов массива и т.д. Пример 1. формирования элементов массива с помощью датчи- ка случайных чисел, вычисление максимального значения и суммы всех элементов массива, вывод элементов массива и результатов вычислений на экран, приведен ниже. 8 program primer1; const k=100; {максимальный размер массива} type mas = array[1..k] of integer; var a:mas; n,s:integer; i: integer; {индекс элемента массива} max:integer; {индекс максимального элемента} begin writeln('Введите число элементов массива:'); read(n); randomize; {инициализация датчика случайных чисел} for i:=1 to n do A[i]:=random(10); {формирование массива с помощью датчика случайных чисел} writeln(' массив А[i]'); for i:=1 to n do write (A[i]:5); writeln; s:=0; {нахождение суммы } for i:=1 to n do s:=s+A[i]; writeln('s=',s); max:=A[1]; {предполагаем, что первый элемент максимальный} for i:=1 to n do if A[i]>max then max:= A[i]; writeln('максимальный элемент массива =',max); end. Логику вычислительного процесса удобно представлять в виде алгоритмов. Наиболее наглядным является графический способ (в виде блок-схемы) описания алгоритмов, когда каждое действие в программе описывается условным графическим обозначением (символом). В блок-схеме символы располагаются в определенной последовательности и соединяются линиями связи. Внутри симво- лов в произвольной форме делаются поясняющие записи. Основ- ным направлением линий связи являются сверху вниз и слева на- право. Если направление линии совпадает с основным направлени- ем блок-схемы, то стрелка на ней не проставляется. Элементы блок- схемы могут иметь нумерацию, которая расставляется в соответст- вии с основными направлениями линий. Линии связи элементов 9 блок-схемы, как правило, не должны иметь пересечений. Если не- обходимо пересечь линии связи элементов блок-схемы, их разры- вают, а в концах разрыва проставляют соединители с указанием но- мера символа, к которому направлена данная линия. При больших размерах блок-схемы ее располагают на нескольких листах. В этом случае на концах разрыва линий связи проставляют межстраничные соединители. Символы блок-схем (алгоритмов) Логическое начало или логический конец алгоритма Вычислительный процесс Подпрограмма Ввод-вывод данных Выбор, развилка, условие Начало цикла Конец цикла Соединители Межстраничный соединитель Алгоритм, содержащий хотя бы одно условие, называется раз- ветвляющимся вычислительным процессом. В зависимости от ус- ловия будет выполняться та или другая последовательность дейст- вий, называемых ветвями алгоритма. Количество ветвей и условий в алгоритмах не ограничено. 10 На рисунке 1 представлена блок-схема (алгоритм) описанной в примере задачи. Рисунок 1 – Блок-схема (алгоритм) задачи ввод n вывод сообщения вывод сообщения начало цикла конец цикла A[i]=случ.число начало вывод A[i] начало цикла конец цикла сброс курсора на след.строку к 10 2 1 3 4 5 6 7 8 9 11 Рисунок 1 (окончание) Пример 2. Сортировка элементов одномерного массива в поряд- ке возрастания. Суть сортировки состоит в том, что сравниваются соседние элементы и находится минимальный элемент массива, ко- торый определяется первым элементом массива. Далее находят сле- дующий минимальный элемент, так же его выставляют вслед за первым элементом и так далее. конец цикла s:= s + A[i] вывод s s = 0 max = A[1] начало цикла начало цикла конец цикла A[i] > max нет да max = A[i] вывод max конец от 9 10 11 12 13 14 15 16 17 18 19 12 program primer2; const k=100; {максимальный размер массива} type mas = array[1..k] of real; var C:mas; i,j:integer; {индекс элемента массива} n:integer; {число элементов массива} x:real; {дополнительная переменная для пеpестановки местами двух элементов массива} begin writeln('Введите число элементов массива:'); read(n); {ввод массива} for i:=1 to n do begin write ('Введите ',i,'-й элемент массива:'); read(C[i]) end; writeln('исходный массив'); for i:=1 to n do write (C[i]:5); writeln; {соpтиpовка элементов массива } for i:=1 to n-1 do for j:=i+1 to n do if С[i]>С[j] then {сравниваем два соседних элемента} begin {меняем местами соседние элементы} х:=С[i]; С[i]:=С[j]; С[j]:=х; end; writeln(' массив после сортировки:'); for i:=1 to n do write (С[i]:5:2); writeln; end. 13 Задания для самостоятельной работы 1. Составить алгоритм и программу вывода на экран максималь- ного элемента одномерного массива размерностью N и номера, под которым он находится. Значение N не должно превышать 30. 2. Составить алгоритм и программу сортировки по возрастанию и убыванию одномерного массива данных, состоящего из 50 чисел, выбранных произвольно. Организовать вывод результата на экран. 3. Составить алгоритм и программу вывода на экран максималь- ного и минимального значений одномерного массива, состоящий из 10 элементов, выбранных произвольным образом. Поменять места- ми значения 1-го и 5-го элементов и вывести результат на экран. 4. Дан одномерный массив, состоящий из 30 элементов, выбран- ных произвольным образом. Определить, есть ли в массиве два одинаковых элемента и вывести их номера на экран. 5. Составить алгоритм и программу вывода на экран одномерно- го массива данных до и после преобразования, состоящий из 25 элементов, выбранных произвольным образом. Заменить все четные элементы их квадратами, а нечетные удвоить. 6. Составить алгоритм и программу вывода на экран одномерно- го массива, состоящий из 20 элементов, выбранных произвольным образом из интервала (0; 55). Найти сумму элементов массива, при- надлежащих промежутку от 20 до 30. Вывести результат на экран. 7. Составить алгоритм и программу вывода на экран суммы не- четных элементов одномерного массива данных, состоящего из N элементов, выбранных произвольным образом. 8. Составить алгоритм и программу поиска среднего арифмети- ческое значения элементов массива, состоящего из N чисел. Эле- менты массива вводятся с клавиатуры. 1.2. Операции над матрицами Цель работы: изучить способы описания двумерных массивов данных (матриц) и приемы работы с ними. Двумерные массивы имеют аналогию с таким понятием в мате- матике как матрица. В языке Паскаль двумерный массив – это мас- сив, элементами которого являются одномерные массивы: 14 С: array[1..n] of array[1..m] of real; или С: array[1..n,1..m] of real; Как правило, пользуются вторым способом описания массива, где n – количество строк, m – количество столбцов матрицы. Чаще в качестве идентификатора номера строки используют символ i, а столбца – j. Тогда к элементу массива, описанному выше, можно обратиться по имени С[i,j]. Примеры описания двумерных массивов и обращения к их эле- ментам: type mas1=array[1..n] of real; mas2=array[1..7,1..9] of integer; var x:array[1..5] of mas1; mass:array[0..20,1..40] of byte; c:mas2; asd:array[1..20,1..10] of integer; begin x[1,1]:=12.1; mass[0,1]:=5; c[4,6]:=34; asd[1,8]:=0; При обработке матриц следует учитывать особенности работы вложенных циклов. Она отличается тем, что на каждый шаг внеш- него цикла внутренний цикл производит полное число шагов. На- пример: Var i,j: byte; c:array[1..3,1..5]of real; begin for i:=1 to 3 do begin for j:=1 to 5 do begin 15 c [i,j] := cos( X[i,j] ); end end; ………… После того, как внешний цикл сделает первый шаг (переменная i примет значение 1), во внутреннем цикле переменная j пробежит все положенные ей значения от 1 до 5. Когда внутренний цикл за- вершится, во внешнем цикле переменная i изменится на шаг, т.е. примет значение 2. После чего внутренний цикл начнет работать сначала, т.е. j изменится от 1 до 5 и т.д. Ввод/вывод двумерных массивов Ввод данных в простейших случаях может осуществляться теми же способами, как и в случае одномерных массивов данных: – присваиванием: Begin С[1,1]:=5.7; С[1,2]:=2.5; .... – через раздел описания констант (значения элементов по каж- дому отдельному измерению (строки или столбцы) отделяются друг от друга дополнительными скобками: Const С: array [1..2,1..2] оf real = ( ( 1.3, 3.7 ) , ( 4.0, 1.1 )); В приведенном примере значения элементов матрицы распола- гаются в следующем порядке: (( С[1,1], С[1,2] ), ( С[2,1], С[2,2] )), т.е. по строкам; – с помощью операторов ввода и циклов: for i:=1 to 3 do for j:=1 to 5 do begin write(‘введите C[‘ , i, ’ ‘ ,j, ’]=’); readln( C[i,j] ); end; 16 Примеры обработки двумерных массивов При обработке двумерных массивов возникают такие же задачи, как и при обработке одномерных массивов: нахождение суммы элементов массива, произведения, среднего значения, поиск неко- торого элемента в массиве, ввод и вывод элементов массива и т.д. Пример 1. Формирование элементов массива с помощью датчи- ка случайных чисел, вывод массива на экран, вычисление суммы всех элементов матрицы. program primer3; const n1=50; n2=50; type mas = array[1..n1,1..n2] of integer; var C:mas; i, j, n, sum, m : integer; begin writeln('Введите число стpок и столбцов массива:'); read(n,m); randomize; for i:=1 to n do for j:=1 to m do C[i,j]:=random(20); writeln('полученный массив'); for i:=1 to n do begin for j:=1 to m do write (С[i,j]:5); writeln; end; sum:=0; for i:=1 to n do for j:=1 to m do sum:=sum+C[i,j]; writeln('sum=',sum); end. Пример 2. Выполнить действия над матрицами А и В: А × В + 2В, где 17          77.4837.709.017.0 82.1253.1876.053.0 19.1456.1480.718.0 01.1297.171.398.0 A ,          64.09 43.67 5.40 3.24 В . Задачу необходимо решить: 2.1. с использованием пакета MS Excel; 2.2. с использованием средств программирования Паскаль. Задание 2.1. Введем исходные данные на рабочий лист MS Excel (рисунок 2). Рисунок 2 – Рабочее окно MS Excel: действия над матрицами Для умножения матрицы А на матрицу В, выделим диапазон В9:В12 и воспользуемся функцией МУМНОЖ(В1:Е4;G1:G4). Умножение (деление) матрицы на число можно выполнить при помощи элементарных операций. В нашем случае необходимо ум- ножить матрицу из диапазона G1:G4 на число 2. Выделим ячейки 18 G9:G12 и введем формулу =2*G1:G4. Сложение матриц выполня- ется аналогично. Выделим диапазон D16:D19 и введем формул =B9:B12+G9:G12. Для получения результата в обоих случаях необходимо нажать комбинацию клавиш Ctrl+Shift+Enter. Кроме того, в строке фор- мул рабочего листа, изображенного на рисунке 2, показано как можно вычислить матрицу С одним выражением. Задание 2.2. program matrica; uses crt; const n=1; m=4; a: array[1..m,1..m] of real = ( ( 0.98, 3.71, 1.97, 12.01), ( 0.18, 7.80, 14.56, 14.19), ( 0.53, 0.76, 18.53, 12.82), (0.17, 0.09, 7.37, 48.77)); b: array[1..m,1..n] of real = ((3.24),(5.40), (43.67), (64.09)); var i,j,k:integer; c: array[1..m,1..n] of real; Begin clrscr; {Вычисление значений элементов матрицы C} for i:=1 to m do for j:=1 to n do begin с[i,j ]:=0; for k:=1 to m do c[i, j] :=c[i, j]+a[i,k]*b[k, j]; c[i,j]:=c[i,j]+2*b[i,j]; end; {Вывод на экран матрицы С} writeln('Матрица C:'); for i:=1 to m do begin for j:=1 to n do write(c[i,j] : 7:2); writeln; end; End. 19 Задания для самостоятельной работы 1. Составить алгоритм и программу вывода на экран матрицы 10×10. Элементы матрицы на главной диагонали равны единице, остальные – нулю. 2. Составить алгоритм и программу поиска одномерного массива B, состоящего из суммы элементов каждой строки матрицы A(7; 9). Найти максимальный элемент матрицы A в 6-й строке. Заменить последний элемент в 4-й строке матрицы A на найденный макси- мальный элемент. Организовать вывод результата на экран. 3. Составить алгоритм и программу поиска наименьшего эле- мента двумерного массива и номер строки, в которой он находится. Массив состоит из целых чисел, элементы которого вводятся с кла- виатуры. Размер массива m  n представлен в таблице 1. Таблица 1 № варианта 1 2 3 4 5 6 7 8 9 10 m 2 6 3 5 7 3 9 3 7 9 n 6 5 10 5 5 8 3 6 4 8 4. Составить алгоритм и программу поиска суммы элементов главной диагонали матрицы А(m  n), элементы которой задаются датчиком случайных чисел на интервале [–25; 39]. Размер массива определяется согласно данным, представленным в таблице 1. 5. Составить алгоритм и программу поиска номера столбца мас- сива размером n  m, в котором находится наибольшее количество элементов, кратных 2. Элементы задаются датчиком случайных чи- сел на интервале [–20; 30]. Размер массива определяется согласно данным, представленным в таблице 1. 6. Составить алгоритм и программу вывода на экран матрицу размером А (n  m), в которой необходимо поменять местами стро- ку, содержащую элемент с наибольшим значением, со строкой, со- держащей элемент с наименьшим значением. 7. Составить алгоритм и программу вывода на экран матрицы А (n  m), разницы между максимальным и минимальным элемене- том этой матрицы. Принять, что 3jiаij  ; i = 1, 2, … m; j = 1 ,2, ... n. Данные для решения задачи представлены в таблице 1. 20 8. Составить алгоритм и программу поиска среднего арифмети- ческого, максимального и минимального значений элементов мат- рицы А(m  n). Элементы задаются датчиком случайных чисел на интервале [20; 99]. Размер массива определяется согласно данным, представленным в таблице 1. 9. Составить алгоритм и программу вычисления транспониро- ванной матрицы АТ (n × n). Элементами матрицы А(n × n) являются случайные числа. 10. Составить алгоритм и программу расчета элементов матри- цы С: С = А(m  n) + B(m  n), где ijа , ijb – элементы матрицы А и В, такие что 2jiаij  ; 3)( jibij  ; i = 1, 2, … m; j = 1, 2, ... n. Организовать вывод на экран максимального и минимального зна- чений элементов матрицы С. Данные для решения задачи представ- лены в таблице 1. 11. Составить алгоритм и программу расчета элементов матри- цы С: С = А(m  n) · B(n  m), где ijа , ijb – элементы матрицы А и В, такие что 3jiаij  ; 52 )( jibij  ; i = 1, 2, … m; j = 1, 2, ... n. Ор- ганизовать вывод на экран максимального и минимального значе- ний элементов матрицы С. Данные для решения задачи представле- ны в таблице 1. 21 Лабораторная работа № 2 РЕШЕНИЕ СИСТЕМ ЛИНЕЙНЫХ УРАВНЕНИЙ СРЕДСТВАМИ МАТРИЧНОГО ИСЧИСЛЕНИЯ Цель работы: освоение практических навыков решения систем линейных уравнений средствами матричного исчисления. Рассмотрим систему n линейных уравнений с n неизвестными:       nnnnnn nn nn bxaxaxa bxaxaxa bxaxaxa ... ... ... 2211 22222121 11212111 ; матрица А, составленная из коэффициентов при неизвестных:            nnnn n n aaa aaa aaa A ... ............ ... ... 21 22221 11211 ; матрица B, составленная из свободных членов:          nb b b B ... 2 1 ; матрицу Х называют матрицей-столбцом из неизвестных: 22          nx x x X ... 2 1 . Тогда всю систему линейных уравнений можно записать так: AX = B, где A имеет смысл таблицы коэффициентов aij системы линейных уравнений. Матрица A называется основной матрицей. Матрица A со столб- цом B – расширенной. Если матрица А системы невырожденная, т.е. существу- ет обратная матрица A–1, т.е. решение системы линейных уравнений можно найти по формуле X = A–1B. Справочно. Единичная матрица:          1...00 ............ 0...10 0...01 E Матрица A–1 – обратная для матрицы A, если AA–1 = A–1A = E. Для квадратной матрицы A обратная существует тогда и только тогда, когда ее оределитель не равен 0 ( 0det A ).            nnnn n n AAA AAA AAA A A ... ............ ... ... det 1 21 22212 12111 1 , где Aij – алгебраические дополнения элементов aij матрицы A. 23 Пример. Необходимо найти решение неоднородной системы линейных уравнений методом определения обратной матрицы с ис- пользованием пакета MS Excel:        09.6477.4837.709.017.0 67.4382.1253.1876.053.0 40.519.1456.1480.718.0 24.301.1297.171.398.0 4321 4321 4321 4321 xxxx xxxx xxxx xxxx . Эту систему можно представить в матричном виде: АХ = B, где          77.4837.709.017.0 82.1253.1876.053.0 19.1456.1480.718.0 01.1297.171.398.0 A – матрица коэффициентов сис- темы уравнений;          4 3 2 1 x x x x X – вектор неизвестных уравнений;          64.09 43.67 5.40 3.24 B – вектор правых частей уравнений. Введем матрицу А и вектор B в рабочий лист MS Excel (рисунок 3). Матрица А находится в ячейках В1:Е4, а вектор B в диапазоне G1:G4. Для решения системы методом обратной матрицы необходимо вычислить матрицу, обратную к А. Для этого выделим ячейки для хра- нения обратной матрицы (В6:Е9) и введем функцию МОБР(В1:Е4), а затем одновременно нажмем клавиши Ctrl+Shift+Enter. Рабочая кни- га MS Excel примет вид изображенный на рисунке 4. 24 Рисунок 3 – Матрица А и вектор B в рабочем листе MS Excel Рисунок 4 – Рабочее окно MS Excel: получение обратной матрицы Теперь необходимо умножить полученную обратную матрицу на вектор B. Выделим ячейки для хранения результирующего вектора, например Н6:Н9, и введем функцию МУМНОЖ(В6:Е9;С1:С4), а затем одновременно нажмем клавиши Ctrl + Shift + Enter. Для того чтобы проверить, правильно ли решена система урав- нений, необходимо умножить матрицу А на вектор х и получить в результате вектор B. Умножение матрицы А на вектор х (рисунок 5) осуществляется при помощи функции МУМНОЖ(В1:Е4;Н6:Н9). 25 Рисунок 5 – Рабочее окно MS Excel: проверка правильности решения системы уравнений Задание для самостоятельной работы Найти решение неоднородной системы линейных уравнений ме- тодом определения обратной матрицы с использованием встроен- ных функций пакета MS Excel и данных, определяемых вариантом:       nnnnnn nn nn bxaxaxa bxaxaxa bxaxaxa ... ... ... ... 2211 22222121 11212111 . Значения элементов матриц А и В в соответствии с заданным ва- риантом: № 1 № 6 A B A B 0.81 7.28 18.05 46.95 91.41 0.12 8.84 4.08 25.39 41.17 0.48 6.95 12.65 33.43 83.58 0.92 8.94 18.14 10.81 42.02 0.23 6.69 5.31 46.66 81.30 0.40 2.01 19.54 8.83 14.89 0.46 9.71 16.01 7.15 51.48 0.68 1.73 9.31 13.02 99.42 26 № 2 № 7 A B A B 0.76 8.13 18.84 12.91 38.06 0.08 2.44 5.10 28.91 21.16 0.57 2.27 17.95 21.78 35.92 0.53 6.76 3.41 13.17 19.45 0.43 2.82 7.75 1.33 82.97 0.25 8.94 11.25 30.65 33.63 0.09 4.27 5.49 36.13 32.68 0.21 0.39 3.28 26.87 52.49 № 3 № 8 A B A B 0.39 9.44 19.53 0.46 95.49 0.18 4.65 5.12 8.76 57.30 0.41 4.95 16.39 35.89 29.20 0.85 1.13 5.89 30.98 27.17 0.05 1.61 8.47 27.73 1.75 0.55 7.66 1.97 45.95 68.87 0.16 6.90 7.51 22.49 66.16 0.73 2.47 2.82 26.84 1.10 № 4 № 9 A B A B 0.73 9.75 11.34 4.01 10.59 0.68 2.93 18.15 11.21 96.89 0.73 8.72 11.64 35.30 91.69 0.81 8.12 0.94 33.96 78.81 0.26 5.53 9.71 27.47 97.29 0.77 2.11 8.11 29.90 67.05 0.81 7.64 11.75 47.85 24.17 0.84 9.20 1.59 37.86 54.94 № 5 № 10 A B A B 0.55 9.40 7.26 5.73 61.13 0.49 1.38 10.53 13.43 26.51 0.01 7.77 11.83 27.66 96.75 0.82 2.93 3.29 41.30 62.38 0.31 0.86 2.56 14.58 6.18 0.51 4.87 8.81 6.29 4.67 0.66 5.69 14.53 8.38 5.15 0.91 4.56 2.65 5.44 42.36 27 Лабораторная работа № 3 РАБОТА С ФАЙЛАМИ В ПАСКАЛЕ Цель работы: изучить стандартные подпрограммы языка Пас- каль для работы с файлами. Файл – совокупность данных, записанных во внешней памяти под определенным именем. Целесообразность применения файлов диктуется следующими причинами: – размещение большого объема информации, которая может быть подготовлена заранее и применяться неоднократно; – файл данных может быть подготовлен другой программой; – программа, использующая данные из файла, не требует при- сутствия пользователя в момент фактического исполнения. Для работы с файлами в программе необходимо определить фай- ловую переменную, которую можно описать следующим образом: type < имя > = file of < тип >; < имя > = text; < имя > = file; где <имя> – имя файлового типа или файловой переменной; file, of, text – ключевые слова (в переводе с англ.: файл, из, текст); < тип > – любой тип языка Паскаль, кроме файлового. В зависимости от способа описания можно выделить текстовые (text) файлы, двоичные или типизированные (file of) и нетипизированные (file). Вид файла определяет способ хранения информации в файле. Текстовые файлы представляют собой совокупность строк пере- менной длины с последовательным доступом к данным. Информация в текстовых файлах хранится в символьном виде. Логически после- довательный файл можно представить как именованную цепочку бай- тов, имеющую начало и конец. Последовательный файл отличается от файлов с другой организацией тем, что чтение/запись из файла или в файл ведутся байт за байтом от начала к концу. Рассмотрим основные процедуры и функции для работы с текстовыми файлами. 28 Процедуры assign (F, name) – связь файловой переменной F с внешним фай- лом с именем name типа string. reset (F) – открытие для чтения существующего файла с именем, определенным процедурой assign. При выполнении этой процедуры файл подготавливается к чтению: внутренняя (указатель файла) ус- танавливается на начало файла (на его первую компоненту). rewrite(F) – открытие нового пустого файла для записи с име- нем, определенным процедурой assign. Если в файле уже была ин- формации, процедура удаляет ее (очищает файл) и устанавливает указатель файла на первую компоненту. read(F,<список ввода>) – чтение информации из файла F. readln(F,<список ввода>) – чтение информации из файла с ука- занием признака конца строки. write(F,< список ввода>) – запись информации в файл F. writeln(F,< список ввода >) – запись информации в файл с пере- ходом на новую строку. close(F) – закрытие открытого файла. erase(F) – уничтожение внешнего файла, с которым была связана файловая переменная F. mkdir(Path) – создание каталога, для которого указан путь пара- метром Path. append(F) – открытие файла для добавления в конец его информации. rename(F, newname) – переименование внешнего файла, с кото- рым связана файловая переменная, на имя, заданное параметром newname типа string. rmdir(Path) – удаление пустого каталога, для которого указан путь параметром Path типа string. Seek (F,Num) – устанавливает указатель открытого файла на компоненту файла с номером Num типа Longint. F – любая файло- вая переменная, кроме типа Text. Функции eof(F): Boolean – функция определения конца файла. Принимает значение True, если указатель находится за последней компонентой файла. В противном случае принимает значение False. filesize(F): Longint – возвращает текущий размер файла в компо- нентах. F – любая файловая переменная, кроме типа Text. 29 Filepos(F): Longint – возвращает номер текущей компоненты файла. F – любая файловая переменная, кроме типа Text. ioresult – результат последней операции ввода-вывода. Принима- ет значение 0, если ввод-вывод проведен успешно, другое число – в противном случае. eoln(F) – поиск конца строки файла. seekeof(F) – поиск конца файла. При работе со строковыми данными необходимо указывать дли- ну переменной типа String в операторе описания типов переменных: var s: array[1..10] of string[12]; Пример. Прочитать из файла A.dat значения элементов матрицы Аij (3×3) и записать ее диагональные элементы в файл B.dat в столбец. Program Matr; var a:array[1..3,1..3] of real; {массив (3×3) с переменными вещественного типа} i,j:integer; {пеpеменные целого типа} f1,f2:text; {файловые пеpеменные} Begin Assign(f1,’a.dat’); {связь переменной f1 с файлом a.dat} Reset(f1); {открытие файла для чтения} for i:=1 to 3 do begin for j:=1 to 3 do read(f1,a[i,j]); {считывание из файла f1 элементов строки массива a} readln(f1); {сброс курсора на следующую строку в файле f1} end; Close(f1); {закрытие файла f1} Assign(f2,’b.dat’); {связь переменной f2 с файлом b.dat} Rewrite(f2); {открытие нового файла f2} for i:=1 to 3 do for j:=1 to 3 do if i=j then writeln(f2,a[i,j]); {запись диагональных элеметов массива a[i,j] в файл b.dat} 30 Close(f2); {закрытие файла f2} End. Задания для самостоятельной работы 1. Составить программу формирования файла типа txt, состояще- го из целых чисел. 2. Составить программу, в которой осуществляется ввод строки информации с клавиатуры и сохранение ее в текстовый файл с рас- ширением .txt. 3. Составить программу, которая формирует файл, состоящий из 5 значений типа integer. Прочитайте файл и вычислите сумму его элементов. 4. Составить программу, которая формирует файл, состоящий из неопределенного количества значений типа integer. Для ввода ис- пользуйте цикл, выход из цикла – значение 999. После записи выве- дите файл на экран. 5. Составить программу, которая создает файл, состоящий из 10 значений типа real. Вывести содержимое файла на экран. 6. Составить программу, которая создает файл, состоящий из N значений типа integer. Прочитать информацию из файла и вывести на экран только четные элементы. 7. Составить программу, реализующую следующую последова- тельность действий с файлами текстового формата a1.txt и a2.txt: – чтение информации из файла a1.txt и запись в файл a2.txt (по- строчно); – уничтожение файла a1.txt. 8. Составить программу, реализующую следующую последова- тельность действий с файлами b1.txt и b2.txt: – чтение информации из файла b1.txt и запись в файл b3.rtf (по- строчно); – чтение информации из файла b2.txt и запись в файл b3.rtf (по- строчно); – переименование файла b1.txt в b1.rtf и файла b2.txt в b2.rtf. Файлы b1.txt, b2.txt, b1.rtf, b2.rtf, b3.rtf – текстового формата. 9. Рассчитать значения функции Y = sin2(x) при изменении аргу- мента х с шагом 0,05 в диапазоне от 0 до 3. Записать в файл F1.txt 31 значения х и y. Затем считать из файла F1.txt значения х и y и вывес- ти их на экран. 10. Составить программу сортировки по возрастанию и убыва- нию одномерного массива данных, состоящего из 50 чисел, вы- бранных произвольно. Организовать вывод результатов на экран и записать полученные массивы в два текстовых файла. 32 Лабораторная работа № 4 РАБОТА С ЗАПИСЯМИ В ПАСКАЛЕ Цель работы: освоение правил работы с записями в Паскале. Запись – это структурированный тип данных, состоящий из фик- сированного числа логически связанных компонентов одного или нескольких типов. Описание записи в Паскале осуществляется с помощью служеб- ного слова Record, вслед за которым описываются компоненты за- писи. Завершается описание служебным словом end. Компоненты записи (поля записи) определяются именем, вслед за которым через двоеточие указывается тип этого поля. В отличие от массива, ком- поненты записи могут быть различного типа. type Car = record Nomer:integer; {номер автомобиля } Marka:string[20]; {марка автомобиля} fio:string[40]; {фамилия, инициалы владельца} Adres:string[60] {адрес владельца} end; В данном примере запись Car содержит четыре компонента: но- мер, название марки машины, фамилию владельца и его адрес. Дос- туп к полям записи осуществляется через переменную типа «запись». Описание записей возможно и без использования имени типа, например: var Car = record Nomer:integer; Marka:string[20]; fio:string[40]; Adres:string[60] end; Обращение к записи в целом допускается только в операторах присваивания, где слева и справа от знака присваивания использу- ются имена записей одинакового типа. Во всех остальных случаях 33 оперируют отдельными полями записей. Чтобы обратиться к от- дельной компоненте записи, необходимо указать имя записи и через точку указать имя нужного поля, например car.fio. Компонентой записи может быть запись (подзапись), в таком случае составное имя будет содержать не два, а большее количество имен. Пример. Составить программу записи в файл списка студентов группы с указанием их фамилии и года рождения, вывода содержи- мого файла на экран. Исходные данные: Program Spisok; {заголовок программы} Type spis=record {описание структуры записи} fio:String [10]; {поле фамилии на 10 символов} gr:integer; {поле года рождения} end; Var f:file of spis; {файловая переменная} b:spis; {переменная типа записи} i,n:integer; {переменные для циклов} Begin {начало операторной части программы} Assign(f,'sp.doc'); {привязка файловой переменной к файлу 'sp.doc’} Rewrite(f); {открытие файла с именем 'sp.doc’ для записи} Write('Введите число студентов в группе); Readln(n); {ввод количества строк} Write('Введите ФИО и год рождения студентов'); For i:=1 to n do {цикл для ввода данных} begin read(b.fio); {ввод фамилии} readln(b.gr); {ввод года рождения} write(f,b); {сохранение записи в файл} end; {конец цикла} 34 Close(f); {закрытие файла} i:=1; {установка значения счетчика цикла на начало} writeln; {указатель на начало новой строки} writeln ('-------------------------------'); writeln (' № | ФИО | ГОД РОЖДЕНИЯ'); writeln ('-------------------------------'); Reset(f); {открытие файла для чтения} While not eof (f) do {цикл с предусловием определения конца файла} begin read(f,b); {чтение записи из файла} writeln(i:2,' |', b.fio:10,' | ',b.gr); {вывод полей записи на экран} writeln ('-------------------------------'); i:=i+1; {увеличение значения счетчика для вывода номера строки} end; {конец цикла} writeln ('-------------------------------'); Writeln('конец '); {вывод сообщения} End. {конец программы} Задания для самостоятельной работы 1. Составить программу сохранения в файл информации о сту- дентах группы, используя запись со следующей структурой: Произвести чтение информации из файла и вывести ее на экран. 2. Составить программу, реализующую следующую последова- тельность действий с файлом Com.zap: Студент ФИО Дата рождения день месяц год Адрес Пол город улица дом 35 – ввод с клавиатуры двух вещественных чисел и двух значений пе- ременных строкового типа и запись этой информации в файл Com.zap; – чтение этой информации из файла Com.zap и вывод ее на экран. Компонентами файла являются записи, состоящие из пары веще- ственных чисел и пары значений переменных строкового типа: Type ComZap=record r1, r2:real; s1, s2:string; end; 3. Описать запись с именем типа Kart, содержащую следующие поля: – номер измерения (тип integer); – значение (тип real). Переменная, определяющая запись, называется Z. 4. Описать запись с именем texn, содержащую информацию о хранящемся на складе техники: – код техники (тип integer); – наименование техники (тип string); – цену (тип real). Переменная, определяющая запись, имеет название Tovar. 5. Описать запись с именем типа Sportsmeni, содержащую ин- формацию о лучших спортивных достижениях студентов: – название вида (тип string); – фамилия рекордсмена (тип string); – дата установления рекорда (запись Dat, состоящая из полей God, Mes, Den); – сообщение о результате (real). 36 Лабораторная работа № 5 ПОДПРОГРАММЫ: ПРОЦЕДУРЫ И ФУНКЦИИ В ПАСКАЛЕ Цель работы: освоение правил работы с подпрограммами в Паскале. При создании программ часто требуется выполнять одну и ту же последовательность действий на различных этапах обработки ин- формации. В этих задачах в различных частях встречаются фраг- менты, одинаковые по выполняемым действиями, различающихся только в значениях исходных данных. Повторяющаяся группа опе- раторов оформляется в виде самостоятельной программной струк- туры – подпрограммы. Таким образом, подпрограмма – это само- стоятельная часть программы, реализующая определенный алго- ритм и допускающая обращение к ней из различных частей основной программы или других подпрограмм. В языке Pascal под- программы реализуются в виде процедур и функций. Все параметры, которые использует подпрограмма, можно раз- бить на две категории: локальные параметры, используемые только подпрограммой, и глобальные параметры, которые объявляются в основной программе и являются доступными как самой программе, так и всем ее подпрограммам. Также следует различать формальные и фактические параметры. Формальные параметры определяются в заголовке подпрограммы в виде списка. При обращении к подпро- грамме формальные параметры заменяются на соответствующие фактические параметры. 5.1. Процедуры Процедуры объявляются в описательной части программы. Лю- бая процедура состоит, аналогично программе, из заголовка проце- дуры и тела процедуры. Заголовок процедуры состоит из служебно- го слова Procedure, имени процедуры и списка параметров. Формат описания процедуры выглядит следующим образом: 37 procedure <имя процедуры>(<список формальных параметров>); {раздел описания локальных параметров процедуры, например, кон- стант, типов, меток, переменных} Begin {тело процекдуры} <оператор 1>; <оператор 2>; ……………… End; Пример. Процедура поиска суммы чисел: procedure Sum ( a,b : Real; Var s : Real); {имя процедуры и список формальных параметров} Begin {начало процедуры} s := a + b ; {суммирование чисел} End; {конец процедуры} В данном примере переменные a и b являются исходными дан- ными для подпрограммы, s – результатом. Поэтому перед s в описа- нии параметров подпрограммы стоит слово Var. Вызов такой процедуры производится по ее имени с употребле- нием фактических параметров: Program Summa; Var х, y, z, m, s1, s2 : Real; procedure Sum (a,b:Real; var s: Real); Begin s:=a+b; End; Begin Write (‘ Ввести исходные значения x, y, z ‘); Read (x, y, z, m); Sum (x, y, s1); Sum (z, m, s2); Writeln (' Первая сумма = ‘, s1); Writeln (' Вторая сумма = ‘, s2); end. 38 На рисунке 6 представлен алгоритм описанной задачи. Рисунок 6 – Алгоритм программы 5.2. Функции Функция – это подпрограмма, результат выполнения которой присваивается ее имени. Функция является частным случаем подпрограмм. Основное отличие процедуры от функции состоит в том, что результат выполнения функ- ции передается в основную программу как значение имени этой функ- ции, а результаты выполнения процедуры как значения ее параметров. ввод x, y, z, m вывод сообщения подключение проце- дуры sum начало процедуры s = a + b конец конец процедуры подключение проце- дуры sum вывод s1 вывод s2 начало 39 Функция вызывается в основную программу как встроенная про- граммная стуктура – в выражении записывается ее имя и фактиче- ские аргументы, охваченные скобками. Любая функция состоит, аналогично программе, из заголовка функции, раздела объявления параметров (локальных в данном случае) и ее тела. Заголовок функции состоит из служебного слова Function, имени функции и списка параметров, кроме того, указывается тип возвращаемого функцией значения. Формат описания функции выглядит следующим образом: function <имя функции>(<список формальных параметров>):<тип ре- зультата>; {раздел описания локальных параметров функции, например, кон- стант, типов, меток, переменных} Begin {тело процекдуры} <оператор 1>; <оператор 2>; ……………… End; Функция поиска суммы чисел будет выглядеть следующим образом: function Sum( a,b : Real): Real; {имя функции со списком формальных параметров} Begin {начало функции } s := a + b ; {операция суммирования двух чисел} sum:=s; {операция присвоения результата имени функции} End; {конец функции } В данном примере переменные a и b являются исходными (вход- ными) данными для подпрограммы. Перед завершением описания функции необходимо имени функции присвоить результат преобра- зования. Вызов такой функции производится записью имени функ- ции с указанием фактических параметров. Пример. Программа вычисления факториалов Fn = n! и Fm = m! с использованием подпрограммы-функции. {Факториал n! пред- ставляет собой произведение n чисел натурального ряда: 1*2*3*...*n.} 40 Program Factorial; Var Fn, Fm, m, n:integer; function Fact (a: integer): longint; {начало описания функции} Var p, i:integer; {раздел описания локальных переменных} Begin {начало функции} р:=1; for i:=1 to a do p:=p*i; fact:=p; end; {конец функции} Begin {начало основной программы} Write (‘ Введите значения m, n ‘); Readln (m, n); {ввод m, n с клавиатуры} Fn:= Fact (n); {обращение к функции} Fm:= Fact (m); {обращение к функции} Writeln ('Fn=', Fn:7); {вывод результата} Writeln ('Fm=', Fm:7); {вывод результата} End. {конец программы} Задания для самостоятельной работы 1. Написать подпрограмму-процедуру для расчета массива из N значений функции Y(x) при изменении аргумента с постоянным ша- гом h в диапазоне x1. . x2, и записи массива в файл. Значения N, x1, x2 и имя файла задаются с клавиатуры. Организовать вывод массива значений на экран и в текстовый файл. Исходные данные функции Y(x) и параметра h принимаются в соответствии с заданным вариан- том (таблица 2). 2. Написать подпрограмму-процедуру для расчета массива зна- чений функции Y(x) для всех значений х из интервала (a; b) c шагом изменения значения аргумента h. Переменные Ymin ,Ymax – мини- мальное и максимальное значения функции F(x), F – среднее зна- чение функции F(x). Исходные данные представлены в таблице 2. Организовать вывод массива значений на экран и в текстовый файл. 3. Напишите подпрограмму-процедуру расчета гипотенузы и площади треугольника по значениям двух катетов, которые вводят- ся с клавиатуры. 41 Таблица 2 № варианта Y(х) F(х) h a b 1 )tg(lg 13 5 x х  – 0,2 –5 –1 2 )2( xxe  – 0,05 5 8 3 3/2 2 1 )1(1   x xx – 0,25 4 10 4 | sin3(3x) – 2sin2(x) – sin(3x) | – 0,01 –2 3 5 2/7 sin()cos( xexx  – 0,4 1 12 6 | cos2(ex) – 2sin(x) | – 0,05 –1 2 7 25 3 xx  – 2 50 100 8 ln(|x + 2|2/3) – 0,25 –1 1 9 x Fx3  cos(x) + 2sin2(x) 0,5 2 23 10 7 max x Y sin(x2 + 4) 0,02 5 7 11 24 )(tgmin xY  5 )(ctg x 0,2 22 26 12 e5x/(1+ F 2) cos2(x) 0,25 5 10 13 x Y Y min max cos(x) – sin2(x) 0,05 8 12 14 x F Y max x3 1 2 20 15 F x3 2 )3,2(tg  5 ln x 0,5 –7 1 16 minYxF  ln(|x – 2|) 0,5 10 15 4. Написать программу с использованием процедуры вывода на экран визитной карточки студента с указанием текущей даты. 42 5. Напишите программу, состоящую из трех процедур и основ- ной программы. Первая процедура организует ввод двух целых чи- сел Х и Y, вторая вычисляет их сумму, третья выводит результат. Используйте эти процедуры в основной программе. 6. Написать подпрограмму-функцию для расчета суммы значений функции Y(x) для всех значений х из интервала (a; b) c шагом изме- нения значения аргумента h. Переменные Ymin ,Ymax – минимальное и максимальное значения функции F(x). F – среднее значение функ- ции F(x) на интервале (a;b). Исходные данные представлены в табли- це 2. Организовать вывод суммы на экран и в текстовый файл. 7. Составить программу вычисления функции Z = am, где m – любое целое (положительное или отрицательное) число, перемен- ная а не равно нулю. 8. Напишите функцию возведения в степень по формуле: Y=xn . Значения переменных x и n вводятся в основной программе с кла- виатуры. 9. Вычислить сумму: 1! + 2! + 3! +...+ n!, используя функцию. Значение n вводится с клавиатуры. В основной программе органи- зуйте вывод результата на экран и в файл. 43 Лабораторная работа № 6 МОДУЛИ В ПАСКАЛЕ Цель работы: получение навыков работы с внешними про- граммными модулями. 6.1. Создание внешнего модуля Наличие модулей в Паскале позволяет программировать и про- водить отладку программы по частям, создавать библиотеки под- программ и данных, а также использовать возможности стандарт- ных модулей. Модуль определяется как программная конструкция (но не программа в смысле возможности непосредственного испол- нения), включающая в себя заголовок, интерфейс, исполнительную и инициирующую части. Заголовок модуля состоит из зарезервированного слова UNIT и идентификатора: Unit MyModul; Модуль должен быть помещен в файл, имя которого совпадает с именем модуля, а его расширение должно быть PAS. Интерфейс модуля предназначен для взаимодействия основной программы с модулем и начинается со служебного слова Interface. Интерфейс состоит из раздела описания глобальных имен типов, меток, констант, переменных, а также заголовков процедур, кото- рые могут быть использованы основной программой при вызове этого модуля. В разделе объявления процедур и функций указыва- ются лишь заголовки подпрограмм. Описание подпрограмм приво- дится в исполнительной части. Исполнительная часть модуля начинается со служебного слова Implementation и содержит полное описание процедур (заголовок, раз- делы описания и выполнения), а также локальных имен типов, меток, констант и переменных, используемых в инициирующей части. Инициирующая часть модуля начинается со служебного слова Begin и содержит блок операторов, выполняемых при подключении модуля к основной программе. Инициирующая часть может отсут- 44 ствовать (быть пустой). Заканчивается модуль служебным словом End с точкой. Подключение модулей осуществляется в начале основной про- граммы с помощью служебного слова Uses с указанием имен под- ключаемых модулей, например: Program Prоg2; Uses MyModul; Приведем пример внешнго модуля и основной программы, в ко- торой он используется: Внешний модуль: {Файл Unit1.Pas} Unit name; {name - имя модуля} Interface {интерфейс модуля} Var Max, Min real; {описание глобальных переменных} Procedure Sum(a,b:real; var s:real); {описание заголовка процедуры} Implemantation {исполнительная часть модуля} Procedure Sum(a, b:real; var s:real); {полное описание процедуры} begin s:=a+b; end; Begin {инициирующая часть модуля} End. Основная программа: Program A; Uses Unit1; {подключение модуля} Var x,y,z:real; Begin Write(‘Введите два числа через пробел’); Readln(x,y); Sum(x,y,z); {подключение про цедцры, описанной в модуле} Writeln(‘Сумма двух чисел…’,z); End. 45 6.2. Стандартный модуль CRT Стандартные модули предназначены для расширения возможно- стей программирования, в том числе не предусмотренных стандар- том языка Паскаль. К ним относится, например, модуль CRT, кото- рый служит для управления экраном в текстовом режиме, а также для управления клавиатурой и звуковыми сигналами. Модуль со- держит библиотеку процедур (подпрограмм) и функций, которые выполняются при их вызове. При работе с экраном через модуль CRT весь экран разбивается на отдельные строки, а каждая строка – на отдельные позиции, в каждую из которых можно поместить один символ. Таким образом, весь экран разбивается на отдельные неделимые прямоугольные элементы. Для каждого элемента можно задать цвет фона (задний план) и цвет символа (передний план). Кроме того, в случае необ- ходимости символ можно сделать мерцающим. Модуль CRT позволяет работать не только со всем экраном, но и выделять в нем прямоугольные окна. Любое окно задается своим левым верхним углом и правым нижним углом. Координаты углов задаются двумя координатами: X и Y. В качестве координаты X вы- ступает номер позиции в строке (нумерация начинается с 1 и идет слева направо), а в качестве координаты Y – номер строки (нумера- ция начинается с 1 и идет сверху вниз). При работе в окне коорди- наты отсчитываются от левого верхнего угла окна. Константы модуля CRT: коды цветов № Цвета символов и экрана № Цвета символов и экрана 0 Black – черный 8 DarkGray – темно-серый 1 Blue – синий 9 LightBlue – светло-синий 2 Green – зеленый 10 LightGreen – светло-зеленый 3 Cyan – голубой 11 LightCyan – светло-голубой 4 Red – красный 12 LightRed –розовый 5 Magenta – фиолетовый 13 LightMagenta – светло-фиолетовый 6 Brown – коричневый 14 Yellow – желтый 7 LighttGray – светло-серый 15 White – белый 128 Blink– мерцание символа Основные процедуры и функции модуля CRT представлены ниже. 46 1.1. Процедуры задания режимов работы: TextMode(Mode:Word); – устанавливает текстовый режим, увеличи- вает текущее окно до целого экрана, устанавливает переменным DirectVideo и CheckSnow значение True. Mode – требуемый режим. 1.2. Процедуры управления цветом: HighVideo; – устанавливает высокую яркость символов (заменяет цвета 0–7 на цвета 8–15), выводимых далее на экран. LowVideo; – устанавливает малую яркость символов (заменяет цвета 8–15 на цвета 0–7), выводимых далее на экран. NormVideo; – устанавливает первоначальную яркость символов, выводимых далее на экран TextBackground(Color: Byte); – задает цвет фона. Color – задавае- мый цвет фона. TextColor(Color: Byte); – задает цвет символов. Color – задавае- мый цвет символов. 1.3. Процедуры работы с экраном: ClrEol; – удаляет все символы от курсора (включительно) до конца строки, заполняя этот участок строки цветом фона. Цвет фона задается процедурой TextBackground. ClrScr; – очищает текущее окно, заполняя его цветом фона, и помещает курсор в его верхний левый угол с координатами (1,1). Цвет фона задается процедурой TextBackground. DelLine; – удаляет строку, в которой находится курсор. GotoXY(X,Y: Byte); – перемещает курсор к элементу экрана с за- данными координатами. X, Y – координаты элемента экрана (коор- динаты отсчитываются от левого верхнего угла текущего окна). InsLIne; – выставляет пустую строку на экране в месте располо- жения курсора и заполняет ее цветом фона. Цвет фона задается процедурой TextBackground. Window(X1, Y1, X2, Y2 : Byte); – задает размеры окна на экране и помещает курсор в левый верхний угол окна с координатами (1,1). X1, Y1 – координаты левого верхнего угла окна; X2, Y2 – координа- ты правого нижнего угла окна. 1.4. Функции работы с экраном: WhereX: Byte; – возвращает текущую координату X курсора. WhereY: Byte; – возвращает текущую координату Y курсора. 47 1.5. Функции работы с клавиатурой: KeyPressed: Boolean; – анализирует нажатие клавиши клавиату- ры (за исключением вспомогательных клавиш - Shift, Alt, NumLock и т.п.). Результат – True, если клавиша нажата, и False – в против- ном случае. ReadKey: Char; – считывает символ с клавиатуры и освобождает буфер клавиатуры от считанного символа. 1.6. Процедуры управления звуком: Sound; – запускает источник звука с частотой Hz герц. NoSound; – выключает источник звука. 1.7. Процедуры разнообразного назначения: Delay(Ms: Word); – задает задержку выполнения программы в Ms миллисекунд. Ms – выражение, определяющее величину задержки в миллисекундах. AssignCrt(var F: Text); – связывает текстовый файл с устройст- вом CRT. F – файловая переменная типа Text, связывающаяся с устройством CRT. Пример процедуры установки цвета текста и фона: procedure Му_Color(txt,fon:byte); begin TextColor(txt); TextBackGround(fon); end; 6.3. Стандартный модуль GRAPH Для формирования графических изображений могут использо- ваться процедуры и функции библиотечного модуля Graph. Модуль Graph содержит типы, константы, переменные и подпрограммы, позволяющие пользователю создавать изображения с использова- нием набора различных технических средств для работы с графиче- ской информацией. При работе с этими устройствами (адаптерами) весь экран разбивается на отдельные точки – пиксели, которые мо- гут иметь тот или иной цвет. Каждый пиксель имеет две координа- ты X и Y. Координата Х увеличивается по горизонтали слева напра- во, начиная от нуля, координата Y увеличивается по вертикали сверху вниз, начиная от нуля. Количество пикселей зависит от типа адаптера и режима его работы. 48 Ниже представлены некоторые стандартные процедуры и функ- ции модуля GRAPH: InitGraph(GraphDriver, GraphMode :Integer; PathToDriver :String); – инициализирует графическую систему, устанавливает графический режим, исходные значения текущего указателя, палит- ры цвета и т.д. CloseGraph; – завершает работу в графическом режиме и осуще- ствляет переход в текстовый режим. MoveTo(X, Y: Integer); – перемещает текущий указатель (курсор) в точку окна с координатами X, Y. Точка на экране не высвечивается. LineTo(X, Y: Integer); – проводит линию текущего цвета из теку- щей позиции в точку с заданными координатами X, Y. Текущий цвет задается процедурой SetColor, текущие параметры линии – проце- дурой SetLineStyle. Line(X1, Y1, X2, Y2: Integer); – проводит линию текущего цвета между точками с координатами X1, Y1 и X2, Y2 без изменения зна- чения указателя координат. Текущий цвет задается процедурой SetColor, текущие параметры линии – процедурой SetLineStyle. FloodFill(X, Y: Integer; Border: Word); – закрашивает область, ог- раниченную непрерывной линией, текущим орнаментом и цветом заполнения. Орнамент и цвет заполнения задаются процедурами SetFillStyle или SetFillPattern. X, Y – координаты любой точки внут- ри закрашиваемого контура. Border – цвет линии, до которой произ- водится закрашивание. SetFillStyle(Pattern: word; Color : Word); – задает орнамент и цвет заполнения фигур. OutTextXY(X, Y,: Integer, TextSt : String); – выводит на экран по- следовательность символов, начиная с заданных координат X, Y. Str(C: Real(Integer), S: String); – преобразует число в последова- тельность символов. SetLineStyle(LineStyle: Word; Pattern : Word; Thickness: Word); – задает параметры линии: стиль, шаблон и толщину. SetTextStyle(Font: Word; Direction: Word; CharSize: Word); – ус- танавливает тип шрифта, направление текста и размер символов. В модуле GRAPH используются следующие типы линий для процедуры SetLineStyle: 1. Непрерывная линия – SolidLn (0) 2. Пунктирная линия – Dotteln (1) 49 3. Штрихпунктирная – CenterLn (2) 4. Штриховая линия – DashedLn (3). В модуле GRAPH используются следующие константы орнамен- та для процедуры SetFillStyle: 5. Заполнение цветом фона – EmptyFill (0) 6. Однородное заполнение – SolidFill (1) 7. Заполнение --- – LineFill (2) 8. Заполнение /// – LtSlashFill (3) 9. Заполнение /// толстыми линиями – SlashFill (4) 10. Заполнение \\\ толстыми линиями – BkSlashFill (5) 11. Заполнение \\\ – LtBkSlashFill (6) 12. Заполнение клеткой – HatchFill (7) 13. Заполнение косой клеткой – XHatchFill (8) 14. Заполнение частой сеткой – InterleaveFill (9) 15. Заполнение редкими точками – WideDotFill (10) 16. Заполнение частыми точками – CloseDotFill (11) Пример использования процедур модуля GRAPH для создания изображения линии: Uses Graph; Var grDriver: Integer; grMode: Integer; ErrCode: Integer; PathBGI: string; Begin grDriver := Detect; PathBGI:= ‘D:\Programming\Bgi’; InitGraph(grDriver, grMode,PathBGI); ErrCode := GraphResult; if ErrCode = grOk then begin { Do graphics } Line(0, 0, GetMaxX, GetMaxY); Readln; CloseGraph; end else Writeln('Graphics error:', GraphErrorMsg(ErrCode)); end. 50 Программа имитации движения окружности внутри окна: uses crt, graph; VAR grDriver: Integer; grMode: Integer; ErrCode: Integer; XM, YM: INTEGER xl,xr: integer; (* левая и правая границы окна *) yt, yb: integer; (* верхняя и нижняя границы окна *) dx,dy,x,y: integer; begin clrscr; writeln(‘ Введите максимальные значения Х,У для центра окружно- сти’); readln(xm,ym); writeln( ‘Введите координаты Х левой и правой границ окна’); readln(xl,xr); if (xl >= xr) or (xl<0) or (xm > xr) or (xm < xl) then begin writeln(' Координаты заданы неверно'); halt; end; writeln(‘Введите координаты У верхней и нижней границ окна’); readln(yt,yb); if (yt >= yb) or (yt<0) or (ym > yb) or (ym < yt) then begin writeln(' Координаты заданы неверно'); halt; end; DX:=1; DY:=1; x:=xl+ trunc((xr-xl)/6); y:=yt +trunc((yb-yt)/6); clrscr; (*************работа с графикой ****************) grDriver := Detect; InitGraph(grDriver, grMode,' '); ErrCode := GraphResult; 51 if ErrCode = grOk then begin { Do graphics } LINE(xl,yt,xr,yt); LINE(xr,yt,xr,yb); LINE(xr,yb,xl,yb); LINE(xl,yb,xl,yt); (* вычертили окно *) REPEAT setcolor(white); CIRCLE(x,y,5); (* нарисовали окружность белым цветом *) if (x=xl+1) or (x=xr-1) then DX:=-DX; if (y=yt+1) or (y=yb-1) then DY:=-DY; setcolor(black); CIRCLE(x,y,5); (* стерли окружность *) x:=x+DX; y:=y+DY; UNTIL KEYPRESSED; Readln; CloseGraph; end else Writeln('Graphics error:', GraphErrorMsg(ErrCode)); end. Задания для самостоятельной работы 1. Составить программу вывода на экран прямогугольной облас- ти, цвет которой изменяется произвольно. Вывод прямоугольника сопровождается звуковым сообщением. 2. Составить программу вывода на экран прямогугольников, цвет и расположение на экране которых изменяется произвольно. Вывод цветных прямоугольных областей сопровождается звуковым сооб- щением. 3. С использованием средств стандартного модуля Graph напи- сать программу для вывода на экран рисунка в соответствии с за- данным вариантом. 52 1 2 3 53 Лабораторная работа № 7 ЧИСЛЕННОЕ ДИФФЕРЕНЦИРОВАНИЕ ФУНКЦИЙ Цель работы: изучить численные методы дифференцирования функций. При решении прикладных инженерно-технических задач часто бывает необходимо найти производную определенного порядка от функции f(x), заданной таблично. Возможно, что в силу сложности аналитического выражения функции f(x) непосредственное ее диф- ференцирование затруднено. В этих случаях обычно используют приближенные численные методы дифференцирования функций. По определению, первая производная есть предел отношения приращения функции к приращению независимой переменной при стремлении к нулю приращения независимой переменной: h xfhxfxf h )()(lim)( 0   . (1) При вычислении первой производной функции на компьютере бесконечно малое приращение h (h→0) заменяют малое, но конеч- ное значение ∆x: ),()()()( xO x xfxxfxf   (2) где O(∆x) – ошибка вычисления производной, зависящая от ∆x. Приведенная формула называется правой разностной схемой вы- числения первой производной. Аналогично может быть записана левая разностная схема: ).()()()( xO x xxfxfxf   (3) Для определения ошибки вычисления производной O(∆x) функ- цию f(x) можно разложить в точке x+∆x в ряд Тейлора: 54 ...)( 6 )( 2 )()()( 32  xfxxfxxfxxfxxf . (4) Отсюда следует, что можно оценить величину ошибки вычисле- ния производной: ...)( 6 )( 2 )( 2  xfxxfxxO . (5) Разлагая функцию f(x) в ряд Тейлора в точках x + ∆x и x – ∆x, т.е. соседних точках от точки x, и вычитая затем один результат от дру- гого, получают центральную разностную схему: ),()()()( 2xO x xxfxxfxf   (6) где O(∆x2) – погрешность вычисления первой производной: ...)( 6 )( 2 2  xfxxO . (7) Таким образом, при численном нахождении производной заме- няют отношение бесконечно малых приращений функций и аргу- мента отношением конечных разностей. Очевидно, что чем меньше будет приращение аргумента, тем точнее численное значение про- изводной. Представленные выше приближенные численные методы называют в программировании двухточечными методами вычисле- ния производных. Пример. Для функции 2xey  необходимо произвести поиск максимального и минимального значений (ymin, ymax) на заданном интервале x(A;B) и соответствующих им значений аргумента (xmin, xmax); а также максимального и минимального значений первой про- изводной f′(x) функции (y'min, y'max) и соответствующих им значений аргумента (xy'min, xy'max). Шаг изменения аргумента ∆x = (B – A) / N, где N = 1.0E + 05. Принять A = –1, B = 5. 55 Решение. Таблица соответствия переменных исходным данным задачи представлена в таблице 3. Таблица 3 Идентификатор переменной Описание идентификатора А начальное значение переменной В конечное значение переменной N число разбиений расчетного интервала x значение переменной y значение функции MAXy максимальное значение функции MINy минимальное значение функции xMAXy значение аргумента, соответствующее максимально-му значению функции xMINy значение аргумента, соответствующее минимальному значению функции dx шаг изменения значения аргумента p значение производной от заданной функции MAXp максимальное значение производной MINp минимальное значение производной xMAXp значение аргумента, соответствующее максимально-му значению производной xMINp значение аргумента, соответствующее максимально-му значению производной Текст программы: program differ; const A=-1; B=5; N=1.0E+05; var MAXy, MINy, xMAXy, xMINy : real; MAXp, MINp, xMAXp, xMINp: real; x, y, p, dx: real; {вычисление значений функции} function f(x:real):real; begin f:=exp(-sqr(x)); 56 end; {вычисление производной} function df(x,dx:real):real; begin df:=(f(x+dx)-f(x-dx))/(2*dx); end; {начало основной программы} begin x:=A; dx:=(B-A)/N; MAXy:=f(A); MINy:=f(A); while xMAXy then begin MAXy:=y; xMAXy:=x end; if yMAXp then begin MAXp:=p; xMAXp:=x end; if p