Вход

Разработка и программная реализация тематического парсера сайтов

Рекомендуемая категория для самостоятельной подготовки:
Дипломная работа*
Код 272182
Дата создания 20 марта 2015
Страниц 86
Мы сможем обработать ваш заказ (!) 20 декабря в 12:00 [мск]
Файлы будут доступны для скачивания только после обработки заказа.
4 860руб.
КУПИТЬ

Описание

В данной дипломной работе рассмотрена разработка и создание парсера для новостных сайтов. Описан подробно процесс реализации программы парсера,который опрашивает заданные сайты, отбирает заданную информацию (главные новости), и сохраняет ее в html-файл.
Защита в 2013г, Волгодонский институт сервиса,специалист, оценка -отлично.
...

Содержание

Содержание 3
Введение 5
1 Основные понятия и задачи парсинга 7
1.1 Основные сферы применения парсера 7
1.2 Синтаксический анализ (парсинг) 15
1.3 Использование семантических сетей в парсинге 17
1.4 Регулярные выражения 22
1.5 Синтаксис регулярных выражений 24
1.6 Инструмент анализа Html-страниц HtmlAgilityPack 28
2 Обзор программных средств реализации парсера 29
2.1 Среда разработки Visual Studio .NET 29
2.2 Язык программирования С# 37
2.3 Средства ввода-вывода и пространство имен System.IO 39
2.4 Сетевые возможности и использование Internet 44
2.5 Использование регулярных выражений в .NET 46
3 Программная реализация тематического (новостного) парсера 50
3.1 Постановка задачи на дипломное проектирование 50
3.2 Алгоритмы работы программы 51
3.2 Загрузка страницы 52
3.3 Обработка исключений55



3.4 Извлечение данных с помощью регулярных выражений 58
3.5 Тестирование и результаты работы программы 63
4 Информационная безопасность 66
4.1 Законодательные вопросы информационной безопасности 66
4.2 Анализ структуры информационной системы организации. 70
4.3 Средства защиты и контрмеры по снижение рисков 71
5 Экономическая часть 76
5.1 Расход трудоемкости разработки программного продукта 76
5.2 Расход на оплату труда разработчика программы 78
5.3 Общие затраты на создание программного продукта 79
5.4 Целесообразность создания продукта 80
Выводы и рекомендации 81
Библиографический список 82
Приложение А. Исходный код программы

3.4 Извлечение данных с помощью регулярных выражений
Из спарсенной страницы новостей нужно с помощью регулярных вы-ражений выбрать только название новости и ссылку на нее. Парсить одни только url'и для данной задачи нет смысла, как и скачивать заранее все новости какого-либо раздела более подробно.
Как уже говорилось неоднократно выше, наибольшие усилия разработчика требуются по составлению правильных регулярных выражений. Регулярные выражения должны извлечь только нужные данные со страницы, не затрагивая остальных.
В разделе 1.5 был рассмотрен синтаксис регулярных выражений, а в 2.5 – их использование в .NET, поэтому подробно код, показанный на рис. 3.5 можно не рассматривать.
Рисунок 3.5 – Поиск соответствий шаблону

Как видно из рис. 3.5, в цикле проверяются строки на соответствие шаблону (match3) и найденные соответствия помещаются в файл.
Рассмотрим регулярное выражение для сайта Лента.ру:

Regex regex3 = new Regex(@"\n");

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





\S+ обозначает, что любой символ, кроме пробельных, может повто-ряться несколько раз. Далее любой символ, кроме перевода строки может повторяться 0 или более раз – (.)*. Затем следует завершающий тег и перевод строки \n.
Схематично соответствие искомой строки шаблону представлено на рис. 3.6.
Рисунок 3.6 – Соответствие искомой строки шаблону

Результат обработки главной страницы приведен на рис.3.7.
Рисунок 3.7 – Результат обработки главной страницы lenta.ru

Почему так происходит? Например, код Ленты.ру (рис.3.8) отличается от кода РосБизнесКонсалтинг (рис.3.9). Поэтому для каждого сайта нужно изменять регулярное выражение с учетом особенностей конкретного ресурса. Поэтому данная задача очень распространена во фрилансе.
Рисунок 3.8 – Лента.ру и ее исходный код

