Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

Информатика и программирование: основы разработки программ на языке C#

Покупка
Артикул: 753041.01.99
Доступ онлайн
2 000 ₽
В корзину
Алгоритмические языки высокого уровня - это основа и фундамент для разработки сложных информационных комплексов и систем. Дисциплина, изучающая эти средства, имеет как теоретическую составляющую (процедурный и объектно-ориентированный подход к анализу предметной области), так и практико-ориентированную (синтез информационной системы с помощью инструментов процедурной или объектно-ориентированной разработки). Такая дисциплина является важной составляющей профессиональной подготовки бакалавров в области информационных технологий. Она может быть основана на разных языковых средствах, а представленный учебник дает как теоретические знания, так и практические навыки по разработке приложений в среде Visual Studio (2005-2012) на языке программирования С#. Учебник предназначен для студентов специальностей 230100 «Информатика и вычислительная техника», 231300 «Прикладная математика», 230700 «Прикладная Информатика», 220700 «Автоматизация технологических процессов и производств».
Мурадханов, С. Э. Информатика и программирование: основы разработки программ на языке C# : учебник / С. Э. Мурадханов, А. И. Широков. - Москва : Изд. Дом МИСиС, 2013. - 304 с. - ISBN 978-5-87623-735-4. - Текст : электронный. - URL: https://znanium.com/catalog/product/1232387 (дата обращения: 18.05.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов. Для полноценной работы с документом, пожалуйста, перейдите в ридер.
МИНИСТЕРСТВО ОБРА ЗОВАНИЯ И НАУКИ РФ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ 
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ 
«НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ТЕХНОЛОГИЧЕСКИЙ УНИВЕРСИТЕТ «МИСиС»

№ 2160

Кафедра автоматизированных систем управления 

С.Э. Мурадханов 
А.И. Широков

Информатика
и программирование

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

Учебник

Допущено Учебно-методическим объединением
по образованию в области прикладной информатики
в качестве учебика для студентов, обучающихся 
по направлению «Прикладная информатика» 
и другим экономическим специальностяма

Москва  2013

УДК 681.30
 
М91

Р е ц е н з е н т
канд. техн. наук, доц. И.Н. Лесовская
(Национальный исследовательский университет
«Высшая школа экономики»)

Мурадханов, С.Э.
М91  
Информатика и программирование : основы разработки программ на языке C#  : учеб.  / С.Э. Мурадханов, А.И. Широков. – 
М. : Изд. Дом МИСиС, 2013. – 304 с.
ISBN 978-5-87623-735-4

Алгоритмические языки высокого уровня – это основа и фундамент для 
разработки сложных информационных комплексов и систем. Дисциплина, изучающая эти средства, имеет как теоретическую составляющую (процедурный и объектно-ориентированный подход к анализу предметной области), так 
и практико-ориентированную (синтез информационной системы с помощью 
инструментов процедурной или объектно-ориентированной разработки). Такая дисциплина является важной составляющей профессиональной подготовки бакалавров в области информационных технологий. Она может быть 
основана на разных языковых средствах, а представленный учебник дает как 
теоретические знания, так и практические навыки по разработке приложений 
в среде Visual Studio (2005–2012) на языке программирования С#. 
Учебник предназначен для студентов специальностей 230100 «Информатика и вычислительная техника», 231300 «Прикладная математика», 230700 
«Прикладная Информатика», 220700 «Автоматизация технологических процессов и производств».
УДК 681.30

ISBN 978-5-87623-735-4
 С.Э. Мурадханов, 
А.И. Широков, 2013

ОГЛАВЛЕНИЕ

Оглавление .................................................................................................3
Предисловие ..............................................................................................5
1. Парадигмы программирования ............................................................6
1.1. Процедурное программирование  ................................................... 7
1.2. Модульное программирование  ..................................................... 10
1.3. Структурное программирование  ...................................................11
1.4. Функциональное программирование  .......................................... 14
1.5. Логическое программирование  .................................................... 18
1.6. Объектно-ориентированное программирование  ........................ 22
Контрольные вопросы ........................................................................... 40
2. Основные понятия языка программирования С# ............................41
2.1. Алфавит, синтаксис, лексемы ........................................................ 42
2.2. C# – общая структура программы (приложения) ........................ 56
2.3. Типы данных  ................................................................................... 61
2.4. Переменные и константы ............................................................... 82
2.5. Операции и выражения .................................................................. 98
2.6. Операторы языка C# ..................................................................... 130
2.6.1. Операторы следования .......................................................... 131
2.6.2. Операторы ветвления ............................................................ 133
2.6.3. Операторы цикла ................................................................... 141
2.6.4. Операторы управления-перехода ......................................... 152
2.6.5. Операторы обработки исключений ..................................... 155
2.6.6. Операторы Атрибуты, Спецификаторы, Сериализация .... 160
Контрольные вопросы ......................................................................... 166
3. Пользовательские типы С# ..............................................................167
3.1. Перечисления ................................................................................. 167
3.2. Структуры ...................................................................................... 171
3.3. Массивы ......................................................................................... 181
3.3.1. Одномерные массивы ............................................................ 182
3.3.2. Многомерные массивы ......................................................... 187
3.3.3. Ступенчатые массивы (массивы массивов) ........................ 193
3.3.4. Класс System.Array – массив как объект ............................. 199
3.3.5. Сортировка массивов ............................................................ 205
3.3.6. Массивы и копирование (клонирование) ............................ 210
3.4. Строки и символы ......................................................................... 214
3.4.1. Символы char (класс System.Сhar) ....................................... 214
3.4.2. Неизменяемые строки string (класс System.String) ............ 222

