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

Язык С#. Решение задач

Покупка
Артикул: 469262.02.99
Доступ онлайн
180 ₽
В корзину
Учебное пособие представляет собой сборник задач с решения ми в виде программ на языке C# в интегрированной среде разработки Microsoft Visual Studio 2010, 2012. Решения задач снабжены подробными объяснениями всех алгоритмических и конструктивных особенностей кода. Задачи книги расположены по нарастающей сложности и позволяют читателю, начав с элементов языка C#, получить навыки программирования достаточно высокого уровня. От консольных программ читатель переходит к созданию библиотек классов и полноэкранным Windows-приложениям. В последних главах книги рассмотрено применение методологии эволюционного подхода к проектированию программ, а последняя задача посвящена разработке библиотеки классов для численного интегрирования систем дифференциальных уравнений и применению свободно распространяемой графической библиотеки ZedGraph. Книга рассчитана на широкий круг программистов, переходящих на язык C#, на студентов, изучающих язык C# в курсах программирования, и читателей, самостоятельно изучающих язык С#.
Подбельский, В. В. Язык С#. Решение задач : учебное пособие / В. В. Подбельский. - Москва : Финансы и статистика, 2022. - 296 с. - ISBN 978-5-00184-078-7. - Текст : электронный. - URL: https://znanium.com/catalog/product/1913988 (дата обращения: 18.04.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов. Для полноценной работы с документом, пожалуйста, перейдите в ридер.
Ðåêîìåíäîâàíî
ÓÌÎ âóçîâ ÐÔ ïî îáðàçîâàíèþ â îáëàñòè ýêîíîìèêè,
ìåíåäæìåíòà, ëîãèñòèêè è áèçíåñ-èíôîðìàòèêè,
à òàêæå ÓÌÎ âóçîâ ÐÔ ïî îáðàçîâàíèþ â îáëàñòè
ïðèêëàäíîé ìàòåìàòèêè è óïðàâëåíèÿ êà÷åñòâîì
â êà÷åñòâå ó÷åáíîãî ïîñîáèÿ 
äëÿ ñòóäåíòîâ âûñøèõ ó÷åáíûõ çàâåäåíèé,
îáó÷àþùèõñÿ ïî íàïðàâëåíèÿì ïîäãîòîâêè
“Ïðîãðàììíàÿ èíæåíåðèÿ”, “Áèçíåñ-èíôîðìàòèêà”,
“Ïðèêëàäíàÿ ìàòåìàòèêà”

ФИНАНСЫИСТАТИСТИКА
МОСКВА
2022

доступа: https://finstat.ru/wp-content/uploads/2022/10/

УДК 004.438
ББК 32.973.2
 
П44

РЕЦЕНЗЕНТЫ:

Кафедра «Программное обеспечение ЭВМ и информационные технологии»  
(ИУ7) МГТУ им. Н.Э. Баумана;

В.А. Дударев, 
канд. техн. наук, доц., старший научный сотрудник ИМЕТ РАН

Учебное пособие представляет собой сборник задач с решениями 
в виде программ на языке C# в интегрированной среде разработки 
Microsoft Visual Studio 2010, 2012. Решения задач снабжены подробными 
объяснениями всех алгоритмических и конструктивных особенностей 
кода. Задачи книги расположены по нарастающей сложности и позволяют 
читателю, начав с элементов языка C#, получить навыки программирования 
достаточно высокого уровня. От консольных программ читатель 
переходит к созданию библиотек классов и полноэкранным Windows-
приложениям. В последних главах книги рассмотрено применение мето-
дологии эволюционного подхода к проектированию программ, а послед-
няя задача посвящена разработке библиотеки классов для численного 
интегрирования систем дифференциальных уравнений и применению 
свободно распространяемой графической библиотеки ZedGraph.
Книга рассчитана на широкий круг программистов, переходящих на 
язык C#, на студентов, изучающих язык C# в курсах программирования, 
и читателей, самостоятельно изучающих язык С#.

УДК 004.438
ББК 32.973.2

П44
Подбельский В.В.
Язык Си#. Решение задач: учеб. пособие / В.В. Под-
бельский. – М.: Финансы и статистика, 2022. – Режим

Podbelskiy_Yazyk-C-Reshenie-zadach.pdf, ограниченный. –
Загл. с экрана. – 296 с.: ил.
ISBN 978-5-00184-078-7

