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

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

Содержание:

ВВЕДЕНИЕ

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

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

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

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

Цель курсовой работы – анализ языков программирования высокого уровня. Для определения поставленной цели необходимо решить следующие задачи:

  1. Анализ истории языков программирования;
  2. Определение понятия языка программирования;
  3. Анализ видов языков программирования высокого уровня;

Объект курсовой работы - языки программирования и история их развития. Предмет курсовой работы – разработанная программа на языке программирования высокого уровня С++.

Степень разработанности проблемы. В процессе исследования были проанализированы работы, посвященные анализу истории, понятия языков программирования. Весомый вклад в исследование данных вопросов внесли отечественные ученые: Акулич, И.Л., Балдин, К.В., Грошев А.С., Зрюмова А.Г., Зрюмов Е.А., Пронин С.П., и другие.

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

Теоретическая значимость выпускной квалификационной работы состоит в том, что в процессе рассмотрения данной темы с различных позиций, используются взгляды и мнения различных авторов, таких как Вайсфельд Мэтт., Меженный О.А., Орлова И.В., Таганов Л.С., Пимонов А.Г., Меняев М.Ф., Карпов Ю.Г., Цветкова М.С., Великович Л.С., Хубаева Г.Н., Акулич, И.Л., Балдин, К.В., Грошев А.С., Зрюмова А.Г., Зрюмов Е.А., Пронин С.П.

Основная часть

1Языки программирования: понятие и история развития

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

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

Возникает вопрос, так для чего же нужны языки программирования?

Процесс работы персонального компьютера - это выполнение программы, иными словами выполнение пакета команд, которые следуют в определенном порядке. Вид команды машинного типа, состоящий из нулей и единиц, указывает, какие должен выполнять действия центральный процессор, из чего следует: чтобы задать персональному компьютеру последовательность выполняемых действий, задается последовательность кодов двоичного типа соответствующих команд. В машинных кодах софты состоят из множества команд, и написание подобного софта является достаточно трудным делом, а также очень утомительным и тяжелым.[2] Программист должен разбираться в комбинации единиц и нулей кода двоичного типа каждой программы, помимо этого, он должен помнить коды двоичного типа адресов данных, используемые при ее выполнении. Намного проще писать софт на языке, который более близок к человеческому естественному языку, и поручить персональному компьютеру перевод этой программы в коды машинного типа. Именно таким образом и появились языки программирования, предназначаемые для написания софта.

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

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

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

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

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

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

Язык большей части современных компьютеров достаточно скуп и состоит из команд типа: «выделить память определенного размера», «прочитать содержание определенной ячейки памяти», «добавить два числа», «переслать число из регистра памяти процессора в определенную ячейку оперативной памяти», «сравнить два числа, перехода к выполнению следующей команды» и т.п. Таких команд несколько сотен, и они настолько просты, что могут реализоваться аппаратной частью компьютера. Набор данных команд носит название языка машинных кодов. Используя команды этого набора, можно описать алгоритм, но запись может быть настолько громоздок, что вероятность его безошибочности чрезвычайно мала.[6]

1.2.История развития языков программирования

История языков программирования начинается с высказанной в 20-х годах 19 века Ч.Бэббиджем мыслью о предварительной записи порядка действий машины – программе. Революционным моментом в истории языков программирования стало появление системы кодирования машинных команд с помощью специальных символов, которая была предложена Джоном Моучли, сотрудником Пенсильванского университета. Система кодирования Моучли, настолько увлекла одну из сотрудниц его компании, что она посвятила которая посвятила всю свою жизнь компьютерам и программированию. Данной женщиной является Грейс Мюррей Хоппер. Хоппер Г., в процессе работы на компьютере «Марк-i» столкнулась с многочисленными проблемами. В частности, они придумали подпрограммы.[7]

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

В конце 40-х годов Джона Моучли создал систему под названием «Short Code». Данная модель являлась примитивным языком программирования высокого уровня, в которой программист мог записывать решаемую задачу в виде математических формул, а затем, используя специальную таблицу, переводил символ за символом, преобразовывал эти формулы в двухлитерные коды. В дальнейшем специальная программа компьютера превращала эти коды в двоичный машинный код. Система, разработанная Дж. Моучли, была по существу одним из первых примитивных интерпретаторов.

Грейс Мюррей Хоппер в 1951 году создала первый в мире компилятор, так же она стала создателем данного термина. Компилятор осуществлял функцию объединения команд и в ходе трансляции производил организацию подпрограмм, выделение памяти компьютера, преобразование команд высокого уровня (в то время псевдокодов) в машинные команды.

Стремительный прогресс языков программирования пришелся на середину 50 – х годов. Роль программирования в машинных командах стала уменьшаться, начали появляться языки программирования нового типа, которые выступают в роли посредника между машинами и программистами. Первым и одним из наиболее распространенных был Фортран, разработанный группой программистов фирмы IBM в 1954 г. (первая версия).

В середине 60-х годов был создан специализированный язык программирования, создателями которого являлись сотрудники математического факультета Дартмутского колледжа Томас Курц и Джон Кемени. Данный язык состоял из простых слов английского языка. Новый язык назвали BASIC.[8] Если рассматривать начало 60-х годов, то можно заметить что все существующие языки программирования высокого уровня можно было пересчитать по пальцам, впрочем, впоследствии их число достигло трех тысяч. Безусловно, большая часть языков не получила в истории языков программирования хоть какого-нибудь щирокого распространения, так как в практической деятельности используется не более двух десятков. Разработчики ориентировали языки программирования на разные классы задач, в той или иной мере привязывали их к конкретным архитектурам ЭВМ, реализовывали личные вкусы и идеи. В 60-е годы в истории языков программирования были предприняты попытки преодолеть эту «разноголосицу» путем создания универсального языка программирования. И первым выпуском этого направления стал PL/I. PL/I – это Programm Language One. Затем на эту роль претендовал АЛГОЛ-68. Как ожидалось, что подобные языки будут развиваться и усовершенствоваться и вытеснят все остальные, впрочем, ни одна из этих попыток на сегодняшний день не увенчалась успехом. Всеохватность языка приводила к неоправданной, с точки зрения программиста, сложности конструкций, неэффективности компиляторов.

