Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторный практикум C#.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
3.79 Mб
Скачать

ЛАБОРАТОРНАЯ РАБОТА 1

РАЗРАБОТКА И ОТЛАДКА ПРОГРАММ С ИСПОЛЬЗОВАНИЕМ ОПЕРАТОРОВ ВЕТВЛЕНИЯ, ЦИКЛОВ, ФОРМ

Цель работы: изучение основных элементов среды разработки Visual Studio Integrated Development Environment, способов использования основных элементов управления (Label, TextBox, Button) и получение навыков по разработке GUI, созданию SDI-приложений, обработке событий, работе с условными и циклическими операторами в языке C#.

Основные сведения

Среда разработки Visual Studio Integrated Development Environment (IDE - интегрированная среда разработки) включает набор инструментов и не зависит от используемых языков программирования, представленных в Visual Studio. Visual Studio можно использовать для создания кода и на различных языках программирования: управляемый C++ - Manadged C++, Visual Basic.NET, Java.NET, C#.

Обзор среды разработки C#

Для начала работы с Visual Studio.NET необходимо из главного меню выбрать пункт Microsoft Visual Studio.NET (VS). При этом на компьютере загрузится Developer Studio (визуальная среда разработки Microsoft Visual) на экране компьютера будет выведено окно, изображенное на рисунке 1.1.

Рисунок 1.1 - Стартовое диалоговое окно IDE

Создание рабочей области проекта

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

Упражнение 1.1

Создание рабочей среды нового проекта производится следующим образом:

  1. Щелкните на ссылке Project (Создать новый проект) метки Create на начальной странице (Start Page) VS.NET. При этом откроется окно создания нового проекта New Project (рисунок 1.2).

Рисунок 1.2. Мастер создания нового проекта (New Project Wizard)

  1. В дереве, отображаемом в подокне Project Type (Типы проектов) выберите "Visual C#/Windows". В подокне Templates(Шаблоны) выберите Windows Forms Application (Приложение Windows ).

  2. В поле Name (Название проекта) наберите имя проекта - Project_номер_01 (имя проекта присваивается в соответствии со следующим синтаксисом: Project_"номер группы"_"номер по-журналу" ).

  3. Щелкните на кнопке ОК. (Да). Мастер создания нового проекта создаст новый класс Form1, производный от System.Windows.Forms.Form с правильно настроенным методом Main(). В свойствах проекта автоматически будут созданы ссылки на необходимые сборки библиотеки базовых классов. На экране появится графический шаблон среды разработки (рисунок 1.3).

Рисунок 1.3. Графический шаблон главного окна приложения

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

Для просмотра кода сгенерированного приложения можно в окне Solution Explorer щелкнуть правой кнопкой мыши на файле Form1.cs и в контекстном меню выбрать View Code или нажать на области формы кнопку F7 (рисунок 1.4).

Рисунок 1.4. Выбор режима View Code в контекстном меню

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

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 _01

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

}

}

Инициализация компонент реализуется кодом, который можно отобразить, в окне Solution Explorer щелкнуть на пункте Form.Designer.cs (рисунок 1.5).

Рисунок 1.5. Выбор режима Form.Designer.cs

Код файла Form.Designer.cs имеет следующий вид:

namespace _01

{

partial class Form1

{

/// <summary>

/// Required designer variable.

/// </summary>

private System.ComponentModel.IContainer components = null;

/// <summary>

/// Clean up any resources being used.

/// </summary>

/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>

protected override void Dispose(bool disposing)

{

if (disposing && (components != null))

{

components.Dispose();

}

base.Dispose(disposing);

}

#region Windows Form Designer generated code

/// <summary>

/// Required method for Designer support - do not modify

/// the contents of this method with the code editor.

/// </summary>

private void InitializeComponent()

{

this.SuspendLayout();

//

// Form1

//

this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);

this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;

this.ClientSize = new System.Drawing.Size(284, 262);

this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D;

this.Location = new System.Drawing.Point(100, 200);

this.Name = "Form1";

this.Opacity = 0.75D;

this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;

this.Text = "Упражнение_1";

this.ResumeLayout(false);

}

#endregion

}

}

В определении класса Form1 используется ключевое слово partial, которое позволяет определять класс, структуру или интерфейс, распределенные по нескольким файлам. В Visual Studio 2010 классы Windows-форм формируются в двух файлах: Form1.cs и Form1.Designer.cs. В файле Form1.Designer.cs присутствует код, сгенерированный дизайнером Windows-формы, а файле Form1.cs - присутствует код инициализации класса и пользовательские члены класса (поля, свойства, методы, события, делегаты).

Код приложения (Program.cs) имеет следующий вид:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Windows.Forms;

namespace _01

{

static class Program

{

/// <summary>

/// The main entry point for the application.

/// </summary>

[STAThread]

static void Main()

{

Application.EnableVisualStyles();

Application.SetCompatibleTextRenderingDefault(false);

Application.Run(new Form1());

}

}

}

Метод Main является точкой входа для приложения и вызывает Application.Run, который создает класс Form1.

Класс System.Windows.Forms.Application

Класс Application можно рассматривать как "класс низшего уровня", позволяющий управлять поведением приложения Windows Forms. Кроме того, этот класс определяет набор событий уровня всего приложения, например закрытие приложения или простой центрального процессора.

Метод Run() класса Application запускает стандартный цикл работы с сообщениями для текущего потока, а Метод Exit() завершает работу приложения.

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

Проектирование окна приложения

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

Для настройки внешнего вида и поведения формы в соответствии с требованиями пользователя необходимо изменить свойства класса Forms1. Это можно сделать с помощью дизайнера окон (Form Designer), путем изменения свойств в окне Свойства (Properties) или в коде программы.

В таблице 1.1 перечислены некоторые свойства форм Windows, отвечающие за внешний вид и поведение приложения:

Таблица 1.1 Свойства форм Windows

Свойство

Описание

Name

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

BackColor

Указывает цвет фона формы

Enabled

Указывает, может ли форма принимать ввод от пользователя. Если свойству Enabled задано значение False, все элементы управления формы также блокируются

ForeColor

Указывает цвет переднего плана формы, то есть цвет выводимого текста. Если отдельно не указать значение свойства ForeColor элементов управления формы, они примут то же значение

FormBorderStyle

Указывает вид и поведение границы и строки заголовка формы

Значения свойства:

None - Форма не имеет границы, не может быть минимизирована или развернута до максимальных размеров и у нее нет экранной кнопки управления окном и кнопки справки

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

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

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

Sizable - Форма имеет настройки по умолчанию, но они могут изменяться пользователем Форма может быть минимизирована, развернута до максимальных размеров, и иметь кнопку справки, что определяется остальными свойствами

FixedTooIWindow - Форма имеет тонкую границу, и размеры формы нельзя изменить во время выполнения. Форма содержит только кнопку закрытия

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

Location

Когда свойству StartPosition задано значение Manual, это свойство указывает исходное положение формы относительно верхнего левого утла экрана

MaximizeBox

Указывает, есть ли у формы кнопка MaximizeBox

MaximumSize

Устанавливает максимальный размер формы. Если задать этому- свойству размер 0; 0, у формы не будет верхнего ограничения размера

MinimizeBox

Указывает, есть ли у формы кнопка MinimizeBox

MinimumSize

Устанавливает минимальный размер формы, который пользователь может задать

Opacity

Устанавливает уровень непрозрачности или прозрачности формы от 0 до 100%. Форма, непрозрачность которой составляет 100%, полностью непрозрачна, а форма, имеющая 0 % непрозрачности, наоборот, полностью прозрачна

Size

Принимает и устанавливает исходный размер формы

StartPosition

Указывает положение формы в момент ее первого выведения на экран

Text

Указывает заголовок формы

TopMost

Указывает, всегда лн форма отображается поверх всех остальных форм,

свойству TopMost которых не задано значение True

Visible

Указывает, видима ли форма во время работы

WindowState

Указывает, является ли форма минимизированной, развернутой

до максимальных размеров, или же при первом появлении ей задан размер, указанный в свойстве Size

Упражнение 2

Выберите форму Form1 и в окне Properties задайте свойствам значения, как указано ниже:

Свойство

Значение

Text

Насущный вопрос

FormBorderStyle

Fixed3D

StartPosition

Manual

Location

100: 200

Opacity

75%

Запуск готового решения

Для построения решения выберите меню Build (Построение), далее команду Build Solution (Построить решение) или нажмите кнопку F6 (рисунок 1.6) При наличии ошибок исправьте их и снова постройте решение.

Рисунок 1.6. Выбор из главного меню команды Build

Для запуска приложения нажмите F5 или выберите Debug (Отладка) | Start Debugging (Начать отладку), чтобы запустить приложение.

Приложение запустится в отладочном режиме и на экране появится разработанное окно (рисунок 1.7.).

Рисунок 1.7. Окно приложения Project_01

Работа с элементами управления

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

При создании приложения можно добавить элементы управления на форму при помощи графических средств Visual Studio. Обычно достаточно выбрать нужный элемент управления в окне ToolBox и поместить его на форме. Visual Studio автоматически сгенерирует нужный код для формы. После этого можно изменить название элемента управления на более содержательное (например, вместо button1, предлагаемого по умолчанию, - buttonPrimer). Visual Studio позволяет не только размещать на форме элементы управления, но и настраивать их свойства. Для этого достаточно щелкнуть на элементе управления правой кнопкой мыши и в контекстном меню выбрать Properties (Свойства).

Все изменения, которые необходимо произвести в окне свойств (рисунок 1.8), будут добавлены в код метода InitializeComponents().

Рисунок 1.8. Настройка элементов управления средствами Visual Studio

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

при помощи кнопки в закладке Properties. Можно выбрать в списке нужное событие и рядом с ним сделать двойной щелчок или ввести имя метода или выбрать метод из списка. После задания имени метода или двойного щелчка Visual Studio сгенерирует заготовку для обработчика события.

Обзор элементов управления

  • Статические элементы управления

LinkLabel (метка-ссылка) - отображает текстовую строку, сильно или немного выделенную, чтобы показать, что щелчок этого элемента вызывает какое-то действие, например запуск приложения или открытие Web-страницы. Вдобавок к назначению стандартных значений свойств BackColor и ForeColor, в LinkLabel определены четыре свойства цвета:

- LinkColor (по умолчанию синий);

- DisabledLinkColor (серый);

- ActiveLinkColor (красный при активизации ссылки);

- VisitedLinkColor (пурпурный).

Свойство LinkArea элемента LinkLabel — это объект типа LinkArea, представляющий собой структуру из двух целых свойств - Start и Length. Допустим, свойство Text элемента LinkLabel определено так:

lnklbl.Text = "Click here to display the page."

Пусть слово here надо сделать ссылкой. Зададим LinkArea так, чтобы ссылка начиналась с шестого знака и была длиной четыре знака:

lnklbl.LinkArea = new LinkArea(6, 4);

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

- AlwaysUnderline;

- HoverUnderline;

- NeverUnderline;

- SystemDefault.

По умолчанию назначается SystemDefault, повторяющее поведение ссылки в соответствии с пользовательской настройкой Microsoft Internet Explorer.

Одной метке можно назначить несколько ссылок. В этом случае применяется свойство LinkLabel по имени Links. Это объект LinkLabelLinkCollection, представляющий собой набор объектов LinkLabelLinks.

