У вас вопросы?
У нас ответы:) SamZan.net

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

Работа добавлена на сайт samzan.net: 2016-03-13

Поможем написать учебную работу

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

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 4.3.2025

общего и профессионального образования

Российской Федерации

Томский политехнический университет

УТВЕРЖДАЮ

Директор-проректор ИК ТПУ

А.В. Замятин

 1   сентября 2012 г.

ПРОГРАММИРОВАНИЕНА С#

Методические указания и индивидуальные задания

к лабораторным работам по курсу “Информатика”

для студентов первого курса ИК

Томск 2012


УДК 681.3.06

Программирование на C#: Методические указания и индивидуальные задания к лабораторным работам по курсу “Информатика” для студентов первого курса ИК ТПУ - Томск: Изд. ТПУ,2012. – 100 с.

Составитель доц., канд.техн. наук    А.Ю.Дёмин

 ст. преп. Дорофеев В.А.

      Рецензент       доц., канд.физ.-мат. наук    В.И.Рейзлин

Методические указания рассмотрены и рекомендованы к изданию методическим семинаром кафедры Информатики и проектирования систем

25августа 2012 г.

Зав. кафедрой М.А.Сонькин


Содержание

Лабораторная работа № 1. Изучение среды разработки VisualStudio 3

Лабораторная работа №2. Программирование линейных алгоритмов 11

Лабораторная работа №3. Программирование разветвляющихся алгоритмов 22

Лабораторная работа №4 Программирование циклических алгоритмов 28

лабораторная  работа № 5. Программирование с использованием строк 35

Лабораторная работа № 6. Программирование с использованием одномерных массивов 39

ЛАБОРАТОРНАЯ РАБОТА 7. Программирование с использованием МНОГОМЕРНЫХ массивов 43

ЛАБОРАТОРНАЯ РАБОТА 8. Программирование с использованием средств для отображения графической информации 47

ЛАБОРАТОРНАЯ РАБОТА 9. Программирование ГРАФИКИ 52

ЛАБОРАТОРНАЯ РАБОТА 10. Простейшая анимация 59

ЛАБОРАТОРНАЯ РАБОТА 11. Обработка изображений 63

ЛАБОРАТОРНАЯ РАБОТА 12. МЕТОДЫ 69

ЛАБОРАТОРНАЯ РАБОТА 13. СОРТИРОВКА 75

ЛАБОРАТОРНАЯ РАБОТА 14. РЕКУРСИВНЫЕ МЕТОДЫ 79

15. Индивидуальные задания повышенной сложности 88

ПРиложение 1. Команды основного меню 95

ПРиЛОЖЕНИЕ 2. Свойства компонентов 103

ПРИЛОЖЕНИЕ 3. Простые типы данных 114

ПРИЛОЖЕНИЕ 4. Процедуры и функции для работы со строками 117

ПРИЛОЖЕНИЕ 5. Математические формулы 120

Литература 121


Лабораторная работа № 1. Изучение среды разработки VisualStudio

Цель лабораторной работы: изучить среду быстрой разработкиприложений VisualStudio. Научится размешать и настраивать внешний вид элементов управления на форме.

  1. Интегрированная среда разработчика VisualStudio

Среда VisualStudio визуально реализуется в виде одного окна с несколькими панелями инструментов. Количество, расположение, размер и вид панелей может меняться программистом или самой средой разработки в зависимости от текущего режима работы среды или пожеланий программиста, что значительно повышает производительность работы.

При запуске VisualStudio появляется начальная страница со списком последних проектов, а также командами «Создать проект…» и «Открыть проект…». Нажмите ссылку «Создать проект…» или выберите в меню Файл команду «Создать проект…», на экране появится диалог для создания нового проекта (рис. 1.1).

Рис 1.1. Диалог создания нового проекта.

Слева в списке шаблонов приведены языки программирования, которые поддерживает данная версия VisualStudio: убедитесь, что там выделен раздел VisualC#. В средней части приведены типы проектов, которые можно создать. В наших лабораторных работах будут использоваться два типа проектов:

  1.  Приложение WindowsForms – данный тип проекта позволяет создать полноценное приложение с окнами и элементами управления (кнопками, полями ввода и пр.) Такой вид приложения наиболее привычен большинству пользователей.
  2.  Консольное приложение – в этом типе проекта окно представляет собой текстовую консоль, в которую приложение может выводить тексты или ожидать ввода информации пользователя. Консольные приложения часто используются для вычислительных задач, для которых не требуется сложный или красивый пользовательский интерфейс.

Выберите в списке тип проекта «Приложение WindowsForms», в поле «имя» внизу окна введите желаемое имя проекта (например, MyFirstApp) и нажмите кнопку ОК. Через несколько секунд VisualStudioсоздаст проект и Вы сможете увидеть на экране картинку, подобную представленной на рис. 1.2.

Рис 1.2. Главное окно VisualStudio

В главном окне VisualStudioприсутствует несколько основных элементов, которые будут помогать нам в работе. Прежде всего, это форма (1) – будущее окно нашего приложения, на котором будут размещаться элементы управления. При выполнении программы помещенные элементы управления будут иметь тот же вид, что и на этапе проектирования.

Второй по важности объект – это окно свойств (2), в котором приведены все основные свойства выделенного элемента управления или окна. С помощью кнопки можно просматривать свойства элемента управления, а кнопка переключает окно в режим просмотра событий. Если этого окна на экране нет, его можно активировать в меню Вид ->Окно свойств.

Сами элементы управления можно брать на панели элементов (3).Все элементы управления разбиты на логические группы, что облегчает поиск нужных элементов. Если панели нет на экране, её нужно активировать командой Вид -> Панель элементов.

Наконец, обозреватель решений (4) содержит список всех файлов, входящих в проект, включая добавленные изображения и служебные файлы. Активируется командой Вид ->Обозреватель решений.

 Окно текста программы предназначено для просмотра, написания и редактирования текста программы. Переключаться между формой и текстом программы можно с помощью команд Вид ->Код (F7) и Вид ->Конструктор (Shift+F7). При первоначальной загрузке в окне текста программы находится текст, содержащий минимальный набор операторов для нормального функционирования пустой формы в качестве Windows-окна. При помещении

элемента управления в окно формы, текст программы автоматически дополняется описанием необходимых для его работы библиотек стандартных программ (раздел using) и переменных для доступа к элементу управления (в скрытой части класса формы).

Программа на языке C# составляется как описание алгоритмов, которые необходимо выполнить, если возникает определенное событие, связанное с формой (например щелчок «мыши» на кнопке – событие Click, загрузка формы – Load). Для каждого обрабатываемого в форме события, с помощью окна свойств, в тексте программы организуется метод, в котором программист записывает на языке C# требуемый алгоритм.

1.2. Настройка формы

Настройка формы начинается с настройки размера формы. С помощью мыши, «захватывая» одну из кромок формы или выделенную строку заголовка отрегулируйте нужные размеры формы.

Для настройки будущего окна приложения задаются свойства формы. Для задания любых свойств формы и элементов управления на форме используется окно свойств.

Новая форма имеет одинаковые имя (Name) и заголовок (Text) - Form1.

Для изменения заголовка перейдите в окно свойств и щелкните кнопкой мыши на форме. В форме инспектора объектов найдите и щелкните мышью на строчке с названием Text. В выделенном окне наберите “Лаб. раб. N1. Ст. гр. 7А62 Иванов А.А.”.Для задания цвета окна используйте свойство BackColor.

1.3. Размещение элементов управления на форме

Для размещения различных элементов управления на форме используется панель элементов. Панель элементов содержит элементы управления, сгруппированные по типу. Каждую группу элементов управления можно свернуть, если она в настоящий момент не нужна. Для выполнения лабораторных работ потребуются элементы управления из группы Стандартные элементы управления.

Рис.1.3Панель элементов

Щёлкните на нужном элементе управления, а затем щёлкните в нужном месте формы – элемент появится на форме. Элемент можно перемещать по форме схватившись за него левой кнопкой мышки (иногда это можно сделать лишь за появляющийся при нажатии на элемент квадрат со стрелками ). Если элемент управления позволяет изменять размеры, то на соответствующих его сторонах появятся белые кружки, ухватившись за которые и можно изменить размер. После размещения элемента управления на форме, его можно выделить щелчком мыши и при этом получить доступ к его свойствам в окне свойств.

1.4. Размещение строки ввода (TextBox)

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

В данной программе с помощью однострочного редактора будут вводиться переменные x,y,z типа double или int.

Выберите на панели элементов пиктограмму , щелкните мышью в том месте формы, где вы хотите ее поставить. Вставьте три элемента TextBox в форму. Захватывая их “мышью” отрегулируйте размеры окон и их положение. Обратите внимание на то, что теперь в тексте программы можно использовать переменные textBox1, textBox2 и textBox3, которые соответствуют каждому добавленному элементу управления. В каждой из этих переменных в свойстве .Text будет содержаться строка символов (тип string) и отображаться в соответствующем окне TextBox.

С помощью инспектора объектов установите шрифт и размер символов отражаемых в строке TextBox (свойство Font).

1.5. Размещение надписей (Label)

На форме могут размещаться пояснительные надписи. Для нанесения таких надписей на форму используется элемент управления Label. Выберите на панели элементов пиктограмму , щелкните на ней мышью. После этого в нужном месте формы щелкните мышью, появится надпись label1. Проделайте это для четырех надписей. Для каждой надписи, щелкнув на ней мышью, отрегулируйте размер и, изменив свойство Text в окне свойств, введите строку, например “Введите значение X:”, а также выберите размер символов (свойство Font).

Обратите внимание, что в тексте программы теперь можно обращаться к четырём новым переменным типа Label. В них хранятся пояснительные строки, которые можно изменять в процессе работы программы.

1.6. Написание программы обработки события

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

1.7. Написание программы обработки события нажатия кнопки (Click)

Поместите на форму кнопку, которая описывается элементом управления Button, для чего выберем пиктограмму . С помощью окна свойств измените заголовок (Text) на слово “Выполнить” или другое по вашему желанию. Отрегулируйте положение и размер кнопки.

После этого два раза щелкните мышью на кнопке, появится текст программы:

privatevoid button1_Click(object sender, EventArgs e)

{

}

 

Это и есть обработчики события нажатия кнопки. Вы можете добавлять свой код между скобками { }. Например, наберите:

MessageBox.Show("Привет!");

1.8. Написание программы обработки события загрузки формы (Load)

Второй способ создания обработчика события заключается в выборе соответствующего события для выделенного элемента на форме. При этом используется окно свойств и его закладка . Рассмотрим этот способ. Перейдите на форму, в окне свойств найдите событие Load. Щелкнете по данной строчке дважды мышкой. Появитсяметод:

privatevoid Form1_Load(object sender, EventArgs e)

{

}

Между скобками{ }вставимтекстпрограммы:

BackColor = Color.AntiqueWhite;

Каждый элемент управления имеет свой набор обработчиков событий, однако некоторые из них присуши большинству элементов управления. Наиболее часто применяемые события представлены в таблице:

Событие

Описание события

Activated

Форма получает это событие при активации

Load

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

KeyPress

