РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ...

106
Министерство образования и науки Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования Московский государственный университет печати имени Ивана Федорова А.А. Калинин РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ПРИНЦИПОВ ООП НА ЯЗЫКЕ С# Учебно-методическое пособие для студентов, обучающихся по направлению 230100.62 — Информатика и вычислительная техника Москва 2014

Upload: others

Post on 23-Jun-2020

8 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

Министерство образования и науки Российской ФедерацииФедеральное государственное бюджетное образовательное учреждение

высшего профессионального образованияМосковский государственный университет печати имени Ивана Федорова

А.А. Калинин

РАЗРАБОТКА АЛГОРИТМОВС ИСПОЛЬЗОВАНИЕМ ПРИНЦИПОВ

ООП НА ЯЗЫКЕ С#

Учебно-методическое пособие

для студентов, обучающихся по направлению230100.62 — Информатика и вычислительная техника

Москва2014

Page 2: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

УДК 004.43ББК 32.973.26-018.1 К37

А.А. КалининК37 Разработка алгоритмов с использованием принципов ООП

на языке С# : учебно-методическое пособие / А.А. Калинин ;Моск. гос. ун-т печати имени Ивана Федорова. — М. : МГУПимени Ивана Федорова, 2014. — 106 с.

ISBN 978-5-8122-1301-5

Целью данного учебно-методического пособия, предназначенного для лабо-раторных занятий, является изучение дисциплины Б3.В.ОД.1 «Объектно-ориен-тированное программирование» (ООП) на базе .NET Framework — программ-ной технологии, реализуемой в MS Visual Studio 2010, и языка программирова-ния С#.

Учебное пособие состоит из двух частей. В 1-й части излагаются неразрывносвязанные между собой основы языка C# и принципы ООП в среде MS VisualStudio 2010. Во 2-й части приводятся задания для лабораторных работ с исполь-зованием консольных программ.

УДК 004.43ББК 32.973.26-018.1

ISBN 978-5-8122-1301-5 © Калинин А.А., 2014© Московский государственный университет печати имени Ивана Федорова, 2014

Page 3: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

3

Содержание

Введение ............................................................................................5

Часть I. Основы языка С#1. Платформа .NET Framework .......................................................72. Общеязыковая исполняющая среда (CLR) ................................83. Общая система типов (CTS) .......................................................144. Общеязыковая спецификация (CLS) ...........................................16

4.1. Системные типы данных в C# ............................................164.2. Числовые данные .................................................................184.3. Текстовые данные ................................................................204.4. Управляющие символы ........................................................23

5. Метод Main(). Методы и модификаторы параметров ..............246. Ввод и вывод класса System.Console ..........................................26

6.1. Форматирование числовых данных ....................................286.2. Форматирование данных в приложениях, отличныхот консольных...............................................................................29

7. Конструкции в C# ..........................................................................307.1. Итерационные конструкции .................................................307.2. Конструкции принятия решений и операции сравнения .....31

8. Массивы в C# ...............................................................................338.1. Объявление массивов ..........................................................338.2. Класс System.Random ..........................................................34

9. Тип класс C#. Инкапсуляция .......................................................369.1. Определения вложенных типов ...........................................389.2. Способы инкапсуляции .........................................................39

10. Тип класс C#. Конструкторы класса ........................................4310.1. Определение конструкторов ..............................................4310.2. Роль ключевого слова this ..................................................4510.3. Использование свойств внутри определения класса .......47

11. Тип класс C#. Наследование .....................................................47

Page 4: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

12. Тип класс C#. Полиморфизм .....................................................5112.1. Абстрактные классы ..........................................................5312.2. Полиморфный интерфейс ...................................................54

13. Тип интерфейс C# .......................................................................5613.1. Сравнение интерфейсов и абстрактных базовыхклассов ..........................................................................................5713.2. Реализация интерфейса ......................................................58

14. Файловый ввод-вывод и сериализация объектов .....................6014.1. Исследование пространства имен System.IO ..................6014.2. Cериализация объектов ......................................................63

Часть II. Лабораторные работы1. Конструкции программирования на C# .......................................72Лабораторная работа № 1Алгоритмизация линейных вычислительных процессов ...............73Лабораторная работа № 2Разветвляющиеся вычислительные процессы ..............................78Лабораторная работа № 3Организация итерационных циклических процессов .....................81

2. Тип класс в языке С# ...................................................................87Лабораторная работа № 4Определение и тестирование классов.............................................87Лабораторная работа № 5Определение и тестирование классов, использующиходномерные массивы .......................................................................90Лабораторная работа № 6Определение и тестирование классов, использующихдвумерные массивы (матрицы) .......................................................95Лабораторная работа № 7Абстрактные классы, наследование и полиморфизм .................. 101

Библиографический список ............................................................ 104

Page 5: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

5

Введение

Целями освоения дисциплины Б3.В.ОД.1 «Объектно-ориентиро-ванное программирование» (ООП) является изучение технологииобъектно-ориентированного программирования, платформы .NET иязыка программирования C#, а также новых концепций развития про-граммного обеспечения.

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

мирования, основы платформы .NET, основы языка программи-рования С#;

уметь работать со средой разработки Microsoft Visual Studio,разрабатывать алгоритмы с использованием принципов объект-но-ориентированного программирования в C#;

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

Процесс изучения дисциплины направлен на формирование сле-дующих компетенций:

владеть основными методами, способами и средствами полу-чения, хранения, переработки информации, иметь навыки рабо-ты с компьютером как средством управления информацией(ОК-12);

осваивать методики использования программных средств длярешения практических задач (ПК-2);

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

Профессиональные разработчики программного обеспечения.NET располагают самым серьезным в этой сфере продуктом про-изводства Microsoft, который называется Visual Studio 2010/2012.

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

Page 6: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

принципов ООП на языке С#, предполагается использование плат-формы MS Visual Studio 2010, которая поддерживает .NET Framework —программную технологию от компании Microsoft версии 4.0.

Visual Studio 2010 поставляется с графическими конструкторами,поддержкой использования отдельных фрагментов кода, средства-ми для работы с базами данных, утилитами для просмотра объек-тов и проектов, а также встроенной справочной системой. Крометого, предлагается множество дополнительных возможностей, наи-более важные из которых перечислены ниже:

графические редакторы и конструкторы XML; поддержка разработки программ Windows, ориентированных на

мобильные устройства: поддержка разработки программ Microsoft Offlce; поддержка разработки проектов Windows Workflow Foundation; встроенная поддержка рефакторинга кода; инструменты визуального конструирования классов.Разработка приложений в среде Microsoft Visual Studio 2010 име-

ет две стороны. С одной стороны, использование языка С# как тако-вого, определяемого его синтаксисом, с другой стороны — приемовработы в интегрированной среде разработки Visual Studio 2010.

Следует понимать, что C# является не единственным языком,который может применяться для построения .NET-приложений. Приустановке доступного для бесплатной загрузки комплекта разработ-ки программного обеспечения Microsoft .NET 4.0 Framework SoftwareDevelopment Kit (SDK), равно как и при установке Visual Studio 2010,для выбора становятся доступными пять управляемых языков: C#,Visual Basic, C++/CLI, JScript.NET и F#. Помимо управляемых язы-ков, предлагаемых Microsoft, существуют компиляторы, которыепредназначены для таких языков, как Smalltalk, COBOL и Pascal(и это далеко не полный перечень).

В настоящем пособии все внимание уделяется языку C#, причемдля работы с ним можно также использовать платформу Visual C#2010 Express.

Для более подробного изучения платформы .NET и языка C# сле-дует обратиться к литературе [1–3].

Page 7: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

7

Часть I. ОСНОВЫ ЯЗЫКА С#

1. Платформа .NET Framework

.NET Framework — это программная технология от компанииMicrosoft, предназначенная для создания обычных программ и веб-приложений. Одной из основных идей Microsoft, которая использует-ся в .NET, является совместимость различных служб, написанныхна разных языках.

Платформа .NET Framework предлагает следующие возможно-сти:

предоставление среды выполнения кода, которая уменьшает кон-фликты между разными версиями языков, гарантирует безо-пасное выполнение кода, устраняет проблемы, связанные с пе-реносом сред;

обеспечивает работу с различными типами приложений, разме-щенных как в Интернете, так и на локальном компьютере;

установление стандартов для поддержки платформы .NETFramework другими языками;

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

Из-за того что платформа .NET столь радикально отличается отпредыдущих технологий, в Microsoft разработали специально под нееновый язык программирования C#. Ниже приведен неполный списокключевых функциональных возможностей языка C#, которые при-сутствуют во всех его версиях:

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

Page 8: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

8

управление памятью осуществляется автоматически посред-ством сборки мусора. По этой причине ключевое слово delete вC# не поддерживается;

предлагаются формальные синтаксические конструкции дляклассов, интерфейсов, структур, перечислений и делегатов;

предоставляется аналогичная С++ возможность перегружатьоперации для пользовательских типов, но без лишних сложнос-тей;

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

Возможно, наиболее важным моментом, о котором следуетзнать, программируя на C#, является то, что с помощью этого язы-ка можно создавать только такой код, который будет выполнятьсяв исполняющей среде .NET (использовать C# для построения «клас-сического» СОМ-сервера или неуправляемого приложения с вызо-вами API-интерфейса и кодом на С и С++ нельзя).

Примечание. C# является чувствительным к регистру языком про-граммирования. Поэтому необходимо запомнить, что все ключе-вые слова в C# вводятся в нижнем регистре (например, public, lock,class, dynamic), а названия пространств имен, типов и членов всегданачинаются (по соглашению) с заглавной буквы, равно как и любыевложенные в них слова (как, например, Console.WriteLine,System.Windows.Forms. MessageBox и System. Data.SqlClient).

2. Общеязыковая исполняющая среда(CLR)

Уровень исполняющей среды называется общеязыковой ис-полняющей средой (Common Language Runtime) или, сокращен-но, средой CLR. С точки зрения программирования под терминомисполняющая среда может пониматься коллекция внешнихслужб, которые требуются для выполнения скомпилированнойединицы программного кода.

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

управляемым кодом (managed code);

Page 9: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

9

двоичной единицей (*.dll или *.exe), в которой содержится такойуправляемый код — сборкой (assembly);

кодом, который не может обслуживаться непосредственно в ис-полняющей среде .NET — неуправляемым кодом (unmanagedcode).

Главной задачей CLR является автоматическое обнаружение,загрузка и управление типами .NET (вместо программиста). Крометого, среда CLR заботится о ряде низкоуровневых деталей, такихкак управление памятью, обслуживание приложения, обработка по-токов и выполнение различных проверок, связанных с безопасностью.Исполняющая среда .NET обеспечивает единый четко определен-ный уровень выполнения, который способны использовать все со-вместимые с .NET языки и платформы.

Сама CLR состоит из двух основных компонентов. Первый компонент — это ядро среды выполнения, которое реа-

лизовано в виде библиотеки mscoree.dll (и также называетсяобщим механизмом выполнения исполняемого кода объектов —Common Object Runtime Execution Engine). При обращении к при-ложению .NET библиотека mscoree.dll автоматически загру-жается в память, и затем она управляет процессом загрузки впамять сборки данного приложения. Ядро среды выполненияответственно за множество задач: сначала, что наиболее важ-но, оно отвечает за определение места расположения сборки иобнаружение запрашиваемого типа в двоичном файле за счетсчитывания содержащихся там метаданных. Затем оно разме-щает тип в памяти, преобразует CIL-код в соответствующиеплатформе инструкции, производит любые необходимые про-верки на предмет безопасности и после этого, наконец, непо-средственно выполняет сам запрашиваемый программный код.

Второй главный компонент CLR — это библиотека базовыхклассов. Помимо загрузки пользовательских сборок и созданияпользовательских типов, механизм CLR при необходимости бу-дет взаимодействовать и с типами, содержащимися в библио-теках базовых классов .NET. Сама библиотека разбита на мно-жество отдельных сборок, однако главная сборка библиотекибазовых классов представлена файлом mscorlib.dll. В этой сборке

Page 10: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

10

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

Xотя двоичные .NET-единицы имеют такое же файловое расши-рение, как и двоичные единицы СОМ-серверов и неуправляемыхпрограмм Win32 (*.dll или *.exe), внутренне они устроены абсолютнопо-другому. Они содержат:

независящие от платформы инструкции на промежуточном язы-ке (Intermediate Language — IL или CIL (Common IntermediateLanguage — общий промежуточный язык));

исчерпывающие и точные метаданные, которые описывают каж-дый определенный в двоичном файле тип (например, класс,структуру или перечисление), а также всех его членов (напри-мер, свойства, методы или события). Метаданные .NET явля-ются настолько детальными, что сборки представляют собойполностью самоописываемые (self-describing) сущности. За ге-нерацию новейших и наилучших метаданных по типам всегдаотвечает компилятор, а не программист;

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

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

Page 11: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

11

ляцию CIL-кода в понятные ЦП инструкции, называется оператив-ным (Qust-in-time — JIT) компилятором. Иногда его «по-дружески»называют Jitter.

Поскольку сборки описывают себя сами с помощью метадан-ных, то для их установки не требуется никакой внешней информа-ции, например, в системном реестре. Это делает .NET-компонен-ты намного более простыми и менее подверженными ошибкам приустановке и деинсталляции, чем традиционные компоненты, пост-роенные на основе модели компонентных объектов Microsoft(СОМ), которые имели обширные требования к информации в си-стемном реестре.

Может возникнуть вопрос о том, какую выгоду приносит компи-ляция исходного кода в CIL, а не напрямую в набор ориентирован-ных на конкретную платформу инструкций. Одним из самых важныхпреимуществ такого подхода является интеграция языков. Как ужеможно было увидеть, все компиляторы .NET генерируют примерноодинаковые CIL-инструкции. Благодаря этому все языки могут вза-имодействовать в рамках четко обозначенной двоичной «арены».

Процесс развертывания (в рассматриваемом здесь случае) вклю-чает следующее:

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

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

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

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

Page 12: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

12

ками .NET и файлами двоичного кода (*.dll или *.exe) соблюдаетсяпростое соответствие «один к одному». Следовательно, получается,что при построении *.dll-библиотеки .NET можно спокойно полагать,что файл двоичного кода и сборка представляют собой одно и то же,и что, аналогичным образом, при построении исполняемого прило-жения для настольной системы на файл .exe можно ссылаться какна саму сборку.

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

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