© Подбельский В.В., 2014, 2022
© ООО «Издательство «Финансы
ISBN 978-5-00184-078-7
и статистика», 2022

ПРЕДИСЛОВИЕ

Изучать синтаксис и семантику конструкций языка нужно 
и полезно по учебным пособиям и учебникам, но нельзя стать 
хорошим программистом, не истратив достаточного количества 
времени на программирование и анализ образцов кодов кон-
кретных программ.
Существуют многочисленные фундаментальные книги по 
языку C#. Но обычно в них подробно рассматриваются синтак-
сис и механизмы C# и недостаточно уделено внимания прак-
тическому применению его конструкций. Точнее сказать, при-
меры кода на языке C# обычно в публикациях не велики и 
демонстрируют только те или иные его частные возможности, 
обсуждаемые в конкретном разделе книги.
На практике программист сталкивается с конкретными за-
дачами, для решения которых обычно недостаточно отдельных 
средств языка. Создаваемая программа часто требует примене-
ния целого набора конструкций языка и понимания разных воз-
можностей среды программирования.
Однако нельзя начинать изучение ремесла программирова-
ния на C# с громоздкой задачи, требующей для своего решения 
большого количества разнообразных средств, и среды .NET, и 
языка C#. Несмотря на то, что такие примеры в литературе по 
программированию существуют (см., например, [17], где чита-
тель должен последовательно разбирать особенность разработки 
информационно-справочной системы из медицинской обла-
сти) для читателя удобнее учиться на небольших задачах, по-
нимание постановки которых не требует глубокого знакомства 
с предметной областью, на которую они ориентированы. Здесь, 
конечно, существует опасность слишком упростить постановку 
задачи и свести её программную реализацию к примерам, 
которыми снабжает программиста справочная система MSDN. 
Поэтому в данной книге:
• задачи подбирались по нарастающей сложности;
• темы выделены в соответствии с классической схемой изучения 
языков программирования и методологией объектно-
ориентированного подхода к разработке программ;
• по мере изложения материала постановки задач приближаются 
к уровню заданий на конкретные программные продукты.

ПРЕДИСЛОВИЕ

Таким образом, в нашей книге мы начнём с простых задач, 
постепенно от темы к теме расширяя набор применяемых конструкций 
языка C# и инструментов платформы .NET.
К настоящему времени задачников, практикумов и решеб-
ников по программированию издано и существует в электронном 
виде очень много. Они написаны для разных алгоритмических 
языков и обычно достаточно полно представляют те виды 
и классы задач, которые принято решать с помощью программирования. 
Существуют прекрасные книги (например, Вирт Н. 
[7], Кубенский А.А. [15]), посвященные структурам данных и 
алгоритмам обработки этих структур.  
Цель нашей книги – обеспечить читателя образцами не 
алгоритмов и не отвлечённых структур данных, а программ 
именно на языке C#. При этом основное внимание уделяет-
ся не собственно синтаксису языка C#, а тем особенностям 
конструкций языка, которые позволяют наиболее эффектив-
но использовать его для решения тех или иных практических 
задач. 
Предлагаемая книга начинается главой (темой 01) о среде 
разработки Microsoft Visual Studio. Основное внимание уделено 
версии MS VS 2010, но приведены сведения и о русскоязычном 
варианте MS VS 2012. По существу, тема 01 является введением 
к последующим главам, включающим содержательные по по-
становке и решению задачи. Назначение темы 01 – познако-
мить читателя с основными приёмами взаимодействия с инте-
грированной средой разработки MS VS при создании консоль-
ных программ на языке C#. (Созданию Windows-приложений 
посвящены темы 12 и 13.) 
Темы 02, 03, 04 охватывают вопросы, связанные со взаимо-
действием программ на языке C# с библиотечными классами 
платформы .NET, предназначенными для работы с консольным 
экраном и клавиатурой.
Глава вторая (тема 02) посвящена проблеме вывода инфор-
мации в консольное окно, представляемое в программе библи-
отечным классом Console. Рассматриваемые здесь задачи не 
сложны и в постановке, и в решении. Основная цель – научить-
ся форматировать выводимые данные при создании их строко-
вых представлений, выводимых в консольное окно.
Задачи и программы темы 03 посвящены преобразованию 
информации при её вводе с клавиатуры. Показано как приме-

 
ПРЕДИСЛОВИЕ  
5

