Создание программного продукта для редактирования и сшивания топографических карт

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

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 22.11.2015
Размер файла 3,5 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru

Размещено на http://www.allbest.ru

Реферат

Пояснительная записка 76 страниц, 24 рисунка, 4 таблицы, 22 литературных источника, 7 приложений.

ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ, СШивка, РЕДАКТИРОВАНИЕ, ТОПОГРАФИЧЕСКИЕ КАРТЫ, c#, .NET FRAMEWORK, VISUAL STUDIO.

Целью проекта является разработка программного обеспечения для сшивки и редактирования топографических карт.

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

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

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

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

В пятом разделе приводится расчет экономических параметров и себестоимость программного обеспечения.

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

В заключении приведены результаты проделанной работы.

Введение

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

Целью данного диплома является создание программного продукта, который позволит сшивать и редактировать топографические карты. Входными параметрами программы должен служить набор топографических карт. Формат топографических карт может быть таким как jpg, png, bmp. Программа должна предоставить возможность автоматизированной сшивки карт путем анализа изображения, так же интерфейс программы должен позволять добавлять и удалять с карты топографические знаки, возможность как загрузки карт, так и сохранения конечного результата. Сохранение карт должно быть реализовано в форматах jpg, png, bmp и полностью совместимо с современными графически пакетами Photoshop и CorelDrow.

Аналитический обзор литературы

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

Современная картография подразделяется на ряд дисциплин: картоведение, математическую картографию, картометрию, проектирование и составление карт, редактирование карт, оформление карт, издание карт [1]. Картография тесно связана со многими науками. Цикл географических наук вооружает картографию знаниями, и сегодня картографию трудно представить без тесного взаимодействия с аэрокосмическим зондированием, геоинформатикой и телекоммуникацией [2]. Электронные карты и атласы, трехмерные картографические модели, космофотокарты и другие геоизображения стали привычными средствами исследования для географов, геологов, экологов и других специалистов в науках о Земле и смежных социально-экономических отраслях знания [3]. Особенно тесная связь существует между картографией и геодезией [4]. Геодезия изучает форму и размеры земного эллипсоида, создает плановую и высотную основу топографических карт, а, следовательно, и географических карт. В то же время, в зависимости от задач картографирования, устанавливается программа построения геодезических сетей, определяются требования к их точности и к методике производства работ. Картография активно развивается во многих направлениях. Постоянно расширяется тематика карт, разрабатываются карты нового типа, совершенствуются методы их исследования в научной и практической деятельности. Например, в связи с возрастающей ценностью земель быстро завоевывают признание карты использования земель, или кадастровые карты, показывающие размещение угодий различного хозяйственного использования. Эти карты предназначаются для обеспечения организации эффективного использования и охраны сельскохозяйственных, лесохозяйственных и городских земель при планировании производства, мелиорации земель и решении других народнохозяйственных задач [5].

Новым направлением в развитии современной картографии является геоинформационное картографирование - автоматизированное создание и использование карт на основе ГИС (геоинформационных систем), баз картографических данных и знаний.

Геоинформационное картографирование

Суть геоинформационного картографирования составляет информационно - картографическое моделирование геосистем. Наиболее важными характерными чертами данного вида картографирования являются:

- высокая степень автоматизации, опора на базы картографических данных и базы географических знаний;

- системный подход к изображению и анализу геосистем;

- создание изображений новых видов и типов (электронных карт, трехмерных компьютерных моделей и др.);

- применение новых графических средств и дизайна;

- оперативность, приближающаяся к реальному времени; преимущественно проблемно-практическая ориентация картографирования, нацеленная на обеспечение принятия решений [6].

Универсальное и наиболее распространенное средство для создания ГИС ARC/INFO служит для обеспечения компьютерного картографирования и оперативного принятия решений. Оно работает с любыми видами информации, имеющей привязку к территории. С помощью ARC/INFO можно легко получить в цифровой форме любую карту, схему, видеоизображение или рисунок, ввести табличные, статистические и другие тематические данные, привязанные к объектам карты. ARC/INFO позволяет работать с сериями карт, накладывая одну карту на другую, и проводить их сопряженный анализ, создавать «твердые» копии необходимых карт и схем.

Упрощенная версия ARC/INFO - Arcview - поддерживает внутренний формат SHAPE и внутренний язык программирования AVENUE. Но при использовании этой системы для больших по объему слоев проявляется эффект процессорозависимости, т. е. нужно иметь мощные ресурсы процессора и памяти, чтобы эффективно работать с ней. В ее поставку входят дополнительные модули для анализа геоинформационных данных 3D-Analyst и SpatialAnalyst.

