Программа примеры – Примеры программ на Pascal | СТУДЕНТОРИЙ

Примеры программ | Программирование на C++

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

Представленные примеры разбиты на подгруппы, т.е. если для решения определенной математической задачи используется оператор if, тогда его следует искать в категории «Условный оператор (if)»; если для решения определенной математической задачи используется оператор while, тогда его следует искать в категории «Циклы (while)»; в более сложных задачах используется, как оператор if так и while. и т.д.

Линейные алгоритмы

Ниже представлены типовые задания реализации алгоритмов (if)

тут 10 примеров
Вычислить значение

тут 18 примеров
Вычисление значения функции:

Ниже представлены типовые задания через реализацию оператором (while)

тут 20 примеров

(01) Вычисление значения функции:

тут 18 примеров
Вычисление значения функции:

тут 17 примеров

Вычислить значения функции при x, изменяющемся в диапазоне (0-2π) с шагом pi/20

тут 18 примеров
Вычислить значения функции

тут 30 примеров
Вычисление значения функции: ;

x = 4,71; a = 12,3; b = 3,11; c = 11,2; d = 0,13; i = 1


Ниже представлены решенные задачи по обработке массивов (матриц) средствами языка программирования С/С++

Программа для изменения выбранного элемента одномерного массива на языке программирования С++

Программа для изменения выбранного элемента двухмерного массива на языке программирования С++

Программа для перемножения матриц на языке программирования С++

Программа для перемножения двухмерного массива на языке программирования С++

Даны натуральные числа n, a1 …, an. Получить произведение членов последовательности a1, …, an, удовлетворяющих условию 2^k

Даны длина нижнего основания и высота трапеции. Верхнее основание на 3 см короче. Посчитать площадь фигуры.

Вычислить значение выражения и исключить из ОДЗ недопустимые значения переменной x.

В одномерном массиве, состоящем из n вещественных элементов, вычислить: 1) сумму отрицательных элементов массива; 2) произведение элементов массива, расположенных между максимальными и минимальными элементами.

Ввести с клавиатуры К реальных чисел в массиве А(i)(i=50). Составьте программу, которая вычислит разницу сумм четных и произведение нечетных элементов.

Составить программу, которая вводит с клавиатуры целые трехзначные числа пока число отрицательных не станет 2 и найти сумму этих чисел

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

cpp.otladka-test.ru

Примеры программ

Visual

Г Л АВ А 10

Экзаменатор

Тестирование широко применяется для оценки уровня знаний в учебных заведениях, при приеме на работу, для оценки квалификации персонала и т. п. Тест — это последовательность вопросов, на которые испытуемый должен ответить, выбрав правильный ответ из нескольких предложенных вариантов. Оценка выставляется в зависимости от количества правильных ответов.

Программа "Экзаменатор" позволяет автоматизировать процесс тестирования. В ее окне (рис. 10.1) отображается тест — последовательность вопросов,

Рис. 10.1. Задача испытуемого — выбрать правильный ответ

294

Часть II. Практикум программирования

на которые испытуемый должен ответить путем выбора правильного ответа из нескольких предложенных вариантов.

Требования к программе

В результате анализа используемых на практике методик тестирования были сформулированы следующие требования к программе:

программа должна быть универсальной, у пользователя должна быть возможность самостоятельной, без участия программиста, подготовки теста;

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

ответ на вопрос должен осуществляться путем выбора одного ответа из нескольких (не более четырех) вариантов;

в программе должна быть заблокирована возможность возврата к предыдущему вопросу. Если вопрос предложен, то на него должен быть дан ответ;

результат тестирования должен быть отнесен к одному из четырех уровней, например: "отлично", "хорошо", "удовлетворительно" или "плохо";

вопрос может сопровождаться иллюстрацией.

Файл теста

Универсальность программы тестирования обеспечивается тем, что вопросы загружаются из XML-файла,имя которого указывается в команде запуска программы. Помимо вопросов (здесь и далее: вопрос — это собственно вопрос и несколько вариантов ответа) в файле теста находится информация, необходимая для выставления оценки.

Тест (узел верхнего уровня <test>) состоит из:

заголовка;

описания;

раздела вопросов;

раздела оценок.

Заголовок и описание представляют собой соответственно узлы <head> и

