Реферат: Языки и технологии программирования

Алматы 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.Задача состоит в нахождении приращений (поправок) к этим значениям Dx1, Dx2,...., Dxn,благодаря которым решение системы (1) запишется в виде:

     xi=ai+ Dx1, x2=a2+ Dx2,...,xn,=an+ Dxn.      (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) методом Ньютона состоит в определении приращений Dx1, Dx2,… Dxn, кзначениям неизвестных на каждой итерации. Счет прекращается, если всеприращения становятся малыми по абсолютной величине: max| Dxi|< e. В методе

                                     i

Ньютона также важен выбор начального приближения дляобеспечения хорошей сходимости. Сходимость ухудшается с увеличением числауравнений системы.

     В качестве примера рассмотрим использование методаНьютона для решения системы двух уравнений

                        F1(x,y)=0,              (3)

                        F2(x,y)=0.

Пусть приближенные значения неизвестных равны a,b. Предположим, что якобиан системы (3) при x=a; y=bотличается от нуля, т.е.:

 

                        J=/>¹0.

Тогда следующие приближения неизвестных можно аписать в виде

           x=a-/>(F1/>

          />

Величины, стоящие в правой части, вычисляются при x=a, y=b.

     При программировании данного метода в качестве исходныхданных задаются начальные приближения неизвестных a,b,погрешности e. Если итерации сойдутся,то выводятся значения x,y; в противном случаепроисходит вывод x,y по мере работы программы допрерывания ее пользователем.

Метод простой итерации.

     Систему уравнений (1) представим в виде

              x1=f1(x1...xn),

              x2=f2(x1...xn),               (4)

              .............

              xn=fn(x1...xn).

Алгоритм решения этой системы методом простой итерациинапоминает метод Гаусса — Зейделя, используемый для решения систем линейныхуравнений.

     Пусть в результате предыдущей итерации  полученызначения неизвестных x1=a1, x2=a2,...,xn=an. Тогда выражения для неизвестных наследующей итерации имеют вид

              x1=f1(a1,a2,...,an),

              x2=f2(x1,a2,...,an),

              ..................

              xi=fi(xi,...,xi-1,ai,...,an),

              ..................

              xn=fn(x1,...,xn-1,an).

Итерационный процесс продолжается до тех пор, пока изменениявсех неизвестных в двух последовательных итерациях не станут малыми, т.е.абсолютные величины их разностей не станут меньшими заданного малого числа.

     При использовании данного метода успех во многомопределяется удачным выбором начальных приближений неизвестных: они должны бытьдостаточно близкими к истинному решению. В противном случае итерационныйпроцесс может не сойтись.

          Часть первая.             Программа решениясистемы нелинейных уравнений методами Ньютона и простых итераций.

Общие сведения. Даннаяпрограмма разработана как учебная и в силу этого не имеет кодового обозначенияпредусмотренного ГОСТом 19.402-78 и представляет собой исполняемый файл kursach.ехе.

Для функционирования программынеобходим персональный компьютер с установленной операционной системой MS-DOS 3.30 и выше или полностью совместимой с ней.

Исходный текст программы написанна языке программирования высокого уровня С++ фирмы Borland  версии3.1 для DOS и WINDOWS исодержится в файле kursach.срр в формепригодной к использованию его как текстового документа в среде ДОС. Исходныйтекст программы приведен в приложении 1.в

Функциональное назначение.Данная программа решает систему нелинейных уравнений методами Ньютона и простыхитераций. Программа не является универсальной и решает только заложенную в неёсистему только из двух нелинейных уравнений.

Для расширения функциональностипрограммы необходимо внести соответствующее изменение в исходный текст как то:изменение исходной системы, производных, якобиана системы.

Описание логической структуры.Блок-схема программы приведена в приложении 4.

При написании программыиспользовались математические методы, описанные в теоретической части настоящейработы.

Функционально программа состоитиз трех функций main, newton, iterac. Взаимодействиефункций между собой производится путем вызова из функции main функцийnewton и iterac с передачейпараметров, в качестве которых используются переменные х и у в которые помещеныначальные приближения, запрашиваемые у пользователя со стандартного устройстваввода, для обеспечения исходных данных к методам решения. После окончаниярасчета функции newton и iteracвозвращают в функцию main результаты расчета в видепары чисел, которые представляют собой корни системы уравнений, выводимые настандартное устройство вывода для дальнейшего анализа пользователем.

Используемые техническиесредства. Для функционирования программы пригодна минимальная конфигурацияЭВМ на основе процессорной серии Ix86 фирмы Интел с 640Кб оперативной памяти и накопителем  на гибком магнитном диске.

Для вывода информации пригоденграфический адаптер CGA и однотипный видеомонитор.

Вызов и загрузка программыосуществляется как с гибкого диска так и с накопителя типа «винчестер». Прилюбом вызове в командной строке ДОС следует ввести полное имя исполняемогофайла с указанием пути (если таковой не описан в переменной PATHфайла AUTOEXEC.BAT).

Входные и выходные данные.В качестве входных данных для программы используется пара вещественных чиселпредставляющих собой приближенные значения корней системы уравнений, решаемойпрограммой. Числа могут быть как с дробной частью так и без неё.

В качестве выходных данныхпрограмма выдает на стандартное устройство вывода информации пару чисел,представляющих собой истинное решение системы уравнений в вещественной форме. Вслучае если количество знаков после десятичной точки велико, то выводпроизводится в экспоненциальной форме.

Часть вторая.Демонстрационная программаграфических функций языка С++.

Общие сведения. Даннаяпрограмма разработана как учебная и в силу этого не имеет кодового обозначенияпредусмотренного ГОСТом 19.402-78 и представляет собой исполняемый файл grafika.exe и файлов поддержки:

                   Таблица1.

Egavga.bgi библиотека взаимодействия с графическим адаптером bold.chr библиотека жирного шрифта euro.chr библиотека шрифта «euro» goth.chr библиотека готического шрифта lcom.chr библиотека шрифта типа «Комплекс» litt.chr библиотека шрифта типа «small» sans.chr библиотека шрифта типа «Сан_сериф» scri.chr библиотека шрифта типа «Скрипт» simp.chr библиотека шрифта типа «Симплекс» trip.chr библиотека шрифта типа «Триплекс» tscr.chr библиотека шрифта тапа «Триплекс_Скрипт»

Вышеприведенные файлы необходимо разместить в той жедиректории, что и основной модуль.

Для функционирования программынеобходима операционная система MS DOS 3.30 и выше илиполностью совместимой с ней.

Исходный текст программы написанна языке программирования высокого уровня С++ фирмы Borland  версии3.1 для DOS и WINDOWS исодержится в файле grafika.сррв форме пригодной к использованию его как текстового документа в средеДОС. Исходный текст программы приведен в приложении 2.

     Функциональное назначение.Программа предназначена для демонстрации основных графических возможностейязыка С++ в режиме VGA. Программа дает представление оструктуре графических возможностей языка и способах их применения на практике.Функциональным ограничением программы является невозможность её эксплуатации накомпьютерах, оснащенных видеоадаптерами, стандарт которых отличается от EGA-VGA.

     Описание логической структуры. Программа ненесет в себе единого алгоритма в привычном понимании и поэтому блок-схема неприводится. Методы, использованные при написании программы, не являютсяматематическими или прочими стандартными и будут описаны ниже при описаниисоответствующих функций.

Структурно программа grafika.срр представляет ряд функций,которые кратко описаны в таблице.2

Таблица.2

наименование функции в программе краткое описание main главная функция из которой вызываются все другие функции demoline функция демонстрации рисования линий с применением оператора lineto различными цветами democircle функция демонстрации рисования окружностей произвольного радиуса с произвольным выбором цвета и координат центра demopix функция рисования точек в произвольном месте экрана с произвольным цветом demopieslice функция рисования закрашенных секторов с произвольным расположением на экране, произвольным выбором угла, радиуса, стиля заполнения и цвета demotext функция демонстрации вывода текстовых данных в графическом режиме всеми доступными в языке С++ стандартными способами и шрифтами c применением библиотек шрифтов, перечисленных в таблице.1 mainwindow функция формирования на экране графического окна с указанным заголовком *header drawborder функция прорисовки границ графического экрана statusline функция формирования статусной строки с выводом сообщения *msg demoarcs функция вывода на экран дуг (частей окружностей) с произвольным начальным углом, цветом и координатами центра demobars функция вывода на экран определенного числа одинаковых прямоугольников с произвольно изменяющимся цветом demo3dbars функция демонстрации вывода на экран прямоугольных параллелепипедов произвольного размера, способа заполнения передней грани, и цвета, а так же расположения на экране diagram функция демонстрации практического применения функции void pieslice(...) языка С++ для построения круговой диаграммы по заданным параметрам endpage функция демонстрации практического применения рисования линий и секторов с циклически изменяющимися параметрами endpage1 функция практического применения операторов языка С++ для построения простого калейдоскопа endpage2 завершающая страница, сообщающая пользователю о завершении работы программы

Кроме функций mainwindowи statusline все остальные функции не имеютвходных и выходных параметров. Функция mainwindow вкачестве параметра использует символьную строку передаваемую ей вызывающейфункцией, также действует и функция statusline. Всефункции вывода изображения кроме mainwindow, statusline,drawborder вызываются из главной функции по порядку, авышеперечисленные вызываются из функций вывода изображения.

Каждая функция вывода изображениявызывает функцию формирования графического окна с необходимым заголовком атакже определяет визуальные границы экрана при помощи функции drawborderи помещает в нижнюю часть экрана статусную строку при помощи функции statusline с необходимой надписью. Затем начинается процессвывода на экран самого изображения, демонстрирующего работу той или инойграфической функции языка С++. После прекращения работы управление переходит вглавную  функцию, откуда вызывается следующая функция вывода изображения.

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

Используемые техническиесредства. Для правильного функционирования программы необходимо применятьследующие компоненты аппаратного комплекса: персональный компьютер класса Ix86 с 640Кб ОЗУ, оснащенный одним накопителем на гибкоммагнитном диске 720Кб или накопителем типа «винчестер», а так же видеоадаптеромEGA или VGA (предпочтительно).Компьютеррекомендуется оснастить видеомонитором, соответствующим видеоадаптеру.

Вызов и загрузка. Дляправильного функционирования программы необходимо разместить основной модуль исопутствующие файлы в одной директории. Для вызова программы необходимо вкомандой строке ДОС набрать полное имя основного модуля. Никаких параметров вкомандной строке не требуется.

Входные и выходные данные.Данная программа является демонстрационной и не использует входных данных отпользователя. Выходными данными являются результаты работы функций по выводуизображений на экран. Параметры  изображения сохраняются только на экране впроцессе работы программы (данной функции).

Часть третьяПрограмма электронной записнойкнижки

Общие сведения. Данная программа разработана какучебная и в силу этого не имеет кодового обозначения предусмотренного ГОСТом19.402-78 и представляет собой исполняемый файл notebook.exe и создаваемые ею в процессе работы файлы данныхпользователя, структура которых приводится в приложении 3.

Для функционирования программынеобходима операционная система MS DOS 3.30 и выше илиполностью совместимой с ней.

Исходный текст программы написанна языке программирования высокого уровня Турбо Паскаль версии 7.0 фирмы Borland для DOS и WINDOWSс применением библиотеки Turbo Vision и содержится вфайле notebook.pasв форме пригодной киспользованию его как текстового документа в среде ДОС,и приведен в приложении 3.

     Функциональное назначение. Данная программапредназначена для ведения файлов баз данных подобных страницам адреснойзаписной книжки и способна полностью заменить собой ее бумажныхпредшественников. Информация из файлов программы применяется только в«электронном» варианте и не может быть выведена на устройство печати (даннаяфункция в программе отсутствует). В процессе работы программа  создает файлданных и поэтому пользователю не требуется предварительно создавать его самому.

     Описание логической структуры. Программа ненесет в себе определенного алгоритма в стандартном понимании, а являетсяобъектно-ориентированной программой (применены специфические конструкции языка- объекты).

     В силу сложившихся традиций и особенностей языка ТурбоПаскаль данная программа представляет собой ряд процедур, выполняющихопределенную роль и взаимодействующих между собой в рамках исполнительногомодуля. Каждая функция выполняет определенное действие исходя из параметровполученных от других функций или от пользователя.

Основной текст программы можно разделить на две части:первая — описание переменных и объектов; вторая — реализация процедур. Ниже втаблице 3 приводятся процедуры, применяемые в программе, а в таблице 4 — объекты.

Таблица 3

tdlgwin.handleEvent Tnotebook.FileOpen открывает файл данных Tnotebook.FileSave сохраняет файл данных Tnotebook.ChangeDir изменяет текущий каталог Tnotebook.DOSCall временный выход в ДОС Tinterior.ReadFile читает содержимое файла данных в массив LINES Tinterior.Draw выводит данные в окно просмотра Control получает команду из основного диалогового окна Tinterior.HandleEvent основная процедура обработки событий и операций с файлом данных DEleteItem удаляет указанный в Location элемент данных AddItem добавляет новый или редактирует имеющийся элемент данных SearchItem осуществляет поиск необходимого элемента данных по контексту (первые символы) Tnotebook.Work создает окно, в которое в последствии будут выводиться данные Tnotebook.HandleEvent обработчик событий программы связанных с различными объектами Tnootebook.InitMenuBar создание верхнего Bar-меню Tnotebook.InitStatusLine формирование строки статуса

таблица 4.

Tworkwin объект-потомок от Twindow — стандартного объекта ТурбоВижн создает рамочное окно с полосами прокрутки для управления встроенным в него объектом  Tinterior Tdlgwin объект-потомок от Tdialog — стандартного объекта ТурбоВижн создает диалоговое окно для выбора режима работы Tinterior объект-потомок от Tscroller — стандартного объекта ТурбоВижн обуславливает внутреннюю часть рамочного окна Tworkwin, создает прокручиваемое окно с записями из файла данных и с помощью диалогового окна Tdlgwin управляет работой с этими записями Tnotebook оъект-потомок от Taplication стандартного объекта ТурбоВижн обеспечивающего внешний вид прикладной программы.

Используемые техническиесредства. Для правильного функционирования программы необходимо применятьследующие компоненты аппаратного комплекса: персональный компьютер класса Ix86 с 640Кб ОЗУ, оснащенный одним накопителем на гибкоммагнитном диске 720Кб или накопителем типа «винчестер», а так же видеоадаптеромEGA или VGA (предпочтительно).Компьютеррекомендуется оснастить видеомонитором, соответствующим видеоадаптеру.

Вызов и загрузка. Длявызова программы необходимо в командой строке ДОС набрать полное имя основногомодуля. Никаких параметров в командной строке не требуется.

Входные и выходные данные.Входными и выходными данными для программы является файл (файлы) данныхпользователя и выводит информацию, содержащуюся в них на экран дисплея.

Приложения

приложение 1

#include <stdio.h>

#include <math.h>

//описание переменных, используемых в программе

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)<eps||fabs(yyn-yn)<eps) goto b;