нять методы Parse() и TryParse() базовых типов и как пользо-
ваться возможностями класса System.Convert.
Тема 04 знакомит читателя с механизмами, позволяющими 
программно получать и изменять характеристики консоли в за-
висимости от требований решаемой задачи. Первая программа 
иллюстрирует особенности получения информации о нажимае-
мых пользователем клавишах при выполнении программы. За-
тем показано как получать и изменять свойства класса Console, 
определяющие внешний вид (размеры, цвет, заголовок) кон-
сольного окна и размеры буфера консоли. Последние две про-
граммы темы 04 посвящены управлению звуковыми сигналами, 
подачу которых обеспечивает метод Console.Beep().
Всякая программа на языке C# представляет собой совокуп-
ность классов (библиотечных и написанных вручную специаль-
но для решения конкретной задачи). Если при разработке кода 
программы программист применяет только статические члены 
подготовленных им классов, то C# можно воспринимать как 
императивный язык программирования. Именно такой подход 
позволяет применять при работе на языке C# процедурное про-
граммирование. Особенностям такого стиля программирования 
на языке C# посвящены задачи и программы тем 05–08.
Тема 05, в соответствии с заголовком, посвящена выра-
жениям, условным операторам и циклам. Данные в програм-
мах этой темы представляют собой переменные в традицион-
ном для алгоритмических языков понимании (имя + значение). 
Разные задачи предлагают обработку данных разных типов.  
В большинстве задач используются целочисленные и веществен-
ные переменные, но в задаче 05-04 анализируются коды сим-
вольных данных и обращается внимание читателя на тот факт, 
что при обработке кодов символов зачастую нет необходимо-
сти знать их конкретные числовые значения. Программа задачи  
05-03 иллюстрирует возможности тернарной (условной) операции. 
В программе задачи 05-02 показано как применять операцию 
контроля за целочисленным переполнением. В задаче  
05-06 показано как выполнять итерационные вычисления с 
точностью до машинного нуля. В задаче 05-07 применяется 
библиотечный класс System.Random, позволяющий создавать 
случайные числовые последовательности. В программе задачи 
05-08 построены вложенные циклы, позволяющие перебирать в 
регулярном порядке значения нескольких логических перемен-

ПРЕДИСЛОВИЕ

ных. Делается это на примере построения таблицы истинности 
заданной логической функции.
Тема 06 посвящена таким структурам данных как массивы 
и переключатели. Программы в задачах 06-01 – 06-04 выполняют 
обработку одномерных массивов, элементы которых имеют 
арифметические значения. В задаче 06-05 элементы массивов 
имеют символьные значения. В задаче 06-06 реализуется косвенная 
индексация элементов массива, позволяющая получать 
доступ ко всем элементам массива в запланированном порядке, 
отличном от последовательного перебора. Традиционные для 
языка C# массивы создаются с неизменяемым числом элемен-
тов. В задаче 06-07 показано, как увеличить одномерный массив 
в процессе выполнения программы, а в программе из задачи 
06-08 изменяются (уменьшаются) размеры двумерного массива. 
Задачи 06-09 и 06-13 знакомят читателя с применением методов 
классов System.string и System.Array. В программах задач 06-10 
и 06-11 используются переключатели. В задаче 06-10 реализо-
ван ввод значений именованных данных. При таком вводе во 
входной строке (набираемой пользователем) указывается и имя 
переменной, и её значение. Задача 06-11 достаточно традицион- 
ная – программа формирует строку с шестнадцатеричным изо-
бражением заданного целого числа. В задаче 06-12 показано, как 
создавать и использовать непрямоугольный массив, т.е. массив 
ссылок на одномерные массивы с символьными элементами.
Тема 07 включает задачи, предусматривающие разработку 
и использование статических методов. В первой задаче метод 
с параметрами, передаваемыми по значениям, возвращает их 
наибольший общий делитель. Во второй задаче параметры ме-
тодов передаются по ссылкам, что позволяет изменять значения 
внешних переменных, ссылки на которые применимы в каче-
стве аргументов. Программа иллюстрирует перегрузку методов 
и применение в теле одного метода обращений к другому. За-
дача 07-03 вычисляет с точностью до машинного нуля значе-
ние функции sin(x). Особенность программы – применение в 
ней двух методов, первый из которых формирует массив раз-
ложения в ряд функции sin(1), а второй, принимая в качестве 
исходных данных ссылку на этот массив, вычисляет значение 
sin(x). Для построения треугольника Паскаля в задаче 07-04 соз-
дан метод формирования непрямоугольного массива, элемента-
ми которого служат биноминальные коэффициенты. В задаче  

 
ПРЕДИСЛОВИЕ  
7