<description>.

Вот пример заголовка и описания:

<head>

Архитектурные памятники Санкт-Петербурга

</head>

Глава 10. Примеры программ

295

<description>

Сейчас Вам будут предложены вопросы по архитектуре Санкт-Петербурга.Задача — из предложенных вариантов ответа выбрать правильный.

</description>

За разделом описания следует раздел вопросов теста — узел <qw>, подузлы<q> которого представляют собой вопросы.

Узел <q> представляет собой вопрос, а его подузлы<a> — варианты ответа. Параметрtext узла<q> задает текст вопроса, а параметрsrc — имя файла иллюстрации. Узел<a> определяет текст варианта ответа, а параметрrigth указывает, является ли ответ правильным (значение"yes") или нет (значение

"no").

Вот пример вопроса:

<q text="Архитектор Исаакиевского собора" src ="is.jpg" > <a right="no">Доменико Трезини</a>

<a right="yes">Огюст Монферран</a> <a right="no">Карл Росси</a>

</q>

В приведенном примере вопрос "Архитектор Исаакиевского собора" сопровождается иллюстрацией, находящейся в файле is.jpg. К вопросу даны три варианта ответа, правильным является второй ответ (архитектор Исаакиевского собора — Огюст Монферран).

За разделом вопросов следует раздел оценок (узел <levels>), в котором указывается количество баллов (правильных ответов), необходимое для достижения уровня, и сообщение, информирующее испытуемого о достигнутом уровне (оценке). Каждому уровню соответствует узелlevel, параметрscore которого задает количество баллов, необходимое для достижения уровня, параметрtext — сообщение.

Вот пример раздела оценок:

<levels>

<level score="2"

text = "На все вопросы Вы ответили правильно. Оценка — ОТЛИЧНО."/>

<level score="1"

text = "На некоторые вопросы Вы ответили не правильно. Оценка — ХОРОШО."/>

<level score="0"

text = "Вы плохо подготовились к испытанию. Оценка — ПЛОХО!"/>

</levels>

В листинге 10.1 в качестве примера приведен файл теста "Архитектурные памятники Санкт-Петербурга".

296

Часть II. Практикум программирования

Листинг 10.1. Файл теста (spb.xml)

<?xml version="1.0" encoding="Windows-1251"?><test>

<head>

Архитектурные памятники Санкт-Петербурга

</head>

<description>

Сейчас Вам будут предложены вопросы по архитектуре Санкт-Петербурга.Задача — из предложенных вариантов ответа выбрать правильный.

</description>

<qw>

<q text="Архитектор Исаакиевского собора" src ="is.jpg" >

<a right="no">Доменико Трезини</a> <a right="yes">Огюст Монферран</a> <a right="no">Карл Росси</a>

</q>

<q text="На фотографии" src ="marks.jpg"> <a right="yes">Зимний дворец (Эрмитаж)</a> <a right="no">Мариинский дворец</a>

<a right="no">Строгановский дворец</a>

</q>

</qw>

<levels>

<level score="2" text = "На все вопросы Вы ответили правильно. Оценка — ОТЛИЧНО."/>

<level score="1" text = "На некоторые вопросы Вы ответили не правильно. Оценка — ХОРОШО."/>

<level score="0" text = "Вы плохо подготовились к испытанию. Оценка — ПЛОХО!"/>

</levels>

</test>

Файл теста можно подготовить в текстовом редакторе, который сохраняет "чистый" (без символов форматирования) текст, например в Блокноте. В момент записи текста на диск вместо стандартного расширения xml следует указать какое-либодругое, например exm (от англ.examiner — экзаменатор). Такое решение позволит настроить операционную систему так, что тест будет запускаться автоматически, в результате щелчка кнопкой мыши на имени файла теста.

studfiles.net

Примеры программ C++ (Си++) - Учитель программирования.ру

Опубликовано: 10.11.2014

Описание:   It is a banking project

Опубликовано: 10.11.2014

Описание:   This is an update to MS Visual Studio 2008. This is a basic Address Book application that allows the user to add, update and/or delete entries in a persistent data file, using random access techniques. A tutorial and the source are included.

Опубликовано: 10.11.2014

