Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

Основы программирования на языке Pascal

Содержание:

ВВЕДЕНИЕ

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

Одной из классических задач программирования является сортировка массивов. Причем она несет в себе практический интерес, поскольку сортированные массивы широко используются для хранения и обработки данных как будет показано в данной работе. Эти факты делают актуальной задачу изучения алгоритмов сортировки массивов и их практической реализации.

В качестве объекта исследования данной работы выступают языки программирования.

Предмет исследования: язык программирования Pasсal.

Целью данной работы является разработка программы сортировки массивов с помощью языка Pascal.

На основании поставленной цели сформулированы следующие задачи:

  1. Проанализировать информации из литературных источников по теме исследования.
  2. Классифицировать языки программирования.
  3. Провести обзор современных высокоуровневых языков программирования.
  4. Рассмотреть существующие виды алгоритмов сортировки массива.
  5. Рассмотреть несколько общих алгоритмов сортировки массива.
  6. Создать программу на языке Pascal, использующую данные алгоритмы.

1 ЯЗЫКИ ПРОГРАММИРОВАНИЯ. ОСНОВНЫЕ ПОНЯТИЯ И ТЕРМИНЫ

1.1. Понятие языка программирования

Языком программирования называют язык, который используется для создания и записи компьютерных программ [1]. Для того, чтобы разобраться что представляют собой современные языки программирования, необходимо понять как программа выполнятся в процессоре.

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

Написать программу в машинном коде достаточно сложно, причем сложность работы непропорционально возрастает с увеличением размера программы. Принято считать, что машинный код приемлем, если размер программы не превосходит нескольких десятков байтов и нет потребности в операциях ручного ввода и вывода данных [1].

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

Языки программирования – искусственные языки созданные с целью управления компьютером. Они отличаются от естественных человеческих языков малым количеством слов, значение которых понятно транслятору, и довольно жесткими требованиями по форме записи операторов. Нарушения формы записи приводят тому, что транслятор не может правильно выполнить перевод и выдает сообщение об ошибке.

1.2 Классификация языков программирования

Языки программирования стали активно развиваться в середине прошлого века. Некоторые из них уже не актуальные другие же используются до сих пор. Для их анализа, определения сходства и различия необходимо провести их классификацию [2].

1.2.1 Классификация по степени ориентации на возможности ЭВМ

На заре развития компьютеров для каждой модели процессора создавался свой уникальный язык. Он позволял работать только с этим типом процессоров. Такие языки называют машинно-зависимыми. Машинно-зависимые языки позволяют в наибольшей степени использовать возможности машины, однако требуют от программиста знания особенностей устройства машины. Эти языки используются для написания специального программного обеспечения.

В отличие от них, машинно-независимые языки, появившиеся позднее, позволяют программировать любые виды процессоров не только на компьютерах, но и на телефонах, планшетах, контроллерах и других устройствах. Машинно-независимые языки не зависят от типа компьютера, на котором они используются. Практически все современные языки программирования являются машинно-независимыми.

1.2.2 Классификация по типу решаемых задач

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

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

1.2.3 Классификация по степени ориентации на класс задач

По степени ориентации на класс задач современные языки программирования можно разделить на процедурно-ориентированные и проблемно-ориентированные [3].

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

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

1.2.4 Классификация по степени детализации алгоритма

По степени детализации алгоритма языки программирования можно разделить на три категории: низкого уровня, высокого уровня и сверхвысокого уровня.

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

Следующая группа — языки программирования высокого уровня. Это группа языков, которые допускают описание задачи в наглядном, легко воспринимаемом виде. Их отличительной особенностью является ориентация не на систему команд той или иной ЭВМ, а на систему инструкций, характерных для записи алгоритмов определенного класса. Языки высокого уровня позволяют абстрагироваться от команд конкретного процессора и работать с заранее определенными типами данных и функциями. Их гораздо проще изучить и создавать на них программы.

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

1.2.5 Классификация по способу получения результата

По способу достижения конечного результата языки программирования можно разделить на процедурные, декларативные и объектно-ориентированные.

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

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