3.4.3. Изменяемые строки StringBuilder
(класс System.Text.StringBuilder) .................................................... 237
3.4.4. Регулярные выражения ......................................................... 245
Контрольные вопросы ......................................................................... 264
4. Методы ...............................................................................................265
4.1. Описание метода ........................................................................... 265
4.2. Методы-процедуры и методы-функции ..................................... 268
4.3. Статические методы ..................................................................... 269
4.4. Методы – передача параметров ................................................... 271
Контрольные вопросы ......................................................................... 279
Библиографический список .................................................................280
Приложение ...........................................................................................282

ПРЕДИСЛОВИЕ

Современный уровень развития общества предполагает широкое 
использование информационных технологий в различных сферах 
деятельности. Знания в области информационных технологий и их 
умелое использование обеспечивают конкурентоспособность специалиста. Специалисты в области информационных технологий должны 
владеть современными технологиями разработки программ. 
В настоящем издании представлены основные понятия языка программирования C# и способы их использования при разработке в 
среде .Net Framework. Приобретаемые при изучении изложенного материала навыки являются необходимым начальным этапом для углубленного изучения объектно-ориентированного подхода и возможностей платформы Microsoft .Net Framework. 
В целом материал учебника ориентирован прежде всего на студентов, обучающихся по специальностям в области информационных 
технологий, но будет полезен также и для желающих самостоятельно освоить язык программирования C#. Учебник посвящен основам 
этого языка, без знания которых невозможно его практическое применение.
Язык программирования C# нельзя изучать «линейно» – «от аксиом к теоремам, описаниям и задачам», поэтому предлагаемый материал (программирование на языке С#) излагается «по спирали». Некоторые понятия, использованные в той или иной программе-примере, 
имеют краткое описание, но в последующих разделах они будут полностью рассмотрены и объяснены.  

1. ПАРАДИГМЫ ПРОГРАММИРОВАНИЯ

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

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

Классификация парадигм языков программирования:
• директивные (directive), называемые также процедурными (procedural), или императивными (imperative) – Algol, Fortran, Basic, Pascal, C; 
• декларативные (declarative) – делятся на две группы: 
 – функциональные (functional) – Lisp, Scheme, Erlang, CAML, 
Haskell, Clean;
 – логические (logic) – Prolog (Пролог), Visual Prolog, Mercury, 
Godel;
• объектно-ориентированные (object-oriented) – C++, C#, Java, Python, Ruby.

Разница между декларативной и директивной парадигмами состоит в том, что в первой программа заявляет (декларирует), что должно 
быть достигнуто в качестве цели, а во второй – предписывает, как ее 
достичь. Обычно это поясняется примером с курьером, которому надо 
пройти из пункта А в пункт Б. В декларативной программе описывается план города, в котором указано, где расположены оба пункта и правила уличного движения. Руководствуясь этими правилами и планом 
города, курьер должен определить путь от исходного пункта к конечному. В директивной программе приводится список команд, задающих 
точное указание перемещений от начального пункта к конечному.

1.1. Процедурное программирование 

Процедурное программирование (появилось в 50-е годы ХХ в.) – 
это парадигма программирования, основанная на концепции вызова 
процедур (подпрограмм). Процедурное программирование – отражение архитектуры ЭВМ (предложено Джоном фон Нейманом в 
40-х годах ХХ в. и применяется до настоящего времени). 

Примечание. Архитектура Джона фон Неймана предполагает, что компьютер должен содержать следующие устройства: 
а) арифметическо-логическое устройство для выполнения операций; 
б) устройство управления для организации процесса выполнения программ; в) запоминающее устройство для хранения программ и данных. Кроме структуры компьютера фон Нейман (в 1945 г.) объявил 
принципы, положенные в основу архитектуры большинства электронных вычислительных машин:
1) принцип программного управления (программа состоит из 
набора команд, которые выполняются процессором автоматически 
друг за другом в заданной последовательности);
2) принцип однородности памяти (программы и данные хранятся в одной и той же памяти; над командами можно выполнять такие же действия, как и над данными);
3) принцип адресности (основная память структурно состоит 
из пронумерованных ячеек – отсюда следует возможность давать 
имена областям памяти, так чтобы к запомненным в них значениям 
можно было впоследствии обращаться или менять их в процессе выполнения программ с использованием присвоенных имен).
Компьютеры, построенные на этих принципах и имеющие объявленную структуру, относят к типу фон-неймановских.

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