Описание:   Included the project files and a ReadmeFirst file to make it easier to get started. Updated 3/15/2012: – Learning to Program in C++ 1- Intro to C++ The basics of C++ 2- If statements 3- Loops in C++ All you want to know about loops 4- Functions Functions…all about them, making and using […]

Опубликовано: 10.11.2014

Описание:   This version of the Address Book application converts to a GUI that allows the user to add, update and/or delete entries in a persistent data file, using random access techniques. A tutorial that shows you how to build the Address Book application and the source are included. The readme file must be read […]

Опубликовано: 10.11.2014

Описание:   8085 Simulator is a simulator for the Intel 8085 Microprocessor, as it’s name suggests. This program is completely created in Turbo C++, but it’s operation is comparable to any commercially available simulators. The 8085 simulator has a good error detection system, which can point to the specific line(s) where the error occurred .The […]

Опубликовано: 10.11.2014

Описание:   Learn about all file input/output operations (adding, deleting, editing,serching,rename file,copy file) and also array sorting in c++.

Опубликовано: 10.11.2014

Описание:   Visual B Cutter is developed by Bongani Hlope and tested , modified , remmended by me .. i think i deserves to be rated !! compile and see!!

Опубликовано: 10.11.2014

Описание:   Advance File Splitter is a small but powerful program to split files into smaller parts. It is easy to use. Download this program to discover more features in this program. Leave comments and please vote as I spent much time on this project.

Опубликовано: 10.11.2014

Описание:   About this code a simple payroll system written in C++ that shows how to use struct and functions in C++ programming. I intende my work for beginners in C++ programming. If you have some questions about my work please send me an email at [email protected] People here in the Philippines can reach me […]

Опубликовано: 10.11.2014

Описание:   This program is to get a salesmans commision pay and all that good stuff you will learn a lot from this example. This is a project i had to do with school so plz dont judge it to harshley.

uchitel-program.ru

2.2.5 Примеры программ

Пример 2.2.1. Разветвляющийся алгоритм

Разработать программу, которая определяет наибольшее из трех чисел a, b, c.

Вариант 1 решения данной задачи (рисунок 2.5) содержит три структуры «Если_То_Иначе» и не использует дополнительных переменных.

Рисунок 2.5 –Программаи алгоритм поиска наибольшего из трех чисел. Вариант 1.

Вариант 2 (рисунок 2.6) использует дополнительную переменную d, которая хранит значение большего изa, b. Это позволяет сделать алгоритм более компактным и простым.

Рисунок 2.6 – Программа и алгоритм поиска наибольшего из трех чисел. Вариант 2.

Пример 2.2.2. Цикл с известным числом повторений

Разработать программу вычисления суммы:

12+ 22+32+K+ N 2

Для вычисления суммы будем использовать структуру «Цикл_со_счетчиком», так как число повторений (сложений) известно и равноN. Для хранения значения суммы – переменнуюS. Схема алгоритма вычисления суммы приведена на рисунке 2.7 (a, b).

Рисунок 2.7 – Алгоритм вычисления суммы

39

Программа вычисления суммы степенного ряда приведена на рисунке 2.8.

Рисунок 2.8 – Программа вычисления суммы

Пример 2.2.3. Цикл с неизвестным числом повторений

Разработать программу, которая вычисляет произведение цифр натурального числа N.

Для вычисления суммы будем использовать структуру «Цикл_Пока», так как число повторений (определяется числом цифр в числе) не известно

Для хранения значения произведения будем использовать переменную P.

Для реализации алгоритма вычислений используются две стандартные операции Object Pascal:

•mod – остаток от деления

•div – целочисленное частное.

Программа вычисления произведения цифр целого числа приведена на рисунке 2.9.

Рисунок 2.9 – Программа вычисления произведения

Выполним трассировку этой программы при начальном значении N = 253 (столбец в таблице показывает выполнение операций на одном шаге цикла):

Начальные значения переменных: N = 253, P = 1

Цикл: значения переменных и выражений

 

 

 

Шаг 1

 

 

Шаг 2

 

 

Шаг 3

 

Конец

 

 

 

 

 

 

 

 

 

цикла

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

N > 0

253 > 0 – да

25 > 0 – да

2 > 0 – да 0

0 > 0 – нет

 

 

 

 

 

 

 

 

 

 

 

 

 