Объектно-ориентированные языки, разработанные в середине 70-х гг., представляют собой отображение объектов реального мира, их свойств (атрибутов) и связей между ними при помощи специальных структур данных. При объектно-ориентированном подходе для каждого объекта создается своя структура данных, называемая классом и содержащая свойства объекта (поля) и процедуры для управления объектом (методы). При этом каждый класс может содержать несколько подклассов, описывающих частные случаи общего объекта. Все подклассы содержат в себе, наряду с общими свойствами, также еще ряд специфических свойств, отличающих их от первоначального класса. Такой принцип называется принципом наследования свойств (от общего к частному) [4].

1.2.6 Классификация по возможности создания новых типов данных и операций

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

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

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

1.3 Основные этапы разработки программ на языках программирования высокого уровня.

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

  1. Постановка задачи. Задача формулируется на уровне понятий проблемной области, к которой она относится, и должна быть понятна исполнителю (пользователю).
  2. Математическая формулировка задачи (формализация задачи). Формализация задачи фактически представляет разработку математической модели решаемой задачи и включает в себя:
  • описание задачи с помощью формул;
  • определение перечней исходных данных и получаемых результатов;
  • задание начальных условий и точности вычислений.
  1. Выбор (поиск) метода решения задачи. В ряде случаев одна и та же задача может быть решена с помощью различных методов.
  2. Разработка алгоритма решения задачи. На данном этапе устанавливается необходимая логическая последовательность вычислений с учетом выбранного метода решения задачи и других действий, с помощью которых будут получены результаты.
  3. Написание программы на одном из имеющихся языков программирования .
  4. Тестирование и отладка программы при различных входных данных.

Обычно последний пункт может занимать значительное время, иногда сравнимое со временем разработки программного продукта. Современные языки высокого уровня вкупе со специальными средами разработки значительно сокращают длительность этого этапа[5-7].

2Язык программирования Pascal

Pascal - это императивный и процедурный язык программирования, разработанный Никлаусом Виртом как небольшой эффективный язык, предназначенный для поощрения хороших практик программирования с использованием структурированного программирования и структурирования данных. Он назван в честь французского математика, философа и физика Блеза Паскаля.

Паскаль был разработан по образцу языка ALGOL 60. Вирт участвовал в процессе улучшения языка в рамках усилий ALGOL X и предложил версию, известную как ALGOL W. Она не была принята, и процесс ALGOL X застопорился. В 1968 году Вирт решил отказаться от процесса ALGOL X и еще больше улучшить ALGOL W, выпустив его как Pascal в 1970 году.

Паскаль стал очень успешным в 1970-х годах, особенно на растущем рынке мини-компьютеров. Компиляторы также были доступны для многих микрокомпьютеров, поскольку эта область появилась в конце 1970-х годов. Он широко используется в качестве языка преподавания в университетских курсах программирования в 1980 - х годах, а также используется в установках производства для написания коммерческого программного обеспечения в течение того же периода. Он был вытеснен языком программирования C в конце 1980-х и начале 1990-х годов, когда системы на основе UNIX стали популярными, особенно с выпуском C ++.

Производная, известная как Object Pascal, предназначенная для объектно-ориентированного программирования, была разработана в 1985 году; он использовался Apple Computer и Borland в конце 1980-х годов, а затем превратился в Delphi на платформе Microsoft Windows. Расширение понятий Паскаля привело к языкам Модула-2 и Оберон [8].

Pascal в своей первоначальной форме является чисто процедурным языком и включает в себя традиционный массив ALGOL- подобных структур[9] управления с зарезервированными словами, такими как if , then, else, while, for и case в пределах одного оператора или begin - end блока инструкций.Pascal также имеет конструкции структурирования данных, не включенные в исходные типыALGOL 60 , такие как записи, варианты, указатели, перечисления и наборы, а также процедуры/указатели.Такие конструкции были частично унаследованы или вдохновлены Simula 67, ALGOL 68 , собственным ALGOL WНиклауса Вирта и предложениями CAR Hoare .