Возникает при нажатии кнопки на клавиатуре. Параметр e.KeyChar имеет тип char и содержит код нажатой клавиши (клавиша Enter клавиатуры имеет код #13, клавиша Esc - #27 и т.д.). Обычно это событие используется в том случае, когда необходима реакция на нажатие одной из клавиш

KeyDown

Возникает при нажатии клавиши на клавиатуре. Обработчик этого события получает информацию о нажатой клавише и состоянии клавиш Shift, Alt и Ctrl, а также о нажатой кнопке мыши. Информация о клавише передается параметром e.KeyCode, который представляет собой перечисление Keysс кодами всех клавиш, а информацию о клавишах-модификаторах Shiftи др. можно узнать из параметра e.Modifiers

KeyUp

Является парным событием для OnKeyDown и возникает при отпускании ранее нажатой клавиши

Click

Возникает при нажатии кнопки мыши в области элемента управления

DoubleClick

Возникает при двойном нажатии кнопки мыши в области элемента управления

1.9. Запуск и работа с программой

 Запустить программу можно выбрав в меню Отладка командуНачать отладку. При этом происходит трансляция и, если нет ошибок, компоновка программы и создание единого загружаемого файла с расширением .exe. На экране появляется активноеокно программы.Для завершения работы программы и возвращения в режим проектирования формы не забудьте закрыть окно программы!

1.10. Динамическое изменение свойств

 Свойства элементов на окне могут быть изменены динамически во время выполнения программы. Например, можно изменить текст надписи или цвет формы. Изменение свойств происходит внутри обработчика события (например, обработчика события нажатия на кнопку). Для этого используют оператор присвоения вида:

<имя элемента>.<свойство> = <значение>;

Например:

label1.Text = "Привет";

<Имя элемента> определяется на этапе проектирования формы, при размещении элемента управления на форме. Например, при размещении на форме ряда элементов TextBox, эти элементы получают имена textBox1, textBox2, textBox3и т.д. Эти имена могут быть замены в окне свойств в свойстве (Name)для текущего элемента. Допускается использование латинских или русских символов, знака подчеркивания и цифр (цифра не должна стоять в начале идентификатора). Список свойств для конкретного элемента можно посмотреть в окне свойств, а также в приложении к данным методическим указаниям.

1.11. Выполнение индивидуального задания

Ниже приведено 15 вариантов задач. По указанию преподавателя выберите свое индивидуальное задание. Уточните условие задания, количество, наименование, типы исходных данных. Прочтите в приложении описание свойств и описание элементов управленияForm, Label, TextBox, Button. С помощью окна свойств установите первоначальный цвет формы, шрифт выводимых символов.

Индивидуальные задания

  1.  Разместите на форме четыре кнопки (Button). Сделайте на кнопках следующие надписи: красны, зеленый, синий, желтый. Создайте четыре обработчика события нажатия на данные кнопки, которые буду менять цвет формы в соответствии с текстом на кнопках.
  2.  Разместите на форме две кнопки (Button) и одну метку (Label). Сделайте на кнопках следующие надписи: привет, до свидания. Создайте обработчики события нажатия на данные кнопки, которые буду менять текст метки, на слова: привет, до свидания. Создайте обработчик события создания формы (Load), который будет устанавливать цвет формы и менять текст метки на строку «Начало работы».
  3.  Разместите на форме две кнопки (Button) и одну метку (Label). Сделайте на кнопках следующие надписи: скрыть, показать. Создайте обработчики события нажатия на данные кнопки, которые буду срывать или показывать метку. Создайте обработчик события создания формы (Load), который будет устанавливать цвет формы и менять текст метки на строку «Начало работы».
  4.  Разместите на форме три кнопки (Button) и одно поле ввода (TextBox). Сделайте на кнопках следующие надписи: скрыть, показать, очистить. Создайте обработчики события нажатия на данные кнопки, которые буду скрывать или показывать поле ввода. При нажатии на кнопку «очистить» текст из поля ввода должен быть удален.
  5.  Разместите на форме две кнопки (Button) и одно поле ввода (TextBox). Сделайте на кнопках следующие надписи: заполнить, очистить. Создайте обработчики события нажатия на данные кнопки, которые будут очищать или заполнять поле ввода знаками «******». Создайте обработчик события создания формы (Load), который будет устанавливать цвет формы и менять текст в поле ввода на строку «+++++».
  6.  Разработайте игру, которая заключается в следующем. На форме размещены пять кнопок (Button). При нажатии на кнопку какие то кнопки становятся видимыми, а какие то невидимыми. Цель игры скрыть все кнопки.
  7.  Разработайте игру, которая заключается в следующем. На форме размещены четыре кнопки (Button) и четыре метки (Label). При нажатии на кнопку часть надписей становится невидимыми, а часть наоборот становятся видимыми. Цель игры скрыть все надписи.
  8.  Разместите на форме ряд кнопок (Button). Создайте обработчики события нажатия на данные кнопки, которые будут делать неактивными текущую кнопку. Создайте обработчик события изменение размера формы (Resize), который будет устанавливать все кнопки в активный режим.
  9.  Разместите на форме ряд кнопок (Button). Создайте обработчики события нажатия на данные кнопки, которые будут делать неактивными следующую кнопку. Создайте обработчик события нажатия кнопки мыши на форме (Click), который будет устанавливать все кнопки в активный режим.
  10.  Разместите на форме три кнопки (Button) и одно поле ввода (TextBox). Сделайте на кнопках следующие надписи: *****, +++++, 00000. Создайте обработчики события нажатия на данные кнопки, которые будут выводить текст, написанный на кнопках, в поле ввода. Создайте обработчик события создания формы (Load), который будет устанавливать цвет формы и менять текст в поле ввода на строку «Готов к работе».
  11.   Разместите на форме ряд полей ввода (TextBox). Создайте обработчики события нажатия кнопкой мыши на данные поля ввода, которые будут выводить в текущее поле ввода его номер. Создайте обработчик события изменение размера формы (Resize), который будет очищать все поля ввода.
  12.  Разместите на форме поле ввода (TextBox), метку (Label)и кнопку (Button). Создайте обработчик события нажатия на кнопку, который будет копировать текст из поля ввода в метку. Создайте обработчик события нажатия кнопки мышки на форме (Click), который будет устанавливать цвет формы и менять текст метки на строку «Начало работы» и очищать поле ввода.
  13.  Разместите на форме поле ввода (TextBox), и две кнопки (Button) с надписями: блокировать, разблокировать. Создайте обработчики события нажатия на кнопки, которые будут делать активным или неактивным поле ввода. Создайте обработчик события нажатия кнопки мышки на форме (Click), который будет устанавливать цвет формы и делать невидимыми все элементы.
  14.   Реализуйте игру минер на поле 3x3 из кнопок (Button). Первоначально все кнопки не содержат надписей. При попытке нажатия на кнопку на ней либо показывается количество мин, либо надпись «мина!» и меняется цвет окна.
  15.   Разместите на форме четыре кнопки (Button). Напишите для каждой обработчик события, который будет менять размеры и местоположение на окне других кнопок.

Лабораторная работа №2. Программирование линейных алгоритмов

Цель лабораторной работы: научиться составлять каркас простейшей программы в среде VisualStudio. Написать и отладить программу линейного алгоритма.

2.1.Структура приложения

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

Кроме понятия проект часто используется более глобальное понятие –решение (solution). Решение содержит один или несколько проектов, один из которых может быть указан как стартовый проект. Выполнение решения начинается со стартового проекта.

Таким образом, при создании простейшей C# программы в VisualStudio. Создается папка решения, в которой для каждого проекта создается подпапка проекта, в которой будут создаваться другие подпапки с результатами компиляции приложения.

Проект это основная единица, с которой работает программист. При создании проекта можно выбрать его тип, а VisualStudio создаст каркас проекта в соответствии с выбранным типом.

В предыдущей лабораторной работе мы попробовали создавать оконные приложения или иначе Приложения WindowsForms. Как пример другого типа проекта можно привести проект консольного приложения.

По своим "внешним" проявлениям консольные напоминают приложения DOS, запущенные в Windows. Тем не менее, это настоящие Win32-приложения, которые под DOS работать не будут. Для консольных приложений доступен Win32 API, а кроме того, они могут использовать консоль - окно, предоставляемое системой, которое работает в текстовом режиме и в которое можно вводить данные с клавиатуры. Особенность консольных приложений в том, что они работают не в графическом, а в текстовом режиме.

Проект в VisualStudio состоит из файла проекта (файл с расширением .csproj), одного или нескольких файлов исходного текста (с расширением .cs), файлов с описанием окон формы (с расширением .designer.cs), файлов ресурсов (с расширением .resx), а также ряда служебных файлах.

В файле проекта находится информация о модулях, составляющих

данный проект, входящих в него ресурсах, а также параметров построения программы. Файл проекта автоматически создается и изменяется средой VisualStudio и не предназначен для ручного редактирования.

 Файл исходного текста – программный модуль предназначен для размещения текстов программ. В этом файле программист размещает текст программы, написанный на языке C#.Модуль имеет следующую структуру:

// Раздел подключенных пространств имен

usingSystem;

// Пространство имен нашего проекта

namespaceMyFirstApp

{

// Классокна

publicpartialclassForm1 : Form

{

// Методыокна

public Form1()

       {

InitializeComponent();

}

}

}

В разделе подключения пространств имен (каждая строка которого располагается в начале файла и начинается ключевым словом using) описываются используемые пространства имён. Каждое пространство имён включает в себя классы, выполняющие определённую работу, например, классы для работы с сетью располагаются в пространстве System.Net, а для работы с файлами – в System.IO. Большая часть пространств, которые используются в обычных проектах, уже подключена при создании нового проекта, но при необходимости можно дописать дополнительные пространства имён.

Для того чтобы не происходило конфликтов имён классов и переменных, классы нашего проекта также помещаются в отдельное пространство имен. Определяется оно ключевым словом namespace, после которого следует имя пространства (обычно оно совпадает с именем проекта).

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

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

При компиляции программы VisualStudioсоздает исполняемые .exe-файлы в каталоге bin.

2.2.Работа с проектом

Как вы видите, проект в VisualStudio состоит из многих файлов, и создание сложной программы требует хранения каждого проекта в отдельной папке. При создании нового проекта VisualStudioпо умолчанию сохраняет его в отдельной папке. Рекомендуется создать для себя свою папку со своей фамилией внутри папки своей группы, чтобы все проекты хранились в одном месте. После этого можно запускать VisualStudio и создавать новый проект (как это сделать показано в предыдущей лабораторной работе).

Сразу после создания проекта рекомендуется сохранить его в подготовленной папке: Файл -> Сохранить всё.При внесении значительных изменений в проект следует еще раз сохранить проект той же командой, а перед запуском программы на выполнение среда обычно сама сохраняет проект на случай какого-либо сбоя. Для открытия существующего проекта используется команда Файл-> Открыть проект, либо можно найти в папке файл проекта с расширением .csprojи сделать на нём двойной щелчок.

2.3. Описание данных

Типы данных имеют особенное значение в С#, поскольку это строго типизированный язык. Это означает, что все операции подвергаются строгому контролю со стороны компилятора на соответствие типов, причем недопустимые операции не компилируются. Такая строгая проверка типов позволяет предотвратить ошибки и повысить надежность программ. Для обеспечения контроля типов все переменные, выражения и значения должны принадлежать к определенному типу. Такого понятия, как "бестиповая" переменная, в данном языке программирования вообще не существует. Более того, тип значения определяет те операции, которые разрешается выполнять над ним. Операция, разрешенная для одного типа данных, может оказаться недопустимой для другого.

ВС# имеются две общие категории встроенных типов данных: типы значений и ссылочные типы. Они отличаются по содержимому переменной. Концептуально разница между ними состоит в том, что тип значения (value type) хранит данные непосредственно, в то время как ссылочный тип (reference type) хранит ссылку на значение.

Эти типы сохраняются в разных местах памяти: типы значений сохраняются в области, известной как стек, а ссылочные типы — в области, называемой управляемой кучей.

Рис.2.1Панель элементов

  1. Целочисленные типы

В С# определены девять целочисленных типов: char, byte, sbyte, short, ushort, int, uint, long и ulong. Но тип char в основном применяется для представления символов и поэтому рассматривается отдельно. Остальные восемь целочисленных типов предназначены для числовых расчетов.

  1. Типы с плавающей точкой

Типы с плавающей точкой позволяют представлять числа с дробной частью. ВС# имеются две разновидности типов данных с плавающей точкой: float и double. Они представляют числовые значения с одинарной и двойной точностью соответственно.

  1. Десятичный тип данных

Для представления чисел с плавающей точкой высокой точности предусмотрен также десятичный тип decimal, который предназначен для применения в финансовых вычислениях.

  1. Символы

В С# символы представлены не 8-разрядным кодом, как во многих других языках программирования, например С++, а 16-разрядным кодом, который называется юникодом (Unicode). В юникоде набор символов представлен настолько широко, что он охватывает символы практически из всех естественных языков на свете.

  1. Логический тип данных

Тип bool представляет два логических значения: "истина" и "ложь". Эти логические значения обозначаются в С# зарезервированными словами true и false соответственно. Следовательно, переменная или выражение типа bool будет принимать одно из этих логических значений.

  1. Строки

Основным типом при работе со строками является тип string, задающий строки переменной длины. Тип string представляет последовательность из нуля или более символов в кодировке Юникод. Класс String в языке C# относится к ссылочным типам. Над строками - объектами этого класса - определен широкий набор операций, соответствующий современному представлению о том, как должен быть устроен строковый тип. По сути, текст хранится в виде последовательной доступной только для чтения коллекции объектов Char

Рассмотрим самые популярные данные – переменные и константы. Переменная - это ячейка памяти, которой присвоено некоторое имя и это имя используется для доступа к данным, расположенным в данной ячейке. Для каждой переменной задаётся тип данных – диапазон всех возможных значений для данной переменной.. Объявляются переменные непосредственно в тексте программы. Лучше всего сразу присвоить им начальное значение с помощью знака присвоения "=" (переменная = значение):

inta;     // Только объявление

intb = 7;// Объявление и инициализация значением

Для того чтобы присвоить значение символьной переменной, достаточно заключить это значение (т.е. символ) в одинарные кавычки:

charch;     // Только объявление

charsymbol = 'Z'; // Объявление и инициализация значением

 

Несмотря на то что тип char определен в С# как целочисленный, его не следует путать со всеми остальными целочисленными типами.

Частным случаем переменных являются константы. Константы - это переменные, значения которых не меняются в процессе выполнения программы. Константы описываются как обычная переменная, только с ключевымсловом constвпереди:

constintc = 5;

2.4. Ввод/вывод данных в программу

Рассмотрим один из способов ввода данных через элементы, размещенные на форме. Для ввода данных чаще всего используют элемент управленияTextBox, через обращение к его свойству Text. Свойство Textхранит в себе строку введенных символов. Поэтому данные можно считать таким образом:

privatevoid button1_Click(object sender, EventArgs e)

{

string s = textBox1.Text;

}

Однако со строкой символов трудно производить арифметические операции, поэтому лучше всего при вводе числовых данных перевести строку в целое или вещественное число. Для этого у типов, или int и doubleсуществуют методы Parseдля преобразования строк в числа. С этими числами можно производить различные арифметические действия. Таким образом, предыдущий пример можно переделать следующим образом:

privatevoid button1_Click(object sender, EventArgs e)

{

string s = textBox1.Text;

int a = int.Parse(s);

int b = a * a;

}

Перед выводом числовые данные следует преобразовать назад в строку. Для этого у каждой переменной существует метод ToString, который возвращает в результате строку с символьным представлением значения. Вывод данных можно осуществлять в элементы TextBox или Label, использую свойство Text. Например:

privatevoid button1_Click(object sender, EventArgs e)

{

string s = textBox1.Text;

int a = int.Parse(s);

int b = a * a;

   label1.Text = b.ToString();

}

2.5.Арифметические действия и стандартные функции

При вычислении выражения стоящего в правой части оператора присвоения могут использоваться арифметические операции: * умножение, + сложение, -вычитание, / деление, %взятие остатка при делении. Для задания приоритетов операций могут использоваться круглые скобки(). Также могут использоваться стандартные математические функции, представленные методами класса Math:

  1.  Math.Sin(a) – синус (аргумент задается в радианах);
  2.  Math.Cos(a)– косинус (аргумент задается в радианах);
  3.  Math.Atan(a)– арктангенс (аргумент задается в радианах);
  4.  Math.Log(a)– натуральный логарифм;
  5.  Math.Exp(a)–экспонента;
  6.  Math.Pow(x,y)–возводит переменную x в степень y;
  7.  Math.Sqrt(a) – квадратный корень;
  8.  Math.Abs(a) – модульчисла;
  9.  Math.Truncate(a)– целая часть числа;
  10.  Math.Round(a) – округление числа;

Более подробную информацию смотрите в приложении.

2.6. Пример написания программы

 Задание: составить программу вычисления для заданных значений x, y, z арифметического выражения

   .

Панель диалога программы организовать в виде, представленном на рис:

Рис 2.1. Внешний вид программы.

Для вывода результатов работы программы в программе используется текстовое окно, которое представлено обычным элементом управления.После установки свойства Multiline в Trueпоявляется возможность растягивать элемент управления не только по горизонтали, но и по вертикали. А после установки свойства ScrollBars в значение Both в окне появится вертикальная, а при необходимости и горизонтальная полосы прокрутки.

Информация, которая отображается построчно в окне, находится в массиве строк Lines, каждая строка которого имеет тип string. Однако нельзя напрямую обратиться к этому свойству для добавления новых строк, поскольку размер массивов в C# определяется в момент их инициализации. Для добавления нового элемента используется свойство Text, к текущему содержимому которого можно добавить новую строку:

textBox4.Text += Environment.NewLine + "Привет";

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

Работа с программой происходит следующим образом. Нажмите (щелкните мышью) кнопку “Выполнить”. В окне textBox4 появляется результат. Измените исходные значения x, y, z в окнах textBox1 –textBox3 и снова нажмите кнопку ”Выполнить” - появится новые результаты.

Полный текст программы имеет следующий вид:

using System;

using System.Windows.Forms;

namespace MyFirstApp

{

publicpartialclassForm1 : Form

   {

public Form1()

       {

InitializeComponent();

       }

privatevoid Form1_Load(object sender, EventArgs e)

{

           textBox1.Text = "3,4";  // Начальное значение X

           textBox2.Text = "0,74"; // Начальное значение Y

           textBox3.Text = "19,43";// Начальное значение Z

// Вывод строки в многострочный редактор

           textBox4.Text = "Лаб. раб. N1. Ст. гр. 7А62 Иванов А.А.";

}

privatevoid button1_Click(object sender, EventArgs e)

       {

// Считываниезначения X

double x = double.Parse(textBox1.Text);

// Выводзначения X вокно

           textBox4.Text += Environment.NewLine +

"X = " + x.ToString();

// СчитываниезначенияY

double y = double.Parse(textBox2.Text);

// Выводзначения Y вокно

           textBox4.Text += Environment.NewLine +

"Y = " + y.ToString();

// Считывание значения Z

double z = double.Parse(textBox3.Text);

// Выводзначения Z вокно

           textBox4.Text += Environment.NewLine +

"Z = " + z.ToString();

// Вычисляем арифметическое выражение

double a = Math.Tan(x + y) * Math.Tan(x + y);

double b = Math.Exp(y - z);

double c = Math.Sqrt(Math.Cos(x * x) + Math.Sin(z * z));

double u = a  -b * c;

// Выводимрезультатвокно

           textBox4.Text += Environment.NewLine +

"Результат U = " + u.ToString();

       }

   }

}

2.7. Выполнение индивидуального задания

Ниже приведено 15 вариантов задач. По указанию преподавателя выберите свое индивидуальное задание. Уточните условие задания, количество, наименование, типы исходных данных. В соответствии с этим установите необходимое количество окон TextBox, тексты заголовков на форме, размеры шрифтов, а также типы переменных и функции преобразования при вводе и выводе результатов.

Прочтите в приложении описание меню Файл, Правка, Отладка, иописание элемента управленияTextBox. С помощью инспектора объектов измените цвет формы, шрифт выводимых символов.

Индивидуальные задания

1.

При x=14.26, y=-1.22, z=3.5 t=0.564849.

 2.

 При x=-4.5, y=0.75,z=0.845 u=-55.6848.

3.

 При x=3.74, y=-0.825, z=0.16, v=1.0553.

4.

 При x=0.4 ,y=-0.875, z=-0.475w=1.9873.

5.

 При x=-15.246, y=4.642, z=20.001=-182.036.

6.

 При x=16.55, y=-2.75, z=0.15 =-38.902.

7.

 При x=0.1722, y=6.33, z=3.25=-172.025.

8.

 При x=-2.235, y=2.23, z=15.221 =39.374.

9.

 При x=1.825, y=18.225, z=-3.298=1.2131.

10.

 При x=3.981, y=-1.625, z=0.512 a=1.26185.

11.

 При x=6.251, y=0.827, z=25.001 b=0.7121.

12.

 При x=3.251, y=0.325, z=0.466c=4.025.

13. .

 При x=17.421, y=10.365, z=0.828f=0.33056.

14. .

 При x=12.3, y=15.4, z=0.252g=82.8257.

 15. .

При x=2.444, y=0.869, z=-0.13-0.49871.

 

Лабораторная работа №3. Программирование разветвляющихся алгоритмов

 Цель лабораторной работы: научиться пользоваться простейшими компонентами организации переключений (RadioButton). Написать и отладить программу разветвляющегося алгоритма.

3.1. Логические переменные и операции над ними

Переменные логического типа описываются посредством служебного слова bool. Они могут принимать только два значения - False (ложь) и True (истина). Результат False (ложь) и True (истина) возникает при использовании операций сравнения > меньше, < больше, !=не равно,  >= меньше или равно, <= больше или равно, == равно. Описываются логические переменные можно так:

bool b;

В языке C# имеются логические операции, применяемые к переменным логического типа. Это операции логического отрицания (!), логическое И (&&)и логическое ИЛИ (||). Операция логического отрицания является унарной операцией. Результат операции! есть False, если операнд истинен, и True, если операнд имеет значение ложь. Так,

! True → False (неправда есть ложь)

! False → True (не ложь есть правда)

Результат операции логическое И (&&)есть истина, только если оба ее операнда истинны, и ложь во всех других случаях. Результат операции логическое ИЛИ (||)есть истина, если какой-либо из ее операндов истинен, и ложен только тогда, когда оба операнда ложны.

3.2. Условные операторы

Операторы ветвления позволяют изменить порядок выполнения операторов в программе. К операторам ветвления относятся условный оператор if и оператор выбора switch.

Условный оператор if используется для разветвления процесса обработки данных на два направления. Он может иметь одну из форм: сокращенную или полную.

Форма сокращенного оператора if:

if (B)  S;

гдеВ  - логическое или арифметическое выражение, истинность которого проверяется; S - оператор: простой или составной.

При выполнении сокращенной формы оператора if сначала вычисляется выражение B, затем проводится анализ его результата: если B истинно, то выполняется оператор S; если B ложно, то оператор S пропускается. Таким образом, с помощью сокращенной формы оператора if можно либо выполнить оператор S, либо пропустить его.

Форма полного оператора if:

if (B) S1; else S2;

где B - логическое или арифметическое выражение, истинность которого проверяется; S1, S2 - оператор: простой или составной.

При выполнении полной формы оператора if сначала вычисляется выражение B, затем анализируется его результат: если B истинно, то выполняется оператор S1, а оператор S2 пропускается; если B ложно, то выполняется оператор S2, а S1 - пропускается. Таким образом, с помощью полной формы оператора if можно выбрать одно из двух альтернативных действий процесса обработки данных.

Пример. Вычислим значение функции

sinx,    еслиxa,

y(x)=        cosx,    если  axb,

tgx ,     если  xb                  .

Указанное выражение может быть запрограммировано в виде

if (x<=a) y= Math.Sin(x);if ((x>a)&&(x<b)) y= Math.Cos(x);if (x>=b) y=Math.Sin(x)/Math.Cos(x);

или

if (x <= a) y = Math.Sin(x);

   else if (x < b) y = Math.Cos(x);

          else y = Math.Sin(x) / Math.Cos(x);

 Оператор выбора switch  предназначен для разветвления процесса вычислений по нескольким направлениям. Формат оператора:

switch ( <выражение> )

{

case<константное_выражение_1>:

  [<оператор 1>];  <оператор перехода>;

case<константное_выражение_2>:

  [<оператор 2>]; <оператор перехода>;

 ...

case<константное_выражение_n>:

  [<оператор n>]; <оператор перехода>;

  [default: <оператор>; ]

}

 Замечание. Выражение, записанное в квадратных скобках, является необязательным элементом в операторе switch. Если оно отсутствует, то может отсутствовать и оператор перехода.

Выражение, стоящее за ключевым словом switch, должно иметь арифметический, символьный, строковый тип или тип указатель. Все константные выражения должны иметь разные значения, но их тип должен совпадать с типом выражения, стоящим после switch  или приводиться к нему. Ключевое слово case и расположенное после него константное выражение называют также меткой case.

Выполнение оператора начинается с вычисления выражения, расположенного за ключевым словом switch. Полученный результат сравнивается с меткой case. Если результат выражения соответствует метке case, то выполняется оператор, стоящий после этой метки, за которым обязательно должен следовать оператор перехода: break, goto и т.д. При использовании оператора break происходит выход из switch  и управление передается оператору, следующему за switch. Если же используется оператор goto, то управление передается оператору, помеченному меткой, стоящей после goto.

Если ни одно выражение case не совпадает со значением оператора switch, управление передается операторам, следующим за необязательной подписью default. Если подписи default нет, то управление передается за пределы оператора switch.

Пример использования оператора switch:

intcaseSwitch = 1;

switch (caseSwitch)

{

case 1:

Console.WriteLine("Case 1");

break;

case 2:

Console.WriteLine("Case 2");

break;

default:

Console.WriteLine("Default case");

break;

}

3.3. Кнопки-переключатели  RadioButton

При создании программ в VisualStudio для организации разветвлений часто используются компоненты в виде кнопок-переключателей. Состояние такой кнопки (включено - выключено) визуально отражается на форме. Если пользователь выбирает один из вариантов переключателя в группе, все остальные автоматически отключаются.

Группу составляют все элементы управления RadioButton в заданном контейнере, таком как Form. Чтобы создать на одной форме несколько групп, поместите каждую группу в собственный контейнер, такой как элемент управления GroupBox или Panel. На форме (рис.3.1) представлены кнопки-переключатели RadioButtonв контейнере GroupBox.

В программу передается номер включенной кнопки (0,1,2,..), который анализируется с помощью оператора switch.

3.4. Пример написания программы

 Задание: ввести три числа - x,y,z. Вычислить

 В качестве f(x) использовать по выбору:sin(x), cos(x), ex.

 

3.4.1. Создание формы

Создайте форму, в соответсвии с рис. 3.1.

Рис 3.1. Окно лабораторной работы

Выберите в панели элементовиз контейнеров GroupBoxи поместите его в нужное место формы. На форме появится окаймленный линией чистый прямоугольник с заголовком GroupBox1. Замените заголовок (Text) на F(x). Далее, как показано на рисунке, разместите в данном контейнере три радиокнопки (RadioButton). Для первой из них установите свойство Checkedв значение True.

Далее разместите на форме элементы Label,TextBox иButton. Поле для вывода результатов также является элементом TextBoxс установленным в True свойством Multiline.

3.4.2. Создание обработчиков событий FormСreate и Botton1Сlick

Обработчики событий создаются аналогично тому, как и в предыдущих лабораторных работах. Текст обработчика события нажатия на кнопку ПУСК приведен ниже.

private void button1_Click(object sender, EventArgs e)

{  // ПолучениеисходныхданныхизTextBox

double x = Convert.ToDouble(textBox1.Text);

double y = Convert.ToDouble(textBox2.Text);

double z = Convert.ToDouble(textBox3.Text);

// Ввод исходных данных в окно результатов

           textBox4.Text = "Результаты работы программы ст. Петрова И.И. " + Environment.NewLine;

textBox4.Text += "При X = " + textBox1.Text + Environment.NewLine;

           textBox4.Text += "При Y = " + textBox2.Text + Environment.NewLine;

           textBox4.Text += "При Z = " + textBox3.Text + Environment.NewLine;

           // Определение номера выбранной функции

int n = 0;

if (radioButton2.Checked) n = 1;

else if (radioButton3.Checked) n = 2;

// ВычислениеU

double u;

switch (n)

           {

case 0:

if ((z - x) == 0) u = y * Math.Sin(x) * Math.Sin(x) + z;

else if ((z - x) < 0) u = y*Math.Exp(Math.Sin(x)) - z;

else u = y*Math.Sin(Math.Sin(x)) + z;

                   textBox4.Text += "U = " + Convert.ToString(u) + Environment.NewLine;

break;

case 1:

if ((z - x) == 0) u = y * Math.Cos(x) * Math.Cos(x) + z;

else if ((z - x) < 0) u = y*Math.Exp(Math.Cos(x)) - z;

else u = y*Math.Sin(Math.Cos(x)) + z;

                   textBox4.Text += "U = " + Convert.ToString(u) + Environment.NewLine;

break;

case 2:

if ((z - x) == 0) u = y * Math.Exp(x) * Math.Exp(x) + z;

else if ((z - x) < 0) u = y*Math.Exp(Math.Exp(x)) - z;

else u = y*Math.Sin(Math.Exp(x)) + z;

                   textBox4.Text += "U = " + Convert.ToString(u) + Environment.NewLine;

break;

default:

                  textBox4.Text += "Решениененайдено" + Environment.NewLine;

break;

           }

       }

Запустите программу и убедитесь в том, что все ветви алгоритма выполняются правильно.

3.5. Выполнение индивидуального задания

По указанию преподавателя выберите индивидуальное задание из нижеприведенного списка. В качестве f(x) использовать по выбору: sh(x), x2, ex. Отредактируйте вид формы и текст программы, в соответствии с полученным заданием.

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

13.

14.

15.

 

Лабораторная работа №4 Программирование циклических алгоритмов

Цель лабораторной работы: изучить простейшие средства отладки программ в среде VisualStudio. Составить и отладить программу циклического алгоритма.

4.1. Операторы организации циклов

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

К операторам цикла относятся: цикл с предусловием while, цикл с постусловием do while, цикл с параметром for  и цикл перебора foreach. Рассмотрим некторые из них.

4.2. Цикл с предусловием while

Оператор цикла while организует выполнение одного оператора (простого или составного) неизвестное заранее число раз. Формат цикла while:

while (B) S;

где B - выражение, истинность которого проверяется (условие завершения цикла); S - тело цикла - оператор (простой или составной).

Перед каждым выполнением тела цикла анализируется значение выраженияВ: если оно истинно, то выполняется тело цикла, и управление передается на повторную проверку условия В; если значение В ложно - цикл завершается и управление передается на оператор, следующий за оператором S.

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

В качестве иллюстрации выполнения цикла while рассмотрим программу вывода в консоль целых чисел из интервала от 1 до n.

static void Main()

{

Console.Write("N= ");

int n=int.Parse(Console.ReadLine());

int i = 1;

 while (i <= n)           //пока i меньше или равно n

 Console.Write(" "+ i++ ); //выводим i на экран, затем увеличиваем его на 1             

}

Результаты работы программы:

n               ответ

10               1  2  3  4  5  6  7  8  9  10

4.3. Цикл с постусловием do while

Оператор цикла do while также организует выполнение одного оператора (простого или составного) неизвестное заранее число раз. Однако в отличие от цикла while условие завершения цикла проверяется после выполнения тела цикла. Формат цикла do while:

do  S while (B);

гдеВ - выражение, истинность которого проверяется (условие завершения цикла); S - тело цикла - оператор (простой или блок).

Сначала выполняется оператор S, а затем анализируется значение выраженияВ: если оно истинно, то управление передается оператору S, если ложно - цикл завершается, и управление передается на оператор, следующий за условием B. Так как условиеВ проверяется после выполнения тела цикла, то в любом случае тело цикла выполнится хотя бы один раз.

В операторе do while, так же как и в операторе while, возможна ситуация зацикливания в случае, если условиеВ всегда будет оставаться истинным.

4.4. Цикл с параметром for

Цикл с параметром имеет следующую структуру:

for ( <инициализация>; <выражение>; <модификация>) <оператор>;

Инициализация используется для объявления и/или присвоения начальных значений величинам, используемым в цикле в качестве параметров (счетчиков). В этой части можно записать несколько операторов, разделенных запятой. Областью действия переменных, объявленных в части инициализации цикла, является цикл и вложенные блоки. Инициализация выполняется один раз в начале исполнения цикла.

Выражение определяет условие выполнения цикла: если его результат истинен, цикл выполняется. Истинность выражения проверяется перед каждым выполнением тела цикла, таким образом, цикл с параметром реализован как цикл с предусловием. В блоке выражение через запятую можно записать несколько логических выражений, тогда запятая равносильна операции логическое И ( && ).

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

Оператор  (простой или составной) представляет собой тело цикла.

Любая из частей оператора for (инициализация, выражение, модификация, оператор) может отсутствовать, но точку с запятой, определяющую позицию пропускаемой части, надо оставить.

Пример формирования строки состоящей из чисел от 0 до 9 разделенных пробелами:

for (var i = 0; i <= 9; i++)

{

s += i + " ";

}

Данный пример работате следующим образом. Сначала вычисляется начальное значение переменной i. Затем, пока значение i меньше или равно 9, выполняется тело цикла и затем повторно вычисляется значение i. Когда значение i становится больше 9, условие становится ложным и управление передается за пределы цикла.

4.2. Средства отладки программ

Практически в каждой вновь написанной программе после запуска обнаруживаются ошибки.

Ошибки первого уровня (ошибки компиляции) связаны с неправильной записью операторов (орфографические, синтаксические). При обнаружении ошибок компилятор формирует список, который отображается по завершению компиляции (рис. 4.1.). При этом возможен только запуск программы, которая была успешно скомпилирована для предыдущей версии программы.

Рис. 4.1. Окно со списком ошибок компиляции.

При выявлении ошибок компиляции в нижней части экрана появляется текстовое окно (рис 4.1.), содержащее сведения обо всех ошибках, найденных в проекте. Каждая строка этого окна содержит имя файла, в котором найдена ошибка, номер строки с ошибкой и характер ошибки. Для быстрого перехода к интересующей ошибке необходимо дважды щелкнуть на строке с ее описанием. Следует обратить внимание на то, что одна ошибка может повлечь за собой другие, которые исчезнут при ее исправлении. Поэтому следует исправлять ошибки последовательно, сверху вниз и, после исправления каждой ошибки компилировать программу снова.

Ошибки второго уровня (ошибки выполнения) связаны с ошибками выбранного алгоритма решения или с неправильной программной реализацией алгоритма.Эти ошибки проявляются в том, что результат расчета оказывается неверным либо происходит переполнение, деление на ноль и др. Поэтому перед использованием отлаженной программы ее надо протестировать, т.е. сделать просчеты при таких комбинациях исходных данных, для которых заранее известен результат. Если тестовые расчеты указывают на ошибку, то для ее поиска следует использовать встроенные средства отладки среды программирования.

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

Рис. 4.2. Фрагмент кода с точкой останова

При выполнении программы и достижения установленной точки, программа будет остановлена и далее можно будет выполнять код по операторно с помощью кнопок F10 (без захода в подпрограммы) или F11 (с заходом в подпрограммы) (рис 4.3.).

Рис. 4.3. Отладка программы

Желтым выделяется оператор, который будет выполнен. Значение переменных во время выполнения можно увидеть наведя на них курсор. Для снятия программы с выполнения необходимо нажать ShiftF5.

Для поиска алгоритмических ошибок контролуются значения промежуточных переменных на каждом шаге выполнения подозрительного кода и сравниваются с результатами, полученными вручную.

4.3. Порядок выполнения задания

 Задание:Вычислим и выведем на экран таблицу значений функции y=a•lnx  при x, изменяющемсяот x0 до xk с шагом dx, a - константа.

Панель диалога представлена на рис 4.4.

Рис. 4.4. Окно программы для табулирования функции.

 

Текст обработчика нажатия кнопкиВычислить приведен ниже.

private void button1_Click(object sender, EventArgs e)

       {

           // Считывание начальных данных

double x0 = Convert.ToDouble(textBox1.Text);

double xk = Convert.ToDouble(textBox2.Text);

double dx = Convert.ToDouble(textBox3.Text);

double a = Convert.ToDouble(textBox4.Text);

           textBox5.Text = "Работу выполнил ст. Иванов М.А." + Environment.NewLine;

           // Цикл для табулирования функции

doublex = x0;

while (x<=(xk+dx/2))

           {

double y = a*Math.Log(x);

            textBox5.Text += "x=" + Convert.ToString(x) +

                             "; y=" + Convert.ToString(y) + Environment.NewLine;

            x = x + dx;

           }

После отладки программы составьте тест (X0=2, Xk=4, Dx=0,2), установите точку останова наоператор перед циклом и запустите программу в отладочном режиме (F5). После попадания на точку остановки, нажимая клавишу F10, выполните пошагово программу и проследите, как меняются все переменные в процессе выполнения.

4.4. Выполнение индивидуального задания

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

Индивидуальные задания

 Cоставить программу для табулирования функции y(x), вывести на экран значения x и y(x)  

        

лабораторная работа № 5. Программирование с использованием строк

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

5.1. Тип данных string

Для хранения строк в языке C# используется тип string. Так, чтобы объявить (и, как правило, сразу инициализировать) строковую переменную, можно написать следующий код:

string a = "Текст";

stringb = "строки";

 Над строками можно выполнять операцию сложения – в этом случае текст одной строки будет добавлен к тексту другой:

stringc = a + " " + b; // Результат: Текст строки

Тип stringна самом деле является псевдонимом для класса String, с помощью которого над строками можно выполнять ряд более сложных операций. Например, метод IndexOfможет осуществлять поиск подстроки в строке, а метод Substring возвращает часть строки указанной длины, начиная с указанной позиции:

string a = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

int index = a.IndexOf("OP");// Результат: 14 (счёт с 0)

string b = a.Substring(3, 5); // Результат: DEFGH

 Если требуется добавить в строку специальные символы, это можно сделать с помощью escape-последовательностей, начинающихся с обратного слэша:

Escape-последовательность

Действие

\"

Кавычка

\\

Обратная косая черта

\n

Новая строка

\r

Возврат каретки

\t

Горизонтальная табуляция

5.2. Компонент ListBox

Компонент ListBox представляет собой список, элементы которого выбираются при помощи клавиатуры или мыши. Список элементов задается свойством Items. Items– это элемент, который имеет свои свойства и свои методы. Методы Add, RemoveAt и Insert используются для добавления, удаления и вставки элементов.

Объект Items хранит объекты, находящиеся в списке. Объект может быть любым классом – данные класса преобразуются для отображения в строковое представление методом ToString. В нашем случае в качестве объекта будут выступать строки. Однако, поскольку объект Itemsхранит объекты, приведённые к типу object, перед использованием необходимо привести их обратно к изначальному типу, в нашем случае string:

stringa = (string)listBox1.Items[0];

Для определения номера выделенного элемента используется свойство SelectedIndex.

5.3. Порядок выполнения индивидуального задания

 Задание: Написать программу подсчета числа слов в произвольной строке. В качестве разделителя может быть любое число пробелов. Для ввода строк использовать ListBox. Строки вводятся на этапе проектирования формы, используя окно свойств. Вывод результата организовать в метку Label.

 

Панель диалога будет иметь вид:

Рис. 5.1. Окно программы обработки строк

Текст обработчика нажатия кнопки «Пуск» приведен ниже.

privatevoid button1_Click(object sender, EventArgs e)

{

// Получаем номер выделенной строки

int index = listBox1.SelectedIndex;

// Считываемстрокувперменнуюstr

string str = (string)listBox1.Items[index];

// Узнаем количество символов в строке

int len = str.Length;

// Считаем, что количество пробелов равно 0

int count = 0;

// Устанавливаем счетчик символов в 0

int i = 0;

//Организуем цикл перебора всех символов в строке

while (i < len - 1)

   {

// Если нашли пробел, то увеличиваем

// счетчик пробелов на 1

if (str[i] == ' ')

count++;

i++;

   }

label1.Text = "Количествопробелов = " +

count.ToString();

}

5.4. Индивидуальныезадания

Во всех заданиях исходные данные вводить с помощью ListBox. Строки вводятся на этапе проектирования формы, используя окно свойств. Вывод результата организовать в метку Label.

1. Дана строка, состоящая из групп нулей и единиц. Посчитать количество нулей и едениц.

2. Посчитать в строке количество слов.

3. Найти количество знаков препинания в исходной строке.

4. Дана строка символов. Вывести на экран цифры, содержащиеся в строке.

5. Дана строка символов, состоящая из произвольных десятичных цифр, разделенных пробелами. Вывести вывести количество четных чисел в этой строке.

 7. Дана строка символов. Вывести на экран количество строчных русских букв, входящих в эту строку.

8. Дана строка символов. Вывести на экран только строчные русские буквы, входящие в эту строку.

9. Дана строка символов, состоящая из произвольного текста на английском языке, слова разделены пробелами. В каждом слове заменить первую букву на прописную.

10. Дана строка символов, состоящая из произвольного текста на английском языке, слова разделены пробелами. Удалить первую букву в каждом слове.

11. Дана строка символов, состоящая из произвольного текста на английском языке, слова разделены пробелами. Поменять местами i- и j-ю буквы. Для ввода iи jна форме добавить свои поля ввода.

12. Дана строка символов, состоящая из произвольного текста на английском языке, слова разделены пробелами. Поменять местами первую и последнюю буквы каждого слова.

13. Дана строка символов, состоящая из произвольного текста на английском языке, слова разделены пробелами. Заменить все буквы латинского алфавита на знак‘+’.

14. Дана строка символов, содержащая некоторый текст на русском языке. Заменить все большие буквы буквы‘А’ на символ ‘*’.

15. Дана строка символов, содержащая некоторый текст. Разработать программу, которая определяет, является ли данный текст палиндромом, т.е. читается ли он слева направо так же, как и справа налево ( например, «А роза упала на лапу Азора»).

16. Дана строка символов, состоящая из произвольного текста на английском языке, слова разделены пробелами. Сформировать новую строку, состоящую из чисел длин слов в исходной строке.

Лабораторная работа № 6. Программирование с использованием одномерных массивов

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

6.1. Работа с массивами

Массив - набор элементов одного и того же типа, объединенных общим именем. Массивы в С# можно использовать по аналогии с тем, как они используются в других языках программирования. Однако С#-массивы имеют существенные отличия: они относятся к ссылочным типам данных, более того - реализованы как объекты. Фактически имя массива является ссылкой на область кучи (динамической памяти), в которой последовательно размещается набор элементов определенного типа. Выделение памяти под элементы происходит на этапе инициализации массива. А за освобождением памяти следит система сборки мусора - неиспользуемые массивы автоматически утилизируются данной системой.

Рассмотримв данной лабораторной работе одномерные массивы.Одномерный массив - это фиксированное количество элементов одного и того же типа, объединенных общим именем, где каждый элемент имеет свой номер. Нумерация элементов массива в С# начинается с нуля, то есть, если массив состоит из 10 элементов, то его элементы будут иметь следующие номера: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.

Одномерный массив в С# реализуется как объект, поэтому его создание представляет собой двухступенчатый процесс. Сначала объявляется ссылочная переменная на массив, затем выделяется память под требуемое количество элементов базового типа, и ссылочной переменной присваивается адрес нулевого элемента в массиве. Базовый тип определяет тип данных каждого элемента массива. Количество элементов, которые будут храниться в массиве, определяется размер массива.

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

базовый_тип [] имя__массива;

 Описана ссылка на одномерный массив, которая в дальнейшем может быть использованадля адресации на уже существующий массив. Например: int [] a;

базовый_тип [] имя__массива = new базовый_тип [размер];

Объявлен одномерный массив заданного типа и выделена память под одномерный массив указанной размерности. Адрес данной области памяти записан в ссылочную переменную. Элементы массива равны нулю (В C# элементам массива присваиваются начальные значения по умолчанию в зависимости от базового типа.Для арифметических типов - нули, для ссылочных типов - null, для символов - пробел). Например: int []a=new int [10];

базовый_тип [] имя__массива={список инициализации};

Выделена память под одномерный массив, размерность которого соответствует количеству элементов в списке инициализации. Адрес этой области памяти записан в ссылочную переменную. Значение элементов массива соответствует списку инициализации. Например: int []a={0, 1, 2, 3};

Обращения к элементам массива происходит с помощью индекса, для этого нужно указать имя массива и в квадратных скобках его номер. Например, a[0], b[10], c[i].

Так как массив представляет собой набор элементов, объединенных общим именем, то обработка массива обычно производится в цикле. Например:

int[] myArray = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

int i;

for (i = 0; i < 10; ++i)

 Console.WriteLine(myArray[i]);

6.2. Случайныечисла

Одним из способов задания массива является задание определение элементов через случайные числа. Для работы со случайными числами используются в основном дваметодакласса Random: Randomи Next.Метод Randomподготавливает работу со случайными числами, обеспечивая, надежный способ создания непредсказуемой последовательности чисел.

Метод Random.Next  создает случайное число в диапазоне значений от нуля до Int32.MaxValue. Для создания случайного числа в диапазоне от нуля до какого-либо другого положительного числа используется перегрузка метода Random.Next(Int32). Для создания случайного числа в другом диапазоне используется перегрузка метода Random.Next(Int32, Int32).

6.3. Порядок выполнения индивидуального задания

Создайте форму с элементами управления как приведено на рис. 6.1. Опишите одномерный массив. Создайте обработчики события для кнопок (код приведен ниже). Данная программа заменяет все отрицательные числа нулями. Протестируйте правильность выполнения программы. Модифицируйте программу в соответствии с индивидуальным заданием.

Рис. 6.1. Окно программы для работы с одномерными массивами

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace WindowsFormsApplication1

{

publicpartialclassForm1 : Form

   {

int[] Mas = newint[15];

public Form1()

       {

InitializeComponent();

       }

privatevoid button1_Click(object sender, EventArgs e)

       {

Random rand = newRandom();

           textBox1.Text = "";

for (int i = 0; i < 15; i++)

           {

               Mas[i] = rand.Next(-50, 50);

               textBox1.Text += "Mas[" + Convert.ToString(i) +"] = "

                   + Convert.ToString(Mas[i]) + Environment.NewLine;

           }

       }

privatevoid button2_Click(object sender, EventArgs e)

       {

           textBox2.Text = "";

for (int i = 0; i < 15; i++)

           {

if (Mas[i] < 0) Mas[i] = 0;

               textBox2.Text += "Mas[" + Convert.ToString(i) + "] = "

                                 + Convert.ToString(Mas[i]) + Environment.NewLine;

}

       }

   }

}

6.3. Варианты заданий

  1. В массиве из 20 целых чисел найти наибольший элемент и поменять его местами с первым элементом.
  2. В массиве из 10 целых чисел найти наименьший элемент и поменять его местами с последним элементом.
  3. В массиве из 15 вещественных чисел найти наибольший элемент и поменять его местами с последним элементом.
  4. В массиве из 25 вещественных чисел найти наименьший элемент и поменять его местами с первым элементом.
  5. Дан массив X, содержащий 27 элементов. Вычислить и вывести элементы нового массива Y, где yi =6.85xi2-1.52. Если yi<0, то вычислить и вывести a=xi3-0.62 и продолжить вычисления; если yi0, то вычислить и вывести b=1/xi2 и продолжить вычисления.
  6.  Дан массив X, содержащий 16 элементов. Вычислить и вывести значения di, где  и значения di0.1.
  7.  Дан массив Y, содержащий 25 элементов. Записать в массив R и вывести значения элементов, вычисляемые по формуле  ,  i=1,2,…,25.
  8.  Дан массив F, содержащий 18 элементов. Вычислить и вывести элементы нового массива   pi=0.13fi3-2.5fi+8. Вывести отрицательные элементы массива P.
  9.  Вычислить и вывести элементы массива Z, где zi=i2+1, если i – нечетное, и zi=2i-1, если iчетное. Сформировать и вывести массив D:     di=2.5zi, если zi2.5 и di=zi/2.5, если zi2.5.
  10.  Заданы массивы D  и  E. Вычислить и вывести значения fi=(2di+sin ei)/di, где i=1,2,…,16;вывести  1fi3.
  11.  В массиве R, содержащем 25 элементов, заменить значения отрицательных элементов квадратами значений, значения положительных увеличить на 7, а нулевые значения оставить без изменения. Вывести массив R.
  12.  Дан массив A целых чисел, содержащий 30 элементов. Вычислить и вывести сумму тех элементов, которые кратны 5.
  13.  Дан массив A целых чисел, содержащий 30 элементов. Вычислить и вывести сумму тех элементов, которые нечетны и отрицательны.
  14.  Дан массив A целых чисел, содержащий 30 элементов. Вычислить и вывести сумму тех элементов, которые удовлетворяют условию aii2.
  15.  Дан массив A целых чисел, содержащий 30 элементов. Вычислить и вывести количество и сумму тех элементов, которые делятся на 5 и не делятся на 7.
  16.  Дан массив A вещественных чисел, содержащий 25 элементов. Вычислить и вывести число отрицательных элементов и число членов, принадлежащих отрезку1,2.
  17.  Дан массив C, содержащий 23 элемента. Вычислить и вывести среднее арифметическое всех значений ci3.5.
  18.  Дан массив Z целых чисел, содержащий 35 элементов. Вычислить и вывести R=S+P, где S – сумма четных элементов, меньших 3, P – произведение нечетных элементов, больших 1.
  19.  Дан массив Q натуральных чисел, содержащий 20 элементов. Найти и вывести те элементы, которые при делении на 7 дают остаток 1,2 или 5.
  20.  Дан массив Q натуральных чисел, содержащий 20 элементов. Найти и вывести те элементы, которые обладают тем свойством, что корни уравнения  qi2+3qi-5=0    действительны и положительны.
  21.  Дан массив, содержащий 10 элементов. Вычислить произведение элементов, стоящих после первого отрицательного элемента. Вывести исходный массиви результат вычислений.
  22.  Дан массив, содержащий 14 элементов. Вычислить сумму элементов, стоящих до первого отрицательного элемента. Вывести исходный массив и результат вычислений.
  23.  Дан массив содержащий 12 элементов. Все четные элементы сложить, вывести массив и результат.
  24.  Дан массив, содержащий 15 элементов. Все положительные элементы возвести в квадрат, а отрицательные умножить на 2. Вывести исходный и полученный массив.
  25.  Дан массив, содержащий 14 элементов. Все отрицательные элементы заменить на 3. Вывести исходный и полученный массив.

ЛАБОРАТОРНАЯ РАБОТА7. Программирование с использованием МНОГОМЕРНЫХ массивов

Цель лабораторной работы: изучить свойства компонента dataGridView. Написать программу с использованием двухмерных массивов.

7.1. Двухмерные массивы

Многомерные массивы имеют более одного измерения. Чаще всего используются двумерные массивы, которые представляют собой таблицы. Каждый элемент массива имеет два индекса, первый определяет номер строки, второй - номер столбца, на пересечении которых находится элемент. Нумерация строк и столбцов начинается с нуля. Объявить двумерный массив можно одним из предложенных способов:

тип [,] имя__массива;

тип [,] имя__массива = new тип [размер1, размер2];

тип [,] имя__массива={{элементы 1-ой строки}, … , {элементы n-ой строки}};

тип [,] имя__массива= new тип [,]{{элементы 1-ой строки}, … ,{элементы n-ой строки}};

строки}};

Пример кода использующего многомерные массивы:

// объявление и инициализация двухмерного массива

int[,] array2D = newint[,] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };

// Объявление такого массива с указанием размерности (кол-во строки столбцов)

int[,] array2Da = newint[4, 2] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };

// Объявление двухмерного массива элементами, которого являются строки

string[,] array2Db = newstring[3, 2] { { "one", "two" }, { "three", "four" },

{ "five", "six" } };

// Объявлениетрехмерногомассива

int[, ,] array3D = newint[,,] { { { 1, 2, 3 }, { 4, 5, 6 } },

{ { 7, 8, 9 }, { 10, 11, 12 } } };

// Объявление трехмерного массива с указанием размерности

int[, ,] array3Da = newint[2, 2, 3] { { { 1, 2, 3 }, { 4, 5, 6 } },

                                      { { 7, 8, 9 }, { 10, 11, 12 } } };

// Доступ к элементам массива

System.Console.WriteLine(array2D[0, 0]);

System.Console.WriteLine(array2D[0, 1]);

System.Console.WriteLine(array2D[1, 0]);

System.Console.WriteLine(array2D[1, 1]);

System.Console.WriteLine(array2D[3, 0]);

System.Console.WriteLine(array2Db[1, 0]);

System.Console.WriteLine(array3Da[1, 0, 1]);

System.Console.WriteLine(array3D[1, 1, 2]);

// Результаты работы программы (выводятся в консоль):

// 1

// 2

// 3

// 4

// 7

// three

// 8

// 12

7.2. Элемент управленияDataGridView

При работе с двухмерными массивами ввод и вывод информации на экран удобно организовывать в виде таблиц. Элемент управления DataGridViewможет быть использован для отображения информации в виде двумерной таблицы. Для обращения к ячейке в этом элементе необходимо указать номер строки и номер столбца. Например:dataGridView1.Rows[2].Cells[7].Value ="*"; данный код позволяте записать во вторую строку в 7 ячейку знак звездочка.

7.3. Порядок выполнения задания

 Задание:Создать программу для определения целочисленной матрицы 15 на 15. Разработать обработчик для поиска минимального элемента на дополнительной диаганали матрицы.Результат, после нажатия кнопки типа Button, вывести в textBox.

Окно программы приведено на рис. 7.1.

Рис. 7.1. Окно программы для работы с двухмерным массивом

Текстобработчика события нажатия на кнопкуприведенниже.

privatevoid button1_Click(object sender, EventArgs e)

       {

            dataGridView1.RowCount = 15; //Указываемколичествострок

            dataGridView1.ColumnCount = 15; //Указываемколичествостолбцов

int[,] a = newint[15,15]; //Инициализируеммассив

int i,j;

//Заполняем матрицу случайными числами

Random rand = newRandom();

for (i=0; i<15; i++)

for (j=0; j<15; j++)

a[i,j] = rand.Next(-100,100);

//Выводимматрицув dataGridView1

for (i=0; i<15; i++)

for (j=0; j<15; j++)

                    dataGridView1.Rows[i].Cells[j].Value = Convert.ToString(a[i,j]);

//производим поиск максимального элемента на дополнительной диагонали

int m = int.MinValue;

for (i = 0; i < 15; i++)

if (a[i, 14 - i] > m) m = a[i, 14 - i];

// выводим результат

            textBox1.Text = Convert.ToString(m);

       }

7.4. Индивидуальные задания

  1. Дана матрица A(3,4). Найти наименьший элемент в каждой строке матрицы. Вывести исходную матрицу и результаты вычислений.
  2. Дана матрица A(3,3). Вычислить сумму второй строки и произведение первого столбца. Вывести исходную матрицу и результаты вычислений.
  3. Дана матрица A(4,4). Найти наибольший элемент в главной диагонали. Вывести матрицу и наибольший элемент.
  4. Дана матрица A(3,4). Найти сумму элементов главной диагонали и эту сумму поставить на место последнего элемента. Вывести исходную и полученную матрицу.
  5. Дана матрица A(4,3). Вычислить наибольший элемент матрицы. Вывести исходную матрицу и наибольший элемент.
  6. Дана матрица A(4,3).Найти количество положительных элементов.
  7. Дана матрица A(3,4).Найти количество отрицательных элементов.
  8. Даны матрицы X(15,15) и Y(15,15). Вычислить и вывести элементы новой матрицы zij=12xij-0.85yij2.
  9.  Даны матрицы A(6,6),B(6,6) и C(6,6). Получить матрицу D(6,6), элементы которойвычисляются по формуле dij=maxaij,(bij+cij). Матрицу D(6,6) вывести.
  10.  Вычислить сумму S элементов главной диагонали матрицы B(10,10). Если S>10, то исходную матрицу преобразовать по формуле bij=bij+13.5;  если S10, то bij=bij2-1.5. Вывести сумму S и преобразованную матрицу.
  11.  Дана матрица F(15,15). Вывести номер и среднее арифметическое элементов строки, начинающейся с 1. Если такой строки нет, то вывести сообщение “строки нет”.
  12.  Дана матрица F(7,7). Найти наименьший элемент в каждом столбце. Вывести матрицу и найденные элементы.
  13.  Найти наибольший элемент главной диагонали матрицы A(15,15) и вывести всю строку, в которой он находится.
  14.  Найти наибольшие элементы каждой строки матрицы Z(16,16)  и поместить их на главную диагональ. Вывести полученную матрицу.
  15.  Вычислить суммы элементов матрицы Y(12,12) по столбцам и вывести их.
  16.  Найти наибольший элемент матрицы A(10,10) и записать нули в ту строку и столбец, где он находится. Вывести наибольший элемент, исходную и  полученную матрицу.
  17.  Дана матрица R(9,9). Найти наименьший элемент в каждой строке и записать его на место первого элемента строки. Вывести исходную и полученную матрицы.
  18.  Определить количество положительных элементов каждой строки матрицы    A(10,20) и запомнить их в одномерном массиве N. Массив N вывести.
  19.  Вычислить количество H положительных элементов последнего столбца матрицы  X(5,5). Если H<3, то вывести все положительные элементы матрицы, если H3, то вывести сумму элементов главной диагонали матрицы.
  20.  Вычислить и вывести сумму элементов матрицы A(12,12), расположенных над главной диагональю матрицы.