Конец 50 – х годов положил начало языку Алгол . Алгол (ALGOL) - от ALGOrithmic Language, что в переводе с ангийского означает алгоритмический язык. Язык прогрраммирования Алгол предназначен для записи алгоритмов, строящихся в виде последовательности процедур, которые применяются для решения поставленных задач. В 70 – х годах происходит развитие языка Алгол, что нашло свое отражение в процессе создания языка Паскаль . Его создателем был швейцарский ученый Ннклаус Вирт. Язык Паскаль изначально был разработан как учебный, и, действительно, сейчас он является одним из основных языков обучения программированию в школах и вузах.[9]

Начиная с конца 60-х годов и до начала 80 – х годов происходит бурный рост числа различных языков программирования, который сопровождается кризисом программного обеспечения. Данный кризис был особо заметен в военном ведомстве Соединеных Штатов Америки. И только в январе 1975 года, Пентагон все таки решил навести порядок в хаосе трансляторов, было принято решение учредить комитет, которому было предписано разработать один универсальный язык. Победившим языком стал АДА.

Достаточно большой отпечаток в истории языков программирования наложил язык Си, который являлся популярным в среде разработчиков систем программного обеспечения. Первая версия Языка Си была выпущена в 1972 году. Язык Си сочетает в себе черты как языка высокого уровня, так и машинно-ориентированного языка, допуская программиста ко всем машинным ресурсам, чего не обеспечивают такие языки, как Бейсик и Паскаль.

На протяжении досточно долго времени, программное обеспечение строилось на основе операциональных и процедурных языков, например таких как Фортран , Бейсик, Паскаль, Ада, Си. Классическое операциональное и/или процедурное программирование требует от программиста детального описания того, как решать задачу, иными словами формулировки алгоритма и его специальной записи. При этом ожидаемые свойства результата обычно не указываются. Основные понятия языков этих групп - оператор и данные. При процедурном подходе операторы объединяются в группы - процедуры. Структурное программирование в целом не выходит за рамки этого направления, оно лишь дополнительно фиксирует некоторые полезные приемы технологии программирования.

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

Объектно-ориентированный язык. Данный язык формирует окружение в виде множества независимых объектов, где каждый из них ведет себя подобно отдельному компьютеру. Объекты можно использовать для решения задач как «черные ящики», не вникая во внутренние механизмы их функционирования. Примерами языка объектного программирования, из числа основных, прежде всего, можно назвать язык Си++, а для более широкого крута программистов предпочтительны среды типа Delphi и Visual Basic.

Несмотря на то что, создано уже очень много языков программирования, можно с уверенностью сказать что, история развития программирования до конца еще не написана и вряд ли это произойдет в ближайшем будущем. Изобретение языка программирования высшего уровня предоставило нам возможность общаться с машиной, понимать её, как например, немец немного знакомый с русским языком, понимает древнюю азбуку Кириллицы. Иными словами, на данный момент человечество с ЭВМ пока что на ВЫ, и это совершенно не сарказм, стоит только посмотреть как развилась наука программирования с того времени, как появились языки программирования, а ведь язык программирования высшего уровня, судя по всему ещё младенец. Но если обратить внимание на темпы роста и развития новых технологий в области программирования, то можно предположить, что в ближайшем будущем, человеческие познания в этой сфере, помогут произвести на свет языки, которые умеют принимать, обрабатывать и передавать информации в виде мысли, слова, звука или жеста. Возможно, концепция решения данного вопроса проста, а ближайшее будущее этого проекта уже не за горами, и в этот момент, где-нибудь в мире перед стареньким 133MHz трудится молодой, еще никем не признанный специалист и разрабатывает новейшую систему искусственного интеллекта, которая, наконец то позволила бы человеку, с помощью своих машинных языков, вести диалог с машиной на ТЫ.

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

Завершить данную главу хорошо бы на такой оптимистичной ноте, но нет, напоследок хочется сказать: «Единственный способ изучать новый язык программирования – писать на нём программы».

1.3.Примеры основных языков программирования

Основными и популярными языками программирования являются:

  1. Assembler. Язык Assembler – это язык, в котором каждый оператор соответствует ровно одной машинной команде, иными словами, в программе, написанной на Assembler, существует взаимно однозначное соответствие между машинными командами и операторами. Так, если каждая строка в ассемблерной программе содержит ровно один оператор, и каждое машинное слово содержит ровно одну команду, то из ассемблерной программы размером в п строк получится программа на машинном языке из п слов. Язык программирования Assembler обладает несколькими особенными чертами, которые отличают его от языков высокого уровня. Ими являются:
  2. Взаимно однозначное соответствие между операторами языка ассемблера и машинными командами.
  3. Программист, который пишет на ассемблере, обладает доступом ко всем объектам и командам целевой машины, в то время как, у программистов, пишущих на языках высокого уровня, такого доступа нет. К примеру, если целевая машина содержит бит переполнения, ассемблерная программа может проверить его, а Java-программа - нет.
  4. Ассемблерная программа может работать только на компьютерах одного семейства, а программа, которая написана на языке высокого уровня, потенциально может работать на разных машинах. Возможность переноса программного обеспечения с одной машины на другую очень важна для многих прикладных программ.
  5. Кобол. Под данной группой языков программирования понимается язык программирования, который применяется при описании программ для решения учетно-экономических и управленческих задач с помощью ЭВМ. Кобол обеспечивает наглядную и достаточно компактную запись алгоритмов в форме, независимой от конкретной ЭВМ. Кобол был разработан в США в 1958-1960 годах. Кобол был раскритикован за его многословность и громоздкость, так как одной из целей создателей языка было максимально приблизить конструкции к английскому языку, но, несмотря на это, Кобол является обладателем прекрасными для своего времени средствами для работы со структурами данных и файлами. Кобол стал первым языком, в котором появился тип данных «запись». И до сего времени, каждый год пишутся миллионы новых строк кода на Коболе.
  6. Фортран. Язык программирования Фортран (Fortran) является первым алгоритмическим языком программирования, который был создан ещё в 1954 году программистом John Warner Backus в фирме IBM. Его название является аббревиатурой от FORmula TRANslator, т.е. интерпретатор формул. Фортран широко использовался в основном для научных и инженерных вычислений, вместе с тем, он идеально подходит для решения численных задач, так как за 50 с лишним лет написано множество библиотек, поэтому языком пользуются сейчас и в ближайшем будущем ему не грозит забвение. На данный момент Фортран занимает достаточно скромное место среди языков программирования и его известность никак не может сравниться с былой популярностью в 60-70-е годы, но это совершенно не означает, что Фортран умер, как некоторые его старые конкуренты (Algol 60 и Algol 68, PL/1). Фортран жив. В чем же причина такого долголетия? Фортран занимает свою нишу - решение научно-технических задач и математическая обработка числовых данных. Помимо этого нужно отметить еще и следующее:

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

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