Label (метка) — это элемент управления, отображающий нередактируемый текст. Сам текст задается в свойстве Text. Хотя метка может отображать текст в нескольких строках, она не выводит полос прокрутки, если текст не умещается в элементе управления. Если в элементе управления надо разместить объемный текст, но делать его редактируемым нельзя, используйте элемент управления TextBox со свойством Readonly равным true.

Помимо текста, метка может отображать объект Image, который можете быть как объектом Bitmap, так и Metafile. (Эти классы определены в пространствах имен SystemJDrawing и SystemDraivingImaging) Один из способов заключается в присвоении свойству Image загруженного файла:

lbl.Image = Image.Load("SillyCat.jpg");

  • Кнопка

Button (кнопка) - используется для инициирования действий. На кнопке как правило присутствует текст, но некоторые из них - изображения, с текстом или без. Если кнопка должна отображать и текст, и изображение, можно задать свойство TextImageRelation, которому присваивают одно из значений перечисления TextImageRelation, состоящего из членов ImageAboveText, ImageBeforeText, TextAbovelmage, TextBeforelmage и Overlay.

Свойства TextAlign и ImageAlign задают положение текста или изображения в элементе управления. Оба принимают значения перечисления ContentAlignment, состоящего из девяти членов — комбинации Top, Middle и Bottom с Left, Center и Right. Значение по умолчанию обоих свойств — ContentAlignmentMiddleCenter.

Свойство DialogResult класса Button позволяет возвращать значение при закрытии диалогового окна, например, при нажатии кнопок ОК или Cancel (Отменить).

  • Элементы управления с поддержкой редактирования текста

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

В TextBox также определено множество методов: для работы с буфером обмена (Cut, Copy и Paste), отменой ввода (Undo) и прочими возможностями редактирования (Clear, AppendText и т. п.).

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

Если TextBox используется для ввода пароля, нужно указать в PasswordChar символ, который будет отображаться при вводе. В этом отношении также полезно свойство CharacterCasing. Если присвоить этому свойству значение из перечисления CharacterCasinglower или CbaracterCasing.Upper, вводимые символы будут приводиться в нижний или верхний регистр соответственно.

MaskedTextBox (текстовое поле с маской) – элемент управления, предназначенный для ввода одной строки текста в заранее заданном формате, например телефонных номеров, денежных сумм, дат или адресов электронной почты. Свойство Mask представляет символьную строку, определяющую формат вводимой в поле строки.

При попытке ввести не предусмотренный маской текст инициируется событие MasklnputRejected, вместе с которым передается объект MasklnputRejectedEventArgs, имеющий два свойства: Position - позиция символа, не совпадающего с маской, и RejectionHint - текстовая строка, отображаемая (например, в элементе управления Label) для прочтения пользователем.

RichTextBox (поле ввода с форматированием) – в данном элементе управления текст хранится в поддерживающем стилевое оформление формате RTF (Microsoft Rich Text Format).

RichTextBox по умолчанию многострочный. Как и в TextBox, в RichTextBox есть свойство ScrollBars, но здесь ему присваивается одно из значений перечисления RichTextScrollBars. По умолчанию это RichTextScrollBars.Both, предписывающий горизонтальные и вертикальные полосы прокрутки, но только если они нужны. Остальные члены перечисления — None, Horizontal, Vertical, ForcedHorizontal, ForcedVertical и ForcedBoth. Значения с префиксом Forced требуют отображать полосы прокрутки, даже если они не обязательны.

RichTextBox разрешает определять программно форматирование только выделенного в данный момент текста. Такое форматирование выполняеется путем определения свойств, начинающихся со слова Selection. В некоторых случаях эта схема очень удобна, например когда пользователь выделяет текст, а затем выбирает Font из меню Format. В программе создается новый объект Font, например по имени fnt, и присваивается свойству SelectionFont элемента управления RichTextBox:

rtb.SelectionFont = fnt;

SelectionBackColor и SelectionColor — это свойства объекта Color, определяющие цвет фона и текста выделенного участка соответственно. SelectionFont — это объект типа Font. Еще один элемент форматирования символов — SelectionCharOffset, смещение уровня текста, выраженное в пикселах. Положительное значение используется для верхних, а отрицательное — для нижних индексов.

Все остальное относится к форматированию абзацев. SelectionAlignment принимает значения из перечисления шHorizontalAlignment, состоящего из членов Left, Right и Center. Выравнивания по правому и левому краям одновременно не предусмотрено. SelectionBullet — булево свойство, задающее маркер перед каждым абзацем. SelectionIndent, SelectionRightIndent и SelectionHangingIndent — отступ в пикселах. Selection-RightIndent отмеряется от правой стороны элемента управления. Отступ первой строки абзаца указывается в SelectionIndent и отмеряется от левой стороны элемента управления. SelectionHangingIndent — «висячий отступ», то есть отступ остатка абзаца по отношению к SelectionIndent. SelectionTabs — это массив чисел, определяющих позиции табуляции.

В свойстве Text объекта RichTextBox задается только «пустой» текст без каких-либо RTF-тэгов. Для работы с полнофункциональным RTF-текстом служит свойство Rtf. В RichTextBox предусмотрены встроенные методы ввода/вывода файлов — LoadFile и SaveFile.

Упражнение 3

Расположите на ранее созданной форме две кнопки Button и надпись Label, разместите их по-своему усмотрению.

Для задания имени кнопке выделите ее на форме, откройте вкладку Properties и измените свойство Name. Задайте для кнопок имена «btnYes» и «btnNo». Для задания текста на кнопке измените свойство Text. Для первой кнопки задайте текст «Да», для второй – «Нет». Для элемента Label свойство текст установите в «Вы довольны своей зарплатой?».

Для связывания функций кнопки с диалоговым окном необходимо создать обработчик события на нажатие кнопки. Для этого сделайте двойной щелчок на кнопке «Да». В результате в коде приложения сформируется шаблон функции обработчика события Click для кнопки.

private void btnYes_Click(object sender, EventArgs e)

{

}

В полученный шаблон добавьте функцию вывода диалогового окна с сообщением

Выделите кнопку "Нет". В окне Properties переключитесь в окно событий и дважды щелкните в поле MouseMove.

В обработчике этого события добавьте код для связывания движения мыши с координатами кнопки и указания координат, куда кнопка будет перемещаться:

Запустите приложение и нажмите на каждую из кнопок.

Класс математических функций Math

В пространстве имен System определен класс Math, содержащий стандартные математические функции, без которых трудно обойтись при построении многих выражений. Этот класс содержит два статических поля E (число е) и PI (число ПИ), а также 23 статических метода. Методы задают:

  • тригонометрические функции – Sin, Cos, Tan;

  • обратные тригонометрические функции – ASin, ACos, ATan, ATan2 (sinx, cosx);

  • гиперболические функции – Tanh, Sinh, Cosh;

  • экспоненту и логарифмические функции – Exp, Log, Log10;

  • модуль, корень, знак – Abs, Sqrt, Sign;

  • функции округления – Ceiling, Floor, Round;

  • минимум, максимум, степень, остаток – Min, Max, Pow, IEEERemainder.

Проверка вводимых значений. События KeyPress и Validating.

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

Событие KeyPress

Событие KeyPress происходит при нажатии клавиши при вводе информации в элемент TextBox. Событие вызывается нажатием клавиш с символами. Остальные клавиши вызывают события KeyDown и KeyUp.

Свойство KeyChar используется для выбора образцов нажатий клавиш во время выполнения и для использования или изменения подмножества стандартных нажатий клавиш.

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

if (char.IsDigit(e.KeyChar) )

{

e.Handled = true;

MessageBox.Show("Поле Name не может содержать цифры");

}

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

if (!char.IsDigit(e.KeyChar) )

{

e.Handled = true;

MessageBox.Show("Поле PIN не может содержать буквы");

}

Событие Validating

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

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

if(textBox2.Text =="")

{

e.Cancel=false;

}

else

{

try

{

double.Parse(textBox2.Text);

e.Cancel = false;

}

catch

{

e.Cancel = true;

MessageBox.Show("Поле PIN не может содержать буквы");

}

}

Задания к лабораторной работе

Создать программу для вычисления математической формулы. Ввод данных осуществлять в элементы TextBox. При нажатии на кнопку должно выполняться вычисление формулы. Задать фон формы и всех элементов управления. Предусмотреть проверку на правильность заполнения полей ввода.

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

  1. Структура программы.

  2. Переменные. Их объявление

  3. На какие виды и разновидности разделяются все типы данных в C#?

  4. Основное отличие структурных типов?

  5. Основное отличие ссылочных типов?

  6. Преобразования типов (явное, неявное)

  7. Форматирование данных

  8. Арифмитические, логические операторы, операторы сравнений

  9. Условный оператор if... else.

  10. Оператор множественного выбора switch

  11. Операторы циклов (for, while, do…while)

  12. Оператор цикла foreach

  13. Операторы прерываний

ЛАБОРАТОРНАЯ РАБОТА 2

РАЗРАБОТКА И ОТЛАДКА АЛГОРИТМОВ И ПРОГРАММ ПО ОБРАБОТКЕ МАССИВОВ С ИСПОЛЬЗОВАНИЕМ ОПЕРАТОРОВ ВЕТВЛЕНИЯ, ЦИКЛОВ, ФОРМ

Цель работы: изучение способов использования элементов управления (GroupBox, RadioButton, ListBox, ComboBox), настройки порядка перехода по элементам и получение навыков по работе c зубчатыми массивами в языке C#.

Основные сведения

Элементы управления GroupBox, RadioButton, ListBox, ComboBox

GroupBox (группировка) – позволяет объединять в группу отдельные элементы управления, по периметру выделена линией и вверху содержит текст, определенный в свойстве Text. Рамка группы темнее цвета фона.

Обычно группы используются в качестве «родителя» кнопок-переключателей (radio buttons). Все переключатели внутри одной группы взаимоисключающие. Нажатие клавиш со стрелками перемещает фокус ввода и метку выбора между переключателями.

RadioButton (переключатель) - элемент управления, который обычно представляет собой кружок, расположенный слева от текста. У класса RadioButton есть свойство Appearance, которому можно задать значение AppearanceButton - тогда элемент управления выглядит как кнопка, а также свойство CheckAlign, позволяющее менять положение кружка относительно текста.

Также у RadioButton есть булево свойство Checked, при изменении которого инициируется событие CheckedChanged.

По умолчанию значение AutoCheck равно true и если значение AutoCheck равно true и RadioButton «включен», щелчок кнопки ничего не изменит. Если AutoCheck равно true и RadioButton «выключен», щелчок мышью его «включит». Вдобавок, все «родственные» переключатели «выключатся».

Таким образом, в каждый момент включен всего лишь один из группы переключателей RadioButton. Обычно наборы взаимоисключающих кнопок-переключателей создаются как потомки GroupBox, хотя «родитель» у них может быть любой.

Обратите внимание, что «родственные» переключатели поддерживают ввод с клавиатуры: переключение осуществляется клавишами со стрелками.

Если не нужна немедленная реакция на изменения, нет необходимости устанавливать обработчик события CheckedChanged.

Однако если потребуется определить, какой из переключателей выбран, надо в цикле проверить свойства Checked всех родственных переключателей.

Если AutoCheck равно false, можно обрабатывать событие Click и самостоятельно включать/отключать переключатели. При желании можно сделать включенными несколько переключателей, но пользователя такая ситуация наверняка поставит в тупик.

ListBox (список) - содержит прокручиваемый набор объектов. По умолчанию пользователь враве выбрать один (или несколько) элементов, используя клавиатуру или мышь. Выбранные объекты выделяются.