ЛАБОРАТОРНАЯ РАБОТА 8. Программирование с использованием средств для отображения графической информации

 Цель лабораторной работы: изучить возможности построения графиков с помощью компонента отображения графической информации Сhart. Написать и отладить программу построения на экране графика заданной функции.

8.1. Как строится график с помощью компонента Chart

Обычно результаты расчетов представляются в виде графиков и диаграмм. Библиотека .NETFramework имеет мощный элемент управления Chart для отображения на экране графической информации (рис. 8.1).

Рис 8.1. Окно программы с элементом управления.

Построение графика (диаграммы) производится после вычисления таблицы значений функции y=f(x) на интервале [Xmin, Xmax] с заданным шагом. Полученная таблица передается в специальный массив Points объекта Seriesкомпонента Сhart с помощью метода DataBindXY. Компонент Chart осуществляет всю работу по отображению графиков: строит и размечает оси, рисует координатную сетку, подписывает название осей и самого графика, отображает переданную таблицу в виде всевозможных графиков или диаграмм. При необходимости компоненту Сhart передаются данные о толщине, стиле и цвете линий, параметрах шрифта подписей, шагах разметки координатной сетки и другие настройки. В процессе работы программы изменение параметров возможно через обращение к соответствующим свойствам компонента Chart. Так, например, свойство AxisX содержит значение максимального предела нижней оси графика и при его изменении во время работы программы автоматически изменяется изображение графика.

8.2. Пример написания программы

 Задание: составить программу, отображающую графики функций sin(x) и cos(x) на интервале [Xmin, Xmax]. Предусмотреть возможность изменения разметки координатных осей, а также шага построения таблицы.

Прежде всего, следует определить в кодекласса все необходимые переменные и константы. Конечно, можно обойтись и без этого, вставляя значения в виде чисел прямо в формулы, но это, во-первых, снизит читабельность кода программы, а во вторых, значительно усложнит изменение каких-либо параметров программы, например, интервала построения графика.

///<summary>

/// Левая граница графика

///</summary>

privatedouble XMin = -Math.PI;

///<summary>

/// Правая граница графика

///</summary>

privatedouble XMax = Math.PI;

///<summary>

///Шагграфика

///</summary>

privatedouble Step = (Math.PI * 2) / 10;

// Массив значений X - общий для обоих графиков

privatedouble[] x;

// Два массива Y - по одному для каждого графика

privatedouble[] y1;

privatedouble[] y2;

Также в коде класса следует описать глобальную переменную типа Chart, к которой мы будем обращаться из разных методов:

Chartchart;

Поскольку данный класс не входит в пространства имен, подключаемые по умолчанию, следует выполнить дополнительные действия. Во-первых, в Обозревателе решений нужно щёлкнуть правой кнопкой по секции Ссылки и добавить ссылку на библиотеку визуализации (рис. 8.2):

Рис. 8.2. Добавление ссылки на библиотеку визуализации.

Кроме того, следует подключить соответствующее пространство имен:

using System.Windows.Forms.DataVisualization.Charting;

 Далее следует определить метод, который будет расчитывать количество шагов и вычислять значения функций в каждой точке, внося вычисленные значения в массивы x, y1и y2:

///<summary>

/// Расчёт значений графика

///</summary>

privatevoid CalcFunction()

{

// Количество точек графика

int count = (int)Math.Ceiling((XMax - XMin) / Step)

+ 1;

// Создаём массивы нужных размеров

   x = newdouble[count];

y1 = newdouble[count];

   y2 = newdouble[count];

// Расчитываем точки для графиков функции

for (int i = 0; i < count; i++)

   {

// Вычисляем значение X

       x[i] = XMin + Step * i;

// Вычисляем значение функций в точке X

y1[i] = Math.Sin(x[i]);

y2[i] = Math.Cos(x[i]);

}

}

После расчёта значений нужно отобразить графики на форме с помощью элемента Chart. Элемент управления Chartнельзя выбрать с помощью панели элементов – его нужно создавать прямо в коде программы. Вторым шагом следует созать область отображения графика и настроить внешний вид осей:

///<summary>

/// Создаём элемент управления Chart и настраиваем его

///</summary>

privatevoid CreateChart()

{

// Создаёмновыйэлементуправления Chart

chart = newChart();

// Помещаем его на форму

   chart.Parent = this;

// Задаём размеры элемента

chart.SetBounds(10, 10, ClientSize.Width - 20,

 ClientSize.Height - 20);

// Создаём новую область для построения графика

ChartArea area = newChartArea();

// Даём ей имя (чтобы потом добавлять графики)

   area.Name = "myGraph";

// Задаём левую и правую границы оси X

area.AxisX.Minimum = XMin;

   area.AxisX.Maximum = XMax;

// Определяемшагсетки

   area.AxisX.MajorGrid.Interval = Step;

// Добавляем область в диаграмму

   chart.ChartAreas.Add(area);

// Создаём объект для первого графика

Series series1 = newSeries();

// Ссылаемся на область для построения графика

   series1.ChartArea = "myGraph";

// Задаём тип графика - сплайны

   series1.ChartType = SeriesChartType.Spline;

// Указываем ширину линии графика

   series1.BorderWidth = 3;

// Название графика для отображения в легенде

   series1.LegendText = "sin(x)";

// Добавляем в список графиков диаграммы

   chart.Series.Add(series1);

// Аналогичные действия для второго графика

Seriesseries2 = newSeries();

series2.ChartArea = "myGraph";

   series2.ChartType = SeriesChartType.Spline;

   series2.BorderWidth = 3;

   series2.LegendText = "cos(x)";

chart.Series.Add(series2);

// Создаёмлегенду, котораябудетпоказыватьназвания

Legend legend = newLegend();

chart.Legends.Add(legend);

}

Наконец, все эти методы следует откуда-то вызвать. Чтобы графики появлялись сразу после запуска программы, надо вызывать их в обработчике события Loadформы:

privatevoid Form1_Load(object sender, EventArgs e)

{

// Создаём элемент управления

   CreateChart();

// Расчитываем значения точек графиков функций

   CalcFunction();

// Добавляем вычисленные значения в графики

chart.Series[0].Points.DataBindXY(x, y1);

chart.Series[1].Points.DataBindXY(x, y2);

}

8.3. Выполнение индивидуального задания

Постройте графики функций для соответствующих вариантов из лабораторной работы №2. Таблицу данных получить путём изменения параметра X с шагом h. Самостоятельно выбрать удобные параметры настройки.

ЛАБОРАТОРНАЯ РАБОТА9. Программирование ГРАФИКИ

 Цель лабораторной работы: изучить возможности VisualStudioпо создание простейших графических изображений. Написать и отладить программу построения на экране разлчиных графических примитивов.

9.1. Сообщение WM_PAINT

Прежде чем приступить к описанию способов рисования в окнах, применяемых приложениями .NET Frameworks, расскажем о том, как это делают «классические» приложения Microsoft Windows.

ОС Microsoft Windows следит за перемещением и изменением размера окон и при необходимости извещает приложения, о том, что им следует перерисовать содержимое окна. Для извещения в очередь приложения записывается сообщение с идентификатором WM_PAINT. Получив такое сообщение, функция окна должна выполнить перерисовку всего окна или его части, в зависимости от дополнительных данных, полученных вместе с сообщением WM_PAINT.

Для облегчения работы по отображению содержимого окна весь вывод в окно обычно выполняют в одном месте приложения — при обработке сообщения WM_PAINT в функции окна. Приложение должно быть сделано таким образом, чтобы в любой момент времени при поступлении сообщения WM_PAINT функция окна могла перерисовать все окно или любую его часть, заданную своими координатами.

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

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

Сообщение WM_PAINT передается функции окна, если стала видна область окна, скрытая раньше другими окнами, если пользователь изменил размер окна или выполнил операцию прокрутки изображения в окне. Приложение может передать функции окна сообщение WM_PAINT явным образом, вызывая функции программного интерфейса Win32 API, такие как UpdateWindow, InvalidateRect или InvalidateRgn.

Иногда ОС Microsoft Windows может сама восстановить содержимое окна, не посылая сообщение WM_PAINT. Например, при перемещении курсора мыши или значка свернутого приложения ОС восстанавливает содержимое окна. Если же ОС не может восстановить окно, функция окна получает от ОС сообщение WM_PAINT и перерисовывает окно самостоятельно.

9.2. Событие Paint

Для форм класса System.Windows.Forms предусмотрен удобный объектно-ориентированный способ, позволяющий приложению при необходимости перерисовывать окно формы в любой момент времени. Когда вся клиентская область окна формы или часть этой области требует перерисовки, форме передается событие Paint. Все, что требуется от программиста, это создать обработчик данного события (рис. 8.1.), наполнив его необходимой функциональностью.

Рис. 9.1.  Создание обработчика события Paint

9.3. Объект Graphics для рисования

Перед тем как рисовать линии и фигуры, отображать текст, выводить изображения и управлять ими в GDI3 необходимо создать объект Graphics. Объект Graphics представляет поверхность рисования GDI и используется для создания графических изображений. Ниже представлены два этапа работы с графикой.

  1. Создание объекта Graphics.
  2. Использование объекта Graphics для рисования линий и фигур, отображения текста или изображения и управления ими.

Существует несколько способов создания объектов Graphics. Одним из самых используемых является получение ссылки на объект Graphics через объект PaintEventArgs при обработке события Paint формы или элемента управления:

privatevoid Form1_Paint(object sender, PaintEventArgs e)

{

Graphics g = e.Graphics; // Объявляется объект Graphics

// Далее вставляется код рисования

}

9.4. Методы и свойства класса Graphics

Имена большого количества методов, определенных в классе Graphics, начинается с префикса Draw* и Fill*. Первые из них предназначены для рисования текста, линий и не закрашенных фигур (таких, например, как прямоугольные рамки), а вторые — для рисования закрашенных геометрических фигур. Мы рассмотрим применение только самых важных из этих методов, а полную информацию Вы найдете в документации.

Метод DrawLine рисует линию, соединяющую две точки с заданными координатами4. Ниже мы привели прототипы различных перегруженных версий этого метода:

public void DrawLine(Pen, Point, Point);