- Огромный объем готовых математических разработок.

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

  1. C и C++. Язык программирования С - это компилируемый статически типизированный язык программирования общего назначения, который был разработан в 1969—1973 годах сотрудником Bell Labs Деннисом Ритчи как развитие языка Би. Язык программирования С оказал значительное воздействие на развитие индустрии программного обеспечения, а его синтаксис стал основой для таких языков программирования, как C++, C#, Java и D. Язык программирования С++ является языком общего назначения, который сочетает в себе свойства как низкоуровневых, так и высокоуровневых языков и поддерживает различные парадигмы программирования. В языке программирования С++, в отличие от языка С, разработчики уделили особое внимание поддержке обобщённого и объектно-ориентированного программирования. В названии «C++», ++ - это инкремент переменной. Язык программирования С++ обширно используется для разработки программного обеспечения, поскольку он является очень популярным языком программирования. Области применения Языка программирования С++: создание разнообразных прикладных программ, операционных систем, высокопроизводительных серверов, приложений для встраиваемых систем, драйверов устройств, а также развлекательных приложений.[10]
  2. Ада. Данный язык программирования был назван в часть Августы Ады Байрон, графини Лавлейс и дочери английского поэта лорда Байрона, она являлась ассистентом, коллегой и сторонницей Чарльза Беббиджа, математика и изобретателя вычислительной машины, названной аналитической машиной. В 1830 году, при помощи Ч. Беббиджа ей была написана практически законченная программа на аналитической машине для вычисления чисел Бернулли, и потому графиню можно назвать первым в мире программистом на вычислительной машине.

