Введение в программирование на языке Visual C#.
 9785000914588, 9785160131009, 9785161058824

Table of contents :
Титульный лист
Выходные данные
Оглавление
Посвящение
Введение
1. Теоретические основы алгоритмизации и программирования
1.1 Алгоритм. Свойства алгоритма. Способы описания алгоритма
1.2 Назначение функциональных блоков
1.3 Основные этапы решения задач на ЭВМ
1.4 Введение в объектно-ориентированное программирование
1.5 Алфавит языка Visual C#
1.6 Идентификаторы и общие правила их написания
1.7 Оператор присваивания
1.8 Типы данных
1.9 Запись математических функций
1.10 Операции отношения
2. Введение в Visual C#
2.1 Организация проекта в Visual C#
2.2 Процесс создания проекта
2.3 Методы ввода и вывода данных
2.4 Использование проверки корректности ввода данных
2.5 Обработка исключений
2.6 Обработка последовательностей данных
2.7 Окончательная настройка приложения
2.8 Организация взаимодействия форм
2.9 Работа с компонентами
3. Линейный алгоритм
3.1 Упражнения к главе
3.2 Примеры решения задач
4. Разветвляющийся алгоритм
4.1 Простой условный оператор
4.2 Сокращенный условный оператор
4.3 Составной условный оператор
4.4 Многозначные ветвления
4.5 Алгоритмы поиска максимального и минимального элементов
4.6 Упражнения к главе
4.7 Примеры решения задач
5. Оператор выбора switch
5.1 Упражнения к главе
5.2 Примеры решения задач
6. Циклический алгоритм
6.1 Оператор цикла for
6.2 Оператор цикла do…while
6.3 Оператор цикла while
7. Работа с одномерными массивами
7.1 Базовые алгоритмы обработки одномерных массивов
7.2 Упорядочивание одномерных массивов
7.3 Примеры решения задач
8. Работа с двумерными массивами
8.1 Основные свойства матриц
8.2 Базовые алгоритмы обработки двумерных массивов
8.3 Примеры решения задач
9. Создание классов. Работа с методами
9.1 Создание методов
9.2 Передача параметров: по ссылке или по значению
9.3 Передача массива в качестве параметров
9.4 Примеры решения задач
10. Работа с символами и строками
10.1 Методы работы с символами
10.2 Методы работы со строками
10.3 Базовые алгоритмы обработки строк
10.4 Примеры решения задач
11. Работа с файлами
11.1 Процессы и потоки
11.2 Запись информации в текстовый файл
11.3 Чтение информации из текстового файла
11.4 Работа с файлами и каталогами
11.5 Примеры решения задач
Приложение 1. Примеры выполнения лабораторных работ
Лабораторная работа №1 «Запись арифметических выражений»
Лабораторная работа №2 «Многозначные ветвления в программах. Использование проверки корректности ввода данных и элемента управления ErrorProvider»
Лабораторная работа №3 «Использование элементов управления RadioButton, ListBox, Timer, GroupBox в программах. Использование обработчика событий для нескольких компонентов»
Лабораторная работа №4 «Программирование алгоритмов разветвляющихся структур с использованием поиска максимального и минимального значений»
Лабораторная работа №5 «Использование элементов управления MenuStrip, OpenFileDialog, SaveFileDialog, FontDialog, ToolStrip, StatusStrip. Разработка текстового редактора»
Лабораторная работа №6 «Табулирование функций»
Лабораторная работа №7 «Использование элементов управления CheckedListBox, CheckBox, ComboBox, RadioButton, ListBox. Разработка тестовой программы»
Лабораторная работа №8 «Программирование алгоритмов регулярных циклических структур»
Лабораторная работа №9 «Табулирование функции с использованием циклов с неизвестным количеством повторений»
Лабораторная работа №10 «Программирование алгоритмов итеративных циклических структур»
Лабораторная работа №11 «Комплексное применение элементов управления»
Лабораторная работа №12 «Классические способы обработки одномерных массивов»
Лабораторная работа №13 Программирование алгоритмов формирования и обработки одномерных массивов»
Лабораторная работа №14 «Классические способы обработки двумерных массивов»
Лабораторная работа №15 «Программирование алгоритмов формирования и обработки двумерных массивов»
Лабораторная работа №16 «Организация многодокументного интерфейса»
Лабораторная работа №17 «Разработка графического редактора»
Лабораторная работа №18 «Работа с методами»
Лабораторная работа №19 «Классические способы обработки строк»
Лабораторная работа №20 «Обработка строковых данных»
Лабораторная работа №21 «Работа с текстовыми файлами»
Лабораторная работа №22 «Работа с файлами и каталогами»
Приложение 2. Создание заставок к проектам
Заставка 1. Создание текста и изображения на форме графическими методами
Заставка 2. Вывод центрированного текста, закрашенного с помощью градиентной заливки. Форма окаймлена овалом, покрытым изображениями
Заставка 3. Вывод текста на графическую поверхность и выравнивание его по центру
Заставка 4. Создание сплэш-форм
Заставка 5. Проявление и исчезновение формы
Заставка 6. Ввод пароля с заданным числом попыток
Заставка 7. Постепенное развертывание формы
Заставка 8. Работа с объектом Bitmap
Заставка 9. Повернутая надпись
Заставка 10. Создание нестандартной формы
Заставка 11. Создание нестандартной формы (форма с окружностями)
Заставка 12. Поворот изображения и его зеркальное отображение
Заставка 13. Рисование с помощью мыши
Заставка 14. Вывод бегущей строки
Заставка 15. Форма произвольной конфигурации
Заставка 16. Вывод векторного изображения
Заставка 17. Использование текстового окна для ввода пароля. Использование элемента управления ErrorProvider
Заставка 18. Вывод текста из файла в область, нарисованную на форме
Список литературы

Citation preview

С.Р. Гуриков

ВВЕДЕНИЕ В ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ VISUAL C# УЧЕБНОЕ ПОСОБИЕ

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

Москва

2019 ИНФРА-М

УДК 004.2 ББК 32.973-018 Г95

Р е ц е н з е н т ы: кандидат технических наук, доцент, заведующий кафедрой «Вычислительная математика и программирование», декан Общетехнического факультета (ОТФ–2) Московского технического университета связи и информатики В.Н. Шакин; кандидат технических наук, доцент, начальник аналитического сектора ФГНУ «Госметодцентр» Ю.А. Сытняк

Г95

Гуриков С.Р. Введение в программирование на языке Visual C# : учеб. пособие / С.Р. Гуриков. — М. : ФОРУМ : ИНФРА-М, 2019. — 447 с. — (Высшее образование: Бакалавриат). ISBN 978-5-00091-458-8 (ФОРУМ) ISBN 978-5-16-013100-9 (ИНФРА-М, print) ISBN 978-5-16-105882-4 (ИНФРА-М, online) Книга является руководством по программированию на языке Visual C# для начинающих. В ней содержится описание такого традиционного материала, как работа линейных, разветвляющихся и циклических структур, обработка одномерных и двумерных массивов. Кроме того, рассмотрены методы работы с символами и строками, файлами, даны основные понятия работы с классами. Обсуждаются типы данных, используемые в Visual C#, большое внимание уделено методам ввода и вывода данных, сделан обзор основных элементов управления среды программирования. Имеются примеры консольных приложений, однако большинство программ написаны как Windows-приложения. В конце каждой главы имеется набор контрольных вопросов и упражнений, задач для самостоятельного решения. В книге содержится свыше 230 листингов программ, набор которых на компьютере приведет к эффективному усвоению теоретического материала, поможет выполнить практические или лабораторные работы в среде программирования. В приложениях содержится лабораторный практикум, состоящий из 22 работ, а также приведено описание 18 заставок к проектам, выполненных на основе использования интерфейса GDI+.

УДК 004.2 ББК 32.973-018

ISBN 978-5-00091-458-8 (ФОРУМ) ISBN 978-5-16-013100-9 (ИНФРА-М, print) ISBN 978-5-16-105882-4 (ИНФРА-М, online)

© Гуриков С.Р., 2013 © ФОРУМ, 2013

ОГЛАВЛЕНИЕ Введение...............................................................................................................................................7 1. Теоретические основы алгоритмизации и программирования .........................................10 1.1 Алгоритм. Свойства алгоритма. Способы описания алгоритма ....................................10 1.2 Назначение функциональных блоков ...............................................................................11 1.3 Основные этапы решения задач на ЭВМ .........................................................................11 1.4 Введение в объектно-ориентированное программирование ..........................................12 1.5 Алфавит языка Visual C#....................................................................................................16 1.6 Идентификаторы и общие правила их написания ...........................................................16 1.7 Оператор присваивания......................................................................................................16 1.8 Типы данных .......................................................................................................................17 1.9 Запись математических функций ......................................................................................25 1.10 Операции отношения..........................................................................................................26 2. Введение в Visual C#..................................................................................................................28 2.1 Организация проекта в Visual C# ......................................................................................28 2.2 Процесс создания проекта..................................................................................................31 2.3 Методы ввода и вывода данных ........................................................................................33 2.4 Использование проверки корректности ввода данных ...................................................39 2.5 Обработка исключений ......................................................................................................40 2.6 Обработка последовательностей данных .........................................................................43 2.7 Окончательная настройка приложения ............................................................................44 2.8 Организация взаимодействия форм ..................................................................................44 2.9 Работа с компонентами ......................................................................................................45 3. Линейный алгоритм..................................................................................................................74 3.1 Упражнения к главе ............................................................................................................74 3.2 Примеры решения задач.....................................................................................................76 4. Разветвляющийся алгоритм....................................................................................................82 4.1 Простой условный оператор ..............................................................................................82 4.2 Сокращенный условный оператор ....................................................................................83 4.3 Составной условный оператор ..........................................................................................83 4.4 Многозначные ветвления ...................................................................................................85 4.5 Алгоритмы поиска максимального и минимального элементов ...................................87 4.6 Упражнения к главе ............................................................................................................91 4.7 Примеры решения задач.....................................................................................................95 5. Оператор выбора switch............................................................................................................99 5.1 Упражнения к главе ..........................................................................................................101 5.2 Примеры решения задач...................................................................................................103 6. Циклический алгоритм ..........................................................................................................106 3

6.1 Оператор цикла for............................................................................................................106 6.2 Оператор цикла do…while ...............................................................................................128 6.3 Оператор цикла while .......................................................................................................141 7. Работа с одномерными массивами .......................................................................................157 7.1 Базовые алгоритмы обработки одномерных массивов .................................................163 7.2 Упорядочивание одномерных массивов.........................................................................175 7.3 Примеры решения задач...................................................................................................185 8. Работа с двумерными массивами .........................................................................................194 8.1 Основные свойства матриц ..............................................................................................197 8.2 Базовые алгоритмы обработки двумерных массивов....................................................198 8.3 Примеры решения задач...................................................................................................211 9. Создание классов. Работа с методами..................................................................................223 9.1 Создание методов .............................................................................................................224 9.2 Передача параметров: по ссылке или по значению.......................................................226 9.3 Передача массива в качестве параметров.......................................................................230 9.4 Примеры решения задач...................................................................................................231 10. Работа с символами и строками............................................................................................239 10.1 Методы работы с символами ...........................................................................................239 10.2 Методы работы со строками............................................................................................240 10.3 Базовые алгоритмы обработки строк..............................................................................244 10.4 Примеры решения задач...................................................................................................251 11. Работа с файлами .....................................................................................................................257 11.1 Процессы и потоки ...........................................................................................................257 11.2 Запись информации в текстовый файл ...........................................................................259 11.3 Чтение информации из текстового файла ......................................................................260 11.4 Работа с файлами и каталогами.......................................................................................261 11.5 Примеры решения задач...................................................................................................266 Приложение 1. Примеры выполнения лабораторных работ ................................................272 Лабораторная работа №1 «Запись арифметических выражений» ........................................272 Лабораторная работа №2 «Многозначные ветвления в программах. Использование проверки корректности ввода данных и элемента управления ErrorProvider»....................279 Лабораторная работа №3 «Использование элементов управления RadioButton, ListBox, Timer, GroupBox в программах. Использование обработчика событий для нескольких компонентов»..................................................................................................289 Лабораторная работа №4 «Программирование алгоритмов разветвляющихся структур с использованием поиска максимального и минимального значений»................................295

4

Лабораторная работа №5 «Использование элементов управления MenuStrip, OpenFileDialog, SaveFileDialog, FontDialog, ToolStrip, StatusStrip. Разработка текстового редактора» ..........................................................................................302 Лабораторная работа №6 «Табулирование функций» ...........................................................305 Лабораторная работа №7 «Использование элементов управления CheckedListBox, CheckBox, ComboBox, RadioButton, ListBox. Разработка тестовой программы»................310 Лабораторная работа №8 «Программирование алгоритмов регулярных циклических структур» ....................................................................................................................................314 Лабораторная работа №9 «Табулирование функции с использованием циклов с неизвестным количеством повторений»...............................................................................322 Лабораторная работа №10 «Программирование алгоритмов итеративных циклических структур» ....................................................................................................................................333 Лабораторная работа №11 «Комплексное применение элементов управления» ................348 Лабораторная работа №12 «Классические способы обработки одномерных массивов»...353 Лабораторная работа №13 Программирование алгоритмов формирования и обработки одномерных массивов» .............................................................................................................359 Лабораторная работа №14 «Классические способы обработки двумерных массивов» .....366 Лабораторная работа №15 «Программирование алгоритмов формирования и обработки двумерных массивов»................................................................................................................372 Лабораторная работа №16 «Организация многодокументного интерфейса» .....................381 Лабораторная работа №17 «Разработка графического редактора» ......................................385 Лабораторная работа №18 «Работа с методами»....................................................................394 Лабораторная работа №19 «Классические способы обработки строк» ...............................402 Лабораторная работа №20 «Обработка строковых данных».................................................406 Лабораторная работа №21 «Работа с текстовыми файлами» ................................................412 Лабораторная работа №22 «Работа с файлами и каталогами»..............................................417 Приложение 2. Создание заставок к проектам ........................................................................420 Заставка 1. Создание текста и изображения на форме графическими методами................423 Заставка 2. Вывод центрированного текста, закрашенного с помощью градиентной заливки. Форма окаймлена овалом, покрытым изображениями...........................................424 Заставка 3. Вывод текста на графическую поверхность и выравнивание его по центру. ..426 Заставка 4. Создание сплэш-форм............................................................................................427 Заставка 5. Проявление и исчезновение формы. ....................................................................428 Заставка 6. Ввод пароля с заданным числом попыток. ..........................................................430 Заставка 7. Постепенное развертывание формы.....................................................................431 Заставка 8. Работа с объектом Bitmap......................................................................................432

5

Заставка 9. Повернутая надпись. ..............................................................................................433 Заставка 10. Создание нестандартной формы.........................................................................434 Заставка 11. Создание нестандартной формы (форма с окружностями)..............................436 Заставка 12. Поворот изображения и его зеркальное отображение.....................................437 Заставка 13. Рисование с помощью мыши. .............................................................................438 Заставка 14. Вывод бегущей строки.........................................................................................439 Заставка 15. Форма произвольной конфигурации..................................................................440 Заставка 16. Вывод векторного изображения. ........................................................................441 Заставка 17. Использование текстового окна для ввода пароля. Использование элемента управления ErrorProvider...........................................................................................................443 Заставка 18. Вывод текста из файла в область, нарисованную на форме. ...........................444 Список литературы .......................................................................................................................446

6

ВВЕДЕНИЕ В условиях глобальных информационных процессов, решения социальноэкономических проблем актуализируется важность информатизации образования. Повышение качества, эффективности и результативности образовательного процесса осуществляется путем внедрения современных педагогических и информационных технологий обучения, увеличения объемов обрабатываемой учебной информации за счет широкого практического использования компьютеров, локальных и глобальных компьютерных сетей, насыщения учебного заведения техническими и программными средствами. Дальнейшее развитие информатизации требует не только компьютерной грамотности, но и информационной культуры личности, основанной на понимании закономерностей развития информационного общества. При этом в первую очередь должно измениться понимание сути информатизации и информатики. В связи с этим надо отметить, что компьютер стал массовым средством профессиональной деятельности, причем не только в инженерной и естественнонаучной области, но и в гуманитарной сфере, бизнесе, экономике, образовании, системе коммуникаций. Наряду с профессиональной компетентностью основными качествами, обеспечивающими конкурентоспособность на рынке труда, стали мобильность, способность к адаптации, критическое мышление, ориентация в информационном пространстве, умение работать с информацией, коммуникабельность, компьютерная грамотность. Большинство из указанных качеств формируется в процессе изучения курса информатики в учебных заведениях, что приводит к значительному повышению ее роли. Новое понимание задач информатики, а также ее первостепенная роль в системе образования, безусловно, должны найти свое адекватное отражение в программах, методиках и учебных планах перспективной системы профессионального образования. Материал предлагаемого учебного пособия был подготовлен автором на основе многолетнего опыта преподавания курса алгоритмизации и программирования школьникам и студентам, разработки электронных учебников и чтения лекций по дисциплине «Информатика». Проведенный анализ учебной литературы показал, что несмотря на наличие книг по разработке приложений на языке программирования Visual C#, их содержание редко отвечает совместной практической работе преподавателя и студента в конкретном учебном заведении и на конкретном занятии. Использование различных самоучителей, руководств для профессиональной работы в среде программирования действительно возможно в учебном процессе, но только при соответствующей их детальной переработке. Вчерашний школьник, а сегодня студент не готов с первых дней обучения осваивать программирование на основе создания собственных функций и процедур языка программирования, однако такой подход часто предлагается с первых страниц иных изданий. Слабая мотивация, сложность решаемых задач (часто сразу из области численных методов), отсутствие навыков в среде программирования порою формируют стойкое неприятие к основам алгоритмизации и программирования. 7