Отображаемые элементы списка задаются свойством Items - объектом типа ListBox.ObjectCollection. В классе ListBox.ObjectCollection определен метод Add, позволяющий добавлять новые объекты в набор. В списке отображаются текстовые названия элементов, возвращаемые методом ToString каждого объекта. Свойство Sorted объекга ListBox обеспечивает автоматическую сортировку элементов. После этого можно использовать свойство Items объекта ListBox для обращения к отдельным объектам наподобие того, как это делают с массивом.

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

В свойстве SelectedIndex хранится индекс выбранного в данный момент элемента. Если выбранных элементов нет, его значение равно -1. Свойство SelectedItem представляет фактический выбранный элемент (объект). Оно может быть равным null. При выборе какого-либо элемента списка выражение:

Listbox.SelectedItem

эквивалентно выражению:

Listbox.Items[Listbox.SelectedIndex]

Следующие два выражения также равносильны:

Listbox.Text

и

Listbox.SelectedItem.ToString()

По умолчанию в списке разрешается выбрать только один элемент. Однако вы вправе разрешить множественное выделение, задав свойству SelectionMode одно из значений перечисления SelectionMode: None, One, MultiSimple или MultiExtended.

Вариант MultiSimple слегка меняет вид ListBox, делая различия между выбранными элементами (указанны выделением) и фокусом ввода (указан пунктиром). Фокус ввода перемещают клавишами-стрелками, а пробелом или мышью выбирают или отменяют выбор элементов. Вариант MultiExtended разрешает выбирать только диапазон последовательных элементов, для чего пользователь должен, придерживая клавишу Shift, стрелками выбрать нужный диапазон.

В списках с возможностью выбора нескольких элементов используется свойство «только для чтения» SelectedIndices (объект типа ListBoxSelectedlndexCollection) или SelectedItems (объект типа ListBoxSelectedObjectCollection).

Объекты ListBoxSelectedIndexCollection и ListBoxSelectedObjectCollection поддерживают индексы и доступ к отдельным элементам по механизму массива целых чисел.

Для получения информации об изменении выбранного элемента (или элементов) устанавливают обработчик события OnSelectedIndexChanged или OnSelectedValueChanged.

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

При использовании отрисовки владельцем первым делом надо присвоить свойству DrawMode значение DrawMode.OwnerDrawFixed (все пункты списка имеют одну высоту) или DrawMode.OwnerDrawVariable (пункты списка разной высоты). По умолчанию значение свойства DrawMode равно DrawMode.Normal, что возлагает обязанность отрисовки на сам элемент управления.

Если все элементы списка одинаковой высоты, ее нужно указать в свойстве ItemHeight. В противном случае необходимо задействовать событие MeasureItem, обработчик которого задается в соответствии с делегатом MeasureItemEventHandler. Предоставляемый сообщением объект MeasureItemEventArgs имеет свойства для чтения Graphics и Index. Первое представляет собой объект типа Graphics, служащий для вычисления высоты элемента, а последнее - числовой индекс элемента списка. Высота и ширина элемента задается свойствами ItemHeight и ItemWidth.

При отрисовке владельцем необходимо установить обработчик события DrawItem. Обработчик вызывается для каждого отображаемого элемента, при этом ему передается объект типа DrawItemEventArgs с несколькими свойствами ListBox «только для чтения»: BackColor, ForeColor и Font. Свойство Bounds — это объект типа Rectangle, в котором выполняется отрисовка. Кроме этого, обработчик получает объекты Graphics и Index. Свойство State — это член перечисления DrawItemState, которое указывает, выбран ли элемент, имеет фокус ввода и т. д. Класс DrawItemEventArgs также включает два метода, DrawBackground и DrawFocusRectangle, помогающие в отрисовке элемента списка.

ComboBox (Поле со списком) - это комбинация списка и текстового окна. В обычном состоянии отображается только текстовое окно со стрелкой «вниз» справа. По щелчку этой стрелки раскрывается список — внизу появляется окно со списком. По умолчанию пользователь вправе ввести текст в текстовое окно (чтобы выбрать элемент списка), редактировать отображаемый в окне текст или ввести совершенно новый текст. Введенный текст не добавляется автоматически в список — это делается из программы. Большинство программ не разрешают редактирование текста. Такое поведение управляется свойством DropDownStyle — членом перечисления ComboBoxStyle, содержащего следующие члены:

- Simple - текст можно редактировать, список постоянно открыт;

- DropDown - текст можно редактировать, список отображается по щелчку (по умолчанию);

- DropDownList - текст редактировать нельзя, список отображается по щелчку.

Для раскрытия списка (или определения его положения в текущий момент) можно использовать свойство DroppedDown.

Как и в ListBox, в программе можно задействовать свойства SelectedIndex и SelectedItem для определения или получения выбранного элемента. Поля со списком не поддерживают множественный выбор. Выбранный элемент отображается в текстовом окне элемента управления и доступен через свойство Text. В момент ввода текста в поле текстового окна свойство SelectedIndex равно -1, a SelectedItem - null.

Как и в ListBox, для обнаружения момента изменения выбранного элемента задействуют обработчики событий SelectedIndexChanged или SelectedValueChanged. Событие TextChanged информирует об изменении текста в верхней части ComboBox – из-за выбора другого элемента или ввода текста.

Элементы управления для работы с числами и датой

Порядок перехода по Tab

Если на форме размещено несколько элементов управления, то пользователи обычно ожидают, что между ними можно будет перемещаться с помощью клавиши Tab. Часто бывает необходимо после размещения элементов управления настроить порядок перехода между ними. Для этого используются два свойства (унаследованные от базового класса Control и поэтому общие для всех элементов управления): TabStop и Tablndex. Для свойства TabStop используются только два значения: true и false. Если для TabStop установлено значение true, то к этому элементу управления можно будет добраться с помощью клавиши Tab. Если же установлено значение false, то участвовать в переходах по Tab этот элемент управления не будет. Если элемент управления TabStop имеет значение true, то очередность перехода можно настроить с помощью свойства Tablndex.

В Visual Studio.NET предусмотрено средство, при помощи которого можно быстро настроить порядок перехода для элементов управления на форме. Это средство называется Tab Order Wizard и оно доступно из меню View (View > Tab Order). Чтобы изменить значения TabIndex для каждого элемента управления, достаточно просто щелкать мышью на элементах управления в выбранном нами порядке перехода. Для элементов управления, помещенных в группирующую рамку, Tab Order Wizard создает отдельную последовательность перехода.

Задания к лабораторной работе

Задание 1

Создать программу для вычисления двух функций, одна из которых задана при помощи ряда. В элементы управления TextBox следует вводить: начальное значение аргумента, конечное значение, шаг и число членов суммы. При нажатии на кнопку Button выполнить вычисление функций и отображение расчетных значений в элементе ListBox. Предусмотреть проверку на правильность заполнения полей ввода.

Задание 2

Создать программу для работы с рваным массивом.

Количество строк массива следует выбирать с помощью элемента ComboBox. В зависимости от выбранного значения из выпадающего списка отображать соответствующее число элементов TextBox для ввода количества элементов для каждой строки массива. Разместить на форме 2 кнопки Button. При нажатии на одну из кнопок отобразить созданный массив в элементе ListBox. При нажатии на вторую кнопку вывести результаты работы программы в элемент в другой ListBox. Предусмотреть проверку на правильность заполнения полей ввода.

  1. Напишите программу , которая сортирует строки рваного массива по количеству элементов в строке.

  2. Напишите программу для вычисления суммы двух рваных массивов. Каждый отсутствующий элемент при необходимости заменить нулем.

  3. Напишите программу для вычисления разности двух рваных массивов. Каждый отсутствующий элемент при необходимости заменить нулем.

  4. Напишите программу, которая для рваного массива находит номера строк, все элементы которых – нули.

  5. Напишите программу, которая для рваного массива находит номера строк, элементы в каждой из которых одинаковы.

  6. Напишите программу, которая меняет местами строки, содержащие наибольший и наименьший элемент рваного массива.

  7. Напишите программу, которая для рваного массива заменяет все элементы строки нулями, каждая из которых имеет одинаковый размер.

  8. Напишите программу для вывода и смены позиций максимального и минимального элементов рваного массива.

  9. Напишите программу для вычисления среднего арифмитического элементов всех четных столбцов рваного массива.

  10. Напишите программу для поиска наибольшего простого числа среди элементов рваного массива.

  11. Напишите программу для поиска столбца рваного массива, для которого среднеарифметическое значение его элементов максимально.

  12. Напишите программу для поиска всех неповторяющихся элементов рваного массива.

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

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

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

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

  1. Что такое массив?

  2. Определение одномерного массива в С#. Инициализация одномерного массива.

  3. Определение многомерного массива в С#. Инициализация многомерного массива.

  4. Определение ступенчатых массивов и их инициализация.

  5. Базовый класс Array, его методы и свойства.

ЛАБОРАТОРНАЯ РАБОТА 3

РАЗРАБОТКА И ОТЛАДКА АЛГОРИТМОВ И ПРОГРАММ ПО ОБРАБОТКЕ СТРОК С ИСПОЛЬЗОВАНИЕМ ФОРМ

Цель работы: изучение средств стандартного и форматированного ввода/вывода, классов String, StringBuilder для работы со строками, способов составления регулярных выражений с помощью класса Regex для поиска и изменения текста.

Основные сведения

Элементы управления CheckBox, CheckedListBox, ErrorProvider.

CheckBox (флажок) - это небольшой прямоугольник, расположенный слева от текста. Однако если свойству Appearance задать значение Арреarance.Button (по умолчанию Appearance.Normal), элемент управления будет схож с кнопкой, за исключением того, что будет по щелчку «залипать» и «отлипать». Вид элемента управления CheckBox можно изменить, задав свойству CheckAlign значение из перечисления ContentAlignment. По умолчанию используется значение ContentAlignment.MiddleLeft, то есть флажок по вертикали выравнивается по оси текста и располагается слева от него.

Булево свойство Checked указывает текущее состояние флажка — «установлен» или «сброшен». Событие CheckedChanged информирует об изменении состояния.

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

Свойству AutoCheck обычно задают false, когда планируют захватывать событие

Click и управлять установкой/сбросом флажка самостоятельно, задавая значение свойства Checked из программы. Такое изменение свойства Checked также инициирует событие CheckedChanged.

Иногда недостаточно одного состояния флажка — установленый или сброшенный, - требуется промежуточное состояние. Допустим, CheckBox управляет курсивным начертанием текста. Если в выбранном тексте есть и курсив, и обычный шрифт, CheckBox должен находиться в «неопределенном» состоянии (c другой стороны, если выбранный текст не может выделяться курсивом, CheckBox должен быть отключен).

Для использования этого третьего состояния, прежде всего, надо булеву свойству ThreeState присвоить значение true. Вместо свойства Checked нужно задействовать CheckState. Это значение из перечисления CheckState, состоящего из членов Unchecked, Checked и Indeterminate. Также, вместо установки обработчика CheckedChange, используют CheckStateChanged. Если вызвать метод EnableVisualStyles класса Application промежуточное состояние будет выглядеть как небольшой квадрат, в противном случае в элементе управления будет отображаться серый флажок.

Если AutoCheck равно true, по щелчку элемент управления будет по циклу менять свое состояние: «установлен-сброшен-неопределенный». Если необходим другой порядок, присвойте AutoCheck значение false и вручную закодируйте в обработчике события Click порядок смены значений CheckState.

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