//изменение текущих значений переменных х и у

 xn=xxn; yn=yyn;

}

while (1);

 b: return (xxn,yyn);

}

//решение системы уравнений методом простых итераций

double iterac(double xi, double yi)

{

 double xxi,yyi;

  do

{

   i++;

//явное выражение переменной x

 xxi=-cos(yi+d)/e;

//явное выражение переменной y

 yyi=-(sin(xi+a)+c)/b;

//проверка точности решения  и ококнчания счета

   if (fabs(xxi-xi)<eps||fabs(yyi-yi)<eps) goto c;

//изменение текущих значений

   xi=xxi;yi=yyi;

}

  while(1);

c: return (xxi,yyi);

}

Приложение2

//

#include <graphics.h>

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

#include <time.h>

#include <math.h>

#define NFONTS 11

char *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 chartdiagramm»);

//процесс рисования диаграммы по данным из массива

     for( i=0;i<5;i++)

  {

   secsize = (360 * sektors[i])/100;

   setfillstyle(i,i);

   pieslice((getmaxx()/2),(getmaxy()/2),k,k+secsize,r);

   k = k+secsize;

  }

//подписи процентов

 outtextxy( getmaxx()/2+r+30,getmaxy()/2-70,percent[0]);

 outtextxy( getmaxx()/2,getmaxy()/2-r-30,percent[1]);

 outtextxy( getmaxx()/2-r-30,getmaxy()/2,percent[2]);

 outtextxy( getmaxx()/2,getmaxy()/2+r+30,percent[3]);

 outtextxy( getmaxx()/2+r+20,getmaxy()/2+50,percent[4]);