Язык Ада – это современный язык программирования, который содержит такие возможности паскалеподобных языков, как определение типов, общие управляющие структуры и подпрограммы. Язык АДА поддерживает логическую модульность, для которой данные, типы и подпрограммы – все могут быть пакетами. Язык Ада поддерживает программирование в реальном масштабе времени за счет механизмов распараллеливания и обработки исключений. Разработка программ на языке Ада обходится на 60% дешевле аналогичных программных проектов, которые реализуются на Си. Вместе с тем, программа на языке Ада обладает меньшим количеством дефектов в 9 раз меньше, чем программа на Си. Что является безусловным плюсом так это то, что трудоемкость изучения языка Ада не выше трудоемкости изучения Си. Программы на Аде более надежны, чем программы на Си.

  1. BASIC (Beginner's All-purpose Symbolic Instruction Code). Язык программирования BASIC – это семейство высокоуровневых языков программирования, который был разработан профессорами Дартмутского колледжа Томасом Курцем и Джоном Кемени в 1963 году. Изначально BASIC предназначался для обучения программированию, он получил широкое распространение в виде разнообразных диалектов, прежде всего как язык для домашних компьютеров. Вторая жизнь BASIC началась в связи с появлением Visual Basic от Microsoft. На протяжении долго времени BASIC подвергается жёсткой критике за то, что его простота и бесструктурность поощряют порочные методики и привычки программирования, которые могут быть уместны при создании малых программ, но способны привести к краху крупных проектов.
  2. Pascal.[11] Данный язык является языком программирования высокого уровня, впрочем, он очень устарел морально, так как мир не стоит на месте, и иные языки, такие как: C# и Java обладает большей востребовательностью и эффективностью написания кода в отличие от Паскаля. Данный язык не столько для применения, как для обучения в учебных заведениях, и потому что он прост для понимания, и нанести вред системе от некорректного кода пользователя не может. Особенностями Pascal являются: - строгая типизация; - наличие средств структурного (процедурного) программирования.[12]
  3. Delphi. Язык программирования Delphi – это язык программирования, на основе языка Pascal является объектно-ориентированным. Язык программирования Delphi пользуется популярностью среди программистов, поскольку предоставляет значительные возможности в реализации тех или иных программ, при относительной своей простоте. Delphi по своей сути является комбинацией нескольких важных технологий:

- Высокопроизводительный компилятор в машинный код;

- Объектно-ориентированная модель компонент;

- Визуальное построение приложений из программных прототипов;

- Масштабируемые средства для построения баз данных.[13]

Язык программирования Delphi предоставляет возможность создавать как самые простые приложений, на разработку которых требуется 2-3 часа, так и серьезные корпоративные проекты, которые предназначены для работы десятков и сотен пользователей. И потому можно с уверенностью сказать, что Delphi может быть использовано не только программистами-профессионалами, но и учителями и врачами, преподавателями ВУЗов, и бизнесменами, вообщем всеми теми, кто используют компьютер с чисто прикладной целью, иными словами для того, чтобы быстро решить какие-то свои задачи, не привлекая для этого программистов со стороны.

  1. Лисп. Язык программирования Lisp - это целое множество языков программирования, код программ в которых, также как и данные, представляются системами линейных списков символов. Язык программирования Lisp считается вторым в истории высокоуровневым языком программирования после Фортрана, а так же он применяется до сих пор. Но его так же не обошли стороной изменения, на сегодняшний день наиболее широкую известность приобрели диалекты «Common Lisp» и «Scheme». Изначально Язык программирования Lisp применялся для символьной обработки данных, а также в областях, которые связаны с процессами принятия решений, а данный же момент, пожалуй, самый популярный на сегодня диалект можно назвать универсальным языком программирования. Он активно применяется для решения самых разнообразных задач.
  2. Пролог. Язык программирования Пролог – это язык и система логического программирования, который основан на языке предикатов математической логики дизъюнктов Хорна, представляющей собой подмножество логики предикатов первого порядка. В основные понятия языка Пролог входят факты, правила логического вывода и запросы, которые предоставляют возможность описывать базы знаний, процедуры логического вывода и принятия решений. Факты в языке Пролог описываются логическими предикатами с конкретными значениями. По своей природе язык Пролог - уникален, так как это единственный язык, представляющий парадигму декларативного программирования. Так же он обладает сотнями различных имплементаций, но они все равно называются Prolog, добавляя лишь префиксы и суффиксы к названию. Пролог - это живой язык, в котором не происходит никаких существенных изменений более 20 лет.[14]
  3. ЛОГО. Язык программирования Лого - это язык программирования, который был разработан в 1967 году в Лаборатории Искусственного Интеллекта Массачусетского технологического института, профессором Сеймуром Папертом, специально для развития мышления, творческих и исследовательских способностей детей и подростков.

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

  1. Java. Язык программирования Java является объектно-ориентированным языком программирования, который был разработан компанией Sun Microsystems с 1991 года и официально выпущенный 23 мая 1995 года. Программирование на Java обладает тем преимуществом, что код, написанный на данном языке программирования, переводится с помощью соответствующей программы-транслятора в так называемый байт-код, а он, в свою очередь, — в машинный код с помощью виртуальной машины Java. Поэтому написанная на Java программа выполняема на любом компьютере с любой системой, лишь бы на нем была установлена виртуальная машина Java. Таким образом, и обеспечивается одно из главных преимуществ языка Java — переносимость создаваемых на нем программ на компьютеры разных типов.
  2. Алгол. Язык программирования Алгол – это название семейства императивных языков программирования, которые применяются при составлении программ для решения научно-технических задач на ЭВМ. Алгол был первым языком программирования, использующим пары begin end для выделения блоков выражений. Язык программирования Алгол прошел долгий путь, и необходимо заметить, что, не смотря на повсеместное использование языка в европейских странах, в США он не нашел широкого распространения, что прежде всего, объясняется коммерческими соображениями: пользователи, затратив значительные средства на ФОРТРАНовское программное обеспечение, стали противниками каких-либо изменений в своей программистской практике.

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

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

2.1. Процедурно-ориентированные языки программирования

Слово процедура является здесь ключевым элементом. Оно означает набор процедур, который представляет собой набор подпрограмм или набор функций. Мы все знаем о функциях в языке C. C это процедурно-ориентированный язык. В Процедурно-ориентированных языках основное внимание уделяется функциям или подпрограммам. Функции содержат набор команд, выполняющих определенную задачу. Функции в программе вызываются повторно для выполнения определенных задач. Например, программа может включать в себя сбор данных от пользователя (чтение), выполнения какого-то рода расчетов, собранных данных (вычисление) и отображения результатов по запросу пользователя (вывод). Все эти три задачи, чтение, вычисление и вывод результатов, могут быть написаны в программе с помощью трех различных функций, выполняющих три различные задачи.[15] Структура методики Процедурно-ориентированного языка программирования представлен на рисунке 1.

методика процедурно-ориентированного программирования

Рис. 1. Структура методики процедурно-ориентированного языка программирования

Проблема при применении процедурно-ориентированного языка программирования заключается в обработке данных. В процедурно-ориентированном языке программирования данным не придается никакого значения. Под данными мы понимаем информацию, полученную от пользователя, новые результаты, полученные после вычислений, и т.д. Если вы знакомы с программированием на C, то можете вспомнить классы памяти (storage classes) этого языка. В C элемент данных (переменная) должен быть объявлен как GLOBAL для того, чтобы он мог быть доступен двум или более функциям программы. Что происходит, когда 2 или более функций работают с одним и тем же элементом данных? Если в программе насчитывается 10 функций, то все эти 10 функций могут получить доступ к глобальной переменной. 

Вполне возможно, что одна функция может случайно изменить значение этой глобальной переменной. И если она является ключевым элементом программы, любые такие случайные манипуляции повлияют на всю программу. Тогда будет слишком трудно отлаживать и выявлять функцию, вызывающую проблемы, особенно если программа очень большая.[16]

Одной из наиболее важных особенностей языка C являются структуры. Тот, кто знаком с этим языком, вспомнит, что структуры в C объявляются с помощью ключевого слова struct. Структуры позволяют упаковать вместе разные типы данных в единое целое. Программист может упаковать целочисленные данные, числа с плавающей точкой (float), массивы и прочие виды данных в единый объект с помощью структуры. Способ программирования с помощью структур был впервые введен в языке C, и это послужило основной причиной столь широкой популярности данного языка. И какова же истинная причина этого? Структура достаточно хорошо моделирует требования реального мира в компьютерной программе. Проблемой, связанной со структурами, было то, что она работала только с данными. Структура не позволяет упаковать вместе связанные функции наряду с данными. Все функции, манипулирующие с элементами данных внутри структуры должны быть написаны отдельно внутри программы. По этой причине программа на C имеет большую зависимость от функций.[17]

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

Среди наиболее популярных процедурно- ориентированных языков можно выделить:

1) язык Фортран (Fortran), название которого переводится как Formulae Translation — «преобразование формул»;

2) язык Бейсик (Basic), чье название расшифровывается как «Beginner's All-purpose Symbolic Instruction Code» (BASIC) — «многоцелевой символический обучающий код для начинающих», был создан в 1964 г. как язык для обучения программированию. Бейсик по своим возможностям не уступает Фортрану, а по некоторым параметрам даже превосходит его;

3) язык Си (С), созданный в 1970-е гг. сотрудником лаборатории Bell Labs Д. Ритчи. Си разрабатывался как специальный язык системного программирования для написания операционной системы UNIX (первоначально реализованной на ассемблере);

4) язык Паскаль (Pascal), названный в честь французского ученого Б. Паскаля, был разработан в 1968—1971 гг. Н. Виртом. Изначально Паскаль создавался для обучения программированию, однако в дальнейшем стал широко использоваться для разработки программных средств профессиональными программистами.

Данные языки программирования были подробно рассмотрены в пункте 1.3 курсовой работы.

2.2. Проблемно-ориентированные языки программирования

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

1. Язык ЛИСП (Lisp — List Information SymbolProcessing), который был изобретен в 1962 г.Дж. Маккарти. Благодаря ЛИСПу возникла совершенно новая для программистов область деятельности — «искусственный интеллект». В настоящее время ЛИСП применяется в экспертных системах, системах аналитических вычислений и т.п.;

2. Язык Пролог (Prolog — Programming in Logic),возникший как язык логического программирования для систем искусственного интеллекта. В основе Пролога лежат средства логического вывода, решающие запросы с использованием заданной базы фактов и правил, к которым обращаются как к утверждениям. Концепция объектно-ориентированного программирования основывается на том, что в основе управления процессом реализации программы лежит передача сообщений объектам.[18]

Исходя из этого можно определить следующие характерные свойства объектно-ориентированных языков программирования:

1. Свойство абстракции, т.е. наличия формального представления о качествах или свойствах предмета путем мысленного удаления некоторых частностей или материальных объектов;

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

3. Свойство наследования, т.е. наличия процесса, с помощью которого один объект приобретает свойства другого, т.е. свойства иерархической классификации;

4. Свойство полиморфизма, т.е. наличия возможности использовать один и тот же интерфейс для общего класса действий.[19]

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

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

С расширением сферы применения ЭВМ потребность в программах резко возросла. Возникла необходимость в автоматизации процесса программирования. Появились более удобные и менее трудоемкие проблемно-ориентированные языки программирования и средства перевода (трансляции) утверждений этих языков в язык машины.

2.3 Объектно-ориентированные языки программирования

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

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

Базовая концепция ООП основана на понятии, схожем с понятием структуры в ПОП и называемым классом. Класс представляет собой важную особенность ООП, он позволяет упаковать вместе различные типы данных наряду с различными функциями, манипулирующими элементами данных этого класса. Элементы данных внутри класса могут быть объявлены как локальные (private) или глобальные (public). Для того, чтобы спрятать данные от внешнего мира, программист должен объявить их как private. В общем, класс действительно схож со структурой в языке C. Как и любая структура, он объединяет в единое целое различные объекты. Основное отличие между классом и структурой кроется в функциях. Структуры не позволяют объединять в себе данные и функции (структуры работают только с данными), тогда как классы позволяют упаковывать данные вместе со связанными с ними функциями.

Кроме того, имеются еще различия, вроде сокрытия данных с помощью private/public. Структуры не облегчают сокрытие данных. В структуре к ее элементам получают доступ с помощью так называемых структурных переменных. В ООП используют другое понятие для доступа к данным и функциям внутри класса — объект. Данные и функции внутри класса называются членами или элементами класса. К элементу класса может быть получен доступ из внешнего мира (вне класса) только с помощью объекта класса.

Возможность сокрытия данных называется инкапсуляцией данных. Таким образом, один из главных недостатков ПОП решается в ООП. Объектно-ориентированный язык программирования тесно связывает данные с определенным классом и его объектами. Здесь нет необходимости в глобальных типах данных, как в ПОП, и, следовательно, данные не могут свободно «течь» по всей программе. Это гарантирует то, что не произойдет какой-либо случайной модификации важных данных.

Еще одной особенностью, привнесенной в ООП, является возможность повторного использования кода. Это просто означает то, что кусок кода, который был написан ранее, может быть использован в будущем. Это стало возможным благодаря особенности классов под названием наследование. Благодаря наследованию один класс может приобрести свойства другого класса. Это можно объяснить с помощью простого примера. Возьмем систему школьного управления. Изначально руководство решило разработать программу, сфокусированную только на учеников (без учета данных об учителях). Программист превосходно справился со своей работой, и в процессе программирования он объявил класс для сбора персональных данных, таких как имя, возраст, пол, адрес и т.д. Через год руководство школы решило включить в список данные об учителях. Теперь программист способен добавить эти данные за очень короткое время, поскольку он может использовать многие части кода, которые он написал ранее, благодаря наследованию. Класс персональных данных имеет общий характер (возраст, пол и пр. те же самые для человека вне зависимости от того, учитель он или ученик). Программист может наследовать данный класс новому классу, а также расширять этот новыми записями, например, записью о квалификации учителя. У ООП имеется еще много возможностей, вроде полиморфизма (перегрузки операторов и функций), динамического связывания и т.д. Обо всем этом можно почитать в соответствующей литературе.[21]

Ниже представим неполный список объектно-ориентированных языков программирования: C#; C++; Java; Delphi; Eiffel; Simula; Objective-C; Swift; Object Pascal; Visual DataFlex; Perl; PowerBuilder; Python; Scala; ActionScript (3.0); Dylan; JavaScript; JScript .NET; Ruby; Smalltalk; Ada; Xbase++; X++; Vala; PHP; Cyclone.

3 Составление программы на примере языка программирования C++

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

В качестве задания мной была выбрана задача коммивояжера. Задача коммивояжёра (англ. Travelling salesman problem, сокращённо TSP) — одна из самых известных задач комбинаторной оптимизации, заключающаяся в отыскании самого выгодного маршрута, проходящего через указанные города хотя бы по одному разу с последующим возвратом в исходный город. В условиях задачи указываются критерий выгодности маршрута (кратчайший, самый дешёвый, совокупный критерий и тому подобное) и соответствующие матрицы расстояний, стоимости и тому подобного. Как правило, указывается, что маршрут должен проходить через каждый город только один раз — в таком случае выбор осуществляется среди гамильтоновых циклов.

В качестве языков программирование был выбран С++, так как в нем:

  1. Поддерживаются различные стили и технологии программирования, включая традиционное директивное программирование, ООП, обобщённое программирование, метапрограммирование (шаблоны, макросы).
  2. Предсказуемое выполнение программ является важным достоинством для построения систем реального времени.
  3. Автоматический вызов деструкторов объектов при их уничтожении, причём в порядке, обратном вызову конструкторов.
  4. Пользовательские функции-операторы позволяют кратко и ёмко записывать выражения над пользовательскими типами в естественной алгебраической форме.
  5. Язык поддерживает понятия физической (const) и логической (mutable) константности.
  6. Используя шаблоны, возможно создавать обобщённые контейнеры и алгоритмы для разных типов данных, а также специализировать и вычислять на этапе компиляции.
  7. Возможность имитации расширения языка для поддержки парадигм, которые не поддерживаются компиляторами напрямую.
  8. Возможность создания встроенных предметно-ориентированных языков программирования.
  9. Используя шаблоны и множественное наследование можно имитировать классы-примеси и комбинаторную параметризацию библиотек.
  10. Кроссплатформенность: стандарт языка накладывает минимальные требования на ЭВМ для запуска скомпилированных программ.
  11. Эффективность. Язык спроектирован так, чтобы дать программисту максимальный контроль над всеми аспектами структуры и порядка исполнения программы.
  12. Имеется возможность работы на низком уровне с памятью, адресами.

3.2 Пример решения задачи коммивояжера методом Прима на C++

Алгоритм исходника решения задачи коммивояжера методом Прима на C++:

Пусть n - это количество вершин графа. Тогда в цикле n-1 выбирается самое короткое еще не выбранное ребро при условии, что оно не образует цикла с уже выбранным. Для проверки того, что новое ребро не образует цикла с уже выбранными, каждую вершину i окрашивают в отличный от других цвет i. При выборе очередного ребра, скажем (i, j), где i и j имеют разные цвета, вершина j и все, окрашенные в ее цвет (т. е. ранее с ней соединенные) перекрашиваются в цвет i.

Таким образом после выбора n-1 ребер все вершины получают один цвет.  Алгоритм Прима: 

1. (ввод). Ввести матрицу расстояний D={dij}, i,j=1,…,n. 

2. (инициализация). Приписать разные цвета всем вершинам: coli:=i; длина дерева L:=0. 

3. (общий шаг). В цикле по k:=1 to n-1 do найти ребро минимальной длины между вершинами разного цвета: пусть это ребро (i,j).

Запомнить результат: res1[k]:=i; res2[k]:=j;

Перекрасить вершины: I1:=col[i]; j1:=col[j].

В цикле по m:=1 to n do If col[m]=j1 then col[m]:=i1;

Нарастить длину дерева: L:=L+d[i,j].

Конец цикла по k.

4.(вывод). Вывести res1, res2.

Код на C++

  1. #include <stdlib.h>
  2. #include <time.h>
  3. #include <stdio.h>
  4. int wpchk(int w, int *wpts)
  5. {
  6. int i=0;
  7. int flg=0;
  8. while(wpts[i]!=-1)
  9. {
  10. if(wpts[i]==w){flg=1;}
  11. i++;
  12. }
  13. if (flg==0) {return 0;} else return 1;
  14. }
  15. void main()
  16. {
  17. srand( (unsigned)time( NULL ) );
  18. //int prices[10][10];
  19. int waypoint[11]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1};
  20. int way[11]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
  21. int start=-1;
  22. int end=-1;
  23. int min;
  24. int imin;
  25. */// 0 1 2 3 4 5 6 7 8 9
  26. int prices[10][10]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0
  27. 0, 0, 2, 9, 8, 0, 0, 0, 0, 0, //1
  28. 0, 2, 0, 3, 0, 20,0, 0, 0, 0, //2
  29. 0, 9, 3, 0, 7, 4, 0, 0, 0, 0, //3
  30. 0, 8, 0, 7, 0, 11,0, 0, 0, 0, //4
  31. 0, 0, 20,4, 11,0, 0, 0, 0, 0, //5
  32. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //6
  33. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //7
  34. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //8
  35. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};//9
  36. printf("Enter № of start location:");
  37. scanf("%i",&start);
  38. printf("Enter № of finish location:");
  39. scanf("%i",&end);
  40. waypoint[0]=start;
  41. int n=0;
  42. int w;
  43. while(waypoint[n]!=end)
  44. {
  45. min=0;
  46. w=waypoint[n];
  47. for(int i=0;i<10;i++)
  48. {
  49. if(((min==0)||((prices[w][i]<min)&&(prices[w][i]>0)))&&wpchk(i,waypoint)==0) {min=prices[w][i];imin=i;}
  50. }
  51. n++;
  52. waypoint[n]=imin;
  53. }
  54. printf("\nThe way is:\n");
  55. int i=0;
  56. while(waypoint[i]!=-1)
  57. {
  58. printf("%i ",waypoint[i]);
  59. i++;
  60. }
  61. getchar();
  62. getchar();
  63. }

3.3 Решение задачи при помощи алгоритма Дейкстры на C++

Задача: Определить длину (Q) кратчайшего маршрута (L) коммивояжера.

Расстояния (Qij) между шестью городами представлены в таблице 1.

Таблица 1 – Условие задачи

Город

1

2

3

4

5

6

1

6

4

12

14

22

2

6

3

8

7

20

3

4

3

10

11

18

4

12

8

10

9

16

5

14

7

11

9

10

6

22

20

18

16

10

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

Построим математическую модель:

n - число городов.

Xi j , i, j=1..N - матрица затрат, где Ci j - затраты на переход из i-го города в j-й.

Xi j - матрица переходов с компонентами:

Xi j = -1, если коммивояжер совершает переход из i-го города в j-й,

Xi j = 0, если не совершает перехода,

где i, j = 1..N и i≠j.

Критерий:

, (1)

где Сij – матрица стоимости переходов,

Xij – матрица переходов, где xij=0, если переход совершен и xij=1 в противном случае

Ограничения:

, i = 1..N (2)

, j = 1..N (3)

Ui - Uj + N ⋅ Xi j ≤ N-1, i, j = 1..N, i ≠ j. (4)

, k= 1..N,t=k-1 (5)

Условие (2) означает, что коммивояжер из каждого города выезжает только один раз; условие (3) - въезжает в каждый город только один раз; условие (4) - обеспечивает замкнутость маршрута, содержащего N городов, и не содержащего замкнутых внутренних петель; условие (5) – принцип треугольника: ранее выбранный путь оказался длиннее предыдущего.

Разработка алгоритма. Задача коммивояжера является одной из знаменитых задач теории комбинаторики. Она была поставлена в 1934 году, и об неё, как об Великую теорему Ферма обламывали зубы лучшие математики. В своей области (оптимизации дискретных задач) задача коммивояжера служит своеобразным полигоном, на котором испытываются всё новые методы. В данном курсовом проекте реализуется задача коммивояжера методом алгоритма Дейкстры.

В 1959 г. Голландский математик Дейкстра предложил алгоритм, который решает задачу коммивояжёра для любой матрицы исходный данных: симметричной, несимметричный и смешанной (отсутствуют некоторые ребра графа).

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

  1. Длина найденного ребра графа должна быть меньше или равна симметричному ребру графа. В противном случае выбирается симметричное ребро
  2. треугольника: ранее выбранный путь оказался длиннее предыдущего.

Представим разработанный код.

Код программы «Решение задачи коммивояжера с помощью алгоритма Дейкстры».

//

#include <vcl.h>

#include <tchar.h>

#include <stdio.h>

#include <conio.h>

//

void main()