Программы на Паскале начинаются с ключевого словаprogram со списком внешних файловых дескрипторов в качестве параметров,затем следует основной блок, заключенный в квадратные скобки с начала и конца ключевых слов.Точки с запятой разделяют операторы, и точка (то есть точка) завершает всю программу [10].Пример программы, выводящей фразу «Hello, World!»показан на рисунке 1

Рисунок 1 – Helloworldна Pascal

Типданных в Pascal, как и в некоторых других популярных языках программирования определяет диапазон значений, которые может хранить переменная, а также набор операций, которые допустимо выполнять над переменные этого типа.Предопределенные типы показаны в таблице 1.

Таблица 1 – Предопределенный типы данных в Pascal

Тип данных

Тип значений, которые может хранить переменная

integer

целые числа

real

числа с плавающей точкой

boolean

значения True или False

char

один символ из упорядоченного набора символов

string

последовательность или «строка» символов

set

эквивалентно массиву логических значений

Диапазон значений, разрешенных для каждого (кроме логического) типа, определяется реализацией.Для некоторых преобразований данных предусмотрены функции.Для преобразования real в integer доступны следующие функции: round и trunc ( округление до нуля).

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

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

  • Delphi является флагманским продуктом быстрой разработки приложений (RAD) Embarcadero (ранее Borland/CodeGear). Для создания приложений для Windows, macOS, iOS и Android он использует язык Object Pascal (названный Borland «Delphi»). Поддержка .NET, существовавшая с D8 по D2005, D2006 и D2007, была прекращена и заменена новым языком (Prism, который переименован в Oxygene), который не полностью обратно совместим. В последние годы добавлена поддержка Unicode и дженериков (D2009, D2010, Delphi XE).
  • Free Pascal - это мультиплатформенный компилятор, написанный на Object Pascal. Он нацелен на создание удобного и мощного компилятора, способного как компилировать устаревшие приложения, так и быть средством разработки новых. Он распространяется под GNU GPL, в то время как пакеты и библиотека времени выполнения подпадают под модифицированный GNU LGPL. Помимо режимов совместимости для Turbo Pascal, Delphi и Mac Pascal, он также имеет свои процедурные и объектно-ориентированные синтаксические режимы с поддержкой расширенных функций, таких как перегрузка операторов. Поддерживает множество платформ и операционных систем. Текущие версии также имеют режим ISO.
  • Modern Pascal - это мультиплатформенный интерпретатор и компилятор p-кода, написанный на Free Pascal. Он нацелен на предоставление альтернативных решений для PHP и node.js, использующих либо паскаль стандарта ISO, либо гибрид, поддерживающий операторы JavaScript/C. Из CLI это полезно в качестве интерпретатора Free Pascal.
  • Turbo51 - это бесплатный компилятор Pascal для семейства микроконтроллеров 8051 с синтаксисом Turbo Pascal 7.
  • Oxygene (ранее известный как Chrome) - это компилятор Object Pascal для платформ .NET и Mono. Он был создан и продается RemObjects Software, и некоторое время продавался Embarcadero в качестве внутреннего компилятора Prism.
  • Kylix был потомком Delphi, с поддержкой операционной системы Linux и улучшенной объектной библиотекой. Это больше не поддерживается. Компилятор и IDE теперь доступны для некоммерческого использования.
  • GNU Pascal Compiler (GPC) - это компилятор Pascal из коллекции компиляторов GNU (GCC). Сам компилятор написан на C, библиотека времени выполнения в основном на Pascal. Распространяется по лицензии GNU General Public License, работает на многих платформах и операционных системах. Он поддерживает стандартные языки ANSI/ISO и частично поддерживает диалект Turbo Pascal. Одним из наиболее болезненных упущений является отсутствие 100% -го совместимого с Turbo Pascal (короткого) типа строки. Поддержка Borland Delphi и других языковых вариаций довольно ограничена. Однако есть некоторая поддержка Mac-паскаля.
  • Virtual Pascal был создан Виталием Мирьяновым в 1995 году как собственный компилятор OS / 2, совместимый с синтаксисом Borland Pascal. Затем он был коммерчески разработан компанией fPrint, добавив поддержку Win32, и в 2000 году он стал бесплатным. Сегодня он может компилироваться для Win32, OS/2 и Linux и в основном совместим с Borland Pascal и Delphi. Разработка была отменена 4 апреля 2005 года.
  • Компилятор P4, основа для многих последующих компиляторов, реализованных на языке Pascal. Он реализует подмножество полного Паскаля.
  • Компилятор P5, является ISO 7185 (полный Паскаль) адаптация P4.
  • Smart Mobile Studio - это компилятор из Паскаля в HTML5/Javascript
  • Turbo Pascal был доминирующим компилятором Pascal для ПК в 1980-х и начале 1990-х годов, популярным благодаря мощным расширениям и чрезвычайно короткому времени компиляции. Turbo Pascal был компактно написан и мог компилировать, запускать и отлаживать все из памяти без доступа к диску. В те времена медленные флоппи-дисководы были обычным явлением для программистов, что еще больше увеличивало преимущество Turbo Pascal в скорости. В настоящее время более старые версии Turbo Pascal (до 5.5) доступны для бесплатной загрузки с сайта Borland.
  • IP Pascal. Реализует язык «Pascaline» (названный в честь калькулятора Pascal), который является сильно расширенным Pascal, совместимым с оригинальным Pascal в соответствии с ISO 7185. Он включает в себя модули с управлением пространством имен, в том числе модули параллельных задач с семафорами, объектами, динамическими массивами любых типов. измерения, которые выделяются во время выполнения, перегрузки, переопределения и многие другие расширения. IP Pascal имеет встроенную библиотеку переносимости, специально адаптированную для языка Pascal. Например, стандартное приложение для вывода текста из оригинального Pascal 1970-х годов можно перекомпилировать для работы в окне и даже добавить графические конструкции.
  • Pascal-XT был создан Siemens для своих мэйнфреймовых операционных систем BS2000 и SINIX.
  • PocketStudio - это компилятор подмножеств Pascal и инструмент RAD для процессоров Palm OS и MC68xxx с некоторыми собственными расширениями, помогающими взаимодействовать с API Palm OS. Он напоминает Delphi и Lazarus с визуальным конструктором форм, инспектором объектов и редактором исходного кода.
  • MIDletPascal - компилятор Pascal и IDE, который генерирует небольшой и быстрый Java-байт-код, специально разработанный для создания программного обеспечения для мобильных телефонов.
  • Vector Pascal Vector Pascal - это язык для наборов инструкций SIMD, таких как MMX и AMD 3d Now, поддерживающих все процессоры Intel и AMD и Sony PlayStation 2 Emotion Engine.
  • Morfik Pascal позволяет разрабатывать веб-приложения, полностью написанные на Object Pascal (как на стороне сервера, так и на стороне браузера).
  • WDSibyl - визуальная среда разработки и компилятор Pascal для Win32 и OS/2
  • PP Compiler, компилятор для Palm OS, который работает непосредственно на КПК.
  • Компилятор CDC 6000 Pascal является исходным кодом для первого (CDC 6000) компилятора Pascal.
  • AmigaPascal - это бесплатный компилятор Pascal для компьютера Amiga [11,12].

