Создание личной библиотеки программиста 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Создание личной библиотеки программиста



 

Каждый опытный программист со временем накапливает определенное количество процедур и функций, которые использует как готовые блоки при разработке различных программ. Организуем из них библиотечный модуль Mybibl и откомпилируем его с размещением на диске результата (опция компиляции Build). После выполнения компиляции на диске создается файл Mybibl.tpu, доступный для использования без каких-либо дополнительных описаний. Этот файл можно подключать в любую программу следующим образом:

Uses Mybibl;

 

Программа в общем случае состоит из заставки, набора процедур, функций и глобального блока (функционирующего посредством меню).

Заставка является визитной карточкой программы. Она выводится на экран сразу после старта программы и содержит информацию о названии программы, ее назначении, авторе и т.д.

Меню – это перечисление возможностей системы, из которого пользователь выбирает нужную в текущий момент. Меню должно быть простым в работе и понятым для самого неподготовленного пользователя. Более или менее сложная система обычно имеет несколько меню. Среди них выделяется главное, наиболее общее меню. Каждый элемент главного меню может генерировать новое (вложенное) меню, являющееся второстепенным по отношению к главному. В свою очередь второстепенное меню может также активизировать подчиненное ему меню и т.д. Уровень вложения меню ограничивается только логической структурой решаемой задачи.

Виды меню

Простой запрос представляет собой наиболее несложный вид меню. Выбор режима меню осуществляется нажатием цифры выбранного режима меню.

  ГЛАВНОЕ МЕНЮ   1 – ввод 2 – вывод 3 – обработка 4 – выход   Выберете режим и нажмите Еnter  

 

Пример простого меню:

Program Simple_Menu;

Uses

Crt;

Const

K=4; {Количество режимов}

Nameregim:array[1..K] of String [26]=

('1 - ввод',

'2 - вывод',

'3 - обработка',

'4 - выход');

Var

i,j: Byte;

Procedure Zast;

Begin

{процедура заставка}

End;

Procedure Vvod;

Begin

{процедура ввода}

End;

Procedure Vivod;

Begin

{процедура вывода}

End;

Procedure Obrabotka;

Begin

{процедура обработки}

End;

Begin

Zast;

While True do

Begin

Clrscr;

GotoXY(24,4);

Write ('ГЛАВНОЕ МЕНЮ');

For j:=1 to 4 do

Begin

GotoXY(25,7+j);

Write (Nameregim[j]);

end;

GotoXY(20,15);

Write (‘Выберете режима и нажмите Enter’);

ReadLn(i);

Case i of

1: Vvod;

2: Vivod;

3: Obrabotka;

4: Exit

Else

Begin

GotoXY(20,17);

Write (‘Такого режима нет. Повторите!’);

end {else}

end {case}

end {while}

End.

 

Горизонтальное меню представляет собой строку из списка режимов, один из которых (обычно первый) выделен цветом. Выбор нужного пункту меню осуществляется нажатием клавиш →, ←, активизация режима – клавиша Enter.

 

ГОРИЗОНТАЛЬНОЕ МЕНЮ

Ввод Вывод Обработка Выход

 

Вертикальное меню – отличается от горизонтального расположением списка режимов.

 

ВЕРТИКАЛЬНОЕ МЕНЮ

Ввод

Вывод

Обработка

Выход

 

 

Модуль Mybibl, содержащий горизонтальное и вертикальное меню, процедуру формирования рамки и установки цветов фона и символов:

Unit MYBIBL;

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. {не нажата любая клавиша}



Поделиться:


Последнее изменение этой страницы: 2017-02-05; просмотров: 212; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.156.250 (0.148 с.)