В списках с флажками SelectionMode может принимать только значение SelectionMode.One или SelectionMode.None (В последнем варианте поведение элемента

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

времени выбран и выделен цветом только один элемент, однако флажками могут быть отмечены несколько пунктов. Можно сделать так, чтобы флаговые окна выглядели «притопленными», задав свойству ThreeDCheckBoxes значение true.

Перемещение фокуса выполняется клавишами со стрелками, а пробел служит для переключения флажка.

Первый щелчок мыши выделяет элемент списка, а следующий - устанавливает флажок. При выборе другого элемента состояние флажка останется неизменным. Можно избавиться от необходимости два раза щелкать мышь, для этого нужно задать свойству CheckOnClick значение true. Теперь состояние флажка будет меняться одним щелчком.

Два прилагающихся к набору элементов метода Add позволяют при добавлении новых элементов автоматически устанавливать флажки. Состояние флажка определяется значением второго аргумента — true или false:

ckdlstbox.Add("New Jersey", true);

Для определения состояния элемента управления можно использовать встречавшееся ранее при описании элементов управления Checkbox перечисление CheckState, содержащее члены Checked, Unchecked или Indeterminate:

ckdlstbox.Add("New York", CheckState.Indeterminate);

Позже можно изменить состояние флажка, указав индекс элемента:

SetItemChecked(5, true)

Перечисление CheckState можно использовать при перегрузке метода:

SetItemCheckState(7, CheckState.Unchecked)

Свойства «только для чтения» CheckedIndices и CheckedItems предоставляют наборы целочисленных индексов или объекты, выбранные в данный момент. Чтобы получать информацию об изменении состояния флажка, нужно установить обработчик события ItemCheck в соответствии с делегатом ItemCheckEventHandler. Предоставляемый вместе с сообщением о событии объект ItemCbeckEventArgs содержит свойство Index элемента, а также значения CurrentValue и NewValue, выраженные членами перечисления CheckState.

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

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

Рассмотрим пример, в котором на форме расположен элемент TextBox и обработчик события TextChanged для этого элемента управления. Когда обработчик события TextChanged срабатывает, мы проверяем, была ли введена цифра. Если нет, то активируем ошибку через ErrorProvider. В противном случае очищаем ErrorProvider:

private void textBox1_TextChanged(object sender, EventArgs e)

{

// Determine if the TextBox has a digit character.

string text = textBox1.Text;

bool hasDigit = false;

foreach (char letter in text)

{

if (char.IsDigit(letter))

{

hasDigit = true;

break;

}

}

// Call SetError or Clear on the ErrorProvider.

if (!hasDigit)

{

errorProvider1.SetError(textBox1, "Needs to contain a digit");

}

else

{

errorProvider1.Clear();

}

}

Для включения элемента ErrorProvider используется метдод SetError, в который первым параметром передается название проверяемого элемента управления и вторым параметром - сообщение об ошибке.

ErrorProvider имеет два свойства для отображения "мигания". В BlinkRate указывается количество миллисекунд для каждой из вспышек значка. BlinkStyle позволяет включить или отключить мигание в целом. Как правило, для простых пользовательских интерфейсов мигание ErrorProvider лучше отключать, т.к. его итак будет легко увидеть.

С помощью ErrorProvider можно предупреждать пользователя о наличии нескольких ошибок одновременно.

Строки

Все строки в C# являются объектами.

Для работы со строками в языке C# используются 2 класса: String, StringBuilder.

Особенности работы со строками типа String

1) Создание строк:

  • присвоить переменной типа string строковый литерал:

string str = "С#-строки - это мощная сила."

  • из массива типа char через конструктор класса String

char[ ] charray = {‘t’, 'e', 's', ‘t’} ;

string str = new string(charray) ;

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

int myString = 5;

string integerString = myInteger.ToString();

2) Особенности:

  • Класс String включает свойство Length, которое содержит длину строки.

string myString = “hello world”;

Console.WriteLine(myString.Length); //11

  • Чтобы получить значение отдельного символа строки, достаточно использовать индекс.

string str = "test";

Console.WriteLine(string[0]); //t

C помощью индекса нельзя присвоить символу внутри строки новое значение. Индекс можно использовать только для получения символа.

  • Для сравнения строк используется оператор "==". В этом случае проверяется равенство содержимого двух строк. То же справедливо и в отношении оператора " !=". Что касается остальных операторов отношения (например, ">" или ">="), то они сравнивают ссылки так же, как и объекты других типов.

  • С помощью оператора "+" можно конкатенировать (объединить) несколько строк.

string strl = "Один";

string str2 = "Два";

string str4 = strl + str2; // ОдинДва

  • Подобно другим типам данных, строки могут быть собраны в массивы.

string[] str = { "Это", "очень", "простой", "тест." };

  • Содержимое string-объектов неизменно. Другими словами, последовательность символов, составляющих строку, изменить нельзя. Если вам понадобится строка, которая должна представлять собой "вариацию на тему" уже существующей строки, создайте новую строку, которая содержит желаемые изменения. Неиспользуемые строковые объекты автоматически утилизируются системой сбора мусора. При этом необходимо понимать, что ссылочные переменные типа string могут менять объекты, на которые они ссылаются. А содержимое созданного string объекта изменить уже невозможно.

  • Для управления switch-инструкциями можно использовать string-объекты, причем это единственный тип, который там допускается, помимо типа int .

  • Строковые литералы в С# могут содержать различные управляющие последовательности, которые интерпретируются как определенный набор данных, предназначенных для отправки в выходной поток. Каждая управляющая последовательность начинается с обратной косой черты, за которой следует интерпретируемый знак (\n, \t, \a, \v, \\, \’, \” , \r).

  • В С# вводится использование префикса @ для строк, которые требуется воспроизвести буквально. Используя буквальное воспроизведение строк, вы отключаете обработку управляющих символов строк. Это может быть полезным при работе со строками, представляющими каталоги и сетевые пути. Тогда вместо использования управляющих символов \\ можно использовать следующее

Console.WriteLine(@”C:\MyApp\bin\debug”);

Двойную кавычку в такой строковый литерал можно вставить с помощью дублирования знака “. Например:

Console.WriteLine(@ “Cerebus said ““Darrr!:”””);

3) Методы работы со строками:

Метод

Назначение

Compare()

Статический метод, который позволяет сравнить две строки

CompareTo(string str)

Метод возвращает отрицательное значение, если вызывающая строка меньше строки str, положительное значение, если вызывающая строка больше строки str, и нуль, если сравниваемые строки равны

CompareOrdinal()

То же, что Compare, но без учета локальных установок

Concat()

Комбинирует отдельные экземпляры строк в одну строку (конкатенация)

Contains()

Метод, который позволяет определить, содержится ли в строке определенная подстрока

Copy(string str)

Метод возвращает копию строки str

Метод

Назначение

СоруТо()

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

Equals()

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

Format()

Статический метод, позволяющий сформатировать строку с использованием других элементарных типов данных (например, числовых данных или других строк) и обозначений типа {0}

IndexOf( string str)

Находит первое вхождение заданной подстроки или символа в строке

IndexOfAny()

Находит первое вхождение в строку любого символа из набора

Insert()

Метод, который позволяет вставить строку внутрь другой определенной строки

Join()

Строит новую строку, комбинируя содержимое массива строк

LastlndexOf( string str)

То же, что IndexOf, но находит последнее вхождение

LastlndexOfAny()

To же, что IndexOfAny, но находит последнее вхождение

PadLeft() PadRight()

Методы, которые позволяют дополнить строку какими-то символами, соответственно, справа или слева

Remove() Replace()

Методы, которые позволяют получить копию строки с соответствующими изменениями (удалением или заменой символов)

Split()

Метод, возвращающий массив string с присутствующими в данном экземпляре подстроками внутри, которые отделяются друг от друга элементами из указанного массива char или string

Substring()

Извлекает подстроку, начиная с определенной позиции строки

ToUpper ()  ToLower()

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

Trim()

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

Особенности работы со строками типа StringBuilder

Кроме строк типа string в языке C# существует ещё один вид строк — StringBuilder. Для символов, хранящихся в строках StringBuilder, также используется Unicode. Принципиальное отличие строки StringBuilder от строки string заключается в том, что элементы строки StringBuilder можно изменять напрямую, при этом такая строка заново не создаётся.

Класс работы со строками StringBuilder располагается в пространстве имен System.Text.

1) Создание строк

Для создания строки типа StringBuilder необходимо создать объект типа StringBuilder. Для этого существует несколько вариантов:

  • Пустая строка:

StringBuilder sb = new StringBuilder();

  • Строке можно задать начальную длину - здесь строке sb будет выделена память под n элементов:

int n = 50;

StringBuilder sb = new StringBuilder(n);

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

  • Строка может получить начальное значение:

StringBuilder sb = new StringBuilder("qwerty");

2) Особенности

Класс StringBuilder имеет два главных свойства:

Length (длина), показывающее длину строки, содержащуюся в объекте в данный момент

Capacity (емкость), указывающее максимальную длину строки, которая может поместиться в выделенную для объекта память. При создании пустого объекта емкость строки устанавливается в 16 символов.

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

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

3) Методы работы со строками типа StringBuilder:

Метод

Назначение

Append()

Добавляет строку к текущей строке

AppendFormat()

Добавляет строку, сформированную в соответствии со спецификатором формата

Insert()

Вставляет подстроку в строку

Remove()

Удаляет символ из текущей строки

Replace()

Заменяет все вхождения символа другим символом или вхождения подстроки другой подстрокой

ToString()

Возвращает текущую строку в виде объекта System.String (переопределение метода класса System.Object)

Регулярные выражения

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

обеспечивают:

  • эффективны й поиск в тексте по заданному шаблону;

  • редактирование, замену и удаление подстрок;

  • формирование итоговых отчетов по результатам работы с текстом.

С помощью регулярных выражений удобно обрабатывать, например, файлы в формате HTML , файлы журналов ил и длинные текстовые файлы. Для поддержки регулярных выражений в библиотеку .NE T включены классы, объединенные в пространство имен System.Text.RegularExpressions.

Метасимволы

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

Например, регулярное выражение для поиска в тексте фрагмента «Вася» заполняется с помощью четырех обычных символов Вася, а выражение для поиска двух цифр, идущих подряд, состоит из двух метасимволов \d\d.

С помощью комбинаций метасимволов можно описывать сложные шаблоны для поиска. Например, можно описать шаблон для IP-адреса, адреса электронной почты, различных форматов даты, заголовков определенного вида и т. д.

В таблице 3.1 описаны наиболее употребительные метасимволы, представляющие собой классы символов.

Таблица 3.1 Метасимволы, используемые для составления шаблона регулярных выражений

Символ

Интерпретация

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

\b \t \r \n

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

Классы символов

.

Соответствует любому символу, за исключением символа конца строки

[aeiou]

Соответствует набору символов из множества, заданного в квадратных скобках

[^aeiou]

Отрицание. Соответствует любому символу, за исключением символов, заданных в квадратных скобках

[0=9a-fA-F]

Задание диапазона символов, упорядоченных по коду. Так, 0-9 задает любую цифру

\w

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

\W

Любой символ кроме букв, цифр и знака подчеркивания

\s

Соответствует пробельным символам (символ пробела, табуляции, перевода строки, новой страницы)

\S

Любой символ, не являющийся пробелом

\d

Соответствует любому символу из множества цифр

\D

Любой символ кроме десятичной цифры

\b

Соответствие следует искать на границе слова (т.е. между символами, заданными \w и \W)

\B

