INTERFACE
Uses CRT;
Type
mas_string=array[1..5] of String;
Procedure Frame(X1,Y1,X2,Y2,fon,cvet:INTEGER);
Procedure VertMenu(x1,y1,L:Byte;Stor:mas_string; var regim:Byte);
Procedure GorMenu(x1,y1,L:Byte;Stor:mas_string; var regim:Byte);
IMPLEMENTATION
Procedure Frame(X1,y1,x2,y2,fon,cvet:Integer);
{Процедура черчения рамок заданного цвета и фона}
{X1,Y1,X2,Y2 - координаты соответственно
левого верхнего и правого нижнего угла рамки}
Const
{для черчения двойной линии}
A=#186; B=#187; C=#188;
D=#200; E=#201; F=#205;
{для черчения одинарной линии
A=#179; B=#191; C=#217;
D=#192; E=#218; F=#196;}
Var
i,j:Integer;
Begin
TextColor(cvet);
GotoXY(X1,Y1);
Write(E); {левый верхний угол}
{горизонтальная линия}
For i:=X1+1 to X2-1 do Write(F);
Write(B); {правый верхний угол}
{вертикальные линии}
For i:=Y1+1 to Y2-1 do
Begin
GotoXY(x1,i); {переходим к левой границе}
Write(A); {левая черта }
GotoXY(X2,i); {правая граница }
Write(A); {правая черта }
end;
GotoXY(x1,y2);
Write(D); {левый нижний угол}
{расширяем вниз на одну строку координаты окна, иначе вывод в правый нижний угол вызовет прокрутку окна вверх}
Window(X1,Y1,X2,Y2+1);
{возвращаем курсор из левого верхнего угла окна в нужное место}
GotoXY(2,Y2-Y1+1);
{горизонтальная рамка}
For i:=X1+1 to X2-1 do Write(F);
Write(C); {правый нижний угол}
{ Определяем внутреннюю часть окна}
{задание окна внутри рамки}
Window (x1+1,y1+1,x2-1,y2-1);
TextColor(cvet);
TextBackground(fon);
Clrscr;
End;
Procedure VertMenu(x1,y1,L:Byte;Stor:mas_string; var regim:Byte);
{процедура формирования вертикального меню}
Var
k,i:Byte;
kod:Char;
Begin
{задаем окно}
frame (x1,y1,x1+20,y1+L+1,blue,Yellow);
k:=1; {номер режима}
kod:=' ';
While kod<>#13 do
Begin
For i:=1 to L do
Begin
If i=k then
Begin
TextBackGround(Green);
TextColor(Yellow);
End
Else
Begin
TextBackGround(Blue);
TextColor(Yellow);
end;
{вывод строки меню}
GotoXY(1,i);
Write(Stor[i]);
end;
{отображение выбора с помощью стрелок}
kod:=ReadKey;{считывание символа}
{если нажата функциональная клавиша}
If kod=#0 then
Begin
{считывание второго байта}
kod:=ReadKey;
{если нажата стрелка вверх}
If kod=#72 then
Begin
If k>1 then k:=k-1
else k:=L
end;
{если нажата стрелка вниз}
If kod=#80 then
Begin
If k<L then k:=k+1
else k:=1;
end;
end;
regim:=k;
end; {while}
end;
Procedure GorMenu(x1,y1,L:Byte;Stor:mas_string; var regim:Byte);
{процедура формирования горизонтального меню}
Var
k,i:Byte;
kod:Char;
Begin
Frame (x1,y1,79,3,Blue,Yellow); {задаем окно}
k:=1;
kod:=' ';
While kod<>#13 do
Begin
For i:=1 to L do
Begin
If i=k then
Begin
TextBackGround(Green);
TextColor(Yellow);
End
Else
Begin
TextBackGround(Blue);
TextColor(Yellow);
end;
{вывод строки меню}
GotoXY((i-1)*15+1,1);
Write(Stor[i]);
end;
{отображение выбора с помощью стрелок}
kod:=ReadKey;{считывание символа}
{если нажата функциональная клавиша}
If kod=#0 then
Begin
{считывание второго байта}
kod:=ReadKey;
{если нажата стрелка ввлево}
If kod=#75 then
Begin
If k>1 then k:=k-1
else k:=L
end;
{если нажата стрелка вправо}
If kod=#77 then
Begin
If k<L then k:=k+1
else k:=1;
end;
end;
regim:=k;
end;
end;
BEGIN
END.
Пример основной программы, вызывающей вертикальное меню:
Program Prim_Vert_Menu;
Uses
Crt,Mybibl;
Const {задаем пункты меню}
Menu:mas_string=('Ввод ',
'Вывод ',
'Обработка',
'Выход ','');
Var
reg,i,j,k:Byte;
kod:Char;
Procedure Vvod;
Begin
Window(1,1,80,25);
Frame(40,1,70,10,Blue,Yellow);
WriteLn ('Ввод матрицы');
{окно с рамкой с заданным фоном}
...
End;
Procedure Vivod;
Begin
Window(1,1,80,25);
Frame(40,1,70,10,Blue,Yellow);
WriteLn ('Вывод матрицы');
...
End;
Procedure Obrabotka;
Begin
Window(1,1,80,25);
Frame(40,11,70,20,Blue,Yellow);
WriteLn ('Обработка');
...
End;
Begin {основная программа}
Clrscr;
While True do
Begin
Window(1,1,80,25);
VertMenu(1,1,4,Menu,reg);
Case REG of
1:Vvod;
2:Vivod;
3:Obrabotka;
4:Exit
end;
End
End.
Для формирования горизонтального меню необходимо лишь заменить вызов процедуры вертикального меню на процедуру горизонтального меню.
Пример основнойпрограммы формирования меню с подменю следующего вида:
╔═════════════════════════════════════════════════╗
║ Ввод Вывод Обработка Выход ║
╚═════════════════════════════════════════════════╝
╔═════════════╗
║Поиск ║
║Перестановка ║
║Сортировка ║
║Выход ║
╚═════════════╝
Program Menu_with_menu;
Uses
Crt,Mybibl;
Const
Menu:mas_string=('Ввод ',
'Вывод ',
'Обработка',
'Выход ','');
Menu3:mas_string=('Поиск ',
'Перестановка',
'Сортировка ',
'Выход ','');
Var
reg,reg3,i,j,k :Byte;
kod :Char;
Procedure Vvod;
Begin
Window(1,1,80,25);
Frame(1,4,25,15,Blue,Yellow);
WriteLn ('Ввод матрицы');
End;
Procedure Vivod;
Begin
Window(1,1,80,25);
Frame(1,4,25,15,Blue,Yellow);
WriteLn ('Вывод матрицы');
End;
Procedure Poisk;
Begin
Window(1,1,80,25);
Frame(58,4,79,15,Blue,Yellow);
WriteLn ('Поиск');
End;
Procedure Perest;
Begin
Window(1,1,80,25);
Frame(58,4,79,15,Blue,Yellow);
WriteLn ('Перестановка');
End;
Procedure Sort;
Begin
Window(1,1,80,25);
Frame(58,4,79,15,blue,yellow);
WriteLn ('Сортировка');
End;
Begin {основная программа}
Clrscr;
While True do
Begin
Window(1,1,80,25);
GorMenu(1,1,4,Menu,reg);
Case reg of
1:Vvod;
2:Vivod;
3:begin
Window(1,1,80,25);
VertMenu(32,4,4,Menu3,reg3);
case reg3 of
1:Poisk;
2:Perest;
3:Sort;
end;
{очищаем подменю}
Window(1,1,80,25);
Window(32,4,55,10);
TextBackGround(Blue);
Clrscr;
Continue;
end;
4:Exit
end;
End
End.
ПРИБЛИЖЕННОЕ ВЫЧИСЛЕНИЕ
ФУНКЦИЙ
Функцию n+1 раз дифференцируемую на интервале (a,b), содержащемточку с, можно разложить в ряд Тейлора, т.е. представить в виде суммы многочлена n-ой степени и остаточного члена :
Выражение называется общим членом ряда. Необходимым условием сходимости ряда является то, что общий член ряда по абсолютной величине стремится к нулю.
Вычислять значение суммы будем следующим образом: зададим начальное значение суммы, вычислим первый член суммы и добавим его к начальному значению, вычислим второй член суммы, третий и т.д., до тех пор, пока значение n-го члена суммы, по абсолютной величине, не будет меньше заданной точности (добавление его к сумме не повлияет на значение суммы). Формула общего члена ряда может принадлежать к одному из трех типов:
1) ; ; ; ... 2) ; ; ; ...
3) ; ; ; ...
В первом случае каждый член суммы вычисляется непосредственно по общей формуле. Во втором случае для вычисления суммы лучше всего использовать рекуррентные соотношения, т.е. выражать последующий член ряда через предыдущий. В последнем случае член суммы представляется в виде произведения двух сомножителей, первый из которых вычисляется с использованием рекуррентных соотношений, а второй вычисляется непосредственно.
Пример. Найдем рекуррентные соотношения для 2-х общих членов ряда:
1. Общий член ряда тогда Найдем отношение . Значит
2. Общий член ряда тогда Найдем отношение Тогда
Если при подстановке n=1 в общий член суммы будет получен первый член суммы, то начальное значение S=0, если же будет получен второй член суммы, то за начальное значение Sn принимают значение первого члена суммы.
Начальное значение для рекуррентных соотношений определяется из первых членов суммы ряда путем выделения в них той части, которая вычисляется рекуррентно.
Вычисление суммы организовывается в цикле. Когда при прохождении цикла номер члена суммы изменяется на 1, то сумма изменяется на его n-й член, т.е. Sn+1=Sn+Qn+1, Sn — сумма n членов. Вычисления проводят до тех пор, пока не будет выполнено неравенство |Qn|£ .
Пример: С точностью =0,001 подсчитать значение Sn функции F(x), представленной разложением в ряд S=S(x):
Результат сравнить со значением функции .
Вычисления произвести в диапазоне изменения аргумента x: 0.1£x£1 с заданным шагом h=(b-a)/k, k=10. На печать выдавать в виде таблицы: аргумент x, значения S и f, количество членов ряда n, обеспечивающих заданную точность и значения члена ряда un.
В данном примере общий член ряда принадлежит к третьему типу. Представим его в виде произведения двух сомножителей где вычисляется рекуррентно, а – непосредственно. Найдем рекуррентные соотношения: , Значит
Program Sum_While; {Вычисление суммы ряда}
Uses Crt;
Const eps=0.001;
Var
a,b,h,x,s,q,u,f :Real;
k,n :Integer;
Begin
Clrscr;
Write ('Введите отрезок [a,b]->'); ReadLn (a,b);
Write ('Введите значение k->'); Readln (k);
h:=(b-a)/k;
x:=a;
WriteLn(' Таблица значений функции ');
WriteLn('┌────┬────────┬────────┬────────┬────┐');
WriteLn('│ x │ S │ f │ Q │ n │');
WriteLn('├────┼────────┼────────┼────────┼────┤');
While (x<=b) do
Begin
s:=0;
n:=1;
u:=x*x;
q:=u/2;
While (abs(q)>eps) do
Begin
s:=s+q;
n:=n+1;
u:=u*(-x*x);
q:=u/((2*n-1)*2*n);
end;
f:=x*arctan(x)-ln(sqrt(1+x*x));
WriteLn('│',x:4:2,'│',s:8:4,'│',f:8:4,'│',
q:8:4,'│',n:3,'│');
x:=x+h;
end;
WriteLn ('└────┴────────┴────────┴────────┴────┘');
Repeat Until Keypressed;{задержка экрана пока}
End. {не нажата любая клавиша}
Дата добавления: 2015-04-15; просмотров: 657;