public void DrawLine(Pen, PointF PointF;

public void DrawLine(Pen, int, int, int, int);

public void DrawLine(Pen, float, float, float, float);

 Первый параметр задает инструмент для рисования линии — перо. Перья создаются как объекты класса Pen, например:

Pen p = new Pen(Brushes.Black,2);

 Здесь мы создали черное перо толщиной 2 пиксела. Создавая перо, Вы можете выбрать его цвет, толщину и тип линии, а также другие атрибуты.  

Остальные параметры перегруженных методов DrawLine задают координаты соединяемых точек. Эти координаты могут быть заданы как объекты класса Point и PointF, а также в виде целых чисел и чисел с плавающей десятичной точкой.

В классах Point и PointF определены свойства X и Y, задающие, соответственно, координаты точки по горизонтальной и вертикальной оси. При этом в классе Point эти свойства имеют целочисленные значения, а в классе PointF — значения с плавающей десятичной точкой.

Третий и четвертый вариант метода DrawLine позволяет задавать координаты соединяемых точек в виде двух пар чисел. Первая пара определяет координаты первой точки по горизонтальной и вертикальной оси, а вторая — координаты второй точки по этим же осям. Разница между третьим и четвертым методом заключается в использовании координат различных типов (целочисленных int и с плавающей десятичной точкой float).

Чтобы испытать метод  DrawLine в работе, создайте приложение DrawLineApp (аналогично тому, как Вы создавали предыдущее приложение). В этом приложении создайте следующий обработчик события Paint:

privatevoid Form1_Paint(object sender, PaintEventArgs e)

       {

Graphics g = e.Graphics;

g.Clear(Color.White);

for (int i = 0; i < 50; i++)

           {

g.DrawLine(newPen(Brushes.Black, 2), 10, 4 * i + 20, 200, 4 * i + 20);

}

       }

Здесь мы вызываем метод DrawLine в цикле, рисуя 50 горизонтальных линий (рис. 9.2.).

Рис. 9.2.  Пример использования DrawLine

Вызвав один раз метод DrawLines, можно нарисовать сразу несколько прямых линий, соединенных между собой. Иными словами, метод DrawLines позволяет соединить между собой несколько точек. Координаты этих точек по горизонтальной и вертикальной оси передаются методу через массив класса Point или PointF:

public void DrawLines(Pen, Point[]);

public void DrawLines(Pen, PointF[];

 Для демонстрации возможностей метода DrawLinesсоздайте приложение. Создайте кисть pen для рисования линий:

Pen pen = new Pen(Color.Black, 2);

а также массив точек points, которые нужно соединить линиями:

Point[] points = new Point[50];

for(int i=0; i < 20; i++)

  {

int xPos;

if(i%2 == 0)

     {

xPos=10;

     }

else

     {

xPos=400;

     }

points[i] = new Point(xPos, 10 * i);

}

Код будет выглядеть следующим образом:

publicpartialclassForm1 : Form

   {

Point[] points = newPoint[50];

Pen pen = newPen(Color.Black, 2);

public Form1()

       {

InitializeComponent();

       }

privatevoid Form1_Paint(object sender, PaintEventArgs e)

       {

Graphics g = e.Graphics;

g.DrawLines(pen, points);

       }

privatevoid Form1_Load(object sender, EventArgs e)

       {

for (int i = 0; i < 20; i++)

           {

int xPos;

if (i % 2 == 0)

               {

xPos = 10;

               }

else

               {

xPos = 400;

               }

points[i] = newPoint(xPos, 10 * i);

}

       }

   }

Результат приведен на рис. 9.3.

Рис. 9.3.  Пример использования массива точек

Для прорисовки прямоуголников можно использовать метод DrawRectangle(Pen, int, int, int, int);В качестве первого параметра передается перо класса Pen. Остальные параметры задают расположение и размеры прямоугольника.

Для прорисовки многоугольников можно использовать метод DrawPolygon(Pen, Point[]);

Метод DrawEllipse рисует эллипс, вписанный в прямоугольную область, расположение и размеры которой передаются ему в качестве параметров.При помощи метода DrawArc программа может нарисовать сегмент эллипса. Сегмент задается при помощи координат прямоугольной области, в которую вписан эллипс, а также двух углов, отсчитываемых в направлении против часовой стрелки. Первый угол Angle1 задает расположение одного конца сегмента, а второй Angle2 — расположение другого конца сегмента (рис. 9.4.).  

Рис. 9.4. Углы и прямоугольник, задающие сегмент эллипса

В классе Graphics определен ряд методов, предназначенных для рисования закрашенных фигур. Имена некоторых из этих методов, имеющих префикс Fill:

FillRectangle (рисование закрашенного прямоугольника), FillRectangles (рисование множества закрашенных многоугольников), FillPolygon (рисование закрашенного многоугольника), FillEllipse (рисование закрашенного эллипса) FillPie (рисование закрашенного сегмента эллипса) FillClosedCurve (рисование закрашенного сплайна) FillRegion (рисование закрашенной области типа Region).

Есть два отличия методов с префиксом Fill от одноименных методов с префиксом Draw. Прежде всего, методы с префиксом Fill рисуют закрашенные фигуры, а методы с префиксом Draw — не закрашенные. Кроме этого, в качестве первого параметра методам с префиксом Fill передается не перо класса Pen, а кисть класса SolidBrush.Ниже приведем пример выводящий закрашенный прямоугольник:

SolidBrush B=newSolidBrush(Color.DeepPink);

g.FillRectangle(B,0,0,100,100);

Как видете платформа .Net содержит большое число классов со многими методами и свойствами. Нет смысла описывать все классы, методы в каком либо учебнике или в данном пособии, поскольку по любому методу или классу можно получить MSDNсправку набрав наименование метода в среде VisualStudioи нажав на нем клавишу F1. Также, при наборе метода в редакотре кода среда показывает краткую справку о передаваемых параметрах.

9.5. Выполнение индивидуального задания

Изучите с помощью справки MSDNметоды и свойства классов Graphics, Color, Penи SolidBrush.Создайте собственное приложение выводящий на форму рисунок, состоящий из различных объектов (линий, многоугольников, эллипсов, прямоугольников и пр.), не закрашенных и закрашенных полностью. Используйте разные цветаи стили линий (сплошные, штриховые, штрих-пунктирные).

ЛАБОРАТОРНАЯ РАБОТА 10. Простейшая анимация

 Цель лабораторной работы: изучить возможности VisualStudioпо создание простейшей анимации. Написать и отладить программу, выводящую на экран анимационное изображение.

10.1. Работа с таймером

Класс для работы с таймером (Timer)формирует в приложении повторяющиеся события. События повторяются с переодичностью, указанной в милисекундах, в свойстве Interval. Установка свойства Enabled в значение trueзапускает таймер. Каждый тик таймера порождает событие Tick, обработчик которого обычно и создают в приложении. В этом обработчике могут изменятся каике либо величины, и вызватся принудительная перирисовка окна. Напоминаем, что вся отрисовка при создании анимации должна находится в обработчике события Paint.

10.2. Создание анимации

Для создании простой анимации достаточно использовать таймер, при тике которого будут изменятся параметры изображения (например, координаты концов отрезка) и обрабочки события Paintдля рисования по новым параметрам. При таком подходе не надо заботиться об удалении старого изображения (как в идеологии MSDOS), ведь оно создается в окне заново.

В качестве примера рассмотрим код анимации секундной стрелки часов:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace WindowsFormsApplication1

{

publicpartialclassForm1 : Form

{   //описываем переменные достыпные в любом обработчике событий класса Form1

privateint x1, y1, x2, y2, r;

privatedouble a;

privatePen pen = newPen(Color.DarkRed, 2);

public Form1()

       {

InitializeComponent();

       }

privatevoid Form1_Paint(object sender, PaintEventArgs e)

       {

Graphics g = e.Graphics;

g.DrawLine(pen, x1, y1, x2, y2); //рисуемсекунднуюстрелку

       }

privatevoid Form1_Load(object sender, EventArgs e)

{   //определяем цент экрана

           x1 = ClientSize.Width / 2;

y1 = ClientSize.Height / 2;

           r = 150; //задаемрадиус

a = 0;   //задаем угол поворота

//определяем конец часовой стрелки с учетом центра экрана

x2 = x1 + (int) (r * Math.Cos(a));

           y2 = y1 - (int) (r * Math.Sin(a));

       }

privatevoid timer1_Tick(object sender, EventArgs e)

{

           a -= 0.1;//уменьшаем угол на 0,1 радиану

//определяем конец часовой стрелки с учетом центра экрана

x2 = x1 + (int)(r * Math.Cos(a));

           y2 = y1 - (int)(r * Math.Sin(a));

Invalidate(); //вынудительный вызов перерисовки (Paint)

       }

   }

}

10.3. Движение по траектории

Движение по траектории реализуцется аналогично выше рассмотренному примеру. Для реализации движения по прямой приращиваются на определённые константы переменные, явлющиеся узовыми точками (в примере переменные x2, y2). Для задания более сложно траектории можно использовать различные параметрические кривые. В случае движения на плоскости обычно измению один параметр. Расмотрим пример реализации движения окружности по декартову листу.

Декартов лист — плоская кривая третьего порядка, удовлетворяющая уравнению в прямоуголной системе . Параметр  определяется как диагональ квадрата, сторона которого равна наибольшей хорде петли.

Рис. 10.1. Декартов лист

 

При переходе к параметрическому виду получаем:

,

где .

Программная реализация выглядет следующим образом:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace WindowsFormsApplication1

{

publicpartialclassForm1 : Form

   {

privateint x1, y1, x2, y2;

privatedouble a, t, fi;

privatePen pen = newPen(Color.DarkRed, 2);

public Form1()

       {

           InitializeComponent();

       }

privatevoid Form1_Load(object sender, EventArgs e)

       {

x1 = ClientSize.Width / 2;

           y1 = ClientSize.Height / 2;

           a = 150;

fi = -0.5;

           t = Math.Tan(fi);   

x2 = x1 + (int)((3 * a * t) / (1 + t * t * t));

           y2 = y1 - (int)((3 * a * t * t) / (1 + t * t * t));

       }

privatevoid Form1_Paint(object sender, PaintEventArgs e)

       {

Graphics g = e.Graphics;

g.DrawEllipse(pen, x2, y2, 20, 20);

       }

privatevoid timer1_Tick(object sender, EventArgs e)

       {

fi += 0.01;

           t = Math.Tan(fi);

x2 = x1 + (int)((3 * a * t) / (1 + t * t * t));

           y2 = y1 - (int)((3 * a * t * t) / (1 + t * t * t));

Invalidate();

       }

privatevoid button1_Click(object sender, EventArgs e)

{

       }

   }

}

Описание ряда интересных кривых для создания траектории движения можно найти в «Википедии» в статье «Циклоидальная кривая».

10.3. Выполнение индивидуального задания

Изучите с помощью справки MSDNметоды и свойства классов Graphics, Color, Penи SolidBrush.Создайте собственное приложение выводящий на форму рисунок, состоящий из различных объектов (линий, многоугольников, эллипсов, прямоугольников и пр.), не закрашенных и закрашенных полностью. Используйте разные цветаи стили линий (сплошные, штриховые, штрих-пунктирные).

  1. Создайте программу, показывающую пульсирующее сердце.
  2. Создайте приложение, отображающее вращающийся винт самолета.
  3. Разработайте программу анимации двигающегося человечка.
  4. Создайте программу, показывающуюдвижение окружности по синусойде.
  5. Создайте приложение, отображающее движение окружности по спирали.
  6. Разработайте программу анимации падения снежинки.
  7. Создайте программу, показывающую скачущий мячик.
  8. Создайте приложение, отображающее движение окружности вдоль границы окна. Учтите возможность изменения размеров окна.
  9. Разработайте программу анимации летающего бумеранга.
  10. Создайте программу, показывающую падение нескольких звезд одновременно.
  11. Создайте приложение, отображающее хаотичное движение звезды в окне.
  12. Разработайте программу анимации взлета ракеты. Старт осуществялется по нажатию специальной «красной» кнопки.
  13. Создайте программу, показывающую движение окружности вдоль многоугольника. Число вершин вводится пользователем до анимации.
  14. Создайте приложение, отображающее броуновское движение молекулы в окне.
  15. Разработайте программу анимации движения планет в солнейчной системе.
  16. Создайте программу, показывающую движение квадратика по траектории,состоящей из 100 точек, и хранящихся в специальном массиве.
  17. Создайте приложение, имитирующие механические часы.
  18. Разработайте программу анимации падения несколько листков с дерева. Движение не должно быть линейным.
  19. Создайте программу, показывающую движение окружности по спирале с плавно изменющейся сокростью.
  20. Создайте приложение, отображающее движение автомобиля с вращающимимся колесами.

ЛАБОРАТОРНАЯ РАБОТА 11. Обработка изображений

 Цель лабораторной работы: изучить возможности VisualStudioпо открытию и сохранению фалйов. Написать и отладить программу для обработки изображений.

11.1. Отображение графических файлов

Обычно для отображения точечных рисунков, рисунков из метафайлов, значков, рисунков из файлов в формате BMP, JPEG, GIF или PNG используется объект PictureBox, т.е.элемент управления PictureBox действует как контейнер для картинок. Можно выбрать изображение для вывода, присвоив значение свойству Image. Свойство Image может быть установлено в окне Свойства или в коде программы, указывая на рисунок, который следует отображать.

Элемент управления PictureBox содержит и другие полезные свойства, в том числе: AutoSize определяющее, будет ли изображение растянуто в элементе PictureBox, и SizeMode, которое может использоваться для растягивания, центрирования или увеличения изображения в элементе управления PictureBox.

Перед добавлением рисунка к элементу управления PictureBox в проект обычно добавляется файл рисунка в качестве ресурса5. После добавления ресурса к проекту можно повторно использовать его. Например, может потребоваться отображение одного и того же изображения в нескольких местах.

Необходимо отметить, что поле Imageсамо является классом для работы с изображениями, у которого есть свои методы. Например, метод FromFile используется для загрузки изображения из файла. Кроме класса Imageсуществует класс Bitmap, коотрый расширяет возможности класса Image за счет дополнительных методов для загрузки, сохранения и использования растровых изображений. Так метод Saveкласса Bitmapпозволяет сохранять изображения в разных форматах, а методы GetPixelиSetPixelпозволяют получить доступ к отдельным пикселям рисунка.

 

11.2. Компоненты OpenFileDialog и SaveFileDialog

Компонент OpenFileDialog является стандартным диалоговым окном. Он аналогичен диалоговому окну «Открыть файл» операционной системы Windows. Компонент OpenFileDialog позволяет пользователям просматривать папки личного компьютера или любого компьютера в сети, а также выбирать файлы, которые требуется открыть. Для вызова диалогового окна для выбора файла можно использовать метод ShowDialog() который возвращет trueпри корректном выборе.

Диалоговое окно возвращает путь и имя файла, который был выбран пользователем в специальном свойстве FileName.

11.3. Простой графический редактор

Создайте приложение, реализующее простой графический редактор. Функциями этого редактора должны быть: открытие рисунка, рисование поверх него простой кистью, сохранение рисунка в другой файл. Для этого создайте форму и разместите на ней элементы управления buttonи picturebox (рис 11.1).

Рис. 11.1. Форма для графического редактора

В этом случае на понадобится из панели элементов размещать на форме компоненты диалоговых окон OpenFileDialogи SaveFileDialog. Эти элементы будут порождены динамически в ходе выполнения программы с помощью конструтора. Например так:

OpenFileDialog dialog = newOpenFileDialog();

Далее они будут вызыватся с помощью метода ShowDialog().

Для кнопок «Открыть» и «Сохранить» создайте свои обработчики события. Также создайте обработчик события Loadдля формы. Для элемента управления picturebox1создайте обработчики события MouseDown, MouseMove.Код приложения будет выглядеть следующим образом:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.ComponentModel;

usingSystem.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace WindowsFormsApplication1

{

publicpartialclassForm1 : Form

{   //Объявляем переменные доступные в каждом обработчике события

privatePoint PreviousPoint, point; //Точка до перемещения курсора мыши и текущая точка

privateBitmap bmp;

privatePen blackPen;

privateGraphics g;

public Form1()

       {

InitializeComponent();

       }

privatevoid Form1_Load(object sender, EventArgs e)

{

           blackPen = newPen(Color.Black, 4); //подготавливаем перо для рисования

}

privatevoid button1_Click(object sender, EventArgs e)

       {   //открытиефайла

OpenFileDialog dialog = newOpenFileDialog(); //описываемипорождаемобъект dialog класса OpenFileDialog

//задаемрасширенияфайлов

           dialog.Filter = "Image files (*.BMP, *.JPG, *.GIF, *.TIF, *.PNG, *.ICO, *.EMF, *.WMF)|*.bmp;*.jpg;*.gif; *.tif; *.png; *.ico; *.emf; *.wmf";

if (dialog.ShowDialog() == DialogResult.OK)//вызываем диалоговое окно и проверяем выбран ли файл

           {

Image image = Image.FromFile(dialog.FileName); //Загружаем в image изображение из выбранного файла

int width = image.Width;

int height = image.Height;

               pictureBox1.Width = width;

               pictureBox1.Height = height;

bmp = newBitmap(image, width, height); //создаемизагружаемиз image изображениевформатье bmp

pictureBox1.Image = bmp; //записываем изображение в формате bmp в pictureBox1

               g = Graphics.FromImage(pictureBox1.Image); //подготавливаме объект Graphics для рисования в pictureBox1

}

       }

privatevoid pictureBox1_MouseDown(object sender, MouseEventArgs e)

{ // обработчик события нажатия кнопки на мыши

// записываем в предыдущую точку (PreviousPoint) текущие координаты

PreviousPoint.X = e.X;

           PreviousPoint.Y = e.Y;

       }

privatevoid pictureBox1_MouseMove(object sender, MouseEventArgs e)

{//Обработчик события перемещения мыши по pictuteBox1

if (e.Button == MouseButtons.Left) //Проверяем нажата ли левая кнопка мыши

{   //запоминаем в point текущее положение курсора мыши

point.X = e.X;

               point.Y = e.Y;

//соеденяем линией предыдущую точку с текущей

g.DrawLine(blackPen, PreviousPoint, point);

//текущее положение курсора мыши сохраняем в PreviousPoint

PreviousPoint.X = point.X;

               PreviousPoint.Y = point.Y;

pictureBox1.Invalidate();//Принудительновызываемпереррисовку pictureBox1

           }

       }

privatevoid button2_Click(object sender, EventArgs e)

{ //сохранениефайла

SaveFileDialog savedialog = newSaveFileDialog();//описываемипорождаемобъект savedialog

//задаем свойства для savedialog

           savedialog.Title = "Сохранить картинку как ...";

savedialog.OverwritePrompt = true;

           savedialog.CheckPathExists = true;

           savedialog.Filter =

"Bitmap File(*.bmp)|*.bmp|" +

"GIF File(*.gif)|*.gif|" +

"JPEG File(*.jpg)|*.jpg|" +

"TIF File(*.tif)|*.tif|" +

"PNG File(*.png)|*.png";

           savedialog.ShowHelp = true;

// If selected, save

if (savedialog.ShowDialog() == DialogResult.OK)//вызываемдиалоговоеокноипроверяемзаданолиимяфайла

{

// в строку fileName записываем указанный в savedialog полный путь к файлу

string fileName = savedialog.FileName;

// Убираем из имени три последних символа (расширение файла)

string strFilExtn =

fileName.Remove(0, fileName.Length - 3);

// Сохраняем файл в нужном формате и с нужным расширением

switch (strFilExtn)

               {

case"bmp":

bmp.Save(fileName, System.Drawing.Imaging.ImageFormat.Bmp);

break;

case"jpg":

bmp.Save(fileName, System.Drawing.Imaging.ImageFormat.Jpeg);

break;

case"gif":

bmp.Save(fileName, System.Drawing.Imaging.ImageFormat.Gif);

break;

case"tif":

bmp.Save(fileName, System.Drawing.Imaging.ImageFormat.Tiff);

break;

case"png":

bmp.Save(fileName, System.Drawing.Imaging.ImageFormat.Png);

break;

default:

break;

               }

           }

       }

   }

}

Далее добавим в проект кнопку для перевода изображения в градации серого цвета:

privatevoid button3_Click(object sender, EventArgs e)

{   //циклы для перебора всех пикселей на изображении

for (int i = 0; i < bmp.Width; i++)

for (int j = 0; j < bmp.Height; j++)

{

int R = bmp.GetPixel(i, j).R; //извлекаем в R значение красного цвета в текущей точке

int G = bmp.GetPixel(i, j).G; //извлекаем в G значение зеленого цвета в текущей точке

int B = bmp.GetPixel(i, j).B; //извлекаем в B значение синего цвета в текущей точке

int Gray = (R = G + B)/3; // высчитываем среденее арифметическое трех каналов

Color p = Color.FromArgb(255, Gray, Gray, Gray); //переводим int в значение цвета. 255 - показывает степень прозрачности.остальные значения одинаковы для трех каналов R,G,B

                   bmp.SetPixel(i, j, p); //записываме полученный цвет в текущую точку

               }

           Refresh(); //вызываем функцию перерисовки окна

       }

Данный код демонстрирует возможность обращения к отдельным пикселям. Цвет каждого пикселя хранится в модели RGBи состоит из трех состовляющих: красного, зеленого и синего цвета, называемых каналами. Значение каждого канала может варьироваться в диапазоне от 0 до 255.

11.4. Выполнение индивидуального задания

Добавте в приведенный графический редактор свои функции в соотвествии с вариантом.

  1. Расширьте приложение путем добавления возможности выбора пользователем цвета и велечины кисти.
  2. Разработайте функцию, добавляющую на изображение 1000 точек с координатами заданными случайным образом. Цвет, также, задается случайным образом.
  3. Создайте функцию, переводящую изображение в черно-белый формат.Пороговое значение задавать с помощью элемента управления TrackBar.
  4. Разработайте функцию, оставляющую на изображении только один из каналов (R,G,B). Канал выбирается пользователем.
  5. Создайте функцию, выводящую на изображение окружность. Центр окружности совпадает с центром изображения. Все точки вне окружности переводятся в градации серого цвета. Все точки внутри окружности остаются неизменными. Радиус окружности задается пользователем.
  6. Создайте функцию, выводящую на изображение треугольник. Для всех точек вне треугольника оставте только канал B. Все точки внутри треугольника переводятся в градации серого цвета.
  7. Создайте функцию, выводящую на изображение ромб. Все точки вне ромба переводятся в градации серого цвета. Для всех точек внутри ромба оставте только канал G.
  8. Разработайте функцию, которая каждую четную строку изображения переводит в градации серого цвета.
  9. Разработайте функцию, которая переводит каждый нечетный столбец пикселей (вертикальные линии) в градации серого цвета.
  10. Создайте функцию, разбивающую изображение на четыре равные части. В каждой оставте значение только одного канала R,Gи B, а в четвертой выведите градации серого цвета.
  11. Разработайте функцию, заменяющую все точки синего цвета на точки красного цвета.
  12. Создайте функцию, инвертирующую  изображение в градациях серого цвета в негатив.
  13. Создайте функцию, изменяющую яркость изображения. Путем прибавления или уменьшения заданной пользователем величины к каждому каналу.
  14. Создайте функцию, переводящую изображение в черно-белый формат в соответсвии с пороговым значением, которое ввел пользователь. Для анализа используйте только один из каналов (R,G,B).
  15. Разработайте функцию для создания эффекта мозаики. При этом изображения разбивается на прямоугольные фрагменты, в каждом из которых выбирается цвет средней точки и этим же цветом закрашивается весь фрагмент.
  16. Разработайте функцию,  разбивающую изображение на фрагменты, в каждом из которых остается только один из каналов (R, G, B).

ЛАБОРАТОРНАЯ РАБОТА 12. МЕТОДЫ

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

12.1. Общие понятия

Метод – это элемент класса, который содержит программный код. Метод имеет следующую структуру:

[атрибуты] [спецификторы] тип имя ([параметры])

{

   Тело метода;

}

 

Атрибуты – это особые указания компилятору на свойства метода. Атрибуты используются редко.

Спецификаторы – это ключевые слова, предназначенные для разных целей, например:

  1. Определяющие доступность метода для других классов:
  2.  private–метод будет доступен только внутри этого класса
  3.  protected – метод будет доступен также дочерним классам
  4.  public – метод будет доступен любому другому классу, который может получить доступ к данному классу
  5. Указывающие доступность метода без создания класса
  6. Задающие тип

Тип определяет результат, который возвращает метод: это может быть любой тип, доступный в C#, а также ключевое слово void, если результат не требуется.

Имя метода – это идентификатор, который будет использоваться для вызова метода. К идентификатору применяются те же требования, что и к именам переменных: он может состоять из букв, цифр и знака подчёркивания, но не может начинаться с цифры.

Параметры – это список переменных, которые можно передавать в метод при вызове. Каждый параметр состоит из типа и названия переменной. Параметры разделяются запятой.

Тело метода – это обычный программный код, за исключением того, что он не может содержать определения других методов, классов, пространств имён и т. д. Если метод должен возвращать какой-то результат, то обязательно в конце должно присутствовать ключевое слово returnс возвращаемым значением. Если возвращение результатов не нужно, то использование ключевого слова returnне обязательно, хотя и допускается.

Примерметода, вычисляющеговыражение:

publicdouble Calc(double a, double b, double c)

{

if (a > b)

returnMath.Sin(a) * Math.Cos(b);

else

   {

double k = Math.Tan(a * b);

return k * Math.Exp(c / k);

}

}

12.2. Перегрузка методов

Язык C# позволяет создавать несколько методов с одинаковыми именами, но разными параметрами. Компилятор автоматически подберёт наиболее подходящий метод при построении программы. Например, можно написать два отдельных метода возведения числа в степень: для целых чисел будет применяться один алгоритм, а для вещественных – другой:

///<summary>

/// Вычисление X в степени Y для целых чисел

///</summary>

privateint Pow(int X, int Y)

{

int b = 1;

while (Y != 0)

if (Y % 2 == 0)

       {

           Y /= 2;

           X *= X;

       }

else

       {

           Y--;

b *= X;

}

return b;

}

///<summary>

/// Вычисление X в степени Y для вещественных чисел

///</summary>

privatedouble Pow(double X, double Y)

{

if (X != 0)

returnMath.Exp(Y * Math.Log(Math.Abs(X)));

elseif (Y == 0)

return 1;

else

return 0;

}

Вызывается такой код одинаково, разница лишь в параметрах – в первом случае компилятор вызовет метод Powс целочисленными параметрами, а во втором – с вещественными:

Pow(3, 17);

Pow(3.0, 17.0);

12.3. Параметры по умолчанию

Язык C# начиная с версии 4.0 (VisualStudio 2010) позволяет задавать некоторым параметрам значения по умолчанию – так, чтобы при вызове метода можно было опускать часть параметров. Для этого при реализации метода нужным параметрам следует присвоить значение прямо в списке параметров:

privatevoid GetData(int Number, int Optional = 5)

{

Console.WriteLine("Number: {0}", Number);

Console.WriteLine("Optional: {0}", Optional);

}

В этом случае вызывать метод можно следующим образом:

GetData(10, 20);

GetData(10);

В первом случае параметр Optionalбудет равен 20, так как он явно задан, а во втором будет равен 5, т.к. явно он не задан и компилятор берёт значение по умолчанию.

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

privatevoid GetData(int Optional = 5, int Number)

12.4. Передача параметров по значению и по ссылке

Когда параметры передаются в метод обычным образом (без дополнительных ключевых слов refи out), любые изменения параметров внутри метода не влияют на его значение в основной программе. Предположим, унасестьследующийметод:

privatevoidCalc(intNumber)

{

Number = 10;

}

Видно, что внутри метода происходит изменение переменной Number, которая была передана как параметр. Попробуемвызватьметод:

intn = 1;

Calc(n);

Console.WriteLine(n);

На экране появится число 1, то есть, не смотря на изменение переменной в методе Calc, значение переменной в главной программе не изменилось. Это связано с тем, что при вызове метода создаётся копия переданной переменной, именно её изменяет метод. При завершении метода значение копий теряется. Такой способ передачи параметра называется передачей по значению.

Чтобы метод мог изменять переданную ему переменную, её следует передавать с ключевым словом ref–оно должно быть как в сигнатуре метода, так и при вызове:

privatevoidCalc(ref int Number)

{

Number = 10;

}

intn = 1;

Calc(ref n);

Console.WriteLine(n);

 В этом случае на экране появится число 10: изменение значения в методе сказалось и на главной программе. Такая передача метода называется передачей по ссылке, т.е. передаётся уже не копия, а ссылка на реальную переменную в памяти.

Если метод использует переменные по ссылке только для возврата значений и ему не важно что в них было изначально, то можно не инициализировать такие переменные, а передавать их с ключевым словом out. Компилятор понимает, что начальное значение переменной не важно и не ругается на отсутствие инициализации:

privatevoidCalc(outint Number)

{

Number = 10;

}

intn;// Ничего не присваиваем!

Calc(outn);

12.5. Выполнение индивидуального задания

  1. Написать метод min(x, y), находящий минимальное значение из двух чисел. С его помощью найти минимальное значение из четырёх чисел a, b, c, d.
  2. Написать метод max(x, y), находящий максимальное значение из двух чисел. С его помощью найти максимальное значение из четырёх чисел a, b, c, d.
  3. Написать метод, вычисляющий значение n/xn. С его помощью вычислить выражение:
  4. Написать метод, вычисляющий значение n/xn. С его помощью вычислить выражение:
  5. Написать метод, вычисляющий значение xn/(n+x). С его помощью вычислить выражение:
  6. Написать метод, вычисляющий значение sin(x) + cos(2 * x). С его помощью определить в какой из точек a, bили с значение будет минимальным.
  7. Написать метод, вычисляющий значение x2 + y2. С его помощью определить с какой парой чисел (a, b) или (с, d) значение будет максимальным.
  8. Написать метод, вычисляющий значение x2 * y3 * . С его помощью определить с какой тройкой чисел (a, b, c) или (d, e, f) значение будет максимальным.
  9. Написать метод, который у чётных чисел меняет знак, а нечётные числа оставляет без изменения. С его помощью обработать ряд чисел от 1 до 10.
  10. Написать метод, который положительные числа возводит в квадрат, а отрицательные – в куб. С его помощью обработать ряд чисел от -10 до 10.
  11. Написать метод, который вычисляет значения x=sin2(a) и y=cos2(a). Напечатать таблицу значений от –πдоπ с шагом π/4.
  12. Написать метод, который вычисляет значения x=a2и y=. Напечатать таблицу значений от –10до 10 с шагом 1.
  13. Написать метод, который в переданной строке заменяет все точки на многоточие. С его помощью обработать пять разных строк и отобразить их на экране.
  14. Написать метод, который в переданной строке заменяет все строчные буквы на заглавные и наоборот. С его помощью обработать пять разных строк и отобразить их на экране.
  15. Написать метод, который разделяет переданную строку на две отдельных строки: первая содержит исходную строку до первой точки, а вторая – исходную строку после первой точки. С его помощью обработать пять разных строк и отобразить результаты на экране.

ЛАБОРАТОРНАЯ РАБОТА 13. СОРТИРОВКА

 Цель лабораторной работы: освоить основные алгоритмы сортировки, написать программу с использованием этих алгоритмов.

13.1. Общие понятия

Сортировка – это процесс упорядочения элементов массива или списка по возрастанию или убыванию.

Существует много алгоритмов сортировки, отличающихся по ряду характеристик:

  1. Время работы, или вычислительная сложность – количество операций, затрачиваемых алгоритмом. Обычно оценивается худший сценарий, когда исходный массив оказывается максимально неупорядочен с точки зрения алгоритма.
  2. Затрачиваемая память (помимо исходного массива) – некоторые алгоритмы требуют выделения дополнительной памяти для временного хранения данных или формирования нового выходного массива.

Кроме того, алгоритмы можно разделить по типу доступа к данным:

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

13.2. Алгоритмы сортировки. Метод пузырька

Данный алгоритм является достаточно простым и поэтому получил широкое распространение. Вычислительная сложность алгоритма квадратичная – O(n2), поэтому алгоритм эффективен только на небольших массивах данных.

Алгоритм проходит все элементы массива и попарно сравнивает их друг с другом. Если порядок сравниваемых элементов неверный, алгоритм меняет элементы местами:

// Сортировкапузырьком

void BubbleSort(refint[] Array)

{

// Перебираем все элементы массива (кроме последнего)

for (int i = 0; i < Array.Length - 1; i++)

// Перебираем все элементы справа от i

for (int j = i + 1; j < Array.Length; j++)

// Правильный ли порядок элементов?

if (Array[i] > Array[j])

           {

// Нет - меняем порядок

int t = Array[i];

Array[i] = Array[j];

               Array[j] = t;

}

}

13.3. Сортировка выбором

Сортировка выбором имеет квадратичную сложность O(n2) и, как и предыдущий метод пузырька, эффективен лишь на небольших объемах данных.

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

// Сортировкавыбором

void SelectionSort(refint[] Array)

{

// Перебираем все элементы массива (кроме последнего)

// i - позиция первого неотсортированного элемента

for (int i = 0; i < Array.Length - 1; i++)

   {

// Позиция минимального элемента справа от i

int min = i;

// Перебираем все элементы справа от i

for (int j = i + 1; j < Array.Length; j++)

// Меньше ли очередной элемент минимального?

if (Array[j] < Array[min])

min = j; // Да - теперь это новый минимальный элемент

// Минимальный элемент не на первом месте? Меняем местами!

if (min != i)

{

int t = Array[i];

           Array[i] = Array[min];

Array[min] = t;

       }

   }

}

13.4. Быстрая сортировка

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

  1. Выбирается некоторый элемент, который называется опорным.
  2. Реорганизуем массив таким образом, чтобы все элементы, меньшие или равные опорному элементу, оказались слева от него, а все элементы, большие опорного — справа от него.
  3. Рекурсивно упорядочиваем массивы, лежащие слева и справа от опорного элемента.

// Быстраясортировка

void QuickSort(refint[] Array, int Left, int Right)

{

// i и j - индексы границ разделяемого массива

int i = Left;

int j = Right;

// x - индексопорногоэлемента

int x = Array[(Left + Right) / 2];

do

{

// Ищем элемент слева, который больше опорного

while (Array[i] < x)

           ++i;

// Ищем элемент справа, который меньше опорного

while (Array[j] > x)

           --j;

// Если индексы не поменялись местами, то обмениваем элементы

if (i <= j)

       {

int t = Array[i];

           Array[i] = Array[j];

           Array[j] = t;

i++;

           j--;

       }

} while (i <= j);

// Рекурсивно выполняем быструю сортировку для массивов слева и справа

if (Left < j)

QuickSort(ref Array, Left, j);

if (i < Right)

QuickSort(ref Array, i, Right);

}

13.5. Поиск элемента

Алгоритмы поиска позволяют найти индекс элемента с требуемым значением.

Если массив не упорядочен, то возможен лишь простой поиск: перебор всех элементов массива до тех пор, пока не встретится элемент с нужным значением или не закончится массив. Если элемент найден, поиск должен быть прекращён, поскольку дальнейший просмотр массива не имеет смысла:

// Простойпоискэлементавмассиве

intIndexOf(refint[] Array, intValue)

{

// Перебираем все элементы массива

for (int i = 0; i < Array.Length; i++)

// Если нашли нужное значение, то возвращаем его индекс

if (Array[i] == Value)

return i;

// Перебор закончился безрезультатно - возвращаем -1

return -1;

}

Если алгоритм поиска не нашёл подходящий элемент, он должен каким-то образом сигнализировать об этом вызывающей программе. Чаще всего в таком случае возвращается значение -1 – число, которое заведомо не может использоваться в качестве индекса массива.

Вычислительная сложность алгоритма простого поиска – линейная O(n).

Если же массив упорядочен по возрастанию, то возможно использование дихотомического рекурсивного алгоритма: массив каждый раз делится пополам и если искомый элемент меньше среднего, то поиск продолжается в левой его половине, иначе – в правой:

// Дихотомическийпоискэлементавмассиве

staticint IndexOf(refint[] Array, int Value, int Left, int Right)

{

// Находим середину диапазона

int x = (Left + Right) / 2;

// Если нашли значение - возвращаем его индекс

if (Array[x] == Value)

return x;

// Если середина совпадает с левой или правой границами - значение не найдено

if ((x == Left) || (x == Right))

return -1;

// Продолжаем поиск слева или справа от середины

if (Array[x] < Value)

return IndexOf(ref Array, Value, x, Right);

else

return IndexOf(ref Array, Value, Left, x);

}

Вычислительная сложность алгоритма – логарифмическая.

13.6. Выполнение индивидуального задания

Общая часть задания: сформировать массив из 100 случайных чисел. Выполнить простой поиск элемента, подсчитать количество итераций. Отсортировать массив методом, указанным в своём варианте. Выполнить поиск элемента методом дихотомии, подсчитать количество итераций. Сделать выводы.

  1. Метод пузырька
  2. Сортировка выбором
  3. Быстрая сортировка

ЛАБОРАТОРНАЯ РАБОТА 14. РЕКУРСИВНЫЕ МЕТОДЫ

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

14.1. Общие понятия

Рекурсивным называют метод, если он вызывает сам себя в качестве вспомогательного. В основе рекурсивного метода лежит так называемое "рекурсивное определение" какого-либо понятия. Классическим примером рекурсивного метода является метод, вычисляющий факториал.

Из курса математики известно, что 0!=1!=1, n!=1*2*3…*n. С другой стороны n!=(n-1)!*n. Таким образом, известны два частных случая параметра n, а именно n= 0 и n=1, при которых мы без каких-либо дополнительных вычислений можем определить значение факториала. Во всех остальных случаях, то есть для n>1, значение факториала может быть вычислено через значение факториала для параметра n-1. Таким образом, рекурсивный метод будет иметь вид:

{

  static long F(int n)  //рекурсивный метод

  {

     if (n==0 || n==1)

      return 1;    //нерекурсивная ветвь

      else return n*F(n-1);  //шаг рекурсии - повторный вызов метода с другим параметром

}

static void Main()

   {

Console.Write("n=");

int n =int.Parse( Console.ReadLine());

long f=F(n); //нерекурсивный вызов метода F

      Console.WriteLine("{0}!={1}",n, f);

     }

}

Рассмотрим работу описанного выше рекурсивного метода для n=3.

Рис. 14.1. Структура рекурсивных вызывов

Первый вызов метода осуществляется из метода Main, в нашем случае командой f=F(3). Этап вхождения в рекурсию обозначим жирными стрелками. Он продолжается до тех пор, пока значение переменной n не становится равной 1. После этого начинается выход из рекурсии (тонкие стрелки). В результате вычислений получается, что F(3)=3*2*1.

Рассмотренный вид рекурсии называют прямой. Метод с прямой рекурсией обычно содержит следующую структуру:

if (<условие>)  

<оператор>;

else <вызов данного метода с другими параметрами>;

В качестве <условия> обычно записываются некоторые граничные случаи параметров, передаваемых рекурсивному методу, при которых результат его работы заранее известен, поэтому далее следует простой оператор или блок, а в ветви else происходит рекурсивный вызов данного метода с другими параметрами.

Что необходимо знать для реализации рекурсивного процесса? Со входом в рекурсию осуществляется вызов метода, а для выхода необходимо помнить точку возврата, т.е. то место программы откуда мы пришли и куда нам нужно будет возвратиться после завершения метода. Место хранения точек возврата называется стеком вызовов и для него выделяется определенная область оперативной памяти. В этом стеке запоминаются не только адреса точек возврата, но и копии значений всех параметров. По этим копиям восстанавливается при возврате вызывающий метод. При развертывании рекурсии за счет создания копий параметров возможно переполнение стека. Это является основным недостатком рекурсивного метода. С другой стороны, рекурсивные методы позволяют перейти к более компактной записи алгоритма.

Следует понимать, что любой рекурсивный метод можно преобразовать в обычный метод с использованием циклов. И практически любой метод можно преобразовать в рекурсивный, если выявить рекуррентное соотношение между вычисляемыми в методе значениями.

Рассмотрим пример кода для создания набора самоподобных стуктур. В нашем случае это будет набор увеличивающихся квадратов (рис. 14.2.).

Рис. 14.2. Набор квадратов

При проектировании данной программы были созданы два метода:

privatevoid MyDraw(Graphics g, int N, int x, int y)

{

if (N == 0) return;

else

{//отрисовка прямоугольника

g.DrawRectangle(newPen(Brushes.Blue, 2), 0, 0, x, y);

x += 50;//увеличение xна 50

y += 50;//увеличение yна 50

N--;

MyDraw(g, N, x, y); //рекурсивный вызов с новыми параметрами

}

       }

privatevoid Form1_Paint(object sender, PaintEventArgs e)

       {

Graphics g = e.Graphics;

MyDraw(g, 7, 50, 50);//первый вызов метода и вход в рекурсию

}

Координаты левого верхнего угла всех прямоугольников не изменны и находятся в точке (0, 0). Поэтому в параметрах метода MyDrawдостаточно передавать xи yдля правого нижнего угла. Также в параметрах передается N, значение которой определяет текущую вложенность рекурсии (сколько вызывов рекурсии еще будет).

14.2. Формирование задержки с помощью таймера

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

1. Вывод графического элемента;

2. Задержка на nмиллисекунд;

3. Повторение 1 и 2 этапа до вывода всех графических элементов.

Реализация задержки с помощью таймера возможна следующим способом:

privateboolflag=false; //описываемполеflagдоступное во всех методах класса

...

//далее следует часть программы, где необходимо организовать задержку

timer1.Enabled = true; //включаем таймер

flag = true; //устанавливаем flagв значение true

while (flag); //организуем бесконечный цикл

timer1.Enabled = false;//выключаем таймер после выхода из цикла

//обработчиктикатаймера

privatevoid timer1_Tick_1(object sender, EventArgs e)

{

flag = false; //сбрасываемflagвзначениеfalse

}

Идея данного подхода заключается в организации бесконечного цикла, который будет проверять значение некого флага. Однако значение флага может изменится при наступлении события Tickтаймера, то есть через заданый в таймере промежуток времени. Однако бесконечный цикл, описанный выше, останется бесконечным и программа просто зависнет. В чем же дело? Дело в том, что при такой организации цикла программа не может опросить очередь сообщений в которое и будет поступать в том числе и событие Tick от таймера. Тем самым мы не попадем никогда в обработчки события timer1_Tick_1. Что бы решить данную проблему надо в теле цикла написать Application.DoEvents(), что фактически будет заставлять приложение опрашивать очередь сообщений и в свою очередь приведет к срабатыванию обработчкиа события timer1_Tick_1.

Для допуска к выполнению индивидуального задания по лабораторной работе, разарботайте приложение строящее ряд увеличивающихся квадратов (рис. 14.2). Квадраты выводятся последовательно через одну секунду.

14.3. Выполнение индивидуального задания

  1. Напишите приложение,  которое строит ряд окружностей. Центр окружностей совпадает с центром экрана. Число окружностей задается при первом вызове рекурсивного метода.

  1. Напишите приложение,  которое строит ряд квадратов. Центр квадратов совпадает с центром экрана. Число квадратов задается при первом вызове рекурсивного метода.

  1. Напишите приложение,  которое строит ряд окружностей по диагонали. Число окружностей задается при первом вызове рекурсивного метода.

  1. Напишите приложение,  которое строит ряд увеличивающихся окружностей по диагонали. Число окружностей задается при первом вызове рекурсивного метода.

  1. Напишите приложение,  которое строит ряд окружностей, центры которых лежат на окружности. Число окружностей задается при первом вызове рекурсивного метода.

  1. Напишите приложение,  которое строит ряд квадратов, центры которых лежат на окружности. Число квадратов задается при первом вызове рекурсивного метода.

  1. Напишите приложение,  которое строит ряд увеличивающихся окружностей, центры которых лежат на окружности. Число окружностей задается при первом вызове рекурсивного метода.

  1. Напишите приложение,  которое строит ряд увеличивающихся окружностей, центры которых лежат на спирали. Число окружностей задается при первом вызове рекурсивного метода.

  1. Вычислить, используя рекурсию, выражение:

  1. Напишите приложение,  которое строит ряд окружностей. Число окружностей удваивается на каждом шаге (в рекурсивном методе происходит два рекурсивных вызова). Центры окружностей выбираются каждый раз произвольно (случайно). Линии связывают центры окружностей «предка» и «порожденных» от нее.Число рекурсий задается при первом вызове рекурсивного метода.

  1. Напишите приложение,  которое строит ряд увеличивающихся окружностей. Число окружностей удваивается на каждом шаге (в рекурсивном методе происходит два рекурсивных вызова). Центры окружностей выбираются каждый раз произвольно (случайно). Толщина линий также увеличивается. Число рекурсий задается при первом вызове рекурсивного метода.

  1. Напишите приложение,  которое строит ряд уменьщаюшихся окружностей. Число окружностей удваивается на каждом шаге (в рекурсивном методе происходит два рекурсивных вызова). Число рекурсий задается при первом вызове рекурсивного метода.

  1. Напишите приложение,  которое строит приведенное ниже изображение. Число рекурсий задается при первом вызове рекурсивного метода. На каждом шаге происходит учетверение числа окружностей (в рекурсивном методе происходит четыре рекурсивных вызова).

  1. Постройте ковер Серпинского.

15. Индивидуальные задания повышенной сложности

Для решения геометрических задач повышенной сложности необходимо:

1) знать, как представляются на плоскости такие геометрические объекты, как точка, прямая, отрезок и окружность (в рамках подготовки к школьным олимпиадам можно ограничиться плоскостью, хотя про пространство также не следует забывать);

2) уметь находить уравнение прямой, соединяющей две заданные точки;

