lOMoARcPSD|42418043 KP - КУРСОВАЯ РАБОТА «РАЗРАБОТКА ПРОГРАММЫ ДЛЯ Программирование (СПбГЭТУ ЛЭТИ) Scan to open on Studocu Studocu is not sponsored or endorsed by any college or university Downloaded by Michael Muzicenko (mihakurd@gmail.com) lOMoARcPSD|42418043 КУРСОВАЯ РАБОТА по дисциплине «Программирование» ТЕМА: «РАЗРАБОТКА ПРОГРАММЫ ДЛЯ IBM-СОВМЕСТИМОЙ ЭВМ С ИСПОЛЬЗОВАНИЕМ ЯЗЫКА АССЕМБЛЕРА И ЯЗЫКА ВЫСОКОГО УРОВНЯ » 1 Downloaded by Michael Muzicenko (mihakurd@gmail.com) lOMoARcPSD|42418043 ЗАДАНИЕ НА КУРСОВУЮ РАБОТУ Тема работы: РАЗРАБОТКА ПРОГРАММЫ ДЛЯ IBM-СОВМЕСТИМОЙ ЭВМ С ИСПОЛЬЗОВАНИЕМ ЯЗЫКА АССЕМБЛЕРА И ЯЗЫКА ВЫСОКОГО УРОВНЯ 1. Техническое задание Требуется создать на языке высокого уровня функцию MAIN, осуществляющую своевременно вызов программного компонента на языке ассемблера для обработки текстового файла в соответствии с вариантом индивидуального задания. Для обработки текстового файла необходимо содержащийся в нем текст переместить в буфер, созданный в программе. После обработки текста необходимо осуществить вывод отредактированного текста на экран, а затем переместить содержимое буфера в заданный выходной файл. Исходными данными являются: подлежащий обработке текстовый файл и вводимое с клавиатуры слово (слова). Имя исходного текстового файла задается с клавиатуры. С клавиатуры вводятся также все дополнительные данные, необходимые для решения задачи. Создание выходного файла. Результатом обработки является текст, который выводится на экран и перемещается из буфера в выходной текстовый файл. 2. Индивидуальное задание Вариант Вид обработки Вставить во всех строках текста перед заданным словом пробел и создать выходной файл. Содержание пояснительной записки: Введение Функциональная спецификация разрабатываемой программы Описание алгоритма обработки Структура программы и обрабатываемых данных Описание текста программы Описание пользовательского интерфейса программы 2 Downloaded by Michael Muzicenko (mihakurd@gmail.com) lOMoARcPSD|42418043 Примеры работы программы Заключение Список использованных источников Дата выдачи задания: Дата сдачи реферата: Дата защиты реферата: Студентка Аллес И.В Преподаватель Валов А.А. 3 Downloaded by Michael Muzicenko (mihakurd@gmail.com) lOMoARcPSD|42418043 СОДЕРЖАНИЕ ВВЕДЕНИЕ.................................................................................................................................5 1. ФУНКЦИОНАЛЬНАЯ СПЕЦИФИКАЦИЯ РАЗРАБАТЫВАЕМОЙ ПРОГРАММЫ......5 2. ОПИСАНИЕ АЛГОРИТМА ОБРАБОТКИ..........................................................................6 3. СТРУКТУРА ПРОГРАММЫ И ОБРАБАТЫВАЕМЫХ ДАННЫХ...................................7 4. ОПИСАНИЕ ТЕКСТА ПРОГРАММЫ.................................................................................8 5. ОПИСАНИЕ ПОЛЬЗОВАТЕЛЬСКОГО ИНТЕРФЕЙСА И ПРИМЕРЫ РАБОТЫ ПРОГРАММЫ..........................................................................................................................10 6. ЗАКЛЮЧЕНИЕ....................................................................................................................16 7. СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ............................................................17 4 Downloaded by Michael Muzicenko (mihakurd@gmail.com) lOMoARcPSD|42418043 ВВЕДЕНИЕ В данной курсовой работе будет рассмотрено консольное приложение для операционной системы Windows, написанное с помощью языка высокого уровня C++ и языка низкого уровня – Macro Assembler (MASM). Задача приложения – вставить во всех строках текста перед заданным словом пробел. 1. ФУНКЦИОНАЛЬНАЯ СПЕЦИФИКАЦИЯ РАЗРАБАТЫВАЕМОЙ ПРОГРАММЫ Программа имеет одну основную функцию – вставить во всех строках текста перед заданным словом другое заданное слово, иначе текст остается без изменений. Имя файла для чтения и имя результирующего файла задается пользователем с клавиатуры. Слово для поиска задается с клавиатуры пользователем. Обрабатываемый текст считывается из файла, указанный пользователем. Обработанный текст записывается в файл, который создается в процессе работы программы, указанный пользователем. Обработанный текст выводится на экран. Программа поддерживает обработку любых символов, чисел и знаков пунктуации. Реагирует на ошибки ввода путей. При работе с текстом чувствительна к регистру. 5 Downloaded by Michael Muzicenko (mihakurd@gmail.com) lOMoARcPSD|42418043 2. ОПИСАНИЕ АЛГОРИТМА ОБРАБОТКИ 1. Чтение строки из файла. 2. Получение разности между длиной строки и слова. 3. Получение длины слова. 4. Проверка нахождения слова в начале или в конце строки. 6. Увеличение длины строки на длину вставляемого пробела. 7. Установка указателя перед вставляемым словом. 8. Вставка пробела. 10. Поиск следующего слова в строке. 11. Запись обработанной строки в новый файл. 12. Вывод строки на экран. 13. Если строка не последняя переход к следующей строке. 14. Повторять поиск пока не будет конец файла. В начале программы записываем все данные которые нужны нам для работы с файлами и словами. Ввод данных выполняем через функцию С++ “cin”. Затем осуществляем проверку на существования файла. Открываем файл для чтения “fstream”. С помощью класса “ofstream” создаем результирующий файл, в который будет производится запись модифицированной строки. 6 Downloaded by Michael Muzicenko (mihakurd@gmail.com) lOMoARcPSD|42418043 3. СТРУКТУРА ПРОГРАММЫ И ОБРАБАТЫВАЕМЫХ ДАННЫХ Программа, написанная на языке C++ должна иметь определенную структуру с целью чёткого определения основных блоков программ и синтаксиса. Структура для данного языка программирования в среде программирования Microsoft Visual Studio 2017 приведена ниже: #include main() Директива препроцессора Основная функция Описываемая в данной работе программа полностью ей соответствует. Основная функция main() выполняет открытие/закрытие файла, вывод результатов на экран, а также вызов вспомогательных функций, которые реализуют ввод данных. 7 Downloaded by Michael Muzicenko (mihakurd@gmail.com) lOMoARcPSD|42418043 4. ОПИСАНИЕ ТЕКСТА ПРОГРАММЫ // ConsoleApplication1.cpp: определяет точку входа для консольного приложения. // #include "stdafx.h" #include <iostream> #include <fstream> #include <locale> #include <windows.h> #include <string.h> using namespace std; int main() { char Buf[1000]; // буфер для строк и загрузки результата в файл char W1[1000]; // Буфер для поиска int S_Len, W1_Len; // определение длинны строк и длинны слова в1 char FN1[255], FN2[255]; // Буфер для файлов setlocale(LC_ALL, ""); cout << "Укажите файл с исходными данными: "; SetConsoleCP(1251); cin.getline(FN1, 255); // ввод исходника SetConsoleCP(866); cout << "Укажите файл для записи результата: "; SetConsoleCP(1251); cin.getline(FN2, 255); // Ввод 2 файла SetConsoleCP(866); cout << "Укажите слово, перед которым необходимо установить пробел: "; SetConsoleCP(1251); cin.getline(W1, 1000); // Ввод слова SetConsoleCP(866); cout << "После завершения работы программы для просмотра вам необходимо открыть файл для записи результата"; SetConsoleCP(1251); SetConsoleCP(866); 8 Downloaded by Michael Muzicenko (mihakurd@gmail.com) lOMoARcPSD|42418043 W1_Len = strlen(W1); // Получение размера слова. запрашиваем 1 раз потом используем данные из переменной в1 system("cls"); // Очистка экрана fstream Fin(FN1); // Открытие исходника if (!Fin) // Проверка наличия файла в директории { cout << endl << "Работа программы будет завершена. Для выполнения задачи необходимо указать исполняемый файл!" << endl; system("pause"); return 0; } ofstream Fout(FN2, ios_base::trunc); // Создание 2 файла while (!Fin.eof()) // цикл для работы со строками { Fin.getline(Buf, 1000); // Чтение строки из файла S_Len = strlen(Buf); // получение размера строки __asm // подключение асемблерной части { pushad // Сохранение состояния mov ecx, S_Len // из размера строки вычитаем размер слова: если слово больше строки, то закрытие алгоритма sub ecx, W1_Len jc EndLine // закрытие алгоритма inc ecx // прибавление 1 M1 : push ecx // в стек параметры для процедуры lea esi, [ecx + Buf - 1] // загрузка эффективного адреса частный случай мув lea edi, W1 // Указатель на слово mov ecx, W1_Len // Размер слова - счётчик цикла сравнения букв repe cmpsb // Сравнение строки ислова jnz Next // Совпадения нет - искать дальше // если после окна находится пробел или конец строки // если перед окном находится пробел или оно начинается с начала строки cmp byte ptr[esi], ' ' // Проверка на пробел после окна je EQ1 9 Downloaded by Michael Muzicenko (mihakurd@gmail.com) lOMoARcPSD|42418043 cmp byte ptr[esi], 0 // Проверка на конец строки после окна jne Next EQ1 : // слово найдено sub esi, W1_Len // Получение указателя на начало окна lea eax, Buf cmp esi, eax // Проверка на начало строки je EQ2 cmp byte ptr[esi - 1], ' ' // Проверка на пробел перед окном jne Next EQ2 : // вставка push esi // Сохранение указателя на начало окна lea ecx, Buf // количества сдвигаемых символов add ecx, S_Len // (от начала окна и до конца строки) push ecx // Сохранение указателя на конец строки sub ecx, esi inc ecx pop esi // и установка его в качестве источника данных для сдвига mov edi, esi // Приёмник данных сдвинут на длину вставляемого слова + 1 inc edi std // При сдвиге сканировать НАЗАД rep movsb // Сдвиг строки перемещением элементов add S_Len, ecx inc S_Len pop edi // Указатель на место для записи вставляемого слова (начало окна) cld // обнуление mov byte ptr[edi], ' ' // Копирование ВПЕРЁД Дописывание пробела Next:pop ecx // Поиск следующего слова в строке loop M1 EndLine : popad // Восстановление состояния } Fout << Buf; // Запись обработанной строки в файл cout << Buf << endl; // Вывод строки на экран 10 Downloaded by Michael Muzicenko (mihakurd@gmail.com) lOMoARcPSD|42418043 if (!Fin.eof()) Fout << endl; // Если строка не последняя - дописать перевод строки } Fin.close(); Fout.close(); cout << endl; system("pause"); return 0; } 5. ОПИСАНИЕ ПОЛЬЗОВАТЕЛЬСКОГО ИНТЕРФЕЙСА И ПРИМЕР РАБОТЫ ПРОГРАММЫ 11 Downloaded by Michael Muzicenko (mihakurd@gmail.com) lOMoARcPSD|42418043 Пользовательский интерфейс представляет из себя окно консоли, в котором последовательно выводятся сообщения: запрос на ввод, пояснения, результат обработки, либо сообщение об ошибке. Ниже приведены скриншоты интерфейса и работы программы. Рисунок 1. При открытии программы появляется диалоговое окно с вводом файла для чтения. Рисунок 2. Сообщение об ошибке если не введен файл или файл отсутствует в директории Рисунок 3. Содержимое файла с исходным текстом 12 Downloaded by Michael Muzicenko (mihakurd@gmail.com) lOMoARcPSD|42418043 Рисунок 4. После ввода файла для чтения необходимо ввести имя файла для записи. Файл может быть создан пользователем или приложением. Рисунок 5. Папка с компилируемыми файлами для работы приложения после ввода исходного файла. 13 Downloaded by Michael Muzicenko (mihakurd@gmail.com) lOMoARcPSD|42418043 Рисунок 6. Пользователю необходимо ввести слово перед которым необходимо вставить пробел. Рисунок 7. Для примера вводим «слово» и. Рисунок 8. Вывод на экран измененного текста(этот же текст по условию записывается в файл для записи результата). 14 Downloaded by Michael Muzicenko (mihakurd@gmail.com) lOMoARcPSD|42418043 Рисунок 9. После выполнения алгоритма в папке с исходными данными создается файл в который записываются результаты работы программы Рисунок 10. Просмотр файла в который записывается результат 15 Downloaded by Michael Muzicenko (mihakurd@gmail.com) lOMoARcPSD|42418043 6. ЗАКЛЮЧЕНИЕ В курсовой работе создано консольное приложение для операционной системы Windows. Применяется для вставки перед задаваемым пользователем словом пробела и создания выходного файла. Слово считывается из текстового файла. Приложение написано с помощью языка высокого уровня C++ и языка низкого уровня – Macro Assembler (MASM). Приложение было собрано и отлажено в среде программирования Microsoft Visual Studio 2017. По результатам тестирования программа с поставленными задачами справляется. В отчете приведены алгоритмы, описан интерфейс приложения, приведен пример работы. В результате выполнения курсовой работы усвоены и закреплены навыки использования нескольких разноуравневых языков программирования для создания одного оптимизированного приложения. 16 Downloaded by Michael Muzicenko (mihakurd@gmail.com) lOMoARcPSD|42418043 7. СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 1. Методические указания к проведению лабораторного практикума по дисциплине программирование для подготовки бакалавров по направлению 09.03.01 – «Информатика и вычислительная техника»: СПБГЭТУ «ЛЭТИ», 2016. – 25 с. 2. Основы программирования на языках Си и C++ для начинающих // CppStudio. URL: http://cppstudio.com/cat/309/323/ (дата обращения: 15.05.2018). 3. Собрание материалов по программированию и схемотехнике // Клуб 155. URL: http://www.club155.ru/x86cmdcpu (дата обращения: 15.05.2018). 4. Калашников, О.А. Ассемблер - это просто. Учимся программировать / О.А. Калашников – СПБ: БХВ-Петербург, 2011. – 328 с 5. https://ru.wikipedia.org/wiki/Соглашение_о_вызове 6. https://ru.wikipedia.org/wiki/Windows_API 7. https://msdn.microsoft.com/enus/library/windows/desktop/aa383751(v=vs.85).aspx 8. https://msdn.microsoft.com/enus/library/windows/desktop/aa365430(v=vs.85).aspx 17 Downloaded by Michael Muzicenko (mihakurd@gmail.com)