getch();

settextstyle(0,0,0);

clearviewport();

}

//

//функция демонстрации текста в графическом окне

//

void demotext(void)

{

int midx,midy,i;

MainWindow( «Demonstration text in the graphicsscreen» );

StatusLine( «Press any key to continue...» );

settextjustify(CENTER_TEXT,CENTER_TEXT);

midx=getmaxx()/2;

midy=getmaxy()/2;

outtextxy( midx,midy-40,«This programm will demonstrateto you all graphics»);

outtextxy( midx,midy+40,«functions of the C++language»);getch();clearviewport();

 for (i=0;i<11;i++)

   {

    settextstyle(i,0,0);

    outtextxy(midx,midy-40,«This text is write by»);

    outtextxy(midx,midy+40,Fonts[i]);

    getch();clearviewport();

   }

  settextstyle(0,1,1); //вывод вертикального текста

  outtextxy(midx,midy,«This programm created byGrinjoff Mark»);

 settextstyle(0,0,0);/*возвращениеиисходного начертания текста */

getch();

clearviewport();

 }

//

//функция демонстрации рисования дуг и многоугольников

//

void demoarcs(void)

{

int poly[10];

MainWindow( «Arcs and polygons demonstration» );

StatusLine( «Press any key to continue...» );

xmax=getmaxx();

ymax=getmaxy();

i=0;

//рисование дуг с произвольным расположением и цветом

do

{

  i++;

  setcolor(random( MaxColors — random(15) ) + random(15));

 arc(random(xmax),random(ymax),random(358),random(358),random(100));

  if(i>10000) {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;x<getmaxx();x+=stx){

   for(y=3;y<getmaxy();y+=sty){

    setcolor(random( MaxColors — random(15) ) + random(15));

    setfillstyle(SOLID_FILL,random(getmaxcolor()));

    bar(x+3,y+3,x+stx-3,y+sty-3);}}

}

while( !kbhit() ); // повторениепока не нажата клавиша

getch();

clearviewport();

}