Примечание. Алан Тьюринг для обоснования и уточнения понятия 
алгоритма предложил абстрактный универсальный исполнитель 
(1936 г.) – абстрактную логическую вычислительную конструкцию, 
названную впоследствии «машиной Тьюринга» (МТ). МТ – устройство, состоящее из бесконечной ленты, разделенной на ячейки и 
головки для чтения/записи. Ячейка МТ может содержать символы 3 типов: 0, 1, пусто. В МТ нет ограничений на набор символов: 
можно применять любые символы. В каждый отдельный момент 
времени головка МТ находится над одной из ячеек и считывает ее 
содержимое. В зависимости от содержимого ячейки МТ может выполнить одну из операций: стереть текущее содержимое ячейки (E), 

напечатать что-либо в ячейке (P), сдвинуть головку вдоль ленты на 
одну ячейку влево (L) или вправо (R), завершить работу (H – операция 
остановки). МТ всегда находится в одном из помеченных состояний 
(пометка может быть чем угодно – буквой, словом, числом – главное, чтобы МТ могла отличить одно состояние от других). Работа 
МТ состоит в считывании символа из ячейки, над которой находится головка, выполнении некоторых операций и переходе к следующему 
состоянию. Операций может быть несколько (стереть символ, напечатать 1, сдвинуть головку влево: запись – E, P1, L). 
Пример. МТ – сложение чисел. На ленте имеется два числа, 
представленные в единичной форме (число 3 представляется как последовательность 111), разделенные одной пустой ячейкой. Записать 
на ленте последовательность – сумму двух чисел. Информация на 
ленте МТ представлена в виде -111-11111-. В конце на ленте должна 
остаться последовательность -11111111-. Вначале головка МТ считывает самую левую единицу:
 | Состояние | Текущий символ | Операция | Следующее |
 
 
 
|  состояние |
 |  
a 
|  
1 
|  
R 
|  
a  
|
 |  
a  
|  
–  
|  
P1, R  |  
b  
|
 |  
b  
|  
1  
|  
R  
|  
b  
|
 |  
b  
|  
–  
|  
L  
|  
c  
|
 |  
c  
|  
1  
|  
E, H  
|
Начальных состояний может быть сколько угодно. МТ может 
находиться в состоянии b и считывать символ 1, или находиться в 
том же состоянии, но считывать пустой символ. Структура программы МТ: при заданном состоянии и текущем символе требуется выбрать операцию. Программа сканирует последовательность из 
единиц слева направо до тех пор, пока не будет обнаружена ячейка, содержащая пустой символ. В эту ячейку записывается единица. 
Чтобы «скорректировать» сумму для получения правильного значения, необходимо найти самую правую единицу, стереть ее и остановиться. 
Ход работы МТ выглядит так: «-111-11111-» «-111111111-» 
«-11111111-».

Одним из первых процедурных языков программирования высокого уровня стал Фортран (Fortran – Formula Translator), созданный в 
1954–1957 гг. ХХ в. в США под руководством Джона Бэкуса в кор
порации IBM (языки программирования Алгол60, Кобол (Cobol), Паскаль (Pascal) и Си (C) продолжили это направление). Совершенствование языков процедурного программирования и технологии привело 
к появлению модульного программирования (программа проектируется из независимых частей – модулей, в которых используется единый принцип передачи данных между модулями – интерфейс).

1.2. Модульное программирование 

