Примеры программ | Программирование на 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