N mod 10

 

253 mod 10 = 3

25 mod 10

= 5

2 mod 10 = 2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

15 ¾ 2 =

 

 

 

 

 

 

p

1 ¾3 = 3

 

3 ¾ 5 = 15

 

30

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

N div 10

 

253 div 10 = 25

25 div 10 = 2

2 div 10 = 0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

N

25

 

2

 

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Вывод р

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Полученный результат (p = 30– произведение цифр числа 253)

подтверждает правильность разработанного алгоритма.

Сконструированную программу реализуем в интегрированной среде разработки Delphi как консольное приложение с именемProject2_2_3.

41

Выполним приложение Project2_2_3 и убедимся в правильности реализации алгоритма на языкеObject Pascal.

Пример 2.2.4. Разработка программы методом пошагового уточнения

Рассмотрим разработку программы решения следующей задачи:

найти все простые числа в диапазоне от 1 до N.

ШАГ 1. На первом шаге создаем общую схему алгоритма решения задачи. Схема представляет собой цикл с известным числом повторений, где на каждом шаге цикла надо определить является ли число (в схеме переменнаяi) простым. И если число простое, то вывести его на экран (рисунок 2.10).

ШАГ 2. В схеме, полученной на шаге 1, отсутствует алгоритм, который позволяет определить, является ли числоi простым. Разработка этого алгоритма и является уточнением шага 1.

42

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

Если i не делится нацелона возможные значения k(i mod k не равно 0), то i– простое число. Количество делений можно ограничить диапазоном изменения kот 2до sqrt(i)(sqrt– квадратный корень). Результатом алгоритма является переменная f, равная 1, если i– простое число, и равное 0– в противном случае. Схема алгоритма приведена на рисунке 2.10.

Рисунок 2.10 – Программа определения простых чисел. Шаг 1 и шаг 2

ШАГ 3. Объединяем вместе схемы, полученные на шаге 1 и шаге 2.

Проверка условия – i = простое число? – шага 1 трансформируется в объединенной схеме в проверку значения переменнойf.

Схема алгоритма и программа приведены на рисунке 2.11

Рисунок 2.11 – Программа определения простых чисел. Шаг 3

studfiles.net

5.6. ПРИМЕР ОПИСАНИЯ ПРОГРАММЫ "РЕДАКТОР ТЕКСТОВ". Технологии программирования

5.6. ПРИМЕР ОПИСАНИЯ ПРОГРАММЫ "РЕДАКТОР ТЕКСТОВ"

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

Программа "Редактор текстов" предназначена для создания новых и корректировки существующих текстовых файлов MS DOS в диалоговом (пользователь-ЭВМ) режиме работы. ЭВМ формирует экран с окном, в котором отображен участок текста из текстового файла (макет экрана соответствует внутреннему редактору программы Norton Commander). Пользователю обеспечивается возможность вставки в текст в окне экрана любого символа клавиатуры за символом, отмеченным на экране курсором. Исключение составляет ряд символов, которые являются признаками команд управления или незадействованными символами (приводится список символов). После подачи пользователем команды записи все изменения текста, осуществленные пользователем, записываются в файл.

Основной принцип работы редактора текстов состоит в переносе строк текста из необходимых участков файла сначала в буферный массив памяти длиной в 65535 байт (символов) с дальнейшим копированием необходимых строк из буферного массива в окно экрана.

Запуск программы осуществляется командой с указанием имени редактируемого файла. Далее, пока не будет указано корректное имя файла, может начать многократно выполняться алгоритм "Запрос пользователя на ввод или корректировку имени файла".

Затем задаются начальные значения структурированной переменной "Система координат", в которой имеются поля: "Положение курсора относительно файла"; "Положение курсора относительно буферного окна редактора"; "Положение буферного окна редактора относительно файла".

После осуществляется очистка буферного массива редактора строковых переменных из 5 * 23 = 115 строк длиной по 225 символов.

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

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

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

Поделитесь на страничке

Следующая глава >

it.wikireading.ru

Примеры текстов программ

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

Совместимые версии языка Пролог