Благодаря этому можно на самом деле устранить неприятнуюпроблему «ада динамически подключаемых библиотек (DLL)», гдеклиенты и компоненты, построенные на основе модели компонент-ных объектов Microsoft (COM), могли легко «рассинхронизировать-ся» друг с другом, если старая версия заменялась более новой, —это нарушало работу существующих клиентов.

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

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

Page 13: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

13

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

В библиотеке базовых классов содержатся определения типов,которые способны упрощать процесс получения доступа к базамданных, манипулирования XML-документами, обеспечения про-граммной безопасности и создания веб-, а также обычных настоль-ных и консольных интерфейсов. На высоком уровне взаимосвязьмежду CLR, CTS, CLS и библиотекой базовых классов выглядит так,как показано в табл. 2.1.

Таблица 2.1

Отношения между CLR, CTS, CLS и библиотеками базовых классов

Язык C#, однако, не поставляется с какой-либо специфическойбиблиотекой кода. Вместо этого от разработчиков, использующихC#, требуется применять нейтральные к языкам библиотеки, кото-рые поставляются в .NET. Для поддержания всех типов в библио-теках базовых классов в хорошо организованном виде в .NET ши-роко применяется понятие пространства имен (namespace). Подпространством имен понимается группа связанных между собой ссемантической точки зрения типов, которые содержатся в сборке.В C# ключевое слово using упрощает процесс добавления ссылокна типы, содержащиеся в определенном пространстве имен.

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

Доступ к базе данных

Настольные графические

API-интерфейсы

Безопасность

АРI-интерфейсы

для удаленной работы

Организация потоковой обработки

Файловый ввод-вывод

API-интерфейсы для работы

с веб-содержимым и другие

Общеязыковая исполняющая среда (CLR) Общая система типов (CTS) Общеязыковая спецификация (CLS)

Page 14: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

14

3. Общая система типов (CTS)

Общая система типов (Common Тyре System) или, сокращенно,система CTS представляет собой формальную спецификацию, в ко-торой описано, как должны быть определены типы для обслужива-ния в CLR-среде.

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

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

Тип классВ каждом совместимом с .NET языке поддерживается, как мини-

мум, понятие типа класса (class type), которое играет центральнуюроль в объектно-ориентированном программировании (ООП). Каж-дый класс может включать любое количество членов (таких как кон-структоры, свойства, методы и события) и точек данных (полей). ВC# классы объявляются с помощью ключевого слова class.

Характеристика классов: экземпляры абстрактных (abstract) классов не могут созда-

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

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

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

Тип интерфейсИнтерфейсом (interface) называется коллекция абстрактных чле-

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

Page 15: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

15

объектом и пользователем этого объекта. CTS позволяет реализо-вать в классе любое количество интерфейсов.

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

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

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

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

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

Тип перечислениеПеречисления (enum) представляют собой удобную программ-

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

Тип делегатДелегаты (delegate) являются .NET-эквивалентом безопасных в

отношении типов указателей функций в стиле С. Главнoe отличиезаключается в том, что делегат в .NET представляет собой класс,который наследуется от System.MulticastDelegate, а не просто указа-тель на какой-то конкретный адрес в памяти. В C# делегаты объяв-ляются с помощью ключевого слова delegate.

Встроенные типы данныхИ, наконец, последним, что следует знать о спецификации CTS,

является то, что в ней содержится четко определенный набор фун-

Page 16: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

16

даментальных типов данных. Хотя в каждом отдельно взятом язы-

ке для объявления того или иного встроенного типа данных из CTS

обычно предусмотрено свое уникальное ключевое слово, все эти

ключевые слова в конечном итоге соответствуют одному и тому же

типу в сборке mscorlib.dll.

4. Общеязыковая спецификация (CLS)

Важно понимать, что любая из определенных в CTS функциональ-

ных возможностей может не поддерживаться в отдельно взятом

языке, совместимом с .NET. Поэтому существует еще общеязыко-

вая спецификация (Common Language Specification) или, сокращен-

но, спецификация CLS, в которой описано лишь то подмножество об-

щих типов и программных конструкций, какое способны восприни-

мать абсолютно все поддерживающие .NET языки программирова-

ния. Следовательно, в случае построения типов .NET только с функ-

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

но оставаться полностью уверенным в том, что все совместимые с

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

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

нет в CLS, рассчитывать на то, что каждый язык программирования

.NET сможет взаимодействовать с подобной библиотекой кода .NET,

нельзя.

4.1. Системные типы данных в C#

Как и в любом языке программирования, в C# поставляется соб-

ственный набор основных типов данных, которые должны применять-

ся для представления локальных переменных, переменных экземп-

ляра, возвращаемых значений и входных параметров.

В табл. 4.1 перечислены эти системные типы данных вместе с

охватываемыми ими диапазонами значений, соответствующими клю-

чевыми словами на C# и сведениями о том, отвечают ли они требо-

ваниям общеязыковой спецификации CLS (Common Language

Specification)

Page 17: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

17

Таблица 4.1

Внутренние типы данных в C#

С# CLS Cистемныйтип Диапазон значений Описание

bool Да System.Boolean true или false истина или ложь

sbyte Нет System.SByte от –128 до 127 8-битное число

со знаком

byte Да System.Byte от 0 до 255 8-битное число

без знака

short Да System.Intl6 от –32 768 до 32 767 16-битное число

со знаком

ushort Нет System.UIntl6 от 0 до 65 535 16-битное число

без знака

int Да System.Int32

от –2 147 483 648до 2 147 483 647

32-битное числосо знаком

uint Нет System.UInt32 от 0 до 4 294 967 295 32-битное число

без знака

long Да System.Int64

от –9 223 372 036 854775 808до 9 223 372 036 854775 807

64-битное числосо знаком

ulong Нет System.UInt64

от 0 до 18 446 744073709 551 615

64-битное числобез знака

char Да System.Char от U+0000 до U+ffff Одиночный 16-битный

символ Unicode

float Да System.Single

от +1,510–45

до 3,4103832-битное числос плавающей точкой

double Да System.Double

от 5,010–324

до 1,71030864-битное числос плавающей точкой

deci-mal Да System.

Decimalот ±1,010e–28

до ±7,9102896-битное числосо знаком

string Да System.String

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

Представляет рядсимволов в форматеUnicode

object Да System.Object

Позволяет сохранятьлюбой типв объектнойпеременной

Служит базовымклассом для всех типовв мире .NET

Page 18: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

18

4.2. Числовые данные

Очень интересно отметить то, что даже элементарные типы дан-ных в .NET имеют вид иерархии классов. Каждый из этих типов вконечном итоге наследуется от класса System.Object, в котором со-держится набор методов (таких как ToString (), Equals () иGetHashCode ()), являющихся общими для всех поставляемых в биб-лиотеках базовых классов .NET типов.

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

Типы, у которых в цепочке наследования не присутствует классSystem. ValueType (вроде System.Type, System.String, System.Array,System.Exception и System. Delegate), в стеке не размещаются, а по-падают в кучу и подвергаются автоматической сборке мусора.

Продолжая обсуждение встроенных типов данных в C#, нельзяне упомянуть о том, что числовые типы в .NET поддерживают свой-ства MaxValue и MinValue, которые позволяют получать информа-цию о диапазоне значений, хранящихся в данном типе. Помимосвойств MinValue/MaxValue, каждый числовой тип может иметь идругие полезные члены. Например, тип System.Double позволяет по-лучать значения эпсилон (бесконечно малое) и бесконечность (пред-ставляющие интерес для тех, кто занимается решением математи-ческих задач).

Для нас существенно, что тип System.Double, являясь структу-рой, содержит поле NaN, которое используется в методах классаSystem.Math.

public const double NaN Метод или оператор возвращаютзначение NaN, если не указанрезультат операции

Double.NaN — пîëå Представляет значение,не являющееся числом (NaN).Данное поле является константой

public static bool IsNaN(double d) Возвращает значение true,если значение параметра d равнозначению NaN; в противномслучае — значение false

Page 19: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

19

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

Таблица 4.2

Избранные члены класса System.Math для данных типа двойной точностис плавающей запятой

Свойства Описание

public const double E e = 2,7182818284590452354

public const double PI = 3,14159265358979323846

Методы Описание

public static doubleAbs(double d)

Возвращает абсолютное значение числа d

public static doubleAcos(double d)

Возвращает угол, , измеренный в радианах,такой, что 0 -или-значение NaN,если d < –1 или d > 1

public static doubleAsin(double d)

Возвращает угол, , измеренный в радианах,такой, что –/2 /2 -или- значение NaN,если d < –1 или d > 1

public static doubleAtan(double d)

Возвращает угол, , измеренный в радианах,такой, что –/2 < < /2, -или- значение NaN,если d = |/2|

public static doubleCos(double d)

Возвращает косинус указанного угла d,измеряемого в радианах

public static doubleExp(double d)

Возвращает e, возведенное в указаннуюстепень d

public static doubleLog(double d)

Возвращает натуральный логарифмd (с основанием e), если d > 0

public static doubleLog10(double d)

Возвращает логарифм d с основанием 10,если d > 0

public static doublePow(double x, double y)

Возвращает число x, возведенное в степень y

public static doubleRound(double d)

Округляет заданное число d до ближайшегоцелого

public static doubleSin(double d)

Возвращает синус указанного угла d,измеряемого в радианах

Page 20: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

20

Окончание табл. 4.2

4.3. Текстовые данные

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

Бинарные (двоичные) данные являются последовательностьюбайт (или октетов), которые состоят из 8 бит, без всякого придавае-мого им естественного значения, или интерпретации. Символьные(текстовые) данные являются последовательностью символов.

Юнико2д (Unicode) — стандарт кодирования символов, позволяю-щий представить знаки почти всех письменных языков. Большин-ство современных операционных систем в той или иной степени обес-печивают поддержку Юникода.

Текстовые данные в C# представляются с помощью ключевыхслов string и char, которые являются сокращенными вариантами обо-значения типов System.String и System.Char.

Объект String является упорядоченной коллекцией структур Char,представляющей строку текста.

NET Framework использует структуру Char, чтобы представитьсимвол как элемент кода UTF-16 (англ. Unicode TransformationFormat). В информатике это один из способов кодирования симво-лов из Unicode в виде последовательности 16-битовых слов. Стан-дарт Юникода идентифицирует каждый символ уникальным 21-би-товым скалярным числом, называемым кодовой точкой, и опреде-ляет форму кодировки UTF-16, показывающую, как выполняетсякодирование кодовой точки последовательностью из одного или бо-лее 16-битовых значений. Каждое 16-битовое значение лежит в диа-пазоне, ограниченном шестнадцатеричными значениями 0x0000 и

Методы Описание

public static doubleSqrt(double d)

Возвращает квадратный корень d, если 0 d

public static doubleTan(double d)

Возвращает тангенс указанного угла d,измеряемого в радианах

public static doubleTruncate(double d)

Вычисляет целую часть заданного числа d

Page 21: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

21

0xFFFF и хранится в структуре Char. Значением объекта Char явля-ется 16-битовое числовое (порядковое) значение.

Большинство символов Юникода могут быть представлены од-ним объектом Char, но символы, кодируемые как базовые, сурро-гатные пары и (или) последовательности несамостоятельных зна-ков, представлены несколькими объектами Char. По этой причинеструктура Char необязательно должна быть эквивалентна отдель-ному символу Юникода в объекте String

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

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

Абстрактный класс System.Text.Encoding предоставляет средстваконвертации массива байт в массив символов или в строку, а такженаоборот.

Таблица 4.3

Избранные члены класса System.String

Свойства Описание

public char this[intindex] { get; }

Получает объект Char в указанной позициив текущем объекте String (только для чтения).Kвадратные скобки [] служат для доступак отдельным знакам в объекте string, но приэтом возможен доступ только для чтения

public int Length { get; } Свойство Length возвращает число объектовChar в данном экземпляре (только для чтения),а не число знаков Юникода. Причина в том,что знак Юникода может быть представленнесколькими Char

Методы Описание

public static intCompare(stringstrA,string strB)

Сравнивает два указанных объекта Stringи возвращает целое число, которое показываетих относительное положение в порядкесортировки по словам

Page 22: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

22

Окончание табл. 4.3

Пример://Èñïîëüçóåì ñâîéñòâà êëàññà String (òîëüêî äëÿ //÷òåíèÿ)string str1 = "Test";for (int ctr = 0; ctr <= str1.Length — 1; ctr++ )Console.Write("{0} ", str1[ctr]);// Âûâîä íà êîíñîëü:// T e s t

Методы Описание

public boolContains(string value)

Возвращает значение, указывающее, содержитли данная строка заданный объект типа String

public bool Equals(stringvalue)

Определяет, равны ли значения этогоэкземпляра и указанного объекта String

public static stringFormat( )

см. разделы I, 6.2

public string Insert(intstartIndex, string value)

Возвращает новую строку, в которой указаннаястрока вставляется на указанной позициииндекса, отсчитываемой от нуля, в данномэкземпляре

public string PadLeft(inttotalWidth)

Возвращает новую строку, в которой знакиданного экземпляра выровнены по правому(левому) краю путем добавления слева (справа)пробелов до указанной общей длиныpublic string

PadRight(int totalWidth)

public string Remove(intstartIndex)

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

public stringReplace(charoldChar,char newChar)

Возвращает новую строку, в которой всевхождения заданного знака Юникода в текущемэкземпляре заменены другим заданным знакомЮникода

public stringReplace(stringoldValue,stringnewValue)

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

public string Trim() Удаляет все начальные и конечные знакипробела из текущего объекта String

public string ToUpper() Возвращает копию этой строки, переведеннуюв верхний (нижний) регистр

public string ToLower()

Page 23: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

23

Пример:// Èñïîëüçóåì ìåòîä Raplace() êëàññà Stringpublic static void Main() {String str = "1 2 3 4 5 6 7 8 9";Console.WriteLine("Îðèãèíàëüíàÿ ñòðîêà:\"{0}\"",str);Console.WriteLine("Ñòðîêà ðåçóëüòàòà:\"{0}\"",str.Replace(' ', ','));}//\" — óïðàâëÿþùèé ñèìâîë äëÿ ââîäà êàâû÷êè â ñòðîêó// Âûâîä íà êîíñîëü:// Îðèãèíàëüíàÿ ñòðîêà: "1 2 3 4 5 6 7 8 9"// Ñòðîêà ðåçóëüòàòà: "1,2,3,4,5,6,7,8,9"//

4.4. Управляющие символы

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

