Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
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 (дата обращения: 29.11.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. Задача 0807 посвящена разработке методов для представления элементов 
массивов в виде строк.
Программы, в которых используются классы, обычно решают достаточно сложные задачи. В очень хороших книгах по 
объектно-ориентированным языкам программирования часто механизмы языка и методы объектно-ориентированного 
программирования (ООП) излагаются на основе рассмотрения одной большой задачи, для решения которой создается 
и последовательно реализуется средствами языка достаточно 
сложный проект. Например, рассматривается информационная система управления автотранспортного предприятия или 
информационные потоки в больнице. Такой подход знакомит читателя с реальными задачами, но зачастую затрудняет 
изучение возможностей языка, так как заставляет читателя 
для понимания смысла задачи разбираться в незнакомой ему 
предметной области. 
В нашей книге в отличие от указанного подхода для объяснения техники ООП выбраны короткие задачи, иллюстрирующие применение конкретных механизмов и средств языка.  
В ряде случаев мы даже отказались от «смысловой» части формулировки задачи, ограничившись требованием применить  

ПРЕДИСЛОВИЕ

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

мы. Кроме того, обращено внимание на тот факт, что основное 
окно Windows-программы (форма) представляет собой отображение объекта особого класса (по умолчанию имеющего имя 
Form1), код которого модифицирует программист при разработке Windows-приложения. Останавливаясь на особенностях 
некоторых задач этой темы, следует обратить внимание на задачу 12-06, в которой используется очень важный и функционально богатый элемент управления DataGridView. В задаче 1207 разработана программа, иллюстрирующая особенности простейшей анимации с помощью графических средств и таймера. 
В задаче 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 ₽
В корзину