//   

//функция демонстрации трехмерных прямоугольников           

//

void demo3dbars(void)

{

  int i;

  MainWindow( «3D Bars demonstration» );

  StatusLine( «Press any key to continue...» );

do

  {

    i++;

    setcolor(random( MaxColors — random(15) ) + random(15));

    setfillstyle(random(5),random(getmaxcolor()));

    bar3d( random( getmaxx() ), random( getmaxy() ),

       random( getmaxx() ), random( getmaxy() ),10,1);

   for(float j=0;j<50000;j++);//эмуляторзадержки

  if(i>100) {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<359;i++)

    {

     setcolor(random( MaxColors — random(15) ) +random(15));

     pieslice(60,60,i,i+1,rad);

     pieslice(580,60,i,i+1,rad);

     pieslice(60,390,i,i+1,rad);

     pieslice(580,390,i,i+1,rad);

    }

  for (i=0;i<getmaxx();i++)

   {

    setcolor(random( MaxColors — random(15) ) + random(15));

    line(getmaxx()/2,10,i,getmaxy()/2);

    line(getmaxx()/2,440,i,getmaxy()/2);

   }

  setcolor(0);

  for (i=0;i<getmaxx();i++)

   {

    line(getmaxx()/2,10,i,getmaxy()/2);

    line(getmaxx()/2,440,i,getmaxy()/2);

   }

}

while( !kbhit() ); // повторениепока не нажата клавиша

getch();

clearviewport();

}

//

//функция калейдоскопа

//

void endpage1(void)

