1. Ресурсы
  2. Рефераты на русском
  3. Информатика
  4. Языки и технологии програмаирования

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


   «Применение языков программирования высокого уровня для                реали-зации численных методов и прикладных программ»
Введение
Внедрение ЭВМ во все сферы человеческой деятельности требует от специалистов разного профиля овладения навыками использования вычисли-тельной техники. Повышается уровень подготовки студентов вузов, которые уже с первых курсов приобщаются к использованию ЭВМ и простейших чис-ленных методов, не говоря уже о том, при что выполнении курсовых и диплом-ных проектов применение вычислительной техники становится нормой в по-давляющем большинстве вузов.
Вычислительная техника используется сейчас не только в инженерных расчетах и экономических науках, но и таких традиционно нематематических специальностях, как медицина, лингвистика, психология. В связи с этим можно констатировать, что применение ЭВМ приобрело массовый характер. Возникла многочисленная категория специалистов - пользователей ЭВМ, которым необ-ходимы знания по применению ЭВМ в своей отрасли - навыки работы с уже имеющимся программным обеспечением, а так же создания своего собственно-го ПО, приспособленного для решения конкретной задачи. И здесь на помощь пользователю приходят описания языков программирования высокого уровня (далее ЯВУ) и численные методы (далее ЧМ).
ЧМ разрабатывают и исследуют, как правило, высококвалифицирован-ные специалисты-математики. Для большинства пользователей главной задачей является понимание основных идей и методов, особенностей и областей приме-нения.
Однако, пользователи хотят работать с ЭВМ не только как с высокоин-теллектуальным калькулятором, а еще и как с помощником в повседневной ра-боте, хранилищем информации с быстрым и упорядоченным доступом, а так же с источником и обработчиком графической информации. Все эти функции со-временной ЭВМ я предполагаю продемонстрировать в настоящей курсовой ра-боте.
В первой части работы представлена программа по нахождению корней системы из двух нелинейных уравнений методами Ньютона и простых итера-ций.
Во второй части моей работы представлена программа, демонстрирую-щая пользователю всю мощь и многообразие графических возможностей совре-менных ПК на примере применения графических функций языка С++ с исполь-зованием  VGA-графики.
В третьей части работы представлена программа «Электронной записной книжки», которая имеет и практическое значение для пользователей маломощ-ных персональных компьютеров и ПК блокнотов с малым дисковым ресурсом для которых нерентабельна эксплуатация ПО типа Lotus Organizer и подобных ПО с мощным графическим интерфейсом.
К моему сожалению из-за отсутствия необходимого справочного мате-риала мне не удалось продемонстрировать в третьей части SUPER VGA-графику, но это дело недалекого будущего. Первая и вторая части работы вы-полнены с применение языка С++ фирмы Borland  версии 3.1 для DOS и WIN-DOWS, а третья часть выполнена на ЯВУ «Турбо Паскаль» версии 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|<. В методе
          i
Ньютона также важен выбор начального приближения для обеспечения хоро-шей сходимости. Сходимость ухудшается с увеличением числа уравнений сис-темы.
 В качестве примера рассмотрим использование метода Ньютона для ре-шения системы двух уравнений
     F1(x,y)=0,   (3)
     F2(x,y)=0.
Пусть приближенные значения неизвестных равны a,b. Предположим, что яко-биан системы (3) при x=a; y=b отличается от нуля, т.е.:
 
        J= 
Тогда следующие приближения неизвестных можно аписать в виде
       x=a- (F1
      
Величины, стоящие в правой части, вычисляются при x=a, y=b.
 При программировании данного метода в качестве исходных данных за-даются начальные приближения неизвестных a,b, погрешности . Если итера-ции сойдутся, то выводятся значения 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
#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)//изменение текущих значений переменных х и у
 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)//изменение текущих значений
   xi=xxi;yi=yyi;
}
  while(1);
c: return (xxi,yyi);
}

Приложение 2
//
#include
#include
#include
#include
#include
#include
#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 chart diagramm");
//процесс рисования диаграммы по данным из массива
     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 graphics screen" );
StatusLine( "Press any key to continue..." );
settextjustify(CENTER_TEXT,CENTER_TEXT);
midx=getmaxx()/2;
midy=getmaxy()/2;
outtextxy( midx,midy-40,"This programm will demonstrate to 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 by Grinjoff 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   for(y=3;y    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   {
    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   {
    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     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)     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 OldCountPS^.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  inc(Location);
if (Location  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    begin
      dec(Location);
      Draw
    end;
  kbGrayPlus: if Location    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.

  Рефераты на русском языке - Информатика


Яндекс.Метрика