Полнофункциональная оболочка географических информационных систем среднего класса ATLAS GIS содержит все обычные средства ввода, редактирования и печати/рисования карт, развитые презентационные средства (полное управление цветами и штриховками, создание и редактирование символов, многочисленные вставки, тематическое картографирование, бизнес-графику). Кроме того, она поддерживает работу с растровыми проектами (растровые подложки), позволяет группировать данные по географическому признаку, создавать буферные зоны, специальные средства обработки данных, основанные на библиотеке встроенных функций и операторов, развитые функции импорта и экспорта данных в другие форматы.

При разработке ГИС-приложений среда разработки Maplnfo Professional обеспечивает доступ к базам данных Oracle8i, хранилищам данных на сервере и управление ними, создание тематических карт, создание и запись SQL-запросов. Кроме того, эта среда разработки поддерживает растровые форматы, включая BMP, JPG, TIFF, MrSID, имеет универсальный преобразователь для форматов AutoDesk, ESRI и Intergraph. Начиная с версии 6, обеспечивается поддержка Интернета и трехмерных изображений, а также усовершенствованы средства геокодирования информации.

Еще одна популярная среда разработки AutoCAD Map обладает всеми инструментами программы AutoCAD 2000, а также специализированными возможностями для создания, отслеживания и производства карт и географических данных. Она позволяет работать с широким спектром файловых форматов и типов данных, обеспечивает возможность связи с базами данных и включает основные инструменты ГИС-анализа. Используя AutoCAD Map, можно связывать карты с ассоциативными базами данных, добавлять данные в карты и делать их более интеллектуальными, чистить карты, строить узловую, сетевую и полигональную топологию для анализа, создавать тематические карты с легендами, работать с существующими данными карты в других системах координат и файловых форматах, импортировать данные из других CAD и ГИС-систем, экспортировать данные в другие форматы, распечатывать карты и атласы.

Главными преимуществами российской системы GEOGRAPH-GE-ODRAW является функциональность и невысокая цена. Она состоит из трех основных модулей:

- Geograph (модуль конечного пользователя, фактически - это просмотрщик);

- Geodraw (векторный топологический редактор);

- Geoconstructor (средство разработки приложний).

Программный комплекс GeoCad Systems предназначен для разработки и последующего операционного обслуживания информационных систем целевого (преимущественно, кадастрового) назначения конечного пользователя. Модули управления базами данных этой системы реализованы в среде MS Access, предоставляющей пользователям мощный инструмент разработки и адаптации клиент-приложений системы.

Для обработки графической информации объектов (отображения метрических данных и их графического редактирования) в комплект модульной многоцелевой кадастровой системы Geocad System входит специализированный модуль CPS Graph. Он является неотъемлемой частью.

ГИС ИнГЕО - система, в которой пользователь сам может конструировать библиотеки любых векторных символов, линий, заливок. Это наиболее эффективная ГИС для создания топопланов масштаба 1:10000 - 1:500. Она имеет развитую инструментальную систему в технологии lnternet\lntranet, с помощью которой пользователь может самостоятельно строить сложнейшие реляционные таблицы семантических данных картографических объектов. ИнГЕО имеет мощную кадастровую надстройку - систему ИМУЩЕСТВО и систему МОНИТОРИНГ.

Система TopoL представляет собой универсальную ГИС, применимую во многих отраслях для решения разнообразных прикладных задач. Она позволяет выполнять весь комплекс работ по созданию, редактированию, анализу и использованию цифровых карт местности. Ее вариант TopoL-L предназначен для лесхозов и лесоустройства.

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

Развитие Интернета не обошло стороной и картографию. Так, картографическое ПО для Интернета позволяет публиковать готовые тематические карты во Всемирной сети. Серверные картографические приложения, разработанные для внедрения интерактивных карт в Интернете, имеют широкий набор картографических функций. Одним из таких программных продуктов, предназначенных для публикации и сопровождения картографической информации в Интернете, является MapXtreme - сервер картографических приложений, созданный корпорацией Maplnfo. Открытая архитектура MapXtreme работает с любым Web-сервером и не нуждается в дополнительных plugins, что позволяет использовать любые браузеры на ПК или рабочих станциях UNIX. Еще один продукт этой корпорации, MapXsite, позволяет достаточно легко встраивать в Web-страницы картографическую информацию.

Обзор C#

В данной дипломной работе для проектирования редактора карт использовался язык программирования C#. При этом были затронуты такие темы как объектно-ориентированное программирование, а так же использование графики и классов, с ними связанных.

Наиболее полно информация о классах описывается в книге «С# 2005 и платформа .Net 3.0» .Книгу отличает простой и доступный стиль изложения, изобилие примеров и множество рекомендаций по написанию высококачественных программ. Подробно рассматриваются такие вопросы, как основы языка программирования C#, организация среды .NET, работа с данными, написание Windows и Web-приложений, взаимодействие через сеть, создание Web служб и многое другое. Немалое внимание уделено проблемам безопасности и сопровождения кода. Тщательно подобранный материал позволит без труда разобраться с тонкостями использования Windows Forms и построения Web страниц [7].

Однако кроме основ построения кода, так же необходимо просматривать готовые решения. Это позволяет значительно повысить скорость разработки а так же повышает опыт программиста. Книга Климова А.П. «С# советы программистам» [8] представляет собой сборник советов, алгоритмов и готовых примеров программ на языке С# в среде MS Visual Studio 2005/2008 из различных областей: работа с формами и элементами управления, папками и файлами, мышью и клавиатурой, мультимедиа и графикой, использование технологий WMI и WSH, взаимодействие с MS Office и другими приложениями, работа в локальной сети и Интернете, особенности использования функций Windows API и др. Так же дополнительно в продолжение темы готовых решений представлена книга «Visual C# в задачах и примерах» [9]. Книга представляет собой сборник программ и задач для самостоятельного решения. Примеры различной степени сложности - от простейших до приложений работы с графикой и базами данных - демонстрирует назначение базовых компонентов, раскрывает тонкости разработки Windows Forms в Microsoft Visual C#. Уделено внимание использование технологии LINQ. Справочник, входящий в книгу содержит описание базовых компонентов, событий, исключений, и наиболее часто используемых функций.

Примеры работ с графическими приложениями освещено в книге Абрамяна М.Э «Visual C# на примерах» [10]. Книга содержит подробное описание 32 проектов, демонстрирующих различные аспекты создания Windows-приложений для платформы Net Framework. Рассматриваются оптимальные приемы разработки программ, управление событиями, механизм обработки исключений, особенности консольных и MDI приложений. Детально описываются основные компоненты библиотеки Windows Forms и классы, входящие в графическую библиотеку GDI+. Демонстрируются примеры работы с клавиатурой и мышью, а так же дополнительные возможности NET- приложений, в том числе реализация режима Drag&Drop, работа с реестром Windows и др.

Работу с файлами и файловыми системами прекрасно описал Михаил Фленов в своей книге «Библия C#». Книга имела такой значительный успех, что претерпела 2 издание. Материал книги сопровождается большим количеством практических примеров. Подробно описывается логика выполнения каждого участка программы. Во второе издание внесены исправления и добавлена глава по сетевому программированию [11].

Патентный поиск

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

Найденные результаты:

1) «Устройство, способ и программное обеспечение для обработки изображений с увеличением резкости» (RU 2456670 C2) - патент на полезную модель;

2) «Способ оценки качества изображения, способ формирования документа, компьютерный программный продукт, пользовательский интерфейс, файл данных и электронное устройство» (RU 2437154 С2) - патент на полезную модель;

3) «Устройство обработки информации, компьютерный программный продукт и способ управления отображением» (RU 2011134146A) - заявка на изобретение.

Выводы

Таким образом, при разработке диплома пришлось использовать как литературу картографии, так и литературу программирования. При этом были использованы стандарты рисования карт для оформления контекста диплома. Использование же довольно широкого контекста книг С# и .Net позволило использовать широкий арсенал для решений математических и графических задач.

Был проведен патентный поиск и найдено несколько патентов и заявка на изобретение на смежную тему.

Разработка программной системы

Разработка алгоритма программы

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

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

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

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

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

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

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

Свойства модулей:

- функциональная целостность и завершенность (каждый модуль реализует одну функцию, но реализует хорошо и полностью);

- автономность и независимость от других модулей (независимость работы модуля-преемника от работы модуля-предшественника; при этом их связь осуществляется только на уровне передачи/приема параметров и управления);

- эволюционируемость (развиваемость);

- открытость для пользователей и разработчиков (для модернизации и использования);

- корректность и надежность;

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

Свойства (преимущества) модульного проектирования алгоритмов:

- возможность разработки алгоритма большого объема (алгоритмического комплекса) различными исполнителями;

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

- облегчение тестирования алгоритмов и обоснования их правильности;

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

- уменьшение сложности разработки (проектирования) алгоритмов (или комплексов алгоритмов);

- наблюдаемость вычислительного процесса при реализации алгоритмов.

Тестирование алгоритма - это проверка правильности или неправильности работы алгоритма на специально заданных тестах или тестовых примерах - задачах с известными входными данными и результатами (иногда достаточны их приближения).

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

Пример. Для задачи решения квадратного уравнения ax2 + bx + c = 0 такими исключительными случаями, например, будут: 1) a = b = c = 0; 2) a = 0, b, c - отличны от нуля; 3) D = b2 - 4ac < 0 и др.

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

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

Рисунок 2.1 - Алгоритм программы

Разработка схемы и структуры программы

Структурное программирование -- методология разработки программного обеспечения, в основе которой лежит представление программы в виде иерархической структуры блоков. Предложена в 70-х годах XX века Э. Дейкстрой, разработана и дополнена Н. Виртом.

В соответствии с данной методологией любая программа представляет собой структуру, построенную из трёх типов базовых конструкций:

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

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

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

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

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

Разработка программы ведётся пошагово, методом «сверху вниз».

Сначала пишется текст основной программы, в котором, вместо каждого связного логического фрагмента текста, вставляется вызов подпрограммы, которая будет выполнять этот фрагмент. Вместо настоящих, работающих подпрограмм, в программу вставляются «заглушки», которые ничего не делают. Полученная программа проверяется и отлаживается. После того, как программист убедится, что подпрограммы вызываются в правильной последовательности (то есть общая структура программы верна), подпрограммы-заглушки последовательно заменяются на реально работающие, причём разработка каждой подпрограммы ведётся тем же методом, что и основной программы. Разработка заканчивается тогда, когда не останется ни одной «затычки», которая не была бы удалена. Такая последовательность гарантирует, что на каждом этапе разработки программист одновременно имеет дело с обозримым и понятным ему множеством фрагментов, и может быть уверен, что общая структура всех более высоких уровней программы верна. При сопровождении и внесении изменений в программу выясняется, в какие именно процедуры нужно внести изменения, и они вносятся, не затрагивая части программы, непосредственно не связанные с ними. Это позволяет гарантировать, что при внесении изменений и исправлении ошибок не выйдет из строя какая-то часть программы, находящаяся в данный момент вне зоны внимания программиста.

Теорема о структурном программировании. Любую схему алгоритма можно представить в виде композиции вложенных блоков begin и end, условных операторов if, then, else, циклов с предусловием (while) и может быть дополнительных логических переменных (флагов).Эта теорема была сформулирована итальянскими математиками К. Бомом и Дж. Якопини в 1966 году и говорит нам о том, как можно избежать использования оператора перехода goto.

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

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

Функциональное программирование предполагает обходиться вычислением результатов функций от исходных данных и результатов других функций, и не предполагает явного хранения состояния программы. Соответственно, не предполагает оно и изменяемость этого состояния (в отличие от императивного, где одной из базовых концепций является переменная, хранящая своё значение и позволяющая менять его по мере выполнения алгоритма).

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

Рассмотрим ранее представленный алгоритм программы. Следует отметить, что структурная схема вовсе не обязательно повторяет функционально алгоритм программы. Допустим, реализация проверки и загрузки входных файлов можно реализовать как в 1 функции, так и 2 разных. Так как количество операций при

загрузке файлов невелико, реализуем процесс загрузки картинок в одной функции.

Заложим в нее обязательно ряд проверок и действий. Среди них:

- является ли файл графическим или нет (по расширению);

- наличие более 1 файла в папке;

- создание массива объектив типа Image.

Следующим этапом логично было бы вывести результат на экран. Так как согласно логике приложений языка С# мы должны все выводимые графические объекты помещать в функцию On Paint, необходимо продумать механизм вывода не только результата загрузки картинок из файла, но и так же всех последующих результатов программы. Для этого в функцию On Paint поместим ряд проверок, которые будут реагировать на тип выводимого результата. На рисунке 2.2 представлена структурная схема программы. Наша дальнейшая задача - проанализировать картинки и выстроить их на экране в нужном порядке. Так как эта задача достаточно сложна, то реализуем ряд вспомогательных функций, которые, однако, на структурной схеме отображать не будем.

Рисунок 2.2 - Структурная схема программы

Разработка алгоритмов отдельных функций

Сравнение пикселей

Так как 2 пикселя при сравнении имеют совершенно одинаковые размерные (высота и ширина) параметры, то для сравнения можем взять параметры цвета и прозрачность. Так как параметров цвета 3 - R, G, B, для сравнения примем 4 параметра. Согласно коду

public bool PixelAnalis(Color a, Color b, int percent)

{

bool like = false; //

bool like1 =false; // прозрачность

bool like2 = false; //

bool like3 = false; //

bool like4 = false; //

double res = 0.0;

if (a.A >= b.A)

{

res = (double)b.A / (double)a.A * 100.0;

if ((int)res >= percent)

like1 = true;

}

else {

res = (double)a.A / (double)b.A * 100.0;

if ((int)res >= percent)

like1 = true;

}

if (a.B >= b.B)

{

res =(double) b.B /(double) a.B * 100.0;

if ((int)res >= percent)

like2 = true;

}

else

{

res = (double)a.B / (double)b.B * 100.0;

if ((int)res >= percent)

like2 = true;

}

if (a.G >= b.G)

{

res = (double)b.G / (double)a.G * 100.0;

if ((int)res >= percent)

like3 = true;

}

else

{

res = (double)a.G / (double)b.G * 100.0;

if ((int)res >= percent)

like3 = true;

}

if (a.R >= b.R)

{

res = (double)b.R / (double)a.R * 100.0;

if ((int)res >= percent)

like4 = true;

}

else

{

res = (double)a.R / (double)b.R * 100.0;

if ((int)res >= percent)

like4 = true;

}

if (like1 && like2 && like3 && like4) like = true;

return like;

}

В функции происходит получение 4 ответов, совпадают ли они с определенным процентом, который мы задали ранее как входящий параметр, и выдается результат как суммарное логическое «И» (логическое умножение). Если хотя бы 1 из параметров не совпал, а соответственно не выполнено условие попадания в заданный интервал, можно с заданным процентом совпадения считает пиксели не совпадающими.

Сравнение «картин»

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

Размещено на http://www.allbest.ru

Размещено на http://www.allbest.ru

Рисунок 2.3 - Картины в сравнении

Затем необходимо сформировать массив совпадений. Количество «ответов» в массиве будет равно количеству пикселей. Соответственно, если сравнивать каждую сторону первой картины с 4 сторонами второй картины, а так же все остальные стороны, получим массив совпадений из 16 строк. Примем обход сторон по часовой стрелке. Обход сторон представлен на рисунке 2.4.

Размещено на http://www.allbest.ru

Размещено на http://www.allbest.ru

Рисунок 2.4 - Порядок обхода пикселей

Соответственно массив совпадений будет выглядеть как набор булевских значений). Массив совпадений пикселей представлен на рисунке 2.5.

Размещено на http://www.allbest.ru

Размещено на http://www.allbest.ru

Рисунок 2.5 - Массив совпадений пикселей

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

Рисунок 2.6 - Схематичный массив совпадений пикселей

Данный массив содержит суммарное совпадение пикселей 2 картин. Исходя из рисунка, мы не можем сказать сразу, какая все же сторона наиболее совпадает. Соответственно мы должны выяснить максимальное число для 1 стороны и запомним этот результат. Ответом будет массив из 4 значений, который возвращает максимальное значение по каждой стороне и представлено на рисунок 2.7. Так же стоит отметить, что стороны кубика нумеруются с «1».

Рисунок 2.7 - Суммарный результат обработки массива

Однако нас не интересуют значения. Нас интересуют порядковые номера сторон, с которыми произошло совпадение. Для этого анализируем, используя предыдущий массив, какая сторона соответствует данным числам. Результаты записываем в массив результатов функции и представлены на рисунке 2.8.

Рисунок 2.8 - Результат работы функции

Далее проанализируем код отдельно-взятых функций программы.

public int[] AnalisKubov(System.Drawing.Bitmap image1, System.Drawing.Bitmap image2, int percent)

Функция в качестве входящих параметров получает две «картины» или 2 объекта типа System.Drawing.Bitmap а так же процент совпадения сторон друг с другом. Под процентом совпадения сторон понимается отношения количества совпавших пикселей к общему количеству пикселей.

Color[][] im1 = new Color[4][]; // 1 массив

Color[][] im2 = new Color[4][]; // 2 массив

im1[0] = new Color[image1.Width];

im1[1] = new Color[image1.Height];

im1[2] = new Color[image1.Width];

im1[3] = new Color[image1.Height];

im2[0] = new Color[image2.Width];

im2[1] = new Color[image2.Height];

im2[2] = new Color[image2.Width];

im2[3] = new Color[image2.Height];

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

for (int i = 0; i < im1.Length; i++)

{

for (int j = 0; j < im1[i].Length; j++)

{

if (i == 0) im1[0][j] = image1.GetPixel(j, 1);

if (i == 1) im1[1][j] = image1.GetPixel(image1.Width - 1, j);

if (i == 2) im1[2][j] = image1.GetPixel(j, image1.Height - 1);

if (i == 3) im1[3][j] = image1.GetPixel(1, j);

}

}

for (int i = 0; i < im2.Length; i++)

{

for (int j = 0; j < im2[i].Length; j++)

{

if (i == 0) im2[0][j] = image2.GetPixel(j, 1);

if (i == 1) im2[1][j] = image2.GetPixel(image2.Width - 1, j);

if (i == 2) im2[2][j] = image2.GetPixel(j, image2.Height - 1);

if (i == 3) im2[3][j] = image2.GetPixel(1, j);

}

}

В дальнейшем мы эти массивы заполняем . То есть получаем последний пиксель стороны картины с помощью функции GetPixel.

bool[][] res = new bool[16][];

for (int i = 0; i <= 15; i++)

{

int k = 0;

if (i <= 3) k = im1[0].Length;

if (i > 3 && i <= 7) k = im1[1].Length;

if (i > 7 && i <= 11) k = im1[2].Length;

if (i > 11 && i <= 15) k = im1[3].Length;

res[i] = new bool[k];

}

Результаты совпадений поместим в массив. Так как будет сравниваться 16 сторон, то полученный результат поместим в массив типа bool [16]. Размерность массива будет соответствовать размерности массива с пикселями.

int m = 0; //переменная для счета количества проходов

for (int i = 0; i < im1.Length; i++) // проход по граням 1 кубика

{

for (int k = 0; k < im1.Length; k++) // проход по граням 2 кубика

{

if (im1[i].Length == im2[k].Length)

{

for (int j = 0; j < im1[i].Length; j++) // проход по пикселям

{

if (PixelAnalis(im1[i][j], im2[k][j], Percent)) res[m][j] = true;

}

}

m++;

}

}

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

MassRes = new int[4]; // этот массив - массив совпадений

int[] TempMass = new int[16];

int count = 0;

for (int i = 0; i <= 15; i++)

{

for (int j = 0; j < res[i].Length; j++)

{

if (res[i][j]) count++;

}

TempMass [i] = count;

count = 0;

}

Здесь мы создаем временный массив TempMass, который будет содержать суммарную информацию сравнений сторон картин.

Далее заполним массив, состоящий из 4 элементов, каждый из которых соответствует стороне.

int[] Max = new int[4];

for (int i = 0; i <= 15; i++)

{

if (i <= 3)

{

if (TempMass[i] > Max[0])

{

Max[0] = TempMass[i];

if (Max[0] > 0 & TempMass[i] > 0)

{

if ((int)(((double)Max[0] / (double)res[i].Length) * 100) >= percent) MassRes[0] = i + 1;

};

} //1 сторона кубика

}

if ((i > 3 & i <= 7))

{

if (TempMass[i] >= Max[1])

{

Max[1] = TempMass[i];

if (Max[1] > 0 & TempMass[i] > 0)

{

if ((int)(((double)Max[1] / (double)res[i].Length) * 100) >= percent) MassRes[1] = i - 3;

};

} //2 сторона кубика

}

if ((i > 7 & i <= 11))

{

if (TempMass[i] >= Max[2])

{

Max[2] = TempMass[i];

if (Max[2] > 0 & TempMass[i] > 0)

{

if ((int)(((double)Max[2] / (double)res[i].Length) * 100) >= percent) MassRes[2] = i - 7;

};

}

//3 сторона кубика

}

if ((i > 11 & i <= 15))

{

if (TempMass[i] >= Max[3])

{

Max[3] = TempMass[i];

if (Max[3] > 0 & TempMass[i] > 0)

{

if ((int)(((double)Max[3] / (double)res[i].Length) * 100) >= percent) MassRes[3] = i - 11;

};

}//4 сторона кубика

}

}

В данном коде мы сначала проверяем, какая из сторон учувствует в сравнении. Например, if (i <= 3) - это первая сторона. Значит, результат мы запишем в массив с нулевым индексом. Так же мы должны проверить, максимальное ли число мы записываем или нет. Это максимальное число мы держим во временном массиве Max. И элемент Max[0] соответствует 1 максимальному числу массива.

Так же этот массив мы используем для нахождения индекса элемента, с каким совпала соответствующая сторона картины (код ниже).

for (int i = 0; i < 4; i++)

{

if ( Max[i] > maxtemp)

{

maxtemp = Max[i];

}

}

for (int i = 0; i < 4; i++)

{

if (Max[i] > (int) (((double)maxtemp) * (((double)Percent1) / 100)))

{

max1[l] = Max[i];

l++;

}

}

// ищем номера совпавших элементов

int j = 3;

l = 0;

int k=0;

for (int i = 0; i < TempMass.Length;i++ )

{

if ((max1[k]> 0) & (max1[k] == TempMass[i])) // счетчик элементов массива max1

{

if (i <= 3) \

{

MassRes[0] = i + 1; TempMass1[0] = max1[k];

}

if (i > 3 && i <= 7)

{

MassRes[1] = i - 3;TempMass1[1] = max1[k];

}

if (i > 7 && i <= 11)

{

MassRes[2] = i - 7; TempMass1[2] = max1[k];

}

if (i > 11 && i <= 15)

{

MassRes[3] = i - 11; TempMass1[3] = max1[k];

}

if(k < 3) k++; // это заплатка, если неверно выставлены проценты

}

if (j == i) // счетчик сторон

{

l++;

j = j + 4;

}

}

Одной из проблем при поиске совпавших сторон является наличие нескольких совпадений. Однако, как показала практика, при наличии совпавших сторон более 1, их численное значение (количество совпавших пикселей) значительно меньше(на 30-40 процентов). Следовательно, найдя максимальное значение из всех совпавших сторон, мы можем «отсечь» лишние стороны, которые являются не более чем цифровым случайным совпадением.

Анализ массива картин

Существует некий массив наборов картин, которые необходимо сравнить. Сравнение полностью картин необходимость отсутствует. Достаточно сравнить их «края». Таким образом, можно обнаружить, какие из краев совпадают. Решить эту задачу можно 2 способами:

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

Б) все картины сравнивать по очереди, затем получить массив ответов сравнения картин (используется в этом дипломе).

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

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

Рисунок 2.9 - Последовательность действий при решении задачи сравнений картин

Получение массива совпадений есть последовательный перебор каждой картины в сравнении с остальными. Массив совпадений представлен на рисунке 2.10.

Рисунок 2.10 - Порядок сравнений картин

Возьмем для примера 4 картины. То есть, чтобы сравнить их, необходимо:

А) 1 сравнить с 2,3,4.

Б) 2 сравнить с 3 и 4.

В) 3 сравнить с 4.

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

Размещено на http://www.allbest.ru

Размещено на http://www.allbest.ru

Рисунок 2.11 - Массив результатов совпадений сторон

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

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

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

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

Рисунок 2.12 - Система условных координат для сборки пазла

После сборки пазла необходимо переместить в начало координат. Делается это для упрощения расчета реальных координат. Для этого находится квадратик с минимальной условной координатой по Х и У. Затем начало координат переносим в точку (0,0). От всех условных координат отнимаем эти значения. При этом перенос выглядит как на рисунке 2.13.

Рисунок 2.13 - Перенос собранного пазла в начало координат

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

Выводы

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

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

Обоснование технических приемов программирования

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

Язык С# и связанную с ним среду .NET Framework можно без преувеличения назвать самой значительной из предлагаемых в настоящее время технологий для разработчиков. Среда .NET является такой средой, которая была создана для того, чтобы в ней можно было разрабатывать практически любое приложение для запуска в Windows, а С# является языком программирования, который был специально создан для использования в .NET Framework. Например, с применением С# и .NET Framework можно создавать динамические веб-страницы, приложения Windows Presentation Foundation, веб-службы XML, компоненты для распределенных приложений, компоненты для доступа к базам данных, классические настольные приложения Windows и даже клиентские приложения нового интеллектуального типа, обладающие возможностями для работы в оперативном и автономном режимах. В настоящем дипломе рассматривается версия .NET Framework 4. Не стоит поддаваться заблуждению из-за наличия в названии Framework слова "NET" и думать, что данная среда предназначена только для создания приложений, ориентированных на Интернет. Слово "NET" здесь является лишь показателем того, что, по мнению Microsoft, распределенные приложения, в которых обработка распределяется между клиентом и сервером, являются шагом вперед. Однако важно понимать, что С# представляет собой язык, предназначенный не только для написания приложений, способных работать в Интернете и в сети. Он предоставляет средства для кодирования практически любого типа программного обеспечения или компонентов для платформы Windows. Язык С# и среда .NET привели к революционным изменениям в способе написания разработчиками программ и сделали программирование приложений для Windows гораздо более простым, чем когда-либо. Так что же такого важного в .NET и С#?

Для понимания важности .NET не помешает вспомнить о многих технологиях Windows, которые появились в последние примерно 18 лет. Хотя на первый взгляд все они могут выглядеть довольно разными, на самом деле все операционные системы Windows, начиная с Windows 3.1 (которая вышла в 1992 г.) и заканчивая Window 7 и Windows Server 2008 R2, в основе своей имеют один и тот же хорошо знакомый API-интерфейс Windows.

По мере появления новых версий Windows в этот API-интерфейс добавлялось много новых функций, но это был скорее процесс совершенствования и расширения API-интерфейса, а не его замена. То же самое можно сказать и о многих других технологий и каркасах, которые применялись для разработки программного обеспечения, ориентированного на Windows. Например, технология COM (Component Object Model - объектная модель компонентов) первоначально называлась технологией OLE (Object Linking and Embedding - связывание и внедрение объектов) и по большей части представляла собой средство для связывания различных типов документов Office, например, для размещения в документе Word таблицы Excel. После этого она эволюционировала в технологию СОМ, затем в DCOM (Distributed СОМ - распределенная объектная модель компонентов) и, наконец, в сложную технологию СОМ+, которая стала основой для обеспечения связи между всеми компонентами, а также реализации транзакций, служб обмена сообщениями и организации пула объектов.

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

При каждом совершенствовании какой-нибудь технологии и добавлении в нее новых возможностей, из-за необходимости в наличии обратной совместимости она получается немного сложнее, чем была раньше. Из-за этого со временем стало ясно, что нужно что-то менять. В Microsoft не могли до бесконечности расширять одни и те же языки и средства для разработки, постоянно делая их все более и более сложными для удовлетворения конфликтующих между собой потребностей в поддержке новейшего оборудования и обеспечении обратной совместимости с тем, что было в ходу, когда Windows впервые стала популярной в начале 90-х годов прошлого века. Настал момент начать с чистого листа и создать простой, но при этом совершенный набор языков, сред и средств разработки, который бы позволял разработчиками легко писать современное программное обеспечение. Для этого первоначально и были предназначены язык С# и среда .NET. Грубо говоря, .NET представляет собой платформу или API-интерфейс для программирования на платформе Windows. Вместе с .NET Framework язык С# был разработан с нуля специально для работы в .NET, а также для объединения всех достижений, которые были сделаны в средах разработки, и всех принципов объектно-ориентированного программирования, которые были выведены за последние 25 лет.

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