Модульное программирование (появилось в начале 60-х годов 
ХХ в.) – это парадигма программирования, основанная на концепции 
разбиения программной системы на раздельно компилируемые компоненты (модули), каждый из которых представляет собой набор связанных процедур вместе с данными, которые обрабатываются только 
этими процедурами. Концепцию впервые реализовал Н. Вирт в языке 
Modula, а затем ее «подхватили» и остальные, распространенные в 
то время языки программирования. Парадигма модульного программирования гласит: «Надо определить необходимые модули и реализовать их так, чтобы данные и процедуры были скрыты в этих модулях». Физическим представлением каждого модуля является файл. 
Модули после раздельной компиляции используются в программной 
системе в виде независимых частей (это позволяет использовать модули как инструмент разработки библиотек прикладных программ). 
Для того чтобы обеспечить максимальную независимость модулей 
друг от друга, надо четко отделить процедуры и данные, которые будут вызываться другими модулями, – открытые (public) процедуры 
и данные – от вспомогательных процедур и данных, которые используются только в этом (данном) модуле, – закрытых (private) процедур 
и данных. Первые перечисляются в отдельной части модуля – интерфейсе (interface), вторые участвуют только в реализации (implementation) модуля. В разных языках программирования это деление производится по-разному. В языке Pascal модуль специально делится на 
интерфейс и реализацию; в языке С интерфейс выносится в отдельные «головные» (header) файлы; в языке C++ для описания интерфейса используются абстрактные классы; в языке Java для описания интерфейса используются абстрактные классы и конструкция interface. 
В процессе разработки программы ее модульная структура может 
по-разному формироваться и использоваться для определения порядка программирования и отладки модулей, указанных в этой структу
ре. Поэтому можно говорить о разных методах разработки структуры программы. Обычно в литературе обсуждаются два метода: метод 
восходящей разработки и метод нисходящей разработки.
Метод восходящей разработки заключается в следующем. Сначала строится модульная структура программы в виде дерева. Затем 
поочередно программируются модули программы, начиная с модулей 
самого нижнего уровня (листья дерева модульной структуры программы), в таком порядке, чтобы для каждого программируемого модуля были уже запрограммированы все модули, к которым он может 
обращаться. После того как все модули программы запрограммированы, производится их поочередное тестирование и отладка в таком же 
(восходящем) порядке, в каком производилось их программирование.
Метод нисходящей разработки предполагает, как и предыдущий 
метод, сначала построение модульной структуры программы в виде 
дерева. Затем поочередно программируются модули программы, начиная с модуля самого верхнего уровня (головного), с переходом к 
программированию какого-либо другого модуля только в том случае, 
если уже запрограммирован модуль, который к нему обращается. После того как все модули программы запрограммированы, производится их поочередное тестирование и отладка в таком же (нисходящем) 
порядке. 
Парадигма модульного программирования также известна как 
«принцип сокрытия данных», который легко расширяется до понятия 
«сокрытие информации», что позволяет скрыть от пользователя не 
только детали реализации каждого модуля, но и детали реализации 
процедур. На основе модульности строятся библиотеки процедур и 
функций, которые обеспечивают полный набор действий с библиотекой с использованием общих структур данных, процедур и функций. 

1.3. Структурное программирование 

Идеи структурного программирования появились в начале 70-х годов ХХ в. в компании IBM, в их разработке участвовали известные 
ученые Э. Дейкстра, Х. Милс, Э. Кнут, С. Хоор. Развитие технологии структурного программирования связано с публикацией письма Э. Дейкстры (1968 г.) в Ассоциацию вычислительной техники 
(ACM – Association for Computing Machinery) «О вреде использования операторов GOTO». В те времена программы создавались с активным использованием операторов безусловного перехода. Непра
вильное и необдуманное использование произвольных переходов в 
тексте программы приводит к получению запутанных, плохо структурированных программ («спагетти-код», или «лапша» – плохо 
спроектированная, запутанная и трудная для понимания программа, содержащая много операторов GOTO, исключений и других конструкций, «ухудшающих» структурированность), по тексту которых 
практически невозможно понять порядок исполнения и взаимозависимость фрагментов. Обращая внимание на недостатки таких программ, Дийкстра предложил концепцию структурного программирования (развитую впоследствии Николаусом Виртом), позволяющую 
избежать использования таких операторов. 
Структурное программирование – это парадигма программирования, ос нованная на концепции представления структуры любой 
программной системы в виде 4 базовых управляющих конструкций:
• последовательное исполнение – однократное выполнение операций в том порядке, в котором они записаны в тексте программы [последовательность действий]; 
• ветвление – однократное выполнение одной из двух или более 
опера ций, в зависимости от выполнения некоторого заданного условия [альтернатива-условие]; 
• цикл – многократное исполнение одной операции до тех пор, 
пока выполняется некоторое заданное условие (условие продолжения 
цикла) [повторение-цикл];
• вызов процедур (подпрограмм).
Управляющие конструкции допускают вложенность. В управляющие операторы можно включать вызовы процедур (оформленных как 
модули), так что структурное программирование использует модульный принцип. Модуль может содержать обращения к другим модулям. 
Это обеспечивает принцип нисходящего проектирования программ 
(принцип сверху вниз). По этому принципу алгоритм сначала разбивается на этапы, затем каждый этап делится на более мелкие этапы 
второго уровня и т.д. После этого каждый этап проектируется как отдельный модуль. Нисходящее проектирование считается наиболее 
продуктивным, так как реализует общий принцип системного подхода, при котором легко распределять разработку программы по отдельным исполнителям и осуществлять общее руководство. 

Примечание. Методы управления – это система способов воздействия субъекта управления на объект для достижения определенно
Доступ онлайн
2 000 ₽
В корзину