Во всех примерах, приведенных в данной книге, автор придерживался высоко портабельного подмножества версии языка Пролог для ЭВМ DEC-10, которое полностью совместимо с тем, что Клоксин и Меллиш называют "ядром Пролога". Говоря конкретно, приведенные программы будут работать в следующих версиях языка Пролог: CProlog, Ouintus, Arity, - Prolog-1 и Prolog-2 фирмы Expert Systems International, UNSW Prolog, Prolog-86, Chalcedony Prolog, IF/Prolog, micro-Prolog и Sigma Prolog для ЭВМ DEC-10 и т. д. Многие программы будут работоспособны и при их выполнении в системе Turbo Prolog. Фактически же все программы данной книги первоначально разрабатывались на диалекте CProlog, а затем были перенесены на некоторые другие версии языка. Автор пытался избегать использования каких-либо средств или конструкций языка Пролог, являющихся особенностями конкретных версий этого языка. В приложении IV обсуждаются различия между версиями Пролога. Оно может оказаться полезным справочным пособием при переносе программ с одной версии языка Пролог на другую.

Показательный пример

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

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

Существует и еще одна причина, по которой был выбран показательный пример из сферы промышленного производства: У многих людей создается впечатление, что Пролог - это "академический" язык, непригодный для практических целей. Они спрашивают: "Что же можно реально сделать при помощи этого языка?" Ответом — хотя и не слишком убедительным — могло бы стать перечисление всех тех вещей, которые можно было бы реализовать на Прологе, упоминание академических исследовательских проектов или намек на то, что значительная часть действительно серьезных работ, выполненных при помощи языка Пролог, является засекреченной. Однако гораздо более убедительно звучало бы перечисление реальных, коммерческих программных систем, построенных на Прологе, а ведь именно в области промышленного производства и существует несколько таких систем.

studfiles.net

ПРИМЕРЫ РЕЗИДЕНТНЫХ ПРОГРАММ — Мегаобучалка

 

Написать резидентную программу, которая перехватывает прерывание int 5 (Print Screen) и вместо распечатки экрана на каждое нажатие клавиши PrtSc изменяет цвет рамки экрана. Рамка должна принимать циклически один из 16 цветов. Программа не должна позволять загрузить себя повторно. При попытке повторной загрузки программа должна выводить предупреждающее сообщение.

УКАЗАНИЯ:

· Передавать управление старому обработчику прерывания не надо.

· Для окрашивания рамки экрана следует использовать подфункцию 01h функции 10h прерывания 10h (ax = 1001h, bx = цвет).

· В начале программы следует не забыть записать в DS значение CS.

· Для проверки наличия резидентной программы в памяти использовать функцию FFh прерывания 2Fh.

Assume CS: Code, DS: Code

Code SEGMENT

org 100h

resprog proc far

mov ax,cs

mov ds,ax

jmp init

color db 0

old_int2Fh_off dw ?

old_int2Fh_seg dw ?

msg db 'Драйвер уже установлен$'

; Новый обработчик прерывания 2Fh

new_int2Fh proc far

cmp ax,0ff00h

jz installed

jmp dword ptr cs:old_int2Fh_off

installed: mov ax,0ffh

iret

new_int2Fh endp

; Новый обработчик прерывания 5

new_int5 proc far

mov bh,color

inc color

mov ax,1001h

int 10h

iret

new_int5 endp

resprog endp

ressize equ $-resprog ; Размер в байтах резидентной части

init proc near

; Проверка раличия резидентной программы в памяти

mov ax,0ff00h

int 2fh

cmp ax,0ffh

jnz first_start ; Не установлена

lea dx,msg ; Вывод сообщения о том,

mov ah,9 ; что драйвер уже загружен

int 21h

ret

first_start: mov ax,2505h ; Функция 25h, вектор 5

lea dx,new_int5

int 21h ; Запись нового вектора 5

mov ax,352fh ; Сохранение старого вектора прерывания 2Fh

int 21h

mov cs:old_int2fh_off,bx

mov cs:old_int2fh_seg,es

lea dx,new_int2Fh ; Запись нового вектора прерывания 2Fh

mov ax,252fh

int 21h

; Завершение программы с оставлением резидентной части в памяти

mov dx,(ressize+10fh)/16

mov ax,3100h

int 21h

init endp

Code ENDS

END resprog

 