3) уметь определять координаты точки пересечения двух прямых;

4) знать, как провести перпендикуляр к прямой или определить, являются ли прямые параллельными;

5) уметь находить скалярное и векторное прооизведение;

6) находить площадь многоугольника;

7) уметь работать с фигурами на плоскости.

Напомним основные моменты, связанные с этими понятиями.

Каждую точку плоскости можно считать вектором с началом в точке (0,0).  Обозначим через a=(x, y) вектор с координатами (x, y).  Длина вектора (его модуль) вычисляется по формуле .

x

y

a

b

φ

y1

y2

x1

x2

Рис. 15.1. Иллюстрация к скалярному произведению векторов

Скалярное произведение двух векторов – это число, равное произведению модулей этих векторов на косинус угла между ними, (a,b)=|a| ∙ |b| ∙ cos φ. Если вектор a имеет координаты (x1, y1),а вектор bкоординаты – (x2, y2), то скалярное произведение вычисляется по формуле (a,b)=x1 x2 + y1 y2.

Заметим, что если угол φ острый, то скалярное произведение (a,b)>0, если угол φ тупой, то (a,b)<0. Если два вектора перпендикулярны, то их скалярное произведение равно нулю.

Векторным произведением двух векторов  aиb называется вектор [a × b], такой, что

длина его равна |[a × b]|=|a| ∙ |b| ∙ sin φ;

вектор [a× b] перпендикулярен векторам aиb;

вектор [a× b] направлен так, что из его конца кратчайший поворот от aк b виден происходящим против часовой стрелки.

Длина векторного произведения равна площади параллелограмма, построенного на векторах aиb.

Через координаты векторов aиb векторное произведение выражается следующим образом:

[a× b]== (y1 z2 z1 y2) i + (x1 z2 z1 x2) j + (x1 y2 y1 x2) k,

где i, j, k – единичные вектора осей Ox, Oy, Oz соответственно.

x

y

a

b

α

β

Рис. 15.1. Иллюстрация к ветороному произведению

При решении задач на плоскости координаты z1 и z2 равны нулю. В этом случае [a× b]=(x1 y2 - x2 y1)∙ k.

Если вектор a образует с осью Ох угол α, а вектор b – угол β, то для скалярного произведения  справедлива формула [a× b]=(|a|∙ |b| ∙ sin(β-α))∙ k. Это означает, что для ненулевых векторов векторное произведение равно нулю тогда и только тогда, когда векторы параллельны. Если поворот от вектораа к вектору b по наименьшему углу выполняется против часовой стрелки, то [× b]>0, если по часовой стрелке, то [× b]<0.

Рассмотрим задачи, при решении которых используются скалярное и векторное произведения.

Задача 1«Штраф за левые повороты» [1]. В городе Х водителям запрещено выполнять левые повороты. За каждый такой поворот водитель должен уплатить штраф в размере М рублей. Для слежки за водителями в городе установлена компьютерная система, фиксирующая координаты автомобиля в начале движения, в конце движения и во время поворота.

Исходные данные: N – количество зафиксированных координат автомобиля, (xi, yi) – координаты автомобиля в процессе движения, i=1,2, …, N, где (x1, y1) – точка начала движения, (xN, yN) – последняя точка маршрута автомобиля.

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

Траекторию движения автомобиля можно представить в виде ломаной, состоящей из направленных отрезков из точек (xi, yi) в точки (xi+1, yi+1), i=1,2,…,N-1.Поворот считается левым, если направление текущего отрезка пути ai+1 меняется относительно предыдущего отрезка ai в левую сторону, т.е. против часовой стрелки.

(xi-1,  yi-1)

(xi,  yi)

(xi+1,  yi+1)

Таким образом, решение задачи сводится к вычислению количества пар участков пути ai и ai+1, для которых выполняется условие [ai × ai+1]>0. Координаты векторов ai и ai+1 вычисляются через координаты точек (xi, yi): ai=(xi- xi-1, yi- yi-1), ai+1=(xi+1 - xi, yi+1 - yi), следовательно,

[ai × ai+1]= (xi - xi-1) (yi+1- yi) – (yi - yi-1)(xi+1 - xi), i=2, …, N-1.

Задание 1. Реализуйте программно задачу «Штраф за левые повороты»

Задача 2«Здесь будет город-сад». Жители одного дома города Х решили высадить у себя во дворе несколько деревьев. Так как жильцы не смогли договориться, как должны быть расположены посадки, то каждый посадил дерево в том месте двора, где ему захотелось. После проведения посадок полученный сад решили обнести забором. Но пока доски не привезли, деревья обвязали одной длинной веревкой.

Исходная информация: N – количество деревьев в саду, (xi, yi) – координаты деревьев, i=1,2, …, N. Так как были высажены молодые саженцы, то их толщиной можно пренебречь.

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

Эта и подобные ей задачи сводятся к определению для заданного множества точек на плоскости выпуклой оболочки, то есть выпуклого многоугольника с вершинами в некоторых точках из заданного множества, охватывающего все его точки. В [2] приведено несколько вариантов решения такой задачи с учетом временных затрат на выполнение алгоритмов. Здесь мы рассмотрим способ, использующий свойства скалярного произведения векторов.

Будем строить выпуклую оболочку в порядке обхода участка по часовой стрелке. Найдем самую левую точку М0=(x0, y0), x0=min{xi}. Если таких точек несколько, то возьмем самую нижнюю из них. Эта точка наверняка принадлежит искомой выпуклой оболочке. Зададим первоначальный вектор a0 с началом в точке (x0, y0), параллельный оси Oy.

Следующей точкой оболочки будет такая точка М1, чтобы вектор a1 с началом в точке М0 и концом в точке М1 образовывал с первоначальным вектором a0 минимальный угол. Если таких точек несколько, то выбирается точка, расстояние до которой максимально.

Далее процесс продолжаем, то есть ищем точку М2 с минимальным углом между вектором a1 и вектором a2 с началом в точке М1 и концом в точке М2, затем точку М3 и т.д. Процесс прекращаем, когда дойдем до первой выбранной точки или количество точек в оболочке станет равно N.

Для определения угла между векторами используется скалярное произведение. Причем сам угол можно не вычислять, так как минимальному углу соответствует максимальный косинус угла.

Задание 2. Реализуйте программно задачу «Здесь будет город-сад»

Задача 3 «Заяц» [3]. Недалеко от города Х находится зоосад. Здешний житель, заяц, хаотично прыгая, оставил след в виде замкнутой самопересекающейся ломаной, охватывающей территорию его владения. Найти площадь минимального по площади выпуклого многоугольника, описанного вокруг этой территории.

В данной задаче необходимо не только найти выпуклую оболочку множества точек, но и вычислить площадь выпуклого многоугольника с заданным набором вершин.

Исходные данные: N – количество вершин выпуклого многоугольника, (xi, yi) – координаты вершин, i=1,2, …, N.

Требуется определить площадь выпуклогоN-угольника.

Площадь N-угольника может быть вычислена как сумма площадей треугольников, из которых N-угольник составлен. Для нахождения площади треугольника используем векторное произведение. Длина векторного произведения векторов, как известно, равна удвоенной площади треугольника, построенного на этих векторах. Пусть вершины треугольника расположены в точках A=(x1, y1), B=(x2, y2), C=(x3, y3). Совместим начало координат с первой точкой. Векторное произведение равно

[AB × AC]=,

следовательно, площадь треугольника равна

SABC=1/2 ((x2- x1) (y3y2) – (y2- y1)(x3- x2)).

Значение величины SABC может быть как положительным, так и отрицательным числом, так как оно зависит от взаимной ориентации векторов AB и AC, поэтому говорят, что площадь ориентированная.

А1

А2

А3

А4

А5

Для нахождения площади N-угольника последний требуется разбить на треугольники и найти сумму ориентированных площадей этих треугольников. Разбиение N-угольника на треугольники можно провести так: зафиксировать одну из вершин N-угольника, например, первую A1=(x1, y1) и рассматривать все треугольники  A1AiAi+1, i=2, 3,…, N-1.

Заметим, что аналогичным способом можно находить площадь произвольного многоугольника.

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

Задание 3. Реализуйте программно задачу «Заяц»

Задача 4 «Тигр в загоне». Недалеко от города Х находится заповедник, в котором обитают уссурийские тигры. Работники заповедника очень переживают, когда тигр покидает охраняемую зону. Программа охраны уссурийских тигров предусматривает снабжение каждого тигра ошейником с радиомаяком. Сигнал от тигриного радиомаяка поступает в центр охраны и позволяет определить местоположения тигра. Территория заповедника представляет собой произвольный многоугольник.

Исходные данные: N – количество вершин многоугольника, задающего заповедник, (xi, yi) – координаты его вершин, i=1,2, …, N. (X, Y) – координаты точки, в которой находится тигр.

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

Очень часто при решении задач геометрического содержания требуется проверить, лежит ли заданная точка внутри или вне многоугольника. Таким способом можно решить, например, задачу о Бармаглоте, проверяя каждую точку Бармаглота относительно одеяла-многоугольника. Есть много способов проверки принадлежности точки многоугольнику, однако мы приведем здесь один из них, основанный на использовании произведения векторов.

P

Q

Идея метода заключается в том, чтобы определить сумму углов, под которыми стороны многоугольника видны из проверяемой точки. Если точка лежит внутри многоугольника, то суммарный угол равен 2π (точка Р на рисунке), если же точка лежит вне многоугольника, то сумма углов не равна 2π (точка Q).

Таким образом, для решения надо перебрать в цикле последовательно все вершины многоугольника и найти сумму углов между векторами PAi и PAi+1, i=1,2, …, N. Не забудьте добавить угол между векторами PAN и PA1. Для определения величины угла между векторами нам потребуется формула скалярного произведения.

Так как стороны многоугольника должны рассматриваться последовательно, в порядке обхода вершин, то при нахождении суммарного угла следует учитывать взаимное расположение векторов. Угол, под которым сторона видна из исследуемой точки, может быть как положительным, так и отрицательным. Для определения знака угла воспользуемся векторным произведением. Знак векторного произведения и определит знак конкретного угла в общей сумме.

Задание 4. Реализуйте программно задачу «Тигр в загоне»

Решение ряда задач повышенной сложности опиратеся на методы рассмотренные в комбинаторике, а именно на возможность генерации: сочетаний, перестановок, размещений и перечислений элементов.

Одним из важных элементов комбинаторики являются перестановки. Перестановки без повторений — комбинаторные соединения, которые  могут отличаться друг от друга лишь порядком входящих в них элементов.Число таких перестановок определяется как n!.

Для числа 3, количество перестановок будет равно 3! = 3 * 2 * 1 = 6. Для четырех: 4! = 4 * 3 * 2 * 1 = 24.

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

Пусть у нас есть первая перестановка (например 1234). Для нахождения следующей выполняем три шага.

1. Двигаясь с предпоследнего элемента перестановки, ищем элемент a[i], удовлетворяющий неравенству a[i] < a[i + 1]. Для перестановки 1234, это число 3, т. к. (3 < 4).

2. Меняем местами элемент a[i] с наименьшим элементом, который:

а) находится праве a[i].

б) является больше чем a[i].

В нашем случае меняем 3 и 4.

3. Все элементы стоящие за a[i] сортируем. В нашем случем нужно отсортировать число 4, но это единственный элемент, следовательно так его и оставляем.

В результате выполнения этих трех шагов получаем следующую по алфавиту перестановку 1243.

Выполнять эти шаги нужно циклически до тех пор, пока в перестановке не будет находится искомый в первом шаге элемент a[i], т. е. пока перестановка не станет отсортированной по убыванию: 4321.

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

Для более подробного изучения этого раздела рекомендуется [10].

Задание 5. Гномики решили встречать гостей с разноцветными шарами. Раздай шарики гномикам так, чтобы цвет шарика не был такой же, как цвет колпачка, и чтобы у гномиков в одинаковых по цвету колпачках были шарики разного цвета и разной формы. Напишите программу, выводящую все возможные варианты раздачи шариков.