3 РАЗРАБОТКА ПРОГРАММЫ СОРТИРОВКИ МАССИВОВ

3.1 Программа сортировки массива

В данной работе создана программа сортировки массива произвольного размера, реализующая два метода: метод вставки и пузырьковый метод. В программе сравниваются такие показатели как количество итераций цикла, количество перестановок и время выполнения кода для каждого метода.

В качестве среды программирования использовалась Embarcadero Delphi.

Среда Embarcadero Delphi представляет собой интегрированную оболочку разработчика, в которую входит набор специализированных программ, ответственных за разные этапы создания готового приложения. Delphi – язык и среда программирования, относящаяся к классу RAD-средств. Мощность и гибкость языка программирования Delphi – это важное достоинство языка, выгодно отличающее эту систему программирования от других инструментов RAD.

Среда предназначена для быстрой разработки прикладного ПО для операционных систем Windows, Mac OS X, а также iOS и Android. Благодаря уникальной совокупности простоты языка и генерации машинного кода, позволяет непосредственно, и, при желании, достаточно низкоуровнево взаимодействовать с ОС, а также с библиотеками, написанными на C/C++. Созданные программы независимы от стороннего ПО, как то Microsoft .NET Framework или Java Virtual Machine. Выделение и освобождение памяти контролируется в основном пользовательским кодом, что, с одной стороны, ужесточает требования к качеству кода, а с другой делает возможным создание сложных приложений с высокими требованиями к отзывчивости (работа в реальном времени). В кросс-компиляторах для мобильных платформ предусмотрен автоматический подсчёт ссылок на объекты, облегчающий задачу управления их временем жизни. На рисунке 2 представлен процесс разработки программы в среде AmbarcoderoDelphi.