Написать резидентную программу, записывающую содержимое экрана в символьном режиме в файл. Программа должна анализировать флаг активности DOS и не должна допускать повторной загрузки в память. По ключу /u программа должна выгружаться из памяти с освобождением занимаемого ей места. Замечание: приведенная ниже программа нормально работает лишь под DOS до версии 5.0, так как в более поздних версиях иначе происходит работа с клавиатурой.



Code SEGMENT

Assume CS: Code, DS: Code

org 100h

resprog proc far

mov ax,cs

mov ds,ax ; DS = CS

jmp init ; Переход на инициализирующую секцию

num dw 0 ; Количество сброшенных экранов

old_int8_off dw ? ; Адрес старого обработчика

old_int8_seg dw ? ; прерывания таймера 8h

old_int5_off dw ? ; Адрес старого обработчика

old_int5_seg dw ? ; прерывания 5h

old_int2F_off dw ? ; Адрес старого обработчика

old_int2F_seg dw ? ; мультиплексного прерывания 2Fh

adr_psp dw ? ; Адрес PSP

vbuf dw 0b000h ; Сегментный адрес видеобуфера

handle dw ? ; Дескриптор файла

buf db 2050 dup(0) ; Буфер для данных экрана

mes db 'Disk error$'

filename db 'filescr&.txt',0 ; Спецификация вых. файла

iniflag db 0 ; Флаг запроса на вывод экрана в файл

outflag db 0 ; Флаг начала вывода в файл

_crit dd ? ; Указатель на флаг активности DOS

; Новый обработчик прерывания 2Fh

new_int2F proc far

cmp ax,0ff00h

jz installed

jmp dword ptr cs:old_int2F_off ; Переход на старый обработчик 2Fh

installed: mov ax,0ffh ; "Программа в памяти"

iret

new_int2F endp

; Новый обработчик прерывания 1ch

new_int8 proc far

push ax

push bx

push cx

push dx

push si

push di

push ds

push es

mov ax,cs

mov ds,ax

cmp iniflag,0

jz exit8 ; Нет запроса

test outflag,0ffh

jnz exit8 ; Файл уже выводится

jnz exit8 ; DOS занята

les bx,_crit

test byte ptr es:[bx],0ffh

jnz exit8 ; DOS занята

; iniflag=1, outflag=0, crit=0

mov outflag,0ffh

call writef ; Вывод буфера в файл

exit9: pop es

pop ds

pop di

pop si

pop dx

pop cx

pop bx

pop ax

iret

new_int8 endp

; Новый обработчик прерывания 5

new_int5 proc far

mov cs:iniflag,0ffh

iret

new_int5 endp

; Запись видеобуфера в файл

writef proc near

mov ax,cs

mov ds,ax

mov ax,0e07h

int 10h

mov ax,vbuf ; Начало видеобуфера (сегмент)

mov es,ax

mov si,0

lea di,buf

mov dx,25 ; Число строк

cld

trans1: mov cx,80 ; Число символов в строке

trans: mov al,es:[si]

mov [di],al

inc si

inc si

inc di

loop trans

mov byte ptr [di],0dh

inc di

mov byte ptr [di],0ah

inc di

dec dx

jnz trans1

; Создание файла

test word ptr num,0ffffh ; Сброшено экранов 0 ?

jnz sdwig ; Переход на смещение указателя

mov word ptr num,2050

mov ah,3ch ; Функция создания файла

mov cx,0 ; Без атрибутов

lea dx,filename ; Адрес спецификации файла

int 21h

jc noform

mov handle,ax ; Сохранение дескриптора файла

jmp write

sdwig: mov ax,3d01h ; Открытие файла с записью

lea dx,filename

int 21h

jc noform

mov handle,ax

mov ax,4200h ; Установка указателя файла

mov bx,handle

mov cx,0

mov dx,num

add word ptr num,2050

int 21h

; Запись файла

write: mov ah,40h ; Функция записи в файл

mov bx,handle ; Дескриптор файла

mov cx,2050 ; Длина записываемого массива

lea dx,buf ; Адрес записываемого массива

int 21h

jc noform

;Закрытие файла

mov ah,3eh ; Функция закрытия файла

mov bx,handle ; Дескриптор файла

int 21h

jmp prend

noform: mov ah,9

mov dx,offset mes

int 21h

