
- •2 Сравнительный анализ языков программирования высокого уровня Си и Паскаль
- •2.1 Структура программы
- •2.2.2 Пользовательские типы
- •2.3 Арифметические операции
- •Окончание таблицы 2.3.1
- •Окончание таблицы 2.3.2
- •2.4 Указатели и векторные типы данных
- •2.5.2 Операторы-переключатели
- •2.6.2 Безусловный переход
- •2.7 Пользовательские подпрограммы
- •2.8 Итоги анализа сравнения языков программирования Паскаль и Си
- •3.2 Реализация задания
- •3.3 Алгоритмы, реализованные в процессе решения задачи
2.8 Итоги анализа сравнения языков программирования Паскаль и Си
В рассмотренных языках программирования высокого уровня Си и Паскаль имеются как свои плюсы, так и свои минусы. Удобство в использовании языка программистом является важным фактором при оценке и сравнении языков, а гибкость языка позволяет расширить возможности при реализации алгоритмов разных уровней. Язык Паскаль громоздок и имеет ограниченный набор возможностей по сравнению со многими языками, однако он достаточно иерархичен и структурирован. Язык Си гибок и логичен в своей структуре, имеет гораздо больше возможностей для работы, однако таит в себе много опасностей. Керниган говорит: «Си — инструмент, острый, как бритва: с его помощью можно создать и элегантную программу, и кровавое месиво» [4]. Поэтому использование языка Си оправдано лишь при достаточном уровне знаний в сфере программирования. На сегодняшний день очевидно, что язык Паскаль не может достойно конкурировать с языком Си, так как при усложнении задач, встающих перед программистами, требуется в первую очередь гибкость и функциональность.
3 Практическая реализация задания
3.1 Описание задачи и ограничений на ее выполнение
Формулировка
задачи звучит следующим образом: В
целочисленном массиве
найти наиболее длинную цепочку одинаковых
подряд стоящих элементов. Необходимо
реализовать программу, способную
генерировать случайную последовательность
чисел либо загружать ее из предварительно
подготовленного файла, и производить
поиск максимальной по длине
подпоследовательности, а затем производить
сохранение последовательности в файл.
Ограничения, установленные для реализации задачи:
-
многофайловость проекта;
-
наличие меню с удобным интуитивно понятным графическим интерфейсом;
-
возможность изменения параметров программы без изменения исходного кода;
-
возможность производить поиск всех подпоследовательностей максимальной длины;
-
работа с файлами.
3.2 Реализация задания
При реализации задания были разработаны две структуры: для работы с последовательностями posled и для организации поиска подпоследовательности внутри последовательности search. Список файлов проекта представлен в таблице 3.2.1. Для удобства доступа к файлам в MAIN.CPP описаны макросы для быстрого изменения пути до файлов: с использованием склейки строк MSTR(p) для текстовых файлов и подстановки DISK(p) для подключаемых файлов.
Таблица 3.2.1 Файлы проекта
Название файла |
Описание файла |
EGAVGA.BGI |
Файл графического драйвера |
INCLUDE.H |
Подключение стандартных библиотек, описание пользовательских типов, прототипы функций, подключение пользовательских файлов. |
ALG.CPP |
Функции работы с последовательностями. |
MENU.CPP |
Функции графического интерфейса. |
MAIN.CPP |
Главный компилируемый файл проекта, содержащий функцию main(). |
ABOUT.TXT |
Текстовый документ, его содержимое отображается в пункте меню ABOUT. |
OPEN.TXT |
Из этого файла загружается последовательность для дальнейшей обработки. Формат записи:
|
SAVE.TXT |
В этот файл записывается последовательность, если в меню OPTIONS было указано раздельное сохранение последовательностей. |
Для реализации графического интерфейса была применена стандартная библиотека graphics.h, использующая видеодрайвер egavga.bgi. Функций взаимодействия с пользователем 4: menu(), options(), about(), start(). Меню построено на рекурсивном и взаимно рекурсивном принципе. Для уменьшения кода была создана функция отрисовки фонового изображения draw_note(). Скриншоты главного меню и меню вывода результата представлены соответственно на рисунках 3.2.1 и 3.2.2.
Содержимое файла ALG.CPP указано в таблице 3.2.2. Рассмотрим содержимое файла MENU.CPP более подробно.
Рисунок 3.2.1 – Главное меню программы
Рисунок 3.2.2 – Меню представления данных
Функция menu() содержит графическое оформление меню, а так же информацию о взаимодействии с пользователем посредством клавиатуры. Для этих целей используется переменная типа static, указывающая, какой элемент меню был выбран сейчас. В случае нажатия на клавишу enter в зависимости от значения этой переменной вызывается одна из четырех функций start(), options(), about() или стандартная функция exit(int). В конце при естественном ходе программы функция menu() вызывает сама себя.
Функция start() запускает алгоритм решения задачи и содержит в себе подменю для определения источника последовательности. В случае выбора пункта меню “Create with->File” последовательность загружается из файла Z:\open.txt. Если этого файла не существует, программа сообщает об этом и переходит в меню. Если был выбран пункт меню “Create with-> Generator”, то
Таблица 3.2.2 – Функции для работы с последовательностями – ALG.CPP
Название функции |
Описание функции |
void posled_new (int n, posled*p); |
Функция заполняет структуру posled*p, передаваемую по указателю, пустой последовательностью размера n. |
void posled_delete (posled*p); |
Функция освобождает память, занимаемую последовательностью. |
void posled_rand (posled*p); |
Функция заполняет структуру случайной последовательностью, зависящей от глобальных переменных. |
void posl_save (char*path, posled*p) |
Функция сохраняет последовательность в файле с путем доступа, указанным в строке path. |
void posl_open (char*path, posled*p) |
Функция загружает последовательность из файла с путем доступа, указанным в строке path, в структуру p. |
search index_search (posled*p, int n) |
Функция выполняет поиск длиннейшей подпоследовательности одинаковых чисел, встречающейся n-й раз. Если таковой не находится, индекс первого символа подпоследовательности равен -1. |
при помощи функции posled_rand(posled*); генерируется последовательность из 48 элементов. Верхняя граница для генератора чисел задается в “MENU->OPTIONS” и равна по умолчанию 10. После генерации последовательности она распечатывается на экране и происходит поиск подпоследовательностей. Затем выделяются элементы подпоследовательностей, и внизу экрана выводится их длина. Функция рекурсивно вызывает себя в конце естественного хода программы.
Функция options() создает графический интерфейс для изменения параметров работы основного алгоритма. Эти параметры – возможность записывать и считывать из разных файлов (open.txt и save.txt) либо из одного и того же (open.txt), а так же верхний предел генератора случайных чисел randmax. Управление производится стрелками вправо и влево с клавиатуры, выбор нужного пункта меню – стрелками вверх и вниз. Переменная randmax ограничена интервалом значений [1..99]. Функция рекурсивна.
Функция about() позволяет получить информацию, записанную в файле about.txt. Если этого файла нет, программа пишет об этом пользователю. По завершению выполнения функции после нажатия любой клавиши вызывается функция menu().