Рисунок 3.9 – РосБизнесКонсалтинг и его исходный код
Еще одна сложность – это ошибки исходного кода веб-страницы, до-пущенные ее разработчиками: незакрытые теги, неработающие или некор-ректные ссылки и т.д.
Также были написаны шаблоны поиска (регулярные выражения) для парсинга страницы крупного информационного агентства РосБизнесКонсалтинг и новостного портала Ростовской области 161.ru, схемы которых представлены на рис. 3.10 и рис.3.11 соответственно.

Рисунок 3. 10 – Шаблон для ленты новостей РосБизнесКонсалтинг

Для парсинга РосБизнесКонсалтинга сделано два шаблона – один, чтобы выбрать главные новости, другой – ленту новостей. Шаблон для главной страницы:
"

Введение

Парсинг контента очень популярен, при этом он применяется как владельцами небольших и развивающихся сайтов, так и крупными компаниями в целях сбора контента, отслеживания тематических статей, баз для рерайтинга. Даже крупные компании, такие как Google, для новостей используют, в основном информацию со специализированных порталов информационных агентств – Лента.ру, РИА Новости, РБК, Утро.ру и т.д.
Хотя иногда некоторые сайты могут закрывать свой контент, именно парсинг новостей, согласно Статье 1259. «Объекты авторских прав» Граж-данского кодекса РФ, является вполне законным. Согласно ГК РФ, сообщения о событиях и фактах, имеющие исключительно информационный характер (сообщения о новостях дня, программы телепередач, расписания движения транспортных средств и тому подобное), не являются объе ктами авторских прав. Однако является правильным ссылаться на информационный источник. К тому же, многие сайты, публикующие новости, размещают у себя только анонс основных новостей, оставляя ссылки на подробную информацию в источнике.

Фрагмент работы для ознакомления

Раньше код часто компилировался в несколько приложений, каждое из которых предназначалось для конкретной операционной системы и архитектуры ЦП. Такой подход обычно применялся в качестве одного из средств оптимизации (например, для принуждения кода работать быстрее на базе микросхем AMD), но в некоторых случаях играл даже критическую роль (например, при необходимости сделать так, чтобы приложения могли работать как в средах Win9x, так и в средах WinNT/2000). Сейчас в нем нет никакой необходимости, поскольку JIT-компиляторы используют MSIL-код, который не зависит ни от типа компьютера, ни от типа операционной системы, ни от типа ЦП. Существуют несколько JIT-компиляторов, каждый из которых рассчитан на конкретную архитектуру, и при создании требуемого родного кода применяться будет только тот из них, который подходит в данном случае[18]. Основное достоинство этого механизма состоит в том, что он требует гораздо меньшего количества усилий со стороны разработчика: на самом деле он даже позволяет ему вообще не думать о касающихся специфики системы деталях и концентрировать все внимание на более интересных функциональных возможностях кода. Сборки. При компиляции приложения создаваемый MSIL-код сохраняется в сборке (assembly). С состав сборок входят как исполняемые файлы приложений, которые имеют расширение . ехе и могут запускаться прямо в среде Windows безо всяких других программ, так и файлы библиотек, которые имеют расширение . dll и предназначены для использования другими приложениями. Помимо MSIL-кода в сборки еще также включается метаинформация (т.е. информация о содержащихся в сборке данных, также называемая метаданными) и файлы необязательных ресурсов (файлы дополнительных данных, которые могут применяться в MSIL коде, вроде звуковых файлов и файлов изображений). Метаинформация делает сборки полностью самоописательными. Благодаря ей, для использования сборок больше никакой информации не требуется. Это означает исключение вероятности возникновений ситуаций, вроде невозможности добавления требуемых данных в системный реестр и тому подобного, каковые часто представляли проблему при выполнении разработки с помощью других платформ. Из-за этого развертывание приложений часто сводится просто к копированию файлов в каталог на удаленном компьютере. Поскольку никакой дополнительной информации на целевых системах не требуется, далее пользователь может просто запускать исполняемый файл из этого каталога и (при условии, что в системе установлена CLR-среда .NET) приступить к работе с приложением [16]. CLR-среда, Common Language Runtime (CLR), представляет собой систему, которая управляет выполнением пользовательских программ. CLR – это составная часть .NET Framework , которая делает программы переносимыми, поддерживает многоязыковое программирование и обеспечивает безопасность.Конечно, сохранять все необходимое для запуска приложения в одном месте вовсе необязательно. Разработчик может писать и какой-нибудь код, выполняющий задачи, требуемые нескольким приложениям. В подобных ситуациях зачастую удобнее помещать допускающий многократное использование код в то место, к которому смогут получать доступ все приложения. В .NET Framework таким местом является глобальный кэш сборок (Global Assembly Cache – GAC). Помещение в него кода осуществляется очень просто, а именно – копированием содержащей нужный код сборки в каталог, где расположен этот кэш. Управляемый код.Роль CLR-среды не заканчивается после компиляции кода в MSIL-код и преобразования его JIT-компилятором в родной код. Код, который пишется с помощью .NET Framework , при выполнении (т.е. на этапе, который обычно называется временем выполнения) находится под управлением CLR-среды. Это означает, что CLR-среда следит за приложениями, осуществляя необходимое управления памятью, обеспечивая безопасность, позволяя выполнять межъязыковую отладку и т.д. Приложения, которые во время выполнения не попадают под контроль CLR-среды, называются неуправляемыми (unmanaged), и некоторые языки могут применяться для написания таких приложений, например, с целью доступа к низкоуровневым функциям операционной системы. В языке С#, однако, разрешается писать только код, выполняющийся в управляемой среде, т.е. использовать управляемые средства CLR и позволять среде .NET самостоятельно обрабатываться любые операции взаимодействия с операционной системой.2.2 Язык программирования С#С# является объектно-ориентированным языком программирования и поддерживает полиморфизм, перегрузку операторов, делегаты, атрибуты, события, свойства, обобщённые типы и методы. Язык С# – один из тех языков, которые можно использовать для создания приложений, подлежащих запуску в .NET CLR. Он эволюционировал из языков С и C++ и был создан Microsoft специально для работы с платформой .NET. Благодаря тому, что язык С# разрабатывался недавно, в его состав вошли многие из наилучших функциональных возможностей других языков, но без присущих им проблем [16].Язык С# представляет собой лишь один из многих языков, доступных для разработки .NET-приложений, но, несомненно, является наилучшим из них. Его главное преимущество состоит в том, что он единственный с самого начала разрабатывался специально для .NET Framework и из-за этого может быть главным кандидатом на использование в тех версиях .NET, которые переносятся на другие операционные системы. Чтобы языки вроде .NET-версии Visual Basic оставались насколько возможно похожими на своих предшественников и при этом совместимыми с CLR, некоторые средства из библиотеки кода .NET в них поддерживаются не полностью. В отличие от них, С# позволяет пользоваться каждым из тех средств, которые предлагаются в этой библиотеке. В состав последней версии .NET было добавлено несколько улучшений для языка С#, частично по просьбам конечных разработчиков, что существенно увеличивает его мощность.Средствами языка С# можно реализовать различные приложения. Актуальны задачи работы с базами данных. Примером может служить востребованная задача фриланса – создание на С# программы для поиск и оценка близости документов в базе данных, для оценки удачного рерайтинга. Основные направления [18]:Приложения Windows. К приложениям этого типа относятся приложения, которые имеют знакомый пользователям Windows внешний вид и поведение, как, например, приложение Microsoft Office. Web-приложения. К приложениям этого типа относятся Web-страницы, вроде тех, что могут просматриваться посредством любого Web-браузера. В состав .NET Framework входит мощная система для генерации Web-содержимого динамическим образом, обеспечивающая персонализацию, безопасность и многое другое. Называется она ASP.NET (Active Server Pages .NET), и благодаря ей, язык С# можно использовать для создания приложений ASP.NET с применением Web-форм. Web-службы. Этот тип является новым и интересным способом для создания разнообразных распределенных приложений. С помощью Web-служб через Internet можно обмениваться практически любыми данными, используя тот же самый простой синтаксис, независимо от того, какой язык применялся для создания Web-службы, и того, на какой системе она расположена. К последней разновидности относится и разрабатываемая в дипломной работе программа для парсинга новостей с различных новостных порталов. Для ее реализации используются пространства имен System.NET и System.NET. Sockets, которые предлагают несколько вариантов для программирования сетевой передачи, описанные дальше. 2.3 Средства ввода-вывода и пространство имен System.IOДля реализации парсера нужно рассмотреть средства ввода-вывода, записи полученных данных в файл или в переменную. В С# используется система ввода-вывода и классы, определенные средой .NET Framework.Сопрограммы выполняют операции ввода-вывода посредством потоков. Поток (stream) – это абстракция, которая либо синтезирует информацию, либо потребляет ее. Поток связывается с физическим устройством с помощью С#-системы ввода-вывода. Характер поведения всех потоков одинаков, несмотря на различные физические устройства, с которыми они связываются. Следовательно, классы и методы ввода-вывода можно применить ко многим типам устройств. Например, методы, используемые для записи данных на консольное устройство, также можно использовать для записи в дисковый файл [17].Байтовые и символьные потоки. На самом низком уровне все С#-системы ввода-вывода оперируют байтами. Однако байтовые потоки не вполне подходят для обработки текстового (ориентированного на символы) ввода-вывода. Для решения этой проблемы в С# определен ряд классов, которые преобразуют байтовый поток в символьный, выполняя byte-char- и char-byte-перевод автоматически.Тремя встроенными потоками, доступ к которым осуществляется через свойства Console. In, Console.Out и Console.Error, могут пользоваться все программы, работающие в пространстве имен System. Свойство Console.Out относится к стандартному выходному потоку. По умолчанию это консоль, однако эти потоки могут быть перенаправлены на любое совместимое устройство ввода-вывода. Стандартные потоки являются символьными. Следовательно, эти потоки считывают и записывают символы. В С# определены как байтовые, так и символьные классы потоков. 2.3.1 Пространство имен System.IOВсе классы потоков определены в пространстве имен System.IO. Чтобы иметь возможность использовать эти классы, в начало программы необходимо включить следующую инструкцию: using System.IO;Пространство имен System.IO содержит типы, позволяющие осуществлять чтение и запись в файлы и потоки данных, а также типы для базовой поддержки файлов и папок.Рассмотрим основные классы, которые System.IO включает в себя.Центральную часть потоковой С#-системы занимает класс System. IO. Stream. Stream предоставляет универсальное представление последовательности байтов. Класс stream представляет байтовый поток и является базовым для всех остальных потоковых классов. Этот класс также абстрактный, т.е. мы не можем создать его объект. В классе Stream определен набор стандартных потоковых операций. Из класса stream выведены:Байтовые классы потоков включают в себя: BufferedStream Обеспечивает дополнительную буферизацию для выполнения операций чтения и записи с другими потоками. Этот класс не может быть унаследован.FileStream Предоставляет Stream в файле, поддерживая синхронные и асинхронные операции чтения и записи.MemoryStream Создает поток, резервным хранилищем которого является память.Двоичные потоки. Для считывания и записи двоичных значений встроенных С#-типов используйте классы BinaryReader и BinaryWriter. Важно понимать, что эти данные считываются и записываются с использованием внутреннего двоичного формата, а не в текстовой форме, понятной человеку.BinaryReader представляет собой оболочку для байтового потока. Считывает простые типы данных как двоичные значения в заданной кодировке.BinaryWriter Записывает простые типы данных в поток как двоичные значения и поддерживает запись строк в определенной кодировке. Символьные классы потоков. Чтобы создать символьный поток, поместите байтовый поток в одну из символьных потоковых С#-оболочек. TextReader предназначен для обработки операций ввода данных. Представляет средство чтения, позволяющее считывать последовательные наборы знаков.TextWriter для обработки операций вывода данных. Представляет средство записи, позволяющее записывать последовательные наборы символов. Это абстрактный класс.StreamReader Реализует TextReader, который считывает символы из потока байтов в определенной кодировке.StreamWriter Реализует TextWriter для записи символов в поток в определенной кодировке.К методам ввода данных, принадлежащих классу TextReader относятся Read, ReadToEnd, Close. Особого внимания заслуживает метод ReadLine (), который считывает целую строку текста, возвращая ее в качестве string-значения. Этот метод полезен при считывании входных данных, которые содержат пробелы. В случае ошибки эти методы могут генерировать исключение типа IOException.Методы, которые используются в реализации парсера, будут рассмотрены в разделе 3 более подробно при описании реализации.Также в пространстве имен System.IO определены и классы исключений [19]:DirectoryNotFoundException Исключение, возникающее при невозможности найти часть файла или каталога.DriveNotFoundException Исключение вызывается при попытке доступа к недоступному диску или данным совместного использованияEndOfStreamException Исключение, которое создается при попытке выполнить чтение за пределами потока.FileFormatException Исключение, которое вызывается, если входной файл или поток данных, который должен соответствовать определенной спецификации формата файла, сформирован неверно.FileLoadException Это исключение создается в случае, когда управляемая сборка найдена, но не может быть загружена.FileNotFoundException Это исключение создается, когда попытка доступа к файлу, не существующему на диске, заканчивается неудачей.InvalidDataException Исключение возникает, когда поток данных имеет недопустимый формат.IOException Исключение, создаваемое при возникновении ошибки ввода-вывода.PathTooLongException Исключение, создаваемое, когда путь или имя файла превышает максимальную длину, определенную системой.PipeException Создается при ошибке в именованном канале.Данные исключения генерируются соответствующими классам методами.2.3.2 Класс Filestream и файловый ввод-вывод на побайтовой основеВ С# предусмотрены классы, которые позволяют считывать содержимое файлов и записывать в них информацию. На уровне операционной системы все файлы обрабатываются на побайтовой основе. В С# определены методы, предназначенные для считывания байтов из файла и записи байтов в файл. Таким образом, файловые операции чтения и записи с использованием байтовых потоков очень востребованы [17]. Чтобы создать байтовый поток с привязкой к файлу, используют класс FileStream. File предоставляет статические методы для создания, копирования, удаления, перемещения и открытия файлов, а также помогает при создании объектов FileStream.FileInfo предоставляет методы экземпляра для создания, копирования, удаления, перемещения и открытия файлов, а также позволяет создавать объекты FileStream. Этот класс не может быть унаследован.FileSystemEventArgs Предоставляет данные для событий каталога: Changed, Created, Deleted.FileSystemInfo Обеспечивает базовый класс для объектов FileInfo и DirectoryInfo.2.3.3 Файловый ввод-вывод с ориентацией на символыНесмотря на то что байтовая обработка файлов получила широкое распространение, С# также поддерживает символьные потоки. Символьные потоки работают непосредственно с Unicode-символами (это их достоинство) [17,18]. Поэтому, если нужно сохранить Unicode-текст, лучше всего выбрать именно символьные потоки. В общем случае, чтобы выполнять файловые операции на символьной основе, можно поместить объект класса FileStream внутрь объекта класса StreamReader или класса StreamWriter. Эти классы автоматически преобразуют байтовый поток в символьный и наоборот.На уровне операционной системы файл представляет собой набор байтов. Использование классов StreamReader или StreamWriter не влияет на этот факт.Помимо классов StreamWriter и StreamReader (производных от классов TextWriter и TextReader, рассмотренных выше), существуют классы StringReader и StringWriter. Класс StringReader предназначен для чтения символов из строки, а StringWriter – для записи символов в строку, возвращая ее в качестве String-значения.2.4 Сетевые возможности и использование InternetОдним из основных критериев разработки С#-средств являлось обеспечение возможностей использования Internet. Стандартные средства С# и библиотека .NET Library значительно улучшили эту ситуацию, существенно облегчив программистам создание Internet-приложений.Поддержка сетевых возможностей реализована в двух пространствах имен. В первом, System.NET, определено множество высокоуровневых и удобных для использования классов, в которых предусмотрены различные операции для работы с Internet. Второе пространство имен, System.NET.Sockets, предназначено для поддержки сокетов, которые обеспечивают низкоуровневое управление сетевыми операциями [20].Простейший способ программирования сетевой передачи предусматривает применение класса WebClient. Для получения файлов с Web-сервера или для передачи файлов на FTP-сервер требуется единственный метод этого класса. Однако функциональные возможности этого класса ограничены. Сам класс WebClient использует классы WebRequest и WebResponse. Эти классы предоставляют больше функциональных возможностей, но более сложны в применении. Если требуется создать сервер, для этого нельзя использовать классы WebClient или WebRequest. Для этой цели нужно применять класс TcpListener из пространства имен System. Net .Sockets. Класс TcpListener можно использовать для создания сервера для протокола TCP, a TCPClient предназначен для создания клиентских приложений. Эти классы не ограничены только протоколами HTTP и TCP – можно пользоваться любым протоколом на основе TCP.2.4.1 Классы WebRequest и WebResponse Для разрабатываемого в дипломной работе парсера эти классы наиболее важны и используются в реализации, поскольку позволяют посылать запрос и получать ответ от сервера.Для обмена данными с Web- или FTP-сервером вместо класса WebClient можно применять класс WebRequest. Сам класс WebClient скрытым образом использует класс WebRequest. Класс WebRequest всегда используется в сочетании с классом WebResponse. Вначале, конфигурируя объект WebRequest, нужно определить запрос, который будет отправлен серверу. Затем можно вызвать метод GetResponse, который отправляет запрос серверу и возвращает его ответ в классе WebResponse. Классы WebRequest и WebResponse являются абстрактными и поэтому не используются непосредственно. Они являются базовыми классами, а пространство имен System.NET предоставляет конкретные реализации протоколов HTTP, FTP и файловых протоколов [20].2.4.3 Каналы связи, реализованные в .NETВ .NET реализовано три варианта каналов [18]:TCP-канал – передача сообщений происходит посредством класса TcpChannel и по протоколу TCP. Сообщения упаковываются в двоичный формат, поэтому результирующие пакеты, передаваемые по сети, имеют небольшой размер, и минимально нагружают сеть. Чтобы сохранить состояние объекта, передаваемого по сети, используется объект BinaryFormatter.HTTP –канал – использует для передачи сообщений класс HttpChannel, сообщения преобразуются в формат SOAP, который является текстовым. Результирующие пакеты содержат много дополнительной информации, поэтому данный канал генерирует больше трафика, зато его использование не вызывает проблем с сетевыми экранами. Протокол Http, используемый при передаче, разрешен защитными комплексами на большинстве серверов и клиентских компьютеров. IPC-канал использует класс IpcChannel, и оказывается намного быстрее, чем HTTP и TCP каналы, когда нужно передавать данные между доменами приложения. Но это быстродействие достигается за счет обхода сетевого взаимодействия, поэтому он используется при взаимодействии доменов, расположенных на одном компьютере. Использование же его в сетевых приложениях других типов ограничено.2.5 Использование регулярных выражений в .NET Регулярные выражения .NET обладают богатыми возможностями, они логичны, а для работы с ними предусмотрен полный и удобный интерфейс. По оценкам одного из экспертов в области регулярных выражений Фридла [14], «программисты Microsoft отлично справились с созданием пакета, но документация недостаточно полна, плохо написана, хаотично организована, а иногда попросту неверна».Основные принципы работы с регулярными выражениями. Ключевым классом для работы с выражениями является класс System.Text.RegularExpressions.Regex, позволяющий создавать объект Regex (выражение). Для того чтобы использовать Regex в своих программах необходимо в список используемых пространств имен добавить [21]:using System.Text.