prend: mov outflag,0

mov iniflag,0

ret

writef endp

resprog endp

ressize equ $-resprog ; Размер в байтах резидентной части

init proc near

; Проверка ключа /u

mov bx,80h

mov cx,[bx] ; Кол. символов в командной строке

inc bx ; Начало командной строки

cmd: mov al,[bx]

cmp al,20h

jz cmd1 ; Пробел

cmp al,'/'

jnz cmd2 ; Не ключ

cmp byte ptr [bx+1] ,'u'

jnz cmd2 ; Не u

; Освобождение блока памяти

; Проверка загруженности

mov ax,0ff00h

int 2fh

cmp ax,0ffh

jz uninst ; Программа в памяти

lea dx,msgno ; Вывод сообщения о том,

mov ah,9 ; что программы нет в памяти

int 21h

int 20h

uninst: call set_int ; Восстановление векторов прерываний

int 20h

cmd1: inc bx

loop cmd

cmd2: mov ax,0ff00h ; Проверка загруженности

int 2fh

cmp ax,0ffh

jnz first_start ; Не установлена

lea dx,msg ; Вывод сообщения о том,

mov ah,9 ; что драйвер уже загружен

int 21h

int 20h

first_start: mov ax,3505h ; Сохранение старого вектора прерывания 5

int 21h

mov cs:old_int5_off,bx

mov cs:old_int5_seg,es

mov ax,2505h ; Функция 25h, вектор 5

lea dx,new_int5

int 21h ; Запись нового вектора 5

mov ax,352fh ; Сохранение старого вектора прерывания 2Fh

int 21h

mov cs:old_int2F_off,bx

mov cs:old_int2F_seg,es

lea dx,new_int2F ; Запись нового вектора прерывания 2Fh

mov ax,252fh

int 21h

mov ax,351ch ; Сохранение старого вектора прерывания 8

int 21h

mov cs:old_int8_off,bx

mov cs:old_int8_seg,es

lea dx,new_int8 ; Запись нового вектора прерывания 8

mov ax,251ch

int 21h

mov ah,34h ; Запись указателя на флаг критической секции DOS

int 21h

mov word ptr _crit,bx

mov word ptr _crit[2],es

; Определение адреса видеобуфера

mov ah,0fh ; Функция получения видеорежима

int 10h

cmp al,7

jz ini1

mov vbuf,0b800h

ini1: lea dx,msg2

mov ah,9

int 21h

; Завершение программы с оставлением резидентной части в памяти

mov dx,(ressize+10fh)/16

mov ax,3100h

int 21h

init endp

set_int proc near

mov ax,3505h

int 21h ; ES - сегментный адрес PSP резидента

mov adr_psp,es

; Восстановление старого вектора 2Fh

push ds

mov dx,es:old_int2F_off

mov ax,es:old_int2F_seg

mov ds,ax

mov ax,252fh ; Установка старого вектора 2Fh

int 21h

mov dx,es:old_int8_off

mov ax,es:old_int8_seg

mov ds,ax

mov ax,251ch ; Установка старого вектора 8

int 21h

mov dx,es:old_int5_off

mov ax,es:old_int5_seg

mov ds,ax

mov ax,2505h ; Установка старого вектора 5

int 21h

pop ds

mov ah,9

lea dx,msg1

int 21h

mov es,adr_psp

mov ah,49h ; Освобождение памяти

int 21h

ret

set_int endp

msg db 0dh,0ah,'Программа уже в памяти',0dh,0ah,'$'

msgno db 0dh,0ah,'Программы нет в памяти',0dh,0ah,'$'

msg1 db 0dh,0ah,'Программа выгружена',0dh,0ah,'$'

msg2 db 0dh,0ah

db 'Программа для записи содержимого символьного',0dh,0ah

db 'экрана в файл FILESCR&.TXT.',0dh,0ah

db 'ALESOFT (C) Roshin A. 1994.',0dh,0ah

db 'Для копирования нажамите PrtSc.',0dh,0ah

db 'В файл можно записать не более 32 экранов.',0dh,0ah

db 'Для выгрузки программы следует набрать'

db ' filescr /u',0dh,0ah

db 0dh,0ah,'$'

Code ENDS

END resprog

megaobuchalka.ru

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *