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;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.082 сек.