Алмати
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 ("% gt% gn ", newton (x, y)); printf (" Остаточне
рішення за методом ітераційn "); printf ("% gt% gn ", 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:% sn", 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