07-05 создан метод, позволяющий читать из входного потока (с 
клавиатуры) вещественные числа, в которых дробная часть от-
делена, по желанию пользователя, от целой либо точкой, либо 
запятой. В задаче 07-06 разработан рекурсивный метод форми-
рования массива с заранее неизвестным числом элементов. В 
задаче 07-07 для упорядочения строк матрицы, представленной 
в виде массива ссылок на одномерные массивы, применяется 
библиотечный метод Array.Sort(). Для указания правила упоря-
дочения создан вспомогательный метод сравнения одномерных 
массивов, ссылка на который используется в качестве аргумента 
метода Array.Sort().
Тема 08 знакомит читателя с особенностями разработки 
библиотек классов. В первой задаче в библиотеку помещается 
класс со статическими методами для работы с массивами. Далее 
в задачах 08-02, 08-03, 08-05, 08-06 класс дополняется метода-
ми для создания, ввода, вывода одномерных и двумерных мас-
сивов с вещественными аргументами. Особняком стоит задача 
08-04. В ней на основе метода из задачи 07-05 реализован метод 
чтения из строки числового значения типа double. Задача 08-
07 посвящена разработке методов для представления элементов 
массивов в виде строк.
Программы, в которых используются классы, обычно ре-
шают достаточно сложные задачи. В очень хороших книгах по 
объектно-ориентированным языкам программирования ча-
сто механизмы языка и методы объектно-ориентированного 
программирования (ООП) излагаются на основе рассмотре-
ния одной большой задачи, для решения которой создается 
и последовательно реализуется средствами языка достаточно 
сложный проект. Например, рассматривается информацион-
ная система управления автотранспортного предприятия или 
информационные потоки в больнице. Такой подход знако-
мит читателя с реальными задачами, но зачастую затрудняет 
изучение возможностей языка, так как заставляет читателя 
для понимания смысла задачи разбираться в незнакомой ему 
предметной области. 
В нашей книге в отличие от указанного подхода для объ-
яснения техники ООП выбраны короткие задачи, иллюстри-
рующие применение конкретных механизмов и средств языка.  
В ряде случаев мы даже отказались от «смысловой» части фор-
мулировки задачи, ограничившись требованием применить  

ПРЕДИСЛОВИЕ

в программе указанным способом конкретные средства языка. 
Например, «определить класс с полями таких-то типов, объ-
явить и инициализировать массив со ссылками на объекты это-
го класса, а затем упорядочить этот массив в соответствии со 
значениями одного из свойств объектов класса». 
Исходя из сказанного об ООП, можно в этом предисловии 
при описании задач Тем 09, 10, 11 ограничиться несколькими 
словами. В ряде случаев для разработанных классов приведены 
их графические UML-представления. В задаче 09-03 показано, 
как создавать массивы объектов пользовательских классов, как 
использовать ссылку на объект в качестве параметра метода. 
В задаче 09-04 ссылка на объект класса используется как ста-
тическое поле того же класса и иллюстрируются возможности 
статических конструкторов. В задаче 09-05 параметром метода 
одного из взаимно независимых классов служит ссылка на объ-
ект второго класса.
Тема 10 посвящена перегрузке операций для объектов опре-
деляемых программистом классов: «активное электрическое 
сопротивление», «полином», «матрица», «правильная дробь», 
«вектор многомерного пространства».
В Теме 11 рассматриваются особенности наследования клас-
сов, возможности абстрактных классов и виртуальных членов. В 
задаче 11-04 на примере интерфейса структуры данных «стек» 
показано, как реализовать интерфейс с помощью разрабатывае-
мых программистом классов.
В Теме 12 осуществлён переход от консольных приложе-
ний к программам с визуальным полноэкранным интерфейсом 
пользователя. В начале на простых задачах показано, как поль-
зоваться редактором форм (графическим дизайнером), позволя-
ющим выполнять визуальное проектирование пользовательско-
го интерфейса. Затем объясняется механизм управления программой 
с помощью событий и иллюстрируются особенности 
создания обработчиков событий. Так как количество элементов 
управления и компонентов, которые доступны разработчику 
при создании Windows-приложений, весьма велико, то описать 
и применить все их никак невозможно в нашей книге. Гораздо 
важнее показать на примерах, что каждый компонент и каждый 
элемент управления – это объект некоторого класса. Эти 
объекты можно «настраивать», задавая начальные значения их 
свойств, и можно изменять в процессе выполнения програм-

 
ПРЕДИСЛОВИЕ  
9