Задание 6. Имеются цифры от 1 до 9 расположенные по возрастанию (убыванию). Требуется расставить между ними произвольное количество знаков <<плюс>> и <<минус>>, чтобы получилось выражение со значением 100. Например

123+4-5+67-89 = 100

9-8+76-5+4+3+21 = 100

Найти все возможные варианты таких выражений.

Задача 7. Дан двумерный массив, заполненный нулями и единицами. Найти прямоугольник, наибольшей площади, заполненный единицами.

Площадь прямоугольников изменяется от максимальной (весь массив) до минимальной (прямоугольник состоящий из одной 1). Каждый прямоугольник конкретной площади может быть построен множеством способов. Для площади S допустимый прямоугольник это такой, произведение сторон которого, равно S. Мы должны для каждого значения площади перебрать все допустимые способы построения прямоугольников. Каждый прямоугольник конкретной площади и формы может располагаться в массиве различным образом. Точнее сказать, его левая верхняя вершина может находится в разных точках массива. Следовательно, для прямоугольника определённой площади и формы мы должны перебрать все возможные расположения.

Может показаться, что программа для большого массива будет работать слишком долго, но есть серьёзные возможности для её ускорения. А именно:

  1. Если площадь перебирать от максимальной к минимальной, то первый найденный прямоугольник и будет искомым.
  2. Прямоугольник конкретной площади и формы не поместится в любом положении в массив.

Учёт этих утверждений ведёт к очень серьёзному ускорению программы.


Приложение 1

ПРиложение 1. Команды основного меню

В меню Файл находятся команды для выполнения операций с проектами, модулями и файлами.

Команда

Описание

Создать

Позволяет выбрать тип элемента (проект, файл и другие) и создать его

Открыть

Открывает ранее созданный проект, модуль, форму или текстовой файл

Закрыть решение

Закрывает текущее решение

Закрыть

Закрывает выбранный элемент (файл, модуль, форма)

Сохранить выделенные элементы

Сохраняет текущее решение, выбранные проекты, формы или файлы

Сохранить выделенные элементы как

Сохраняет текущее решение, выбранные проекты, формы или файлы с новым именем

Сохранить все

Сохраняет все открытые файлы, формы, проекты и используемые им модули, а также решение

Параметры страницы

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

Печать

Выводит содержимое активного файла на печать

Последние файлы

Позволяет увидеть список недавно использованных фалов и открыть их

Последние проекты и решения

Позволяет увидеть список недавно использованных решение и проектов и открыть их

Выход

Завершает работу Visual Studio

В меню Правка расположены команды, осуществляющие операции редактирования, работы с областью обмена данными, отмены действий.

Команда

Описание

Отменить

Отменяет ранее выполненные действия

Вернуть

Восстанавливает отмененные действия

Отменить последнее глобальное действие

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

Вернуть последнее глобальное действие

Восстанавливает последнее глобальное действие, которое затрагивает несколько файлов

Вырезать

Вырезает выделенный объект и помещает его в буфер обмена данными

Копировать

Копирует выделенный объект и (или) фрагмент текста программы и помещает его в буфер обмена данными

Вставить

Копирует содержимое буфера обмена данными в редактор или форму

Удалить

Удаляет выбранный объект или фрагмент программы

Выделить все

Выделяет все компоненты формы или весь текст программы

Поиск и замена

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

Закладки

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

 

В меню Вид содержатся команды для выбора панелей инструментов, выводимых на экран и вызова менеджера проектов, инспектора объектов, броузера объектов и других информационных утилит.

Команда

Описание

Код

Показывает окно текста для выбранного файла

Конструктор

Показывает окно формы для выбранного файла

Открыть

Открывает выбранный файл

Обозреватель решений

Открывает окно, отображающее состав открытого решения.

Обозреватель решений позволяет просматривать элементы решения или проекта и осуществлять операции по управлению ими. 

Командный обозреватель

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

Обозреватель серверов

Открывает серверную консоль управления Visual Studio. Это окно используется для создания подключений к данным, а также для входа на серверы для просмотра баз данных и системных служб. 

Обозреватель архитектуры

Открывает окно архитектуры открытого решения. В обозревателе архитектуры представлены такие структуры, как узлы, и такие отношения, как связи. 

Окно закладок

Открыает окно закладок

Иерархия вызовов

Открывает окно иерархии вызовов. Иерархия вызовов позволяет переходить по коду, отображая все входящие и исходящие вызовы выбранного метода, свойства или конструктора. Иерархия вызовов доступна во время разработки в отличие от стека вызова, который отображается отладчиком.

Классы

Открывает окно, отображающее существующие классы в открытом решении

Окно определения кода

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

Обозреватель объектов

Обозреватель объектов позволяет просматривать библиотеки, объекты, список свойств, методов, событий, переменных, констант и прочих элементов в заданной области обзора.

Список ошибок

Открывает окно, в котором отображаются ошибки, предупреждения и сообщения, созданные во время редактирования и компиляции кода.

Вывод

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

Начальная страница

Открывает окно начальной страницы. Начальная страница обеспечивает быстрый доступ к проектам, их созданию, сведениям о предстоящих выпусках продуктов и конференциях, а также о последних статьях по разработке. 

Список задач

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

Панель элементов 

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

Панель инструментов

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

Окно свойств

Открывает окно свойств, которое предназначено для просмотра и внесения изменений в заданные во время разработки свойства и события выделенных объектов, расположенных в редакторах и конструкторах.

В меню Проект содержатся команды для добавления и удаления компонетов текущего проекта и настройки параметров текущего проекта.

Команда

Описание

Добавить форму Windows

Добавляет форму к открытому проекту

Добавить пользовательский элемент управления

Добавляет элемент управлению формой к открытому проекту

Добавить компонент

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

Добавить новый элемент

Диалоговое окно для добавления элемента в выбранный проект. При выборе элемента из списка установленных шаблонов,  в проект добавляются соответствующие файлы и ссылки. В списке шаблонов отображаются элементы в зависимости от выбранного типа проекта и заданной версии .NET Framework

Добавитьсуществующий элемент

Это диалоговое окно служит для выбора одного или нескольких элементов проекта для их добавления в папку "Элементы решения". Файлы можно выбирать в локальных каталогах, сетевых каталогах или на веб-узлах.

Исключить из проекта

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

Свойства

Открывает окно страницы свойств выбранного элемента, в котором можно задавать параметры для проектов Visual Studio, чтобы они применялись ко всем конфигурациям построения, или же задать различные свойства для каждой конфигурации построения. 

Открыть папку в проводнике Windows

Данная функция активна только при выборе открытого проекта или всего решения в обозревателе решений. Позволяет открыть папку выбранного элемента в проводнике.

В меню Построение содержатся команды для компиляции и сборки проектов, а также для установки опций компиляции.

Команда

Описание

Построить решение

Компилирует программу

Перестроить решение

Компилирует программу после внесения изменений в несколько проектов существующего решения

Очистить решение

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

Построить выбранный проект

Компилирует проект

Перестроить выбранный проект

Компилирует программу после внесения изменений в несколько файлов существующего проекта

Очистить выбранный проект

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

Пакетное построение

Открывает диалоговое окно, которое используется для построения нескольких конфигураций проектов одновременно. Например, может возникнуть необходимость построить все конфигурации проекта с помощью одной команды. 

Диспетчер конфигураций

Открывает диалоговое окно, которое используется для создания и изменения конфигураций построения решений и конфигураций проектов. 

В меню Отладка расположены команды для отладки программ. Эти команды позволяют управлять различными функциями отладки среды разработки.

Команда

Описание

Окна

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

Начать отладку

Компилирует код и запускает программу

Запуск без отладки

Запускает последнюю скопилированную версию программы с обходом системы отладки ошибок

Продолжить

Позволяет продолжить выполнение программы  до конца или до следующей точки останова

Прервать все

Позволяет прервать выполнение программы и вернуться в режим отладки

Остановить отладку

Останавливает выполнение программы и возвращает пользователя в режим редактирования кода

Шаг с заходом

Позволяет пошагово выполнять программу с заходом в подпрограммы в режиме отладки

Шаг с обходом

Позволяет пошагово выполнять программу без захода в подпрограммы в режиме отладки

Шаг с выходом

Позволяет выполнить программус  выходом из режима отладки

Быстрая проверка

Открывает диалоговое окно "Быстрая проверка", которое позволяет просматривать и вычислять значения переменных и выражений используемых в текущей (на момент отладки) функции программы. 

Точка останова

Устанавливает точку останова в текущем файле на строчку, в которой установлен курсор.

Удалить все точки останова

Удаляет все точки останова имеющиеся в текущем решении

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

Позволяет отключить все точки останова имеющиеся в текущем решении

Отладка IntelliTrace

Запускает отладку в режиме IntelliTrace, которая позволяет избежать множественных перезагрузок выполнения программы за счет предоставления доступа к информации о событиях, произошедших в прошлом, ускоряя отладку.

Параметры и настройки

Открывает диалоговое окно "Параметры", которое позволяет просматривать и изменять параметры и конфигурации отладчика.

Точка останова

Устанавливает точку останова в текущем файле на строчку, в которой установлен курсор.

Меню Рабочая группасодержит средства для работы с коллективными проектами.

Команда

Описание

ПодключитьсякTeam Foundation Server

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

 

МенюДанные содержит средства для работы с базами данных.

Команда

Описание

Показать источники данных

Открывает диалоговое окно «Источники Данных», в котором отображаются источники данных в текущем проекте. 

Добавить источник данных

Вызывает «Мастер настройки источника данных», который используется для создания и редактирования источников данных в приложении. Эти источники данных можно создать из баз данных, служб или объектов. 

Сравнение схем

Открывает окно сравнение схем, которое используется для отображения результата сравнения двух схем баз данных. 

Редактор Transact SQL

Используется для создания соединения к SQL серверам и создания запросов к их базам данным.

Из меню Сервис доступны средства настройки среды, дополнительные утилиты, входящие в состав VisualStudio.

Команда

Описание

Диспетчер фрагментов кода

Открывает диалоговое окно «Диспетчер фрагментов кода», которое используется для добавления папок в список папок, сканируемых утилитой  «Code Snippets Manager» на предмет наличия файлов XML с расширением SNIPPET. Наличие таких стандартных блоков кода может упростить разработку проекта, позволив копировать готовые блоки в активный документ.

Диспетчер надстроек

Позволяет загружать и удалять надстройки из интегрированной среды разработки, а также указывать параметров загрузки надстроек. 

Макрос

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

Диспетчер расширений

Позволяет осуществлять поиск и установку расширений для Visual Studio.

Список ошибок

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

Внешние инструменты

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

Импорт и экспорт параметров

Вызывает «Мастер экспорта и импорта параметров», которые позволяет сохранить или загрузить параметры и настройки Visual Studio..

Настройка

Позволяет изменить внешний вид (настраивать такие элементы как окна, панели инструментов, сочетания клавиш и другие элементы интерфейса) и поведение интегрированной среды разработки Visual Studio, а также сохранять эти настройки.

Параметры

Открывает диалоговое окно «Параметры», которое используется для настроики среды разработки. Например: задать используемое по умолчанию местоположение для хранения проектов, а также стили отображения и поведения окон.

 

В меню Справка содержатся команды для вызова различных разделов справочной системы и отображения диалоговой панели «О программе».

Команда

Описание

Просмотр справки

Запускает агента библиотеки справки, а также открывает веб-браузер для просмотра локально установленной справки или просмотра интерент-справки (MSDN Library) .

Управление параметрами справки

Открывает приложение "Диспетчер библиотек справки", которое позволяет управлять документацией по продукту в локальном хранилище содержимого средства просмотра справки Майкрософт, а также служит для управления параметрами, позволяющими настроить взаимодействие со справочной системой.

Форумы MSDN

Открытие веб-браузера для просмотра справочных разделов форума библиотеки MSDN .

Сообщить об ошибке

Позволяет отправить в корпорацию Майкрософт отзывы и предложения, касающиеся работы с Visual Studio.

Примеры

Соединяет со страницей библиотеки MSDN, посвященной примерам и готовых шаблонов.

Параметры отзывов пользователей

Открывает диалоговое окно, позволяющее настроить параметры отправки отчетов об ошибках, а также параметры сбора анонимной информации об использовании Visual Studio на сайт Майкрософт.

Зарегестрировать продукт

Открывает диалоговое окно регистрации продуктов входящих в состав Visual Studio 2010, позволяющее приобрести ключ с помощью интернет магазина Майкрософт или ввести уже имеющийся лицензионный ключ.

Проверить наличие обновлений

Соединяет со страницей загрузки обновлений продуктов компании Майкрософт и предоставляет пользователю список имеющихся пакетов обновлений для VisualStudio.

Техническая поддержка

Предоставляет пользователю возможность выбора одного из вариантов технической поддержки Visual Studio (форумы MSDN, локальная справка, служба техничнической поддержки Майкрософт)

Заявление о конфиденциальности

Соединяет с интернет страницей фирмы Мафкрософт, посвященной Заявлению о конфиденциальности для Visual Studio 2010

О программе

Отображает диалоговую панель «О программе», содержащую сведения о продукте, а также предоставляется доступ к сведениям о компьютере, на котором он запущен. 


Приложение 2

ПРиЛОЖЕНИЕ 2. Свойства компонентов

П2.1. Общие свойства компонентов

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

 Свойство Name

Это свойство задаетимя компонента

Свойство Dock

Задает способ выравнивания компонента внутри формы. Имеет одно из следующих значений:

Значение

Описание

aINone

Выравнивание не используется. Компонент располагается на том месте, куда был помещен во время создания программы. Принимается по умолчанию

Top

Компонент перемещается в верхнюю часть формы, и его ширина становится равной ширине формы. Высота компонента не изменяется

Bottom

Компонент перемещается в нижнюю часть формы, и его ширина становится равной ширине формы. Высота компонента не изменяется

Left

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

Right

Компонент перемещается в правую часть формы, и его высота становится равной высоте формы. Ширина компонента не изменяется

Fill

Компонент занимает всю рабочую область формы

Свойство Margin

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

Значение

Описание

All

Задает отступы по всем четырем сторонам равным одному значению

Top

Задает отступ по верхней части элемента.  

Bottom

Задает отступ по нижней части элемента.  

Left

Задает отступ по левой части элемента.  

Right

Задает отступ по правой части элемента.  

Свойство Color

Задает цвет фона формы или цвет компонента или графического объектаили текста. Может иметь одно из следующих значений:

Значение

Цвет

Black

Черный

Maroon

Темно-красный

Green

Зеленый

Olive

Оливковый

Navy

Темно-синий

Purple

Фиолетовый

Teal

Сине-зеленый

Gray

Серый

Silver

Серебряный

Red

Красный

Lime

Ярко-зеленый

Blue

Голубой

Fuchsia

Сиреневый

Aqua

Ярко-голубой

White

Белый

Цвета, приведенные в следующей таблице, являются системными цветами Windows и зависят от используемой цветовой схемы.

Значение

Цвет

ActiveCaption

Текущий цвет заголовка активного окна

lnactiveCaption

Текущий цвет заголовка неактивного окна

Menu

Текущий цвет фона меню

Window

Текущий цвет фона Windows

WindowFrame

Текущий цвет рамки окна

MenuText

Текущий цвет текста элемента меню

WindowText

Текущий цвет текста внутри окна

ActiveCaptionText

Текущий цвет заголовка активного окна

ActiveBorder

Текущий цвет рамки активного окна

lnactiveBorder

Текущий цвет рамки неактивного окна

HightlightText

Текущий цвет выделенного текста

Highlight

Текущий цвет фона выделенного текста

GrayText

Текущий цвет недоступного элемента меню

ButtonText

Текущий цвет текста кнопки

ButtonShadow

Текущий цвет фона кнопки

ButtonFace

Текущий цвет кнопки

AppWorkSpace

Текущий цвет рабочей области окна

Помимо перечисленных в таблице цветов значение свойства Color может задаваться шестнадцатеричными значениями.

Свойство Cursor

Позволяет возвратить курсор, отображаемый, когда указатель мыши находится на элементе управления. В VisualStudio передопределено большое количество стандартных курсоров.

Свойство Enabled

Если это свойство имеет значение True, компонент реагирует на сообщения от мыши, клавиатуры и таймера. В противном случае (значение False) эти сообщения игнорируются.

Свойство Visible

Это свойство позволяет определить, видим ли компонент на экране. Значением этого свойства управляют методы Show и Hide.

Свойство Text

Это свойство получает и задает текст, сопоставленный с этим элементом управления. 

Свойство Font

Это свойство получает и задает параметры фона для свойства Text. Многие визуальные компоненты используют шрифт по умолчанию. При создании компонента изначальное значение свойства Font (класс TFont) имеет следующие параметры:

Свойство

Значение

Name

(имя шрифта)

Microsoft Sans Serif

Size

(размер шрифта)

8,25

Unit

(единицы измерения)

Point

Bold

(жирный)

True

GdiCharSet

(определяет кодировку GDI для данного шрифта)

204

GdiVerticalFont

(указывает на то, является ли новый шрифт Fontпроизводнымотвертикального шрифта GDI)

false

Italic

(курсив)

true

StrikeOut

(зачеркнутый)

true

Underline

(подчеркнутый)

false

Свойство Size

Это свойство задает размер компонента или формы.

Свойство

Значение

Height

(свойство задает вертикальный размер компонента или

формы)

30

Width

(свойство задает горизонтальный размер компонента или формы)

43

Свойство Location

Это свойство задает позицию левого верхнего угла компонента на форме.

Свойство

Значение

X

(свойство задает горизонтальную позицию)

30

Y

(свойство задает вертикальную позицию)

43

Свойство ForeColor

Это свойство позволяет указать, каким цветом будет отображаться текст компонента. Значение этого свойства по умолчанию равно ControlText, компонент использует цвет (значение свойства Color) родительского компонента.

Свойство BackColor

Это свойство позволяет указать, каким цветом будет отображаться фон компонента. По умолчанию значение этого свойства равно цвету (значение свойства Color) родительского компонента.

П2.2. Компоненты страницы STANDARD

П2.2.1. MenuStrip

Компонент MenuStrip служит для создания главного меню формы. После установки компонента на форму необходимо создать его опции. Для этого следует путем двойного нажатия на левую клавишу “мыши” вызвать конструктор меню. Создание опций меню - достаточно простой процесс. Необходимо создать новую опцию,далее нужно ввести имя этой опции и если  необходимо, путем нажатия на треугольник в правом углу, изменить тип опции на один из предлагаемых вариантов. (MenuItem, ComboBox, Separator, TextBox). Для создания новых опций необходимо выбирать строку справа, для создания подопций – снизу. Для определения символа быстрого доступа к опции перед ним ставится символ “&”. Каждый элемент меню является объектом класса ToolStripMenuItem и обладает следующими свойствами:

PropertyName: String

Возвращает или задает имя элемента.

Property Break: TMenuBreak;

Позволяет создать многоколончатый список подменю

Property Checked: Boolean;

Если True, рядом с опцией появляется галочка

PropertyVisible;

Возвращает или задает значение, указывающее, отображается ли элемент.

PropertyText:String;

Возвращает или задает текст, который должен отображаться в элементе.

PropertyToolTipText: String

Возвращает или задает текст, отображаемый в виде выплывающей подсказки для элемента управления

PropertySize: Drawing.Size

Возвращает или задает размер элемента.

PropertySelected: Boolean

Возвращает значение, показывающее, выбран ли элемент. 

PropertyImage: Drawing.Image

Возвращает или задает изображение, отображаемое на элементе

П2.2.2. Label

Компоненты класса Label (метки) предназначены для размещения на форме различного рода текстовых надписей.

Property AutoSize: Boolean;

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

Property TextAlign: Drawing.ContentAlignment;

Возвращает или задает выравнивание текста в метке.

PropertyBorderStyle: Forms.BorderStyle

Возвращает или задает стиль границы для метки.

PropertyCanSelect: Boolean

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

PropertyBackgroundImage: Drawing.Image

Возвращает или задает изображение, рисуемое на фоне метки.

FlatStyle = {Flat , Popup, Standard, System}

PropertyFlatStyle: Forms.FlatStyle

Возвращает или задает плоский внешний вид для элемента управления метками:Flat– плоский вид; Popup - плоский вид до тех пор, пока указатель мыши не будет на меткой; Standard – с выпуклыми границами, System – внешний вид определяет операционная система.

П2.2.3. TextBoxt

Компонент класса TextBoxBase представляет собой однострочный редактор текста. С его помощью можно вводить и/или отображать достаточно длинные текстовые строки. Следует помнить, что этот компонент не распознает символы конца строки.

Property AcceptsReturn: Boolean;

Возвращает или задает значение, указывающее необходимо ли перевести курсор на новую строку по нажатию на клавишу ENETER или активировать кнопку по умолчанию для формы.

Property AllowDrop: Boolean;

Возвращает или задает значение, указывающее, может ли элемент управления принимать данные, перетаскиваемые в него пользователем

PropertyAutoSize: Boolean;

Получает или задает значение, указывающее, подстраивается ли автоматически высота элемента управления при изменении шрифта, назначенного для элемента управления.

PropertyCanUndo: Boolean;

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

Property Capture: Boolean;

Возвращает или задает значение, определяющее, была ли мышь захвачена элементом управления.

Property HideSelection: Boolean

Получает или задает значение, показывающее, остается ли выделенный текст в поле выделенным, когда фокус ввода на форме переходит с данного элемента управления на другой.

Property MaxLength: Integer;

Определяет максимальную длину текстовой строки. Если имеет значение 0, длина строки не ограничена

Property Modified: Boolean;

Содержит True, если текст был изменен

Property ReadOnly: Boolean;

Получает или задает значение, указывающее, является ли текст в текстовом поле доступным только для чтения.

Property PasswordChar: Char;

Если символ PasswordChar определен, он заменяет собой любой символ текста при отображении в окне. Используется для ввода паролей

Property SelectionLength: Integer;

Получает или задает число знаков, выделенных в текстовом поле.

Property SelectionStart: Int32;

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

Property SelectedText: String;

Содержит выделенный текст

Property WordWrap: Boolean;

Показывает, переносятся ли автоматически в начало следующей строки слова текста по достижении границы многострочного текстового поля

Методы компонента:

Procedure Clear;

Удаляет весь текст

Procedure Copy;

Копирует выделенный текст в буфер обмена

Pocedure Cut;

Копирует выделенный текст в буферобмена, после чего удаляет выделенный текст из компонента

Procedure Paste;

Заменяет текущий выбор в текстовом поле содержимым буфера обмена

Procedure SelectAll;

Выделяет весь текст

Procedure Paste(String);

Заменяет выделенный текст в TextBox в заданный текст без очистки буфера обмена.

ProcedureUndo;

Отменяет последнюю операцию редактирования в текстовом поле. 