{

int c2,c3,i,k,j,n,e,q,v,m,z,x,min,a,min2,h=0,c=0;

printf("Koli4estvo gorodov : ");scanf("%i",&n); //ввод количество городов

int *t=new int[n];

int *t2=new int[n];

int **kg=new int*[n];

for(i=0;i<n;i++)

kg[i]=new int[n];

int **kg1=new int*[n];

for(i=0;i<n;i++)

kg1[i]=new int[n];

for(i=0;i<n;i++)

for(j=0;j<n;j++)

kg[i][j]=0;

for(i=0;i<n;i++) //заполнение расстояние между городами

for(j=i+1;j<n;j++)

{

printf("vedite racto9nnie %i do %i: ",i+1,j+1);

scanf("%i",&kg[i][j]);

kg1[i][j]=kg[i][j];

}

clrscr();

printf(" ");

for(i=0;i<n;i++)

printf("%3i",i+1);

printf("\n\n\n\n");

for(i=0;i<n;i++) // заполнение массива городов симметрично

{

printf("%2i ",i+1);

for(j=0;j<n;j++)

{

kg[j][i]=kg[i][j];

kg1[j][i]=kg[i][j];

printf("%3i",kg[i][j]);

}

printf("\n\n");

}

printf("Vvedite na4al'nuy to4ky : ");scanf("%i",&k); //ввод с какого города гачгётся путь

k--;

e=k;x=k;

q=1;c2=0;

v=0;z=2;

t[0]=k;

do //поиск минимального пути между городами

{

min=99999;

for(j=x+1;j<n;j++)

if(min>=kg[x][j] && kg1[x][j]!=-1)

{

min=kg[x][j];

m=j;

}

for(j=0;j<x;j++)

if(min>kg[j][x] && kg1[j][x]!=-1)

{

min=kg[j][x];

m=j;

}

t2[q]=x;

t[q]=m;

for(j=x+1;j<n;j++)

kg1[x][j]=-1;

for(j=0;j<x;j++)

kg1[j][x]=-1;

x=m;

z=0;

for(i=0;i<n && z!=1;i++)

for(j=i+1;j<n;j++)

if(kg1[i][j]==-1)

v=1;

else

{v=3;z=1;break;}

q++;

}

while(v!=1);

t2[q]=x;t[q]=k;q++;v=q;z=0;q=0;c=0;c2=0;e=0;

do // проверка условий алгоритма Дейкстры

{

if(q!=0)

{ c=c+kg[t2[e]][t[q]];

c2=c-kg[t2[e-1]][t[q-1]]-kg[t2[e]][t[q]]+kg[t[q]][t[q-1]]+kg[t2[e-1]][t[q]];}

if(c>c2 && q!=0 && z<q)

{

z=t2[e];

t2[e]=t2[e-1];

t2[e-1]=z;

z=t[q-1];

t[q-1]=t[q-2];

t[q-2]=z;

z=q;

q=-1;e=-1;c=0;c2=0;

}

q++;

e++;

}

while(v!=q);

printf("\n\nput : %i",t[0]+1); //вывод пути

for(i=1;i<q;i++)

printf("-%i",t[i]+1);

printf("\n\n");

printf("dlina puti : %i",c);//вывод длинны пути

getch();

}

Описание программы.

Для начала вычислений необходимо ввести количество городов.

На рисунке 2 показан этап выбора количества городов.

программа задача коммивояжер тестирование

1

Рисунок 2 – Выбор количества городов

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

2

Рисунок 3 – Консоль программы после расчета данных

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

Определить длину (Q) кратчайшего маршрута (L) коммивояжера. Расстояния (QIJ) между шестью городами представлены в таблице 2.

Пройдем алгоритм вручную.

Начинаем движение с первого города в нашей таблице (Рисунок 4).

3

Рисунок 4 – Первый шаг расчета

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

3

Рисунок 5 – Второй шаг расчета

Таким образом, проделываем следующие шаги до последнего города.

Условия примера представляют собой симметричную задачу.

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

После успешного тестирования программы, в качестве исходных данных использовались параметры, заданные в курсовом проектировании. Результаты расчета приведены в следующем рисунке 6:

2

Рисунок 6 – Основная форма программы после вывода конечных данных

Ответ: длина маршрута равна 52, порядок обхода городов:

1→3→2→5→6→4→1

При выполнение ручных расчётов результаты получились положительными.

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

  1. Построена математическая модель;
  2. Описан алгоритм задачи;
  3. Разработан программный код на языке программирования C++;
  4. Решена поставленная задача с помощью разработанной программы;
  5. Проанализированы результаты;

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

Заключение

Одной из самых революционных идей, которая привела к созданию автоматических цифровых вычислительных машин, мысль о предварительной записи порядка действий машины – программе, предложенная в 19 веке 20 годах Ч.Бэббиджем, именно с этого момента началась история языков программирования. Языки программирования - это формальные искусственные, и, как и естественные языки, им присущ алфавит, словарный запас, грамматика и синтаксис, а также семантика. Изобретение языка программирования дало возможность человечеству общаться с машиной, понимать её, наподобие того как понимает китаец немного знакомый с русским языком древнюю азбуку Кириллицы. Иными словами, человек на данный момент развития науки программирования пока что с ЭВМ на ВЫ, и это совершенно не сарказм, достаточно только взглянуть на то как развилась наука программирования с того времени, как появились языки программирования, а ведь язык программирования высшего уровня, судя по всему ещё младенец. Единственным способом изучения нового языка программирования написание на нем программ.

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

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

Задача: язык программирования отличается от естественных языков тем, что предназначен для передачи команд и данных от человека к компьютеру, в то время как естественные языки используются для общения людей между собой. Можно обобщить определение «языков программирования» — это способ передачи команд, приказов, чёткого руководства к действию; тогда как человеческие языки служат также для обмена информацией.

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

Позволю себе выделить некоторую общую тенденцию в развитии языков программирования. Языки развиваются в сторону все большей и большей абстракции, что сопровождается эффективности. Отсюда возникает вопрос: а стоит ли этого абстракция? Скажу с уверенностью, что стоит, поскольку повышение уровня абстракции влечет за собой повышение уровня надежности программирования. С низкой эффективностью можно бороться путем создания более быстрых компьютеров. Если требования к памяти слишком высоки, можно увеличить ее объем. Это, конечно, требует времени и средств, но это решаемо. А вот с ошибками в программах можно бороться только одним способом: их надо исправлять, а еще лучше — не совершать, либо максимально затруднить их совершение. И именно на это направлены все исследования в области языков программирования, несмотря на то что, с потерей эффективности придется смириться.