Кроме управляющих последовательностей в C# предусмотренспециальный префикс @, предназначенный для дословного выводастроки, вне зависимости от наличия в ней управляющих символов.Можно сказать, что этот префикс отключает присутствующие в стро-ке управляющие символы.

Таблица 4.4

Управляющие символы

Символ Имя символа Kодировка Юникода

\' Одинарная кавычка 0x0027

\" Двойная кавычка 0x0022

\\ Обратная косая черта 0x005C

\0 Null 0x0000

\a Системное оповещение 0x0007

\b Backspace 0x0008

\f Начало следующей страницы 0x000C

Page 24: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

24

Окончание табл. 4.4

5. Метод Main(). Методы и модификаторы параметров

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

Класс, определяющий метод Main(), должен обязательно присут-ствовать в каждом исполняемом приложении на C# (будь то кон-сольная программа, настольная программа для Windows или службаWindows), поскольку он применяется для обозначения точки входа вприложение. Формально класс, в котором определяется метод Main(),называется объектом приложения.

Создавая консольный проект с именем ConsoleApplication в VisualStudio 2010, классу, в котором определяется метод Main(),по умол-чанию назначается имя Program. Класс содержит статический ме-тод Main() с возвращаемым значением void и массивом типа string вкачестве единственного входного параметра.

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

По умолчанию в результате создания проекта ConsoleApplication,имеем:

using System;using System.Collections.Generic;using System.Linq;using System.Text;

namespace ConsoleApplication{

Символ Имя символа Kодировка Юникода

\n Новая строка 0x000A

\v Вертикальная табуляция 0x000B

\t Горизонтальная табуляция 0x0009

Page 25: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

25

class Program { static void Main(string[] args) { } }}

Далее, при написании программы метод Main() модифицируетсядобавлением программного кода, а также в класс Program могутбыть добавлены и другие статические методы.

Методы могут как принимать, так и не принимать параметров, атакже возвращать или не возвращать значения вызывающей сторо-не. Методы могут быть реализованы в контексте классов или струк-тур (а также прототипированы внутри типов интерфейсов) и снаб-жаться различными ключевыми словами (internal, virtual, public, newи т. д.) для уточнения их поведения. Хотя определение метода в C#выглядит довольно понятно, существует несколько ключевых слов, спомощью которых можно управлять способом передачи аргументовинтересующему методу.

Таблица 5.1

Модификаторы параметров в C#

Модификаторпараметра Описание

(отсутствует)

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

out

Выходные параметры должны присваиваться вызываемымметодом (и, следовательно, передаваться по ссылке).Если параметрам out в вызываемом методе значения неприсвоены, компилятор сообщит об ошибке

ref

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

Page 26: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

26

Окончание табл. 5.1

Как и в других современных объектно-ориентированных языкахпрограммирования, в C# можно перегружать (overload) методы.Перегруженными называются методы, одинаково именованные, от-личающиеся друг от друга количеством (или типом) параметров илитипом возвращаемого значения, т. е. сигнатурой.

6. Ввод и вывод класса System.Console

Хотя консольный пользовательский интерфейс (Console UserInterface — CUI) не является настолько привлекательным как гра-фический (Graphical User Interface — GUI) или веб-интерфейс, од-нако, ограничение консольными программами позволяет уделитьбольше внимания синтаксису C# и ключевым характеристикамплатформы .NET, а не сложным деталям построения графическихпользовательских интерфейсов или веб-сайтов.

В классе Console имеются методы, которые позволяют захваты-вать ввод и вывод; все они являются статическими (static) и пото-му вызываются за счет добавления к имени метода в качестве пре-фикса имени самого класса (Console).

К их числу относится уже показанный ранее метод WriteLine(),который позволяет вставлять в поток вывода строку текста (вместес символом возврата каретки); метод Write(), который позволяетвставлять в поток вывода текст без символа возврата каретки; ме-тод ReadLine(), который разрешает получать информацию из потокаввода вплоть до нажатия клавиши <Enter>; и метод Read(), позволя-ющий захватывать из потока ввода одиночный символ.

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

Модификаторпараметра Описание

params

Этот модификатор позволяет передавать в виде одногологического параметра переменное количествоаргументов. В каждом методе может присутствоватьтолько один модификатор params и он долженобязательно указываться последним в списке параметров

Page 27: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

27

ем синтаксиса в виде фигурных скобок. Во время выполнения наместе каждой такой метки-заполнителя подставляется передавае-мое в Console.WriteLine () значение (или значения).

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

Каждый элемент формата принимает следующую форму и со-стоит из следующих компонентов:

{ Индекс[,Выравнивание][:formatString]}Парные фигурные скобки "{" и "}" являются обязательными.Следует запомнить, что отсчет обязательного параметра Индекса

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

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

Необязательный параметр formatString является строкой фор-мата. Если formatString не указан, используется описатель общегоформата ("G") для типа числовых значений даты и времени или пе-речисления. Двоеточие является обязательным, если formatStringуказан.

Остальными передаваемыми WriteLine() параметрами являютсяпросто значения, которые должны подставляться на месте соответ-ствующих меток — заполнителей.

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

Пример:

//Îòîáðàæåíèå çíà÷åíèé ïåðåìåííûõ userName è//userAge â îêíå êîíñîëè.

Page 28: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

28

Console.WriteLine("Hello {0}! You are {1} yearsold.", userName, userAge);

Метка-заполнитель может повторяться в пределах одной и тойже строки.

Пример:

// Âûâîä ñòðîêè "9, Number 9, Number 9"Console.WriteLine("{0}, Number {0}, Number {0}",9);

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

Пример:

// Îòîáðàæàåò: 20, 10, 30Console.WriteLine("{1}, {0}, {2}", 10, 20, 30);

6.1. Форматирование числовых данных

Строки стандартных числовых форматов служат для формати-рования стандартных числовых типов. Стандартная строка число-вого формата имеет вид Axx, где A — буквенный символ, называе-мый спецификатором формата, а xx — необязательное целое число,называемое спецификатором точности. Спецификатор точностинаходится в диапазоне от 0 до 99 и влияет на число цифр в результа-те. Он не округляет число.

Таблица 6.1

Символы для форматирования числовых данных в .NET

Cпецификаторформата Cпецификатор точности Описание

С или с Kоличество цифрдробной части Результат: значение валюты

D или d

Минимальное числоцифр. По умолчанию:минимальноенеобходимое число цифр

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

Page 29: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

29

Окончание табл. 6.1

6.2. Форматирование данных в приложениях,отличных от консольных

Составное форматирование может использоваться не только вконсольных приложениях. Тот же синтаксис форматирования можноприменять и в вызове статического метода string.Format(), которыйвозвращает новый объект типа string, форматируемый в соответствии

Cпецификаторформата Cпецификатор точности Описание

E или eKоличество цифрдробной части.По умолчанию: 6

Результат: экспоненциальнаянотация. Регистр этого флагауказывает, в каком регистредолжна представлятьсяэкспоненциальная константа —в верхнем (E) или в нижнем (e)

F или f Kоличество цифрдробной части

Результат: цифры целойи дробной частейс необязательнымотрицательным знаком

G или g

Kоличество значащихцифр. По умолчаниюопределяется численнымтипом

Результат: наиболее компактнаязапись из двух вариантов:экспоненциальногои с фиксированной запятой

N или n Желаемое число знаковдробной части

Результат: цифры целойи дробной частей, разделителигрупп и разделитель целойи дробной частейс необязательнымотрицательным знаком

P или p Желаемое число знаковдробной части

Результат: число, умноженноена 100 и отображаемоес символом процента

X или xЧисло цифрв результирующейстроке

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

Page 30: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

30

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

Это может быть удобно при генерации во время выполнения тек-стовых данных, которые должны использоваться в приложении лю-бого типа (например, в настольном приложении с графическим пользо-вательским интерфейсом, в веб-приложении ASP.NET или веб-служ-бах XML).

Пример:Требуется создать графическое настольное приложение и приме-

нить форматирование к строке, отображаемой в окне сообщения внут-ри него:

static void DisplayMessage(){// Èñïîëüçîâàíèå string.Format() äëÿ ôîðìàòèðîâàíèÿ//ñòðîêîâîãî ëèòåðàëà.string userMessage = string.Format("100000 in hexis {0:x}", 100000);// Äëÿ êîìïèëÿöèè ýòîé ñòðîêè êîäà òðåáóåòñÿ// ññûëêà íà System.Windows.Forms.dllSystem.Windows.Forms.MessageBox.Show(userMessage);}

7. Конструкции в C#

7.1. Итерационные конструкции

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

Цикл forЕсли требуется проходить по блоку кода фиксированное количе-

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

Page 31: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

31

Пример:

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

Как и в других языках, в C# можно создавать сложные конечныеусловия, определять бесконечные циклы и использовать ключевыеслова goto, continue и break.

Цикл foreachКлючевое слово foreach в C# позволяет проходить в цикле по

всем элементам массива (или коллекции) без проверки его верхнегопредела.

Пример:

int[] myInts = { 10, 20, 30, 40 };foreach (int i in myInts){ }//in — êëþ÷åâîå ñëîâî, i — ïàðàìåòð öèêëà

Конструкции while и do/whileКонструкцию while удобно применять, когда требуется, чтобы блок

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

Пример:

while( <óñëîâèå>){ }do{ } while( <óñëîâèå>);

7.2. Конструкции принятия решений и операции сравнения

Оператор if/elseВ C# этот оператор может работать только с булевскими выра-

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

Page 32: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

32

Таблица 7.1

Операции сравнения в C#

При построении сложных выражений в C# используется вполнеожидаемый набор условных операций, описанный в табл. 7.2.

Таблица 7.2

Условные операции в C#

Оператор switchКак и в остальных С-подобных языках, в C# этот оператор позво-

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

Пример:switch (strChoice){case "C#": Console.WriteLine("Âûáîð ÿçûêà C#"); break;case "VB": Console.WriteLine("Âûáîð ÿçûêà Visual Basic"); break;default: Console.WriteLine("Âûáîð ÿçûêà ïðîãðàììèðîâàíèÿíå ñîñòîÿëñÿ"); break;}Блок default обрабатывает неверный выбор.

Операция сравнения Описание

== Возвращает true, только если выражения одинаковы

! = Возвращает true, только если выражения разные

<Возвращает true, только если выражение слеваменьше, больше, меньше или равно либо большеили равно выражению справа

>

<=

>=

Операция Описание

&& Условная операция AND (И). Возвращает true, есливсе выражения истинны

|| Условная операция OR (ИЛИ). Возвращает true,если истинно хотя бы одно из выражений

! Условная операция NOT (НЕ). Возвращает true,если выражение ложно, или false, если истинно

Page 33: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

33

8. Массивы в C#

8.1. Объявление массивов

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

Пример:

string[] booksOnDotNet = new string[100];

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

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

Пример:

bool[] boolArray = { false, false, true };

В дополнение к одномерным массивам, которые демонстрирова-лись до сих пор, в C# также поддерживаются две разновидностимногомерных массивов.

Многомерные массивы первого вида называются прямоуголь-ными массивами и содержат несколько измерений, где все строкиимеют одинаковую длину. Объявляются и заполняются такие мас-сивы следующим образом.

Пример:

int[,] myMatrix;myMatrix = new int[6,7];

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

Page 34: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

34

Пример:

int[][] myJagArray = new int [5][ ];// Ñîçäàíèå çóá÷àòîãî ìàññèâà.for (int i = 0; i < myJagArray.Length; i++)myJagArray[i] = new int[i+7];

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

Абстрактный класс System.Array (public abstract class Array) пре-доставляет свойства и методы для создания, изменения, поиска исортировки массивов, т. е. выступает в роли базового класса длявсех массивов в среде CLR.

8.2. Класс System.Random

Класс System.Random (public class Random) реализует алгоритмгенератора случайных чисел Кнута.

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

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

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

Page 35: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

35

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

Таблица 8.1

Избранные члены класса System.Random

Пример:

Random rand = new Random();// Generate and display 5 random floating point //values from 0 to 1.Console.WriteLine("Five Doubles.");for (int ctr = 0; ctr <= 4; ctr++)Console.Write("{0,8:N3}", rand.NextDouble());Console.WriteLine();

Метод NextDouble() дает возможность генерировать случайныечисла в интервале [0, 1). Чтобы с помощью этого метода класса

Kонструкторы Описание

publicRandom()

Инициализирует новый экземпляр класса Randomс помощью зависимого от времени начального значенияпо умолчанию

publicRandom(intSeed)

Инициализирует новый экземпляр класса Randomс помощью указанного начального значения

Методы Описание

public virtualint Next() Возвращает неотрицательное случайное число

public virtualint Next(intmaxValue)

Возвращает 32-разрядное целое число со знаком большеили равно нулю и меньше, чем значение maxValue

public virtualint Next(intminValue, intmaxValue)

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

public virtualdoubleNextDouble()

Возвращает число двойной точности с плавающейзапятой, которое больше или равно 0,0, и меньше 1,0

Page 36: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

36

Random генерировать случайные числа в интервале [А, В), гдеA < B , следует использовать линейное преобразование

= (B – A) + A,

т. е. следует в приведенном выше примере сделать замену:rand.NextDouble() (B – A)* rand.NextDouble() + A.

Пример:

Random rand = new Random();//Cëó÷àéíûå ÷èñëà â èíòåðâàëå [À, Â)Console.WriteLine("Five Doubles.");for (int ctr = 0; ctr <= 4; ctr++)Console.Write("{0,8:N3}", ((B — A)*rand.NextDouble() + A));Console.WriteLine();

9. Тип класс C#. Инкапсуляция

Что касается платформы .NET, то наиболее фундаментальнойпрограммной конструкцией является тип класса. Класс определя-ется в C# с помощью ключевого слова class. Формально класс —это определяемый пользователем тип, который состоит из полей дан-ных (часто именуемых переменными-членами) и членов, опериру-ющих этими данными (конструкторов, свойств, методов, событий ит. п.). Все вместе поля данных класса представляют «состояние»экземпляра класса (иначе называемого объектом).

При желании можно распределить единственный класс, представ-ленный в виде одного файла *.cs, на несколько файлов C#, чтобыизолировать рутинный код от более ценных полезных членов. Пер-вый шаг состоит в добавлении ключевого слова partial к текущемуопределению класса и вырезании кода, который должен быть поме-щен в новый файл. Далее можно переместить оставшиеся члены(например, поля данных и конструкторы) в другой новый файл по-средством простой операции вырезания и вставки.

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

Page 37: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

37

Единственное требование при определении частичных типов связа-

но с тем, что разные части должны иметь одно и то же имя и нахо-

диться в пределах одного и того же пространства имен .NET.

Примечание. Помните, что каждый аспект определения частичного

класса должен быть помечен ключевым словом partial.

Первый основной принцип ООП называется инкапсуляцией.

Концепция инкапсуляции основывается на положении, гласящем, что

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

через экземпляр объекта. Вместо этого, если вызывающий код же-

лает изменить состояние объекта, то должен делать это через ме-

тоды доступа (accessor, или метод get) и изменения (mutator, или

метод set).

При работе с инкапсуляцией всегда следует принимать во внима-

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

В частности, типы:

классы,

интерфейсы,

структуры,

перечисления,

делегаты,

а также их члены:

свойства,

методы,

конструкторы,

поля,

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

слова модификатора доступа, управляющего «видимостью» эле-

мента другим частям приложения.

Хотя в C# определены многочисленные ключевые слова для уп-

равления доступом, их значение может отличаться в зависимости

от места применения (к типу или члену). В табл. 9.1, приведенной

ниже, описаны роли и применение модификаторов доступа.

Page 38: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

38

Таблица 9.1

Модификаторы доступа

9.1. Определения вложенных типов

В C# (как и в других языках .NET) допускается определять тип

(перечисление, класс, интерфейс, структуру или делегат) непосред-

ственно внутри контекста класса или структуры. При этом вложен-

ный (или «внутренний») тип считается членом охватывающего (или

«внешнего») класса, и в глазах исполняющей системы им можно ма-

нипулировать как любым другим членом (полем, свойством, мето-

дом и событием). Поскольку вложенный тип является членом вклю-

Модификатордоступа

K чему можетбыть применен Назначение

public Типы или членытипов

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

private Члены типов иливложенные типы

Приватные (private) элементы могутбыть доступны только в классе (илиструктуре), в котором они определены

protected Члены типов иливложенные типы

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

internal Типы или членытипов

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

рrotectedinternal

Члены типов иливложенные типы

Kогда ключевые слова protectedи internal комбинируются в объявленииэлемента, такой элемент доступенвнутри определяющей его сборки,определяющего класса и всех егонаследников

Page 39: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

39

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

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

9.2. Способы инкапсуляции

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

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

введением свойств класса.

Методы доступаРоль метода get состоит в возврате вызывающему коду значе-

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

Пример:

class Employee {// Ïîëÿ äàííûõ.private string empName;// Ìåòîä äîñòóïà (ìåòîä get) .public string GetName(){return empName;}// Ìåòîä èçìåíåíèÿ (ìåòîä set) .

Page 40: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

40

public void SetName(string name){// Ïåðåä ïðèñâàèâàíèåì ïðîâåðèòü âõîäíîå çíà÷åíèå//íà äëèíó èìåíè.if (name.Length > 15)Console.WriteLine("Error! Name must be less than 16 characters!");elseempName = name;}}

Эта техника требует наличия двух уникально именованных мето-дов для управления единственным элементом данных. Приватноеполе empName инкапсулировано с использованием двух методовGetName() и SetName(). Благодаря коду в методе SetName(), по-пытка присвоить строку длиннее 15 символов приводит к выводу наконсоль жестко закодированного сообщения об ошибке.

Свойство классаВ языках .NET имеется более предпочтительный способ инкап-

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

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

Пример:

class Employee {// Ïîëÿ äàííûõ.private string empName;private int empID;private float currPay;// Ñâîéñòâà.

Page 41: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

41

public string Name {get { return empName; }set {if (value.Length > 15)Console.WriteLine("Error! Name must be less than 16 characters!");elseempName = value;}}

В свойстве для set используется лексема value, которая представ-ляет входное значение, присваиваемое свойству вызывающим ко-дом. Эта лексема не является настоящим ключевым словом C#, апредставляет собой то, что называется контекстуальным ключе-вым словом. Когда лексема value находится внутри контекста set,она всегда обозначает значение, присваиваемое вызывающим ко-дом, и всегда имеет тип, совпадающий с типом самого свойства.

При наличии свойств вызывающему коду кажется, что он имеетдело с общедоступным элементом данных; однако «за кулисами»при каждом обращении вызывается корректный get или set, обеспе-чивая инкапсуляцию.

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

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

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

Page 42: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

42

Пример:

// Ñòàòè÷åñêèå ñâîéñòâà äîëæíû îïåðèðîâàòü//ñòàòè÷åñêèìè äàííûìè!class Employee {...private static string companyName;public static string Company {get{ return companyName;}set{ companyName = value;}...}

Класс C# может определять любое количество статических чле-нов с использованием ключевого слова static. При этом соответствую-щий член должен вызываться непосредственно на уровне класса, ане на объектной ссылке. Статические члены — это элементы, заду-манные (проектировщиком класса) как общие, так что нет нуждысоздавать экземпляр типа при их вызове.

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

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

При проектировании любого класса C# одна из задач связана свыяснением того, какие части данных должны быть определены какстатические члены, а какие — нет. Хотя на этот счет не существуетстрогих правил, помните, что поле статических данных разделяетсямежду всеми объектами данного класса. Поэтому, если необходи-мо, чтобы часть данных совместно использовалась всеми объекта-ми, статические члены будут самым подходящим вариантом.

Page 43: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

43

10. Тип класс C#. Конструкторы класса

В C# поддерживается механизм конструкторов, которые позво-ляют устанавливать состояние объекта в момент его создания. Кон-структор (constructor) — это специальный метод класса, которыйвызывается неявно при создании объекта с использованием ключе-вого слова new. Однако в отличие от «нормального» метода, конст-руктор никогда не имеет возвращаемого значения (даже void) и все-гда именуется идентично имени класса, который он конструирует.

10.1. Определение конструкторов

Каждый класс C# снабжается конструктором по умолчанию. Поопределению такой конструктор никогда не принимает аргументов.После размещения нового объекта в памяти конструктор по умол-чанию гарантирует установку всех полей в соответствующие стан-дартные значения.

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

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

Пример:class Car{// 'Ñîñòîÿíèå' îáúåêòà Car.public string petName;public int currSpeed;// Ñïåöèàëüíûé êîíñòðóêòîð ïî óìîë÷àíèþ.public Car(){petName = "Chuck";

Page 44: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

44

currSpeed = 10;}// Çäåñü currSpeed ïîëó÷àåò çíà÷åíèå// ïî óìîë÷àíèþ òèïà int (0) .public Car(string pn){petName = pn;}// Ïîçâîëÿåò âûçûâàþùåìó êîäó óñòàíîâèòü ïîëíîå//ñîñòîÿíèå Car.public Car(string pn, int cs){petName = pn;currSpeed = cs;}}

Следует иметь в виду, что один конструктор отличается от дру-гого (с точки зрения компилятора C#) количеством и типом аргу-ментов. Определение методов с одним и тем же именем, но разнымколичеством и типами аргументов, называется перегрузкой. Такимобразом, класс Car имеет перегруженный конструктор, чтобы пре-доставить несколько способов создания объекта во время объявле-ния. В любом случае, теперь можно создавать объекты Car, исполь-зуя любой из его общедоступных конструкторов.

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

Page 45: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

45

Пример:

class Motorcycle {public int driverIntensity;// Âåðíóòü êîíñòðóêòîð no óìîë÷àíèþ, êîòîðûé áóäåò//óñòàíàâëèâàòü// äëÿ âñåõ ÷ëåíîâ äàííûõ çíà÷åíèÿ no óìîë÷àíèþ.public Motorcycle() {}// Ñïåöèàëüíûé êîíñòðóêòîð.public Motorcycle(int intensity){ driverIntensity = intensity; }}}

10.2. Роль ключевого слова this

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

Пример:

public void SetDriverName(string name){ this.name = name; }

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

Примечание. Применение ключевого слова this внутри реализациистатического члена приводит к ошибке компиляции. Cтатическиечлены оперируют на уровне класса (а не объекта), а на этом уровненет текущего объекта, потому и не существует this.

Другое применение ключевого слова this состоит в проектирова-нии класса, использующего технику под названием сцепление кон-структоров или цепочка конструкторов (constructor chaining). Этотшаблон проектирования полезен, когда имеется класс, определяю-щий несколько конструкторов.

Page 46: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

46

Подход предусматривает назначение конструктора, который при-

нимает максимальное количество аргументов, в качестве «веду-

щего конструктора», с реализацией внутри него необходимой логики

проверки достоверности. Остальные конструкторы смогут исполь-

зовать ключевое слово this, чтобы передать входные аргументы ве-

дущему конструктору и при необходимости предоставить любые до-

полнительные параметры. В результате, беспокоиться придется толь-

ко о поддержке единственного конструктора для всего класса, в то

время как остальные конструкторы остаются в основном пустыми.

При связывании конструкторов в цепочку обратите внимание, что

ключевое слово this располагается вне тела конструктора (и отделя-

ется от его имени двоеточием).

Пример:

class Motorcycle {public int driverIntensity;public string driverName;// Ñâÿçûâàíèå êîíñòðóêòîðîâ â öåïî÷êó.public Motorcycle() {}public Motorcycle(int intensity): this(intensity, "") {}public Motorcycle(string name): this (0, name) {}// Ýòî âåäóùèé êîíñòðóêòîð , âûïîëíÿþùèé âñþ//ðåàëüíóþ ðàáîòó.public Motorcycle(int intensity, string name){if (intensity > 10){intensity = 10;}driverIntensity = intensity;driverName = name;}}

В построении цепочки конструкторов замечательно то, что этотшаблон программирования работает с любой версией языка C# иплатформы .NET.

Page 47: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

47

10.3. Использование свойств внутри определения класса

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

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

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

11. Тип класс C#. Наследование

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

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

Page 48: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

48

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

Язык C# требует, чтобы любой конкретный класс имел в точно-сти один непосредственный базовый класс. В С# невозможно со-здать тип класса, который напрямую унаследован от двух и болеебазовых классов (эта техника, поддерживаемая в неуправляемомС++, называется множественным наследованием). Попытка со-здать класс, в котором указано два непосредственных родительскихкласса, приводит к ошибке компиляции.

В C# поддерживается еще одно ключевое слово — sealed, кото-рое предотвращает наследование. Если класс помечен как sealed(запечатанный), компилятор не позволяет наследовать от него.В пространстве имен System определено множество запечатанныхклассов.

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

Пример:

class Employee { // Áàçîâûé êëàññ// Ïîëÿ äàííûõ.private string empName;private int empID;private float currPay;private int empAge;private string empSSN;// Ñâîéñòâà îñòàþòñÿ ïðåæíèìè...public string SocialSecurityNumber {get { return empSSN; }}// Êîíñòðóêòîðû.public Employee() {}public Employee(string name, int id, float pay)

Page 49: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

49

:this(name, 0, id, pay, ""){}public Employee(string name, int age, int id, float pay, string ssn){Name = name;Age = age;ID = id;Pay = pay;SocialSecuntyNumber = ssn;}// Ìåòîäû.public void GiveBonus(float amount){ Pay += amount; }public void DisplayStats(){Console.WriteLine("Name: {0}", Name);Console.WriteLine (11 ID : {0}", ID);Console.WriteLine("Age: {0}", Age);Console.WriteLine("Pay: {0}", Ðàó);Console.WriteLine("SSN: {0}", SocialSecuntyNumber);}}// Ìåíåäæåðàì íóæíî çíàòü êîëè÷åñòâî èõ îïöèîíîâ íà àêöèè.class Manager : Employee {// Äî÷åðíèé êëàññpublic int StockOptions { get; set; }}// Ïðîäàâöàì íóæíî çíàòü êîëè÷åñòâî ïðîäàæ.class SalesPerson : Employee {// Äî÷åðíèé êëàññpublic int SalesNumber { get; set; }}

Теперь, после установки отношения «является», SalesPerson и

Manager автоматически наследуют все общедоступные члены ба-

зового класса Employee.

Модифицируем специальный конструктор класса Manager, при-

менив ключевое слово base.

Пример:

public Manager(string fullName, int age, int empID, float currPay,string ssn, int numbOfOpts)

Page 50: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

50

: base (fullName, age, empID, currPay, ssn){// Ýòî ñâîéñòâî îïðåäåëåíî â êëàññå Manager.StockOptions = numbOfOpts;}

Здесь ключевое слово base ссылается на сигнатуру конструкто-ра (подобно синтаксису, используемому для сцепления конструкто-ров на единственном классе с использованием ключевого слова this),что всегда указывает на то, что производный конструктор передаетданные конструктору непосредственного родителя. В данной ситуа-ции явно вызывается конструктор с пятью параметрами, определен-ный в Employee, что избавляет от излишних вызовов во время созда-ния экземпляра базового класса.

Специальный конструктор SalesPerson выглядит в основном иден-тично.

Пример:

//  êà÷åñòâå îáùåãî ïðàâèëà, âñå ïîäêëàññû äîëæíû//âûçûâàòü ñîîòâåòñòâóþùèé êîíñòðóêòîð áàçîâîãî//êëàññà.

public SalesPerson(string fullName, int age, int empID, float currPay,string ssn, int numbOfSales): base(fullName, age, empID, currPay, ssn){// Ýòî êàñàåòñÿ íàñ!SalesNumber = numbOfSales;}

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

Как только в определении класса появляется специальный конст-руктор, конструктор по умолчанию из класса удаляется. Следова-тельно, нужно переопределить конструктор по умолчанию для типовSalesPerson и Manager.

Page 51: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

51

//Âåðíóòü êëàññó Manager êîíñòðóêòîð no óìîë÷àíèþ.public Manager() {}

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

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

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

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

12. Тип класс C#. Полиморфизм

Третий принцип ООП — полиморфизм, есть аспект ООП, пре-

доставляющий подклассу способ определения собственной версии

метода, определенного в его базовом классе, с использованием про-

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

(индексаторы и события здесь не рассматриваются). Для этого нужно

понять значение ключевых слов virtual и override. Если базовый

класс желает определить метод или свойство, которые могут быть

(но не обязательно) переопределены в подклассе, он должен поме-

тить этот член класса ключевым словом virtual:

Примечание. Методы и свойства, помеченные ключевым словомvirtual, называются виртуальными методами и виртуальными свой-ствами.

Примечание. Поля не могут быть виртуальными.

Когда класс желает изменить реализацию деталей виртуальногометода или свойства, он делает это с помощью ключевого словаoverride.

Page 52: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

52

Пример:

partial class Employee {// Ýòîò ìåòîä òåïåðü ìîæåò áûòü ïåðåîïðåäåëåí//ïðîèçâîäíûì êëàññîì.public virtual void GiveBonus(float amount){currPay += amount;}}

class SalesPerson : Employee{// Áîíóñ ïðîäàâöà çàâèñèò îò êîëè÷åñòâà ïðîäàæ.public override void GiveBonus(float amount){int salesBonus = 0;if (numberOfSales >= 0 && numberOfSales <= 100) salesBonus = 10;else{if (numberOfSales >= 101 && numberOfSales <= 200) salesBonus =15; else salesBonus = 20;}base.GiveBonus(amount * salesBonus);}}

Обратите внимание на использование каждым переопределенным

методом поведения по умолчанию через ключевое слово base. Та-

ким образом, полностью повторять реализацию логики GiveBonus()

вовсе не обязательно, а вместо этого можно повторно использовать

(и, возможно, расширять) поведение по умолчанию родительского

класса.

Ключевое слово sealed применяется к типу класса для предотв-

ращения расширения другими типами его поведения через наследо-

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

предотвратить переопределение некоторых виртуальных методов в

производных типах.

Page 53: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

53

Пример:

// SalesPerson çàïå÷àòàë ìåòîä GiveBonus()class SalesPerson : Employee{public override sealed void GiveBonus(float amount){...}}

Здесь SalesPerson действительно переопределяет виртуальныйметод GiveBonus(), определенный в классе Employee, однако он явнопомечен как sealed. Поэтому попытка переопределения этого мето-да в классе-наследнике приведет к ошибке во время компиляции.

12.1. Абстрактные классы

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

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

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

Для пометки метода как абстрактного в C# служит ключевоеслово abstract. Методы, помеченные как abstract, являются чис-тым протоколом. Они просто определяют имя, возвращаемый тип(если есть) и набор параметров (при необходимости).

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

Пример:

abstract class clsBase{

Page 54: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

54

//àáñòðàêòíûé ìåòîäabstract public void Describe();//àáñòðàêòíûå ñâîéñòâàabstract public double DoubleProp{get;}//òîëüêî äëÿ ÷òåíèÿabstract public int IntProp{set;}// òîëüêî äëÿ çàïèñèabstract public string StringProp{get;set;}// äëÿ ÷òåíèÿ è çàïèñè...}

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

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

12.2. Полиморфный интерфейс

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

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

Ниже в примере абстрактный класс Shape информирует типов-наследников о том, что у него есть метод по имени Draw(), которыйне принимает аргументов и ничего не возвращает. О необходимыхдеталях должен позаботиться наследник.

Пример:

abstract class Shape {public Shape(string name = "NoName")

Page 55: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

55

{ PetName = name; }public string PetName { get; set; }// Âûíóäèòü âñå äî÷åðíèå êëàññû îïðåäåëèòü ñâîþ//âèçóàëèçàöèþ.public abstract void Draw();}//Ñ ó÷åòîì ýòîãî ìåòîä Draw() â êëàññå Circle//òåïåðü äîëæåí áûòü îáÿçàòåëüíî ïåðåîïðåäåëåí,//ïîñêîëüêó êëàññ Circle àáñòðàêòíûì òèïîì íå //ÿâëÿåòñÿ.class Circle : Shape {public Circle () {}public Circle(string name) : base(name) {}public override void Draw(){Console.WriteLine("Drawing {0} the Circle", PetName);}class Hexagon : Shape {public Hexagon () {}public Hexagon (string name) : base(name) {}public override void Draw(){Console.WriteLine("Drawing {0} the Hexagon", PetName);}}

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

Предположим, что от абстрактного базового класса Shape уна-следовано еще пять классов (Triangle, Square и т. д.). Учитывая, чтовсе элементы в массиве myShapes действительно наследуются отShape, известно, что все они поддерживают один и тот же полиморф-ный интерфейс (или, говоря конкретно — все они имеют методDraw()). Выполняя итерацию по массиву ссылок Shape, исполняю-щая система сама определяет, объект какого конкретного класса

Page 56: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

56

наследника содержит каждый элемент массива. И в этот моментвызывается реализованная в данном классе-наследнике версия ме-тода Draw(), рисующая либо Triangle, либо Square и т. д.

Ниже метод Main() иллюстрирует использование полиморфизмав чистом виде.

Пример:

static void Main(string[] args){Console.WriteLine("***** Fun with Polymorphism *****\n");// Ñîçäàòü ìàññèâ ñîâìåñòèìûõ ñ Shape îáúåêòîâ.Shape[] myShapes = {new Hexagon(), new Circle(), newHexagon("Mick"), new Circle("Beth"), new Hexagon("Linda")};// Ïðîéòè öèêëîì no âñåì ýëåìåíòàì è//âçàèìîäåéñòâîâàòü ñ ïîëèìîðôíûì èíòåðôåéñîì.foreach (Shape s in myShapes){s.Draw ();}Console.ReadLine ();}

Íèæå ïîêàçàí ðåçóëüòàò ðàáîòû ìåòîäà Main():

***** Fun with Polymorphism *****Drawing NoName the HexagonDrawing NoName the CircleDrawing Mick the HexagonDrawing Beth the CircleDrawing Linda the Hexagon

13. Тип интерфейс C#

В С# интерфейс (interface) как тип представляет собой не бо-лее чем просто именованный набор абстрактных членов. Абст-рактные методы являются чистым протоколом, поскольку не име-ют никакой стандартной реализации.

На синтаксическом уровне любой интерфейс определяется с по-мощью ключевого слова interface. В отличие от классов, базовыйкласс (даже System.Object) для интерфейсов никогда не указывает-

Page 57: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

57

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

Примечание. По соглашению имена всех интерфейсов в .NET со-провождаются префиксом в виде заглавной буквы «'I'». При созда-нии собственных специальных интерфейсов рекомендуется тожеследовать этому соглашению.

Содержание конкретных членов данного класса или структуры,

реализующих интерфейс, зависит от того, какое поведение модели-

руется с его помощью данным классом или структурой. Другими

словами, интерфейс (или абстрактный метод) выражает поведение,

которое данным классом или структурой выбрано для его поддерж-

ки. Каждый класс (или структура) может поддерживать столько ин-

терфейсов, сколько необходимо, и, следовательно, тем самым под-

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

.NET поставляются сотни предопределенных типов интерфейсов,

которые реализуются в различных классах и структурах.

13.1. Сравнение интерфейсов и абстрактных базовых классов

Полиморфный интерфейс, предоставляемый абстрактным роди-

тельским классом, обладает одним серьезным ограничением: опре-

деляемые в абстрактном родительском классе члены поддержива-

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

страивать типы в разных иерархиях классов так, чтобы они поддер-

живали один и тот же полиморфный интерфейс, невозможно. В то же

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

туре, в любой иерархии и внутри любого пространства имен или сбор-

ки (написанной на любом языке программирования .NET). Очевид-

но, что это делает интерфейсы чрезвычайно полиморфными.

Рассмотрим стандартный интерфейс .NET по имени ICloneable,

определенный в пространстве имен System. Этот интерфейс имеет

единственный метод Clone ():

Page 58: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

58

Пример:

public interface ICloneable {object Clone ();}

Если заглянуть в документацию .NET Framework 4.0 SDK, мож-но обнаружить, что очень многие по виду несвязанные типы(System.Array, System.Data.SqlClient.SqlConnection, System.OperatingSystem, System.String и т. д.) реализуют этот интерфейс.В результате, хотя у этих типов нет общего родителя (кроме System.Object), с ними все равно можно работать полиморфным образомчерез интерфейс ICloneable.

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

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

Пример:

abstract class Shape {// Êàæäûé ïðîèçâîäíûé êëàññ òåïåðü äîëæåí// îáÿçàòåëüíî ïîääåðæèâàòü òàêîé ìåòîä!public abstract byte GetNumberOfPoints();}

Это не имеет смысла для наследников Shape, таких как Circle илиThreeDCircle, у которых нет вершин.

13.2. Реализация интерфейса

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

Page 59: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

59

Следует иметь в виду, что непосредственный базовый класс дол-жен быть обязательно перечислен в этом списке первым, сразу жепосле двоеточия. Когда тип класса наследуется прямо отSystem.Object, допускается перечислять только лишь поддерживае-мый им интерфейс или интерфейсы, поскольку компилятор C# авто-матически расширяет типы классов возможностями System.Objectв случае, если не было указано иначе. Из-за того, что структурывсегда наследуются от класса System.ValueType, интерфейсы про-сто должны перечисляться после определения структуры.

Определить, поддерживает ли данный тип тот или иной интер-фейс, можно с использованием ключевого слова as или is:

в первом случае, если объект удается интерпретировать какуказанный интерфейс, то возвращается ссылка на интересую-щий интерфейс, а если нет, то ссылка null;

во втором случае, если запрашиваемый объект несовместим суказанным интерфейсом, возвращается значение false, а еслисовместим, то true.

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

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

Пример:

// Ýòîò èíòåðôåéñ îïðåäåëÿåò ïîâåäåíèå "íàëè÷èå âåðøèí".public interface IPointy{byte GetNumberOfPoints();}

Создадим в текущем проекте три новых типа класса, два из которых(Knife (нож) и Fork (вилка)) будут представлять кухонные принадлеж-ности, а третий (PitchFork (вилы)) — инструмент для работы в саду.

Page 60: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

60

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

Пример:

static void Main(string[] args){// Â ýòîì ìàññèâå ìîãóò ñîäåðæàòüñÿ òîëüêî òèïû,// êîòîðûå ðåàëèçóþò èíòåðôåéñ IPointy.IPointy[] myPointyObjects = {new Hexagon(),new Knife(), new Triangle(), new Fork(), new PitchFork() };

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

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

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

14. Файловый ввод-вывод и сериализация объектов

14.1. Исследование пространства имен System.IO

Пространство имен System.IO в .NET — это область библиотекбазовых классов, относящаяся к службам файлового ввода-вывода,а также ввода-вывода из памяти. Многие типы из пространства имен

Page 61: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

61

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

В табл. 14.1 кратко описаны основные (неабстрактные) классы,которые дают понятие о функциональности System.IO.

Таблица 14.1

Ключевые члены пространства имен System.IO

Неабстрактные классыввода-вывода Назначение

BinaryReader Позволяют сохранять и извлекать элементарныетипы данных (целочисленные, булевские,строковые и т. п.) в двоичном видеBinaryWriter

BufferedStreamПредоставляет временное хранилище для потокабайтов, которые могут затем быть перенесены впостоянные хранилища

DirectoryИспользуются для манипуляций структуройкаталогов машины. Тип Directory представляетфункциональность, используя статические члены.Тип DirectoryInfo обеспечивает аналогичнуюфункциональность через действительнуюобъектную ссылку

DirectoryInfo

DriveInfoПредоставляет детальную информациюотносительно дисковых устройств, используемыхданной машиной

FileСлужат для манипуляций множеством файловданной машины. Тип File представляетфункциональность через статические члены.Тип FileInfo обеспечивает аналогичнуюфункциональность через действительнуюобъектную ссылку

FileInfo

FileStreamОбеспечивает произвольный доступк файлу (т. е. возможности поиска) с данными,представленными в виде потока байт

FileSystemWatcher Позволяет отслеживать модификации внешнихфайлов в определенном каталоге

MemoryStreamОбеспечивает произвольный доступк данным, хранящимся в памяти,а не в физическом файле

Page 62: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

62

Окончание табл. 14.1

В дополнение к этим конкретным типам классов в Systera.IO оп-ределено несколько перечислений, а также набор абстрактных клас-сов (т. е. Stream, TextReader и TextWriter), которые определяют раз-деляемый полиморфный интерфейс для всех наследников.

Перечисление FileMode (описание членов дано в табл. 14.2)

Пример:public enum FileMode{CreateNew,Create,Open,OpenOrCreate,Truncate,Append}

Таблица 14.2

Члены перечисления FileMode

Член Назначение

CreateNewИнформирует операционную систему о созданиинового файла. Если файл уже существует,генерируется исключение lOException

CreateИнформирует операционную систему о созданиинового файла. Если файл уже существует, он будетперезаписан

Неабстрактные классыввода-вывода Назначение

Path

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

StreamWriter Используются для хранениия(и извлечения) текстовой информации из файла.Не поддерживают произвольного доступа к файлуStreamReader

StringWriter Подобно классам StreamWriter/StreamReader, этиклассы также работают с текстовой информацией.Однако лежащим в основе хранилищем являетсястроковый буфер, а не физический файлStringReader

Page 63: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

63

Окончание табл. 14.2

Перечисление FileAccess — используется для определения пове-дения чтения/записи лежащего в основе потока.

Пример:public enum FileAccess {Read,Write,ReadWrite}

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

Пример:public enum FileShare {Delete,Inheritable,None,Read,ReadWrite,Write}

На этом знакомство с фундаментальными операциями ввода-вывода, предлагаемыми платформой .NET, завершим. Для болееподробного их изучения следует обратиться к литературе [1–3].

14.2. Cериализация объектов

В мире манипуляций вводом-выводом поток (stream) представ-ляет порцию данных, протекающую от источника к цели. Потоки

Член Назначение

OpenОткрывает существующий файл. Если файлне существует, генерируется исключениеFileNotFoundException

OpenOrCreate Открывает файл, если он существует; в противномслучае создает новый

Truncate Открывает файл и усекает его до нулевой длины

Append

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

Page 64: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

64

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

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

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

Метаданные и атрибутыОдной из особенностей платформы .NET является то, что про-

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

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

Атрибуты — это средство привязки информации к различнымсущностям: методам, свойствам, типам и даже целым сборкам. Посвоей сути атрибут — это экземпляр класса унаследованного от

Page 65: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

65

System.Attribute. Можно создавать свои атрибуты, с помощью на-следников от класса System.Attribute.

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

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

Для реализации отражения библиотека NET Framework предос-тавляет несколько классов, базовым для которых служит класс от-ражения System.Reflection.

Основные методы отражения, используемые для запроса атри-бутов, предоставляются классами System.Reflection.MemberInfo иSystem.Reflection.Assembly. Так, метод GetCustomAttributes позво-ляет определить атрибуты, присущие данному объекту.

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

понадобится только декорировать каждый связанный класс (илиструктуру) атрибутом [Serializable]. Если выясняется, что некото-рый тип имеет члены-данные, которые не должны (или не могут)участвовать в схеме сериализации, можно пометить такие поля ат-рибутом [NonSerialized]. Это помогает сократить размер хранимыхданных, при условии, что в сериализуемом классе есть переменные-члены, которые не следует «запоминать» (например, фиксированныезначения, случайные значения, кратковременные данные и т. п.).

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

Page 66: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

66

отображаются на классические отношения ООП (вроде отношений«является» и «имеет»), хотя достаточно хорошо моделируют эту па-радигму.

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

Атрибут [Serializable] не может наследоваться от родительскогокласса. Поэтому при наследовании типа, помеченного [Serializable],дочерний класс также должен быть помечен [Serializable] или же егонельзя будет сохранить в потоке. Фактически все объекты в графеобъектов должны быть помечены атрибутом [Serializable]. Попыткасериализовать несериализуемый объект с использованиемBinaryFormatter или SoapFormatter приводит к исключениюSerializationException во время выполнения.

Рассмотрим класс по имени Radio, помеченный атрибутом[Serializable], у которого исключается одна переменная-член (radioID),помеченная атрибутом [NonSerialized] и потому не сохраняемая вспецифицированном потоке данных, и два дополнительных типа, пред-ставляющих базовые классы JamesBondCar и Car (оба они такжепомечены атрибутом [Serializable]).

Пример:

//Îáðàòèòå âíèìàíèå, ÷òî â êàæäîì èç ýòèõ êëàññîâ ïîëÿ äàííûõ// îïðåäåëåíû êàê public, ýòî ñäåëàíî äëÿ óïðîùåíèÿ ïðèìåðà.[ Senalizable]public class Radio {public bool hasTweeters;public bool hasSubWoofers;public double[] stationPresets;[NonSerialized]public string radioID = "XF-552RR6";}//[Senalizable]public class Car {

Page 67: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

67

public Radio theRadio = new Radio();public bool isHatchBack;}//[Senalizable]public class JamesBondCar : Car {public bool canFly;public bool canSubmerge;}

Какого определения полей данных типа требуют различные фор-матеры, чтобы сериализовать их в поток? Если вы сохраняете со-стояние объекта, используя BinaryFormatter или SoapFormatter, торазницы никакой.

Эти типы запрограммированы для сериализации всех сериали-зуемых полей типа, независимо от того, представлены они обще-доступными полями, приватными полями или приватными полямис соответствующими общедоступными свойствами. Если есть эле-менты данных, которые не должны сохраняться в графе объектов,можно выборочно пометить общедоступные или приватные поляатрибутом [NonSerialized], как сделано со строковыми полями в типеRadio.

Сериализация объектовСлужбы сериализации .NET позволяют сохранять граф объектов

в различных форматах. Перечисленные возможности представленыследующими классами:

BinaryFormatter; SoapFormatter; XmlSerializer.Независимо от того, какой форматер выбран, каждый из них на-

следуется непосредственно от System.Object, так что они не разде-ляют общего набора членов от какого-то базового класса сериали-зации. Однако типы BinaryFormatter и SoapFormatter поддерживаютобщие члены через реализацию интерфейсов IFormatter иIRemotingFormatter.

Каким образом форматеры добиваются точности типов (typefidelity)? Когда используется тип BinaryFormatter, он сохраняет не

Page 68: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

68

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

Этот тип определен в пространстве имен System.Runtime.Serialization.Formatters.Binary, которое входит в сборку mscorlib.dll.Таким образом, чтобы получить доступ к этому типу, необходимоуказать следующую директиву using.

Пример:// Ïîëó÷èòü äîñòóï ê BinaryFormatter â mscorlib.dll.using System.Runtime.Serialization.Formatters. Binary;

Тип SoapFormatter сохраняет состояние объекта в виде сообще-ния SOAP (стандартный XML-формат для передачи и приема сооб-щений от веб-служб). Этот тип определен в пространстве именSystem.Runtime. Serialization.Formatters.Soap, находящемся в отдель-ной сборке. Поэтому для форматирования графа объектов в сооб-щение SOAP необходимо сначала установить ссылку наSystem.Runtime.Serialization.Formatters. Soap.dll, используя диалого-вое окно Add Reference (Добавить ссылку) в Visual Studio 2010, изатем указать следующую директиву using.

Пример:// Íåîáõîäèìà ññûëêà íà System.Runtime.//Serialization.Formatters.Soap.dllusing System.Runtime.Serialization.Formatters.Soap;

Для сохранения дерева объектов в документе XML имеется типXmlSerializer. Чтобы использовать этот тип, нужно указать директи-ву using для пространства имен System.Xml.Serialization и установитьссылку на сборку System.Xml.dll.

Пример:// Îïðåäåëåíî âíóòðè System.Xml.dll.using System.Xml.Serialization;

Page 69: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

69

Если необходимо сохранить состояние объекта так, чтобы егоможно было использовать в любой операционной системе (WindowsXP, Mac OS X и различных дистрибутивах Linux), на любой платфор-ме приложений (.NET, Java Enterprise Edition, СОМ и т. п.) или в лю-бом языке программирования, придерживаться полной точности ти-пов не следует, поскольку нельзя рассчитывать, что все возможныеадресаты смогут понять специфичные для .NET типы данных. Учи-тывая это, SoapFormatter и XmlSerializer являются идеальным выбо-ром, когда требуется гарантировать как можно более широкое рас-пространение объектов.

Сериализация объектов с использованием BinaryFormatterТип BinaryFormatter сериализует состояние объекта в поток, ис-

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

дует знать, являются Serialize() и Deserialize(): Serialize() сохраняет граф объектов в указанный поток в виде

последовательности байтов; Deserialize() преобразует сохраненную последовательность байт

в граф объектов.Предположим, что после создания экземпляра JamesBondCar и

модификации некоторых данных состояния требуется сохранить этотэкземпляр в файле *.dat. Первая задача — создание самого файла*.dat. Для этого можно создать экземпляр типа System. IO.FileStream.Затем следует создать экземпляр BinaryFormatter и передать емуFileStream и граф объектов для сохранения.

Пример:// Íå çàáóäüòå èìïîðòèðîâàòü ïðîñòðàíñòâà èìåí// System.Runtime.Serialization.Formatters.Binary è System.IO'static void Main(string[] args){Console.WnteLine("***** Fun with Ob]ect Serialization *****\n");// Ñîçäàòü JamesBondCar è óñòàíîâèòü ñîñòîÿíèå.JamesBondCar jbc = new JamesBondCar();jbc.canFly = true;jbc.canSubmerge = false;jbc.theRadio.stationPresets =new double[](89.3, 105.1, 97.1);jbc.thePadio.hasTweeters = true;

Page 70: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

// Ñîõðàíèòü îáúåêò â óêàçàííîì ôàéëå â äâîè÷íîì ôîðìàòå.SaveAsBmaryFormat (jbc,"CarData.dat" ) ;Console.ReadLine();}Ìåòîä SaveAsBinaryFormat() ðåàëèçîâàí ñëåäóþùèì îáðàçîì:static void SaveAsBinaryFormat(object objGraph, string fileName){// Ñîõðàíèòü îáúåêò â ôàéë CarData.dat â äâîè÷íîì âèäå.BinaryFormatter binFormat = new BmaryFormatter();using(Stream fStream = new FileStream(fileName,FileMode.Create, FileAccess.Write, FileShare.None)){binFormat.Serialize(fStream, objGraph);}Console.WriteLine("=> Saved car in binary format");}

Десериализация объектов с использованием BinaryFormatterТеперь предположим, что необходимо прочитать сохраненный

объект JamesBondCar из двоичного файла обратно в объектную пе-ременную. После открытия файла CataData.dat (методомFile.OpenRead()) просто вызвать метод Deserialize() классаBinaryFormatter. Нужно иметь в виду, что Deserialize() возвращаетобъект общего типа System.Object, так что понадобится применитьявное приведение, как показано ниже:

Пример:static void LoadFromBinaryFile(string fileName){BinaryFormatter binFormat = new BinaryFormatter();// Ïðî÷èòàòü JamesBondCar èà äâîè÷íîãî ôàéëà.using(Stream fStream = File.OpenRead(fileName)){JamesBondCar carFromDisk =(JamesBondCar)binFormat.Deserialize(fStream);Console.WriteLine("Can this car fly? : (0)", carFromDisk.canFly);}}

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

Page 71: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

71

Часть II. ЛАБОРАТОРНЫЕ РАБОТЫ

Задания лабораторных работ, которые приводятся в части II, ис-пользуют консольные программы и, соответственно, форматиро-ванный ввод-вывод осуществляется с помощью классаSystem.Console (см. раздел I–6).

Нумерация лабораторных работ в части II сквозная.

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

Поскольку программы разрабатываются в среде Visual Studio 2010,то при работе с ней следует помнить следующее:

решения и проекты — это контейнеры, которые Visual Studio2010 использует для размещения и группировки кода, которыйпишется в интегрированной среде;

контейнеры — это объекты, внутри которых размещены дру-гие объекты;

решения — это виртуальные контейнеры; они группируют свой-ства, относящиеся к одному (или нескольким), содержащимсяв решении, проектам. Внутри интегрированной среды можно на-строить несколько свойств на уровне решения.

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

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

Page 72: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

72

с расширением dll — динамическая библиотека, или ехе — ис-полняемый файл приложения).

С точки зрения программирования — все, что делается внутриVisual Studio 2010, происходит на уровне решения. Как мы уже упо-минали, сами по себе решения не делают ничего, кроме того, чтослужат контейнерами высокого уровня для прочих элементов. Про-екты — это самые очевидные элементы, которые можно поместитьвнутрь решений, но решения также могут содержать разнообразныефайлы, которые необходимы для самого решения (такие, как доку-менты Readme и диаграммы проекта). Фактически в решение мо-жет быть добавлен файл любого типа. Однако решения не могутсодержать другие решения. Кроме того, Visual Studio 2010 можетоткрыть только одно решение единовременно. Если нужно рабо-тать над несколькими решениями одновременно, то придется запу-стить еще один экземпляр Visual Studio 2010.

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

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

1. КОНСТРУКЦИИ ПРОГРАММИРОВАНИЯ НА C#

В этом разделе приводятся лабораторные работы № 1–4, зада-ния которых используют конструкции языка C# безотносительно кобъектно-ориентированному программированию. Подобные схожиеконструкции есть во многих языках программирования высокого уров-ня, в частности, в Си-подобных языках, Паскале и других.

Page 73: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

73

Как уже говорилось в части I раздела 5, в языке C# требуется, что-бы все члены данных и методы содержались внутри определения типа.

Поскольку программы разрабатываются в среде Visual Studio 2010,то программируя задания лабораторных работ в части II раздела 1,для этой цели необходимо создать консольный проект C# и исполь-зовать класс Program вместе с методом Main(). Если требуется, тов класс Program можно дополнительно ввести другие статическиеметоды (в частности, для большей модульности программного кода).

В арифметических выражениях используются свойства и мето-ды класса System.Math, в операциях со строками — свойства и ме-тоды класса System.String (см. часть I, раздел 4).

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

Лабораторная работа № 1

Алгоритмизация линейных вычислительных процессов

Задание 1. Стандартные типы данных и выраженияРазработать программу для нахождения параметра фигуры по

заданным вещественным значениям параметров, вводимым с кла-виатуры.

Вариант 1. Составить программу для нахождения полной поверх-ности пирамиды, в основании которой лежит квадрат со стороной b.Высота пирамиды b.

Вариант 2. Составить программу для нахождения объема пира-миды, в основании которой лежит квадрат со стороной b. Высотапирамиды h.

Вариант 3. Составить программу для нахождения объема пира-миды, в основании которой лежит равносторонний треугольник состороной b. Высота пирамиды h.

Вариант 4. Составить программу для нахождения площади треу-гольника по двум сторонам а, b и углу между ними.

Page 74: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

74

Вариант 5. Составить программу для нахождения объема и пол-ной поверхности цилиндра. Высота цилиндра h, радиус основания r.

Вариант 6. Составить программу для нахождения объема пря-мой призмы, в основании которой лежит прямоугольный треугольникс катетами а и b. Высота призмы h.

Вариант 7. Составить программу для нахождения полной поверх-ности прямой призмы, в основании которой лежит квадрат со сторо-ной b. Высота призмы h.

Вариант 8. Составить программу для нахождения полной поверх-ности прямой призмы, в основании которой лежит равностороннийтреугольник со стороной b. Высота призмы h.

Вариант 9. Составить программу для нахождения объема пря-мой призмы, в основании которой лежит квадрат со стороной b. Вы-сота призмы h.

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

Вариант 11. Составить программу для нахождения объема и пол-ной поверхности куба, ребро которого b.

Вариант 12. Составить программу для нахождения площади коль-ца, внутренний диаметр которого d, a внешний D.

Вариант 13. Составить программу для нахождения поверхностисферы и объема шара. Радиус шара r.

Вариант 14. Составить программу для нахождения полной по-верхности прямой призмы, в основании которой лежит прямоуголь-ный треугольник с катетами а и b. Высота призмы h.

Вариант 15. Составить программу для нахождения объема ци-линдрической трубы со стенками толщиной t. Внешний диаметр d,высота трубы h.

Задание 2. Арифметические выраженияРазработать программу вычисления по приведенной формуле F(x)

и вывести на экран результат в указанном формате. Функцию F(x)запрограммировать в виде статического метода в классе Program.Исходные данные вводятся с клавиатуры. Сверить полученный ре-зультат с ответом.

Page 75: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

75

Вариант 1

25

31 lg

2 ln(cos 4 ) ctg ,1 5!

lnгде 5! 1 2 3 4 5 , lg .

ln10

: 3,8 4,82 5,13.

x xF a x a

x

xx

Проверка x a F

Вариант 2

434 2 2 4

2

4 3

sin 0,96 1sin cos .

2,37

: 0,85 4,844.

x x x xF x x x

x x x

Проверка x F

Вариант 3

2 1.

2sin cos

sin cos

: 4,66; 0,83; 6,028.

a xaF a x a x e

a x x

Проверка x a F

Вариант 4

2 3

3

sin 1 7,2 ln sin .20

: 4,87; 3; 1,0021 10 .

axF x x xa x

Проверка x a F

Вариант 5

2

2 2 2

1

lg 1ctg ,

lnгде lg .

ln10

: 1,15; 3,71; 0,89; 2,9615 10 .

xb

x a aF x b x b

x a a x b

xx

Проверка x a b F

Page 76: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

76

Вариант 6

2

33,5 2

4

sin8,36 10 2sin ctg .

: 0,17; 3,81; 2,64 10 .

x

x xF a x

ax e

Проверка x a F

Вариант 7

4 2

30,836 1 arctg 3 2,306 .

8cos

: 0,672; 1,896.

a aF a a a

aa

Проверка a F

Вариант 8

23

2 1,2 2

1

13 ln tg .2

: 0,85; 2,34; 1,0736 10 .

a x a xF e x xa

Проверка x a F

Вариант 9

234 ln tg .

: 1,87; 0,53; 1,265.

a x aF a ax ax e

x

Проверка x a F

Вариант 10

23 2 22

1

ln2

.

sin 112

: 1,87; 1,367 10 .

aa a

a ea

Fa

Проверка a F

Page 77: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

77

Вариант 11

1,43 3

1

2,73 1,78.

2

: 1,25; 2,14; 3,31 10 .

axe a x x

F

x a tg a

Проверка x a F

Вариант 12

4 2

1

3sin 1 tg ln .

: 0,25; 0,31; 5,266 10 .

xx a xF x x x

a axx

Проверка x a F

Вариант 13

23 sin

ln .

: 3,89; 4,01; 2,394.

ax

x xF x x a x

x e

Проверка x a F

Вариант 14

2

1

lnlg ,

cos 2

lnгде lg .

ln10

: 0,97; 2,34; 7,44 10 .

ax x a xF tg

x a x

xx

Проверка x a F

Вариант 15

2,9 7 1,3

sin

1

1 7,2 10tg .

1 30cos

: 2,17; 0,11; 7,144 10 .

a

x

a aF x

a e

Проверка x a F

Page 78: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

78

Вариант 16

1

1,736 ln( ) arctg .2 2

: 2,4; 4,61 10 .

x xx e eF tg

Проверка x F

Лабораторная работа № 2

Разветвляющиеся вычислительные процессы

Задание 1

Ввести с клавиатуры 3 целых числа. Определить и выдать наэкран те числа, которые попадают в диапазон от 2 до 5. Если числопопадает на границу интервала, то сообщить об этом.

Задание 2

Дано натуральное число n (n 100), определяющее возраст чело-века (в годах). Дать для этого числа наименования «год», «года»,«лет». Например, 1 год, 23 года, 46 лет и т. д.

Задание 3

Написать программу решения квадратного уравнения ax2 + b + c = 0по введенным с клавиатуры вещественным коэффициентам, исполь-зуя условный оператор.

В зависимости от введенных коэффициентов уравнение можетиметь 2 действительных корня, 2 комплексных корня, один действи-тельный корень, множество решений и не иметь решения.

При a = b = c = 0 корней бесчисленное множество (х — любое).При a = b = 0, с 0 уравнение не имеет корней.

При a = 0, b 0, (с — любое) квадратное уравнение превращает-ся в линейное и имеет один корень x = –c/b.

При а 0 надо вычислить дискриминант d = b2 – 4ac. Если d < 0,то уравнение не имеет действительных корней, а имеет комплекс-

ные корни. Если d 0, то уравнение имеет два действительных кор-ня, которые вычисляются по формулам

Page 79: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

79

1 2; .2 2

b d b dx x

a a

Задание 4Пусть D — заштрихованная часть плоскости

и пусть u определяется по x и y следующим образом:

где x, y — вещественные числа, вводимые с клавиатуры.Написать программу, вычисления u, используя условный опера-

тор.Вывести результат с 5 знаками после запятой.

Задание 5Написать программу вычисления у (используя условный опера-

тор и оператор switch) по формуле

где a, x, y — вещественные числа, вводимые с клавиатуры. Выве-сти результат с 5 знаками после запятой.

Задание 6Пусть D — заштрихованная часть плоскости

,

,

Page 80: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

80

и пусть u определяется по x и y следующим образом:

где x, y — вещественные числа, вводимые с клавиатуры.Написать программу вычисления u, используя условный опера-

тор.Вывести результат с 5 знаками после запятой.

Задание 7Дано действительное число a, вводимое с клавиатуры. Написать

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

Вывести результат с 5 знаками после запятой.

,

Page 81: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

81

Задание 8Дано действительное число a, вводимое с клавиатуры. Написать

программу, вычисления функции f(x), график которой представлен наðèñóí êå, èñï î ëüçóÿ óñëî âí ûé î ï åðàòî ð. (Í à î òðåçêå x [6, 8] ис-пользуется квадратичная зависимость.)

Вывести результат с 5 знаками после запятой.

Лабораторная работа № 3

Организация итерационных циклических процессов

Задание 1Написать программу вычисления с помощью цикла с парамет-

ром нижеследующих выражений, где целое число n (1 n 100)вводится с клавиатуры.

1. Сумма

1

12 .

!

n

k k

2. Произведение

1

11 .

n

kk k

3. Выражение, вычисляемое по формуле (n — корней):

2 2 2 ... 2 .

Page 82: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

82

4. Выражение, вычисляемое по формуле

5. Используя вложенные циклы с параметром, написать програм-му вычисления суммы, где целое число n (1 < n < 1000) вводится склавиатуры:

0

.2 1

n n

i j i

n i

i j

Задание 2Написать программу вычисления с помощью цикла с условием

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

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

№ варианта Ряд Точное значение

1 1

2

3 ln 2

1 1 1...

1 2 2 3 3 4S

1 1 1...

1 3 3 5 5 7S

1 1 11 ...

2 3 4S

1

2

Page 83: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

83

№ варианта Ряд Точное значение

4

5 e

6

7

8

9

10 2

11

12

13

14

15

1 1 11 ...

3 5 7S

1 1 11 ...

1! 2! 3!S

1 1 11 ...

1! 2! 3!S

4 4

1 11 ...

2 3S

2 2 2

1 1 1...

1 3 5S

2 2

1 11 ...

2 3S

1 1 11 ...

2 4 8S

2 2 2

1 1 11 ...

2 3 4S

1 1 1...

1 2 3 2 3 4 3 4 5S

4 4 4

1 1 1...

1 3 5S

1 1 1...

1 3 2 4 3 5S

1 1 11 ...

2 4 8S

4

1

e

4

90

2

8

2

6

2

12

1

4

4

96

3

4

2

3

Page 84: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

84

Задание 3Написать программу табулирования функции f(x) на отрезке

[x0; xk] с шагом h > 0.Таблица функции f(x) на консоли должна быть представлена в

виде 3 столбцов под заголовками №, x, f(x), где № — номер строки,x — значение аргумента, f(x) — значение функции. Использоватьформатирование данных согласно части I раздела 6.

Функцию f(x) запрограммировать в виде статического метода вклассе Program.

С помощью оператора switch реализовать три случая: использовать цикл с предусловием; использовать цикл с постусловием; использовать цикл с параметром.

Вариант 1

5

23

2 ln cos 4 , если 0

( ) ; [ 2;2], 0,25.lg

3,5ctg , если 05

x x x

f x x hx

x xx

Вариант 2

4 2 2

4

3

sin, если 0

1( ) ; [ ; ], .

60,96 1, если 0

cos 2,37

x xx

xf x x h

x xx

x

Вариант 3

22

3

1, если 0

cos( ) ; [ 2;2], 0,25.

1ln tg , если 0

6

xxe x

x xf x x h

xx x

x

Page 85: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

85

Вариант 4

3

2 3

3,56 1, если 0( ) [ 3;3], 0,5.7,2 ln(sin )

, если 01

x x xf x x hx x

xx

Вариант 5

1,43 1,7 5 , если 1

( ) ; [0; 2], 0,2.2,79 tg , если 1

2

xe x x x

f x x hx x x

Вариант 6

43

2

21 arctg , если 0

cos( ) ; [ 2 ;2 ], .

3sinln 2,306 , если 0

1,5

xx x

xf x x h

xx x

x

Вариант 7

22 1,2

4

, если x 0( ) ; [ 2;2], 0,25.

13 ln tg , если 02

x xef x x hx

x x

Вариант 8

2( 2,4)

3

ln tg , если 06

( ) ; [ 3;3], 0,5.2 3

, если 01

x xe x

f x x hx x x

xx

Page 86: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

86

Вариант 9

2

3

2,67 ln sin, если 0

cos 1( ) ; [ ; ], .

61 1

tg , если 0

xx

xf x x h

xx

x

Вариант 10

1,3

sin

3

7,2 10 1, если 0

cos( ) ; [ 3;2], 0,5.

tg , если 030

x

xx

ef x x h

x x x

Вариант 11

2

2

3

sin( ), если 0

( ) ; [ 2;3], 0,5.

tg , если 03

x

x xx

x ef x x h

x x

Вариант 12

2

3

x

ln2,5 , если 0

cos ( 1)( ) ; [ 1;1], 0,2.

e 3,25lg , если 0

1 2

xx x

xf x x h

x xtg x

x

Вариант 13

3

4

1tg , если 0

2 4( ) ; [ ; ], .

6arctg 1,5, если 0

3

xx

f x x hx x

xx

Page 87: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

87

Вариант 14

2

3

arctg 2 , если 01( ) ; [ 3;2], 0,5.

3,2ln sin( 1), если 0

5 -1

xx

xf x x h

x x xx

Вариант 15

41

3

21 , если 0

( ) ; [ 1;1], 0,2.

15 ln 1,25, если 0

x

x

xx x

x ef x x h

x x x x

2. ТИП КЛАСС В ЯЗЫКЕ С#

Поскольку программы с использованием пользовательских клас-сов, согласно заданиям лабораторных работ части II раздела 2 раз-рабатываются в среде Visual Studio 2010, то необходимо создать кон-сольный проект C# и добавить к проекту (решению) с помощью пра-вой кнопки мыши, используя Solution Explorer (обозреватель реше-ний) новый элемент (файл, который будет содержать программныйкод пользовательского класса), именуемый по умолчанию Class1.cs.Это процедура должна повторяться для каждого вводимого в про-ект нового пользовательского класса. Описание классов, в том чис-ле и абстрактных — см. часть I, разделы 9–12.

Лабораторная работа № 4

Определение и тестирование классов

Создать проект Visual Studio 2010 для программируемого зада-ния. Использовать метод Main класса Program или, если требуется,то дополнительно введенные (в частности, для большей модульно-сти программного кода) в класс Program другие статические мето-ды, чтобы:

Page 88: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

88

создать объекты класса, используя все имеющиеся конструк-торы;

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

использовать модификатор private для полей; использовать свойства в конструкторе.

Задание 1Определить класс Point, разработав следующие элементы класса.Поля: int x, y.Конструкторы, позволяющие создать экземпляр класса: с нулевыми координатами; с заданными координатами.Методы, позволяющие: вывести координаты точки на экран; рассчитать расстояние от начала координат до точки; переместить точку на плоскости на вектор (a, b).Свойства, позволяющие: получить-установить координаты точки (доступное для чтений

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

записи).

Задание 2Определить класс Triangle, разработав следующие элементы класса.Поля: double a, b, c; string name; //имя объекта.Конструктор, позволяющий создать экземпляр класса по умол-

чанию.Конструктор, позволяющий создать экземпляр класса: с заданным именем; с заданными длинами сторон.

Page 89: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

89

Методы, позволяющие: вывести длины сторон треугольника на экран; расчитать периметр треугольника; расчитать площадь треугольника.Свойства, позволяющие: получить-установить длины сторон треугольника с ограничени-

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

рон (доступное только для чтения); получить имя объекта (доступное для чтения).

Задание 3Определить класс Rectangle, разработав следующие элементы

класса.Поля: double a, b; string name; //имя объекта.Конструктор, позволяющий создать экземпляр класса по умол-

чанию.Конструктор, позволяющий создать экземпляр класса: с заданным именем; с заданными длинами сторон.Методы, позволяющие: вывести длины сторон прямоугольника на экран; расчитать периметр прямоугольника; расчитать площадь прямоугольника.Свойства, позволяющие: получить-установить длины сторон прямоугольника с ограниче-

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

ступное только для чтения); получить имя объекта (доступное для чтения).

Задание 4Определить класс Money, разработав следующие элементы класса.

Page 90: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

90

Поля: int first;//номинал купюры; int second; //количество купюр.Конструктор, позволяющий: создать экземпляр класса с заданными значениями полей.Методы, позволяющие: вывести номинал и количество купюр; определить, хватит ли денежных средств на покупку товара на

сумму N рублей; определить, сколько шт. товара стоимости n рублей можно ку-

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

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

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

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

Лабораторная работа № 5

Определение и тестирование классов,использующих одномерные массивы

Создать проект Visual Studio 2010 для программируемого зада-ния. Использовать метод Main класса Program или, если требуется,то дополнительно введенные (в частности, для большей модульно-сти программного кода) в класс Program другие статические мето-ды, чтобы:

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

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

Page 91: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

91

использовать для инициализации массивов класс Random(см. часть I, раздел 8), если это оговорено в определении класса;

использовать модификатор private для полей; использовать свойства в конструкторе.

Задание 1Определить класс для работы с одномерным массивом типа

double, разработав следующие элементы класса.Поля: double [] dbArray; int n; // размерность массива; string name; //имя объекта.Конструктор, позволяющий создать экземпляр класса по умол-

чанию.Конструктор, позволяющий создать экземпляр класса: с заданным именем; устанавливающий размерность массива, выделяющий память

под заданное количество элементов массива и заполняющиймассив случайными числами типа double в диапазоне [–50, 50].

Методы, позволяющие: вывести массив на экран; определить среднее арифметическое значение положительных

элементов и среднее арифметическое значение отрицательных

элементов;

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

1 2... ,nnz a a a где a

1, a

2, … , a

n — положительные числа.

Свойства, позволяющие: получить-установить значение размерности массива с ограни-

чением — размерность больше нуля (доступное для чтения и

записи);

увеличить значение всех элементов массива на скаляр (доступ-

ное только для записи);

получить имя объекта (доступное для чтения).

Page 92: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

92

Задание 2Определить класс для работы с одномерным массивом типа

double, разработав следующие элементы класса.Поля: double [] dbArray; int n; // размерность массива; string name; //имя объекта.Конструктор, позволяющий создать экземпляр класса по умол-

чанию.Конструктор, позволяющийсоздать экземпляр класса: с заданным именем; устанавливающий размерность массива, выделяющий память

под заданное количество элементов массива и заполняющиймассив случайными числами типа double в диапазоне [–70, 70].

Методы, позволяющие: вывести массив на экран; найти максимальное произведение двух соседних элементов; найти среднее арифметическое элементов массива и порядко-

вый номер элемента, наиболее близкого к среднему арифмети-ческому.

Свойства, позволяющие: получить-установить значение размерности массива с ограни-

чением — размерность больше нуля (доступное для чтения изаписи);

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

получить имя объекта (доступное для чтения).

Задание 3Определить класс для работы с одномерным массивом типа int,

разработав следующие элементы класса.Поля: int[] intArray; int n; // размерность массива; string name; //имя объекта.

Page 93: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

93

Конструктор, позволяющий создать экземпляр класса по умол-чанию.

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

под заданное количество элементов массива и заполняющий мас-сив случайными числами типа int в диапазоне [–50, 51].

Методы, позволяющие: вывести массив на экран; найти количество и произведение элементов массива, кратных 3; найти произведение положительных нечетных элементов и под-

считать их число.Свойства, позволяющие: получить-установить значение размерности массива с ограни-

чением — размерность больше нуля (доступное для чтения изаписи);

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

получить имя объекта (доступное для чтения).

Задание 4Определить класс для работы с одномерным массивом типа int,

разработав следующие элементы класса.Поля: int[] intArray; int n; // размерность массива; string name; //имя объекта.Конструктор, позволяющий создать экземпляр класса по умол-

чанию.Конструктор, позволяющий создать экземпляр класса: с заданным именем; устанавливающий размерность массива, выделяющий память

под заданное количество элементов массива и заполняющиймассив случайными числами типа int в диапазоне [–50, 51].

Методы, позволяющие: вывести массив на экран;

Page 94: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

94

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

чением — размерность больше нуля (доступное для чтения изаписи);

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

получить имя объекта (доступное для чтения).

Задание 5Определить класс для работы с одномерным массивом типа

double, разработав следующие элементы класса.Поля: double [] dbArray; int n; // размерность массива; string name; // имя объекта.Конструктор, позволяющий создать экземпляр класса по умол-

чанию.Конструктор, позволяющий создать экземпляр класса: с заданным именем; устанавливающий размерность массива, выделяющий память

под заданное количество элементов массива и заполняющиймассив случайными числами типа double в диапазоне [–100, 100].

Методы, позволяющие: вывести массив на экран; найти сумму элементов с нечетными индексами и произведе-

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

чением — размерность больше нуля (доступное для чтения изаписи);

получить количество элементов массива, модуль которых мень-ше 10 (доступное только для чтения);

получить имя объекта (доступное для чтения).

Page 95: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

95

Задание 6Определить класс для работы с одномерным массивом типа int,

разработав следующие элементы класса.Поля: int[] intArray; int n; // размерность массива; string name; //имя объекта.Конструктор, позволяющий создать экземпляр класса по умол-

чанию.Конструктор, позволяющий создать экземпляр класса: с заданным именем; устанавливающий размерность массива и выделяющий память

под заданное количество элементов массива и заполняющиймассив случайными числами типа int в диапазоне [–80, 81].

Методы, позволяющие: вывести массив на экран; определить количество и сумму элементов, кратных 5; уменьшить все элементы с четными индексами на величину

максимального элемента этого массива и вывести массив наэкран.

Свойства, позволяющие: получить-установить значение размерности массива с ограни-

чением — размерность больше нуля (доступное для чтения изаписи);

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

получить имя объекта (доступное для чтения).

Лабораторная работа № 6

Определение и тестирование классов, использующихдвумерные массивы (матрицы)

Создать проект Visual Studio 2010 для программируемого зада-ния. Использовать метод Main класса Program или, если требуется,то дополнительно введенные (в частности, для большей модульно-

Page 96: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

96

сти программного кода) в класс Program другие статические мето-ды, чтобы:

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

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

использовать для инициализации массивов класс Random(см. часть I, раздел 8), если это оговорено в определении класса;

использовать модификатор private для полей; использовать свойства в конструкторе.

Задание 1Определить класс для работы с двумерным массивом (матри-

цей) типа int, разработав следующие элементы класса.Поля: int[] intArray; int m, n; //размерность матрицы (mn); string name; //имя объекта.Конструктор, позволяющий создать экземпляр класса по умол-

чанию.Конструктор, позволяющий создать экземпляр класса: с заданным именем; устанавливающий размерность матрицы, выделяющий память

под заданное количество элементов матрицы и заполняющийматрицу случайными числами типа int в диапазоне [–50, 51].

Методы, позволяющие: вывести матрицу на экран; вычислить произведение и число элементов матрицы, находя-

щихся под главной диагональю; вычислить сумму и число элементов матрицы, находящихся над

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

ничении размерности больше нуля (доступны для чтения и за-писи);

Page 97: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

97

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

получить имя объекта (доступное для чтения).

Задание 2Определить класс для работы с двумерным массивом (матри-

цей) типа int, разработав следующие элементы класса.Поля: int[] intArray; int m, n; //размерность матрицы (mn); string name; //имя объекта.Конструктор, позволяющий создать экземпляр класса по умол-

чанию.Конструктор, позволяющий создать экземпляр: с заданным именем; устанавливающий размерность матрицы, выделяющий память

под заданное количество элементов матрицы и заполняющийматрицу случайными числами типа int в диапазоне [–70, 71].

Методы, позволяющие: вывести матрицу на экран; вычислить произведение и число положительных элементов мат-

рицы, находящихся под главной диагональю; вычислить сумму и число отрицательных элементов матрицы,

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

ничении размерности больше нуля (доступны для чтения и за-писи);

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

получить имя объекта (доступное для чтения).

Задание 3Определить класс для работы с двумерным массивом (матри-

цей) типа int, разработав следующие элементы класса.

Page 98: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

98

Поля: int[] intArray; int m, n; //размерность матрицы (mn); string name; //имя объекта.Конструктор, позволяющий создать экземпляр класса по умол-

чанию.Конструктор, позволяющий создать экземпляр класса: с заданным именем; устанавливающий размерность матрицы (mn) и выделяющий

память под заданное количество элементов матрицы и запол-няющий матрицу случайными числами типа int в диапазоне[–40, 41].

Методы, позволяющие: вывести матрицу на экран; вычислить количество строк, содержащих хотя бы один нуле-

вой элемент; вычислить номер строки и номер столбца, на пересечении кото-

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

ничении размерности больше нуля (доступны для чтения и за-писи);

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

получить имя объекта (доступное для чтения).

Задание 4Определить класс для работы с двумерным массивом (матри-

цей) типа int, разработав следующие элементы класса.Поля: int[] intArray; int m, n; //размерность матрицы (mn); string name; //имя объекта.Конструктор, позволяющий создать экземпляр класса по умол-

чанию.

Page 99: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

99

Конструктор, позволяющий создать экземпляр класса: с заданным именем; устанавливающий размерность матрицы (mn) и выделяющий

память под заданное количество элементов матрицы и запол-няющий матрицу случайными числами типа int в диапазоне[–60, 61].

Методы, позволяющие: вывести матрицу на экран;

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

ничении размерности больше нуля (доступны для чтения и за-писи);

получить количество ненулевых элементов массива (доступноетолько для чтения);

получить имя объекта (доступное для чтения).

Задание 5Определить класс для работы с двумерным массивом (матри-

цей) типа int, разработав следующие элементы класса.Поля: int[] intArray; int m, n; //размерность матрицы (mn);

string name; //имя объекта.Конструктор, позволяющий создать экземпляр класса по умол-

чанию.Конструктор, позволяющий создать экземпляр класса: с заданным именем; устанавливающий размерность матрицы (mn) и выделяющий

память под заданное количество элементов матрицы и запол-няющий матрицу случайными числами типа int в диапазоне[–50, 51].

Методы, позволяющие: вывести матрицу на экран;

Page 100: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

100

вычислить сумму элементов столбца, в котором расположен

минимальный элемент матрицы;

вычислить сумму наименьших значений элементов ее столб-

цов.Свойства, позволяющие:

получить-установить значения размерности матрицы при огра-

ничении — размерности больше нуля (доступны для чтения и

записи);

для получения количества элементов массива, модуль которых

меньше 10; (доступное только для чтения);

получить имя объекта (доступное для чтения).

Задание 6

Определить класс для работы с двумерным массивом (матри-

цей) типа int, разработав следующие элементы класса.

Поля:

int[] intArray;

int m, n; //размерность матрицы (mn);

string name; //имя объекта.

Конструктор, позволяющий создать экземпляр класса по умол-

чанию.

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

устанавливающий размерность матрицы (mn) и выделяющий

память под заданное количество элементов матрицы и запол-

няющий массив случайными числами типа int в диапазоне [–80,

81].

Методы, позволяющие: вывести матрицу на экран;

найти в каждой строке матрицы наибольший элемент, поменять

его местами с элементом главной диагонали, а на его место

записать минимальный элемент этой строки, и вывести матри-

цу на экран;

вычислить номер столбца с наименьшей суммой элементов.

Page 101: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

101

Свойства, позволяющие: получить-установить значения размерности матрицы при огра-

ничении размерности больше нуля (доступны для чтения и за-писи);

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

получить имя объекта (доступное для чтения).

Лабораторная работа № 7

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

Создать проект Visual Studio 2010 для программируемого зада-ния. Использовать метод Main класса Program или, если требуется,то дополнительно введенные (в частности, для большей модульно-сти программного кода) в класс Program другие статические мето-ды, чтобы:

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

запрограммировать вывод на экран имен объектов классов —наследников, содержащихся в массиве класса Picture.

При создании классов — наследников и класса Picture: использовать модификатор private для полей; использовать свойства в конструкторе.

Задание 1Определить абстрактный класс Shape с абстрактными свойства-

ми и методами (см. часть I, раздел 12): абстрактные свойства класса Shape:параметр (один), определяющий фигуру (доступное для чтения изаписи);подсчет числа вершин фигуры (доступное только для чтения);позволяющее получить имя объекта (доступное для чтения);

Page 102: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

102

абстрактные методы класса Shape:вычисления площади и периметра фигуры;рисования закрашенной фигуры (для консоли — соответствую-щее текстовое сообщение).Определить классы-наследники (в качестве примера подобных

классов см. лабораторную работу № 5, задания 2, 3): Square (квадрат — задается длиной стороны); Circle (окружность — задается радиусом); Triangle (равносторонний треугольник — задается длиной сто-

роны).В классах Square, Circle и Triangle должны быть реализованы аб-

страктные свойства и методы класса Shape.Определить класс Picture, содержащий массив объектов этих

классов (см. ниже).Класс PictureПоля: Shape [] shpArray; int n; // размерность массива.Конструктор, позволяющий создать экземпляр класса: устанавливающий размерность массива и выделяющий память

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

чением размерности больше нуля (доступное для чтения и за-писи).

Задание 2Определить абстрактный класс Shape с абстрактными свойства-

ми и методами (см. часть I, раздел 12): абстрактные свойства класса Shape:параметры (два), определяющих фигуру (доступное для чтения изаписи);подсчет числа вершин фигуры (доступное только для чтения);позволяющее получить имя объекта (доступное для чтения);

Page 103: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

103

абстрактные методы класса Shape:вычисления площади и периметра фигуры;рисование закрашенной фигуры (для консоли — соответствую-щее текстовое сообщение.)Определить классы — наследники (в качестве примера подоб-

ных классов см. лабораторную работу № 5, задания 2, 3): Pentagon (правильный пятиугольник — задается длиной сторо-

ны и числом сторон); Ellipse (эллипс — задается полуосями); Triangle (прямоугольный треугольник — задается длиной кате-

тов).В классах Pentagon, Ellipse и Triangle должны быть реализованы

абстрактные свойства и методы класса Shape.Определить класс Picture, содержащий массив объектов этих

классов (см. задание 1).

Задание 3Определить абстрактный класс Triangle с абстрактными свой-

ствами и методами (см. часть I, раздел 12): абстрактные свойства класса Triangle:для длин двух сторон и угла между ними (доступное для чтения изаписи);позволяющее получить имя объекта (доступное для чтения); абстрактные методы класса Triangle:вычисления площади и периметра фигуры;рисование закрашенного треугольника (для консоли — соответ-ствующее текстовое сообщение.)Определить классы — наследники (в качестве примера подоб-

ных классов см. лабораторную работу № 5, задание 2): EqTriangle (равносторонний треугольник); IsTriangle (равнобедренный треугольник); RectTriangle (прямоугольный треугольник).В классах EqTriangle, IsTriangle и RectTriangle должны быть реа-

лизованы абстрактные свойства и методы класса Triangle.Определить класс Picture, содержащий массив объектов этих

классов (см. задание 1).

Page 104: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

Библиографический список

Нейгел Кристиан. C# 4.0 и платформа .NET 4 для профессиона-лов : пер. с англ. / Нейгел Кристиан, Ивьен Билл, Глинн Джей,Уотсон Карли. — М. : ООО «И.Д. Вильямс», 2011. — 1440 с. : ил.

Рихтер Дж. CLR via C#. Программирование на платформеMicrosoft .NET Framework 4.5 на языке C#. 4-е изд. / Дж. Рихтер. —СПб. : Питер, 2013. — 896 с.: ил. — (Серия «Мастер-класс»).

Троелсен Эндрю. Язык программирования C# 2010 и платформа.NET 4.0, 5-е изд. : пер. с англ. / Эндрю Троелсен. — М. : ООО«И.Д. Вильямс», 2011. — 1392 с. : ил.

Page 105: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

Учебное издание

РАЗРАБОТКА АЛГОРИТМОВС ИСПОЛЬЗОВАНИЕМ ПРИНЦИПОВ

ООП НА ЯЗЫКЕ С#

Учебно-методическое пособие

Калинин Александр Александрович

Редактор Е.Б. КазаковаКомпьютерная верстка И.В. Бурлаковой

Page 106: РАЗРАБОТКА АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ ...storage.elib.mgup.ru/7/Kalinin_2014.pdf · 2018-02-02 · УДК 004.43 ББК 32.973.26-018.1 К37 А.А

Подписано в печать 25.02.14.Формат 6084/16. Бумага офсетная. Гарнитура «Times New Roman».Печать на ризографе. Усл. печ. л. 6,16. Тираж 50 экз. Заказ № 32.

Московский государственный университет печати имени Ивана Федорова.127550, Москва, ул. Прянишникова, 2А.

Отпечатано в Издательстве МГУП имени Ивана Федорова.