Список литературы

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

13. Ерохин А. Регулярные выражения в C# [Электронный ресурс]: Про-фессор WEB, 2012. URL: http://professorWeb.ru
14. Фридл Дж. Регулярные выражения. – 3-е изд., М.:Символ-Плюс,2008. -560 с.
15. Регулярные выражения в примерах и теории. [Электронный ресурс]: Блог доброго программиста C#, 2012. URL: http://foolsoft.ru
16. К.Уотсон, К. Нейгел, Я. Хю Педерсен, Д. Д. Рид, М. Скиннер, Э. Уайт. Visual C# 2008: базовый курс: изд-во "Диалектика", 2009.
17. Шилдгт Г. Полное руководство по С# - 2-e изд., М.:Вильямс, 2010, -1024 с.
18. Флёнов М.Е. Библия С# - 2-е изд., перераб.и доп. – СПб.,БХВ-Петербург, 2011. – 560 с.
19. Пространстве имен System.IO [Электронный ресурс]: Cyberforum. Фо-рум программистов и сис.админов, 2013. URL: http://www.cyberforum.ru
20. Эндрю Троелсен. Язык программирования C# 2010 и платформа .NET 4 – 2011.
Очень похожие работы
Найти ещё больше
Пожалуйста, внимательно изучайте содержание и фрагменты работы. Деньги за приобретённые готовые работы по причине несоответствия данной работы вашим требованиям или её уникальности не возвращаются.
* Категория работы носит оценочный характер в соответствии с качественными и количественными параметрами предоставляемого материала. Данный материал ни целиком, ни любая из его частей не является готовым научным трудом, выпускной квалификационной работой, научным докладом или иной работой, предусмотренной государственной системой научной аттестации или необходимой для прохождения промежуточной или итоговой аттестации. Данный материал представляет собой субъективный результат обработки, структурирования и форматирования собранной его автором информации и предназначен, прежде всего, для использования в качестве источника для самостоятельной подготовки работы указанной тематики.
bmt: 0.00472
© Рефератбанк, 2002 - 2024