Целью моего курсового проекта была попытка дать полное представление обо всем многообразии существующих языков программирования. Среди программистов зачастую бытует мнение о «всеобщей применимости» того или иного языка, но это мнение возникает по нескольким причинам: недостаток информации, привычка, инертность мышления. Мной была предпринята попытка слегка компенсировать первый фактор, а по поводу остальных можно сказать, что настоящий профессионал должен постоянно стремиться повышать свою профессиональную квалификацию. А для этого нужно не бояться экспериментировать.

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

1) Построена математическая модель;

2) Описан алгоритм задачи;

3) Разработан программный код на языке программирования C++;

4) Решена поставленная задача с помощью разработанной программы;

5) Проанализированы результаты;

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

Библиография

  1. Акулич, И.Л. Математическое программирование в примерах и задачах: Учебное пособие / И.Л. Акулич. - М.: Лань, 2011. - 352 c.
  2. Балдин, К.В. Математическое программирование: Учебник / К.В. Балдин, Н.А. Брызгалов, А.В. Рукосуев. - М.: Дашков и К, 2013. - 220 c.
  3. Вайсфельд Мэтт. Объектно-ориентированное мышление. // Вайсфельд Мэтт. - М.: Питер, 2014, 304 с.
  4. Грошев А.С. Информатика. // Грошев А.С. - М.: АГТУ. 2010, 470 с.
  5. Зрюмова А.Г., Зрюмов Е.А., Пронин С.П. Информатика. // Зрюмова А.Г. - М.: АлтГТУ. 2011, 177 с.
  6. Карпов Ю.Г. Теория и технология программирования. Основы построения трансляторов. // Карпов Ю.Г. - М.: БХВ-Петербург. 2005, 270с.
  7. Меняев М.Ф. Информатика и основы программирования. 3-е изд., стер. // Меняев М.Ф. - М.: Омега-Л. 2007, 458 с.
  8. Меженный О.А. Turbo Pascal. Самоучитель. // Меженный О.А. - М.: Вильямс, Диалектика. 2008, 336с.
  9. Орлова И.В. Экономико-математическое моделирование: Практическое пособие по решению задач. // Орлова И.В. - М.: Вузовский учебник, 2004. - 144 с.
  10. Таганов Л.С., Пимонов А.Г. Информатика. // Таганов Л.С., - М.: КузбГТУ. 2010, 330 с.
  11. Цветкова М.С., Великович Л.С. Информатика и ИКТ. // Цветкова М.С., 3-е изд., стер. - М.: Академия. 2012, 352 с.
  12. Цветкова А.В. Информатика и информационные технологии. Шпаргалки. // Цветкова М.С., - М.: ЭКСМО. 2008, 32 с.
  13. Хубаева Г.Н. Информатика. 3-е изд., перераб. и доп. // Хубаева Г.Н. - М.: Феникс. 2010, 288 с.

ПРИЛОЖЕНИЯ

Приложение А

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

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

Организация данных

Операторы:

  1. Присваивания
  2. Ветвления
  3. Цикла и так далее.

Операции и выражения

Типы и структура данных

Обработка данных

Ввод-вывод данных, работа с файлами

Алфавит, лексемы, синтаксис, оформление программы

Организация действий над данными

Элементы языка

Организация и использование подпрограмм

Приложение Б

Основные типы данных в Паскале

Простые типы

Указатели

Сложные типы

Файлы

Перечисления

Интервалы

Символьный тип

Логические числа

Вещественные числа

Множества

Записи

Строки

Массивы

Целые числа

  1. Приложение А

  2. Грошев А.С. Информатика. // Грошев А.С. - М.: АГТУ. 2010, 470 с.

  3. Грошев А.С. Информатика. // Грошев А.С. - М.: АГТУ. 2010, 470 с.

  4. Акулич, И.Л. Математическое программирование в примерах и задачах: Учебное пособие / И.Л. Акулич. - М.: Лань, 2011. - 352 c.

  5. Грошев А.С. Информатика. // Грошев А.С. - М.: АГТУ. 2010, 470 с.

  6. Орлова И.В. Экономико-математическое моделирование: Практическое пособие по решению задач. // Орлова И.В. - М.: Вузовский учебник, 2004. - 144 с.

  7. Цветкова М.С., Великович Л.С. Информатика и ИКТ. // Цветкова М.С., 3-е изд., стер. - М.: Академия. 2012, 352 с.

  8. Акулич, И.Л. Математическое программирование в примерах и задачах: Учебное пособие / И.Л. Акулич. - М.: Лань, 2011. - 352 c.

  9. Меняев М.Ф. Информатика и основы программирования. 3-е изд., стер. // Меняев М.Ф. - М.: Омега-Л. 2007, 458 с.

  10. Акулич, И.Л. Математическое программирование в примерах и задачах: Учебное пособие / И.Л. Акулич. - М.: Лань, 2011. - 352 c.

  11. Приложение Б

  12. Меженный О.А. Turbo Pascal. Самоучитель. // Меженный О.А. - М.: Вильямс, Диалектика. 2008, 336с.

  13. Балдин, К.В. Математическое программирование: Учебник / К.В. Балдин, Н.А. Брызгалов, А.В. Рукосуев. - М.: Дашков и К, 2013. - 220 c.

  14. Карпов Ю.Г. Теория и технология программирования. Основы построения трансляторов. // Карпов Ю.Г. - М.: БХВ-Петербург. 2005, 270с.

  15. Балдин, К.В. Математическое программирование: Учебник / К.В. Балдин, Н.А. Брызгалов, А.В. Рукосуев. - М.: Дашков и К, 2013. - 220 c.

  16. Карпов Ю.Г. Теория и технология программирования. Основы построения трансляторов. // Карпов Ю.Г. - М.: БХВ-Петербург. 2005, 270с.

  17. Вайсфельд Мэтт. Объектно-ориентированное мышление. // Вайсфельд Мэтт. - М.: Питер, 2014, 304 с.

  18. Зрюмова А.Г., Зрюмов Е.А., Пронин С.П. Информатика. // Зрюмова А.Г. - М.: АлтГТУ. 2011, 177 с.

  19. Вайсфельд Мэтт. Объектно-ориентированное мышление. // Вайсфельд Мэтт. - М.: Питер, 2014, 304 с.

  20. Таганов Л.С., Пимонов А.Г. Информатика. // Таганов Л.С., - М.: КузбГТУ. 2010, 330 с.

  21. Карпов Ю.Г. Теория и технология программирования. Основы построения трансляторов. // Карпов Ю.Г. - М.: БХВ-Петербург. 2005, 270с.