Языки и технологии программирования
1998 г.Введение Внедрение ЭВМ во все сферы человеческой деятельности требует
от специалистов разного профиля овладения навыками использования вычислительной
техники. Повышается уровень подготовки студентов вузов, которые уже с первых
курсов приобщаются к использованию ЭВМ и простейших численных методов, не говоря
уже о том, при что выполнении курсовых и дипломных проектов применение вычислительной
техники становится нормой в подавляющем большинстве вузов. Вычислительная
техника используется сейчас не только в инженерных расчетах и экономических
науках, но и таких традиционно нематематических специальностях, как медицина,
лингвистика, психология. В связи с этим можно констатировать, что применение
ЭВМ приобрело массовый характер. Возникла многочисленная категория специалистов
- пользователей ЭВМ, которым необходимы знания по применению ЭВМ в своей отрасли
- навыки работы с уже имеющимся программным обеспечением, а так же создания
своего собственного ПО, приспособленного для решения конкретной задачи. И здесь
на помощь пользователю приходят описания языков программирования высокого уровня
(далее ЯВУ) и численные методы (далее ЧМ). ЧМ разрабатывают и исследуют, как
правило, высококвалифицированные специалисты-математики. Для большинства пользователей
главной задачей является понимание основных идей и методов, особенностей
и областей применения. Однако, пользователи хотят работать с ЭВМ не только
как с высокоинтеллектуальным калькулятором, а еще и как с помощником в повседневной
работе, хранилищем информации с быстрым и упорядоченным доступом, а так же
с источником и обработчиком графической информации. Все эти функции современной
ЭВМ я предполагаю продемонстрировать в настоящей курсовой работе. В первой части
работы представлена программа по нахождению корней системы из двух нелинейных
уравнений методами Ньютона и простых итераций. Во второй части моей работы представлена
программа, демонстрирующая пользователю всю мощь и многообразие графических
возможностей современных ПК на примере применения графических функций
языка С++ с использованием VGA-графики. В третьей части работы представлена программа
«Электронной записной книжки», которая имеет и практическое значение для
пользователей маломощных персональных компьютеров и ПК блокнотов с малым дисковым
ресурсом для которых нерентабельна эксплуатация ПО типа Lotus Organizer и подобных
ПО с мощным графическим интерфейсом. К моему сожалению из-за отсутствия
необходимого справочного материала мне не удалось продемонстрировать в третьей
части SUPER VGA-графику, но это дело недалекого будущего. Первая и вторая части
работы выполнены с применение языка С++ фирмы Borland версии 3.1 для DOS и WINDOWS,
а третья часть выполнена на ЯВУ «Турбо Паскаль» версии 7.0 для DOS и WINDOWS
фирмы Borland с применением средств TURBO VISION.Теоретическая часть.Этапы
решения задачи на ЭВМ. Наиболее эффективное применение ВТ нашла при проведении
трудоемких расчетов в научных исследованиях и инженерных расчетах. При решении
задачи на ЭВМ основная роль все-таки принадлежит человеку. Машина лишь выполняет
его задания по разработанной программе. роль человека и машины легко уяснить,
если процесс решения задачи разбить на перечисленные ниже этапы.Постановка задачи.
Этот этап заключается в содержательной (физической) постановке задачи и
определении конечных решений.Построение математической модели. Модель должна правильно
(адекватно) описывать основные законы физического процесса. Построение
или выбор математической модели из существующих требует глубокого понимания проблемы
и знания соответствующих разделов математики.Разработка ЧМ. Поскольку ЭВМ
может выполнять лишь простейшие операции, она «не понимает» постановки задачи,
даже в математической формулировке. Для ее решения должен быть найден численный
метод, позволяющий свести задачу к некоторому вычислительному алгоритму. В
каждом конкретном случае необходимо выбрать подходящее решение из уже разработанных
стандартных.Разработка алгоритма. Процесс решения задачи(вычислительный процесс)
записывается в виде последовательности элементарных арифметических и логических
операций, приводящей к конечному результату и называемой алгоритмом решения
задачи.Программирование. Алгоритм решения задачи записывается на понятном
машине языке в виде точно определенной последовательности операций - программы.
Процесс обычно производится с помощью некоторого промежуточного языка, а ее
трансляция осуществляется самой машиной и ее системой.Отладка программы. Составленная
программа содержит разного рода ошибки, неточности, описки. Отладка включает
контроль программы, диагностику (поиск и определение содержания) ошибок,
и их устранение. Программа испытывается на решении контрольных (тестовых) задач
для получения уверенности в достоверности результатов.Проведение расчетов. На
этом этапе готовятся исходные данные для расчетов и проводится расчет по отлаженной
программе. при этом для уменьшения ручного труда по обработке результатов
можно широко использовать удобные формы выдачи результатов в виде текстовой и
графической информации, в понятном для человека виде.Анализ результатов. Результаты
расчетов тщательно анализируются, оформляется научно-техническая документация.Математические
модели. Основное требование, предъявляемое к математической
модели, - адекватность рассматриваемому процессу, явлению, т.е. она должна достаточно
точно ( в рамках допустимой погрешности) отражать характерные черты явления.
Вместе с тем она должна обладать сравнительной простотой и доступностью исследования.Адекватность
и сравнительная простота модели не исчерпывают предъявляемых
к ней требований. Необходимо обратить внимание на правильность оценки области
применимости математической модели. Например, модель свободно падающего
тела, в которой пренебрегли сопротивлением воздуха, весьма эффективна для твердых
тел с большой и средней плотностью и формой поверхности, близкой к сферической.
Вместе с тем, в ряде других случаев для решения задачи уже не достаточно известных
из курса физики простейших формул. Здесь необходимы более сложные математические
модели, учитывающие сопротивление воздуха и прочие факторы. Отметим,
что успех решения задачи в значительной степени определяется выбором математической
модели; здесь в первую очередь нужны глубокие знания той области, к которой
принадлежит поставленная задача. Кроме того, необходимы знания соответствующих
разделов математики и возможностей ЭВМ.Численные методы.С помощью математического
моделирования решение научно-технической задачи сводится к решению математической
задачи, являющейся ее моделью. Для решения математических задач используются
основные группы методов: графические, аналитические, численные.Графические
методы позволяют в ряде случаев оценить порядок искомой величины. Основная
идея этих методов состоит в том, что решение находится путем геометрических построений.
Например, для нахождения корней уравнения f(x)=0 строится график функции
y=f(x), точки пересечения которого с осью абсцисс и будут искомыми корнями.При
использовании аналитических методов решение задачи удается выразить с помощью
формул. В частности, если математическая задача состоит в решении простейших
алгебраических или трансцендентных уравнений, дифференциальных уравнений и т.п.,
то использование известных из курса математики приемов сразу приводит к цели.
К сожалению, на практике это слишком редкие случаи.Основным инструментом для
решения сложных математических задач в настоящее время являются численные методы,
позволяющие свести решение задачи к выполнению конечного числа арифметических
действий над числами; при этом результаты получаются в виде числовых значений.
Многие ЧМ разработаны давно, однако при вычислениях вручную они могли использоваться
лишь для решения не слишком трудоемких задач.С появлением ЭВМ начался
период бурного развития ЧМ и их внедрения в практику. Только вычислительной машине
под силу выполнить за сравнительно короткое время объем вычислений в миллионы,
миллиарды и более операций, необходимых для решения многих задач. При счете
вручную человеку не хватило бы жизни для решения одной такой задачи. ЧМ наряду
с возможностью получения результата за приемлемое время должен обладать и еще
одним важным качеством - не вносить в вычислительный процесс значительных погрешностей.Численные
методы, используемые в данной работе.При написании программы
решения системы из двух нелинейных уравнений мною использовались два известных
и широко применяемых численных метода. Это метод Ньютона и метод простых итераций.Метод
Ньютона. Этот метод обладает быстрой сходимостью и сравнительно хорошей
точностью вычислений. В случае одного уравнения F(x)=0 алгоритм метода был
легко получен путем записи уравнения касательной к кривой y=F(x). В основе метода
ньютона для системы уравнений лежит использование разложения функций Fi(x1,x2,...xn)
в ряд Тейлора, причем члены, содержащие вторые (и более высоких порядков)
производные, отбрасываются.Пусть приближенные значения неизвестных системы
уравненийF1(x1,x2,...xn)=0,F2(x1,x2,...xn)=0,................(1)
Fn(x1,x2,...xn)=0,(например, полученные на предыдущей итерации) равны соответственно
a1,a2,...an. Задача состоит в нахождении приращений (поправок) к этим
значениям ?x1,??x2,....,??xn, благодаря которым решение системы (1) запишется
в виде:xi=ai+??x1, x2=a2+??x2,...,xn,=an+??xn.(2)Проведем разложение левых
частей уравнений (1) в ряд Тейлора, ограничиваясь лишь линейными членами относительно
приращений:F1(x1,x2,...xn)??F1(a1,...an)+ F2(x1,x2,...xn)??F2(a1,...an)+..............................................Fn(x1,x2,...xn)??Fn(a1,...an)+.Поскольку
в соответствии с (1) левые части этих выражений должны обращаться в нуль,
то приравняем нулю и правые части. Получим следующую систему линейных алгебраических
уравнений относительно приращений:=-F1=-F2(2)............................=-FnЗначения
F1,F2,...,Fn и их производные вычисляются при x1=a1, x2=a2,...xn=an.Определителем
системы (2) является якобиан: J= Для существования единственного
решения системы (2) он должен быть отличным от нуля на каждой итерации.Таким
образом, итерационный процесс решения системы уравнений (1) методом Ньютона
состоит в определении приращений ?x1,??x2,...??xn, к значениям неизвестных
на каждой итерации. Счет прекращается, если все приращения становятся малыми по
абсолютной величине: max|??xi|#include //описание переменных, используемых в
программеdouble pi=3.14,a=1.8,b=-2.0,c=0.1,d=1.6,e=0.9,eps=0.000001;int i=0;double
x,y;//описания функций решения методами Ньютона и простых итерацийextern double
newton(double xn,double yn);extern double iterac(double xn,double yn);int
main(void){//запрос начального приближения у пользователяscanf("%f",x)scanf("%f",y)//вывод
результатов через вызовы функций на экран printf ("Окончательное решение
по методу Ньютона\n"); printf ("%g\t%g\n", newton(x,y)); printf ("Окончательное
решение по методу итераций\n"); printf ("%g\t%g\n", iterac(x,y));return
(0);}//функция решения системы уравнений методом ньютонаdouble newton(double xn,double
yn){ double f1,f2,xxn,yyn; double df1dx,df1dy,df2dx,df2dy,dxy;do { i++;//описания
исходных ураванений f1=sin(xn+a)+b*yn+c; f2=cos(yn+d)+e*xn;//производные
df1dx=cos(xn+a); df1dy=b; df2dx=e; df2dy=-sin(yn+d);//якобиан системы dxy=df1dx*df2dy-df1dy*df2dx;//очередное
значение х xxn=xn-((f1*df2dy-f2*df1dy)/dxy);//очередное
значение y yyn=yn+((f1*df2dx-f2*df1dx)/dxy);//проверка точности решения
и окончания счета if (fabs(xxn-xn)#include #include #include #include #include
#define NFONTS 11char *Fonts[NFONTS] = { "Default_Font", "Triplex_Font",
"Small_Font", "SansSerif_Font", "Gothic_Font", "Script_Font", "Simplex_Font", "TriplexScript_Font",
"Complex_Font", "European_Font", "Bold_Font"};int xmax,ymax,i=0,MaxColors;////прототипы
функций//void demoline(void);void democircle(void);void
demopix(void);void demopieslice(void);void demotext (void);void MainWindow(char
*header);void DrawBorder(void);void StatusLine(char *msg);void demoarcs(void);void
demobars(void);void demo3dbars(void);void diagram(void);void endpage(void);void
endpage1(void);void endpage2(void);////начало главной функции//int
main(void){ /* автоматическое определение типа видеоадаптера */ int gdriver =
DETECT, gmode, errorcode; char msg[80]; // инициализация графических и локальных
переменных initgraph(gdriver,gmode,""); xmax=getmaxx(); ymax=getmaxy();// проверка
результатов инициализации errorcode = graphresult(); if (errorcode != grOk)
{ printf("Graphics error: %s\n", grapherrormsg(errorcode)); printf("Press any
key to halt:"); getch(); exit(1); }//вызовы функций demoline(); demopix(); demobars();
demo3dbars(); demopieslice(); diagram(); democircle(); demoarcs(); demotext();
endpage(); endpage1(); endpage2(); cleardevice(); closegraph(); return
0;}////функция демонстрации линий//void demoline(void){//формирование графического
окна и статусной строкиMainWindow( "Line demonstration" );StatusLine( "Press
any key to continue..." );//процесс рисования линий do { setcolor( random(
MaxColors - random(15) ) + random(15) ); lineto (xmax,i); lineto (xmax,ymax);
lineto (i,ymax); lineto (i+1,i+1); i=i+1;xmax=xmax-1;ymax=ymax-1;}while (xmax!=(xmax/2));getch();cleardevice();clearviewport();}////функция
демонстрации окружностей//void
democircle(void)//xmax=getmaxx();//ymax=getmaxy();{MainWindow( "Circle
demonstration" );StatusLine( "Press any key to continue..." );randomize();moveto(random(xmax),random(ymax));do{
i++; //установка случайного цвета setcolor(
random( MaxColors - random(15) ) + random(15) ); circle(random(getmaxx()),random(getmaxy()),random(100));}
while( !kbhit() );// повторение пока не нажата
клавиша getch();clearviewport();i=1;do{ i++; setcolor( random( MaxColors - random(15)
) + random(15) ); circle(getmaxx()/2,getmaxy()/2,i); if (i==400) {setcolor(0);do
{i--;circle(getmaxx()/2,getmaxy()/2,i);}while(i!=0);}}while( !kbhit()
); // повторение пока не нажата клавишаgetch();cleardevice();}////функция демонстрации
рисования точек в произвольном //порядке//void demopix(void){MainWindow(
"Pix demonstration" );StatusLine( "Press any key to continue..." ); do { i++;
setcolor( random( MaxColors - random(15) ) + random(15) ); putpixel(random(getmaxx()),random(getmaxy()),random(15));
} while( !kbhit() ); // повторение пока
не нажата клавишаxmax=getmaxx();ymax=getmaxy();getch();cleardevice();}////функция
демонстрации рисования секторов//void demopieslice(void){MainWindow( "Pie Chart
Demonstration" );StatusLine( "Press any key to continue..." );do{ i++; setcolor(random(
MaxColors - random(15) ) + random(15)); setfillstyle(random(12),
getmaxcolor()); // setcolor(random( MaxColors - random(15) ) + random(15)); pieslice(random(getmaxx()),random(getmaxy()),random(360),random(360),random(150));
if(i>1000) {clearviewport();i=0;}} while( !kbhit() ); // повторение пока не нажата
клавишаgetch();clearviewport();}////круговая диаграмма//void diagram(void){
int sektors[] = {20,10,35,15,20}; char *percent[]={"20%","10%","35%","15%","20%"};
int secsize,k=0,i,r=150;MainWindow( "Pie Chart Demonstration" );StatusLine(
"Press any key to continue..." ); settextjustify(CENTER_TEXT,CENTER_TEXT);
settextstyle(5,0,2);//установка атрибутов текста outtextxy( getmaxx()/2,25,"This
is the pie chart diagramm");//процесс рисования диаграммы по данным из массива
for( i=0;i10000) {clearviewport();i=0;}} while( !kbhit() ); // повторение пока
не нажата клавишаgetch();clearviewport();i=0;//рисование многоугольников с произвольным
цветомdo{ i++; poly[0] = random(i+random(20));//1-вершина poly[1] =
random(random(ymax)/i+2); poly[2] = xmax-(i+20); /* 2-я */ poly[3] = i+20; poly[4]
= xmax-(i+50); /* 3-я */ poly[5] = ymax-(i+20); poly[6] = i+xmax/2; /* 4-я
*/ poly[7] = i+ymax/2;/* drawpoly автоматически не закрывает многоугольник поэтому
необходимо это сделать самому*/ poly[8] = poly[0]; poly[9] = poly[1];//рисует
многоугольники, изменяя координаты вершин setcolor(random( MaxColors - random(15)
) + random(15)); drawpoly(5, poly); if(i>1000) {clearviewport();i=0;}}
while( !kbhit() ); // повторение пока не нажата клавишаgetch();clearviewport();}////функция
демонстрации закрашеных многоугольников и //цветов//void demobars(void){
MainWindow( "Bars and colors demonstration" ); StatusLine( "Press any key
to continue..." ); int kxb=15,kyb=15; double stx,sty,x,y; stx=floor(getmaxx()/kxb);
sty=floor(getmaxy()/kyb); do{ for(x=3;x100) {clearviewport();i=0;} }while(
!kbhit() ); // повторение пока не нажата клавишаgetch();clearviewport();}////функция
создания завершающей страницы//void endpage(void){MainWindow( "The cycle"
);StatusLine( "Press any key to continue..." );int i,j,rad=50;do{ for (i=0;i
0 then Rewrite(Datafile); OpFileF := IOResult=0; {$I+} if OpFileF then begin
DisableCommands(WinCom2); EnableCommands(WinCom1); Work {переход к работе} endend;end;
{caseControl} Dispose(PF, Done) {уничтожение экземпляра}end; {FileOpen}{---------------------------}procedure
TNotebook.FileSave;{закрывает файл данных}
begin Close(DataFile); OpFileF :=False; EnableCommands(WinCom2); {разрешение
открыть файл} DisableCommands(WinCom1) {запрещение работы и сохранение} end;
{TNotebook.FileSave}{--------------------------}procedure TNotebook.ChangeDir;{изменяет
текущий каталог}var PD: PChDirDialog; {диалоговое окно смены каталога
диска} Control: Word;begin New(PD, Init(cdNormal,0)); {создание диалогового окна}
Control :=DeskTop^.ExecView(PD); {использование окна} ChDir(PD^.DirInput^.Data^);
{установка нового каталога} Dispose(PD, Done) {удаление окна из кучи}end;
{TNotebook.ChangeDir}{-------------------------}procedure TNotebook.DOSCall;{временный
выход в дос}const txt='Для возврата введите EXIT в ответ'+ 'на приглашение
ДОС...';begin DoneEvents; {закрыть обработчик событий} DoneVideo; {закрыть
монитор экрана} DoneMemory; {закрыть монитор памяти} SetMemTop(HeapPtr); {освободить
кучу} writeln('Введите EXIT для возврата'); {выдать сообщение о выходе}
SwapVectors; {установить стандартные векторы} {передать упр. ком. процессору дос}
Exec(GetEnv('COMSPEC'),''); {возврат из дос} SwapVectors; {восстановить векторы}
SetMemTop(HeapEnd); {восстановить кучу} InitMemory; {открыть монитор памяти}
InitVideo; {открыть монитор экрана} InitEvents; {открыть обработчик событий}
InitSysError; {открыть обработчик ошибок} Redraw {восстановить вид экрана}end;
{DOSCall}{------------------------------}constructor TInterior.Init; {создает
окно скроллера}begin TScroller.Init(Bounds, HS, VS); ReadFile; GrowMode :=gfGrowHiX+gfGrowHiY;
SetLimit(LLine, PS^.Count)end;{-----------------------}destructor
TInterior.Done;begin Dispose(PS,Done); inherited Doneend;{--------------------------}procedure
TInterior.ReadFile;{читает содержимое файла данных в массив
LINES}var k: Integer; s: String; Data: DataType; f: text;begin PS:= New(PStringCollection,
Init(100,10)); seek(DataFile,0); while not (EOF(DataFile) or LowMemory)
do begin Read(DataFile, data); with data do begin s:= Name; while Length(s)
'' then PS^.Insert(NewStr(S)) end; Location:= 0;end; {ReadFile}{----------------------------}procedure
Tinterior.Draw;{выводит данные в окно просмотра}var
n, {текущая строка экрана} k: integer; {текущая строка массива} B: TDrawBuffer;
Color: Byte; p: PString; begin if Delta.Y>Location then Location:= Delta.Y; if
Location>Delta.Y+pred(Size.Y) then Location:= Delta.Y+pred(Size.Y); for n:= 0
to pred(Size.Y) do {Size.Y- кол-во строк окна} begin k:= Delta.Y+n; if k=Location
then Color:= GetColor(2) else Color:= GetColor(1); MoveChar(B,' ',Color,Size.X);
if kPS^.Count then write(DataFile,Data) {да - добавляем в файл} end until
Edit or (Control=cmCancel); Drawend; {AddItem}{--------------------}procedure SearchItem;{ищет
нужный элемент }function UpString(s: String): string;{преобразует
строку в верхний регистр}var k: Integer;begin for k:=1 to Length(s) do if s[k]
in ['a'..'z'] then s[k]:=chr(ord('A')+ord(s[k])-ord('a')) else if s[k] in ['а'..'п']
then s[k]:=chr(ord('A')+ord(s[k])-ord('a')) else if s[k] in ['р'..'я']
then s[k]:=chr(ord('P')+ord(s[k])-ord('p')); UpString:=send; {UpString}var InWin:
PDialog; R: TRect; s: String; p: PInputLine; k: Word;begin {SearchItem} R.Assign(15,8,65,16);
InWin:=New(PDialog, Init(R,'Поиск записи:')); with InWin^ do
begin R.Assign(2,2,47,3); p:=New(PInputLine,Init(R,50)); Insert(p); R.Assign(1,1,40,2);
Insert(New(PLabel, Init(R, 'Введите образец поиска:',p))); R.Assign(10,5,20,7);
Insert(New(PButton,Init(R,'Ввести',cmOK,bfDefault))); R.Assign(25,5,35,7);
Insert(New(PButton,Init(R,'Выход',cmCancel,bfNormal))); SelectNext(False)
end; if DeskTop^.ExecView(InWin)=cmCancel then exit;s:=p^.Data^;Location:=0;while
(UpString(s)>=UpString(PString(PS^.At(Location))^)) and (Location