Книжка Хабы (970988), страница 3
Текст из файла (страница 3)
s:=0;
end; {for}
for i:=1 to n1 do
begin
sumi:=0;
for j:=1 to n1 do
sumi:= sum+a1[i,j];
if s=1 then
if sumi<>sum then s:=0;
end; {for}
gotoXY(1,1);
textColor(red);
for I:=1 to n1 do
begin
for j:=1 to n1 do
write(al[i,j]:3);
writeln;
end;
if s=1 then
begin
writeln(‘Матрица образует магический квадрат’);
end
else
begin
writeln(‘Матрица не образует магический квадрат’);
end;
delay(10000);
repeat
readMouseState(x,y,l,m,r);
until (keypressed or l);
end;
end.
2.2. Практическая часть
Задача 2.1. Разработать модули для решения алгебраических задач:
A. Модуль приближенного решения алгебраических и трансцендентных уравнений;
B. Модуль приближенного вычисления интеграла.
В качестве примера рассмотрим упрощенный модуль приближенного вычисления интеграла методом трапеций.
Пример 2.3.
unit Proc;
interface
type
MathFunc = function(x: Real): Real;
function Area(a, b: Real; n: Integer; f: MathFunc): Real;
implementation
function Area(a, b: Real; n: Integer; f: MathFunc): Real;
var
i: Integer;
s, h, c, d: Real;
begin
s := 0;
h := (b-a)/n;
for i:= 1 to n do
begin
c := a+h*(i-1);
d := a+h*i;
s := s+h*(f(c)+f(d))/2;
end; { for }
Area := s;
end; { Area }
end. {Proc}
Здесь функция приближенного вычисления определенного интеграла методом трапеций Area имеет четыре параметра: a, b, n и f. A и b имеют тип Real, представляющие соответственно начало и конец интервала, на котором выполняется аппроксимация; n - это целое число подынтервалов; f - формальный параметр процедурного типа MathFunc, используемый в качестве имени функции. Фактический параметр, связанный с f, должен быть именем функции вещественного типа. Эта функция определяет кривую, площадь под которой вычисляется.
Программа, тестирующая функцию Area для подынтегральной функции
f(x) = x2 – x может иметь вид
Пример 2.4.
program ProcTypeDemo;
uses Crt, Proc;
var
a, b: Real;
n: Integer;
{$F+}
function Func(x: Real): Real;
begin
Func := Sqr(x)-x;
end;
{$F-}
begin
ClrScr;
Write('введите нижнюю граница интервала A:= '); Readln(a);
Write('введите верхнюю граница интервала B:= '); Readln(b);
Write('введите число подинтервалов N:= '); Readln(n);
Writeln('---------------------------------------------');
Writeln(' площадь под кривой S:-= ', Area(a,b,n,Func):10:2);
Readln;
end. {ProcTypeDemo}
Задача 2.2.
В программе, тестирующей функции модуля, сравнить методы приближенного решения алгебраических и трансцендентных уравнений (методы приближенного вычисления интеграла), поочередно используя их для решения одного и того же уравнения (для одной и той же подынтегральной функции). Значение e (точность) следует поочередно брать равными 0.01, 0.001, ..., 0.0000001. Для каждого из методов построить график или столбчатую диаграмму изменения числа потребовавшихся приближений при переходе от одного значения к другому.
3. Задачи, для самостоятельного решения
Приближенно вычислить интеграл:
b
Z= ∫ F(x) dx
а
на заданном отрезке [а;b] в соответствии с вариантом задания. Считать заданным число разбиений отрезка интегрирования n и численный метод решения. Включить в программу вычисление точного значения интеграла.
На печать вывести приближенное, точное значения интеграла и относительную погрешность вычисления в процентах.
Вар. зад. | Подынтеграл. функция f (x) | Первообразные F(х)=∫ f (x) dx | Метод числен. решения | Число отрезков | Интервал интегр. | Требуем. точность |
1. | Ln²(x) / x | Ln³(x)/3 | Трап. | 60 | [1;4] | 10–4 |
2. | (1/x²)sin(1/x) | Cos(1/x) | Прям. | 50 | [1;2,5] | 0,5 10–3 |
3. | Xx (1 + lnx) | X x | Трап. | 40 | [1;3] | 10–4 |
4. | Cos(x) | Sin(x) | Трап. | 60 | [0; /2] | 10–4 |
5. | Sin²(x) | X/2-(sin2x) /4 | Трап. | 60 | [0; /2] | 0,5 10–3 |
6. | X ex sin x | [x sinx+ (1-x) cosx] (e x / 2) | Трап. | 100 | [0; 1] | 10–4 |
7. | (ln x/x)² | -[ln x +2lnx+2] (1/x) | Прям. | 50 | [0; 2,5] | 10–4 |
8. | X arctgx | (arctg(x²-1)-x) / 2 | Трап. | 50 | [0;3] | 0,5 10-3 |
9. | 1 (sgrt (9+x²)) | Ln│x + sgrt (x²+9)│ | Прям. | 100 | [0;2] | 10–5 |
10. | eх cos²(x) | Ex(1/2+ cos2x / 10 + sin2x / 5) | Трап. | 60 | [0; ] | 10–4 |
11. | X³/(3+x) | X³-3/2x² + 9x –27 ln(x+3) | Прям. | 80 | [1;2] | 0,5 10–4 |
12. | (ln x/x)³ | -1/(8x²) (4ln³x + 6ln²x + 6lnx+3) | Трап. | 50 | [1;2] | 10–4 |
13. | X ((eх – e–х) / 2) | X chx – shx | Прям. | 50 | [0;2] | 10–4 |
14. | X² sin(2x) | -(2x²-1) (cos(2x))/4 +(x) sin(2x)/2 | Трап. | 100 | [1;2] | 10–4 |
15. | X/(x4+3x²+2) | ½ ln [(-x²-1)/(x²+2)] | Трап. | 50 | [1;2] | 0,5 10-3 |
Лабораторная работа №3
Меню
Цель работы – овладение практическими навыками разработки пользовательских меню одно и многоуровневого типов.
1. Теоретическая часть
Современные программы взаимодействуют с пользователем через специальный интерфейс типа «меню», в котором пользователю предлагается выбрать один из пунктов.
Для реализации меню необходимо обрабатывать коды нажатия клавиш управления курсором (←,↑,→,↓), по которым обычно осуществляется переход на следующий пункт. Активизация пункта обычно выполняется нажатием клавиши Enter. После выполнения нужного пункта программа должна вновь выводить меню и продолжать работу с ним. Выход из программы осуществляется по выбору специального пункта «выход» или по нажатию клавиши Esc.
Для создания окон меню используется графический режим работы экрана. Управление экраном осуществляется с помощью ресурсов модуля Crt, базирующегося на понятии “окно”.
Окно – часть экрана прямоугольной формы. В момент получения программой управления весь экран считается окном 25х80 знакомест. Программист может определять на экране новые окна и управлять их цветом символов и фона окна, так и размещение информации в окне.
Вывод информации в текстовом режиме осуществляется стандартными процедурами Write и WriteLn текущими цветом символа и цветом фона. При выводе четыре символа интерпретируются особым образом:
#7 –звуковой сигнал,
#8 – перемещение курсора влево на один символ,
#10 – перемещение курсора на строку вниз,
#13 – перемещение курсора в начало текущей строки.
Для организации окон в ТР используется процедура Window(Х1,Y1,X2,Y2);
где: Х1,Y1 – координаты левого верхнего угла, X2,Y2 – координаты правого нижнего угла окна.
Пример 3.1.
Window(1,1,80,25) {окно – полный экран},
Window(19,7,59,16) {окно в центре экрана}.
После активизации процедуры Window модуль Crt формирует две специальные переменные WindMin и WindMax, в которых фиксируются размеры текущего окна. Значения этих переменных можно использовать в программе для формирования оконных систем. Например, для получения координат Х и У верхнего угла текущего окна можно использовать выражения:
X: = Lo(WindMin), Y:= Hi(WindMax).
Аналогичным образом можно получить координаты правого нижнего угла текущего окна. Особенности архитектуры модуля Crt требуют при работе с WindMin и WindMax использовать отсчет координат не с (1,1) , а с (0,0), что необходимо учитывать при организации оконных интерфейсов в программе.
На экране могут находиться несколько окон, но в каждый отдельный момент времени активным может быть только одно окно. Процедуры и функции Writeln, Write, Readln, Read, Window, GotoXY, ClrScr, InsLine, DelLine, WhereX, WhereY выполняют соответствующее их назначению действия относительно текущего окна. Работу с текстовыми окнами продемонстрируем на следующем примере:
Program DemoRandomWindow;
Uses Crt;