СОДЕРЖАНИЕ
ВВЕДЕНИЕ
1. АНАЛИТИЧЕСКИЙ ОБЗОР ЯЗЫКОВ И ПОДХОДОВ ПРОГРАММИРОВАНИЯ
.1 Объектно-ориентированное программирование
.2 Процедурное программирование
.3 Функциональное программирование
.4 Сравнительный анализ
. ПРОГРАММНАЯ РЕАЛИЗАЦИЯ ЗАДАЧИ
.2 Исходные данные и результаты
.3 Структура программного комплекса
.4 Алгоритмы решения задачи
. ВЕРИФИКАЦИЯ И ПРОВЕДЕНИЕ ВЫЧИСЛИТЕЛЬНОГО ЭКСПЕРИМЕНТА
ЗАКЛЮЧЕНИЕ
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
ПРИЛОЖЕНИЕ
ВВЕДЕНИЕ
Конец ХХ и начало ХХI века являются переходом развитых стран от индустриального общества к информационному. Это выражается в интенсивном совершенствовании средств вычислительной техники и техники связи, появление новых и в дальнейшем развитие существующих информационных технологий, а также в реализации прикладных информационных систем. Достижения информатики заняли достойное место в организационном управлении, промышленности, проведении научных исследований и автоматизированном проектировании. Информатизация охватила и социальную сферу: образование, науку, культуру, здравоохранение.
Трудно назвать другую отрасль человеческой деятельности, которая развивалась бы столь стремительно и порождала бы такое разнообразие проблем, как информатизация и компьютеризация общества.
Главная особенность нашего времени, несомненно, является постоянный рост темпов производства информации. Потоки информации, циркулирующие в мире, которые нас окружает, огромны. В связи с тем, что они имеют тенденцию к увеличению, в любой организации возникает необходимость применения автоматизированной обработки данных, которая обеспечила бы наиболее эффективную работу. Большинство организаций предпочитают компьютеризированные способы, позволяющие эффективно хранить, структурировать и систематизировать большие объемы данных. Именно по этим причинам разработка программного обеспечения для управления справочниками весьма актуальна.
Целью курсового проекта является разработка программного обеспечения для управления справочником «Спортсмены».
Задачами курсового проекта являются: выбор языка программирования для создания требуемого приложения, определение алгоритма работы приложения, методов получения данных и работы с ними, а также пользовательского интерфейса.
В основе того или иного языка программирования лежит некоторая руководящая идея, оказывающая существенное влияние на стиль соответствующих программ.
Исторически первой была идея процедурного структурирования программ, в соответствии с которой программист должен решить, какие именно процедуры он будет использовать в своей программе, а затем выбрать наилучший алгоритм для реализации этих процедур. Появление этой идеи было следствием недостаточной изученности алгоритмической стороны вычислительных процессов, столь характерной для ранних программных разработок (сороковые-пятидесятые годы). Типичным примером процедурно-ориентированного языка является Фортран — первый и все еще один из наиболее популярных языков программирования. Последовательное использование идеи процедурного структурирования программ привело к созданию обширных библиотек программирования, содержащих множество сравнительно небольших процедур, из которых, как из кирпичиков, можно строить «здание» программы.
По мере прогресса в области вычислительной математики акцент в программировании стал смещаться с процедур в сторону организации данных. Оказалось, что эффективная разработка сложных программ нуждается в действенных способах контроля правильности использования данных. Контроль должен осуществляться как на стадии компиляции, так и прогоне программ, в противном случае, как это показала практика, резко возрастают трудности создания крупных программных проектов. Отчетливое сознание этой проблемы привело к созданию Алгола-60, а позже Паскаля, Модулы-2, Си и множества других языков программирования, имеющих более или менее развитые структуры типов данных. Логическим следствием развития этого направления стал модульный подход к разработке программ, характеризующийся стремлением «спрятать» данные и процедуры внутри модуля.
Начиная с языка Симула-67, в программировании наметился новый подход, который получил название объектно-ориентированного программирования (ООП).
Основополагающей идеей одного из современных подходов к программированию — объектно-ориентированному — является объединение данных и обрабатывающих их процедур в единое целое — объекты.
Объектно-ориентированное программирование — это методология программирования, которая основана на представлении программы в виде совокупности объектов, каждый из которых является реализацией определенного класса (типа особого вида), а классы образуют иерархию, основанную на принципах наследуемости. При этом объект характеризуется как совокупностью всех своих свойств и их текущих значений, так и совокупностью допустимых для данного объекта действий.
1. АНАЛИТИЧЕСКИЙ ОБЗОР ЯЗЫКОВ И ПОДХОДОВ ПРОГРАММИРОВАНИЯ
.1 Объектно-ориентированное программирование
программирование пользовательский интерфейс язык
Си — компилируемый статически типизированный язык общего назначения.
Язык программирования отличается минимализмом. Авторы языка хотели, чтобы программы на нём легко компилировались с помощью однопроходного компилятора, чтобы каждой элементарной составляющей программы после компиляции соответствовало весьма небольшое число машинных команд, а использование базовых элементов языка не задействовало библиотеку времени выполнения. Однопроходный компилятор компилирует программу, не возвращаясь назад, к уже обработанному тексту. Поэтому использованию функций и переменных должно предшествовать их объявление. Код на Си можно легко писать на низком уровне абстракции, почти как на ассемблере. Иногда Си называют «универсальным ассемблером» или «ассемблером высокого уровня», что отражает различие языков ассемблера для разных платформ и единство стандарта Си, код которого может быть скомпилирован без изменений практически на любой модели компьютера. Си часто называют языком среднего уровня или даже низкого уровня, учитывая то, как близко он работает к реальным устройствам. Однако, в строгой классификации, он является языком высокого уровня.
Компиляторы Си разрабатываются сравнительно легко благодаря простоте языка и малому размеру стандартной библиотеки. Поэтому данный язык доступен на самых различных платформах (возможно, круг этих платформ шире, чем у любого другого существующего языка). К тому же, несмотря на свою низкоуровневую природу, язык позволяет создавать переносимые программы и поддерживает в этом программиста. Программы, соответствующие стандарту языка, могут компилироваться на самых различных компьютерах.
Си (как и ОС UNIX, с которой он долгое время был связан) создавался программистами и для программистов, круг которых был бы ненамного шире круга разработчиков языка. Несмотря на это, область использования языка значительно шире задач системного программирования.
Си создавался с одной важной целью: сделать более простым написание больших программ с минимумом ошибок по правилам процедурного программирования, не добавляя на итоговый код программ лишних накладных расходов для компилятора, как это всегда делают языки очень высокого уровня, такие как Бейсик. С этой стороны Си предлагает следующие важные особенности:
− простую языковую базу, из которой вынесены в библиотеки многие существенные возможности, вроде математических функций или функций управления файлами;
− ориентацию на процедурное программирование, обеспечивающую удобство применения структурного стиля программирования;
− систему типов, предохраняющую от бессмысленных операций;
− использование препроцессора для, например, определения макросов
и включения файлов с исходным кодом;
− непосредственный доступ к памяти компьютера через использование указателей;
− минимальное число ключевых слов;
− передачу параметров в функцию по значению, а не по ссылке (при этом передача по ссылке эмулируется с помощью указателей);
− указатели на функции и статические переменные;
− области действия имён;
− структуры и объединения, определяемые пользователем, собирательные типы данных, которыми можно манипулировать как одним целым.
В то же время, в Си отсутствуют
вложенные функции;
сопрограммы; а также, средства:
автоматического управления памятью;
объектно-ориентированного программирования;
функционального программирования [8].
Паскаль — язык программирования общего назначения.
Особенностями языка являются строгая типизация и наличие средств структурного (процедурного) программирования. Паскаль был одним из первых таких языков. По мнению Вирта, язык должен способствовать дисциплинированному программированию, поэтому, наряду со строгой типизацией, в Паскале сведены к минимуму возможные синтаксические неоднозначности, а сам синтаксис автор постарался сделать интуитивно понятным даже при первом знакомстве с языком.
Тем не менее, первоначально язык имел ряд ограничений: невозможность передачи функциям массивов переменной длины, отсутствие нормальных средств работы с динамической памятью, ограниченная библиотека ввода-вывода, отсутствие средств для подключения функций, написанных на других языках, отсутствие средств раздельной компиляции и т.п. Подробный разбор недостатков языка Паскаль того времени был выполнен Брайаном Керниганом в статье «Почему Паскаль не является моим любимым языком программирования» (эта статья вышла в начале 1980- х, когда уже существовал язык Модула-2, потомок Паскаля, избавленный от большинства его пороков, а также более развитые диалекты Паскаля). Некоторые недостатки Паскаля были исправлены в ISO-стандарте 1982 года, в частности, в языке появились открытые массивы, давшие возможность использовать одни и те же процедуры для обработки одномерных массивов различных размеров.
Однако многие недостатки языка не проявляются или даже становятся достоинствами при обучении программированию. Кроме того, по сравнению с основным языком программирования в академической среде 1970-x (которым был Фортран, обладавший гораздо более существенными недостатками), Паскаль представлял собой значительный шаг вперёд. К 1980-м годам Паскаль стал основой для многочисленных учебных программ, в отдельных случаях на его основе были созданы специализированные обучающие языки программирования, так, в начале 1980-х годов в СССР для обучения школьников основам информатики и вычислительной техники Андрей Ершов разработал алголо-паскалеподобный «учебный алгоритмический язык».
Наиболее известной реализацией Паскаля, обеспечившей широкое распространение и развитие языка, является Turbo Pascal фирмы «Borland », выросшая затем в объектный Паскаль для DOS (начиная с версии 5.5) и Windows и далее в Delphi, в которой были внедрены значительные расширения языка [7].
В основе концепции объектно-ориентированного программирования лежит понятие object — некой сущности, которая объединяет в себе поля (данные) и методы (выполняемые объектом действия).
В современных ОО языках используются механизмы:
) Наследование. Создание нового класса объектов путём добавления новых элементов (методов). Некоторые ОО языки позволяют выполнять множественное наследование, то есть объединять в одном классе возможности нескольких других классов.
2) Инкапсуляция. Сокрытие деталей реализации, которое позволяет вносить изменения в части программы безболезненно для других её частей, что существенно упрощает сопровождение и модификацию ПО.
3) Полиморфизм. При полиморфизме некоторые части (методы) родительского класса заменяются новыми, реализующими специфические для данного потомка действия. Таким образом, интерфейс классов остаётся прежним, а реализация методов с одинаковым названием и набором параметров различается. В ООП обычно применяется полиморфизм подтипов (называемый при этом просто «полиморфизмом»), нередко в форме позднего связывания.
В настоящее время имеется большое количество объектно-ориентированных языков, такие как: C#, C++, Java, Delphi и многие другие[1]. # (произносится “си шарп”) — объектно-ориентированный язык программирования. Разработан в 1998-2001 годах группой инженеров под руководством Андерса Хейлсберга в компании Microsoft как язык разработки приложений для платформы Microsoft.NET Framework и впоследствии был стандартизирован как ECMA-334 и ISO/IEC 23270. # относится к семье языков с С-подобным синтаксисом, из них его синтаксис наиболее близок к C++ и Java. Язык имеет статическую типизацию, поддерживает полиморфизм, перегрузку операторов (в том числе операторов явного и неявного приведения типа), делегаты, атрибуты, события, свойства, обобщённые типы и методы, итераторы, анонимные функции с поддержкой замыканий, LINQ, исключения, комментарии в формате XML.
Переняв многое от своих предшественников — языков C++, Pascal, Java, С#, опираясь на практику их использования, исключает некоторые модели, зарекомендовавшие себя как проблематичные при разработке программных систем, например, C# в отличие от C++ не поддерживает множественное наследование классов (между тем допускается множественное наследование интерфейсов).# разрабатывался как язык программирования прикладного уровня для CLR и, как таковой, зависит, прежде всего, от возможностей самой CLR. Это касается, прежде всего, системы типов C#, которая отражает BCL. Присутствие или отсутствие тех или иных выразительных особенностей языка диктуется тем, может ли конкретная языковая особенность быть транслирована в соответствующие конструкции CLR. Так, с развитием CLR от версии 1.1 к 2.0 значительно обогатился и сам C#; подобного взаимодействия следует ожидать и в дальнейшем (однако, эта закономерность была нарушена с выходом C# 3.0, представляющего собой расширения языка, не опирающиеся на расширения платформы.NET). CLR предоставляет C#, как и всем другим.NET-ориентированным языкам, многие возможности, которых лишены «классические» языки программирования. Например, сборка мусора не реализована в самом C#, а производится CLR для программ, написанных на C# [2].# — объектно-ориентированный язык программирования. Разработан 1998-2001 годах группой инженеров под руководством Андерса Хейлсберга в компании «Microsoft» как язык разработки приложений для платформы Microsoft.NET Framework. # относится к семье языков с C-подобным синтаксисом. Его синтаксис наиболее близок к C++ и Java. Язык имеет статическую типизацию, поддерживает полиморфизм, перегрузку операторов (в том числе операторов явного и неявного приведения типов), делегаты, атрибуты, события, свойства, обобщённые типы и методы, итераторы, анонимные функции с поддержкой замыканий, LINQ, исключения, комментарии в формате XML. # разрабатывался как язык программирования прикладного уровня для CLR и, как таковой, зависит, прежде всего, от возможностей самой CLR. Это касается, прежде всего, системы типов C#, которая отражает BCL. Присутствие или отсутствие тех или иных выразительных особенностей языка диктуется тем, может ли конкретная языковая особенность быть транслирована в соответствующие конструкции CLR. Так, с развитием CLR от версии 1.1 к 2.0 значительно обогатился и сам C#; подобного взаимодействия следует ожидать и в дальнейшем (однако, эта закономерность была нарушена с выходом C# 3.0, представляющего собой расширения языка, не опирающиеся на расширения платформы.NET). CLR предоставляет C#, как и всем другим.NET-ориентированным языкам, многие возможности, которых лишены «классические» языки программирования [4]. — объектно-ориентированный язык программирования, разработанный компанией «Sun Microsystems» (в последующем приобретённой компанией «Oracle»). Приложения Java обычно транслируется в специальный байт-код, поэтому они могут работать на любой виртуальной Java-машине вне зависимости от компьютерной архитектуры. Дата официального выпуска — 23 мая 1995 года.
Программы на Java транслируются в байт-код, выполняемый виртуальной машиной Java (JVM) программой, обрабатывающей байтовый код и передающей инструкции оборудованию как интерпретатор.
Достоинством подобного способа выполнения программ является полная независимость байт- кода от операционной системы и оборудования, что позволяет выполнять Java-приложения на любом устройстве, для которого существует соответствующая виртуальная машина. Другой важной особенностью технологии Java является гибкая система безопасности, в рамках которой исполнение программы полностью контролируется виртуальной машиной. Любые операции, которые превышают установленные полномочия программы (например, попытка несанкционированного доступа к данным или соединения с другим компьютером) вызывают немедленное прерывание.
Часто к недостаткам концепции виртуальной машины относят снижение производительности. Ряд усовершенствований несколько увеличил скорость выполнения программ на Java:
− применение технологии трансляции байт-кода в машинный код непосредственно во время работы программы (JIT-технология) с возможностью сохранения версий класса в машинном коде;
− широкое использование платформенно-ориентированного кода (native-код) в стандартных библиотеках;
− аппаратные средства, обеспечивающие ускоренную обработку байт-кода (например, технология Jazelle, поддерживаемая некоторыми процессорами фирмы ARM).
Идеи, заложенные в концепцию и различные реализации среды виртуальной машины Java, вдохновили множество энтузиастов на расширение перечня языков, которые могли бы быть использованы для создания программ, исполняемых на виртуальной машине. Эти идеи нашли также выражение в спецификации общеязыковой инфраструктуры CLI, заложенной в основу платформы.NET компанией «Microsoft» [5].
1.2 Процедурное программирование
Процедурное программирование — программирование на императивном языке, при котором последовательно выполняемые операторы можно собрать в подпрограммы, то есть более крупные целостные единицы кода, с помощью механизмов самого языка.
Процедурное программирование является отражением архитектуры традиционных ЭВМ, которая была предложена фон Нейманом в 1940-х годах. Теоретической моделью процедурного программирования служит абстрактная вычислительная система под названием машина Тьюринга.
Выполнение программы сводится к последовательному выполнению операторов с целью преобразования исходного состояния памяти, то есть значений исходных данных, в заключительное, то есть в результаты. Таким образом, с точки зрения программиста имеются программа и память, причем первая последовательно обновляет содержимое последней [3].
Процедурный язык программирования предоставляет возможность программисту определять каждый шаг в процессе решения задачи. Особенность таких языков программирования состоит в том, что задачи разбиваются на шаги и решаются шаг за шагом. Используя процедурный язык, программист определяет языковые конструкции для выполнения последовательности алгоритмических шагов.
В настоящее время имеется большое количество процедурных языков, такие как: Ada (язык общего назначения), Алгол 60, Алгол 68, Basic(до появления Visual Basic), Си, КОБОЛ, Фортран и многие другие.
Си — компилируемый статический типизированный язык программирования общего назначения, разработанный в 1969-1973 годах сотрудником Bell Labs Деннисом Ритчи как развитие языка Би. Первоначально был разработан для реализации операционной системы UNIX, но, впоследствии, был перенесён на множество других платформ. Благодаря близости по скорости выполнения программ, написанных на Си, к языку ассемблера, этот язык получил широкое применение при создании системного программного обеспечения и прикладного программного обеспечения для решения широкого круга задач. Язык программирования Си оказал существенное влияние на развитие индустрии программного обеспечения, а его синтаксис стал основой для таких языков программирования как C++, C#, Java [3].
Язык программирования Си был разработан в лабораториях Bell Labs в период с 1969 по 1973 годы. Согласно Ритчи, самый активный период творчества пришёлся на 1972 год. Язык назвали “Си” (C — третья буква латинского алфавита), потому что много его особенности берут начало от старого языка “Би” (B — вторая буква латинского алфавита). Существует несколько различных версий происхождения названия языка Би. Кен Томпсон указывает на язык программирования BCPL, однако существует ещё и язык Bon, также созданный им, и названный так в честь его жены Бонни [1].
Существует несколько легенд, касающихся причин разработки Си и его отношения к операционной системе UNIX, включая следующие:
) Разработка Си стала результатом того, что его будущие авторы любили компьютерную игру, подобную популярной игре Asteroids (Астероиды). Они уже давно играли в неё на главном сервере компании, который был недостаточно мощным и должен был обслуживать около ста пользователей. Томпсон и Ритчи посчитали, что им не хватает контроля над космическим кораблём для того, чтобы избегать столкновений с некоторыми камнями. Поэтому они решили перенести игру на свободный PDP-7, стоящий в офисе. Однако этот компьютер не имел операционной системы, что заставило их её написать. В конце концов, они решили перенести эту операционную систему ещё и на офисный PDP-11, что было очень тяжело, потому что её код был целиком написан на ассемблере. Было вынесено предложение, использовать какой-нибудь высокоуровневый импортируемый язык, чтобы можно было легко переносить ОС с одного компьютера на другой. Язык Би, который они хотели сначала задействовать для этого, оказался лишён функциональности, способной использовать новые возможности PDP-11. Поэтому они и остановились на разработке языка Си.
) Самый первый компьютер, для которого была первоначально написана UNIX, предназначался для создания системы автоматического заполнения документов. Первая версия UNIX была написана на ассемблере. Позднее для того, чтобы переписать эту операционную систему, был разработан язык Си.
К 1973 году язык Си стал достаточно силён, и большая часть ядра UNIX, первоначально написанная на ассемблере PDP-11/20, была переписана на Си. Это было одно из самых первых ядер операционных систем, написанное на языке, отличном от ассемблера; более ранними были лишь системы Multics (написана на ПЛ/1) и TRIPOS(написана на BCPL) [4].
Текст программы на Си может содержать фрагменты, которые не являются частью программного кода и, поэтому, называется комментариями. Такие фрагменты специальными помечаются в тексте программы и полностью пропускаются при компиляции.
Первоначально (в стандарте С89) был предусмотрен символ “/*” для обозначения начала комментария и символ “*/” завершит комментарий, и текст, следующий непосредственно за символом “*/”, если этот текст не является программным кодом и содержит произвольный текст, вызовет ошибку компиляции.
Следующий стандарт (стандарт С99) ввёл ещё один способ оформление комментариев: комментарием считается текст, начинающийся с символа “//” и заканчивающийся в конце строки [3].
.3 Функциональное программирование
# — это мультипарадигмальный язык программирования из семейства языков .NET Framework, поддерживающий функциональное программирование в дополнение к императивному (процедурному) и объектно-ориентированному программированию. Структура F# во многом схожа со структурой OCaml с той лишь разницей, что F# реализован поверх библиотек и среды исполнения.NET. Язык был разработан Доном Саймом в «Microsoft Research» в Кембридже, в настоящее время его разработку ведет «Microsoft Developer Division ». F# достаточно тесно интегрируется со средой разработки Visual Studio и включён в поставку Visual Studio 2010/2012/2013. Разработаны также компиляторы для Mac и Linux.
Некоторые задачи решаются значительно проще и яснее с использованием F# (по сравнению с решениями на доминирующих ОО-языках), особенно те, что используют математический стиль программирования. Например, написание компилятора требует работы со структурами данных и преобразований над ними.
«Microsoft» интегрировала среду разработки F# в Visual Studio 2010.
Компания планирует активно внедрять данный язык в разработку программных систем, которые сами с течением времени смогут масштабироваться, например, в зависимости от количества пользователей. Данное достоинство непросто реализовать в императивных языках программирования.
ноября 2010 года код компилятора F# и основных библиотек к нему опубликован под Apache License 2.0.
Код на языке F# является безопасным в отношении типов, часто бывает более компактным, чем аналогичный код C#, за счёт вывода типов. В F# действует строгая типизация, неявные преобразования типов полностью отсутствуют, что полностью исключает ошибки, связанные с приведением типов.
Такие возможности, как обобщённое программирование и функции высших порядков позволяют писать абстрактные обобщённые алгоритмы, которые управляют параметризованными структурами данных (например, массивами, списками, графами, деревьями).
Также в F# есть ссылочные типы и объекты, которые также могут содержать изменяемые значения. Тем не менее, большая часть кода является функциями от постоянных значений, что позволяет избежать многих ошибок и упростить отладку. Кроме того, упрощается распараллеливание программ. При всем этом код редко становится сложнее, чем аналогичный код на императивном языке.
Одна из основных идей F# заключается в том, чтобы удостовериться, что имеющийся код и типы в функциональном языке программирования могут быть легкодоступны из других.NET-языков. Программы на F# компилируются в сборки CLR (файлы с расширениями.exe и.dll), однако, для их запуска необходима установка пакета среды исполнения дополнительно к .NET Framework.
Интересной особенностью (и отличием от OCaml) является управление логической вложенностью конструкций кода за счёт отступов в виде произвольного количества пробелов (и только лишь пробелов). Знаки табуляции для этой цели не поддерживаются. Это приводит к постоянным дискуссиям на форумах опытных разработчиков, которые привыкли пользоваться знаками табуляции в других языках программирования [9].
Функциональное программирование объединяет разные подходы к определению процессов вычисления на основе достаточно строгих абстрактных понятий и методов символьной обработки данных. Сформулированная Джоном Мак-Карти (1958) концепция символьной обработки информации компьютером восходит к идеям Черча и других математиков, известным как лямбда-исчисление с конца 20-х годов XX века. Выбирая лямбда-исчисление как теоретическую модель, Мак-Карти предложил рассматривать функции как общее базовое понятие, к которому достаточно естественно могут быть сведены все другие понятия, возникающие при программировании. Существуют различия в понимании функции в математике и функции в программировании, вследствие чего нельзя отнести Си-подобные языки к функциональным, использующим менее строгое понятие. Функция в математике не может изменить вызывающее её окружение и запомнить результаты своей работы, а только предоставляет результат вычисления функции.
Программирование с использованием математического понятия функции вызывает некоторые трудности, поэтому функциональные языки, в той или иной степени предоставляют и императивные возможности, что ухудшает дизайн программы (например, возможность безболезненных дальнейших изменений). Дополнительное отличие от императивных языков программирования заключается в декларативности описаний функций.
Тексты программ на функциональных языках программирования описывают «как решить задачу», но не предписывают последовательность действий для решения. Первым спроектированным функциональным языком стал Лисп. Он был предложен Джоном Мак-Карти в качестве средства исследования границ применимости компьютеров, в частности, методом решения задач искусственного интеллекта. Лисп послужил эффективным инструментом экспериментальной поддержки теории программирования и развития сферы его применения. Вариант данного языка широко используется в системе автоматизированного проектирования AutoCAD и называется AutoLISP [5].
1.4 Сравнительный анализ
Одним из главных недостатков процедурно-ориентированных языков программирования, таких как Си, Фортран, Паскаль и других языков из этой категории является то, что они требуют большого внимания от программиста и его знаний. Так же при больших размерах программы данный тип языков очень неудобный в следующих изменениях и масштабирование программы.
Исходя из вышеуказанной информации, лучше всего в программировании использовать язык C#. Язык имеет статическую типизацию, поддерживает полиморфизм, перегрузку операторов (в том числе операторов явного и неявного приведения типа), делегаты, атрибуты, события, свойства, обобщённые типы и методы, итераторы, анонимные функции с поддержкой замыканий, LINQ, исключения, комментарии в формате XML.
В объектно-ориентированных языка программирования, в данном случае С#, очень удобна сама структура языков состоящих в основном из объектов классов, а также легки в решении задачи масштабирования при дальнейшем наращивание программы. Недостатков таких языков немного и они совершенно не влияют на решении задачи создания электронного справочника [6].
2. ПРОГРАММНАЯ РЕАЛИЗАЦИЯ ЗАДАЧИ
.1 Постановка задачи
Разработать программное обеспечение для управления справочником «Спортсмены» с использованием объектно-ориентированного подхода.
В программе должна быть реализована функция выбора источника данных. Данные должны храниться:
. В памяти (описывается в исходном коде, т.е. результаты работы с ним никуда не сохраняются, при перезапуске приложения удаляются)
. В текстовом файле (использовать формат *.csv где поля разделять запятой)
. В бинарном файле (использовать сериализацию)
Справочник представляет собой набор записей, над которыми возможно производить операции добавления, изменения, удаления, сортировки (3 и более различных поля) и фильтрация (не менее 3-х различных критериев). Для каждой записи требуется хранить дату последнего изменения.
Необходимо учесть проверку введенных значений, а для обработки ошибок обязательно использовать конструкцию try…catch. Работа с файлами должна быть корректной (использовать конструкцию finally или using). В системе должна быть возможность выбора разных хранилищ.
Должна быть предусмотрена возможность создавать новые источники данных (на выбор пользователя бинарный или текстовый), менять во время работы приложения источник данных (т.е. переключится с текстового на бинарный, или на другой файл хранилища). Для этого реализовать общий интерфейс, для выполнения основных операций (создание, чтение, обновление, удаление).
Для каждого типа хранилища должен быть разработан свой класс, унаследованный от общего интерфейса хранилища. Общую логику рекомендуется вынести в абстрактный класс.
.2 Исходные данные и результаты
В качестве источников данных используются память, текстовый и бинарный файлы. Каждый источник данных содержит следующую информацию о стране:
Название страны; Форма правления; Площадь; Континент;
.csv — текстовый файл с исходными данными. 1.bin — бинарный файл с исходными данными.
2.3 Структура программного комплекса
В таблице 2.1 представлена информация об интерфейсах, используемых в программе.
Таблица 2.1 — Интерфейсы
В таблице 2.2 представлена информация о методах интерфейса istorage.
В таблице 2.3 представлена информация о классах, используемых в программе.
Таблица 2.3 — Классы
В таблице 2.4 представлена информация об элементах класса Sportsman.
Таблица 2.4 — Элементы класса Sportsman
2.4 Алгоритмы решения задачи
В ходе решения задачи были разработаны различные алгоритмы для работы с данными проекта.
Основной алгоритм программы показан на рисунке 2.1,а также в Приложении Б. На нем изображены главные подзадачи, которые решены и реализованы в программе).
Рисунок 2.1 — Схема основного алгоритма
3. ВЕРИФИКАЦИЯ И ПРОВЕДЕНИЕ ВЫЧИСЛИТЕЛЬНОГО ЭКСПЕРИМЕНТА
При запуске приложения на экран открывается окно основной формы программы.
На рисунке 3.1 показано основное окно программы, которое открывается при запуске приложения.
Рисунок 3.1 — Основное окно программы
Далее, в меню выберем «Файл», нам предлагается открыть и сохранить текстовый либо бинарный файл, так же можно ничего не открывать и программа автоматически выберет источником данных “Память”.
Рисунок 3.2 — Меню с выбором источника данных и открытием файла
Откроем файл *.csv (работаем с текстовым фалом), появится окно для открытия файлов с разрешённым расширением только *.csv.
На рисунке 3.3 открыто окно выбора csv файла.
Рисунок 3.3 — Открытие файла
После открытия файла в таблицу выведутся все данные хранящиеся в файле.
Рисунок 3.4 — Вывод данных
При клике правой клавишей на поле таблице текстовые поля выделяется строка, и контекстное меню как на Рисунке 3.5.
Рисунок 3.5 — Контекстное меню
Далее можно изменить данные в полях и сохранить изменения нажатием на кнопку “Изменить”. В полях появляются данные из выделенной строки.
Рисунок 3.6 — Изменение данных
Рисунок 3.7 — Результат изменения данных При нажатии “Удалить” запись удалиться.
Рисунок 3.8 — Результат удаления записи
Заполнив поля вверху формы и нажав кнопку “Добавить”, добавиться новая запись.
Рисунок 3.9 — Добавление данных
В меню выберем «Правка», нам предлагается вывести весь список, выполнить поиск по списку, фильтровать список, а также очистить весь список.
Рисунок 3.10- Меню — Правка
При выборе пункта “Вывести список”, выводится весь отредактированный справочник.
Рисунок 3.11 — Вывод справочника
Если выбрать пункт поиском — необходимо ввести критерии поиска, и нажать кнопку «Поиск».
Рисунок 3.13 — Поиск элементов
После использования фильтрации выведутся в таблицу строки(объекты),в которых успешно сработала фильтрация.
Рисунок 3.14 — Фильтрация по выбранному полю
При нажатии на “Очистить список”. Очищается таблица данных, также удаляются все данные безвозвратно.
Рисунок 3.15 — Удаление справочника
ЗАКЛЮЧЕНИЕ
В ходе выполнения поставленной задачи были решены проблемы хранения, добавления, сохранения различных данных цехов, а так же удобная работа с этими данными.
В программе были реализованы задачи хранения, добавления, сохранения. Метод хранения данных о цехах включал в себя получения информации из различных репозиториев данных, таких как : текстовый файл, бинарный файл и из оперативной памяти, где хранятся данные репозитория. Метод добавления данных представлен в виде удобного пользовательского интерфейса создания и записи новых данных цехов. В результате выполнения курсового проекта были разработаны схема алгоритма и приложение с использованием форм для управления справочником на языке программирования С#.
Методы, разработанные, в данном проекте могут найти применение и при выполнении других программных проектов, так как в них реализованы алгоритмы, применяемые во многих сферах программирования. Также были усовершенствованы навыки самостоятельной работы с ресурсами, поиска и выбора информации, творческого подхода к реализации задач.
Данный курсовой проект даёт возможность глубже изучить пройденный материал, позволяет закрепить навыки решения поставленных задач и научиться поиску необходимой для этого информации.
Задание на курсовой проект выполнено в полном объёме.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1. Объектно-ориентированное программирование [Электронный ресурс]. — Режим доступа: http://ru.wikipedia.org/wiki/Объектно-ориентированное_программирование. — Дата доступа: 27.12.2015.
2. Бакнелл Дж. Фундаментальные алгоритмы и структуры данных в Delphi: Учебник/ Под ред. Бакнелл Дж. — Москва: DiaSoft, 2003. — 557с.
3. Фаронов В.В. Программирование на языке C#: Учебник/ Под ред. Петцольд Ч. — СПб.: Питер, 2007. — 240 с.
4. Шилдт Герберт. Полный справочник по С#: Учебник/Под ред.Герберт Шилдт — М.: Издательский дом «Вильямс», 2004. — 752 с.
5. Агуров П. В. С#. Сборник рецептов: Учебник/Под ред. Агуров П.В. — СПб.: БХВ-Петербург, 2007. — 432 с.
6. Хэзфилд Р., Кирби Л.Искусство программирования на С. Фундаментальные алгоритмы, структуры данных и примеры приложений.: Учебник/Под ред. Седжвик Роберт — К.: Издательство «ДиаСофт», 2001 — 736с.
7. Паскаль (язык программирования) [Электронный ресурс]: Материал из Википедии — свободной энциклопедии. — Электронные данные. — Режим доступа: https://ru.wikipedia.org/wiki/Паскаль_(язык_программирования) — Дата доступа: 27.12.2015.
8. Cи (язык программирования) [Электронный ресурс]: Материал из Википедии — свободной энциклопедии. — Электронные данные. — Режим доступа: https://ru.wikipedia.org/wiki/Си_(язык_программирования) — Дата доступа: 27.12.2015.
. F Sharp [Электронный ресурс]: Материал из Википедии — свободной энциклопедии. — Электронные данные. — Режим доступа: https://ru.wikipedia.org/wiki/F_Sharp. — Дата доступа: 27.12.2015.
ПРИЛОЖЕНИЯ
Приложение А
Листинг программных модулей на языке С#
Program.cs System; System.Collections.Generic; System.Linq;System.Threading.Tasks; using System.Windows.Forms; namespace Kursach
{class Program
{
/// Главная точка входа для приложения.
///
[STAThread] static void Main()
{.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Sportman());
}
}
}
Sportsman.cs System;System.Collections.Generic; using System.Linq; System.Text;System.Threading.Tasks; Kursach
{
[Serializable] class Sportsman
{int id; string nameFio; private int ageSportsman; private int winAmount; private string typeOfSport; private DateTime dateChange; Sportsman(int idd,string name, int age, int winamount, string type,DateTime dateChange)
{ .id = idd; this.nameFio = name; this.ageSportsman = age; .winAmount = winamount; this.typeOfSport = type; this.dateChange = dateChange;
}Sportsman()
{
} int ID
{ { return id; } set { id = value; }
}string NameFio
{{ return nameFio; } set { nameFio = value; }
} int AgeSportsman
{ { return ageSportsman; } set { ageSportsman = value; }
}int WinAmount
{{ return winAmount; } set { winAmount = value; }
} string TypeOfSport
{ { return typeOfSport; } set { typeOfSport = value; }
}DateTime DateChange
{{return dateChange;} set{dateChange = value;}
}
}
}
MainForm.cs System; System.Collections.Generic; using System.ComponentModel; using System.Data; System.Drawing; using System.Linq; using System.Text; System.Threading.Tasks; using System.Windows.Forms; using System.IO; System.Runtime.Serialization; System.Runtime.Serialization.Formatters.Binary; Kursach
{ partial class MainForm : Form
{ date = DateTime.Now; List list = new List(); DataGridViewCellEventArgs mouseLocation; private int Z = 6; int idd()
{ idd = (int)Table.SelectedCells[0].Value; return idd;
} MainForm()
{ (); textBox_Filtration.Visible = false; Button_Filtration_Main.Visible = false; Add_Object_Button.Visible = false; Change_Button.Visible = false;
} void Show_Box_For_Add_or_Edit()
{_textBox.Visible = true; AgeEntry_textBox.Visible = true; AmountEntry_textBox.Visible = true; SportType_textBox.Visible = true;
} void Filtration_Show()
{ _Filtration.Visible = true; Button_Filtration_Main.Visible = true;
}void filtration_byName(string text)
{b = text; Table.Rows.Clear(); (int i = 0; i < list.Count; i++) if(list[i].NameFio.StartsWith(b)) .Rows.Add(list[i].ID, [i].NameFio,[i].AgeSportsman, [i].WinAmount,[i].TypeOfSport, [i].DateChange);
} void filtration_byType(string text)
{ b = text; Table.Rows.Clear(); (int i = 0; i < list.Count; i++)(list[i].TypeOfSport.StartsWith(b)) Table.Rows.Add(list[i].ID, [i].NameFio, [i].AgeSportsman,[i].WinAmount, [i].TypeOfSport,[i].DateChange);
}void filtration_byAmount(string text)
{b = text; Table.Rows.Clear(); (int i = 0; i < list.Count; i++) (list[i].WinAmount.ToString() == b) Table.Rows.Add(list[i].ID,[i].NameFio,[i].AgeSportsman, [i].WinAmount,[i].TypeOfSport, [i].DateChange);
}
void filtration_byAge(string text)
{b = text; Table.Rows.Clear();(int i = 0; i < list.Count; i++) (list[i].AgeSportsman.ToString() == b) Table.Rows.Add(list[i].ID, [i].NameFio,[i].AgeSportsman,[i].WinAmount,[i].TypeOfSport,[i].DateChange);
}void UpdateTable()
{.Rows.Clear();.Refresh();(int i = 0 ;i < list.Count;i++) Table.Rows.Add(list[i].ID,[i].NameFio,[i].AgeSportsman,[i].WinAmount,[i].TypeOfSport,[i].DateChange);
}void Menu_Open_Csv_Click(object sender, EventArgs e)//open.csv
{stream = null;.Filter = «Текстовый файл|*.csv|Все файлы|*.*»; if (openFileDialogCsv.ShowDialog() == DialogResult.OK)
{((stream = openFileDialogCsv.OpenFile()) != null)
{enc = Encoding.GetEncoding(1251); StreamReader read = new StreamReader(stream, enc); try
{ [] str = read.ReadToEnd().Split(‘n’); for (int i = 0; i < str.Count(); i++)
{ m = new Sportsman(); string[] element = str[i].Split(‘;’); try
{ = new Sportsman( i,[0],.Parse(element[1]),.Parse(element[2]),[3],.Parse(element[4]));.Add(m);
}{ }
}();
}(Exception ex)
{.Show(ex.Message);
}
{.Close();
}
}
}
} void Menu_Open_Bin_Click(object sender, EventArgs e)//open.bin file
{stream = null; .Filter = «Бинарный файл|*.bin|Все файлы|*.*»; if (openFileDialogBin.ShowDialog() == DialogResult.OK)
{((stream = openFileDialogBin.OpenFile()) != null)
{ bf = new BinaryFormatter(); list.AddRange((List)bf.Deserialize(stream)); SetDataGrid();
}(SerializationException ex)
{.Show(ex.Message);
}
{.Close();
}
}
}
} void saveFileBin_Click(object sender, EventArgs e)//save.bin file
{stream = null; .Filter = «Бинарный файл|*.bin|Все файлы|*.*»; if (openFileDialogBin.ShowDialog() == DialogResult.OK)
{((stream = openFileDialogBin.OpenFile()) != null)
{
{ bf = new BinaryFormatter(); list.AddRange((List)bf.Deserialize(stream)); ();
}(SerializationException ex)
{.Show(ex.Message);
}
{.Close();
}
}
}
} void SetDataGrid()//read from file
{
.Rows.Clear();(int i = 0; i < list.Count; i++)
{ .RowCount++; Table[0, i].Value = list[i].ID; [1, i].Value = list[i].NameFio; Table[2, i].Value = list[i].AgeSportsman; Table[3, i].Value = list[i].WinAmount; Table[4, i].Value = list[i].TypeOfSport; Table[5, i].Value = list[i].DateChange;
}
}void Menu_Task_Click(object sender, EventArgs e)//task
{h = new Task(); h.Show();
}void ClearFields()//clear fields
{_textBox.Text = «»; _textBox.Text = «»; AmountEntry_textBox.Text = «»; SportType_textBox.Text = «»;
}void Button_Add_Object(object sender, EventArgs e)//add object
{m = new Sportsman(); try
{(NameEntry_textBox.Text != «» && AgeEntry_textBox.Text != «» && AmountEntry_textBox.Text != «» && SportType_textBox.Text != «» && Convert.ToInt32(AmountEntry_textBox.Text) > 0 && Convert.ToInt32(AgeEntry_textBox.Text) > 0 && Convert.ToInt32(AgeEntry_textBox.Text) < 90 && Convert.ToInt32(AmountEntry_textBox.Text) < 100)
{ = new Sportsman(list.Count, NameEntry_textBox.Text, int.Parse(AgeEntry_textBox.Text), int.Parse(AmountEntry_textBox.Text), SportType_textBox.Text, DateTime.Now);.Add(m);();
}.Show(«Неверные данные»);
} { } ClearFields();
}void Menu_Save_Bin_Click(object sender, EventArgs e)//save.bin
{stream = null; .Filter = «Бинарный файл|*.bin|Все файлы|*.*»; if (saveFileDialogBin.ShowDialog() == DialogResult.OK)
{((stream = saveFileDialogBin.OpenFile()) != null)
{
{bf = new BinaryFormatter(); bf.Serialize(stream, list);
}(SerializationException ex)
{.Show(ex.Message);
}
{.Close();
}
}
}
}void Menu_Save_Csv_Click(object sender, EventArgs e)//save.csv
{stream = null;.Filter = «Текстовый файл|*.csv|Все файлы|*.*»; if (saveFileDialogCsv.ShowDialog() == DialogResult.OK)
{((stream = saveFileDialogCsv.OpenFile()) != null)
{write = new StreamWriter(stream, Encoding.GetEncoding(1251)); try
{(int i = 0; i < list.Count(); i++)
{.WriteLine(list[i].NameFio + «;»
+ list[i].AgeSportsman + «;»
+ list[i].WinAmount + «;»
+ list[i].TypeOfSport + «;»
+ list[i].DateChange);
}
}(Exception ex)
{.Show(ex.Message);
}
{.Close();.Close();
}
}
}
}
private void Button_Search_Click(object sender, EventArgs e)
{(int i = 0; i < Table.RowCount; i++)
{.Rows[i].Selected = false; (int j = 0; j < Table.ColumnCount; j++) if (Table.Rows[i].Cells[j].Value != null)(Table.Rows[i].Cells[j].Value.ToString().Contains(Search_textBox.Text))
{ .Rows[i].Selected = true; break;
}
}
void Clear_List_Click(object sender, EventArgs e)
{.Clear();();
}void ReferenceMenuItem_Click(object sender, EventArgs e)
{k = new Task();
}void FilterByName_Button_Click(object sender, EventArgs e)//фильтрация по имени
{_Show(); Z = 1;
}void FilterByAge_Button_Click(object sender, EventArgs e)//фильтрация по возрасту
{ _Show(); Z = 2;
}void FilterByAmount_Button_Click(object sender, EventArgs e)//фильтрация по кол-ву
{ _Show(); Z = 3;
}void FilterByType_Button_Click(object sender, EventArgs e)//фильтрация по типу
{ _Show(); Z = 4;
}void MenuClick_Add(object sender, EventArgs e)//кнопка «добавить»
{ _Object_Button.Visible = true; Show_Box_For_Add_or_Edit();
}void очиститьСписокToolStripMenuItem_Click(object sender, EventArgs e)
{.Rows.Clear();.Clear();
}void NameEntry_textBox_KeyPress(object sender, KeyPressEventArgs e)
{(!Char.IsLetter(e.KeyChar) && e.KeyChar != 8 ) e.Handled = true;
}void AgeEntry_textBox_KeyPress(object sender, KeyPressEventArgs e)
{ (!Char.IsDigit(e.KeyChar) && e.KeyChar != 8) e.Handled = true;
} void AmountEntry_textBox_KeyPress(object sender, KeyPressEventArgs e)
{ (!Char.IsDigit(e.KeyChar) && e.KeyChar != 8) e.Handled = true;
}void SportType_textBox_KeyPress(object sender, KeyPressEventArgs e)
{ (!Char.IsLetter(e.KeyChar) && e.KeyChar != 8) e.Handled = true;
}void Search_textBox_KeyPress(object sender, KeyPressEventArgs e)
{
(!Char.IsLetterOrDigit(e.KeyChar) && e.KeyChar != 8) e.Handled = true;
}AddMouseEnterEvent()
{.CellMouseEnter += (s, e) => { mouseLocation = e; };
}void удалитьToolStripMenuItem_Click(object sender, EventArgs e)
{.RemoveAt(idd());();
}void dataGridView5_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{(!e.RowIndex.Equals(-1) && !e.ColumnIndex.Equals(-1) && e.Button.Equals(MouseButtons.Right))
{ .CurrentCell = Table[e.ColumnIndex, e.RowIndex]; Table.CurrentRow.Selected = true;
}
}void Table_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{(!e.RowIndex.Equals(-1) && !e.ColumnIndex.Equals(-1) && e.Button.Equals(MouseButtons.Right))
{ .CurrentCell = Table[e.ColumnIndex, e.RowIndex]; Table.CurrentRow.Selected = true;
}
}void ContextMenu_Change_Click(object sender, EventArgs e)
{ _Box_For_Add_or_Edit(); Change_Button.Visible = true; NameEntry_textBox.Text = list[idd()].NameFio; _textBox.Text = list[idd()].AgeSportsman.ToString(); AmountEntry_textBox.Text = list[idd()].WinAmount.ToString(); SportType_textBox.Text = list[idd()].TypeOfSport; list[idd()].DateChange = DateTime.Now; Add_Object_Button.Visible = false;
}void Change_Button_Click(object sender, EventArgs e)//Кнопка изменить
{ [idd()].NameFio = NameEntry_textBox.Text; list[idd()].AgeSportsman = Convert.ToInt32(AgeEntry_textBox.Text); list[idd()].WinAmount = Convert.ToInt32(AmountEntry_textBox.Text); list[idd()].TypeOfSport = SportType_textBox.Text; list[idd()].DateChange = DateTime.Now;();();
}void Button_Filtration_Main_Click(object sender, EventArgs e)//Выбор фильтрации
{(Z==1) filtration_byName(textBox_Filtration.Text); if (Z==2) filtration_byAge(textBox_Filtration.Text); if (Z==3) _byAmount(textBox_Filtration.Text); if (Z==4) filtration_byType(textBox _Filtration.Text); textBox_Filtration.Visible = false; Button_Filtration_Main.Visible = false; textBox_Filtration.Text = «»;
}void вывестиСписокToolStripMenuItem_Click(object sender, EventArgs e)//Меню вывести список
{ (Table.Rows.Count == 0) MessageBox.Show(«Список пуст»); UpdateTable();
}
}
}
IStorage.cs System;System.Collections.Generic; using System.Linq; System.Text;System.Threading.Tasks; Kursach
{istorage
{ Menu_Open_Bin_Click(object sender, EventArgs e); void Menu_Open_Csv_Click(object sender, EventArgs e); void Menu_Save_Bin_Click(object sender, EventArgs e); void Menu_Save_Csv_Click(object sender, EventArgs e);
}
}