Соответствие следует искать в любом месте, за исключением границы слова

Операции (повторители / модификаторы)

*

Задает ноль или более соответствий, например, \w* или (abc)*

+

Задает одно или более соответствий, например, \w+ или (abc)+

?

Задает ноль или одно соответствие, например, \w? или (abc)?

{n}

Задает в точности n соответствий, например, \w{2}

{n, m}

Задает по меньшей мере n, но не более m соответствий, например, (abc){2,5}

Группирование

(?<Name>)

При обнаружении соответствия выражению, заданному в круглых скобках, создается именованная группа, которой дается имя Name. Например, (?<tel> \d{7}). При обнаружении последовательности из семи цифр будет создана группа с именем tel

()

Разбивают регулярное выражение на группы. Для каждого выражения, заключенного в круглые скобки, содается группа, автоматически получающая номер. Полному регулярному выражению соответствуюет группа с номером 0. Например, выражение (\w)\1 используется для поиска сдвоенных символов

Уточняющие метасимволы

^

Соответствие следует искать только в начале строки

$

Соответствие следует искать только в конце строки

\A

Соответствие следует искать только в начале многострочной строки

\Z

Соответствие следует искать только в конце многострочной строки

Помимо рассмотренных элементов регулярных выражений можно использовать конструкцию выбора из нескольких элементов. Варианты выбора перечисляются через вертикальную черту. Например, если требуется определить, присутствует ли в тексте хотя бы один элемент из списка «cat», «dog» и «horse», можно использовать выражение cat|dog|horse

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

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

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

Например, для поиска в тексте имени файла cat.doc следует использовать регулярное выражение cat\.doc. Символ «точка» экранируется обратной косой чертой, для того, чтобы он воспринимался не как метасимвол «любой символ» (в том числе и точка!), а непосредственно.

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

(?<имя_переменной>фрагмент_выражения)

Фрагмент текста, совпавший при поиске с фрагментом регулярного выражения, заносится в переменную с заданным именем. Пусть, например, требуется выделить из текста номера телефонов, записанных в виде nnn-rm-nn. Регулярное выражение для поиска номера можно записать так:

(?<num>\d\d\d-\d\d-\d\d)

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

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

Рассмотрим еще один вариант применения группирования — для формирования обратных ссылок. Все конструкции, заключенные в круглые скобки, автоматически нумеруются, начиная с 1. Эти номера, предваренные обратной косой чертой, можно использовать для ссылок на соответствующую конструкцию. Например, выражение (\w)\1 используется для поиска сдвоенных символов в словах (mass, cooperate).

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

(Вася)\s+(должен)\s+(?<sum>\d+)\spy6\.\s+Hy что же ты,\1

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

Вася должен 5 руб. Ну что же ты, Вася

Вася должен 53459 руб. Ну что же ты, Вася

Выражение, задающее IP-адрес:

((\d{1.3}\.){3}\d{1.3})

Адрес состоит из четырех групп цифр, разделенных точками. Каждая группа может включать от одной до трех цифр. Примеры IP-адресов: 212.46.197.69, 212.194.5.106, 209.122.173.160. Первая группа, заключенная в скобки, задает весь адрес. Ей присваивается номер 1. В нее вложены вторые скобки, определяющие границы для повторителя {3}.

Переменную, имя которой задается внутри выражения в угловых скобках, также можно использовать для обратных ссылок в последующей части выражения. Например, поиск двойных символов в словах можно выполнить с помощью выражения (?<s>\w)\1<s>, где s — имя переменной, в которой запоминается символ, \w — элемент синтаксиса.