Рисунок 1‑Разработка программы в среде Embarcadero Delphi

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

На рисунке 3 представлена упрощенная диаграмма состояний программы.

Рисунок 2‑ Состояния программы

На рисунке 4 представлена блок-диаграмма программы

Рисунок 4 ‑ Блок-схема программы

Интерфейс пользователя изображён на рисунке 5

Рисунок 5‑ Интерфейс пользователя программы

После нажатия кнопки «Сортировать» значение размера массива, введенное в поле «Введите размер массива» передается в 3 динамические массивы arr,arr2 и arr3. Ниже представлен код, реализующий этот процесс.

N := StrToInt(edit1.Text);

setlength(arr,N);

setlength(arr2,N);

setlength(arr3,N);

Первый из массивов используется для хранения несортированных данных, два данные в двух других сортируются. Далее массивы инициализируются случайными целочисленными значениями в диапозоне от 0 до 100. Каждый из массивов имеет одинаковый набор значений. Ниже представлен код, реализующий это.

forI := 0 toN-1 do

begin

arr[I]:=Random(100);

arr2[I]:=arr[I];

arr3[I]:=arr[I];

end;

Значения первого массива выводятся на экран в элемент индикации Memo1.

Memo1.Clear();

for I := 0 to N-1 do

begin

Memo1.Lines.Add(IntToStr(arr[I]));

end;

Второй массив подвергается процедуре сортировке пузырьками. Во первых перед сортировкой обнуляются все счетчики, потом с помощью функций QueryPerformanceFrequency и QueryPerformanceCounter возвращаются значения тактовой частоты процессора и значение системного таймера, эти параметры нужны для вычисления времени выполнения участка кода. После выполнения сортировки QueryPerformanceCounter вызывается еще раз и по разнице значений системного таймера, частоте процессора и количестве итераций цикла вычисляется время работы цикла. Ниже представлена блок-схема этого метода сортировки (рисунок 6) и исходный код.

Рисунок 6 ‑ Блок-схема метода сортировки пузырьками

iter:=0;

ch:=0;

QueryPerformanceFrequency(Fr);

QueryPerformanceCounter(t0);

for j:= 0 to N do

begin

iter:=iter+1;

for i := 0 to N-j do

begin

iter:=iter+1;

if arr2[i]>arr2[i+1] then

begin

ch:=ch+1;

temp:=arr2[i];

arr2[i]:=arr2[i+1];

arr2[i+1]:= temp;

end;

end;

end;

QueryPerformanceCounter(t1);

dt := (t1-t0)/(N*Fr);

Третий массив сортируется методом вставок. На рисунке 7 представлена блок-схема этого метода.

Рисунок 7 ‑ Блок-схема метода сортировки вставками

Полностью программный код представлен в приложении А.

3.2 Тестирование программы

Запустим программу и зададим размер массива равным 10 элементам. Результат работы программы показан на рисунке 8.

Рисунок 8‑ Результат работы программы для массива из 10 элементов

Из рисунка видно, что оба метода успешно справились с сортировкой массива, при этом сортировка пузырьковым методом заняла примерно в два раза больше времени чем сортировка вставками.