{

  MainWindow( «The simple kaleidoscope» );

  StatusLine( «Press any key for exit to DOS» );

int koord1[4],koord2[4],koord3[4];

//получение координат исходной линии

 koord1[0]=random((getmaxx()/2)+10);

 koord1[1]=random((getmaxy()/2)+10);

 koord1[2]=random((getmaxx()/2)+10);

 koord1[3]=random((getmaxy()/2)+10);

//получение координат конечной линии

 koord2[0]=random((getmaxx()/2)+10);

 koord2[1]=random((getmaxy()/2)+10);

 koord2[2]=random((getmaxx()/2)+10);

 koord2[3]=random((getmaxy()/2)+10);

//прорисовка

do

{

for (float t=0;t<1;t=t+0.01) //количество линий

{

  for (int l=0;l<4;l++) //нахождение координат движения //линии

   {koord3[l]=floor(koord2[l]*(1-t)+koord1[l]*t);}

  setcolor(random( MaxColors — random(15) ) + random(15));

  line(koord3[0],koord3[1],koord3[2],koord3[3]); //первая //четверть

 line(getmaxx()-koord3[0],koord3[1],getmaxx()-koord3[2],koord3[3]);//втораячетверть

 line(koord3[0],getmaxy()-koord3[1],koord3[2],getmaxy()-koord3[3]);//третьячетверть

  line(getmaxx()-koord3[0],getmaxy()-koord3[1],

       getmaxx()-koord3[2],getmaxy()-koord3[3]);//четвертая четверть

 }

  for (int p=0;p<4;p++)//переприсвоение координат

  {koord2[p]=koord1[p];}

//получение новых координат первой линии

koord1[0]=random(getmaxx()/2);

koord1[1]=random(getmaxy()/2);

koord1[2]=random(getmaxx()/2);

koord1[3]=random(getmaxy()/2);

}

while( !kbhit() ); // повторениепока не нажата клавиша

getch();

clearviewport();

}

//

//последняя страница

//

void endpage2(void)

{

  MainWindow( «The end» );

  StatusLine( «Press any key for exit to DOS» );

do

{

    settextstyle(BOLD_FONT,0,2);

    outtextxy(getmaxx()/2,getmaxy()/2,«The end „);

}

while( !kbhit() );

getch();

clearviewport();

}

//

//функция создания графического окна

//

void MainWindow( char *header )

{

  int height;

   xmax=getmaxx();

   ymax=getmaxy();

  cleardevice();//очистка экрана

  setcolor( MaxColors — 2 );//установкатекущего цвета //белым

  setviewport( 0, 0, xmax, ymax, 1 );//открыть окно во //весь экран

  height = textheight( “H» );//установитьначальную высоту //текста

  settextjustify( CENTER_TEXT, TOP_TEXT );

  outtextxy( xmax/2, 2, header );

  setviewport( 0, height+4, xmax, ymax-(height+4), 1 );

  DrawBorder();

  setviewport( 1, height+5, xmax-1, ymax-(height+5), 1 );

}

//

//функция создания строки статуса в нижней частиэкрана

//

void StatusLine( char *msg )

{

  int height;

   xmax=getmaxx();

   ymax=getmaxy();

  setviewport( 0, 0, xmax, ymax, 1 ); //открыть окно во //весь экран

  setcolor( MaxColors — 1 ); //установкатекущего цвета //черным

  settextjustify( CENTER_TEXT, TOP_TEXT );

  setlinestyle( SOLID_LINE, 0, NORM_WIDTH );

  setfillstyle( EMPTY_FILL, 0 );

  height = textheight( «H» );//установкатекущей высоты //текста

  bar( 0, ymax-(height+4), xmax, ymax );

  rectangle( 0, ymax-(height+4), xmax, ymax );

  outtextxy( xmax/2, ymax-(height+2), msg );

  setviewport( 1, height+5, xmax-1, ymax-(height+5), 1 );

}

//

//функция, образующая границу графического окна

//

void DrawBorder(void)

{

//  struct viewporttype vp;

  setcolor( MaxColors — 1 );//установкатекущего цвета //белым

  setlinestyle( SOLID_LINE, 0, NORM_WIDTH );

 // getviewsettings( &vp );

  rectangle( 0, 0, getmaxx(), getmaxy() );

}

приложение3

Program Notebook;

{программа обслуживает файлы данных «записнойкнижки».}

Uses App, Objects, Menus, Drivers, Views, StdDlg, DOS,Memory, Dialogs;

type

{объект TWorkWin создает рамочное окно  с полосами прокруткидля

управления встроенным в него объектом TInterrior}

 PWorkWin =^TWorkWin;

 TWorkWin = object (TWindow)

  Constructor Init(Bounds: Trect);

 end;

{Объект TDlgWin создает диалоговое окно для выбора режимаработы}

PDlgWin =^TDlgWin;

TDlgWin = object (TDialog)

  Procedure HandleEvent (var Event: TEvent); Virtual;

  end;

{Следующий объект обуславливает внутреннюю часть рамочногоокна TWorkWin. Он

создает прокручиваемое окно с записями из архивного файла ис помощью диало-

гового окна TDlgWin управляет работой с этими записями}

PInterior =^Tinterior;

Tinterior = object (TScroller)

  PS: PStringCollection;

  Location: Word;

  Constructor Init (var Bounds: TRect; HS, VS: PScrollBar);

  Procedure Draw; Virtual;

  Procedure ReadFile;

  Destructor Done; Virtual;

  Procedure HandleEvent (var Event: TEvent); Virtual;

end;

{объект-программа ТNotebook поддерживает работу с меню истрокой стстуса}