В регулярное выражение можно помещать комментарии. Поскольку выражения обычно проще писать, чем читать, это — очень полезная возможность. Комментарий либо помещается внутрь конструкции (?# ), либо располагается, начиная от символа # до конца строки.

Классы библиотеки .NET для работы с регулярными выражениями

Класс ы библиотеки .NET для работы с регулярным и выражениями объединены в пространство имен System.Text.RegularExpressions.

Начнем с класса Regex, представляющего собственно регулярное выражение.

Класс является неизменяемым, то есть после создания экземпляра его корректировка не допускается. Для описания регулярного выражения в классе определено несколько перегруженных конструкторов:

    • Regex () — создает пустое выражение;

    • Regex(String) — создает заданное выражение;

    • Regex(String, RegexOptions) — создает заданное выражение и задает параметры для его обработки с помощью элементов перечисления RegexOptions (например, различать или не различать прописные и строчные буквы).

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

Regex гх = new Regex(@"\b(?<word>\w+)\s+(\1<word>)\b", RegexOptions.IgnoreCase);

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

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

Листинг 3.1 . Поиск в строке дублированных слов (методом IsMatch)

using System;

using System.Text.RegularExpressions;

public class Test

{

public static void Main()

{

Regex r = new Regex(@"\b(?<word>\w+)[.,:;!? ]\s*(\k<word>)\b", RegexOptions.IgnoreCase);

string tst1 = "Oh. oh! Good morning!";

if (r.IsMatch( tstl))

Console.WriteLine("tstl yes");

else

Console.WriteLine("tstl no");

string tst2 = "Oh good morning. good morning, dear friend!";

if (r.IsMatch(tst2))

Console.WriteLine("tst2 yes");

else

Console.WriteLine("tst2 no");

}

}

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

tstl yes

tst2 no

Повторяющиеся слова в строке tst2 располагаются не подряд, поэтому она не соответствует регулярному выражению. Для поиска повторяющихся слов, расположенных в произвольных позициях строки, в регулярном выражении нужно всего-навсего заменить пробел (\s) «любым символом» (.) :

Regex г = new Regex(@a"\b(?<word>\w+)[..:;!? ].*(\1<word>)\b",RegexOptions.IgnoreCase );

Метод Match класса Regex, в отличие от метода IsMatch, не просто определяет, произошло ли совпадение, а возвращает объект класса Match — очередной фрагмент, совпавший с образцом. Рассмотрим листинг 3.2, в котором используется этот метод.

Листинг 3.2 . Выделение из строки слов и чисел (методом Match)

using System;

using System.Text.RegularExpressions;

public class Test

{

public static void Main()

{

string text = "Салат - $4, борщ - $3, одеколон - $10.";

string pattern = @"(\w+) - \$(\d+)[.,]";

Regex r = new Regex(pattern);

Match m = r.Match(text);

int total = 0;

while (m.Success)

{

Console.WriteLine(m);

total += int.Parse(m.Groups[2].ToString());

m = m.NextMatch();

}

Console.WriteLine("Итого: $" + total);

}

}

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

Салат - $4,

борщ - $3,

одеколон - $10.

Итого: $17

При первом обращении к методу Match возвращается первый фрагмент строки, совпавший с регулярным выражением pattern. В классе Match определено свойство Groups, возвращающее коллекцию фрагментов, совпавших с подвыражениями в круглых скобках. Нулевой элемент коллекции содержит весь фрагмент, первый элемент — фрагмент, совпавший с подвыражением в первых скобках, второй элемент — фрагмент, совпавший с подвыражением во вторых скобках, и т. д. Если при определении выражения задать фрагментам имена, как это было сделано в предыдущем листинге, можно будет обратиться к ним по этим именам, например;

string pattern = @"(?'name'\w+) - \$(?'price'\d+)[.,]";

total += int.Parse(m.Groups["price"].ToString());

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

Метод Matches класса Regex возвращает объект класса MatchCollection - коллекцию всех фрагментов заданной строки, совпавших с образцом.

Рассмотрим теперь пример применения метода Split класса Regex. Этот метод разбивает заданную строку на фрагменты в соответствии с разделителями, заданными с помощью регулярного выражения, и возвращает эти фрагменты в массиве строк. В листинге 3.3 строка из листинга 3.2 разбивается на отдельные слова.

Листинг 3.3 . Разбиение строки на слова (методом Split)

using System;

using System.Col1ections.Generiс;

using System.Text.RegularExpressions;

public class Test

{

public static void Main()

{

string text = "Салат - $4, борщ -$3. одеколон - $10.";

string pattern = "[ - ]+" ;

Regex r = new Regex(pattern);

List<string> words = new List<string>(r.Split(text));

foreach (string word in words)

Console.WriteLine(word);

} }

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

Салат

$4

борщ

$3

одеколон

$10

Метод Replасе класса Regex позволяет выполнять замену фрагментов текста. Определено несколько перегруженных версий этого метода. Вот как выглядит пример простейшего применения метода в его статическом варианте, заменяющего все вхождения символа $ символами у. е.:

string text = "Салат - $4, борщ -$3, одеколон - $10.";

string textl = Regex.Replасе( text, @"\$", "y.e." );

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

Помимо классов Regex и Match в пространстве имен System.Text.RegularExpressions

определены вспомогательные классы, например, класс Capture - фрагмент, совпавший с подвыражением в круглых скобках; класс CaptureCollection — коллекция фрагментов, совпавших со всеми подвыражениями в текущей группе; класс Group содержит коллекцию Capture для текущего совпадения с регулярным выражением и т. д.

Задания к лабораторной работе

Задание 1

Решить задачу, используя один из классов строк: String или StringBuilder.

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

  1. Текстовые сообщения часто печатаются строчными буквами, но многие сотовые телефоны имеют встроенные средства преобразования строчной буквы в прописную после символа пунктуации, как точка или знак вопроса. Составить программу, которая будет вводить сообщение в переменную String (на одной строке), а затем обрабатывать его с получением новой строки с прописными буквами в соответствующих местах.

  2. Составить программу, которая будет вводить строку в переменную String. Найти в ней те слова, которые начинаются и оканчиваются одной и той же буквой.

  3. Строка, содержащая произвольный русский текст, состоит не более чем из 200 символов. Написать, какие буквы и сколько раз встречаются в этом тексте. Ответ должен приводиться в грамматически правильной форме: например: а — 25 раз, к — 3 раза и т.д.

  4. Двумерный массив n x m содержит некоторые буквы русского алфавита, расположенные в произвольном порядке. Написать программу, проверяющую, можно ли из этих букв составить данное слово S. Каждая буква массива используется не более одного раза.

  5. Дана строка, содержащая текст и арифметические выражения вида a ® b, где ® — один из знаков +, -, *, /. Выписать все арифметические выражения и вычислить их значения.

  6. Составить программу, которая будет вводить строку в переменную String. Найти слово, встречающееся в каждом предложении, или сообщить, что такого слова нет.

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

  8. Даны две строки А и B. Составьте программу, проверяющую, можно ли из букв, входящих в А, составить В (буквы можно использовать не более одного раза и можно переставлять).

Например, А: ИНТЕГРАЛ; В: АГЕНТ — составить можно; В: ГРАФ —нельзя.

  1. Дана строка, содержащая текст на русском языке. Заменить все вхождения заданного слова на другое слово.

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

  3. Даны две строки f1 и f2- Строка f1 содержит произвольный текст. Слова в тексте разделены пробелами и знаками препинания. Строка f2 содержит не более 30 слов, которые разделены запятыми. Эти слова образуют пары: каждое второе является синонимом первого. Заменить в строке f1 те слова, которые можно, их синонимами. Результат поместить в новую строку.

  4. C клавиатуры вводится предложение, слова в котором разделены символом ‘_’ и маска (шаблон) для выбора из предложения нужных слов (содержит буквы и символ заполнителя *, который заменяет любое количество символов). Необходимо выбрать из предложения слова, которые подходят под маску (шаблон). Например:

ВЫРАЖЕНИЕ_ЕСТЬ_ПРАВИЛО

Маска *Н*Е ВЫРАЖЕНИЕ

*РА* ВЫРАЖЕНИЕ, ПРАВИЛО

  1. Выберите 10 произвольных букв русского алфавита. Введите произвольное слово. С помощью ключа длиной от 3 до 8 символов произведите шифровку слова в числовую комбинацию.

В Е Ж М Н О П Р С Т КЛЮЧ - 1234

0 1 2 3 4 5 6 7 8 9

МНОЖЕСТВО

3 4 5 2 1 8 9 0 5

1 2 3 4 1 2 3 4 1

4 6 8 6 3 1 2 4 6 - РЕЗУЛЬТАТ

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

  2. С клавиатуры вводятся 4 массива слов:

- существительные в именительном падеже (тормоз, дисковод)

- глаголы (ест, сажает)

- качественные прилагательные во множественном числе (ядовитые, прекрасные)

- существительные в винительном падеже множественного числа (колонки, заборы).

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

ТОРМОЗ ЕСТ ПРЕКРАСНЫЕ ЗАБОРЫ.

Задание 2

Выполнить задание на применение регулярных выражений.

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

  1. Задан текст. Определить входит ли в него заданное слово и сколько раз.

  2. Задан текст. Определить является ли он кодом HTML : содержит теги <html>, <form>, <h1>.

  3. Задан текст. Определить является ли он текстом на английском языке.

  4. Задан текст. После каждой буквы «о» вставить сочетание «Oк».

  5. Задан текст. Определить является ли он текстом на русском языке.

  6. Задан текст. Определить содержит ли он цифры.

  7. Задан текст и слово. Определить сколько предложений начинается с заданного слова.

  8. Задан текст. Выбрать из него все 7-значные номера телефонов.

  9. Задан текст. Определить содержит ли он цифры.

  10. Задан текст. Выбрать из него все e-mail адреса.

  11. Задан текст, содержащий буквы и цифры. Найти произведение всех чисел в тексте.

  12. Задано предложение. Распечатать все слова в столбик.

  13. Задан текст. Определить количество согласных букв в нем и распечатать их.

  14. Задан текст . Определить, сколько в нем слов, состоящих не более чем из четырех букв.

  15. Задан текст. Распечатать из текста только цитаты, то есть предложения, заключенные в кавычки.

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

  1. Массивы (одномерные, двухмерные, рваные)

  2. Тип char и принимаемые значения переменными типа char.

  3. Методы и свойства класса Char.

  4. Тип char[] и его отличительные особенности от С/С++.

  5. Тип String и способы его конструирования.

  6. Операции над строками типа string.

  7. Задание строковых констант.

  8. Методы и свойства класса String.

  9. Динамические методы и свойства класса String.

  10. Класс StringBuilder. Конструкторы.

  11. Операции над строками StringBuilder.

  12. Основные методы класса StringBuilder.

  13. Что такое регулярные выражения. Применение регулярных выражений.

  14. Задание регулярного выражения. Поиск подстрок с помощью регулярного выражения.

  15. Класс Regex и его методы.

  16. Свойства класса Match.

  17. Классы Match и MatchCollection и их свойства.

  18. Классы Group и GroupCollection и их свойства.

ЛАБОРАТОРНАЯ РАБОТА 4

РАЗРАБОТКА ПРОГРАММ С ИСПОЛЬЗОВАНИЕМ КЛАССОВ

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

Основные сведения

Примеры выполнения заданий лабораторной работы

Пример 1. Описать класс «запись», содержащий следующие закрытые поля: фамилия, имя, номер телефона, дата рождения (массив из трех чисел).

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

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

using System;

using System.Collections.Generic;

namespace Zapis

{

class Zapis {

// закрытые члены класса: фамилия, имя, телефон, дата

рождения

private String _famil;

private String _name;

private String _telefon;

private int[] _date = new int[3];

private static int _KolZap;

// конструстор класса

public Zapis() {

Famil = "";

Name = "";

Telefon = "";

Date[0] = 0;

Date[1] = 0;

Date[2] = 0;

_KolZap++;

}

// свойства для доступа к закрытым членам класса

public String Famil {

get { return _famil; }

set { _famil = value; }

}

public String Name {

get { return _name; }

set { _name = value; }

}

public String Telefon {

get { return _telefon; }

set { _telefon = value; }

}

public int[] Date {

get { return _date; }

set { _date = value; }

}

//статический метод, возвращающий количество записей

public static int GetKolZap() {

return _KolZap;

}

// метод для вывода информации о записи на экран

public void print() {

Console.WriteLine("{0} {1}, родился {2}.{3}.{4}, его номер телефона:{5}", Name, Famil, Date[0], Date[1], Date[2], Telefon);

}

}

class ZapisBook {

// закрытый массив записей

private Zapis[] _mass;

//конструктор класса, создает массив записей

public ZapisBook(int KolZap) {

_mass = new Zapis[KolZap];

}

//индексатор для доступа к объекту класса

public Zapis this[int index] {

get { return _mass[index]; }

set { _mass[index] = value; }

}

}

class Program

{

static void Main() {

int _kolZap;

Console.Write("Введите количество записей: ");

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

ZapisBook zp = new ZapisBook(_kolZap);

// заполнение массива записей

Zapis _currZap;

for (int i = 0; i < _kolZap; i++) {

_currZap = new Zapis();

Console.WriteLine("Введите информацию по записи № {0}", i + 1);

Console.Write("Фамилия: ");

_currZap.Famil = Console.ReadLine();

Console.Write("Имя: ");

_currZap.Name = Console.ReadLine();

Console.Write("Телефон: ");

_currZap.Telefon = Console.ReadLine();

Console.Write("День рождения: ");

_currZap.Date[0] = int.Parse(Console.ReadLine());

Console.Write("Месяц рождения: ");

_currZap.Date[1] = int.Parse(Console.ReadLine());

Console.Write("Год рождения: ");

_currZap.Date[2] = int.Parse(Console.ReadLine());

zp[i] = _currZap;

Console.WriteLine("");

Console.WriteLine("Количество записей в записной книге = {0}",

Zapis.GetKolZap());

}

Console.WriteLine("Список всех записей:\n");

// вывод записей на экран

for (int i = 0; i < _kolZap; i++) {

zp[i].print();

}

Console.ReadLine();

}

}

}

Пример 2. Создать класс Rectangle, разработав следующие элементы класса:

- Поля: int a, b;

- Конструктор, позволяющий создать экземпляр класса с заданными длинами сторон.

- Методы, позволяющие:

вывести длины сторон прямоугольника на экран;

рассчитать периметр прямоугольника;

рассчитать площадь прямоугольника.

- Свойства:

получить-установить длины сторон прямоугольника (доступное для чтения и записи);

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

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Study

{

class Rectangle

{

int a, b;

int [] array = new int [2];

public Rectangle(int a, int b)

{

this.a = a;

this.b = b;

}

public void Show ()

{

Console.WriteLine("Storony " + a +" x " + b);

}

public int Perimetr ()

{

return a * 2 + b * 2;

}

public int Square()

{

return a * b;

}

public int A

{

get { return a; }

set { a = value; }

}

public int B

{

get { return b; }

set { b = value; }

}

public bool K //kvadrat?

{

get { if (a == b) return true; else return false; }

}

public int this[int i]

{

get

{

if (i == 0)

return a;

else

return 0;

if (i == 1)

return 1;

else

return 0;

}

set

{

if (i == 0)

array[i] = a;

if (i == 1)

array[i] = b;

}

}

public static Rectangle operator ++(Rectangle ob)

{

Rectangle ob1 = new Rectangle(ob.a, ob.b);

ob1.a = ob.a + 1;

ob1.b = ob.b + 1;

return ob1;

}

public static Rectangle operator --(Rectangle ob)

{

Rectangle ob1 = new Rectangle(ob.a, ob.b);

ob1.a = ob.a - 1;

ob1.b = ob.b - 1;

return ob1;

}

public static bool operator true(Rectangle ob)

{

if (ob.a == ob.b)

return true;

else return false;

}

public static bool operator false(Rectangle ob)

{

if (ob.a != ob.b)

return true;

else

return false;

}

public static Rectangle operator *(Rectangle ob, int skal)

{

Rectangle ob1 = new Rectangle(ob.a, ob.b);

ob1.a = ob.a * skal;

ob1.b = ob.b * skal;

return ob1;

}

public static implicit operator Rectangle (string a) //неявное преобразование типа int [] в DemoArray

{

return new Rectangle(a);

}

public static implicit operator int [](Rectangle a) //неявное преобразование типа DemoArray в int []

{

int []temp=new int[a.LengthArray];

for (int i = 0; i < a.LengthArray; ++i)

temp[i] = a[i];

return temp;

}

}

}

}

using System;

using Study;

class MyClass

{

static void Main()

{

Rectangle ob = new Rectangle(3,5);

ob.Show();

Console.WriteLine("Perimentr = " + ob.Perimetr());

Console.WriteLine("Ploshad = " + ob.Square());

ob.A++;

ob.B++;

ob.Show();

ob.A--;

ob.B--;

ob.Show();

ob = ob * 2;

ob.Show();

ob.A = 15;

ob.B = 15;

ob.Show();

if (ob)

{

Console.WriteLine("Eto kvadrat!");

}

Console.ReadKey();

}

}

Задания к лабораторной работе

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

1) Создать класс «Сторона» для хранения длины стороны фигуры. Обеспечить проверку на правильность ввода данных. Предусмотреть свойства для получения состояния объекта.

Создать класс «Треугольник», обеспечивающий следующие возможности:

• установку и получение длин сторон треугольника;

• проверку на существование треугольника с заданными длинами сторон;

• расчет периметра и площади треугольника;

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

2) Создать класс «Число», содержащий закрытое поле для хранения целого числа в диапазоне от –15 до 45. Обеспечить проверку на правильность ввода чисел, предусмотреть свойства для получения состояния объекта.

Создать класс «Одномерный массив» для работы с массивом целых чисел (вектором).

Обеспечить следующие возможности:

• обращение к отдельному элементу массива с контролем выхода за пределы массива;

• выполнение операций поэлементного сложения и вычитания массивов с одинаковыми границами индексов;

• выполнение операций умножения и деления всех элементов массива на скаляр;

• вывод на экран элемента массива по заданному индексу и всего массива.

3) Создать класс «Товар», содержащий следующие закрытые поля: название товара, количество, стоимость товара в рублях. Обеспечить проверку на правильность ввода данных. Предусмотреть свойства для получения состояния объекта.

Создать класс «Склад», содержащий закрытый массив товаров. Обеспечить:

• вывод информации о товаре по номеру с помощью индекса;

• вывод информации о товаре, название которого введено с клавиатуры, если таких товаров нет, выдать соответствующее сообщение;

• сортировку товаров по наименованию, по количеству и по цене.

4) Создать класс «Строка», содержащий закрытое поле для хранения русскоязычной строки. Обеспечить проверку на правильность ввода русских символьных данных, предусмотреть свойства для получения состояния объекта.

Создать класс «Текст» для работы с массивом русскоязычных строк.

Обеспечить следующие возможности:

• обращение к отдельной строке массива по индексу с контролем выхода за пределы массива;

• выполнение операций поэлементного сцепления двух массивов с образованием нового массива;

• выполнение операций слияния двух массивов с исключением повторяющихся элементов;

• вывод на экран элемента массива по заданному индексу и всего массива.

5) Создать класс «Книга», содержащий следующие закрытые поля: автор, название, год издания, категория. Обеспечить проверку на правильность ввода данных. Предусмотреть свойства для получения состояния объекта.