Проверим работы программы на массиве из 100 элементов (Рисунок 9).

Рисунок 9‑ Результат выполнения программы для массива из 100 элементов

Из рисунка видно, что количественно отношение времени двух методов осталось таким же, что согласуется с теоретическими сведениями.

ЗАКЛЮЧЕНИЕ

В данной курсовой работе было проведено исследование на тему «Программы циклической структуры. Массивы данных»

В главе 1 была обобщена информация о языках программирования, взятая из литературных источников. Описано понятие языка программирования, его назначение и выполняемые функции.

Также в главе проведена классификация языков программирования по основным критериям. Практически все современные языки высокого уровня относятся к машинно-независимым языкам. Чаще всего сейчас используются языки прикладного программирования. Практически все они позволяют создавать программы, основанные на объектно-ориентированном подходе.

Были рассмотрены наиболее популярные на сегодняшний день языки программирования высокого уровня. Язык С++ является наиболее универсальным из них, он позволяет как создавать кроссплатформенные программы с высоким уровнем абстракции от оборудования, так и системные решения вроде драйверов и низкоуровневых программ. Такие языки как Perl и PHP нашли свое широкое применение в создании сайтов сети Интернет. Популярный на сегодняшний день C# создавался на основе языка C для работы с платформой .NET компании Microsoft.

Во второй главе рассмотрен предмет исследования – язык программирования Pascal. Показана краткая история создания языка, поддерживаемые инструкции и типы данных, описаны основные компиляторы.

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

СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ

  1. Панюкова, Т. А. Языки и методы программирования. Создание простых GUI-приложений с помощью Visual С++. Учебное пособие / Т.А. Панюкова, А.В. Панюков. - М.: Либроком, 2015. - 144 c
  2. Фаронов Валерий Васильевич. Delphi. Программирование на языке высокого уровня: Учебник для вузов / В. В. Фаронов. — СПб.: Питер, 2017. — 639 с.: ил. — (Учебник для вузов). — Библиогр.: с. 628 (7 назв.)
  3. Баррон, Дэвид Введение в языки программирования; М.: Мир - Москва, 2015. - 192 c.
  4. Григорьев, А.Б. О чем не пишут в книгах по Delphi; БХВ-Петербург - Москва, 2013. - 576 c.
  5. Гудман, Д. Java Script и DHTML. Сборник рецептов для профессионалов; СПб: Питер - Москва, 2013. - 523 c.
  6. Delphi 7 / А. Д. Хомоненко [и др.]; под ред. А. Д. Хомоненко. — СПб.: БХВ-Петербург, 2016. — 1200 с.: ил. — (В подлиннике). — Предм. указ.: с. 1196-1200
  7. Скворцова Л.А., Чудновская Н.Д. Лабораторный практикум по программированию в Delphi. Электронная версия
  8. Кристиансен, Том; Торкингтон, Натан Perl: библиотека программиста; СПб: Питер - Москва, 2015. - 736 c.
  9. Либерти, Джесс Освой самостоятельно C++ за 21 день; М.: Вильямс - Москва, 2015. - 816 c.
  10. Мугал, Халид А.; Расмуссен, Рольф В. Java. Руководство по подготовке к сдаче сертификационного экзамена CX-310-035 (+ CD-ROM); М.: Кудиц-образ - Москва, 2017. - 688 c.
  11. Муртаф, Б. Современное линейное программирование; Мир - Москва, 2010. - 224 c.
  12. Абельсон, Х.; Сассман, Дж. Структура и интерпретация компьютерных программ; М.: Добросвет - Москва, 2012. - 608 c.

Приложение А

Исходный код программы

unitSorting;

interface

uses

Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,

Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;

type

TForm1 = class(TForm)

Button1: TButton;

Label1: TLabel;

Edit1: TEdit;

Label2: TLabel;

Label4: TLabel;

Label5: TLabel;

Memo1: TMemo;

Label7: TLabel;

Memo2: TMemo;

Label8: TLabel;

Label9: TLabel;

Label10: TLabel;

Bevel1: TBevel;

Bevel2: TBevel;