В настоящее время связь между программными компонентами в Windows осуществляется практически полностью за счет использования технологии СОМ. С учетом этого в .NET Framework предлагается и возможность для создания оболочек вокруг существующих компонентов СОМ и тем самым позволения компонентам .NET взаимодействовать с ними.

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

Независимость от языка. В .NET код, написанный на любом языке - Visual Basic, C# или управляемом C++ - компилируется в код на промежуточном языке (Intermediate Language). Это делает языки способными к взаимодействию в невиданной до сих пор мере.

Усовершенствованная поддержка для создания динамических веб-страниц. Хотя в классической технологии ASP предлагалась довольно высокая степень гибкости, ее все равно не хватало из-за необходимости использования интерпретируемых сценарных языков, а отсутствие объектно-ориентированного дизайна часто приводило к получению довольно запутанного кода ASP. В .NET предлагается интегрированная поддержка для создания веб-страниц с помощью ASP.NET. В случае применения ASP.NET код создаваемых страниц поддается компиляции и может быть написан на любом поддерживающем .NET языке высокого уровня, например, С# или Visual Basic 2010. В новой версии .NET эта поддержка улучшилась еще больше, сделав возможным применение новейших технологий вроде Ajax и jQuery.

Эффективный доступ к данным. Набор компонентов .NET, известный под общим названием ADO.NET, позволяет получать эффективный доступ к реляционным базам данных и многим другим источникам данных. Также предлагаются компоненты, позволяющие получать доступ к файловой системе и каталогам. В частности, в .NET встроена поддержка XML, позволяющая манипулировать данными, импортируемыми и экспортируемыми на платформы, отличные от Windows.

Разделение кода. В .NET был полностью переделан способ разделения кода между приложениями за счет введения понятия сборки вместо традиционных библиотек DLL. Сборки обладают формальными средствами для управления версиями и допускают одновременное существование рядом нескольких различных версий сборок.

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

Установка с нулевым воздействием. Сборки бывают двух типов: разделяемые и приватные. Разделяемые сборки представляют собой обычные библиотеки, доступные всему программному обеспечению, а приватные сборки предназначены для использования только с определенными программами. Существующие программы все равно будут продолжать работать, потому что в .NET предусмотрена возможность для работы с существующим программным обеспечением. Приватные сборки являются полностью самодостаточными, поэтому процесс их установки выглядит просто. Никакие записи в системный реестр не добавляется; все нужные файлы просто размещаются в папке файловой системы. В .NET предлагается полностью интегрированная поддержка для разработки веб-служб таким же простым образом, как и приложений любых других типов.


Подобные документы

  • Особенности алгоритмов, критерии качества. Создание и применение программного продукта на языке Delphi. Тип операционной системы. Внутренняя структура программного продукта. Руководство пользователя и программиста, расчет себестоимости и цены программы.

    дипломная работа [1,5 M], добавлен 12.06.2009

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

    курсовая работа [6,6 M], добавлен 11.01.2017

  • Информационное обеспечение задачи автоматизации учета. Программное обеспечение задачи автоматизации учета. Расчет технико-экономической эффективности программного продукта по учету пластиковых карт. Расчет затрат на разработку программного модуля.

    дипломная работа [2,1 M], добавлен 10.02.2018

  • Создание программного продукта, представляющего моделирование на компьютере логнормального распределения, определение вероятностной оценки стоимости актива. Описание работы программного продукта. Работа с графиками, таблицами, математическими функциями.

    курсовая работа [742,7 K], добавлен 08.01.2009

  • Разработка программного продукта для планирования автобусного движения в районе. Возможность добавлять, удалять новые рейсы, вносить изменения в имеющиеся, выдавать справочную информацию. Приложение, написанное на языке С++ с использованием библиотек MFC.

    курсовая работа [453,7 K], добавлен 05.02.2013

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

    курсовая работа [2,0 M], добавлен 11.01.2014

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

    курсовая работа [5,3 M], добавлен 31.05.2014

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

    дипломная работа [775,9 K], добавлен 20.03.2012

  • Характеристика и особенности системы Pascal ABC 3.0.1. Обучение программированию школьников и студентов младших курсов. Создание и отладка программного продукта для поиска документа, книги в библиотеке или в архиве, получения информации об издании.

    курсовая работа [3,4 M], добавлен 11.09.2011

  • Характеристика программного продукта и стадий разработки. Расчет затрат на разработку и договорной цены, эксплуатационных расходов, связанных с использованием нового программного продукта. Оценка конкурентоспособности. Изучение, оценка рыночного спроса.

    курсовая работа [139,0 K], добавлен 22.09.2008

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.