Создать класс «Домашняя библиотека». Предусмотреть возможность работы с произвольным числом книг, поиска книги по какому-либо признаку (по автору, по году издания или категории), добавления книг в библиотеку, удаления книг из нее, доступа к книге по номеру.

6) Создать класс, реализующий тип данных «Вещественная матрица» и работу с ними. Класс должен реализовывать следующие операции над матрицами:

• сложение, вычитание (как с другой матрицей, так и с числом);

• комбинированные операции присваивания (+=, -=);

• операции сравнения на равенство/неравенство;

• операции вычисления обратной и транспонированной матрицы;

• доступ к элементу по индексам.

7) Создать класс «Элемент», содержащий закрытое поле для хранения символа. Предусмотреть свойства для получения состояния объекта.

Создать класс «Множество», позволяющий выполнять основные операции надо множеством символов: добавление и удаление элемента, пересечение, объединение и разность множеств.

8) Создать класс «Автомобиль», содержащий закрытые поля: госномер, цвет, фамилия владельца. Для каждого автомобиля указывается номер места и признак присутствия на стоянке. Обеспечить проверку на правильность ввода данных. Предусмотреть свойства для получения состояния объекта.

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

9) Создать класс «Студент», содержащий следующие закрытые поля: фамилия, имя, дата рождения, группа. Обеспечить проверку на правильность ввода данных. Предусмотреть свойства для получения состояния объекта.

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

10) Создать класс «Колода карт», включающий закрытый массив элементов класса «Карта». Предусмотреть свойства для получения состояния объекта. В карте хранятся масть и номер. Обеспечить возможность вывода карты по номеру, вывода всех карт, перемешивания колоды и выдачи всех карт из колоды поодиночке и по 6 штук в случайном порядке.

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

11) Создать класс «самолет», содержащий следующие закрытые поля: название пункта назначения, шестизначный номер рейса, время отправления. Обеспечить проверку на правильность ввода данных. Предусмотреть свойства для получения состояния объекта.

Создать класс «Аэропорт», содержащий закрытый массив самолетов. Обеспечить следующие возможности:

• вывод информации о самолете по номеру рейса с помощью индекса;

• вывод информации о самолетах, отправляющихся в течение часа после введенного с клавиатуры времени;

• вывод информации о самолетах, отправляющихся в заданный пункт назначения;

Информация должна быть отсортирована по времени отправления.

12) Создать класс, реализующий тип данных «Вещественная матрица» и работу с ними. Класс должен реализовывать следующие операции над матрицами:

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

• операции сравнения на равенство/неравенство;

• доступ к элементу по индексам.

13) Создать класс «поезд», содержащий следующие закрытые поля: название пункта, назначения, номер поезда (может содержать буквы и цифры), время отправления. Обеспечить проверку на правильность ввода данных. Предусмотреть свойства для получения состояния объекта.

Создать класс «Вокзал», содержащий закрытый массив поездов. Обеспечить следующие возможности:

• вывод информации о поезде по номеру с помощью индекса;

• вывод информации о поездах, отправляющихся после введенного с клавиатуры времени;

• перегруженную операцию сравнения, выполняющую сравнение времени отправления двух поездов;

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

Информация должна быть отсортирована по времени отправления.

14) Создать класс «Точка», содержащий закрытые поля для хранения координат точки. Обеспечить проверку на правильность ввода данных. Предусмотреть свойства для получения состояния объекта.

Создать класс «Массив точек», который обеспечивает следующие возможности:

• вывод координаты точки на экран;

• расчет расстояния от начала координат до точки;

• перемещение точки на плоскости на вектор (a, b).

• упорядочивание точек относительно оси ординат.

15) Создать класс «Жилец», содержащий закрытые поля для хранения следующей информации: ФИО, город, улица, номер дома, номер квартиры, телефон. Обеспечить проверку на правильность ввода данных. Предусмотреть свойства для получения состояния объекта.

Создать класс «Дом» для хранения информации по всем жильцам. Реализовать следующие возможности:

• вывод информации о конкретном жильце дома по заданным критериям (фамилия, номер квартиры);

• сортировка жильцов по фамилиям, по адресу проживания;

• поиск всех жильцов, проживающих по заданному адресу.

16) Создать класс «Деньги», содержащий закрытые поля для хранения номинала купюры и их количества. Обеспечить проверку на правильность ввода данных. Предусмотреть свойства для получения состояния объекта.

Создать класс «Банк», в котором реализовать закрытый массив денег, обеспечивающий следующими возможностями:

• вывод номинала и количества купюр, хранящихся в банке;

• вывод полной суммы денег, хранящейся в банке;

• определение, хватит ли денежных средств на покупку товара на сумму N рублей.

• определение, сколько штук товара стоимости n рублей можно купить на имеющиеся денежные средства.

17) Создать класс для работы с восьмеричным числом, хранящимся в виде строки символов. Реализовать конструкторы, свойства, методы и следующие операции:

• операции присваивания, реализующие значимую семантику;

• операции сравнения;

• преобразование в десятичное число;

• форматный вывод;

• доступ к заданной цифре числа по индексу.

18) Создать класс для работы с датой. Обеспечить проверку на правильность ввода данных. Предусмотреть свойства для получения состояния объекта.

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

• вычисление даты предыдущего дня;

• вычисление даты следующего дня;

• определение количества дней до конца месяца;

• определение года високосным;

• определение даты в зависимости от количества дней, пройденных с начала года.

19) Создать класс «Предметный указатель». Каждый компонент указателя содержит слово и номера страниц, на которых это слово встречается. Количество номеров страниц, относящихся к одному слову, от одного до десяти. Предусмотреть возможность формирования указателя с клавиатуры и из файла, вывода указателя, вывода номеров страниц для заданного слова, удаления элемента из указателя.

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

20) Создать класс для работы с регулярными выражениями. Класс должен содержать закрытые поля для хранения шаблона поиска (тип Regex) и текста (тип String). Предусмотреть свойства для получения состояния объекта.

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

• получение и вывод текста на экран;

• определение, содержит ли текст фрагменты, соответствующие шаблону поиска;

• вывод на экран всех фрагментов текста, соответствующих шаблону поиска;

• удаление из текста всех фрагментов, соответствующих шаблону поля.

21) Создать класс «Преподаватель», содержащий следующие закрытые поля: ФИО, предмет, группа, даты занятий. Обеспечить проверку на правильность ввода данных. Предусмотреть свойства для получения состояния объекта.

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

• вывод информации о преподавателе на экран;

• изменение расписания;

• вывод информации о занятиях на заданную дату (преподаватель, группа, предмет);

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

22) Создать класс «Число», содержащий закрытое поле для хранения вещественного числа в диапазоне от –35.5 до 35.5. Обеспечить проверку на правильность ввода чисел, предусмотреть свойства для получения состояния объекта.

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

Обеспечить следующие возможности:

• изменение числа строк и столбцов;

• вывод на экран подматрицы любого размера и всей матрицы;

• выполнение операций поэлементного сцепления двух матриц с образованием новой матрицы;

• доступ по индексам к элементу матрицы.

23) Создать класс «Англо-русский словарь», обеспечивающий возможность хранения нескольких вариантов перевода для каждого слова. Реализовать доступ по строковому индексу - английскому слову. Обеспечить возможность вывода всех значений слов по заданному префиксу.

24) Создать класс «запись», содержащий следующие закрытые поля: ФИО, номер телефона, дата рождения (массив из трех чисел). Обеспечить проверку на правильность ввода данных. Предусмотреть свойства для получения состояния объекта.

Создать класс «Записная книжка», содержащий закрытый массив записей. Обеспечить:

• вывод на экран информации о человеке, номер телефона которого введен (если такого нет, то выдать соответствующее сообщение);

• поиск людей, день рождения которых сегодня или в заданный день;

• поиск людей, день рождения которых будет в этом месяце;

• поиск людей, номер телефона которых начинается на три заданных цифры.

25) Создать класс «Сторона» для хранения длины стороны фигуры. Обеспечить проверку на правильность ввода данных. Предусмотреть свойства для получения состояния объекта.

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

• вывод длин сторон прямоугольника на экран;

• расчет периметр и площади прямоугольника;

• определение, является ли данный прямоугольник квадратом;

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

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

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

2. Статические поля и методы класса.

3. Свойства, индексаторы.

4. Перегрузка операторов.

5. Исключения. Обработка исключений в С#.

ЛАБОРАТОРНАЯ РАБОТА 5

СОЗДАНИЕ MDI-ПРИЛОЖЕНИЙ

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

Основные сведения

Создание MDI-приложения

Основа интерфейса (MDI) приложения - MDI родительская форма. Это - форма, которая содержит MDI дочерние окна. Дочерние окна являются "подокнами", с которыми пользователь взаимодействует в MDI приложении.

Для определения главного окна, как родительской формы в окне Свойств, необходимо установить свойство IsMDIContainer в значение true. Это определяет форму как MDI контейнер для дочерних форм. Для того чтобы родительское окно занимало весь экран необходимо свойству WindowsState установить значение Maximized.

Упражнение 1. Создание нового проекта с базовой формой

  1. Создайте новый проект WindowsForms, укажите имя MdiApplication.

  2. Переименуйте файл Form1.cs на ParentForm.cs

  3. Для свойства формы IsMdiContainer задайте значение True. Таким способом эта форма будет определена как родительская форма MDI.

Создание меню для работы с формами

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

Элемент управления ToolStrip представляет собой контейнер, используемый для создания структур меню, панелей инструментов и строк состояний.

Элемент управления MenuStrip - это контейнер для структур меню в приложении. Система меню строится добавлением объектов ToolStripMenu к menuStrip.

Класс ToolStripMenuItem служит для построения структур меню. Каждый объект ToolStripMenuItem представляет отдельный пункт в системе меню.

В Windows также есть интерфейс для работы с так называемыми быстрыми клавишами, или акселераторами. Сочетание клавиш указывают из перечисления Shortcut. Следует назначать стандартным пунктам общепринятые сочетания клавиш.

Упражнение 2. Создание пункта меню File

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

  1. Добавьте на форму ParentForm элемент управления MenuStrip и задайте для его свойства Name значение MdiMenu.

  2. Выделите меню в верхней части формы и задайте имя первого пункта меню &File.

  3. Для свойства Name пункта меню File задайте значение FileMenuItem.

  4. Раскройте меню File.

  5. Выделите элемент, появившейся под элементом File, и задайте его как &New.

  6. Для свойства Name пункта меню New задайте значение NewMenuItem.

  7. Выделите элемент, появившийся под элементом New, и задайте его как &Exit.

  8. Ддя свойства Name пункта меню Exit задайте значение ExitMenuItem.

  9. Дважды кликните левой кнопкой мыши по пункту меню Exit для создания обработчика события Click.

  10. В обработчик события Click для пункта меню следующий код:

this.Close ();

Как вы думаете, для чего используется знак & перед буквой в названии пункта меню? Изучите особенности названия пункта меню, заданного со знаком & в любом из мест названия и без него.

Упражнение 3. Создание пункта меню Window

При работе с несколькими окнами в MDI-приложениях удобно упорядочивать их на экране. Метод LayoutMdi содержит перечисление MdiLayout, содержащее четыре члена. ArrangeIcons переключает фокус на выбранную форму, в свойстве MdiList пункта меню ArrangeIcons устанавливаем также значение true. При открытии нескольких новых документов окна располагаются каскадом, их можно расположить горизонтально — значение TileHorizontal или вертикально — значение TileVertical, а затем снова вернуть каскадное расположение — Cascade. Для упорядоченного расположения дочерних окон в главном окне выполните следующие действия:

a. Создайте пункт меню Window.

b. Выделите второй пункт меню справа от File и задайте его значением &Window.

c. Ддя свойства Name пункта меню Window задайте значение WindowMenuItem.

d. Раскройте меню Window.

e. Выделите элемент, появившейся под элементом Window, и задайте для его свойства Text значение &Cascade.

f. Для свойства Name пункта меню Cascade задайте значение WindowCascadeMenuItem.

g. Выделите элемент, появившийся под элементом Cascade, изадайте для его свойства Text значение ilе.

h. Для свойства Name пункта меню Tile задайте значение WindowTileMenuItem.

i. Дважды кликните левой кнопкой мыши по пункту меню Cascade для создания обработчика события Click:

j. Вернитесь в режим конструктора и дважды кликните левой кнопкой мыши по пункту меню Tile

к. В обработчик события Click для пункта меню Tile добавьте следующий код:

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

Упражнение 4. Реализация списка открытых окон в меню Window

Для главного меню приложения (в нашем случае для Mdimenu) укажите в свойстве MdiWindowListItem имя пункта, созданного для отображения списка отрытых окно (в нашем случае – это WindowMenuItem).

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

Создание дочерней формы

Упражнение 5. Создание дочерней формы и дочернего меню

  1. Создайте еще одно окно, которое будет дочерним. Для этого выберите пункт меню Project/Add Windows Form.

  2. Задайте имя формы ChildForm.cs

  3. Для свойства Text формы задайте значение Child Form.

  4. В панели инструментов выберите элемент RichTextBox и задайте для его свойства Name значение ChildTextBox.

  5. Для свойства Dock элемента управления RichTextBox задайте значение Fill.

  6. Удалите существующий текст (если он есть) для свойсгва Text элемента управления RichTextBox и оставьте его пустым.

  7. В панели инструментов выберите элемент управления MenuStrip.

  8. Для свойства Name элемента управления MenuStrip задайте значение ChildWindowMenu.

  9. Выделите меню в верхней части формы и наберите текст F&ormat.

  10. Для свойства Name пункта меню Format задайте значение FormatMenuItem, для свойсгва MergeAction установите значение Insert, а свойству MergeIndex значение 1. В этом случае меню Format будет располагаться после File при объединении базового и дочерних меню.

  11. Выделите элемент, появившийся под элементом Format, и наберите текст &Toggle Foreground.

  12. Для свойства Name пункта меню Toggle Foreground задайте значение ТoggleMenuItem.

  13. Дважды кликните левой кнопкой мыши но пункту меню Toggle Foreground и добавьте следующий код в обработчик события Click:

Упражнение 6. Отображение дочерней формы

  1. Откройте ParentForm.cs в режиме конструктора.

  2. Дважды кликните левой кнопкой мыши по кнопке New в меню File для создания обработчика события Click.

  3. Добавьте следующий код для обработчика события Click для пункта меню New:

  1. Для проверки работы приложения постройте и запустите приложение. Когда появится родительская форма, выберите пункт меню File | New.

В родительском окне появится новая дочерняя форма. Обратите внимание на то, дочернее меню сливается с родительским и пункты меню упорядочиваются в соответствие со свойством MergeIndex, установленным ранее.

  1. Наберите какой-нибудь текст в дочернем окне и воспользуйтесь пунктом меню Format для изменения цвета шрифта текста.

  2. Откройте еще несколько дочерних окон.

  3. Выберите пункт меню Window | Tile. Обратите внимание на то, что дочерние окна выстраиваются в упорядоченном порядке.

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

  5. Для закрытия приложения выберите пункт меню File | Exit.

Обратите внимание, что заголовок у дочерних окон одинаковый. При создании нескольких документов, например в Microsoft Word, они называются Документы, где N — номер документа. Реализуйте эту возможность:

a. Откройте код родительской формы и в классе ParentForm объявите переменную openDocuments:

private int openDocuments = 0;

b. К свойству Text дочерней формы добавьте счетчик числа открываемых документов (в коде обработчика события Click для пункта меню New):

newChild.Text = newChild.Text+" "+ ++openDocuments;

Задания к лабораторной работе

Создайте приложение с двумя формами: родительской и дочерней.

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

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

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

  1. Что такое форма и ее назначение?

  2. Что такое элементы управления? На какие группы они делятся?

  3. Как установить элемент управления на форму и проинициализировать его?

  4. Что такое событие? Как в .Net реализуются события?

  5. Что такое обработчик события?

  6. Что такое делегат?

  7. Как задаются обработчики событий для элементов управления?

  8. Как происходит подключение к прослушиванию события?

  9. Как создать собственные события и их обработчики?

  10. Как создать верхнее меню?

  11. Как добавить несколько пунктов меню?

  12. Как установить определенному пункту меню сочетание клавиш?

  13. Как создать панель инструментов?

  14. Как добавить новую форму в приложение?

  15. Как организовать переход к добавленной форме?

  16. Как добавить новый класс в проект?

  17. Какая компонента позволяет отображать список на форме?

  18. Какая компонента позволяет задавать на форме флажок?

ЛАБОРАТОРНАЯ РАБОТА 6

РАЗРАБОТКА ПРОГРАММ С ИСПОЛЬЗОВАНИЕМ ИЕРАРХИИ КЛАССОВ

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

Основные сведения

Задания к лабораторной работе

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

  1. Механизмы наследования

  2. Вложенные классы

  3. Использование абстрактных методов и классов

  4. Применение виртуальных методов

ЛАБОРАТОРНАЯ РАБОТА 7

РАЗРАБОТКА ПРОГРАММ С ИСПОЛЬЗОВАНИЕМ ИНТЕРФЕЙСОВ

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

Основные сведения

Задания к лабораторной работе

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

  1. Механизмы наследования

  2. Вложенные классы

  3. Использование абстрактных методов и классов

  4. Применение виртуальных методов

ЛАБОРАТОРНАЯ РАБОТА 8

РАЗРАБОТКА ПРОГРАММ ПО РАБОТЕ С ФАЙЛАМИ С ИСПОЛЬЗОВАНИЕМ ДИАЛОГОВЫХ ОКОН

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

Основные сведения

Диалоговые окна

Выполняя различные операции с документом — открытие, сохранение, печать, предварительный просмотр, — мы сталкиваемся с соответствующими диалоговыми окнами. Разработчикам .NET не приходится заниматься созданием окон стандартных процедур: элементы OpenFileDialog, SaveFile Dialog содержат уже готовые операции.

OpenFileDialog

Добавьте на форму frmmain элемент управления OpenFileDialog из окна панели инструментов ToolBox.

Свойство FileName задает название файла, которое будет находиться в поле "Имя файла:" при появлении диалога. Свойство Filter задает ограничение файлов, которые могут быть выбраны для открытия — в окне будут показываться только файлы с заданным расширением. Через вертикальную разделительную линию можно задать смену типа расширения, отображаемого в выпадающем списке "Тип файлов". Здесь введено Text Files (*.txt)|*.txt|All Files(*.*)|*.* что означает обзор либо текстовых файлов, либо всех. Свойство InitialDirectory позволяет задать директорию, откуда будет начинаться обзор. Если это свойство не установлено, исходной директорией будет рабочий стол.

Для работы с файловыми потоками в коде формы blank подключаем пространство имен System.IO.

//Создаем метод Open, в качестве параметра объявляем строку адреса файла.

public void Open(String OpenFileName) {

if (OpenFileName == null) {

return;

}

else {

StreamReader sr = new StreamReader(OpenFileName);

richTextBox1.Text = sr.ReadToEnd();

sr.Close();

DocName = OpenFileName;

}

}

Добавим обработчик пункта меню Open формы frmmain:

private void mnuopen_Click(object sender, EventArgs e) {

//Можно программно задавать доступные для обзора расширения файлов

openFileDialog1.Filter = "Text Files (*.txt)|*.txt|All Files(*.*)|*.*";

//Если выбран диалог открытия файла, выполняем условие

if (openFileDialog1.ShowDialog() == .DialogResult.OK) {

blank frm = new blank();

frm.Open(openFileDialog1.FileName);

//Указываем, что родительской формой является форма frmmain

frm.MdiParent = this;

//Присваиваем переменной DocName имя открываемого файла

frm.DocName = openFileDialog1.FileName;

//Свойству Text формы присваиваем переменную DocName

frm.Text = frm.DocName;

frm.Show();

}

}

Для корректного чтения кириллицы текст в блокноте должен быть сохранен в кодировке Unicode.

SaveFileDialog

Для сохранения файлов добавляем на форму frmmain элемент управления saveFileDialog1. Cвойства этого диалога в точности такие же, как у OpenFileDialog. Переходим в код формы blank:

//Создаем метод Save, в качестве параметра объявляем строку адреса файла.

public void Save(String SaveFileName) {

if (SaveFileName == null) {

return;

}

else {

StreamWriter sw = new StreamWriter(SaveFileName);

//Содержимое richTextBox1 записываем в файл

sw.WriteLine(richTextBox1.Text);

sw.Close();

//Устанавливаем в качестве имени документа название сохраненного файла

DocName = SaveFileName;

}

}

Добавляем обработчик пункта меню Save формы frmmain:

private void mnuSave_Click(object sender, EventArgs e) {

saveFileDialog1.Filter = "Text Files (*.txt)|*.txt|All Files(*.*)|*.*";

if (saveFileDialog1.ShowDialog() == .DialogResult.OK) {

//Переключаем фокус на данную форму.

blank frm = (blank)(this.ActiveMdiChild);

//Вызываем метод Save формы blank

frm.Save(saveFileDialog1.FileName);

frm.MdiParent = this;

frm.DocName = saveFileDialog1.FileName;

frm.Text = frm.DocName;

}

}

Теперь файлы можно открывать, редактировать и сохранять. Однако, при сохранении внесенных изменений в уже сохраненном файле вместо его перезаписи вновь появляется окно SaveFileDialog. Изменим нашу программу так, чтобы можно было сохранять и перезаписывать файл. В конструкторе формы frmmain после InitializeComponent отключим доступность пункта меню Save: mnuSave.Enabled = false;

Переключаемся в режим дизайна формы frmmain и добавляем пункт меню Save As после пункта Save. Устанавливаем следующие свойства этого пункта: Name — mnuSaveAs, Shortcut — Ctrl+Shift+S, Text Save &As. В обработчике Save As вставляем вырезанный обработчик пункта Save и добавляем включение доступности Save: mnuSave.Enabled = true;

Сохранять изменения требуется как в только что сохраненных документах, так и в документах, созданных ранее и открытых для редактирования. Поэтому добавим в метод Open включение доступности пункта меню Save:

private void mnuOpen_Click(object sender, EventArgs e) {

mnuSave.Enabled = true;

}

В обработчике пункта Save добавим простую перезапись файла — вызов метода Save формы blank:

private void mnuSave_Click(object sender, EventArgs e) {

//Переключаем фокус на данную форму.

blank frm = (blank) (this.ActiveMdiChild);

//Вызываем метод Save формы blank

frm.Save(frm.DocName);

}

Теперь, если мы работаем с несохраненным документом, пункт Save неактивен, после сохранения он становится активным и, кроме того, работает сочетание клавиш Ctrl+S. Можно сохранить копию текущего документа, вновь воспользовавшись пунктом меню Save As.