Label11: TLabel;

Label12: TLabel;

Label13: TLabel;

Memo3: TMemo;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

var N: integer; // переменная N, будет содержать размер массива

var j, temp, iter, ch, I, k, m: integer; // служебные переменные, будут использоваться в программе

var arr,arr2,arr3: array of integer; // массивы

var Fr, t0, t1: Int64; // служебные переменные для вычисления времени выполнения

var dt: Extended; // содержит время выполнение кода

begin

// инициализируем циклы и переменные

N := StrToInt(edit1.Text); // присваиваем переменной N значение размера массива введенного пользователем

setlength(arr,N); // задаем размеры массивов

setlength(arr2,N);

setlength(arr3,N);

label8.Caption:='Итераций: '; // задаем начальные значения надписям

label10.Caption:='Перестановок: ';

label9.Caption:='Времени: ';

label11.Caption:='Итераций: ';

label12.Caption:='Перестановок: ';

label13.Caption:='Времени: ';

for I := 0 to N-1 do // инициализируем массивы случайными числами

begin

arr[I]:=Random(100);

arr2[I]:=arr[I];

arr3[I]:=arr[I];

end;

// отображаем значение несортированного массива

Memo1.Clear();

for I := 0 to N-1 do

begin

Memo1.Lines.Add(IntToStr(arr[I]));

end;

// сортируем массив методом пузырьков

iter:=0; // обнуляем счетчики

ch:=0;

QueryPerformanceFrequency(Fr); // считываем частоту процессора

QueryPerformanceCounter(t0); // считываем значение системного таймера перед началом сортировки

for j := 0 to N do // сортируем массив

begin

iter:=iter+1;

for i := 0 to N-j do

begin

iter:=iter+1;

if arr2[i]>arr2[i+1] then

begin

ch:=ch+1;

temp:=arr2[i];

arr2[i]:=arr2[i+1];

arr2[i+1]:= temp;

end;

end;

end;

QueryPerformanceCounter(t1); // считываем значение системного таймера по окончанию сортировки

dt := (t1-t0)/(N*Fr); // вычисляем время выполнения циклов сортировки

// отображаем отсортированный методом пузырьком массив и данные счетчиков

Memo2.Clear();

for I := 1 to N do // выводим массив, отсортированный методом пузырьков

begin

Memo2.Lines.Add(IntToStr(arr2[I]));

end;

label8.Caption:=label8.Caption + IntToStr(iter); // выводим число итераций циклов

label10.Caption:=label10.Caption + IntToStr(ch); // выводим число перестановок

label9.Caption:=label9.Caption + FloatToStr(dt); // выводим затраченное на сортировку время в секундах

// сортируем массив методом вставок

iter:=0; // обнуляем счетчики

ch:=0;

Fr:=0;

t0:=0;

t1:=0;

QueryPerformanceFrequency(Fr); // считываем частоту процессора

QueryPerformanceCounter(t0); // считываем значение системного таймера перед началом сортировки

for I := 0 to N do

begin

iter:=iter+1;

temp := arr2[I];

j := 0;

while temp > arr2[j] do

begin

j:=j+1;

iter:=iter+1;

end;

for k:=I downto j+1 do

begin

arr2[k]:=arr2[k-1];

arr2[j]:=temp;

iter:=iter+1;

ch:=ch+1;

end;

end;

QueryPerformanceCounter(t1); // считываем значение системного таймера по окончанию сортировки

dt := (t1-t0)/(N*Fr); // вычисляем время выполнения циклов сортировки

// отображаем отсортированный методом вставок массив и данные счетчиков

Memo3.Clear();

for I := 1 to N do // выводим массив, отсортированный методом вставок

begin

Memo3.Lines.Add(IntToStr(arr2[I]));

end;

label11.Caption:=label11.Caption + IntToStr(iter); // выводим число итераций циклов

label12.Caption:=label12.Caption + IntToStr(ch); // выводим число перестановок

label13.Caption:=label13.Caption + FloatToStr(dt); // выводим затраченное на сортировку время в секундах

end;

end.