Главная цель создания пособия — обеспечить прочное и сознательное освоение основ алгоритмизации и программирования, формирование практических умений — профессиональных, учебных, интеллектуальных, необходимых будущему специалисту. Помимо приобретения чисто практических умений, ценных с точки зрения освоения компьютерной грамотности, студенты получают наглядное представление о возможностях, предоставляемых компьютером человеку, вырабатывают такие профессионально значимые качества, как самостоятельность, ответственность, точность, творческая инициатива при решении поставленных задач. Пособие построено так, что непосредственно к программированию студент приступает с самого начала — первая программа описывается во втором разделе (в первом разделе приводятся теоретические основы алгоритмизации и программирования). Во втором разделе описаны различные способы ввода и вывода данных, приводятся примеры организации взаимодействия нескольких форм, что актуально при выполнении студентами лабораторных работ, подробно описана окончательная настройка приложения, а также рассказано о том, как осуществлять проверку корректности ввода данных, разрабатывать главное и контекстное меню. Здесь же приводятся примеры работы с различными (основными) компонентами среды программирования. Четкое понимание работы каждого компонента — залог успешного программирования приложений. В третьем, четвертом, пятом и шестом разделах подробно рассматриваются операторы, относящиеся к трем «китам» программирования — линейному, разветвляющемуся и циклическому алгоритмам. В седьмом и восьмом разделах объясняется работа с одномерными и двумерными массивами, рассматриваются «классические» способы их обработки. В девятом разделе речь пойдет о создании классов и работе с методами. В десятом разделе изложены основы обработки символьной и строковой информации, рассматриваются «классические» приемы обработки строк. В одиннадцатом разделе приведено описание работы с файлами и директориями. Приложение 1 содержит практикум по выполнению лабораторных работ, часть из которых (с вариантами) может выполняться студентами в домашних условиях, другие (без вариантов) — использоваться в стенах учебного заведения при проведении практических занятий. В приложении 2 даны описания 18 заставок к проектам, которые помогут разнообразить проведение лабораторного практикума, по сути это еще один раздел пособия, посвященный основам работы с графикой. Учебное пособие содержит свыше 230 листингов программ, а также более 260 рисунков, которые дают наглядное представление о результатах работы и ходе создания приложений. Материал, изложенный в пособии, особенно будет полезен студентам, обучающимся на технических специальностях техникумов, колледжей, вузов в учебных планах которых предусмотрены дисциплины «Информатика», «Основы алгоритмизации и программирования», «Визуальное программирование», «Программирование на языке высокого уровня» и т.д. Апробация учебного пособия показала, что 8

студенты, не имеющие подготовки в области программирования, не только успешно осваивают представленные в пособии приложения, но и вносят в них свои, очень интересные изменения, направленные на улучшение их работы. Преподаватели могут оценить учебное пособие с точки зрения методики преподавания. Многие листинги программ специально написаны таким образом, чтобы учащиеся имели возможность доработать или оптимизировать их код, что поможет педагогу создать творческую атмосферу на занятиях. К каждому из разделов приведены примеры решения задач, упражнения, задачи для самостоятельного решения, контрольные вопросы, позволяющие оценить уровень подготовки студента. Описание лабораторных работ с вариантами заданий поможет организовать и провести занятия по соответствующим темам. Для каждой работы приведены примеры ее выполнения, задания для самостоятельной подготовки, объясняется, какой объем работы студент должен выполнить в лаборатории, приводятся содержание отчета по конкретной лабораторной работе, контрольные вопросы. Получить бесплатный инструментарий для работы с языком программирования Visual C#, можно загрузив различные версии среды Microsoft Visual Studio с сайта компании Microsoft по адресу www.microsoft.com/ru-ru. В пособие умышленно не включалось описание среды программирования, излишние подробности использования тех или иных функций языка, создание больших приложений, которые не могут быть рассмотрены в рамках «классического» занятия. Следует отметить, что учебное пособие не может претендовать на функциональную полноту или на полную оригинальность приведенных методов, алгоритмов и программ. Автор преследовал иную цель: не отпугнуть студента с низким уровнем базовой подготовки от основ изучения языка программирования, а помочь ему путем доступного изложения теоретических и практических основ алгоритмизации.

9

1. ТЕОРЕТИЧЕСКИЕ ОСНОВЫ АЛГОРИТМИЗАЦИИ И ПРОГРАММИРОВАНИЯ 1.1. Алгоритм. Свойства алгоритма. Способы описания алгоритма Если мы хотим написать программу на каком-нибудь языке программирования, то сначала мы должны составить алгоритм решения задачи. Алгоритм — это точное и простое описание последовательности действий для решения данной задачи. Алгоритм содержит несколько шагов, которые должны выполняться в определенной последовательности. Каждый шаг алгоритма может состоять из одной или нескольких простых операций. Каждый из нас ежедневно использует различные алгоритмы: инструкции, правила, рецепты и т.д. Обычно мы это делаем не задумываясь. Например, открывая дверь ключом, никто не размышляет над тем, в какой последовательности выполнять действия. Однако чтобы кого-нибудь научить открывать дверь, придется четко указать и сами действия, и порядок их выполнения. Например: 1. Достать ключ. 2. Вставить ключ в замочную скважину. 3. Повернуть ключ два раза против часовой стрелки. 4. Вынуть ключ. Представим, что мы поменяли местами второе и третье действия. Мы сможем выполнить и этот алгоритм, но дверь не откроется, т.е. алгоритм станет невыполнимым. Для алгоритма важен не только набор действий, но и то, в каком порядке они выполняются. Понятие алгоритма в информатике является фундаментальным. Таким же, какими являются понятия точки, прямой и плоскости в геометрии, вещества в химии, пространства и времени в физике и т.д. Свойства алгоритма: x Дискретность (прерывность, раздельность) — алгоритм должен представлять процесс решения задачи как последовательное выполнение простых шагов (этапов). x Определенность — каждый шаг алгоритма должен быть четким и однозначным. Выполнение алгоритма носит механический характер и не требует никаких дополнительных сведений о решаемой задаче. x Результативность — алгоритм должен приводить к решению задачи за конечное число шагов. x Массовость — алгоритм решения разрабатывается в общем виде, т.е. он должен быть применим для решения некоторого класса задач, различающихся лишь исходными данными. Способы описания алгоритмов: x словесный; x графический; x табличный; x формульный.

10

1. Словесный способ каждый из нас использует ежедневно, пересказывая собеседнику, например, различные инструкции, правила, кулинарные рецепты, т.е. какую-то последовательность, приводящую к конечному результату. 2. Графический способ представления алгоритмов является более компактным и наглядным по сравнению со словесным. Как часто для лучшего понимания той или иной ситуации нам проще начертить какую-то схему, план, согласно которому мы будем действовать. В программировании данный способ предпочтительнее других, поскольку позволяет с помощью последовательности функциональных блоков, каждый из которых соответствует выполнению одного или нескольких действий представить ход решения той или иной задачи. Такое представление алгоритма называется структурной схемой алгоритма или блок-схемой. 3. Табличный способ используется, например, в бухгалтерии при составлении ежегодных отчетов, сводок и т.д. 4. Формульный способ находит свое применение при решении задач из области математики, физики и т.д. Например, при решении квадратного уравнения мы приступаем к нахождению дискриминанта уравнения, а затем, в зависимости от полученного результата, находим корни уравнения по известным всем формулам.

1.2. Назначение функциональных блоков Начало и конец алгоритма

Вычислительная операция

Ввод/вывод данных

Проверка условия (логического выражения)

Начало циклического алгоритма

Разрыв соединительных линий на странице

Начало процедуры

Линии потоков

Комментарий

Вывод на печать

1.3. Основные этапы решения задач на ЭВМ Процесс решения задачи на ПК состоит из нескольких этапов, часть из которых выполняется пользователем, а часть — компьютером. 1-й этап. Общая постановка задачи На этом этапе описывается содержание задачи, составляется перечень исходных данных. 11

2-й этап. Разработка математической модели Цель этого этапа состоит в установлении формализованных связей между исходными данными и искомыми результатами. Этап заключается в записи расчетных формул или функциональных зависимостей. 3-й этап. Разработка алгоритма Этап заключается в описании последовательности действий, в результате которых может быть получено решение задачи. 4-й этап. Разработка программы Программа составляется в полном соответствии с разработанным алгоритмом решения задачи. 5-й этап. Отладка программы Процесс поиска ошибок в программе и их устранение. 6-й этап. Анализ результатов Позволяет принять решение о необходимости внесения изменений в программу, проведении дополнительных расчетов или их окончании.

1.4. Введение в объектно-ориентированное программирование Объектно-ориентированное программирование (ООП) является отражением сущности и отношений реального мира. Человек — это «объект», который постоянно обменивается сообщениями с другими «объектами», сообщения могут инициировать выполнение каких-либо действий, каждый «объект» является представителем какой-то социальной прослойки, каждый «объект» отличается от другого своим поведением (характеристикой). Наши программы — это тоже объекты, для выполнения своих функций они используют интерфейс для получения доступа к данным. Вычисления реализуются путем взаимодействия и обмена сообщениями между объектами. Таким образом, можно сказать, что в основе ООП лежит понятие объекта, объединяющего в себе свойства объекта (характеристика объекта) и методы объекта (действия объекта). Такое объединение свойств и методов в объекте называется инкапсуляцией. Она позволяет при создании программы скрыть особенности реализации того или иного способа обработки информации внутри объекта и облегчает повторное использование ранее написанного кода. Объектом будем называть элемент пользовательского интерфейса, который создается на форме с помощью средств управления. Объект объединяет в себе как описывающие его данные (свойства), так и средства обработки этих данных (методы). Под интерфейсом понимают совокупность средств, обеспечивающих взаимодействие пользователя и программ вычислительной системы. При разработке интерфейса пользователь должен быть заинтересован в максимально простом и удобном способе ввода и вывода данных. Важна и эстетическая форма подачи программы: это и размер формы, ее фон, шрифт надписей, звуковое и графическое сопровождение. Все визуальные объекты, такие как форма (Form), кнопка (button), поле ввода (textBox), надпись (label) и т.д., являются объектами. Объекты управляются с помощью свойств и методов. Свойства — это совокупность характеристик, описывающих объект. Например, можно задать цвет, размер, положение на экране командной кнопки. 12

Методы — это те действия, которые может выполнить объект. Например, метод Close (закрыть) закрывает форму, метод Clear очищает содержимое текстового поля. Многое и в реальной жизни можно описать с помощью объектов, свойств и методов. Например, вы — объект под названием Студент. Ваши свойства: Отделение, Номер группы, Успеваемость. Методы, которые вы можете выполнять: Ходить в учебное заведение, Учиться, Уважать преподавателей, Программировать. Для доступа к свойствам и методам объектов используется следующий синтаксис: Имя объекта. Свойство или метод ; Например: textBox1.Text = "ɉɪɨɝɪɚɦɦɢɪɨɜɚɧɢɟ" ; //Изменяется свойство Text объекта Текстовое поле

Важнейшим понятием объектно-ориентированного программирования является класс. Класс описывается как объект, на основе которого впоследствии будет создан конкретный объект. Класс определяет имя объекта, его свойства и действия, выполняемые над объектом. Существует, например, класс Командная кнопка — общее описание кнопок в окнах приложений. Соответственно, любой объект является экземпляром некоторого класса. В Visual C# классы объявляются с помощью ключевого слова class. Новые классы могут создаваться на основе уже существующих (предков), при этом они (потомки) наследуют свойства и методы последних. Создавая классыпотомки, разработчик может добавить им новые свойства и методы, а может переопределить методы, унаследованные от класса-предка. Возможность менять поведение программных объектов при вызове одноименного метода называется полиморфизмом. Инкапсуляция, наследование и полиморфизм — три базовых принципа, лежащих в основе ООП. После того как необходимые классы определены, разработчику программы остается создать на их основе нужные объекты и организовать взаимодействие между ними путем обмена сообщениями и реакции на события. Событием называется характеристика класса объектов, описывающая внешнее воздействие, на которое реагирует объект этого класса во время работы приложения. Объектно-ориентированное программирование основано на следующей идее: программы управляются событиями. Пояснить это можно так: после проектирования экранной формы устанавливаются события, и только затем программируются действия, связанные с этими событиями. Графические интерфейсы пользователя генерируют события в ответ на взаимодействие пользователя программы с графическим интерфейсом. Типичными видами взаимодействия являются перемещение мыши, щелчок мыши, щелчок по кнопке и т.д., информация о событиях передается обработчикам событий, которые являются методами, вызываемыми в ответ на возникновение конкретных событий. События основываются на понятии делегатов, которые являются объектами, ссылающимися на методы. В модели обработки событий делегаты действуют

13

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

Делегат событие E

Обработчик 1 для события Е Обработчик 2 для события Е

Рис. 1. Использование делегатов в модели обработки событий