TNotebook = object (TApplication)

 procedure InitStatusLine; virtual;

 procedure InitMenuBar; virtual;

 procedure HandleEvent (var Event: TEvent); virtual;

 procedure FileSave;

 procedure ChangeDir;

 procedure DOSCall;

 procedure FileOpen;

 procedure Work;

end;

const

  {Команды для обработчиков событий:}

  cmChDir = 202;{сменить каталог}

  cmWork  = 203;{обработать данные}

  cmDOS   = 204;{временно выйти в дос}

  cmCan   = 205;{команда завершения работы}

  cmDelete = 206;{уничтожить текущую запись}

  cmSearch = 207;{искать нужную запись}

  cmEdit = 208;{редактировать запись}

  cmAdd  = 209;{добавить запись}

  {ножество временно недоступных команд:}

  WinCom1: TCommandSet = [cmSave, cmWork];

  WinCom2: TCommandSet = [cmOpen];

  LName=25;      {длина поля NAME}

  LPhone=11;     {---------- PHONE}

  LAddr=40;      {---------- ADDR}

  LLIne=LName+LPhone+LAddr; {длина строки}

type

  DataType = record     {тип данных в файле}

  Name: string [LName]; {имя}

  Phone: string [LPhone];{телефон}

  Addr: string [LAddr]; {адрес}

end;

var

  DataFile: file of DataType; {файловая переменная}

  OpFileF: Boolean; {флаг открытого файла}

{---------------------------------------------

реализация объекта TWorkWin

----------------------------------------------}

constructor TWorkWin.Init(Bounds: Trect);

{создание окна данных}

var

  HS, VS: PScrollBar;  {полосы-указатели}

  Interior: PInterior; {указатель на управляемое текстовоеокно}

begin

TWindow.Init(Bounds,'',0); {создание нового окна с рамкой}

GetClipRect(Bounds);       {получение в BOUNDS кординатыминимальной перерисо-

                           вываемой части окна}

Bounds.Grow(-1,-1);        {установка размеров окна стекстом}

{Включение стандартных по размеру и положениюполос-уаказателей:}

VS:= StandardScrollBar(sbVertical+sbHandleKeyBoard);

HS:= StandardScrollBar(sbHorizontal+sbHandleKeyBoard);

{создание текстового окна:}

Interior :=New(Pinterior,Init(Bounds, HS, VS));

Insert(Interior)  {включение его в основное окно}

end; {TWrkWin.Init}

{--------------------}

procedure TDlgWin.HandleEvent;

begin

  inherited HandleEvent (Event);

  if Event.What=evCommand then

   EndModal(Event.Command)

end;

{--------------------}

procedure TNotebook.FileOpen;

{открывает файл данных}

var

  PF: PFileDialog; {диалоговое окно выбора файла}

  Control: Word;

  s: PathStr;

begin

  {создание экземпляра динамического объекта:}

  New(PF, Init('*.dat','Выберите нужный файл:','Имя файла',fdOpenButton,0));

  {с помощью следующего оператора окно выводится на экран ирезультат работы

  пользователя с ним помещается в переменную Control:}

  Control :=DeskTop^.ExecView(PF);

  {анализ результата запроса:}

  case Control of

    StdDlg.cmFileOpen,cmOk:

     begin                 {польов. указал имя файла:}

      PF^.GetFileName(s);  {s содержит имя файла}

    Assign(DataFile,s);

    {$I-}

    Reset(DataFile);

 if IOResult <> 0 then

   Rewrite(Datafile);

 OpFileF := IOResult=0;

   {$I+}

 if OpFileF then

  begin

   DisableCommands(WinCom2);

   EnableCommands(WinCom1);

   Work            {переход к работе}

  end

end;

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 Done

end;

{--------------------------}

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) < Lname do

          s:= s+' ';

       s:= s+Phone;

       while Length(s) < LName+LPhone do

          s:= s+' ';

          s:= s+Addr

       end;

    if 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 k<pred(PS^.Count) then

     begin

       p:= PS^.At(k);

       MoveStr(B, Copy(p^,Delta.X+1,Size.X),Color);

    end;

  writeline(0,N,Size.X,1,B)

 end

end; {TInterior.Draw}

{-----------------------------}

Function Control: Word;

{получает команду из основного диал. окна}

const

  x=1;

  L=12;

  DX=13;

  But: array [0..4] of string [13]=     {надписи на кнопках}

  ('~1~ Выход ','~2~ Убрать ','~3~ Искать ','~4~ Изменить','~5~ Добавить ');

  Txt: array [0..3] of string [52] = (

  {справочный текст}

  'Убрать — удалить запись, выделенную цветом',

  'Искать — искать запись, начинающуюся с нужных букв',

  'Изменить — изменить поле (поля) выделенной записи',

  'Добавить — добавить новую запись');

var

  R: TRect;

  D: PDlgWin;

  k: Integer;