мы. Кроме того, обращено внимание на тот факт, что основное 
окно Windows-программы (форма) представляет собой отображение 
объекта особого класса (по умолчанию имеющего имя 
Form1), код которого модифицирует программист при разработке 
Windows-приложения. Останавливаясь на особенностях 
некоторых задач этой темы, следует обратить внимание на задачу 
12-06, в которой используется очень важный и функционально 
богатый элемент управления DataGridView. В задаче 12-
07 разработана программа, иллюстрирующая особенности про-
стейшей анимации с помощью графических средств и таймера. 
В задаче 12-08 программа строит график функции плотности 
вероятностей биноминального распределения. Значения этой 
функции вычисляются в отдельном классе с итератором. Для 
размещения графика и элементов управления на форме в про-
грамме используется контейнер TableLayoutPanel. Рисование 
графика выполняется в контексте элемента PictureBox.
Тема 13 включает два больших примера, с помощью которых 
читатель знакомится с методикой эволюционного проектиро-
вания программ и некоторыми возможностями свободно рас-
пространяемой библиотеки ZedGraph. Применение методики 
эволюционного проектирования позволяет создавать программу 
последовательными шагами, каждый из которых увеличивает 
функциональность программы. На каждом шаге (или этапе раз-
работки) программист принимает некоторое проектное реше-
ние, реализует его в коде, а затем компилирует и выполняет 
программу, проверяя её соответствие принятому проектному 
решению. При этом важно, чтобы на каждом шаге принималось 
минимальное количество проектных решений, и что при за-
вершении шага программа работоспособна. Такая схема разра-
ботки очень хорошо поддерживается возможностями, представ-
ляемыми программисту интегрированной средой разработки, 
и может быть рекомендована при создании программ средней 
сложности с помощью MS VS. В задаче 13-02 создаётся библио-
тека классов для численного интегрирования систем дифферен-
циальных уравнений методом Рунге-Кутта. Для её тестирова-
ния разрабатывается программа, выполняющая интегрирование 
системы дифференциальных уравнений 2-го порядка, для ко-
торой известно аналитическое решение. Графики полученных 
численного и аналитического решений выводятся на экран и 
сравниваются. Для вывода графиков применяется библиотека 

ПРЕДИСЛОВИЕ

ZedGraph. Для вывода графиков можно было бы написать про-
грамму целиком вручную, как это сделано в задаче 12-08. Но 
цель состояла в том, чтобы обратить внимание читателя на су-
ществование общедоступных библиотек классов C# и показать 
особенности их применения.
Для решения задач в этой книге использовалась Microsoft 
Visual Studio 2010 Professional Edition и русскоязычная версия 
Microsoft Visual Studio 2012.
Книга рассчитана на программистов, имеющих некоторый 
опыт программирования (не обязательно на языке C#) и зна-
комых с основными сведениями о синтаксисе языка C#. Пред-
варительное знакомство с языком С# может быть получено, на-
пример, из пособия автора «Язык С#. Базовый курс».
Изучение кодов приведённых в книге программ будет до-
статочно для освоения профессионального программирования 
на языке C#. Для дальнейшего совершенствования мастерства 
станут более понятны и доступны многочисленные справочные 
материалы и документация по языку C#, среде Microsoft Visual 
Studio и платформе Microsoft NET Framework.
Автор благодарен рецензентам: доценту, к.т.н. В.А. Дудареву, 
доценту, к.т.н. В.А. Крищенко и заведующему кафедрой «Прог- 
раммное обеспечение ЭВМ и информационные технологии» 
МГТУ им. Н.Э. Баумана, к.т.н. И.В. Рудакову.

Доступ онлайн
180 ₽
В корзину