Рассмотрим пустой обработчик события. private void button1_Click(object sender, EventArgs e) { //ɉɪɨɝɪɚɦɦɚ ɨɛɪɚɛɨɬɤɢ ɫɨɛɵɬɢɹ }

Имя обработчика события по умолчанию совпадает с именем управляющего элемента, за которым следуют символ подчеркивания и имя события. В данном случае рассматривается метод, который вызывается в ответ на щелчок по кнопке. Другими словами, когда мы выбрали событие Click (щелчок), среда создала сигнатуру метода, совпадающую с делегатом обработчика события Click, генерируемое элементом button1. Обработчикам события передаются два объекта: ссылка на объект, который генерирует событие (sender), и объект аргументов события (e). Аргумент e имеет тип EventArgs. Класс EventArgs является базовым классом для объектов, которые содержат информацию о событии. Любая программа использует пространства имен. Пространство имен — это модуль, предоставляющий использующей его программе свои объекты. Так, в пространстве имен System содержатся типы, обеспечивающие операции вводавывода (System.IO), выполнение операций с графическими примитивами (System.Drawing), работу с базами данных (System.Data) и т.д. В пространстве имен System содержится и класс System.Console, который не содержит объектов, необходимых для создания графического интерфейса, поэтому его можно использовать для первоначального знакомства с языком. В программе пространства имен перечисляются с помощью ключевого слова using. Например, при создании консольного приложения по умолчанию используются следующие пространства имен: using System; using System.Collections.Generic; using System.Text;

При создании Windows-приложения по умолчанию используются следующие пространства имен: using using using using using using using

System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Text; System.Windows.Forms;

Объект, созданный по «шаблону» класса объектов, является экземпляром класса и наследует весь набор свойств, методов и событий данного класса. Каж-

14

дый экземпляр класса имеет уникальное для данного класса имя. Для программного доступа к пространствам имен используется одна из следующих конструкций: 1. Указание списка пространства имен. Например, создадим экземпляр класса Pen (пространство имен System.Drawing), что продемонстрировано в листинге 1. Листинг 1 using System; using System.Drawing; //Ɉɛɴɹɜɥɟɧɢɟ ɞɚɧɧɨɝɨ ɩɪɨɫɬɪɚɧɫɬɜɚ ɢɦɟɧ ɜ ɞɚɧɧɨɣ ɩɪɨɝɪɚɦɦɟ ɨɛɹɡɚɬɟɥɶɧɨ using System.Windows.Forms; namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { Pen mypen = new Pen(Color.DarkRed); // ɋɨɡɞɚɧɢɟ ɤɚɪɚɧɞɚɲɚ ɬɟɦɧɨ-ɤɪɚɫɧɨɝɨ ɰɜɟɬɚ } } }

2. Использование абсолютного имени. Листинг 2 using System; using System.Windows.Forms; namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { System.Drawing.Pen mypen = new System.Drawing.Pen(System.Drawing.Color. DarkRed); // ɋɨɡɞɚɧɢɟ ɤɚɪɚɧɞɚɲɚ ɬɟɦɧɨ-ɤɪɚɫɧɨɝɨ ɰɜɟɬɚ } } }

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

15

1.5. Алфавит языка Visual C# Изучение любого языка начинается с изучения алфавита, из букв складываются слова, из слов — предложения. Аналогично происходит и при изучении языка программирования. Сначала мы должны уяснить, какие символы можно использовать для записи слов языка, из которых можно формировать определенные конструкции. Итак, в алфавит языка Visual C# входят: 1. Латинские буквы от a до z и от A до Z. В Visual C# есть различия между прописными и строчными буквами алфавита, например chislo, CHISLO, Chislo — разные имена переменных. 2. Цифры от 0 до 9. 3. Специальные символы, например +, -, *, /. 4. Зарезервированные (служебные) слова: for, if, else, switch и т.д.

1.6. Идентификаторы и общие правила их написания Для того чтобы программа решения задачи обладала свойством массовости, следует употреблять не конкретные значения величин, а использовать их обозначения для возможности изменения по ходу выполнения программы их значений. Для обозначения в программе переменных и постоянных величин используются имена — идентификаторы (identification — установление соответствия объекта некоторому набору символов). Программа на Visual С# представляет собой последовательность инструкций, которые называются операторами. Одна инструкция от другой отделяется точкой с запятой. Следует учитывать, что: x в идентификатор не могут входить пробелы, специальные символы алфавита; x длина идентификатора не ограничена; x идентификатор начинается только с буквы или со знака подчеркивания; x идентификатор может состоять из букв, цифр и знака подчеркивания; x при написании идентификаторов можно использовать как прописные, так и строчные буквы латинского алфавита; x идентификатор не должен являться зарезервированным словом. Например: summa1 2delta Block_35 Nomer.doma Сумма

правильно ошибка правильно ошибка ошибка

1.7. Оператор присваивания Действия, выполняемые компьютером в процессе решения задачи, записываются в виде операторов алгоритмического языка. Изменение значения переменной осуществляется оператором присваивания. Присваивание переменной некоторого значения означает занесение этого значения в соответствующую ячейку памяти. Действие, выполняемое этим оператором, обозначается знаком «=». 16

Слева от этого знака записывается имя той переменной, которой нужно присвоить новое значение (например, x=). Справа может быть: 1. Число, например x = 5; 2. Выражение, например x = (3 * a) / 2; x = a > 1; 3. Другая переменная, например x = a; Если переменной присваивается какое-то значение, то ее старое значение при этом исчезает. Например, при выполнении последовательности операторов k = 5; k = k + 1; k = 8; после первого присваивания значение переменной k становится равным 5, после второго — 6, после третьего — 8. Операторы выполняются в той последовательности, как они записаны в программе. Например, фрагмент программы нахождения среднего арифметического включает в себя операторы: a = 5; b = 10; s = a + b; v = s / 2; возможна запись оператора присваивания в следующем виде: *= оператор — умножение с присваиванием /= оператор — деление с присваиванием %= оператор — остаток от деления с присваиванием += оператор — сложение с присваиванием –= оператор — вычитание с присваиванием Пример демонстрирует оператор prim += prim, который увеличивает значение переменной слева от оператора на величину, стоящую справа от оператора. int prim =1; prim += prim; Console.WriteLine("Ɋɟɡɭɥɶɬɚɬ

prim= " + '\n' + prim);

В данном случае единица прибавляется к значению ячейки prim. Ответ в примере равен 2.

1.8. Типы данных Типы данных относятся к самым фундаментальным понятиям любого языка программирования. Тип данных определяет множество допустимых значений, которое может принимать указанная переменная. Типы различаются между собой диапазоном допустимых значений, количеством значащих цифр и количеством байтов, необходимых для хранения данных в памяти компьютера. Описание констант Если в процедуре вам нужна величина, которая бы не меняла своего значения, то применяются константы. Для их объявления используется оператор const, имеющий следующий синтаксис: const ТипДанных ИмяКонстанты = Значение; 17

Например: const int gruppa = 25; или другой пример: namespace ConsoleApplication1 { class Program { public const string my="student"; public const double mypi=3.1415926; static void Main(string[] args) { } } }

Описание переменных При объявлении переменной указывается имя переменной и ее тип, каждый тип данных определен в пространстве имен System. Целые типы данных В табл. 1 представлены типы целочисленных переменных. Таблица 1. Типы целочисленных переменных Тип sbyte byte short ushort int uint long ulong

Диапазон –128 … 127 0…255 –32768 … 32767 0 … 65535 –2147483648...2147483647 0..42 944 967 295 –9223372036854775808…9223372036854775807 0…18446744073709551615

Размер в байтах 1 байт 1 байт 2 байта 2 байта 4 байта 4 байта 8 байт 8 байт

Например: int a = 5 ; int b = a*2 ; Над данными целого типа определены следующие арифметические операции: + – * / %

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

Результат операции % можно вычислить по формуле: a % b = a – (a / b)*b. Ниже приведены результаты выполнения примеров с помощью операции %: 36 % 6 = 0 5%2=1 2%5=2 20 % 3 = 2 0%5=0

18

Вещественные типы данных В языке Visual C# допускается представление вещественных (дробных) значений в форме с плавающей и фиксированной точкой. В форме с фиксированной точкой число представляется последовательностью десятичных цифр со знаком плюс или минус. Например: 7.32 ; 456.721 ; 0.015 ; 192.0 ; –15.0 Форма с плавающей точкой (экспоненциальный формат) используется для представления очень больших или очень маленьких чисел. В этой форме число записывается в виде:

r mE r p где m — мантисса числа; Е — символ, обозначающий основание десятичной ССЧ; р — порядок (степень) числа. Например: 7.32Е+00 ; 4.56721E+02 ; 1.5E-02 ; 1.92E+02 ; -1.5E+01 ; В табл. 2 представлены типы вещественных переменных. Таблица 2. Типы вещественных переменных Тип float double

Диапазон 1.5 . 10-45 … 3.4 . 1038 5.0 . 10-324 … 1.7 . 10308

Размер в байтах 4 8

Например: float a = 5.1; float b = a*2.1; Тип результата при выполнении арифметических операций зависит от типов операндов (данных), поэтому при разработке программ следует учитывать следующие замечания. 1. Выражение, составленное из переменных целого и вещественного типов, имеет вещественный тип. Например: namespace ConsoleApplication1 { class Program { static void Main(string[] args) { double a = 5.1; int b = 5; int c = a + b ; //ɨɲɢɛɤɚ — ɩɟɪɟɦɟɧɧɚɹ c ɨɩɢɫɚɧɚ ɰɟɥɨɱɢɫɥɟɧɧɵɦ ɬɢɩɨɦ Console.WriteLine("Ɋɟɡɭɥɶɬɚɬ = " + c); Console.ReadLine(); } } }

Следовательно, переменную с необходимо описать типом double. 2. При выполнении оператора присваивания тип выражения, стоящего в правой части, должен соответствовать типу переменной в левой части. Например: namespace ConsoleApplication1 {

19

class Program { static void Main(string[] args) { double a = 5.1; double b = 5.2; double c = a + b; Console.WriteLine("Ɋɟɡɭɥɶɬɚɬ = " + c); Console.ReadLine(); } } }

3. Допускается присваивание переменной вещественного типа значение выражения целого типа, но не наоборот. Например: Первый случай: namespace ConsoleApplication1 { class Program { static void Main(string[] args) { int a = 5; int b = 5; double c = a + b; //ɞɨɩɭɫɤɚɟɬɫɹ Console.WriteLine("Ɋɟɡɭɥɶɬɚɬ = " + c); Console.ReadLine(); } } }

Второй случай: namespace ConsoleApplication1 { class Program { static void Main(string[] args) { double a = 5.1; double b = 5.2; int c = a + b; //ɧɟ ɞɨɩɭɫɤɚɟɬɫɹ Console.WriteLine("Ɋɟɡɭɥɶɬɚɬ = " + c); Console.ReadLine(); } } }

Символьные типы данных Значением символьного типа является множество всех символов персонального компьютера. Каждому символу приписывается целое число в диапазоне от 0…255. Это число служит кодом внутреннего представления символа, и все коды записаны в таблицу ASCII (American Standard Code for Information Interchange — американский стандартный код для обмена информацией). В языке Visual C# переменные символьного типа описываются типом char. Например: 20

char v = 'b' ; В программе значения переменных и констант символьного типа должны быть заключены в апострофы. Строковые типы данных Значениями строковых переменных являются строковые константы (строки). В языке Visual C# переменные строкового типа описываются типом string. string name = "Студент"; Строка является объектом класса String пространства имен System. Любая переменная строкового типа является экземпляром класса String, и, чтобы воспользоваться его свойством или методом, следует после имени переменной или литерала добавить точку и за ней название свойства или метода. Иногда бывает необходимость указать компьютеру, в каком виде (формате) мы хотим получить результат. Для этого следует использовать метод Format (см. листинг 3). В скобках располагаются через запятую два аргумента. Первый аргумент — номер параметра. Второй аргумент — минимальная ширина поля, которая отводится под выводимое значение. Также может быть указан так называемый спецификатор формата, с помощью которого можно задать количество позиций, отводимых под дробную часть числа. Возможные шаблоны форматирования строк с использованием метода Format и их описание приведены в табл. 3. Таблица 3. Шаблоны форматирования строк Шаблон # 0 #.### 0.000

E

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

Листинг 3 namespace ConsoleApplication1 { class Program { static void Main(string[] args) { double a=5.3111111 ; Console.WriteLine ("{0:#}",a); Console.WriteLine ("{0:#.###}",a); Console.WriteLine ("{0:0}",a); Console.WriteLine ("{0:0.000}",a); Console.WriteLine ("{0:e}",a); Console.ReadLine(); } } }

На рис. 2 показан результат работы программы.

21

Рис. 2. Число 5.3111111 представлено в различных форматах

В некоторых задачах предполагается буквальное воспроизведение строк. В этом случае в Visual C# используется префикс @. Например: Листинг 4 namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Console.WriteLine (@"double a=5.3111111;" ); Console.ReadLine(); } } }

На рис. 3 показан результат работы программы.

Рис. 3. Строка выводится без изменений

Иногда требуется применить некоторую управляющую последовательность символов, которая осуществляет, например, перевод строки, при этом управляющая последовательность начинается с обратного слеша (\), за которым следует управляющий символ. Например, вставка в строку \n приведет к переходу на новую строку, что отражено на рис. 4. Console.WriteLine ("double a=5.3\n1\n1\n1\n1\n1\n1;" );

Рис. 4. Вставка символа n приводит к переходу на новую строку

Вставка в строку \t приведет к вставке знака табуляции, что отражено на рис. 5. Console.WriteLine ("double a=5.3\t1\t1\t1\t1\t1\t1;" );

22

Рис. 5. Вставка символа t приводит к вставке знака табуляции

Вставка в строку \" приведет к вставке двойной кавычки, что отражено на рис. 6. Console.WriteLine ("double a=5.3\"1\t1\t1\t1\t1\"1;" );

Рис. 6. Вставка символа " приводит к вставке двойной кавычки

Вставка в строку \\ приведет к вставке обратного слеша, что может быть полезно при указании пути к диску или файлу, что отражено на рис. 7. Console.WriteLine("double a=5.3\\1\t1\t1\t1\t1\\1;");

Рис. 7. Вставка символа \ приводит к вставке обратного слеша

Логические типы данных (Булевский тип) Переменные этого типа могут принимать одно из двух значений: true (истина) или false (ложь). Например, значение логического выражения 5 > 3 есть Истина, а значение 5 = 3 — Ложь. Значение условия a > 5 зависит от значения переменной a и не определено до тех пор, пока неизвестно значение величины a. Переменные, описанные как логические, могут принимать в ходе выполнения программы только логические значения. Например, правильно будут записаны операторы: bool a = true; bool b = false; Результат операции сравнения — это логическое значение, поэтому в Visual C# разрешена запись: int d = 6; bool a = d > 5; В последнем случае переменной a присваивается значение true, если d > 5, и false — в противном случае. Над данными логического типа могут выполняться логические операции, приведенные в табл. 4. Таблица 4. Логические операции Операция && (конъюнкция) | | (дизъюнкция) ! (отрицание)

Действие Логическое И Логическое ИЛИ Логическое НЕ

Выражение А && B А|| B !A

23

В листинге 5 приведен пример использования логических операций. Листинг 5 namespace ConsoleApplication1 { class Program { static void Main(string[] args) { bool a=true ; if (a && a) Console.WriteLine (a); //ɪɟɡɭɥɶɬɚɬ ɟɫɬɶ True if (a || a) Console.WriteLine (a); //ɪɟɡɭɥɶɬɚɬ ɟɫɬɶ True Console.WriteLine(!a); //ɪɟɡɭɥɶɬɚɬ ɟɫɬɶ False Console.ReadLine(); } } }

Тип данных DateTime Тип DateTime служит для получения текущего времени, даты, которая может содержать месяц, день, год. В листинге 6 приведен пример использования типа DateTime. Листинг 6 namespace ConsoleApplication1 { class Program { static void Main(string[] args) { DateTime c = new DateTime(1962,08,28); Console.WriteLine ("ə ɪɨɞɢɥɫɹ ɜ {0} (ɜɬɨɪɧɢɤ). ɗɬɨ {1} ɞɟɧɶ ɜ ɝɨɞɭ", c.DayOfWeek, c.DayOfYear); Console.ReadLine(); } } }

На рис. 8 показан результат работы программы.

Рис. 8. Результаты работы программы

Явное преобразование типов Как известно, компилятор должен иметь возможность определить тип каждой переменной. Кроме того, если одной переменной присваивается значение другой и при этом необходимо преобразование типов (например, от double к int), такое преобразование должно быть явным. Например: static void Main(string[] args) {

24

double x = 5.8; int f = (int)x; //ɨɫɭɳɟɫɬɜɥɹɟɬɫɹ ɩɪɟɨɛɪɚɡɨɜɚɧɢɟ Console.WriteLine("Ɋɟɡɭɥɶɬɚɬ = " + f); Console.ReadLine(); }

Ответ в примере f = 5. Комментарии Для лучшего понимания программы в ней часто записывается пояснительный текст — комментарий. Комментарии выполняют несколько важных функций: x делают программу легко читаемой, поясняя смысл отдельных программных строк; x временно отключают фрагменты программы при ее отладке. В языке Visual C# существует несколько способов ввода комментариев: x применение двойного слеша // x применение многострочных комментариев. Например: sum = a + b ; // Вычисляется сумма двух чисел sum = a + b ; /*Используем переменные a и b для вычисления их суммы*/

1.9. Запись математических функций В связи с невозможностью записи некоторых стандартных математических функций с клавиатуры персонального компьютера, в языке Visual C# существуют так называемые встроенные функции, с помощью которых пользователь записывает арифметические выражения. Некоторые математические функции языка Visual C# представлены в табл. 5. Таблица 5. Общие математические функции класса Math Функция Sin x Cos x

Ctg x |x|

Запись на Visual C# Sin (x) Cos (x) Tan (x) или Sin (x) / Cos (x) Cos (x) / Sin (x) Abs (x)

ex Ln x

Exp (x) Log (x)

X

Sqrt (x)

Tg x

Log10x 2

Log10 (x)

Cos x

Cos (x) * Cos (x)

Acos x

Acos (x)

Asin x

Asin (x)

Atan x

Atan (x)

Cosh x

Cosh (x)

Sinh x

Sinh (x)

Действие Возвращает значение функции Sin от числа x Возвращает значение функции Cos от числа x Возвращает значение функции Tg от числа x Возвращает значение функции Ctg от числа x Возвращает абсолютную величину числа x Возвращает результат возведения числа е в степень х Возвращает натуральный логарифм числа x Возвращает результат извлечения квадратного корня числа x Возвращает логарифм числа x по основанию 10 Возвращает результат возведения функции Cos x в квадрат Возвращает значение функции арккосинус от числа x Возвращает значение функции арксинус от числа x Возвращает значение функции арктангенс от числа x Возвращает значение функции гиперболический косинус от числа x Возвращает значение функции гиперболический синус от числа x

25

Tanh x

Возвращает значение функции гиперболический тангенс от числа x Возвращает результат округления числа x до целого значения Возвращает результат округления числа x до целого значения в большую сторону Возвращает результат округления числа x до целого значения в меньшую сторону Возвращает результат возведения числа x в степень y Возвращает большее значение из двух чисел x и y Возвращает меньшее значение из двух чисел x и y

Tanh (x)

Round (x) Ceiling (x) Floor (x) Pow (x, y) Max (x, y) Min (x, y)

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

Таблица 6. Результаты работы математических функций Математическая функция Abs (-10)

Результат

Описание

10

Абсолютная величина (модуль) числа

Ceiling (65.28)

66

«Потолок» — ближайшее целое число, большее или равное аргументу

Ceiling (-65.28)

-65

Floor (65.98)

65

Floor (-65.98)

-66

«Потолок» — ближайшее целое число, большее или равное аргументу «Пол» — ближайшее целое число, меньшее или равное аргументу «Пол» — ближайшее целое число, большее или равное аргументу Е2 — число Е в заданной степени Натуральный логарифм ln 35 Десятичный логарифм Log10 1000 Максимальное из двух чисел Минимальное из двух чисел

Exp (2) Log (35) Log10 (1000) Max (28,62) Min (28,62) Round (62.981) Round (62.17) Round (62.13605,2) Sqrt (25)

7,38905609893065 3,55534806148941 3 62 28 63 62 62,14 5

Округление до целых Округление до двух знаков после запятой Корень квадратный

1.10. Операции отношения Операции отношения представлены в табл. 7.

Таблица 7. Операции отношения Операция Операнд1 < Операнд2 Операнд1 > Операнд2 Операнд1 = Операнд2 Операнд1 != Операнд2 Операнд1 == Операнд2

26

Описание Меньше Больше Меньше или равно Больше или равно Не равно Равно

Контрольные вопросы к главе 1 1. Что называется алгоритмом? Какими свойствами он обладает? Перечислите и дайте характеристику основным этапам решения задач на ЭВМ. 2. Поясните понятие «идентификатор» и расскажите об общих правилах написания идентификаторов. 3. В чем заключается действие оператора присваивания? Каковы две формы записи дробных чисел? 4. Дайте характеристику каждому типу данных Visual C#. 5. Назовите приоритеты операций 6. Для каких целей используются комментарии в программах? Какими способами можно закомментировать тот или иной участок программного кода?

27

2. ВВЕДЕНИЕ В VISUAL C# C# — объектно-ориентированный язык программирования. Разработан в 1998 — 2001 годах группой инженеров под руководством Андерса Хейлсберга в компании Microsoft как основной язык разработки приложений для платформы Microsoft .NET.

2.1. Организация проекта в Visual C# Приложение собирается из многих элементов: форм, программных модулей, внешних библиотек, картинок, пиктограмм и др. Каждый элемент размещается в отдельном файле и имеет строго определенное назначение. Набор всех файлов, необходимых для создания приложения, называется проектом. Компилятор последовательно обрабатывает файлы проекта и строит из них выполняемый файл. В Visual C# заложен подход к разработке приложения, ориентированный на решение поставленной задачи. Решение может содержать несколько проектов, изображения и другие элементы, необходимые для работы приложения. Когда пользователь выбирает в окне New Project значок Windows Application, создается решение с проектом, состоящим из файлов. Структура программы создается автоматически. Выберем значок Windows Application и создадим проект «Привет, мир!», при этом в проект автоматически добавляется несколько файлов. В нашем случае в проекте появятся два файла, содержащие код: Form1.cs и Program.cs. Когда в Visual C# создается проект для выбранного шаблона, в проект добавляется набор ссылок, необходимый именно для данного шаблона. Список этих ссылок размещается под узлом References (Ссылки) (рис. 9).

Рис. 9. Список ссылок

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

28

Таблица 8. Список ссылок, добавляемых в проект Ссылка System

System.Data System.Drawing

System.Windows.Forms System.XML

Описание Это пространство имен часто называют корневым, поскольку оно обеспечивает функциональность, необходимую для каждого приложения. Все основные типы данных (String, Object и т.д.) принадлежат классам, относящимся к пространству System Состоит из классов, реализующих функциональность объектов ADO.NET, которые используются для доступа к данным Обеспечивает доступ к графической функциональности GDI+, представляющей собой обновленную версию функций интерфейса графических устройств (Graphics Device Interface) Windows API Содержит набор классов, применяемых для создания обычных приложений Windows Содержит классы, применяемые для XML-обработки данных

Нанесем на форму объекты button1 и textBox1. Изменим свойство Text кнопки button1 — Ok. В листинге 7 приведены код шаблона приложения, который создает среда программирования, и написанный нами код программы, состоящий из одной строки — textBox1.Text = "Привет, мир!";. Листинг 7 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { textBox1.Text = "ɉɪɢɜɟɬ, ɦɢɪ!"; } } }

В начале кода приведены пространства имен, которые, возможно, будут использоваться в приложении. Далее описан класс Form1, производный от класса Form. Код метода InitializeComponent() сейчас скрыт, но будет виден в листинге 8. В нем приводится код, созданный Visual C# в другом файле — Form1.Designer.cs. Метод InitializeComponent() обновляется средой при добавлении на форму элементов управления и изменении их свойств. Например, в участке кода this.button1.Location = new System.Drawing.Point(178, 49); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(75, 23); this.button1.TabIndex = 0; this.button1.Text = "Ok"; this.button1.UseVisualStyleBackColor = true;

29

можно увидеть имя кнопки — button1, определить ее размеры, прочитать, что свойство Text содержит надпись Ok и т.д. В участке кода this.button1 = new System.Windows.Forms.Button(); this.textBox1 = new System.Windows.Forms.TextBox();

создаются экземпляры компонентов с занесением их в коллекцию, доступ к которой выполняется посредством операторов this.Controls.Add(this.textBox1); this.Controls.Add(this.button1);

В последних двух операторах кода private System.Windows.Forms.Button button1; private System.Windows.Forms.TextBox textBox1;

содержатся два поля, которые определены в пространстве имен System. Windows. Forms и представляют собой два объекта, нанесенные на форму: button1 и textBox1. Листинг 8 namespace WindowsApplication1 { partial class Form1 { /// /// Required designer variable. /// private System.ComponentModel.IContainer components = null; /// /// Clean up any resources being used. /// /// true if managed resources should be disposed; otherwise, false. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() { this.button1 = new System.Windows.Forms.Button(); this.textBox1 = new System.Windows.Forms.TextBox(); this.SuspendLayout(); // // button1 // this.button1.Location = new System.Drawing.Point(178, 49); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(75, 23); this.button1.TabIndex = 0;

30

this.button1.Text = "Ok"; this.button1.UseVisualStyleBackColor = true; this.button1.Click += new System.EventHandler(this.button1_Click); // // textBox1 // this.textBox1.Location = new System.Drawing.Point(53, 13); this.textBox1.Name = "textBox1"; this.textBox1.Size = new System.Drawing.Size(100, 20); this.textBox1.TabIndex = 1; // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(406, 100); this.Controls.Add(this.textBox1); this.Controls.Add(this.button1); this.Name = "Form1"; this.Text = "Form1"; this.ResumeLayout(false); this.PerformLayout(); } #endregion private System.Windows.Forms.Button button1; private System.Windows.Forms.TextBox textBox1; } }

2.2. Процесс создания проекта Рассмотрим процесс разработки приложения (создадим программу для сложения двух чисел) в среде Microsoft Visual Studio 2012. Для этого выполните команду Пуск / Программы / Microsoft Visual Studio 2012 / File / New Project. В категории Other Languages выберите Visual C#, а в категории Templates выберите Console Application (рис. 10).

Рис. 10. Окно New Project

В листинге 9 представлен шаблон консольного приложения. 31

Листинг 9 using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { } } }

Соответственно для создания Windows-приложения в категории Templates выберите Windows Application (рис. 11).

Рис. 11. Окно New Project при создании Windows-приложения

В листинге 10 представлен шаблон Windows-приложения. Листинг 10 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } }

32

2.3. Методы ввода и вывода данных Для запуска программы на выполнение следует выбрать на панели Standard кнопку Start Debugging либо воспользоваться «горячей» клавишей F5. Никаких функциональных действий она, конечно, выполнять не будет, поскольку мы не сделали самого главного — не написали программу. Для этого нам следует, в первую очередь, познакомиться с методами ввода-вывода данных. В листинге 11 приведен текст программы, выполняющей сложение двух чисел. При создании консольных приложений для ввода-вывода данных используется класс Console пространства имен System. Методы ввода Write и WriteLine отличаются тем, что использование последнего приводит к переводу курсора на следующую строку. По умолчанию данные, считанные методом ReadLine, представляются текстовой строкой. Поэтому в листинге присутствует переменная con, описанная типом String. Предположим, мы будем вводить в программе дробные значения в качестве данных, тогда, например, метод ToDouble() можно использовать для преобразования текстового аргумента в числовое значение вещественного типа (см. листинг 11). Кроме класса Convert, с помощью которого и выполняется данное преобразование, в программах можно применять метод Parse, что показано в листинге 12. Листинг 11 using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string con; Console.WriteLine("ȼɜɟɞɢɬɟ 1 ɱɢɫɥɨ "); con = Console.ReadLine(); double a = Convert.ToDouble(con); Console.Write("ȼɜɟɞɢɬɟ 2 ɱɢɫɥɨ "); con = Console.ReadLine(); double b = Convert.ToDouble(con); double c = a + b; Console.WriteLine("Ɋɟɡɭɥɶɬɚɬ ɫɥɨɠɟɧɢɹ ɞɜɭɯ ɱɢɫɟɥ = " + c); Console.ReadLine(); //Ɉɠɢɞɚɧɢɟ ɧɚɠɚɬɢɹ ɤɥɚɜɢɲɢ ɞɥɹ ɡɚɜɟɪɲɟɧɢɹ ɪɚɛɨɬɵ ɩɪɢɥɨɠɟɧɢɹ } } } Листинг 12 using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication1 {

33

class Program { static void Main(string[] args) { string con; Console.WriteLine("ȼɜɟɞɢɬɟ 1 ɱɢɫɥɨ " ); con = Console.ReadLine(); double a = double.Parse(con); Console.Write("ȼɜɟɞɢɬɟ 2 ɱɢɫɥɨ "); con = Console.ReadLine(); double b = double.Parse(con); double c = a + b; Console.WriteLine("Ɋɟɡɭɥɶɬɚɬ ɫɥɨɠɟɧɢɹ ɞɜɭɯ ɱɢɫɟɥ = " + c); Console.ReadLine(); } } }

В листинге 13 приведен код программы «Сложение двух чисел», созданной как Windows-приложение. Для его создания, как говорилось выше, следует выбрать в окне New Progect опцию Windows Application и нанести на форму элементы управления (панель Toolbox) в соответствии с рис. 12. Последовательно выделяя каждый элемент управления (Form1, label1, label2, label3, button1), находим его свойство Text и вводим надписи в соответствии с рис. 13.

Рис. 12. Порядок расположения элементов на форме

Рис. 13. Подписи к элементам управления

В листинге 13 приведена процедура, выполняющая сложение двух чисел. Для ее написания следует выполнить двойной щелчок на кнопке button1 (Ок), создав процедуру обработки события button1_Click. Листинг 13 private void button1_Click(object sender, EventArgs e) { double a = Convert.ToDouble(textBox1.Text); double b = Convert.ToDouble(textBox2.Text);

34

double c = a + b; textBox3.Text = c.ToString("n"); }

Пользователь, используя методы ввода-вывода, выводит результаты разработанной им программы на экран. Однако сделать это он может по-разному, в частности, ввод данных можно осуществить на форме, что предпочтительнее тогда, когда не требуется вводить множество данных. И, наоборот, в случае ввода большого количества данных предпочтительнее запрограммировать стандартное диалоговое окно. Рассмотрим эти способы подробнее. Первый способ. Ввод данных в текстовое окно, расположенное на форме. Например: double a = Convert.ToDouble(textBox1.Text);

или int a = Convert.ToInt16(textBox1.Text);

Запись такого вида означает занесение в ячейку с именем a введенного пользователем значения в текстовое окно с именем textBox1, расположенное на форме. Появление интеллектуальной подсказки, которая появится после того, как пользователь поставит точку при написании класса Convert, поможет сориентироваться в выборе нужного метода преобразования. Подобная ситуация представлена на рис. 14. Вывод данных в текстовое окно на форме можно осуществить, используя метод ToString. Например: textBox3.Text = c.ToString("n");

Запись c.ToString() означает, что значение переменной c преобразуется из числа в строку символов.

Рис. 14. Появление интеллектуальной подсказки

В коде листинга 13 используется один из символов форматирования строк, применяемых в Visual C#. В строке textBox3.Text = c.ToString("n"); используется символ n. В табл. 9 представлены основные символы форматирования строк.

Таблица 9. Символы форматирования строк Константа f, F e, E n, N g, G

Формат отображения числа Число с фиксированной точкой Число, записанное в экспоненциальной форме Числовой формат Number. Применяется для представления дробных чисел Универсальный формат General. Можно использовать для представления чисел с фиксированной или плавающей точкой 35

d, D c, C

Используется для форматирования десятичных чисел Денежный формат. Применяется для отображения денежных величин

Второй способ. Создание диалоговых окон. К сожалению, в пространстве имен System.Windows.Forms нет базового класса, отвечающего за вывод диалоговых окон. Воспользуемся функцией InputBox языка программирования Microsoft Visual Basic, который входит в состав среды Microsoft Visual Studio 2012. Для ее использования выберем пункт меню Project / Add Reference. Откроется окно, представленное на рис. 15.

Рис. 15. Окно Add Reference

На вкладке .NET выбираем Microsoft.Visual Basic и нажмем Ok. В окне Solution Explorer (рис. 16) увидим ссылку Microsoft.Visual Basic.

Рис. 16. Окно Solution Explorer

В общем виде инструкция ввода данных с использованием функции InputBox выглядит так: Переменная = Microsoft.VisualBasic.Interaction.InputBox("Приглашение", "Заголовок", "Содержимое", X, Y) ;

36

Приглашение — это любой текст, который должен находиться в Окне ввода. Его назначение — служить подсказкой пользователю, какую информацию он должен ввести в специальное поле ввода, находящееся в этом окне. Аргумент Заголовок — это надпись в строке заголовка Окна ввода. Содержимое — первоначальное содержимое поля ввода. X и Y — координаты вывода диалогового окна (чаще всего будем использовать координаты –1, –1, которые позволят расположить окно по центру экрана). Значение функции InputBox — строка, которую ввел пользователь. Поэтому если программе надо получить число, то введенная строка должна быть преобразована в число при помощи соответствующего метода. Вывод в окно сообщения осуществляется с помощью функции MessageBox и метода Show — MessageBox.Show. Эта функция позволяет поместить в окно с сообщением один из стандартных значков, например «Внимание», задать количество и тип командных кнопок и определить, какую из кнопок нажал пользователь. В общем виде инструкция вывода данных с использованием функции MessageBox выглядит так: MessageBox.Show ("Сообщение" + Значение, "Заголовок", Кнопки, Пиктограмма) Сообщение — представляет собой текст, который будет отображен в окне сообщения. Значение — ответ, представленный в числовом виде. Заголовок — это надпись в строке заголовка Окна вывода. Кнопки — указывается тип отображаемых кнопок. Пиктограмма — тип используемой пиктограммы. Установки для аргумента Кнопки представлены в табл. 10. Таблица 10. Установки для аргумента Кнопки Константа MessageBoxButtons.OK MessageBoxButtons.OkCancel MessageBoxButtons.AbortRetryIgnore MessageBoxButtons.YesNoCancel MessageBoxButtons.YesNo MessageBoxButtons.RetryCancel

Описание Отображает только кнопку Ок Отображает кнопки Ок и Отмена Отображает кнопки Стоп, Повтор и Пропустить Отображает кнопки Да, Нет, Отмена Отображает кнопки Да, Нет Отображает кнопки Повтор и Отмена

Некоторые наиболее часто используемые установки для аргумента Пиктограмма представлены в табл. 11.

Таблица 11. Установки для аргумента Пиктограмма Константа MessageBoxIcon.Error MessageBoxIcon.Question MessageBoxIcon.Exclamation MessageBoxIcon.Information

Описание Отображает запрещающую пиктограмму Отображает предупреждающую пиктограмму (знак вопроса на белом фоне) Отображает предупреждающую пиктограмму (знак вопроса в красном треугольнике) Отображает информационную пиктограмму

В листинге 14 приведен еще один вариант программы «Сложить два числа» с использованием функций InputBox и MessageBox. Листинг 14 namespace WindowsApplication1

37

{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { string a = Microsoft.VisualBasic.Interaction.InputBox("ȼɜɟɞɢɬɟ 1 ɱɢɫɥɨ", "Ɂɚɝɨɥɨɜɨɤ ɨɤɧɚ", "0", -1, -1); //ɩɟɪɜɨɧɚɱɚɥɶɧɨɟ ɫɨɞɟɪɠɢɦɨɟ ɨɤɧɚ ɜɜɨɞɚ — 0 ,ɬɚɤ ɤɚɤ ɜ ɤɚɱɟɫɬɜɟ ɩɚɪɚɦɟɬɪɚ ɭɤɚɡɚɧɨ "0" int chislo = Convert.ToInt32(a); string b = Microsoft.VisualBasic.Interaction.InputBox("ȼɜɟɞɢɬɟ 2 ɱɢɫɥɨ", "Ɂɚɝɨɥɨɜɨɤ ɨɤɧɚ", "", -1, -1); //ɩɟɪɜɨɧɚɱɚɥɶɧɨɟ ɫɨɞɟɪɠɢɦɨɟ ɨɤɧɚ ɜɜɨɞɚ — ɤɭɪɫɨɪ, ɬɚɤ ɤɚɤ ɜ ɤɚɱɟɫɬɜɟ ɩɚɪɚɦɟɬɪɚ ɭɤɚɡɚɧɵ ɩɭɫɬɵɟ ɤɚɜɵɱɤɢ "" int chislo1 = Convert.ToInt32(a); //ɩɪɟɨɛɪɚɡɭɟɦ ɫɬɪɨɤɨɜɨɟ ɡɧɚɱɟɧɢɟ ɜ ɱɢɫɥɨɜɨɟ int chislo2 = Convert.ToInt32(b); //ɩɪɟɨɛɪɚɡɭɟɦ ɫɬɪɨɤɨɜɨɟ ɡɧɚɱɟɧɢɟ ɜ ɱɢɫɥɨɜɨɟ int sum = chislo1 + chislo2; MessageBox.Show("ɋɭɦɦɚ ɞɜɭɯ ɱɢɫɟɥ=" + sum.ToString("n"),"Ɂɚɝɨɥɨɜɨɤ ɨɤɧɚ",MessageBoxButtons.OK,MessageBoxIcon.Information); Application.Exit(); } } }

Последовательность появления запроса на ввод данных и вывода результата представлена на рис. 17 — 19.

Рис. 17. Запрос на ввод первого числа

Рис. 18. Запрос на ввод второго числа

38

Рис. 19. Результат сложения чисел

2.4. Использование проверки корректности ввода данных Усовершенствуем программу «Сложение двух чисел». В новом варианте после ввода числа в первое поле при последовательном нажатии клавиши Enter курсор переходит во второе поле, а затем на кнопку Ок. При этом пользователь в поля ввода может вводить только цифры, знак «минус», запятую в качестве разделителя, разрешенной является и клавиша Backspace. Если нажата запрещенная клавиша, то процедура присваивает значение True свойству Handled, тем самым информируя систему о том, что обработка события выполнена и стандартную процедуру обработки, которая обеспечивает отображение символа в поле редактирования, вызывать не надо. Процедуру обработки события textBox1_KeyPress создаем следующим образом. 1. Выделяем элемент управления textBox1. 2. В окне Properties выбираем вкладку Events. 3. Находим событие KeyPress и выполняем двойной щелчок в правой колонке данной строки. 4. Начинаем писать программный код. Подобным образом будем создавать и другие процедуры обработки событий. Работа оператора условного оператора if, который используется в листинге 15, подробно будет рассмотрена в будущем, пока можно сказать о том, что он осуществляет проверку логического выражения. Листинг 15 namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { double a = Convert.ToDouble(textBox1.Text); double b = Convert.ToDouble(textBox2.Text); double c = a + b; textBox3.Text = c.ToString("e"); } private void textBox1_KeyPress(object sender, KeyPressEventArgs e) { if (!Char.IsDigit(e.KeyChar) && !(Char.IsControl(e.KeyChar))) {

39

if (!(e.KeyChar.ToString() == "," && textBox1.Text.IndexOf(",") == -1) && !(e.KeyChar.ToString() == "-")) e.Handled = true; // ɨɫɭɳɟɫɬɜɥɹɟɦ ɤɨɧɬɪɨɥɶ ɩɪɚɜɢɥɶɧɨɫɬɢ ɜɜɨɞɢɦɵɯ ɞɚɧɧɵɯ } if (e.KeyChar.Equals((char)13)) //ɩɟɪɟɜɨɞɢɦ ɮɨɤɭɫ ɧɚ ɜɬɨɪɨɟ ɬɟɤɫɬɨɜɨɟ ɨɤɧɨ textBox2.Focus(); } private void textBox2_KeyPress(object sender, KeyPressEventArgs e) { if (!Char.IsDigit(e.KeyChar) && !(Char.IsControl(e.KeyChar))) { if (!(e.KeyChar.ToString() == "," && textBox2.Text.IndexOf(",") == -1) && !(e.KeyChar.ToString() == "-")) e.Handled = true; // ɨɫɭɳɟɫɬɜɥɹɟɦ ɤɨɧɬɪɨɥɶ ɩɪɚɜɢɥɶɧɨɫɬɢ ɜɜɨɞɢɦɵɯ ɞɚɧɧɵɯ } if (e.KeyChar.Equals((char)13)) //ɩɟɪɟɜɨɞɢɦ ɮɨɤɭɫ ɧɚ ɤɨɦɚɧɞɧɭɸ ɤɧɨɩɤɭ button1.Focus(); } } }

2.5. Обработка исключений Прерывания, рассматриваемые в данном параграфе, относятся к классу внутренних прерываний и называются исключениями (exception). Они происходят синхронно выполнению программы и возникают при появлении аварийной ситуации в ходе исполнения некоторой инструкции. Примерами исключений являются деление на нуль, переполнение, обращение к несуществующему файлу и т.д. Обработка ошибок представляет собой важную проблему для любого языка программирования. Платформа .NET предлагает объект Exception, наследующий от класса System.Exception, обеспечивающий программистов стандартным механизмом обработки исключений. Обработчик ошибок в Visual C# использует блок Try…Catch…Finally. Слово Try переводится как «попробуй», Catch — «поймай». Этот блок должен окружать ту часть кода, где может возникнуть исключительная ситуация. В начале блока стоит оператор Try. Блок кода Catch располагается там, где мы определяем, какие типы ошибок следует искать. Блок Finally всегда исполняется и содержит подпрограммы освобождения ресурсов для исключительных ситуаций. В листинге 16 мы окружили весь код, где возможно возникновение ошибки, блоком Try…Catch. Приведенный блок содержит один оператор Catch, который перехватывает конкретную ошибку переполнения, возникающую вследствие деления на нуль. Листинг 16 namespace WindowsApplication1 { public partial class Form1 : Form

40

{ public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { int a = Convert.ToInt16(textBox1.Text); int b = Convert.ToInt16(textBox2.Text); try { //ȼɵɡɨɜ ɨɲɢɛɤɢ "Ⱦɟɥɟɧɢɟ ɧɚ ɧɭɥɶ" float c = a / b; //ɩɟɪɟɯɜɚɬ ɨɲɢɛɤɢ } catch (DivideByZeroException) { MessageBox.Show("ɉɪɨɢɡɨɲɥɚ ɨɲɢɛɤɚ ɞɟɥɟɧɢɹ ɧɚ ɧɭɥɶ "); } } } }

Предположим a = 5, b = 0. При выполнении этого кода появится сообщение, представленное на рис. 20.

Рис. 20. Сообщение об ошибке

Код, содержащийся в листинге 17, перехватит другую ошибку, связанную на этот раз с неверным форматом ввода. Поскольку обработка исключений должна начинаться непосредственно после оператора try, его мы переносим до начала ввода данных. Листинг 17 namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { try { int a = Convert.ToInt16(textBox1.Text); int b = Convert.ToInt16(textBox2.Text); float c = a / b; }

41

catch (DivideByZeroException) { MessageBox.Show("ɉɪɨɢɡɨɲɥɚ ɨɲɢɛɤɚ ɞɟɥɟɧɢɹ ɧɚ ɧɭɥɶ "); } catch (FormatException) //ɧɟɩɪɚɜɢɥɶɧɵɣ ɮɨɪɦɚɬ ɜɜɨɞɚ { MessageBox.Show("ɇɟɩɪɚɜɢɥɶɧɵɣ ɮɨɪɦɚɬ ɜɜɨɞɚ "); } } } }

Предположим a = 5e1 (а описана как целочисленная переменная), b = 1. При выполнении программы появится сообщение, представленное на рис. 21.

Рис. 21. Сообщение об ошибке

Код, содержащийся в листинге 18, перехватит ошибку, связанную с отсутствием данных в текстовых окнах textBox1 и textBox2. Листинг 18 namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { try { int a = Convert.ToInt16(textBox1.Text); int b = Convert.ToInt16(textBox2.Text); float c = a / b; } catch (DivideByZeroException) { MessageBox.Show("ɉɪɨɢɡɨɲɥɚ ɨɲɢɛɤɚ ɞɟɥɟɧɢɹ ɧɚ ɧɭɥɶ "); } catch {if ((textBox1.Text =="") || (textBox2.Text =="")) MessageBox.Show("ȼɵ ɧɟ ɜɜɟɥɢ ɞɚɧɧɵɟ"); } } } }

Итак, предположим, что текстовые поля, предназначенные для ввода, остаются незаполненными. При выполнении программы появится сообщение, представленное на рис. 22.

42

Рис. 22. Сообщение об ошибке

2.6. Обработка последовательностей данных В предыдущих параграфах мы рассмотрели методы ввода и вывода данных, используемые в языке программирования Visual C#. Решение о том, какой из способов применять на практике, принимает пользователь. Скорее всего, свое решение он будет принимать в соответствии с классом решаемой задачи. Например, в следующей задаче, где будет осуществлен ввод последовательности данных, уместно использовать функцию InputBox. Задача. Разработайте программу, с помощью которой осуществляется ввод пяти целых чисел. Найдите количество отрицательных чисел и их сумму. Результат выведите в окно сообщения. В листинге 19 представлен код процедуры. Листинг 19 namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { int s = 0; int kolotr = 0; for (int i = 1; i = -1) { double min = a1; if (a2 < min) min = a2; if (a3 < min) min = a3; double y2 = min; MessageBox.Show("Ɍɟɫɬ 1 ɜɟɬɜɢ ", "Ɂɚɝɨɥɨɜɨɤ ɨɤɧɚ", MessageBoxButtons.OK, MessageBoxIcon.Information); MessageBox.Show("y2 = " + y2.ToString("n"), "Ɂɚɝɨɥɨɜɨɤ ɨɤɧɚ", MessageBoxButtons.OK, MessageBoxIcon.Information); } else {

90

double y3 = 1; MessageBox.Show("Ɍɟɫɬ 3 ɜɟɬɜɢ ", "Ɂɚɝɨɥɨɜɨɤ ɨɤɧɚ", MessageBoxButtons.OK, MessageBoxIcon.Information); MessageBox.Show("y3 = " + y3.ToString("n"), "Ɂɚɝɨɥɨɜɨɤ ɨɤɧɚ", MessageBoxButtons.OK, MessageBoxIcon.Information); } Application.Exit(); } } }

Начало a1, a2, a3, b1, b2, c1, c2, x Нет Нет

x

x

min = c1

Да

–1

y3 = 1

Да

1

Нет

min = a1

c2 < min

Да min = c2

Нет

a2 < min

Да min = b1

min = a2

Нет

a3 < min

Вывод y3

Да

Нет

b2 > max

min = b2

min = a3

y2 = max

Да

Нет

min > max

Да max = min

Вывод y2

y1 = max Вывод y1

Конец Рис. 71. Алгоритм решения задачи

4.6. Упражнения к главе Вопрос 1. Каким будет значение переменной s после выполнения фрагмента программы? private void button1_Click(object sender, EventArgs e) { double n = 2.5;

91

double f = 0.5; bool d = true; int s = 0; if (n < f) s = 12; if (f >= n) s = 28; if (d) s = 39; MessageBox.Show("Ɉɬɜɟɬ =" + s.ToString("n")); }

Ответ. В этом упражнении значение переменной s равно 39. Рассуждать надо следующим образом. Первые два логических выражения ложны, поэтому проверяется третье логическое выражение, в ячейке d хранится значение true (истина), поэтому выполняется оператор s = 39. Вопрос 2. Каким будет значение переменной j после выполнения фрагмента программы? private void button1_Click(object sender, EventArgs e) { int w = 3; int p = 5; double j = 3.5; if (j < p && j > w) { j = j + 0.5 ; j = j + 10 ; } else j = 11 ; MessageBox.Show("Ɉɬɜɟɬ = " + j.ToString("n")); }

Ответ. Рассуждать нужно следующим образом. Подставив значения переменных w, p, j и проверив логическое выражение, получаем, что его значение есть true (истина). Следовательно, выполняется оператор j = j + 0.5, а затем оператор j = j + 10. Ответ в примере: значение переменной j = 14. Вопрос 3. Каким будет значение переменной j после выполнения фрагмента программы? private void button1_Click(object sender, EventArgs e) { int j = 3; int k = 15; int m = 20; if (j k) { j = k % 2 ; j = j % 3 ; } else j = 10 ; } MessageBox.Show("Ɉɬɜɟɬ = " + j.ToString("n")); }

92

Ответ. Подставив значения переменных k, m, j и проверив оба логических выражения, получаем, что их значения есть true (истина). Следовательно, выполняется оператор j = k % 2, а затем j = j % 3. Ответ в упражнении: значение переменной j равно 1. Вопрос 4. Каким будет значение переменной j после выполнения фрагмента программы? private void button1_Click(object sender, EventArgs e) { int j = 6; int k = 6; if (j > k) { j = j + 2; j = j + 3; } else { j = k - 3; j = j + 4; } MessageBox.Show("Ɉɬɜɟɬ = " + j.ToString("n")); }

Ответ. Подставив значения переменных k и j, проверив логическое выражение, получаем, что его значение есть false (ложь). Следовательно, выполняются операторы j = k - 3 и j = j + 4. Ответ в упражнении: значение переменной j = 7. Вопрос 5. Каким будет значение переменной j после выполнения фрагмента программы? private void button1_Click(object sender, EventArgs e) { int w = 3; int p = 5; double j = 3.5; if ((j < p) && (j > w)) { j = j + 0.5 ; j = j + 12 ; } else j = 11 ; MessageBox.Show("Ɉɬɜɟɬ = " + j.ToString("n")); }

Ответ. Подставив значения переменных, получим, что два простых условия j < p и j > w оказываются истинными, следовательно, и все логическое выражение имеет значение true. Следовательно, выполняется оператор j = j + 0.5, а затем j = j + 12. После их выполнения в ячейке j будет число 16. Вопрос 6. Каким будет значение переменной j после выполнения условного оператора? private void button1_Click(object sender, EventArgs e) { int j = 7; int k = 7; int f = 10; if (j >= k)

93

{ if (f { k j } else j j

y) f = (int) 2.9 ; MessageBox.Show("Ɉɬɜɟɬ = " + f.ToString("n")); }

Ответ. Проверив первое логическое выражение, получим, что результат ложь — в ячейке d хранится значение false. Поэтому оператор f = x % 2 не выполняется. Для того чтобы определить, истинно или ложно второе логическое выражение, надо знать, что число 5Е1 записано в форме с плавающей точкой и равно 50. Следовательно, второе логическое выражение ложно, и оператор f = x не выполняется. Проверив третье логическое выражение, убеждаемся в том, что оно истинно, так как 55 > 50. В операторе f = (int) 2.9 используется явное преобразование типов. Таким образом, после выполнения условного оператора в ячейке f будет 2. Вопрос 8. Какое количество ошибок в следующем фрагменте программы? private void button1_Click(object sender, EventArgs e) { int x, a ; bool s ; x = 0.5 ; s = 0.4 ; a = true ; if x < 5 s = 5 MessageBox.Show("Ɉɬɜɟɬ = " + s.ToString("n")); }

94

Ответ. 1-я ошибка допущена в операторе x = 0.5. Переменная x описана как целочисленная переменная, а справа от оператора присваивания находится дробное число 0.5, что недопустимо. 2-я ошибка в операторе s = 0.4; Переменная s описана как логическая, а логические переменные могут принимать только два значения: истина или ложь. 3-я ошибка допущена в операторе s = 5; Переменная s описана как логическая, число 5 — целое число. 4-я ошибка: логическое выражение x k) j = k - 3; else { k = k - 3; j = k - 3; } MessageBox.Show("Ɉɬɜɟɬ = " + j.ToString("n")); }

Ответ. Проверив логическое выражение, убеждаемся в том, что оно ложно. Следовательно, выполняются операторы в ветви else. После выполнения оператора k = k — 3 в ячейке к оказывается значение 7, а после выполнения оператора j = k — 3 в ячейке j находится число 4. Ответ в упражнении: j=4.

4.7. Примеры решения задач Задача 1. Вычислите значение функции y: Sin x ,

если x >= 1

Cos x ,

если x < 1

y= Разработка алгоритма решения задачи представлена на рис. 72. В листинге 53 приведен код процедуры, отвечающий за решение задачи. Листинг 53 namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { double x = Convert.ToDouble(textBox1.Text); double y;

95

if (x >= 1) y = Math.Sin(x); else y = Math.Cos(x); textBox2.Text = y.ToString("e"); } } }

Начало x Нет

x>=1

y = Cos (x)

Да y = Sin (x)

Вывод y Конец Рис. 72. Алгоритм решения задачи

Задача 2. Вычислите значение функции y: Sin x ,

y=

если x1

Разработка алгоритма решения задачи представлена на рис. 73. В листинге 54 приведен код процедуры, отвечающий за решение задачи. Листинг 54 namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { double x = Convert.ToDouble(textBox1.Text); double y; if (x < 0) y = Math.Sin(x);

96

else if (x > 1) y = Math.Tan(x); else y = Math.Cos(x) ; textBox2.Text = y.ToString("e"); } } }

Начало x Нет Нет y = Cos (x)

x>1

x c) последовательность или не образуют ни одной. 8. Разработайте алгоритм и программу решения следующей задачи: найти минимальное из трех чисел. 9. Разработайте алгоритм и программу решения следующей задачи: вычислить значение функции y:

y

­° ® °¯

0,

если x  0

x,

если R d x d 1

1,

если x ! 1

10.Разработайте алгоритм и программу решения следующей задачи: пользователь вводит два числа; меньшее из введенных чисел заменяется числом 0, а в случае их равенства — числом 100.

98

5. ОПЕРАТОР ВЫБОРА SWITCH Оператор выбора switch позволяет выбрать одно из нескольких возможных продолжений программы. Структура оператора выбора switch гораздо лучше воспринимается, чем эквивалентные ей структуры условных операторов, рассмотренные выше. Она также гораздо более эффективна в случае трех и более возможных ветвлений в программе (конструкция многозначных ветвлений). Тем не менее, если вам необходимо выполнить несколько операций сравнения, если у вас в программе используется небольшое количество переменных, тогда, вероятно, удобнее использовать ранее изученные условные операторы. Общий вид оператора switch в алгоритме можно представить следующим образом (рис. 74). Здесь приведены следующие обозначения: М1, М2, Мn — метки, P1,P2,Pn –операторы.

case M1

case M2 Р1

case Mn Р2

Рn

Рис. 74. Общий вид оператора switch

В общем виде синтаксис оператора switch записывается следующим образом: switch (Ключ выбора) { case Метка М1 : Оператор Р1 ; case Метка M2 : Оператор Р2 ; . . case Метка Мn : Оператор Рn ; [default : Оператор] } Таким образом, можно говорить о том, что оператор switch передает управление тому оператору Р1, Р2, … Рn, с одной из меток которого совпало значение переключателя (ключа выбора). Следует обратить внимание на то, что ключ выбора может быть не только числовым значением, но и строковым. В листинге 55 приведен пример, с помощью которого можно проанализировать возраст человека от 6 до 60 лет и выдать соответствующее сообщение. Если человеку больше 60 лет, то выдается сообщение «Вы на заслуженном отдыхе». Для этого служит оператор default, который предназначен для анализа непредусмотренных вариантов выбора. Оператор break осуществляет передачу управления в точку программы, находящуюся непосредственно за ним. 99

Листинг 55 namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string con; Console.Write("ȼɜɟɞɢɬɟ ɜɨɡɪɚɫɬ ɱɟɥɨɜɟɤɚ "); con = Console.ReadLine(); int vozrast= Convert.ToInt16(con); if((vozrast>=6) && (vozrast=17) && (vozrast=22) && (vozrast=6) && (vozrast=17) && (vozrast=22) && (vozrast= 3) && (k 13); textBox1.Text = y.ToString("n"); }

Ответ. При первом прохождении цикла в ячейке а оказывается число 7, а в ячейке y число 11. Проверяется логическое выражение y>13 (11>13). В цикле с оператором do…while выход из цикла происходит тогда, когда логическое выражение имеет значение false (ложь), следовательно, в данном примере происходит выход из цикла. Правильный ответ: в ячейке y находится число 11. Вопрос 2. Определите, какое значение находится в ячейке t после выполнения фрагмента программы? private void button1_Click(object sender, EventArgs e) { int f = 5; int t = 5; do { f = f - 1 ; t = t + 1 ; } while (t 0) //ɉɪɨɜɟɪɤɚ: ɩɨɥɨɠɢɬɟɥɶɧɨ ɥɢ ɜɜɟɞɟɧɧɨɟ ɱɢɫɥɨ? pol = pol + chislo; //ɍɜɟɥɢɱɟɧɢɟ ɡɧɚɱɟɧɢɹ ɹɱɟɣɤɢ ɧɚ ɜɟɥɢɱɢɧɭ ɱɢɫɥɚ ɜ ɫɥɭɱɚɟ ɢɫɬɢɧɧɨɫɬɢ ɩɪɨɜɟɪɹɟɦɨɝɨ ɭɫɥɨɜɢɹ else otr = otr + chislo; //ɍɜɟɥɢɱɟɧɢɟ ɡɧɚɱɟɧɢɹ ɹɱɟɣɤɢ ɧɚ ɜɟɥɢɱɢɧɭ ɱɢɫɥɚ ɜ ɫɥɭɱɚɟ, ɟɫɥɢ ɩɪɨɜɟɪɹɟɦɨɟ ɭɫɥɨɜɢɟ ɥɨɠɧɨ } pol = pol - 5; //ɂɡ ɤɨɧɟɱɧɨɣ ɫɭɦɦɵ ɩɨɥɨɠɢɬɟɥɶɧɵɯ ɱɢɫɟɥ ɨɬɧɢɦɚɟɦ 5 ɞɥɹ ɬɨɝɨ, ɱɬɨɛɵ ɧɟ ɢɫɤɚɡɢɥɫɹ ɪɟɡɭɥɶɬɚɬ MessageBox.Show("ɋɭɦɦɚ ɩɨɥɨɠɢɬɟɥɶɧɵɯ ɱɢɫɟɥ = " + pol.ToString("n"), "Ɂɚɝɨɥɨɜɨɤ ɨɤɧɚ", MessageBoxButtons.OK, MessageBoxIcon.Information); MessageBox.Show("ɋɭɦɦɚ ɨɬɪɢɰɚɬɟɥɶɧɵɯ ɱɢɫɟɥ = " + otr.ToString("n"), "Ɂɚɝɨɥɨɜɨɤ ɨɤɧɚ", MessageBoxButtons.OK, MessageBoxIcon.Information); Application.Exit(); } } }

Начало pol = 0 otr = 0 Нет

chislo! = 5 Нет

Да chislo Да

chislo > 0

otr = otr + chislo

pol = pol + chislo

pol = pol – 5 вывод pol, otr Конец Рис. 102. Алгоритм решения задачи

Задача 4. Вводится последовательность целых чисел, не равных нулю. Известно, что последний элемент последовательности равен 0. Найдите среднее арифметическое этих чисел. Разработка алгоритма решения задачи представлена на рис. 103. 152

Начало chislo pol = 0 otr = 0 Нет

chislo! = 5

Да kol = kol + 1 sum = sum + chislo chislo

srarifm = sum/kol вывод srarifm Конец Рис. 103. Алгоритм решения задачи

В листинге 82 приведен код процедуры, отвечающий за решение задачи. Листинг 82 namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { int kolotr = 0 ; int sum = 0; double srarifm = 0; string chislo_; chislo_ = Microsoft.VisualBasic.Interaction.InputBox("ȼɜɟɞɢɬɟ ɱɢɫɥɨ", "Ɉɤɧɨ ɜɜɨɞɚ ɞɚɧɧɵɯ", " ", -1, -1); int chislo = Convert.ToInt16(chislo_); while (chislo != 0) { if (chislo < 0) //ɉɪɨɜɟɪɤɚ: ɨɬɪɢɰɚɬɟɥɶɧɨ ɥɢ ɜɜɟɞɟɧɧɨɟ ɱɢɫɥɨ ɢɥɢ ɧɟɬ? { kolotr = kolotr + 1; //ɋɱɟɬɱɢɤ ɭɜɟɥɢɱɢɜɚɟɬɫɹ ɧɚ 1 sum = sum + chislo; //ɍɜɟɥɢɱɟɧɢɟ ɡɧɚɱɟɧɢɹ ɹɱɟɣɤɢ ɧɚ ɜɟɥɢɱɢɧɭ ɱɢɫɥɚ } //ȼɜɨɞ ɨɱɟɪɟɞɧɨɝɨ ɱɢɫɥɚ

153

chislo_ = Microsoft.VisualBasic.Interaction.InputBox("ȼɜɟɞɢɬɟ ɱɢɫɥɨ", "Ɉɤɧɨ ɜɜɨɞɚ ɞɚɧɧɵɯ", "", -1, -1); chislo = Convert.ToInt16(chislo_); } try { //ȼɵɡɨɜ ɨɲɢɛɤɢ "Ⱦɟɥɟɧɢɟ ɧɚ ɧɨɥɶ" srarifm = sum / kolotr; //ɩɟɪɟɯɜɚɬ ɨɲɢɛɤɢ } catch (DivideByZeroException) { MessageBox.Show("ɉɪɨɢɡɨɲɥɚ ɨɲɢɛɤɚ ɞɟɥɟɧɢɹ ɧɚ ɧɨɥɶ "); } MessageBox.Show("Ʉɨɥɢɱɟɫɬɜɨ ɨɬɪɢɰɚɬɟɥɶɧɵɯ ɱɢɫɟɥ = " + kolotr.ToString("n"), "Ɂɚɝɨɥɨɜɨɤ ɨɤɧɚ", MessageBoxButtons.OK, MessageBoxIcon.Information); MessageBox.Show("ɋɪɟɞɧɟɟ ɚɪɢɮɦɟɬɢɱɟɫɤɨɟ ɱɢɫɟɥ = " + srarifm.ToString("n"), "Ɂɚɝɨɥɨɜɨɤ ɨɤɧɚ", MessageBoxButtons.OK, MessageBoxIcon.Information); Application.Exit(); } }

Задача 5. Вводится последовательность целых чисел, не равных 0. Известно, что последний элемент последовательности равен 0. Найдите количество отрицательных чисел и их среднее арифметическое. Разработка алгоритма решения задачи представлена на рис. 104. Начало Да pol = 0 otr = 0 Нет

chislo! = 0 Нет

Да Да

chislo < 0

kolotr = kolotr + 1 sum = sum + chislo chislo

srarifm= sum/kolotr вывод kolotr, srarimf Конец Рис. 104. Алгоритм решения задачи

154

В листинге 83 приведен код процедуры, отвечающий за решение задачи. Листинг 83 namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { int kolotr = 0 ; int sum = 0; double srarifm = 0; string chislo_; chislo_ = Microsoft.VisualBasic.Interaction.InputBox("ȼɜɟɞɢɬɟ ɱɢɫɥɨ", "Ɉɤɧɨ ɜɜɨɞɚ ɞɚɧɧɵɯ", " ", -1, -1); int chislo = Convert.ToInt16(chislo_); while (chislo != 0) { if (chislo < 0) //ɉɪɨɜɟɪɤɚ: ɨɬɪɢɰɚɬɟɥɶɧɨ ɥɢ ɜɜɟɞɟɧɧɨɟ ɱɢɫɥɨ ɢɥɢ ɧɟɬ? { kolotr = kolotr + 1; //ɋɱɟɬɱɢɤ ɭɜɟɥɢɱɢɜɚɟɬɫɹ ɧɚ 1 sum = sum + chislo; //ɍɜɟɥɢɱɟɧɢɟ ɡɧɚɱɟɧɢɹ ɹɱɟɣɤɢ ɧɚ ɜɟɥɢɱɢɧɭ ɱɢɫɥɚ } //ȼɜɨɞ ɨɱɟɪɟɞɧɨɝɨ ɱɢɫɥɚ chislo_ = Microsoft.VisualBasic.Interaction.InputBox("ȼɜɟɞɢɬɟ ɱɢɫɥɨ", "Ɉɤɧɨ ɜɜɨɞɚ ɞɚɧɧɵɯ", "", -1, -1); chislo = Convert.ToInt16(chislo_); } try { //ȼɵɡɨɜ ɨɲɢɛɤɢ "Ⱦɟɥɟɧɢɟ ɧɚ ɧɨɥɶ" srarifm = sum / kolotr; //ɩɟɪɟɯɜɚɬ ɨɲɢɛɤɢ } catch (DivideByZeroException) { MessageBox.Show("ɉɪɨɢɡɨɲɥɚ ɨɲɢɛɤɚ ɞɟɥɟɧɢɹ ɧɚ ɧɨɥɶ "); } MessageBox.Show("Ʉɨɥɢɱɟɫɬɜɨ ɨɬɪɢɰɚɬɟɥɶɧɵɯ ɱɢɫɟɥ = " + kolotr.ToString("n"), "Ɂɚɝɨɥɨɜɨɤ ɨɤɧɚ", MessageBoxButtons.OK, MessageBoxIcon.Information); MessageBox.Show("ɋɪɟɞɧɟɟ ɚɪɢɮɦɟɬɢɱɟɫɤɨɟ ɱɢɫɟɥ = " + srarifm.ToString("n"), "Ɂɚɝɨɥɨɜɨɤ ɨɤɧɚ", MessageBoxButtons.OK, MessageBoxIcon.Information); Application.Exit(); } } }

155

Контрольные вопросы к параграфу 1. Расскажите, в каких случаях применяются циклы с неизвестным числом повторений. 2. Нарисуйте общий вид в алгоритме оператора цикла while. 3. Напишите синтаксис оператора цикла while. 4. Расскажите о работе оператора цикла while. Приведите примеры. 5. В чем отличие организации регулярных и итеративных циклов? 6. Проведите сравнение известных вам итеративных циклов с точки зрения их организации и работы.

Задачи для самостоятельного решения 1. Разработайте алгоритм и программу решения следующей задачи: найдите максимальное значение функции y=Cosx/Sinx на отрезке [a,b] с шагом h. 2. Вводится последовательность вещественных чисел. Известно, что последний элемент последовательности равен 5. Найдите количество положительных чисел и минимальное из них. Разработайте алгоритм и программу. 3. Вводится последовательность целых чисел. Известно, что последний элемент последовательности равен 1. Определите, каких среди них больше: положительных или отрицательных. Разработайте алгоритм и программу. 4. Вводится последовательность вещественных чисел, не равных нулю. Известно, что последний элемент последовательности равен 0. В программе должна вычисляться сумма всех положительных и сумма всех отрицательных чисел. Разработайте алгоритм и программу. 5. Вводится последовательность целых чисел. Определите сумму положительных чисел до первого отрицательного числа. Разработайте алгоритм и программу. 6. Вычислите сумму не равных нулю чисел и выведите эту сумму в качестве ответа. Разработайте алгоритм и программу. 7. В программе определяется количество чисел, сумма которых меньше заданного числа. Разработайте алгоритм и программу. 8. Известен начальный вклад клиента в банк и процент годового дохода. Определите срок, через который вклад превысит 1 млн рублей, и величину этого вклада. Разработайте алгоритм и программу. 9. Вычислите сумму четных чисел на отрезке от 10 до 30. Разработайте алгоритм и программу. 10. Определите идеальный вес для взрослых людей по формуле: идеальный вес = = рост — 100. Выход из цикла: значение роста = 250. Разработайте алгоритм и программу.

156

7. РАБОТА С ОДНОМЕРНЫМИ МАССИВАМИ Массивы — это формальное объединение нескольких однотипных объектов (чисел, символов, строк и т.п.), рассматриваемое как единое целое. К необходимости применения массивов мы приходим всякий раз, когда требуется связать и использовать целый ряд родственных величин. Например, результаты многократных замеров температуры воздуха в течение года удобно рассматривать как совокупность вещественных чисел, объединенных в один сложный объект — массив измерений. Чаще всего пользователь работает с одномерными и двумерными массивами. При создании массива Visual C# выделяет под него место в памяти. Элементы массива из десяти составляющих нумеруются числами от 0 до 9, а не от 1 до 10, поскольку для первого элемента массива используется индекс 0. Синтаксис объявления одномерных массивов следующий: Тип_данных [ ] Имя_массива = new Тип_данных [Общее_число_элементов_ массива] ; Например, объявляется массив без указания его размерности: int[] a;

Однако перед тем как использовать, необходимо определить размер массива и выделить для него память, используя ключевое слово new. Чтобы выделить память для массива a после того, как он был объявлен, используется оператор: a = new int[10];

Границами нашего массива являются 0 и 9, т.е. для доступа к элементам этого массива не может использоваться индекс вне этих границ. Если элементы массива заранее известны, то, используя фигурные скобки (список инициализаторов), можно объявить одномерный массив следующим образом: int[] a = new int[] { 1, 2, 3, 4, 5 };

Возможно объявление массива и другими способами: int[] b = { 1, 2, 3, 4, 5 }; int[] a = new int[5] { 1, 2, 3, 4, 5 };

Доступ к каждому элементу массива в программе осуществляется с помощью индекса — целого числа, служащего своеобразным именем элемента в массиве. При упоминании в программе любого элемента массива сразу за именем массива должен следовать индекс элемента в квадратных скобках, например: b [17] = 2010 ; a [9] = 5 ; Все операции по обработке, вводу-выводу элементов массива осуществляются поэлементно в цикле с оператором цикла for. Пример. В одномерном массиве заданных целых чисел найдите сумму элементов массива. Ввод элементов осуществите вручную. Разработка алгоритма решения задачи представлена на рис. 105. В листинге 84 приведен код процедуры, отвечающий за решение задачи, а на рисунке 106 показан результат ее выполнения. Листинг 84 namespace ConsoleApplication1

157

{ class Program { static void Main(string[] args) { int[] a; a = new int[10]; int sum = 0; string[] con; con = new string[10]; for (int i = 0; i 5 x=n

x d 0 x > 2,55 x=7

0d xd5 x ! 2S x=b

­ 3 x 4  3 x 3  5 ,111 ˜ 10 15 ° cos 2 x ° ® 2 5 ° x  4 x  tgx ° ln x  cos 2 x  e 3 x ˜ x ¯

x1 x=n

­ x 2  2 x 3 z  3, 222  2 ,5 5 ° 3 3 ® sin S x  tgx °4 5 3x ¯ x  cos 9 x  e

­ x 15  ctgx 2  2 sin x ° 15 ˜ 3 10 ° ° 2 16 3 3 ®tg x  5, 45 ˜ 10  54 x ° 3 ° ctgb  tg s  ln x ° ¯ 2 ­ 3 ° tgx  1, 222 ˜ 5 ˜ cos x ˜ 5! °° 2 ® x ˜ tgx  ctgx ° 2x  2 x  ln x 2  3 ,1 ˜ 10 ° cos °¯

0 d x d 3 x > 15 x = 2,33

x d 0 x>5 x = 15

0 d x d 5

x S

15

x=d

35

36

Z

­ 5 , 334 ˜ 10 15   2 x ˜ cos x ° ln x 2 x ° ® 5 5 ° tgx  sin x  3 ,111 ° 3 3 ¯ x  sin x

Q

­ 6 x ˜ 3 x 5  tg 2 x 3  D 3 °° 5 ® ln x  2 , 4 ˜ 10  2 cos 2 x ° e 3 x  5! 9 x ˜ d  ctg 3 x °¯

x3 x=q

0 d x d 10 x > 20 x=p

Лабораторная работа №3 «Использование элементов управления RadioButton, ListBox, Timer, GroupBox в программах. Использование обработчика событий для нескольких компонентов» Цель работы: овладение практическими навыками разработки и программирования вычислительного процесса, связанного с использованием элементов управления RadioButton, ListBox, Timer, GroupBox, получение дальнейших навыков по отладке и тестированию программ, выработка при решении поставленных задач таких профессионально значимых качеств, как самостоятельность, ответственность, точность, творческая инициатива. Пример выполнения работы Условие: разработайте проект, содержащий несколько форм. Первая форма является заставкой к приложению. На второй форме следует разместить элементы управления, с помощью которых возможно осуществить ввод двух чисел, выбор одной из операций, например: сложение, вычитание, умножение, деление, возведение в степень, остаток от деления с помощью элемента управления OptionButton. Осуществите переход к следующей форме с задержкой во времени (предположим, в течение 5 сек.), используя элемент управления Timer. Кроме того, с помощью элемента управления ListBox осуществите вывод на форму перевод выбранной операции на английский язык. Создайте иконку с собственными инициалами, предусмотрите запрос на выход из программы и скомпилируйте .exe файл. Внешний вид главной формы представлен на рис. 181.

Рис. 181. Внешний вид главной формы 289

Внешний вид формы с элементами управления OptionButton и ListBox представлен на рис. 182.

Рис. 182. Внешний вид формы с элементами управления OptionButton и ListBox

Внешний вид третьей формы представлен на рис. 183.

Рис. 183. Дополнительная программа-переводчик

На главной форме приложения расположены следующие элементы управления: TextBox, Label (в один из которых выводится название выбранной операции), Button, Timer, GroupBox. Для того чтобы нажатие на любую кнопку с обозначением операции приводило к отображению этой операции в метке label3, следует создать следующую процедуру (листинг 177) для кнопки button1: Листинг 177 private void button1_Click(object sender, EventArgs e) { label3.Text = (sender as Button).Text ; }

Затем связываем уже имеющийся обработчик button1_Click с событием Click для кнопок button2, button3, button4, button5, button6. На вкладке Events для каждой из этих кнопок следует выбрать событие Click, а затем имя обработчика button1_Click из выпадающего списка. Таким образом, для всех шести кнопок создается один общий обработчик. Это возможно благодаря использованию в методе-обработчике button1_Click параметра sender, в котором передается компонент, вызвавший данный обработчик. В листинге 178 приведен полный код всех процедур для главной формы разрабатываемого приложения.

290

Листинг 178 namespace WindowsApplication1 { public partial class Form1 : Form { DateTime sec; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { label3.Text = (sender as Button).Text ; } private void button7_Click(object sender, EventArgs e) { double chislo1,chislo2; string s = label3.Text; //Ɉɬɨɛɪɚɠɚɟɦ ɧɚɡɜɚɧɢɟ ɜɵɛɪɚɧɧɨɣ ɨɩɟɪɚɰɢɢ double rez = 0; //Ɉɫɭɳɟɫɬɜɥɹɟɦ ɜɜɨɞ ɞɚɧɧɵɯ chislo1 = Convert.ToDouble(textBox1.Text); chislo2 = Convert.ToDouble(textBox2.Text); switch (s[0]) //ɇɚɡɜɚɧɢɟ ɜɵɛɪɚɧɧɨɣ ɨɩɟɪɚɰɢɢ ɢɝɪɚɟɬ ɪɨɥɶ ɤɥɸɱɚ ɜɵɛɨɪɚ { case '+': rez = chislo1 + chislo2; break; case '-' : rez = chislo1 - chislo2; break; case '*' : rez = chislo1 * chislo2; break; case '/' : rez = chislo1 / chislo2; break; case 'P' : rez = Math.Pow(chislo1, chislo2); break; case '%' : rez = chislo1 % chislo2; break; } label4.Text = "=" + rez.ToString() ; //ȼɵɜɨɞɢɦ ɪɟɡɭɥɶɬɚɬ timer1.Enabled = true; //ȼɤɥɸɱɚɟɦ ɬɚɣɦɟɪ ɢ timer1.Interval = 1000; //ɭɫɬɚɧɚɜɥɢɜɚɟɦ ɢɧɬɟɪɜɚɥ ɪɚɜɧɵɦ 1 ɫɟɤɭɧɞɟ } private void timer1_Tick(object sender, EventArgs e) { sec = sec.AddSeconds(1); //ɭɜɟɥɢɱɢɜɚɟɦ ɜɪɟɦɹ if (sec.Second >5) //ȿɫɥɢ ɡɚɞɟɪɠɤɚ ɩɪɟɜɵɫɢɥɚ ɞɨɩɭɫɬɢɦɨɟ ɜɪɟɦɹ { this.timer1.Stop(); //ɬɨ ɨɫɬɚɧɚɜɥɢɜɚɟɦ ɬɚɣɦɟɪ Form2 f = new Form2(); // ɢ ɨɫɭɳɟɫɬɜɥɹɟɦ ɩɟɪɟɯɨɞ ɧɚ ɫɥɟɞɭɸɳɭɸ ɮɨɪɦɭ 291

this.Hide(); f.ShowDialog(); } } } }

Перечислим недостатки созданного проекта: ошибка деления на нуль в случае ввода соответствующих данных, сообщение встроенного отладчика появится и тогда, когда пользователь оставит окна для ввода данных незаполненными, есть и ряд других. В подобных случаях студенты дорабатывают код программ самостоятельно на основе ранее изученного материала. На следующей форме разрабатываемого приложения мы должны вывести список операций на элемент управления listBox1, осуществить ввод данных в текстовые окна textBox1 и textBox2 и выбрать нужную операцию с помощью элементов управления OptionButton. В листингах 179, 180, 181 приведены процедуры, отвечающие за решение задачи. Листинг 179 namespace WindowsApplication1 { public partial class Form2 : Form { string def1; public Form2() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { double a, b; double c=0; a = Convert.ToDouble(textBox1.Text); b = Convert.ToDouble(textBox2.Text); if (radioButton1.Checked == true) { MessageBox.Show("ȼɵ ɜɵɛɪɚɥɢ ɨɩɟɪɚɰɢɸ ɫɥɨɠɟɧɢɹ"); c = a + b; } if (radioButton2.Checked == true) { MessageBox.Show("ȼɵ ɜɵɛɪɚɥɢ ɨɩɟɪɚɰɢɸ ɜɵɱɢɬɚɧɢɹ"); c = a - b; } if (radioButton3.Checked == true) { MessageBox.Show("ȼɵ ɜɵɛɪɚɥɢ ɨɩɟɪɚɰɢɸ ɭɦɧɨɠɟɧɢɹ"); c = a * b; } if (radioButton4.Checked == true) { MessageBox.Show("ȼɵ ɜɵɛɪɚɥɢ ɨɩɟɪɚɰɢɸ ɞɟɥɟɧɢɹ"); c = a / b; 292

} if (radioButton5.Checked == true) { MessageBox.Show("ȼɵ ɜɵɛɪɚɥɢ ɨɩɟɪɚɰɢɸ ɜɨɡɜɟɞɟɧɢɹ ɜ ɫɬɟɩɟɧɶ"); c=Math.Pow(a, b); } if (radioButton6.Checked == true) { MessageBox.Show("ȼɵ ɜɵɛɪɚɥɢ ɨɩɟɪɚɰɢɸ ɜɵɱɢɫɥɟɧɢɹ ɨɫɬɚɬɤɚ ɨɬ ɞɟɥɟɧɢɹ"); c = a % b; } textBox3.Text = c.ToString(); } private void Form2_Load(object sender, EventArgs e) { listBox1.Items.Add("ɋɥɨɠɟɧɢɟ"); listBox1.Items.Add("ȼɵɱɢɬɚɧɢɟ"); listBox1.Items.Add("ɍɦɧɨɠɟɧɢɟ"); listBox1.Items.Add("Ⱦɟɥɟɧɢɟ"); listBox1.Items.Add("ȼɨɡɜɟɞɟɧɢɟ ɜ ɫɬɟɩɟɧɶ"); listBox1.Items.Add("Ɉɫɬɚɬɨɤ ɨɬ ɞɟɥɟɧɢɹ"); } private void listBox1_DoubleClick(object sender, EventArgs e) { switch (listBox1.SelectedIndex) { case 0: def1 = "Adding"; break; case 1: def1 = "Substruction"; break; case 2: def1 = "Multiplication"; break; case 3: def1 = "Partion"; break; case 4: def1 = "Involution"; break; case 5: def1 = "Remainder "; break; } Class1.def = def1; Form3 f = new Form3(); //ɉɟɪɟɯɨɞ ɧɚ ɮɨɪɦɭ-ɩɟɪɟɜɨɞɱɢɤ this.Hide(); f.ShowDialog(); } } } Листинг 180 namespace WindowsApplication1 { class Class1 { public static string def; } } Листинг 181 namespace WindowsApplication1 { 293

public partial class Form3 : Form { public Form3() { InitializeComponent(); } private void Form3_Load(object sender, EventArgs e) { label1.Text = Class1.def; //отображаем в текстовом окне формы название операции, переведенное на английский язык } private void button1_Click(object sender, EventArgs e) { Application.Exit(); } } }

Задания для самостоятельной подготовки Изучить: - работу условного оператора, оператора выбора switch; - назначение элементов управления RadioButton, ListBox, Timer, GroupBox и их основные свойства; - организацию вывода данных с помощью функции MessageBox. Разработать: - интерфейс программы; - программу решения задачи; - тестовый вариант исходных данных. Работа в лаборатории Для успешного получения зачета по лабораторной работе необходимо выполнить следующие требования: 1. Получить допуск к лабораторной работе при предъявлении преподавателю отчета по текущей лабораторной работе. 2. Проект должен иметь заставку, в которой указываются: название учебного заведения; название кафедры; название лабораторной работы; цель лабораторной работы; условие задачи. 3. Заставка к проекту выполняется студентами 1-й подгруппы с использованием программного кода, который реализует вывод текста на графическую поверхность и выравнивание его по центру (см. Приложение 2, заставка №3), студентами 2-й подгруппы с использованием программного кода, который реализует вывод векторного изображения (см. Приложение 2, заставка №16). 4. Главную форму разрабатываемого приложения студенты 1-й и 2-й подгрупп программируют с использованием обычной формы. Форма-переводчик имеет уменьшенные размеры (прямоугольник). 294

5. Обе подгруппы при окончательной компоновке проекта создают и демонстрируют преподавателю .exe файл приложения. 6. Студент должен уметь ответить на контрольные вопросы по лабораторной работе, т.е. проявить свои знания по теоретической части курса. 7. Студент должен продемонстрировать свои навыки и умения при работе на персональном компьютере в среде программирования Microsoft Visual Studio, набрав и отладив программу своего варианта. 8. Студент обязан соблюдать правила по технике безопасности при работе с вычислительной техникой. Содержание отчета

1. 2. 3. 4. 5. 6.

Название лабораторной работы. Фамилия, имя студента, номер группы. Цель лабораторной работы. Условие задачи. Листинг программы. Результаты выполнения программы.

Контрольные вопросы

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

Лабораторная работа №4 «Программирование алгоритмов разветвляющихся структур с использованием поиска максимального и минимального значений» Цель работы: овладение практическими навыками разработки и программирования вычислительного процесса, связанного с проверкой нескольких условий, уяснение различных способов нахождения минимального и максимального значений в программах, получение дальнейших навыков по отладке и тестированию программ, выработка при решении поставленных задач таких профессионально значимых качеств, как самостоятельность, ответственность, точность, творческая инициатива. Пример выполнения работы Условие: разработайте проект, содержащий несколько форм. Первая форма является заставкой к приложению. На второй форме реализуйте решение задачи своего варианта. Задача. Вычислите значение функции r=f (x,y,z), если:

если y  x ­ min x 2 , sin y , cos z , ° x y 2 r ® max e , Ln z , если x d y d z °¯ x  y  z , в противном случае

295

В разработанном проекте используйте проверку корректности ввода данных и элемент управления ErrorProvider. Предусмотрите запрос на выход из программы. Создайте иконку с собственными инициалами и скомпилируйте .exe файл. Разработка алгоритма решения задачи представлена на рис. 184. Начало x, y, z Нет Нет

yd z

r=x+y+z

Да

y r2

r = x*y Да

Нет

r1 < r

Да r = r1

r = r1 Нет

r2 < r

Да r = r2

вывод r Конец Рис. 184. Алгоритм решения задачи

В листинге 182 приведен код процедуры, отвечающий за решение задачи. Листинг 182 namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { double r1, r2, r; double x = Convert.ToDouble(textBox1.Text); double y = Convert.ToDouble(textBox2.Text); double z = Convert.ToDouble(textBox3.Text); if (y < x) { r1 = Math.Sin(y); 296

r2 = Math.Cos(z); r = x * x; if (r1 < r) r = r1; if (r2 < r) r = r2; } else if (y r2) r = r1; else r = r2 ; } else r = x + y + z ; textBox4.Text = r.ToString("n") ; } } }

Задания для самостоятельной подготовки Изучить: - возможности языка программирования для реализации многозначных ветвлений; - запись конструкции многозначных ветвлений в блок-схемах; - запись многозначных ветвлений в программах; - алгоритмы поиска минимального и максимального значений; - работу условного оператора if при проверке нескольких условий. Разработать: - алгоритм решения поставленной задачи в соответствии с вариантом; - интерфейс программы; - программу решения задачи; - тестовые варианты (число тестов равно числу ветвей вычислительного процесса) для проверки правильности функционирования программы. Работа в лаборатории Для успешного получения зачета по лабораторной работе необходимо выполнить следующие требования: 1. Получить допуск к лабораторной работе при предъявлении преподавателю отчета по текущей лабораторной работе. 2. Проект должен иметь заставку, в которой указываются: название учебного заведения; название кафедры; название лабораторной работы; цель лабораторной работы; условие задачи; вариант задачи. 297

3. Заставка к проекту выполняется студентами 1-й подгруппы с использованием программного кода, который реализует создание сплэш-форм (см. Приложение 2, заставка №4), студентами 2-й подгруппы с использованием программного кода, который реализует форму произвольной конфигурации (см. Приложение 2, заставка №15). 4. На главной форме разрабатываемого приложения студенты 1-й подгруппы программируют задачу с использованием операторов ввода и вывода данных на форму, студенты 2-й подгруппы программируют задачу с использованием операторов InputBox и MessageBox. 5. В разработанном проекте применить методы проверки корректности ввода данных. 6. Обе подгруппы при окончательной компоновке проекта создают и демонстрируют преподавателю .exe файл приложения. 7. Студент должен уметь ответить на контрольные вопросы по лабораторной работе, т.е. проявить свои знания по теоретической части курса. 8. Студент должен продемонстрировать свои навыки и умения при работе на персональном компьютере в среде программирования Microsoft Visual Studio, набрав и отладив программу своего варианта. 9. Студент обязан соблюдать правила по технике безопасности при работе с вычислительной техникой. Содержание отчета

Название лабораторной работы. Фамилия, имя студента, номер группы, номер варианта. Цель лабораторной работы. Условие задачи. Запись математических формул на языке программирования. Разработанный алгоритм (все алгоритмические блоки чертятся карандашом или выполняются в текстовом редакторе Microsoft Word). 7. Листинг программы. 8. Результаты выполнения программы. 1. 2. 3. 4. 5. 6.

Контрольные вопросы

Что называется разветвляющимся алгоритмом? Как записываются многозначные ветвления в блок-схемах? Как записываются многозначные ветвления в программах? Как работает условный оператор if при проверке нескольких условий? Начертите алгоритмы трех возможных способов поиска максимального значения из трех чисел. 6. Начертите алгоритм поиска минимального значения из четырех чисел.

1. 2. 3. 4. 5.

298

Варианты к лабораторной работе «Программирование алгоритмов разветвляющихся структур с использованием поиска максимального и минимального значений» (порядковый номер студента по журналу соответствует его номеру варианта) 1

2

3

4

5

6

7 8

­ x 3  lg( xy) cd ° e = °®3min^x, y, max^cx, dy ° cd  x, °¯2 ­ °1  e xyab ° z = °b - min^ ax, y ` ® ° °max ­®x 3 , e y , ln y 2 °¯ ¯

­ ­a b °max ® , , y ¯x x ° °° ­ z = ®min ® a , y ` ¯x ° ° x y °2 °¯

xy ! 3 2dxd3 xy  0

``

xy > 0 xy = 0 xy < 0

` x>0иy>0 x0 в противном случае

`

­ 2 ° y 1  (zx) ° g = ®min^a  x, max^y, z ` ` ° y ° b e ¯ ­ ­x  a °min ® x , a  x, sinx ` ¯ ° f = °®max x, ax ` ° °ax  b °¯ ­ ­ 3 x 1, max^lgx, x  y °min ®¯x , e ° d = °1  x 2 ® ° 2 °c  dcos(x  y) °¯

y > 0 и xy2 > 0 y > 0 и xy2 0 в противном случае 01 x 0

^

­min^ a, max^ x, y, b ` ` z = °® 3 2 °¯a  y b lg x

­ ­ a , sin 2 y °min ®a  cosx, by ¯ ° z = °°max ­a 3 , ln(x 2  y 2 ) ` ® ® ¯ ° ° 3 °a  cos (x  y) ¯°

``

x > 0 и e-x y x 0 и e-x y в противном случае

3 x 4 в противном случае

`

x1 –1 x 0 в противном случае

``

`

|z|xy < 3 |z|x+y > 4 3 |z|x+y

`

0 x 1иy>2 в противном случае

­ ° °asinx  bcosx s = °®max ­®x 3 , e x ,103 ` ¯ ° ° ­ sinx , max ­®a x , x 3 `, xln 2 x °min ® ¯ ¯ x ¯ ­ °(1  x 2  a) ˜ max^ x, y ` ° t = °min ­x 2 , siny, cos(ay) ` ® ® ¯ ° ° 2 x °a  y ¯ ­ln(x)min^x, z ` u = °® 2 ­ 2 2 °max ®¯x , z  a , min^x, z ¯

4

x3 в противном случае

` xy < 0 xy > 2 в противном случае

``

x>0иz>0 в противном случае

18

19

20

­ 3 ­ 2 °min ®bx , cx , max c , x ¯ ° f = °b - cx 2 ® ° b2 ° °arctg 2 c  x2 ¯ ­a  b  c ­ xy ` ˜ min ®x, y, ° 2 xy ¯ ° v = °min^x, y ` ® ° y(a  b  c) ° ° ¯ ­ x 3 a siny ° h = °®max^x, y, z ` °min^y, z ` °¯

^

``

­min^ x, y ` ° z = ° max^ x, y, b ` 21 ® ° min^ x, y, b ` °b  ysinx ¯

22

23

24

^

^

­min ax, y, max

25

z = °® b  2x

x0иy>1 в противном случае

|x|y < z z |x|y -z в противном случае xy < 2 xy > 5 в противном случае

­min c, x min^y, z `, y  z ° ® xyz ° ¯1  c ­ay 2 cos z = °® max^x, y ` ° ¯ min^a, x, y ` ­ ­ x  y ½° °°min °® x , ¾ z =® a °¿ °¯ a ° °¯max^ax,2y, sin(x  y) `

E

x3 в противном случае

^

`

x,siny ` `

x > 0 и yz > 0 в противном случае xy > 2 xy 2 x0 в противном случае x 0иy>2 в противном случае

° ay ¯ e

­ x3 a  b ° 26 y = ® 1 max ^a , b , c ` °¯ 3 ­ ½ ­x  a ° min ® x , a  x ¾ ¯ ¿ 27 °° x x , a y = ® max ° 0 ° °¯

^

`

a0;S / 4@ по форму9

ле y

f

¦

k 1

u k , используя U k 1

(U k * X 2 ) /(2k * (2k  1)) для k 1,2,... . Вычис-

ления прекратите при U k 1  H , определите количество итераций. Начальные значения параметров равны x S / 7 ; U 1

x . Точность H принять равной 10-4.

331

10

Вычислите действительные корни уравнения x  Sin( x) 0,25 , используя рекуррентную формулу X k Sin( X k 1 )  0,25 (k 1,2,...) x0 1,2 ; e 10 4 . Определите количество итераций; вычисления прекратите при xk 1  xk  H .

11

Вычислите отрицательный корень уравнения x3-x+0,5 =0, используя рекуррентную формулу X k 1 3 xk  0,5 (k 0, 1, 2,...) , x0 1,3 ; e 10 4 . Определите количество итераций, вычисления прекратить при xk 1  xk  H . f

Вычислите значения функции y

ch x

¦U

k

, используя рекуррентную фор-

k 1

12

13

14

15

16

17

18

19

20

332

x2 U , (k 1, 2, 3..) . Вычисления прекратите при U K 1  H , 2k  1 2k k определите количество итераций.

мулу U k 1

Протабулируйте функцию F = a + 3 Cos (x) + Sin(x / 2), (xn d x d xk, dx). Определите сумму и произведение вычисленных значений F. Вычислите значение Z, соответствующее каждому значению x (xn=1, dx=0.5, Cos 2 x   3,5 Tgx 2 a=20 — задает пользователь), по формуле: Z Lnx  . Счиa  3x 2 тайте Z до тех пор, пока z не станет t 3. Определите k — количество вычисленных Z. Выведите на экран x, z, k. Вычислите значение Y, соответствующее каждому значению x (xn=1, dx=0.3, ­°Tgx  Cosx, x  0.2 d a a=50 — задает пользователь), по формуле: y= ®  x 2 , найдите 2 °¯e  x , x  0.2 ! a максимальное и минимальное значения y. Вычислите значение Y, соответствующее каждому значению x (xn=1, dx=0.5, ­°Tgx 2 cos x, x d a , найдите макa=3 — задает пользователь), по формуле: y= ® 2 2 °¯Ctgx  x , x ! a симальное значение y, среднее арифметическое положительных значений y, определите k — количество вычисленных y. Вычислите значение Y, соответствующее каждому значению x (xn d x d xk, dx), 2 2 °­2 x Tgx , x d a по формуле: y= ® , найдите среднее арифметическое положи°¯3 cos x, x ! a тельных значений y и количество отрицательных значений y. Вычислите значение Y, соответствующее каждому значению x (xn d x d xk, dx), ­°e 2 x 3 x 2 , x d a по формуле: y= ® , найдите сумму положительных значений 2 °¯ a 3 x  5 x , x ! a y и количество вычисленных значений y. Дано: x = 5; dx = 0.5. Вычисляйте Z по формуле: Z y  3 y  5 y  7 y , где y e 0, 2 x . Считайте Z до тех пор, пока y ! 125 . Определите k — количество вычисленных Z. Выведите на экран x, y, Z, k. 1 y2 , где Дано: x = 2; dx = -0,1. Z вычисляйте по формуле: Z Ln(2 x 5  0.3 x 2 ) y e 0, 2 x . Считайте Z до тех пор, пока выражение под знаком логарифма меньше 0. Найдите k — количество вычисленных Z. Выведите на экран x, Z, k.

21

22

23

24

Вычислите значение Y, соответствующее каждому значению x (xn d x d xk, dx), ­e 3 x 2 x , 2 x d a °° по формуле: y= ® a  sin x  2 x 2 , 2 x ! a , найдите сумму и количество вычис°3tgx, 0 d a  3 °¯ ленных значений y. Вычислите значение Y, соответствующее каждому значению x (xn d x d xk, dx), ­3x 2  a , 2  x d a °° по формуле: y= ®2 x 2  a , 2  x ! a , найдите максимальное значение Y и ко° 3x  5 x 3 , 0 d a  5 ¯° личество вычисленных значений y. 1 . Считайте Z Дано: x = 2; dx = -0,2. Z вычисляйте по формуле: Z Ln( x 2  0.5 x) до тех пор, пока выражение под знаком логарифма меньше 0. Найдите k — количество вычисленных Z. Выведите на экран x, Z, k. Протабулируйте функцию F = a + Sin2 (x) + Ctg (x), (xn d x d xk, dx). Определите среднее арифметическое вычисленных значений F, количество вычисленных F.

25

1 , где q a 2  a . q 1 Считайте Z до тех пор, пока q  0 . Определите k — количество вычисленных Z. Выведите на экран a, q ,Z, k.

26

Протабулируйте функцию F = a + Tg (x) + Sin (x), (xn d x d xk, dx). Определите сумму и произведение вычисленных значений F, количество вычисленных F.

Дано: a = 5; da = -0,5. Z вычисляйте по формуле: Z

q

Вычислите значение Z, соответствующее каждому значению x (xn=1, dx=0.5, 27

28

29

30

a  5 x 3  ax 3 . Считайте Z до x3  3 тех пор, пока z не станет меньше 1E-2. Определите k — количество вычисленных Z. Выведите на экран x, z, k. Протабулируйте функцию F = a + Arctg (x) + Cos (x), (xn d x d xk, dx). Определите разницу между максимальным и минимальным значениями F, количество вычисленных F. Дано: x = 5; dx = 1. Вычисляйте Z по формуле: Z y  3 y  5 y , где y e 0, 2 x . Считайте Z до тех пор, пока y t 25 . Определите k — количество вычисленных Z. Выведите на экран x, y, z, k. Протабулируйте функцию F = a + 3 Cos (x) + Sin(x / 2), (xn d x d xk, dx). Определите минимальное значение среди значений f0, количество вычисленных F.

a=70 — задает пользователь), по формуле: Z

Лабораторная работа №10 «Программирование алгоритмов итеративных циклических структур» Цель работы: овладение практическими навыками разработки и программирования вычислительного процесса, связанного с применением в программах итеративного циклического процесса, получение дальнейших навыков по отладке и тестированию программ, выработка при решении поставленных задач таких 333

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

1 2

1 3

Задача 1. Среди чисел 1, 1  , 1   , . . . найдите первое число, большее вво-

димого значения переменной a. Комментарий: алгоритм решения данной задачи относится к алгоритмам вычисления членов бесконечных последовательностей. Очередной член бесконечной последовательности обозначим как b. Его номер, который совпадает со значением знаменателя дроби, добавляемой к предыдущему члену для получения значения очередного члена последовательности, обозначим как n. Тогда, итерационная формула вычисления очередного члена последовательности примет вид:

bn

bn 1 

1 n

Разработка алгоритма решения задачи представлена на рис. 200. Начало a b=1 n=1 Нет

b e1); textBox1.Text = x.ToString() ; textBox2.Text = x1.ToString() ; } } }

Результаты разобранной задачи представлены на рис. 203.

336

Рис. 203. Результаты работы программы

Задача 3. Задана возрастающая последовательность

x x2 x3 1 , , 2 , 3 , ....( x t 10) 3 3 3 Требуется вычислять все члены последовательности, до тех пор пока значение очередного члена не превысит некоторое число d (3< d 100, т.е. количество итераций не превысит 100). В листинге 191 приведен код процедуры, отвечающий за решение задачи. Листинг 191 namespace WindowsApplication1

337

{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { double a; double x = Convert.ToDouble(textBox1.Text); double d = Convert.ToDouble(textBox2.Text); int n = 0 ; listBox1.Items.Clear(); listBox1.Items.Add(" n " + " a "); listBox1.Items.Add(" "); do { a = Math.Pow (x, n) / Math.Pow (3, n); listBox1.Items.Add(" " + n.ToString() + " + a.ToString()); n = n + 1 ; } while ((a < d) || (n > 100)); } } }

"

Результаты разобранной задачи представлены на рис. 205.

Рис. 205. Результаты работы программы

Задача 4. Разработайте программу, вычисляющую приближенное значение функции Exp (x) с заданной точностью . Комментарий: функция Exp (x) может быть представлена бесконечным рядом

H

exp x 1  x 

x2 x3 xn   ...   ... 2! 3! n!

H

Для вычисления значения функции Exp (x) с точностью необходимо просуммировать все члены ряда, которые по модулю превышают заданную точ-

H

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

xn ²H n! Рассматривая приведенную выше формулу, можно заметить, что соседние члены ряда (обозначим их как Cn и Cn+1) связаны между собой соотношением x C n1 C n ˜ , где n = 0, 1, 2, ..., причем C0 = 1. n 1 Используя это соотношение, можно последовательно вычислить все члены ряда. При этом не возникает необходимости в выполнении в явном виде операций вычисления факториала и возведения в степень. Рассмотренное свойство степенных рядов позволяет организовывать чрезвычайно простые и очень эффективные (в смысле оптимизации скорости вычислений) алгоритмы вычисления их частичных сумм. Такие формулы, позволяющие вычислять последующие значения чего-либо на основе предыдущего значения, называются рекуррентными соотношениями. Разработка алгоритма решения задачи представлена на рис. 206. В листинге 192 приведен код процедуры, отвечающий за решение задачи. Листинг 192 namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { double x = Convert.ToDouble(textBox1.Text); double eps = Convert.ToDouble(textBox2.Text); double s = 1; double n = 1; double cn = x ; listBox1.Items.Clear(); while (Math.Abs(cn) > eps) { s = s + cn ; n = n + 1 ; cn = cn * x / n ; } double y = Math.Exp(x) ; listBox1.Items.Add("Ɂɧɚɱɟɧɢɟ ɮɭɧɤɰɢɢ, ɜɵɱɢɫɥɟɧɧɨɟ ɫ ɡɚɞɚɧɧɨɣ ɬɨɱɧɨɫɬɶɸ: " + s.ToString() ) ; listBox1.Items.Add("Ɂɧɚɱɟɧɢɟ ɮɭɧɤɰɢɢ y, ɜɵɱɢɫɥɟɧɧɨɟ ɱɟɪɟɡ ɜɫɬɪɨɟɧɧɭɸ ɮɭɧɤɰɢɸ: " + y.ToString()) ; listBox1.Items.Add("Ʉɨɥɢɱɟɫɬɜɨ ɱɥɟɧɨɜ ɪɹɞɚ:" + n.ToString()) ; } } }

339

Начало x, eps n = 1; s = 1; cn = x Нет

a100

Да s = s + cn

вывод s, n

n=n+1 cn = cn * x/n

Конец Рис. 206. Алгоритм решения задачи

Результаты разобранной задачи представлены на рис. 207. В разработанную программу добавлен оператор y = Math.Exp(x), для того чтобы сравнить полученные результаты. Из ответов, представленных на рис. 207, видно, что значение функции s вычислено более точно, чем значение функции y, полученное «классическим» способом через оператор y = Math.Exp(x).

Рис. 207. Полученные результаты

Задача 5. Вычислить сумму членов знакопеременной убывающей последовательности с заданной точностью H : n 1 x  1 ( x  1) 2 ( x  1)3 n ( x  1)    .....  (1) ......, 1! 2! 3! (n  1)!

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

an 1

an .q .

Выражение для q можно получить, разделив

a n 1 член на a n

член. Приведем вывод рекуррентной формулы для заданного в задаче ряда. Формула n-го члена ( x  1) n1 an (1) n (n  1)! тогда формула n+1 члена

an 1 Разделив

an1 q

(1)

n 1

( x  1) n 11 (n  1  1)!

(1)

n 1

( x  1) n  2 (n  2)!

член на a n , получим выражение для q

an 1 an

(1) n 1 ˜ ( x  1) n  2 ˜ (n  1)! ( x  1)  n n 1 (n  2)! ˜ (1) ˜ ( x  1) n2

Таким образом, рекуррентная формула для данного ряда:

an 1

 an ˜

( x  1) n2

Выбор начального значения номера члена ряда (n) для нашего случая будет n = 0, так как при подстановке этого значения в формулу n-го члена ряда

an

( x  1) n 1 (1) (n  1)! n

мы получим значение первого члена, равного х — 1 или а = х — 1. В листинге 193 приведен код процедуры, отвечающий за решение задачи. Листинг 193 namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { double x = Convert.ToDouble(textBox1.Text); double e1 = Convert.ToDouble(textBox2.Text); int n = 0; double a = x - 1; double s = 0; listBox1.Items.Clear(); listBox1.Items.Add(" n " + " a "); listBox1.Items.Add(" "); do {

341

listBox1.Items.Add(" " + n.ToString() + " " + a.ToString()); s = s + a ; a = -a * (x - 1) / (n + 1) ; n = n + 1; } while ((Math.Abs(a) > e1)); listBox1.Items.Add(" ɋɭɦɦɚ = " + s.ToString() ) ; } } }

Результаты разобранной задачи представлены на рис. 208.

Рис. 208. Результаты работы программы 5 Задача 6. Вычислите с точностью H 10 корень уравнения 3 2 f ( x) x  2 x  x  3 0 , воспользовавшись итерационной формулой

xi 1

xi 

f ( x) f ' ( x)

i

0, 1, 2...., x0

2.2

Комментарий: проверим правильность решения подстановкой найденного '

2

корня в уравнение. Вычислим производную f ( x ) : f ( x ) 3 x  4 x  1 . Обозначим х — текущее приближение к корню, а — предыдущее приближение, f — значение функции f (x) для предыдущего значения, р — значение производной F ’(x) для предыдущего значения, i — номер итерации, совпадающий с номером текущего приближения к корню уравнения, у — значение функции f (x) для найденного с заданной точностью корня уравнения. Будем считать, что заданная точность H обеспечена, если модуль разности между текущим и предыдущим значениями корня меньше точности H , т.е. для нашего случая |x — a |< H . В листинге 194 приведен код процедуры, отвечающий за решение задачи. Листинг 194 namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); }

342

private void button1_Click(object sender, EventArgs e) { double x = 2.2 ; double e1 = 0.00001 ; double i = 0 ; double f, a, p; listBox1.Items.Clear(); listBox1.Items.Add(" i " + " x "); listBox1.Items.Add(" "); do { a = x ; f = Math.Pow (x, 3) - 2 * a *a + a - 3 ; p = 3 * a *a + 4 * a + 1 ; x = a - f / p ; i = i + 1 ; listBox1.Items.Add(" " + i.ToString() + " " + x.ToString()); } while ((Math.Abs(x - a) > e1)); listBox1.Items.Add(" ɂɫɤɨɦɵɣ ɤɨɪɟɧɶ= " + x.ToString() ) ; double y = Math.Pow (x, 3) - 2 * x *x + x - 3 ; textBox1.Text = y.ToString() ; } } }

Результаты разобранной задачи представлены на рис. 209.

Рис. 209. Результаты программы

Задания для самостоятельной подготовки Изучить: - возможности языка программирования для реализации циклических алгоритмов с использованием операторов цикла do…while и while; 343

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

Для успешного получения зачета по лабораторной работе необходимо выполнить следующие требования: 1. Получить допуск к лабораторной работе при предъявлении преподавателю отчета по текущей лабораторной работе. 2. Проект должен иметь заставку, в которой указываются: название учебного заведения; название кафедры; название лабораторной работы; цель лабораторной работы; условие задачи; вариант задачи. 3. Заставка к проекту выполняется студентами 1-й подгруппы с использованием программного кода, который реализует создание нестандартной формы (см. Приложение 2, заставка №10), студентами 2-й подгруппы с использованием программного кода, который реализует эффект повернутой надписи (см. Приложение 2, заставка №9). 4. Главную форму разрабатываемого приложения студенты 1-й подгруппы и 2-й подгруппы программируют с использованием обычной формы. 5. Обе подгруппы при окончательной компоновке проекта создают и демонстрируют преподавателю .exe файл приложения. 6. Студент должен уметь ответить на контрольные вопросы по лабораторной работе, т.е. проявить свои знания по теоретической части курса. 7. Студент должен продемонстрировать свои навыки и умения при работе на персональном компьютере в среде программирования Microsoft Visual Studio, набрав и отладив программу своего варианта. 8. Студент обязан соблюдать правила по технике безопасности при работе с вычислительной техникой. Содержание отчета

1. 2. 3. 4.

Название лабораторной работы. Фамилия, имя студента, номер группы, номер варианта. Цель лабораторной работы. Условие задачи.

344

5. Разработанный алгоритм (все алгоритмические блоки чертятся карандашом или выполняются в текстовом редакторе Microsoft Word). 6. Листинг программы. 7. Результаты выполнения программы. Контрольные вопросы

1. 2. 3. 4.

Какой цикл называется итеративным? В каком случае целесообразно использовать рекуррентную формулу? Какие формулы называются рекуррентными соотношениями? Назовите условия окончания итерационного процесса?

Варианты к лабораторной работе «Программирование алгоритмов итеративных циклических структур» (порядковый номер студента по журналу соответствует его номеру варианта) № варианта

Задача

Вычислите с точностью = 0.00001 константу Эйлера (основание натурального логарифма), воспользовавшись разложением в ряд: 1

x x2 x3 xn 1     ...   ... 1! 2! 3! n!

ex

Сравните результат со значением, полученным с помощью соответствующей встроенной функции. Вычислите и выведите те члены последовательности 2

x,

x2 x3 xn , ,... ,... , 2! 3! n!

значения которых больше = 0.001 при x = 0.2 Вычислите с точностью = 0.00001 значение функции y пользовавшись рекуррентной формулой: 3

y i 1

ª xº 0 .5 « y i  » ; yi ¼ ¬

i

0,1,2...; y 0

x при x = 2, вос-

x 2

Сравните результат со значением, полученным с помощью соответствующей встроенной функции. Вычислите и выведите те члены последовательности, 4

3 x,8 x 2 ,...n(n  2) x n ,... значения которых больше = 0.01, при x = 0.6 Вычислите с точностью = 0.00001, воспользовавшись разложением в ряд:

x3 x5 x7 x2n1    ... (1)n  ... 3 5 7 2n 1 4 ˜ arctg (1) и соотношением S arctg ( x) x 

5

Сравните результат со значением, полученным с помощью соответствующей встроенной функции. 6

Вычислите с точностью

= 0.00001 значение функции y

1 x

при x = 2, воспользовавшись формулой: 345

yi 1 1.5 yi  0.5 xyi3 ; i 0,1,2,...; y0 1 Сравните результат со значением, полученным с помощью соответствующей встроенной функции. Вычислите sin 0.5 с точностью = 0.0001, воспользовавшись разложением в ряд: 7

x

sin x

x3 x5 x7 x 2 n 1    ...  ( 1) n  ... Сравните результат со 3! 5! 7! ( 2 n  1)!

значением, полученным с помощью соответствующей встроенной функции. 8

xk найдите наименьшее целое положительное значеk ( x  0.5)

Для функции z

ние k, при котором z < 0.001 (x=0.5) Вычислите cos 0.6 с точностью = 0.00001, воспользовавшись разложением в 9

1

ряд: cos x

x2 x4 x6 x 2n    ...  ( 1) n  ... 2! 4! 6! ( 2 n )!

Сравните результат со значением, полученным с помощью соответствующей встроенной функции. 10

Вычислите с точностью зовавшись формулой:

x i 1

cosx i ; i

= 0.0001 корень уравнения x  cos x

0,1,2..., x 0

0 восполь-

0

Проверьте правильность решения подстановкой найденного корня в уравнение. Вычислите и выведите те члены последовательности, 11

x2 x3 xn , ,..., (1) n ,... n! 2! 3! значения которых по модулю больше

12

xk (x  k)2

Для функции z

= 0.001 при x = 0.5.

при x = 2.5 найдите наименьшее целое положи-

тельное значение k, при котором z > 100. Вычислите корень уравнения f ( x ) x 4  2 x 2  x  1 0 с точностью воспользовавшись итерационной формулой 13

xi 1

xi 

f ( xi ) ;i f ' ( xi )

0,1,2,...; x0

=0.0001,

0

Проверьте правильность решения подстановкой найденного корня в уравнение. Вычислите значение 2 с точностью = 0.00001, воспользовавшись представлением в виде в виде цепной дроби:

1

2 1 2

1 2

14

1 ...

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

an

1 , n 1,2,3,..., a 0 2  a n -1

0.5. .

Сравните результат со значением, полученным с помощью соответствующей встроенной функции. 346

Вычислите и выведите те члены последовательности, 15

x3  x 5 x 2 n1 , ,..., (1) n1 2 3 15 4n  1 значения которых по модулю больше = 0.001 при x = 0.3. Найдите наименьшее целое положительное n, при котором:

16

1

1 1 1   ! 4 2 3 n

Вычислите sh 0.3 с точностью до = 0.00005, воспользовавшись разложением в ряд: 17

sh(x) x 

x3 x5 x 2n 1   ...   ... Сравните результат со значе3! 5! (2n  1)!

нием, полученным с помощью встроенной функции для вычисления ex, используя соотношение:

18

sh( x)

e x  e x 2

Вычислите корень уравнения x-0.5(sinx2-1)=0 с точностью зовавшись итерационной формулой:

= 0.001, восполь-

xi1 0.5(sinxi2 1);i 0,1,2,...;x0 0.25 Проверьте правильность решения подстановкой найденного корня в уравнение. Вычислите ln(2) с точностью = 0.001, воспользовавшись представлением в виде ряда:

19

ln 2 1 

1 1 1 1 1     ...  (1) n1  ... Сравните результат со значени2 3 4 5 n

ем, полученным с помощью соответствующей встроенной функции. Вычислите с точностью = 0.00001 корень уравнения f ( x) tg ( x)  x 0, воспользовавшись итерационной формулой 20

x i 1

xi -

f(x i ) ,i f' (x i )

0,1,2,..., x 0

4.6.

Проверьте правильность решения подстановкой найденного корня в уравнение. Вычислите ch 0.7 с точностью до = 0.00005, воспользовавшись разложением в ряд: ch( x ) 21

1

x2 x4 x 2n    2! 4! (2n)!

Сравните результат со значением, полученным с помощью встроенной функции ex, используя соотношение: ch( x )

22

ex  ex 2

y k 1  1 ; k 1, 2, ... . Дано действительное число H>0. Найy k 1  2 дите первый член y n , для которого выполнено условие y n  y n 1  H . Пусть y 0

0; y k

Дано действительное a>0. Последовательность x0, x1, …образована по закону

­ min( 2a, 0.95), при a  1 ® случаях. ¯a / 5, в остальных 4 x n 4 / 5 xn 1  a / 5 xn 1 , n 1, 2, ... . 5 Найдите первый член xn, для которого a x n 1  x n  10 6 4 x0

23

Вычислите для найденного значения xn разность a–x5n.

347

24

25

26

27

28

29

30

31

32

Дано действительное b>0. Последовательность а1, а2, … образована по следующему закону: a1=b; ak=ak-1-1/k, k=2, 3,.. Найдите первый отрицательный член последовательности а1,а2, … Дано действительное b1/2) Дано действительное x. Вычислите приближенное значение 1/x+1/(3x3)+1/(5x5)+… (x>1) бесконечной суммы с точностью =0.0001. Вычислите приближенное значение бесконечной суммы с точностью =0,0001 (справа от суммы дается ее точное значение, с которым можно сравнить полученный результат): 1+1/22+1/32+… S2/6 Вычислите приближенное значение бесконечной суммы с точностью =0,0001 (справа от суммы дается ее точное значение, с которым можно сравнить полученный результат): 1-1/3+1/5-1/7+… S/4 Вычислите приближенное значение бесконечной суммы с точностью =0,0001 (справа от суммы дается ее точное значение, с которым можно сравнить полученный результат): 1/(1*3)+1/(2*4)+1/(3*5)+… 3/4 Вычислите приближенное значение бесконечной суммы с точностью =0,0001 (справа от суммы дается ее точное значение, с которым можно сравнить полученный результат): 1/(1*2*3)+1/(2*3*4)+1/(3*4*5)+… 1/4 Даны действительные числа x, H (x0, H>0). Вычислите с точностью f

(1) k x 2 k 1 0 k! ( 2 k  1)

H=0,001: ¦ k

33

Даны действительные числа x, H (x 0, H>0). Вычислите с точностью f ( 1) k x 4 k  1 H: ¦ k 0 ( 2k )! ( 4 k  1)

34

Даны действительные числа x, H (x 0, H>0). Вычислите с точностью H: ¦

35

Дано действительное число x. Последовательность а1,а2,… образована по указанному ниже закону. Получите сумму а1+…+аk, где k - наименьшее целое число, удовлетворяющее двум условиям: k>10 и |ak+1|