begin

  R.Assign(7,6,74,15);

  D:=New(PDlgWin,Init(R, 'Выберите продолжение:'));

  with D^ do

    begin

      for k:=0 to 3 do          {вставляем поясняющий текст}

        begin

          R.Assign(1,1+k,65,2+k);

          Insert(New(PStaticTEXT,Init(R,#3+Txt[k])))

        end;

      for k:=0 to 4 do          {вставляем кнопки:}

       begin

        R.Assign(X+k*DX,6,X+k*DX+L,8);

        Insert(New(PButton,

        Init(R,But[k],cmCan+k,bfNormal)))

      end;

      SelectNext(False);        {активизируем первую кнопку}

    end;

  Control:=DeskTop^.ExecView(D);        {выполняем диалог}

end;{Conrol}

 {------------}

Procedure TInterior.HandleEvent;

Procedure DeleteItem;

{удаляет указанный в Location эл-т данных}

var

  D: Integer;

  PStr: PString;

  s: String;

  Data: DataType;

begin

  PStr:=PS^.At(Location);       {получаем текущую запись}

  s:=copy(PStr^,1,LName);

  seek(DataFile,0);

  D:=-1;           {D-номер записи в файле}

  repeat          {цикл поиска по освпадению поля Name:}

    inc(D);

    read(DataFile,Data);

    with Data do while Length(Name)<LName do

     Name:=Name+' '

  until Data.Name=s;

  seek(DataFile,pred(FileSize(DataFile)));

  read(DataFile,Data);          {читает последнюю запись}

  seek(DataFile,D);

  write(DataFile,Data);         {помещает ее на местоудаляемой}

  seek(DataFile,pred(FileSize(DataFile)));

  truncate(DataFile);                     {удаляет последнююзапись}

  with PS^ do D:=IndexOf(At(Location));

  PS^.AtFree(D);                       {удаляет строку изколлекции}

  Draw                                 {обновляет окно}

end;{DeleteItem}

{----------------------}

procedure AddItem(Edit: Boolean);

{добавляет новый или редактирует элемент данных}

const

  y=1;

  dy=2;

  L=LName+LPhone+LAddr;

var

  Data: DataType;

  R: TRect;

  InWin: PDialog;

  BName,BPhone,BAddr:PInputLine;

  Control: Word;

  OldCount: Word;

  s: String;

  p: PString;

begin

  Seek(DataFile,FileSize(DataFile));    {добавяет записи вконец файла}

  repeat                                {цикл ввода записей}

    if Edit then {готовит заголовок}

      s:='Редактирование'

    else

      begin

        Str(FileSize(DataFile)+1,s);

        while Length(s)<3 do

          s:='0'+s;

        s:='Вводится запись N'+s

      end;

    FillChar(Data,SizeOf(Data),' ');    {заполняет поляпробелами}

    R.Assign(15,5,65,16);

    InWin:=New(PDialog, Init(R, s));     {создает окно}

    with InWin^ do

      begin                             {формируем окно:}

        R.Assign(2,y+1,2+LName,y+2);

        BName:=New(PInputline, Init(R,LName));

        Insert(BName);         {поле имени}

        R.Assign(2,y,2+LName,y+1);

        Insert(New(PLabel,

        Init(R, 'Имя',BName)));

        R.Assign(2,y+dy+1,2+LPhone,y+dy+2);

        BPhone:=New(PInputLine,

        Init(R,LPhone));

        Insert(BPhone);         {поле телеф.}

        R.Assign(2,y+dy,2+LPhone,y+dy+1);

        Insert(New(PLabel, Init(R, 'Телефон',BPhone)));

        R.Assign(2,y+2*dy+1,2+LAddr,y+2*dy+2);

        BAddr:=New(PInputLIne, Init(R,LAddr));

        Insert(BAddr);         {поле адреса}

        R.Assign(2,y+2*dy,2+LAddr,y+2*dy+1);

        Insert(New(PLabel, Init(R, 'Адрес',BAddr)));

        {вставляем две комаедные кнопки}

        R.Assign(2,y+3*dy+1,12,y+3*dy+3);

        Insert(New(PButton, Init(R,'Ввести',cmOK,bfDefault)));

        R.Assign(2+20,y+3*dy+1,12+20,y+3*dy+3);

        Insert(New(PButton, Init(R,'Выход',cmCancel,bfNormal)));

        SelectNext(False)   {Активизируем 1-ую кнопку}

      end;                  {конец формирования окна}

    if Edit then with Data do

      begin                 {готовим начальный текст}

        p:=PS^.At(Location);{читает данные из записи}

        s:=p^;

        Name:=copy(s,1,LName);

        Phone:=copy(s,succ(LName),LPhone);

        Addr:=copy(s,succ(LName+LPhone),LAddr);

        InWin^.SetData(Data)                   {вставляеттекст в поля ввода}

      end;

    Control:=DeskTop^.ExecView(InWin);  {выполняем диалог}

    if Control=cmOK then with Data do

      begin

        if Edit then

          DeleteItem;       {удаляет старую запись}

        Name:=BName^.Data^;

        Phone:=BPhone^.Data^;

        Addr:=BAddr^.Data^;

        s[0]:=chr(L);

        FillChar(s[1],L,' ');

        move(Name[1],s[1],Length(Name));

        move(Phone[1],s[succ(LName)],Length(Phone));

        move(Addr[1],s[succ(LName+LPhone)],Length(Addr));

        OldCount:=PS^.Count;   {прежнее кол-во записей}

        PS^.Insert(NewStr(s)); {добавляет в коллекцию}

        {проверяем добавление}

        if OldCount<>PS^.Count then

          write(DataFile,Data) {да — добавляем в файл}

      end

  until Edit or (Control=cmCancel);

  Draw

end; {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:=s

end; {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<pred(PS^.Count)) do

  inc(Location);

if (Location<Delta.Y+pred(Size.Y)) then

  ScrollTo(Delta.X,Location)

else

 Draw

end;    {SearchItem}

{------------------------}

var

  R: TPoint;

label Cls;

begin

  TScroller.HandleEvent(Event);

  case Event.What of

  evCommand:

    case Event.Command of

    cmClose:

    begin

Cls:

    case Control of {получить команду из основногодиалогового окна}

    cmCan,

    cmCancel: EndModal(cmCancel);

    cmEdit: AddItem(True);

    cmDelete: DeleteItem;

    cmSearch: SearchItem;

    cmAdd: AddItem(False);

    end

    end;

    cmZoom: exit;

    end;

  evMouseDown:                 {реакция на щелчок мыши}

    begin

      MakeLocal(MouseWhere, R); {получение в R локальные

                                координаты мыши}

      Location:=Delta.Y+R.Y;

      Draw

    end;

  evKeyDown:    {реакция на клавиши + -}

  case Event.KeyCode of

  kbEsc: goto Cls;

  kbGrayMinus: if Location<Delta.Y then

    begin

      dec(Location);

      Draw

    end;

  kbGrayPlus: if Location<Delta.Y+pred(Size.Y) then

    begin

      inc (Location);

      Draw

    end;

  end

  end

end;    {TInterior.HandleEvent}

{------------------------}

procedure Tnotebook.Work;

{работа с данными}

var

  R: TRect;

  PW: PWorkWin;

  Control: Word;

begin

  R.Assign(0,0,80,23);

  PW:=New(PWorkWin, Init(R));

  Control:=DeskTop^.ExecView(PW);

  Dispose(PW,Done)

end;

{------------------------}

procedure TNotebook.HandleEvent(var Event: TEvent);

{обработчик событий программы}

begin       {TNotebook.HandleEvent}

  TApplication.HandleEvent(Event);      {обработка станд.команд cmQuit и cmMenu}

  if Event.What=evCommand then

  case Event.Command of

       {обработка новых команд}

       cmOpen: FileOpen;       {открыть файл}

       cmSave: FileSave;       {закрыть файл}

       cmChangeDir: ChangeDir;  {сменить диск}

       cmDOSShell: DOSCall;      {временный выход в дос}

       cmWork: Work;            {Обработать данные}

  else

    exit        {не обрабатывать другие команды}

  end;

  ClearEvent(Event)     {очистить событие после обработки}

end;                    {TNotebook.HandleEvent}

{--------------------------------}

procedure TNotebook.InitMenuBar;

{соэдание верхнего меню}

var

  R: TRect;

begin

  GetExtent(R);

  R.B.Y:=succ(R.A.Y);   {R — координаты строки меню}

  MenuBar:=New(PMenuBar, Init(R,

    NewMenu(             {создание меню}

      {первый эл-т нового меню представляет собой

      подменю. Создаем его}

      NewSubMenu('~F~ Файл', hcNoContext,

      {описываем элемент главного меню}

    NewMenu(      {создание подменю}

         NewItem(     {первый эл-т}

         '~~ Открыть','F3',kbF3,cmOpen,hcNoContext,

         NewItem(     {второй эл-т}

         '~~ Закрыть','F2',kbF2,cmSave,hcNoContext,

         NewItem(     {третий эл-т}

         '~~ Сменить диск','',0,cmChangeDir,hcNoContext,

         NewLine(     {строка-разделитель}

         NewItem('~~ Вызов ДОС','',0,cmDOSShell,hcNoContext,

         NewItem('~~ Конецработы','Alt-X',kbAltX,cmQuit,hcNoContext,

      NIL))))))         {нет других элементов подменю}

    ),

    {создаем второй элемент главного меню}

    NewItem('~W~ Работа','',kbF4,cmWork,hcNoContext,

NIL)  {нет др. эл-тов гл. меню}

))))

end; {TNotebook.InitMenuBar}

{----------------------------}

procedure TNotebook.InitStatusLine;

{формирует строку статуса}

var

  R:TRect;  {границы строки статуса}

begin

  GetExtent(R);  {получаем в R координаты всего экрана}

  R.A.Y:=pred(R.B.Y);

  StatusLine:=New(PStatusLine,

  Init(R,                {создает строку статуса}

    NewStatusDef(0, $FFFF,        {устанавливает макс. диап.кон-

                                  текстной справочнойслужбы}

    NewStatusKey('~Alt-X~ Выход',kbAltX,cmQuit,

    NewStatusKey('~F2~ Закрыть',kbF2,cmSave,

    NewStatusKey('~F3~ Открыть',kbF3,cmOpen,

    NewStatusKey('~F4~ Работа',kbF4,cmWork,

    NewStatusKey('~F10~ Меню',kbF10,cmMenu,

    NIL))))),           {нет других клавиш}

  NIL)                  {нет др. определений}

  ));

  DisableCommands(WinCom1)  {запрещает недоступные команды}

end;  {TNotebook.InitStatusLine}

{-----------------}

var

  Nbook: TNotebook;

begin

  Nbook.Init;

  Nbook.Run;

  Nbook.Done

end.

еще рефераты
Еще работы по информатике, программированию