Язык С#. Решение задач
Покупка
Тематика:
Программирование на C и C++
Издательство:
Финансы и статистика
Автор:
Подбельский Вадим Валериевич
Год издания: 2022
Кол-во страниц: 296
Дополнительно
Вид издания:
Учебное пособие
Уровень образования:
ВО - Бакалавриат
ISBN: 978-5-00184-078-7
Артикул: 469262.02.99
Доступ онлайн
В корзину
Учебное пособие представляет собой сборник задач с решения ми в виде программ на языке C# в интегрированной среде разработки Microsoft Visual Studio 2010, 2012. Решения задач снабжены подробными объяснениями всех алгоритмических и конструктивных особенностей кода. Задачи книги расположены по нарастающей сложности и позволяют читателю, начав с элементов языка C#, получить навыки программирования достаточно высокого уровня. От консольных программ читатель переходит к созданию библиотек классов и полноэкранным Windows-приложениям. В последних главах книги рассмотрено применение методологии эволюционного подхода к проектированию программ, а последняя задача посвящена разработке библиотеки классов для численного интегрирования систем дифференциальных уравнений и применению свободно распространяемой графической библиотеки ZedGraph.
Книга рассчитана на широкий круг программистов, переходящих на язык C#, на студентов, изучающих язык C# в курсах программирования, и читателей, самостоятельно изучающих язык С#.
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 01.03.02: Прикладная математика и информатика
- 09.03.01: Информатика и вычислительная техника
- 09.03.02: Информационные системы и технологии
- 09.03.03: Прикладная информатика
- 09.03.04: Программная инженерия
- 38.03.05: Бизнес-информатика
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов.
Для полноценной работы с документом, пожалуйста, перейдите в
ридер.
Ðåêîìåíäîâàíî ÓÌÎ âóçîâ ÐÔ ïî îáðàçîâàíèþ â îáëàñòè ýêîíîìèêè, ìåíåäæìåíòà, ëîãèñòèêè è áèçíåñ-èíôîðìàòèêè, à òàêæå ÓÌÎ âóçîâ ÐÔ ïî îáðàçîâàíèþ â îáëàñòè ïðèêëàäíîé ìàòåìàòèêè è óïðàâëåíèÿ êà÷åñòâîì â êà÷åñòâå ó÷åáíîãî ïîñîáèÿ äëÿ ñòóäåíòîâ âûñøèõ ó÷åáíûõ çàâåäåíèé, îáó÷àþùèõñÿ ïî íàïðàâëåíèÿì ïîäãîòîâêè “Ïðîãðàììíàÿ èíæåíåðèÿ”, “Áèçíåñ-èíôîðìàòèêà”, “Ïðèêëàäíàÿ ìàòåìàòèêà” ФИНАНСЫИСТАТИСТИКА МОСКВА 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. Автор благодарен рецензентам: доценту, к.т.н. В.А. Дудареву, доценту, к.т.н. В.А. Крищенко и заведующему кафедрой «Прог- раммное обеспечение ЭВМ и информационные технологии» МГТУ им. Н.Э. Баумана, к.т.н. И.В. Рудакову.
Доступ онлайн
В корзину