ProcedureSelect;

Активирует текстовое поле TextBox

П2.2.4. RichTextBox

Компоненты класса TextBoxBase  предназначены для ввода, редактирования и (или) отображения достаточно длинного текста, содержащего большое количество строк.

 

Property Lines: String[];

Получает или задает строки текста в RichTextBox.

Property Modified: Boolean;

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

Property Multiline: Boolean;

Возвращает или задает значение, указывающее, является ли это multiline - RichTextBox элемент управления.

Property RTF: String;

Возвращает или задает текст RichTextBox элемент управления, включая все коды rich text format (RTF).

RichTextBoxScrollBars = (None, Horizontal, Vertical, Both e.t.c);

Property ScrollBars: Forms.RichTextBoxScrollBars;

Возвращает или задает тип полос прокрутки, отображаемый в RichTextBox: None – полосы не отображаются; Horizontal - отображает горизонтальную полосу прокрутки, только если текст длиннее, чем ширина поля ввода; Vertical- отображает вертикальную полосу прокрутки, только если текст длиннее, чем высотаполя ввода; Both – отображает обе полосы.

Property SelectedRtf: String;

Возвращает или задает выбранный в данный момент широкий форматированный текст формата RTF в текстовом поле.

Property SelectionColor:

Drawing.Color;

Получает или задает цвет текста выделенного текста или точка вставки текста

П2.2.5. Button

 Компонент Button представляет собой стандартную кнопку и широко используется для управления программами. Кнопка может содержать текст или изображение, описывающее выполняемое ей действие.

Property CanSelect: Boolean;

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

Property DialogResult: Forms.DialogResult;

Возвращает или задает значение, возвращаемое в родительскую форму при нажатии кнопки из диалогового окна.

Property Enabled: Boolean;

Возвращает или задает значение, показывающее, сможет ли элемент управления отвечать на действия пользователя.

Property Image: Drawing.Image;

Возвращает или задает изображение, отображаемое на элемент управления " Кнопка ".

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

Возвращаемое значение

Описание

None

Диалоговое окно продолжает работу.

OK

Отправляется из указанной кнопки с меткой “Ок”

Cancel

Отправляется из кнопки с меткой “Отмена”

Abort

Отправляется из кнопки с меткой “Прервать”

Retry

Отправляется из кнопки с меткой “Повторить”

Ignore

Оотправляется из кнопки с меткой “Пропустить”

Yes

Отправляется из кнопки с меткой “Да”

No

Отправляется из кнопки с меткой “Нет”

П2.2.6. CheckBox

Кнопка с независимой фиксацией позволяет выбрать или отменить определенную функцию. Свойство Checked позволяет установить значение кнопки. Кнопка может находиться во включенном, выключенном и неактивном состоянии.

ContentAlignment = (TopLeft, TopCenter, TopRight, MiddleCenter e.t.c);

PropertyCheckAlign: Drawing.ContentAlignment;

Возвращает или задает способ горизонтального и вертикального выравнивания checkbox на элементе управления

Property AutoCheck: Boolean;

Возвращает или задает значение, указывающее доступно ли пользователю изменять значаение  CheckBox в процессе выполнения или изменять значение можно только програмным путем.

Property Checked: Boolean;

Содержит выбор пользователя типа Да/Нет. Состояния Unchecked и Inderterminate отражаются как False

CheckState = (Unchecked, Checked, Indeterminate) ;

Property CheckState: CheckState;

Содержит состояние компонента: Unchecked – нет; Checked - да; Indeterminate – не определен

П2.2.7. RadioButton

Кнопки с зависимой фиксацией предназначены для выбора одной опции из нескольких взаимоисключающих, поэтому таких кнопок должно быть как минимум две. Для группировки кнопок с зависимой фиксацией внутри формы их необходимо разместить внутри компонента Panel, GroupBox или ScrollBox. Состояние кнопки содержится в свойстве Checked.

П2.2.8. ListBox

Интерфейсный элемент этого типа содержит список элементов, которые могут быть выбраны при помощи клавиатуры или мыши. В компоненте предусмотрена возможность программной прорисовки элементов, поэтому список может содержать не только строки, но и произвольные изображения.

Property HorizontalScrollbar: Boolean;

Возвращает или задает значение, указывающее, отображается ли горизонтальная полоса прокрутки

RightToLeft = {No, Yes, Inherit};

Property RightToLeft: RightToLeft;

Возвращает или задает значение, указывающее, отображается ли текст справа налево.

Property Items: ObjectCollections;

Возвращает элементы, содержащиеся в компоненте

Property SelectedItems:

SelectedObjectCollection;

Возвращает коллекцию, содержащую выбранные в настоящий момент элементы

SelectionMode = {None, One, MultiSimple, MultiExtended}

Property SelectionMode: SelectionMode;

Возвращает или задает метод выбора элементов в ListBox:None – без выбора; One – можно выбрать только один; MultiSimple – можно выбрать несколько; MultiExended – можно выбрать несколько, при это пользоваться горячими клавишами (Ctrl, Shift).

PropertySorted : Boolean;

Возвращает или задает значение, указывающее, будут ли элементы ListBox отсортировавны по алфавиту.

Property ColumnWidth: Int32;

Возвращает или задает ширину столбцов

Property Toplndex: Integer;

Индекс первого видимого в окне элемента

П2.2.9. ComboBox

Комбинированный список представляет собой комбинацию списка ListBox и редактора TextBox и поэтому большинство его свойств и методов заимствованы у этих компонентов.

ComboBoxStyle = { Simple,  DropDown, DropDownList }

Property DropDownStyle: ComboBoxStyle;

Возвращает или задает значение, указывающее стиль поля со списком:Simple - список всегда раскрыт; DropDown - список раскрывается после нажатия кнопки справа от редактора; DropDownList – то DropDown, при этом редактор работает в режиме отображения выбора и его нельзя использовать для ввода новой строки.

 DrawMode = {Normal, OwnerDrawFixed, OwnerDrawVariable};

Property DrawMode: RightToLeft;

Возвращает или задает значение, указывающее, как отображаются элементы списка: Normal – все элементы имеют одинаковый размер, OwnerDrawFixed – рисование элементов выполняется вручную, все размеры одинаковые, OwnerDrawVariable - рисование элементов выполняется вручную, размеры могут быть разные.

Property DropDownHeight: Int32;

Возвращает или задает высоту в точках раскрывающейся части ComboBox.

Property DropDownWidth:

Int32;

Возвращает или задает ширину раскрывающейся части поля со списком.

Property DroppedDown:

Boolean;

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

 

П2.2.10. ScrollBar

Компонент ScrollBar является полосой прокрутки и обычно он используется для визуального управления значением какой-либо величины. При создании нового элемента типа ScrollBar необходимо выбрать ориентацю компонента путем задания его типа VScrollBar (бегунок перемещается по вертикали) или HScrollBar (бегунок перемещается по горизонтали).

Property LargeChange: Int32;

«Большой» сдвиг бегунка (при щелчке мышью рядом с концевой кнопкой)

Property Maximum: Integer;

Максимальное значение диапазона изменения числовой величины

Property Minimum: Integer;

Минимальное значение диапазона изменения числовой величины

Property Position: Integer;

Текущее значение числовой величины

Property SmallChange: TScrollBarInc;

«Малый» сдвиг бегунка (при щелчке мышью по концевой кнопке)

П2.2.11. GroupBox

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

П2.2.12. Panel

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

Property BorderStyle: BorderStyle;

Определяет стиль внутренней кромки

Property AutoScroll: Boolean;

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

PropertyPreferredSize: Size;

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

PropertyVerticalScroll и HorizontalScroll: ScrollProperties

Получает характеристики, связанные с вертикальной и горизонтальной полосой прокрутки.

PropertyVScroll:Boolean;

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

PropertyHScroll: Boolean;

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


Приложение 3

ПРИЛОЖЕНИЕ 3. Простые типы данных

П3.1.Целые типы

Диапазон возможных значений целых типов зависит от их внутреннего представления, которое может занимать 1, 2 или 4 байта.

Название

Длина, байт

Диапазон значений

Byte

1

0...255

Shortint

1

-128...+127

Smallint

2

-32 768...+32 767

Word

2

0...65 535

Integer

4

-2 147 483 648...+2 147 483 647

Longint

4

-2 147 483 648...+2 147 483 647

Cardinal

4

0... 2 147 483 647

К целочисленным типам применимы следующие процедуры и функции:

Обращение

Тип результата

Действие

abs (x)

x

Возвращает модуль х

chr (Byte)

Char

Возвращает символ по его коду

dec(x[,i])

---

Уменьшает значение x на i, а при отсутствии i - на 1

inc(x[,i])

Увеличивает значение v на i, а при отсутствии i - на 1

Hi(word)

Byte

Возвращает старший байт аргумента

Hi(integer)

Byte

Возвращает третий по счету байт

Lo(integer)

Byte

Возвращает младший байт аргумента

Lo (word)

Byte

Возвращает младший байт аргумента

Odd(LongInt)

Boolean

Возвращает True, если аргумент - нечетное число

Random(word)

----

Возвращает псевдослучайное число, равномерно распределенное в диапазоне 0...(word)

sqr (x)

х

Возвращает квадрат аргумента

swap (integer)

Integer

Меняет местами байты в слове

swap(word)

Word

Меняет местами байты в слове

П3.2.Логические типы

К логическим относятся типы Boolean, ByteBool, Bool, WordBool и LongBool. В стандартном Паскале определен только тип Boolean, остальные логические типы введены в Object Pascal для совместимости с Windows: типы Boolean и ByteBool занимают по 1 байту каждый, Bool и WordBool - по 2 байта, LongBool - 4 байта. Значениями логического типа может быть одна из предварительно объявленных констант: False (ложь) или True (истина). Длянихсправедливыправила:

  Ord(False) == 0;

  Ord(True)<> 0;

  Succ(False) = True;

  Pred(True) = False.

 

П3.3.Символьный тип

Значением символьного типа является множество всех символов. Каждому символу приписывается целое число в диапазоне 0...255. Это число служит кодом внутреннего представления символа, его возвращает функция ord.

Для кодировки в Windows используется код. Первая половина символов ПК с кодами 0...127 постоянна и содержит в себе служебные коды и латинский алфавит. Вторая половина символов с кодами 128...255 меняется для различных шрифтов. Символы с кодами О... 31 относятся к служебным кодам. Если эти коды используются в символьном тексте программы, они считаются пробелами.

К типу Char применимы операции отношения, а также встроенные функции:

Chr (В) - функция типа Char, преобразует выражение В типа Byte в символ и возвращает его своим значением;

UpCase (СН) - функция типа Char, возвращает прописную букву, если СН - строчная латинская буква, в противном случае возвращает сам символ СН (для кириллицы возвращает исходный символ).

П3.4. Перечисляемый тип

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

Функции, поддерживающие работу с типами-диапазонами:

High (X) - возвращает максимальное значение типа-диапазона, к которому принадлежит переменная X;

Low (X) - возвращает минимальное значение типа-диапазона.

П3.5. Вещественные типы

Значения вещественных типов определяют произвольное число лишь с некоторой конечной точностью, зависящей от внутреннего формата вещественного числа.

Название

Длина, байт

Кол-во значащих цифр

Диапазон значений

Примечание

Real

6

11...12

2,9*10-39...1,7*1039

При наличии сопроцессора использовать нежелательно, т.к. замедляет работу

Single

4

7. . .8

1,5*10-45…3,4*1038

-

Double

8

15...16

5,0*10-324...1,7*10308

-

Extended

10

19...20

3,4*10-4951...1,1*104932

Применяется наиболее часто

Comp

8

19...20

-263...+263-1

Дробная часть отсутствует

Currency

8

19...20

±922337203685477,5807

Длина дробной части 4 десятичных разряда

Для работы с вещественными типами имеются стандартные функции:  

Обращение

Тип параметра

Тип результата

Примечание

abs(x)

вещественный, целый

Тип аргумента

Модуль аргумента

ArcTan(x)

вещественный

вещественный

Арктангенс (в радианах)

Cos(x)

вещественный

вещественный

Косинус (в радианах)

Exp(x)

вещественный

вещественный

Экспонента

Frac(x)

вещественный

вещественный

Дробная часть числа

Int(x)

вещественный

вещественный

Целая часть числа

Ln(x)

вещественный

вещественный

Логарифм натуральный

Pi

---

вещественный

=3.141592653...

Random

вещественный

Псевдослучайное число, равномерно распределенное в диапазоне 0...[1]

Random(x)

целый

целый

Псевдослучайное целое число, равномерно распределенное в диапазоне 0...x

Randomize

---

---

Инициация генератора псевдослучайных чисел

Sin (x)

вещественный

вещественный

Синус (в радианах)

Sqr(x)

вещественный

вещественный

Квадрат аргумента

Sqrt(x)

вещественный

вещественный

Корень квадратный

ПЗ.6. Тип дата-время

Тип дата - время определяется идентификатором TDateTime и предназначен для одновременного хранения и даты, и времени. Над данными типа TDateTime определены те же операции, что и над вещественными числами, а в выражениях этого типа могут участвовать константы и переменные целого и вещественного типов.


Приложение 4

ПРИЛОЖЕНИЕ 4. Процедуры и функции для работы со строками

Для работы со строками применяются следующие процедуры и функции (в квадратных скобках указываются необязательные параметры).

Процедуры и функции для работы со строками

Function Concat(S1 [, S2, ..., SN]: String): String;

Возвращает строку, представляющую собой сцепление строк-параметров S1. S2, … , SN

Function Copy(St: String; Index, Count: Integer): String;

Копирует из строки St Count символов, начиная с символа с номером Index

Procedure Delete(St: String; Index, Count: Integers;

Удаляет Count символов из строки St начиная с символа с номером Index

Procedure Insert(SubSt: String; St, Index: Integer) ;

Вставляет подстроку SubSt в строку St начиная с символа с номером Index

Function Length(St: String): Integer;

Возвращает текущую длину строки St

Function Pos(SubSt, St: String): Integer;

Отыскивает в строке St первое вхождение подстроки SubSt и возвращает номер позиции, с которой она начинается. Если подстрока не найдена, возвращается ноль

Procedure SetLength(St: String; NewLength: Integer);

Устанавливает новую (меньшую) длину NewLength строки St, если NewLength больше текущей длины строки, обращение к SetLength игнорируется

Подпрограммы преобразования строк в другие типы т

Function StrToCurr(St: String): Currency;

Преобразует символы строки St в целое число типа Currency. Строка не должна содержать ведущих или ведомых пробелов

Function StrToDate(St: String): TDateTime;

Преобразует символы строки St в дату. Строка должна содержать два или три числа, разделенных правильным для Windows разделителем даты (в русифицированной версии таким разделителем является «.») Первое число - день, второе –  месяц, если указано третье  число, оно задает год

Function StrToDateTime(St: String): TDateTime;

Преобразует символы строки St в дату и время. Строка должна содержать дату ивремя, разделенные пробелом

Function StrToFloat(St: String): Extended;

Преобразует символы строки St в вещественное число. Строка не должна содержать ведущих или ведомых пробелов

Function StrToInt(St: String): Integer;

Преобразует символы строки St в целое число. Строка не должна содержать ведущих или ведомых пробелов

Function StrToIntDef(St: String; Default: Integer): Integer;

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

Function StrToIntRange(St: String; Min, Max: Longint) : Longint;

Преобразует символы строки St в целое число и возбуждает исключение ERangeError, если число выходит из заданного диапазона Mm Max

Function StrToTime(St: String): TDateTime;

Преобразует символы строки St во время

Procedure Val(St: String; var X; Code: Integer);

Преобразует строку символов St во внутреннее представление целой или вещественной переменной X, которое определяется типом этой переменной. Параметр Code содержит ноль, если преобразование прошло успешно, и тогда в Х помещается результат преобразования; в противном случае он содержит номер позиции в строке St, где обнаружен ошибочный символ, и в этом случае содержимое X не меняется. В строке St могут быть ведущие и (или) ведомые пробелы

Подпрограммы обратного преобразования

Function DateToStr(Value: TDateTime): String;

Преобразует дату из параметра Value в строку символов

Function DateTimeToStr(Value: TDateTime): String;

Преобразует дату и время из параметра Value в строку символов

Procedure DateTimeToString (var St: String; Format: String; Value: TDataTime) ;

Преобразует дату и время из параметра Value в строку St

Function FormatDateTime (Format: String; Value: TDateTime): String;

Преобразует дату и время из параметра Value в строку символов

Function FloatToStr( Value: Extended): String;

Преобразует вещественное значение Value в строку символов

Function FloatToStrF(Value: Extended; Format: TFloatFor-mat; Precision, Digits: Integer) : String;

Преобразует вещественное значение Value в строку символов с учетом параметров Precision и Digits (см. пояснения ниже)

Function FormatFloat(Format: String; Value: Extended): String;

Преобразует вещественное значение Value в строку

Function IntToStr(Value: Integer) : String;

Преобразует целое значение Value в строку символов

Function TimeToStr(Value: TDateTime): String;

Преобразует время из параметра Value в строку символов

Procedure Str(X [:width [:Decimals]]; var St: String);

Преобразует число Х любого вещественного или целого типа в строку символов St; параметры Width и Decimals, если они присутствуют, задают формат преобразования: Width определяет общую ширину поля, выделенного под соответствующее символьное представление вещественного или целого числа X, a Decimals –количество символов в дробной части (этот параметр имеет смысл только в том случае, когда Х - вещественное число)

Правила использования параметров функции FloatToStrF показаны ниже:

Значение Format

Описание

fFfExponent

Научная форма представления с множителем еХХ («умножить на 10 в степени XX»). Precision задает общее количество десятичных цифр мантиссы. Digits - количество цифр в десятичном порядке XX. Число округляется с учетом первой отбрасываемой цифры: 3.1416Е+00

ffFixed

Формат с фиксированным положением разделителя целой и дробной частей. Precision задает общее количество десятичных цифр в представлении числа. Digits - количество цифр в дробной части. Число округляется с учетом первой отбрасываемой цифры: 3,14

ffGeneral

Универсальный формат, использующий наиболее удобную для чтения форму представления вещественного числа. Соответствует формату ffFixed, если количество цифр в целой части меньше или равно Precision, а само число - больше или равно 0,00001, в противном случае соответствует формату ffExponent: 3,1416

ffNumber

Отличается от ffFixed использованием символа - разделителя тысяч при выводе больших чисел (для русифицированной версии Windows таким разделителем является пробел). Для Value = * 1000 получим 3 141,60

ffCurrency

Денежный формат. Соответствует ffNumber, но в конце строки ставится символ денежной единицы (для русифицированной версии Windows - символы «р.»). Для Value = *1000 получим: 3 141,60р


Приложение 5

ПРИЛОЖЕНИЕ 5. Математические формулы

Язык ObjectPascalимеет ограниченное количество встроенных математических функций. Поэтому при необходимости использовать другие функции следует применять известные соотношения. В таблице приведены выражения наиболее часто встречающихся функций через встроенные функции языкаObjectPascal.

Функция

Соотношение

Соотношение на языкеObjectPascal

Ln(x)/Ln(a)

Exp(a*Ln(x))

Sin(x)/Cos(x)

Cos(x)/Sin(x)

ArcTan(Sqrt(x/(1-sqr(x))))

Pi/2- ArcTan(Sqrt(x/(1-sqr(x))))

Pi/2-ArcTan(x)

(Exp(x)-Exp(-x))/2

(Exp(x)+Exp(-x))/2

1/Sin(x)

1/Cos(x)


Литература

  1. Есипов А.С., Паньгина Н.Н., Громада М.И. Информатика. Сборник задач и решений для общеобразовательных учебных заведений. СПб.: Наука и техника, 2001. 368 с.
  2. Окулов С.М. Программирование в алгоритмах. М.: Бином. Лаборатория знаний, 2004. 341 с.
  3. Юркин А.Г. Задачник по программированию. СПб.: Питер, 2002. 192 с.
  4. ФароновВ.В. VISUAL STUDIO 3. Учебный курс. –М.: Нолидж, 1998. –400 с.
  5. Дарахвелидзе П.Г., Марков Е.П. Visual Studio – среда визуального программирования: - СПб.: ВНV –Санкт-Петербург, 1996. – 352 с.
  6. Федеоров А.Г. VisualStudio3.0. для всех: – М.: КомпьютерПресс, 1998. – 544 с.
  7. Марко Кэнту., VisualStudio4 для профессионалов – СПб: Издательство «Питер», 1999. – 1120 с.: ил.
  8. Архангельский А.Я., Программирование в VisualStudio–СПб: Бином, 2008. – 816 с.: ил.
  9. Вихтенко Э.М. Геометрические задачи в олимпиадах по программированию. Изд-во МИФ-2 №2. 2005 г.
  10.  В. Липский. Комбинаторика для программистов. – М.: Мир, 1988. –200 с.


ПРОГРАММИРОВАНИЕ В СРЕДЕ DELPHI

Методические указания и индивидуальные задания

к лабораторным работам по курсу “Программирование для инженеров”

для студентов первого курса ЭЛТИ

Составитель           Дёмин Антон Юрьевич

Подписано к печати

Формат 6084/16. Бумага писчая №2.

Плоская печать. Усл.печ.л. 1.34. Уч.-изд.л. 1.21.

Тираж  150 экз. Заказ №        . Цена свободная.

ИПФ ТПУ. Лицензия ЛТ №1 от 18.07.94.

Ротапринт ТПУ. 634034, Томск, пр.Ленина, 30.

3GDI (GraphicsDeviceInterface) — один из основных компонентов операционной системы, предоставляющий средства для обработки двухмерной графики, рисунков и для решения типографских задач.

4Начало координат находится в левом верхнем углу элемента, на котором происходит прорисовка. В нашем случае в левом врехнем углу окна. Ось y направлена вниз ось xнаправленна направо.

5В приложениях Visual C# часто содержатся данные, не являющиеся исходным кодом. Такие данные называются ресурсами проекта и могут включать двоичные данные, текстовые файлы, аудио- и видеофайлы, таблицы строк, значки, изображения, XML-файлы или любой другой тип данных, необходимых для приложения. Данные ресурсов проекта хранятся в формате XML в файле с расширением RESX (имя по умолчанию – Resources.resx), который можно открыть в Обозревателе решений.

78




1. Контрольная работа по дисциплине- транспортное обеспечение коммерческой деятельности
2. данные не лишена тавтологичностн
3. Дно океана
4. Политология 1
5. оптических линий связи В XX веке человечество было свидетелем огромного скачка в развитии различных ви
6.  201 г. Об утверждении темы дипломной работы Зав
7. Лабораторна робота 1 З дисципліни- Спеціальна підготовка з обслуговування ПР Студента групи ДР501Мз
8. 1Предмет экономической теории
9. Социальная философия как методология науки экономической деятельности
10. Автоматизированные формы