Объектно-ориентированное программирование: Методические указания

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
«МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕКСТИЛЬНЫЙ
УНИВЕРСИТЕТ имени А.Н.КОСЫГИНА»
Учебно-методический
комплекс
для
подготовки бакалавров по направлениям по
специальностям 230100 Информатика и
вычислительная
техника
и
230400
Информационные системы и технологии
Т.М.Кузьмина
МЕТОДИЧЕСКИЕ УКАЗАНИЯ
к лабораторным работам по курсу «Объектно-ориентированное
программирование»
Допущено к изданию редакционно-издательским советом
университета
Москва
2019
В методических указаниях представлены лабораторные работы по
дисциплине «Объектно-ориентированное программирование» по темам:
«Знакомство со средой визуального программирования Microsoft Visual
Studio.NET» , «Работа с классами», «Работа с закрытыми членами классов»,
«Наследование», «Абстрактные классы и интерфейсы».
В методических указаниях описаны постановка задачи, этапы ее
выполнения, приведены индивидуальные задания и планы отчетов по ним для
каждой работы. Изложен теоретический материал в объеме, необходимом для
постижения сути задач и их решения.
Рецензенты:
доктор технических наук, проф. П.А. Севостьянов,
кандидат технических наук, доц. О.А. Ветрова
(ФГБОУ ВПО «МГТУ им. А.Н.Косыгина»)
Подготовлено к печати на кафедре информационных
технологий и систем автоматизированного проектирования.
2
Лабораторная работа №1
Знакомство со средой визуального программирования Microsoft Visual
Studio.NET
Цель работы – знакомство с возможностями среды Microsoft Visual
Studio.NET, изучение средств:
 создания, сохранения и открытия проекта;
 простейших манипуляций с компонентами;
 изменения свойств компонентов;
 создания обработчиков событий.
Справочный материал
Microsoft Visual Studio.NET
Microsoft Visual Studio.NET – это среда объектно-ориентированного
визуального программирования. Работая в ней, даже начинающий программист
может создать программу с профессионально выглядящим интерфейсом. Такая
программа может выполнять несложные действия, порой выдавать ошибочные
ответы, но при этом ее интерфейс не будет отличаться от многих Windowsприложений.
Практически все существующие системы разработки программного
обеспечения используют понятие проекта. Проект объединяет все файлы,
необходимые для редактирования, трансляции и отладки приложения.
Для создания нового проекта надо выполнить команду File/ New/ Project,
при этом откроется окно New Project. В открывшемся окне, в левом списке
нужно выбрать строку Visual C# Project, в правом списке отметить шаблон
Windows Application. Затем в поле ввода ввести имя проекта и, используя
кнопку Browse, выбрать каталог, в котором будут храниться файлы проекта.
На рабочем экране располагается довольно много вкладок, которые могут
закрывать друг друга, кроме того, их можно удалять с экрана. В пункте меню
3
View собраны команды, которые позволяют вывести и активизировать
необходимую вкладку.
Команда View/ Designer открывает вкладку проектирования формы;
View/Code - вкладку Редактора кода; View/Toolbox – панель с компонентами;
View/Properties Window - вкладку Свойства (Properties).
Среда предоставляет формы, на которых размещаются компоненты.
Обычно это оконная форма, хотя могут быть и невидимые формы. На форму с
помощью мыши переносятся и размещаются пиктограммы компонентов. С
помощью простых манипуляций можно изменить размеры и место положения
компонентов. При этом все время в процессе проектирования видно результат –
изображение формы и расположенных на ней компонентов.
Самое интересное заключается в том, что во время проектирования
формы и размещения на ней компонентов Visual Studio.NET автоматически
формирует код программы, включая в него соответствующие фрагменты,
описывающие данный компонент.
Компоненты могут быть визуальными, видимыми при работе
приложения и невизуальные, выполняющие те или иные служебные функции.
Визуальные компоненты сразу видны на экране в процессе проектирования в
таком же виде, в каком их увидит пользователь во время выполнения
приложения.
Обработчики событий – это функции, которые выполняются при
наступлении этих событий. Существует несколько способов создания
обработчиков событий. Для создания обработчика события можно, например,
сначала на форме выделить компонент, с которым это событие должно быть
связано, затем перейти на вкладку Свойства, открыть страничку событий
(Events ), выбрать имя события из списка и выполнить двойной щелчок справа
от него. При этом откроется окно Редактора кода, в котором уже будет
сгенерирована средой заготовка нужной функции, разработчику останется
только вписать в фигурные скобки операторы, задающие реакцию приложения
на выбранное событие.
4
Управляющая кнопка. Компонент Button
Одним из самых используемых управляющих компонентов является
кнопка – визуальный компонент Button.
Данный компонент имеет довольно много свойств, но рассмотрим всего
шесть из них. Отметим, что этими свойствами обладают почти все визуальные
компоненты, а свойством Name вообще, все компоненты.. Свойство Name
задает имя компонента. По умолчанию имя первой кнопки будет button1,
второй кнопки – button2, и т.д. Свойство Name можно изменить. Для этого надо
выделить кнопку на форме и открыть вкладку Свойства (Properties), найти
название свойства и в поле ввода, расположенном справа от названия, ввести
новое имя компонента. Свойство Name – это идентификатор, и строится оно по
правилам построения идентификаторов.
Свойство Text – надпись на компоненте, оно имеет тип string, Данное
свойство также можно изменить. При задании значения свойства Text можно
использовать русские буквы и другие символы, запрещенные при определении
идентификаторов.
Свойства Left, Top, задают координаты левого верхнего угла кнопки в
системе координат компонента–контейнера. Компонент-контейнер – это
компонент, на котором располагается кнопка. Каждый визуальный компонент
имеет свою систему координат, в этой системе координат точка (0,0)
располагается в верхнем левом углу, ось Х направлена слева на право, ось У
сверху вниз. Свойства Width, Height задают соответственно ширину и высоту
компонента. Свойства Left, Top, Width, Height имеют тип int. Значения всех
перечисленных свойств, кроме Name, могут быть изменены во время работы
программы. Например, для изменения надписи на кнопке можно использовать
следующий код:
button1.Text=”Первая кнопка”;
а для изменения положения кнопки на форме следующие команды:
5
button1. Left= button1. Left+10;
button1. Top = button1. Top +10;
При выполнении последних двух команд, кнопка сдвинется вправо и вниз на 10
пикселей.
При обращении к свойствам формы в обработчиках событий этой формы
можно использовать служебное слово this. Например, команды this. Width, this.
Height будут обращениями, соответственно, к ширине и высоте текущей
формы. Команда this. Height =450; изменит высоту формы, а строка
if (this. Height < button1. Top+25) button1. Top=100;
переместит кнопку button1, если она находится на нижнем краю формы.
Этапы выполнения лабораторной работы
1. В соответствии с вариантом задания поместить на форму указанные
компоненты.
2. Создать обработчики событий, выполняющие действия, указанные в
индивидуальном задании.
3. Отладить программу.
План отчета
4. Титульный лист.
5. Цель работы.
6. Задание.
7. Теоретический материал, используемый при выполнении задания.
8. Распечатка программы.
Варианты индивидуальных заданий
1) На форме две кнопки А, В.
a) По щелчку по кнопке А кнопка В перемещается влево на 10 пикселей,
при достижении левого края формы кнопка В перескакивает к правому
краю формы.
6
b) По щелчку по кнопке В кнопка А уменьшается на 2 пикселя в длину , при
достижении минимального размера, размер кнопки А восстанавливается.
2) На форме две кнопки А, В.
a) По щелчку по кнопке А кнопка В движется по диагонали формы (вниз на
2 пикселя и вправо на 4 пикселя ), при достижении края формы кнопка В
возвращается в начальное положение.
b) По щелчку по кнопке В кнопка А уменьшается на 2 пикселя в длину, при
достижении минимального размера, размер кнопки А возвращается в
первоначальное состояние.
3) На форме четыре кнопки А, В, С, D. Кнопки А и В расположены одна над
другой.
a) По щелчку по кнопке С кнопки А и В сближаются на 16 пикселей, но не
перекрывают друг друга.
b) По щелчку по кнопке D кнопки А и В расходятся на 16 пикселей, но
останавливаются на краях формы.
4) На форме две кнопки А, В, расположенные одна над другой.
a) По щелчку по кнопке А кнопки сближаются на 10 пикселей, но не
перекрывают друг друга.
b) По щелчку по кнопке В кнопки расходятся на 10 пикселей, но
останавливаются на краях формы.
5) На форме две кнопки А, В, расположенные на одной горизонтали.
a) По щелчку по кнопке А кнопки сближаются на 10 пикселей, но не
перекрывают друг друга.
b) По щелчку по кнопке В кнопки расходятся на 10 пикселей, но
останавливаются на краях формы.
6) На форме две кнопки А, В.
a) По щелчку по кнопке А, кнопка В перемещается вверх на 10 пикселей, но
останавливается около верхнего края.
b) По щелчку по кнопке В, кнопка В перемещается вниз на 10 пикселей, но
останавливается при достижении нижнего края.
7
7) На форме четыре кнопки А, В, С, D. Кнопки А и В расположены на одной
горизонтали.
a) По щелчку по кнопке С кнопки А и В сближаются на 16 пикселей, но не
перекрывают друг друга.
b) По щелчку по кнопке D кнопки А и В расходятся на 16 пикселей, но
останавливаются на краях формы.
8) На форме 3 кнопки А, В, С.
a) По щелчку по кнопке А кнопка В перемещается влево на 10 пикселей,
достигнув левого края, она перескакивает на правый край.
b) При перемещении курсора мыши над кнопкой С, кнопка В перемещается
вправо на 10 пикселей, на краю формы останавливается.
9) На форме 3 кнопки А, В, С.
a) По щелчку по кнопке А кнопка В перемещается вверх на 6 пикселей,
достигнув верхнего края, она перескакивает вниз формы.
b) По щелчку по кнопке С кнопка В перемещается вниз на 6 пикселей, на
краю формы останавливается.
10)
На форме 3 кнопки А, В, С.
a) По щелчку по кнопке А кнопка В движется по диагонали формы (вниз на
2 пикселя и вправо на 4 пикселя ), при достижении края формы кнопка В
возвращается в начальное положение.
b) По щелчку по кнопке С кнопка В перемещается вниз на 6 пикселей, при
достижении края формы возвращается в прежнее положение.
Вопросы:
1. Как создать новый проект?
2. Как открыть проект?
3. Как открыть файл, не принадлежащий проекту?
4. Как создать обработчик события, связанного с определенным компонентом?
5. Как изменить значение свойства Left на этапе проектирования?
6. Как изменить значение свойства Top во время выполнения программы?
8
Лабораторная работа №2
Работа с классами
Цель работы – познакомится с понятиями класс, объект класса, научится
создавать свои классы и работать с ними.
Справочный материал
Классы
Язык C# позволяет разработчику определить новый тип данных – класс.
Простейшее описание класса имеет следующий вид.
class имя класса {< список членов класса>}
имя класса – это любой идентификатор, уникальный в пределах своей
сферы действия;
список членов класса – список, объявляющий члены класса с указанием
уровня доступа.
Члены класса – это поля (члены-данные), методы (функции-члены),
свойства и события. В данной лабораторной работе будут создаваться
классы, имеющие в качестве членов поля и методы.
Например:
class Myclass {
public int i; /* слово public обозначает, что данный член класса является
общедоступным*/
public float x;
public float f()
{return i*y;}}
Во всех объектно-ориентированных языках четко различаются понятия
«класс» и «объект». Класс – это определяемый пользователем тип данных, его
можно представить себе как чертеж, по которому будут строиться сами
данные, т.е. объекты (экземпляры) класса.
9
В C# создание объектов класса происходит с помощью операции new.
Например:
Myclass a1=new Myclass();
или
Myclass a2;
a2=new Myclass();
Ключевое слово new означает, что среде выполнения следует вызвать
конструктор класса и выделить необходимое количество оперативной памяти
под экземпляр класса. Поскольку класс относится к ссылочному типу, то
выделении памяти производится из «кучи», находящейся в распоряжении
среды выполнения .NET . Команды Myclass a1, Myclass a2, определяют ссылки
на объекты класса, а не сами объекты, объекты создаются с помощью операции
new . Но после того как объекты будут созданы, мы будем их называть объект
(экземпляр) a1, и объект (экземпляр) a2.
Рассмотрим еще один пример:
Myclass c=new Myclass();
Myclass d;
d=c;
В этом примере создан один объект и две ссылки на него.
Доступ к членам класса осуществляется с помощью операции точка «.».
Например:
c.x=7; //полю х объекта с присвоено значение 7.
d.i=6; //полю i объекта d присвоено значение 6.
a1.x=c.f();/*полю х объекта a1 присвоено значение, которое возвращает
метод f, вызванный для объекта с, поскольку ссылка d также указывает на
этот же объект, то метод f вернет значение 42.*/
Приведение типов
Автоматическое приведение типов в языке C# происходит только в том
случае, когда не происходит потери точности.
10
Например.
int i=9; float x=i;
Если в результате приведения одного типа к другому может произойти
потеря точности, то его программист должен выполнить сам. Для явного
приведения типов перед переменной в круглых скобках пишется имя нового
типа, например (int)i.
Пример:
float i=9;
int l=(int)i;
i=l;//в этом случае потеря точности не грозит, и приведение типов
//выполняется автоматически.
Многие функции преобразования (приведения) типов включены в
библиотечный класс Convert. Например.
int i= Convert.ToInt32(textBox1.Text);
В этом примере, текстовая строка, записанная в поле ввода ( textBox1.Text )
будет преобразована в значение типа int. Если в textBox1.Text записана строка,
которую нельзя прочитать как целое число, то будет сгенерировано
исключение.
В языке C# , стандартные числовые типы, такие как int, float т.д., имеют
статические функции-члены (методы), которые также решают задачи
преобразования типов, например:
int i= int.Parse(textBox1.Text);
Для того чтобы преобразовать число в строку, лучше использовать метод
ToString, определенный во всех стандартных типах. Например:
textBox1.Text=i.ToString();
Хотя тоже можно использовать методы из класса Convert.
Математические функции
11
При решении некоторых задач, могут потребоваться функции извлечения корня
или возведения в степень. Математические функции хранятся в библиотечном
классе Math. Если нам надо вычислить sin x, то на языке C# это будет выглядеть
следующим образом: Math.Sin(x);
Отметим, что возвращаемые значения математических функций, как правило
имеют тип double. Если мы работаем с переменными типа float, то надо будет
выполнить явное приведение типов. Например:
float u= (float) Math.Sin(x);
Этапы выполнения лабораторной работы
1. Продумать структуру класса, предназначенного для решения задач,
определенных вариантом индивидуального задания. Имена класса и его
членов должны быть информативны. В классе не должно быть полей, в
которые пользователь мог бы поместить противоречивые данные. Например,
в классе «Окружность» не могут быть одновременно поля «Радиус» и
«Диаметр», надо выбрать одно из них, а второе заменить методом. Или, если
рассматривается класс «Равнобокая_трапеция», то набор полей
«Основание1», «Основание2», «Боковая_сторона» может получить значения,
по которым не построишь трапецию (например, 5, 105,10). Но если поле
«Боковая_сторона» заменить на поле «Высота», то проблем не будет.
2. Описать класс. Описание класса должно располагаться рядом с описанием
класса формы. Хотя язык C# позволяет использовать кириллицу для записи
идентификаторов, рекомендуется использовать латиницу.
3. Поскольку значения полей класса должен задавать пользователь, то на
форму надо поместить столько полей ввода (компонентов TextBox), сколько
полей в классе.
4. (Создание локального объекта, т.е. объекта с которым может работать
только один метод). Поместить на форму кнопку. Обработчик события Click
должен создать объект Вашего класса, считать информацию из полей ввода
12
и поместить ее в поля класса, вызвать методы, выполняющие необходимые
вычисления и вывести на экран возвращенные ими значения.
5. (Создание объектов класса, с которыми могут работать разные методы
класса главной формы). Создать объект класса, который является полем
главной формы. Поместить на форму две кнопки, которые будут работать с
вновь созданным объектом, первая кнопка должна вводить информацию
(значения полей), вторая выводить на форму (и значения полей, и расчетные
данные).
6. Отладить программу.
План отчета
1. Титульный лист.
2. Цель работы.
3. Задание.
4. Теоретический материал, используемый при выполнении задания.
5. Распечатка программы.
15)
Варианты индивидуальных заданий
Класс, описывающий прямоугольник. Класс должен иметь методы,
решающие следующие задачи:
b) расчет длины диагонали;
c) расчет площади прямоугольника.
16)
Класс, описывающий квадрат. Класс должен иметь методы, решающие
следующие задачи:
b) расчет длины диагонали;
c) расчет периметр квадрата.
17)
Класс, описывающий равнобокую трапецию. Класс должен иметь
методы, решающие следующие задачи:
b) расчет периметра трапеции;
c) расчет площади трапеции.
13
18)
Класс, описывающий окружность. Класс должен иметь методы,
решающие следующие задачи:
b) расчет длины окружности;
c) расчет площади окружности.
19)
Класс, описывающий прямоугольный треугольник. Класс должен иметь
методы, решающие следующие задачи:
b) расчет гипотенузы;
c) расчет площади треугольника.
20)
Класс, описывающий правильный треугольник. Класс должен иметь
методы, решающие следующие задачи:
b) расчет периметра;
c) расчет площади треугольника.
21)
Класс, описывающий равнобедренный треугольник. Класс должен иметь
методы, решающие следующие задачи:
b) расчет периметра;
c) расчет площади треугольника.
22)
Класс, описывающий правильный шестиугольник. Класс должен иметь
методы, решающие следующие задачи:
b) расчет периметра;
c) расчет большой диагонали шестиугольника.
23)
Класс, описывающий шар. Класс должен иметь методы, решающие
следующие задачи:
b) расчет диаметра шара;
c) расчет объем шара.
24)
Класс, описывающий прямоугольный параллелепипед. Класс должен
иметь методы, решающие следующие задачи:
b) расчет площади боковой поверхности прямоугольного параллелепипеда;
c) расчет объема прямоугольного параллелепипеда.
25)
Класс, описывающий правильную треугольную призму. Класс должен
иметь методы, решающие следующие задачи:
14
b) расчет площади боковой поверхности правильной треугольной призмы;
c) расчет объема правильной треугольной призмы.
26)
Класс, описывающий круглый прямой цилиндр. Класс должен иметь
методы, решающие следующие задачи:
b) расчет диаметра цилиндра;
c) расчет объема цилиндра.
27)
Класс, описывающий круглый прямой конус. Класс должен иметь
методы, решающие следующие задачи:
b) расчет диаметра конуса;
c) расчет объема конуса.
28)
Класс, описывающий правильную четырехугольную пирамиду. Класс
должен иметь методы, решающие следующие задачи:
b) расчет периметр основания пирамиды;
c) расчет объема пирамиды.
29)
Класс, описывающий правильную треугольную пирамиду. Класс должен
иметь методы, решающие следующие задачи:
b) расчет периметр основания пирамиды;
c) расчет объема пирамиды.
Вопросы:
1. Что такое класс?
2. Как описывается класс?
3. Что задает слово public?
4. Как происходит доступ к членам класса?
5. Как вызвать метод класса?
Лабораторная работа №3
Работа с закрытыми членами классов
Цель: Научится создавать конструкторы классов и контролировать ввод
данных в поля класса.
15
Справочный материал
Конструктор класса
Конструктор класса – это метод класса, который предназначен для создания
объектов класса и инициализации их.
Конструктор обладает следующими свойствами:
1. Имя конструктора совпадает с именем класса.
2. Конструктор не имеет возвращаемого значения, даже типа void
3. Класс может содержать несколько конструкторов, отличающихся либо
количеством, либо типами параметров (отличие в этом случае должно быть
существенным), либо и тем и другим.
4. Конструктор без параметров называется конструктором по умолчанию.
5. Если ни один конструктор не был написан программистом, то конструктор
по умолчанию генерируется компилятором.
6. Если в классе объявлен хотя бы один конструктор, то компилятор не создает
своего.
7. В C# , в отличие от многих других языков, любой конструктор, если не
указано иное, обнуляет значения полей.
8. Конструктор не может быть вызван явно, он вызывается автоматически при
создании экземпляров класса.
Рассмотрим пример.
Определим в классе А два конструктора.
class A { public int x,y;
public int f() {return x+y;}
public A() { x=1; y=2; }
public A (int xx, int yy) { x=xx; y=yy;} }
При выполнении команды A a=new A(); для создания объекта класса
используется конструктор без параметров. Полям объекта а будут присвоены,
соответственно, значения 1 и 2.
16
Если при создании объекта требуется использовать конструктор с
параметрами, то в операторе new
после имени класса в круглых скобках
указываются значения параметров, например, A b=new A(6,13);
А команда A c=new A(3); вызовет ошибку, потому что класс А не
содержит конструктора с одним параметром, которому можно было бы
присвоить значение 3.
В языке С# существует упрощенная форма написания конструктора: при
описании полей класса можно написать инициализирующие выражения.
Пример.
class В {
public int i=10;}
Все строки, содержащие инициализирующие выражения, включаются в
начало всех конструкторов. В данном примере строка i=10; будет включена в
конструктор, определяемый компилятором.
Уровни доступа к членам класса
В С# имеется пять спецификаторов доступа: public, private, protected,
internal, protected internal . Значения спецификаторов доступа следующие:
-
public - член класса может быть использован любым методом;
- private - член класса может быть использован только методом того же
класса,
- - член класса может быть использован только либо методом того же
класса, либо методом производного класса;
- internal- член класса может быть использован только методом из той
же сборки;
-
protected internal- член класса может быть использован только либо
методом из той же сборки или методом производного класса из любой
сборки.
17
Работа с закрытыми полями класса
При выполнении лабораторной работы №2 были созданы классы,
которые нужны при работе с геометрическими фигурами. Размеры
геометрических фигур должны задаваться неотрицательными числами. Это
требование не учитывалось при выполнении лабораторной работы №2. В поля
классов можно вводить любые, в том числе отрицательные значения. Этот
недостаток можно исправить, если изменить уровень доступа к полям классов
на private или protected, т.е. сделать их закрытыми от обращений извне. Но в
этом случае нужно будет написать по два открытых метода, для каждого поля,
для того, что бы вводить и выводить информацию. Например,
class A{
private int x;
public int get_X(){return x;}
public bool set_X(int xx){
if(xx < 0) return true;
x=xx; return false;}}
В поле х класса А уже нельзя ввести отрицательного значения, метод set_X
контролирует ввод, причем он возвращает информацию о том была ли
допущена ошибка. При отрицательных значениях параметра хх, правильнее
было бы сгенерировать исключение, что бы обратить внимание на попытку
недопустимого ввода, но генерировать и обрабатывать исключения мы
научимся позднее.
Рассмотрим еще один пример. Предположим, что создается класс, в
котором, в одном из полей хранится информация о температуре тела человека.
Обозначим это поле буквой t, ясно, что значение поля t должно быть больше
35 и меньше 42. Попытка ввести в это поле значение не из указанного
интервала, свидетельствует об ошибке. Что бы сохранить информацию о
наличии ошибки создадим поле булевого типа err.
class В{
private float t;
18
private bool err =false;
public float get_T(){return t;}
public void set_T(float tt){
if(tt < 35 || tt>42 ) {
MessageBox.Show("Ошибка, температура тела человека не может быть
равной "+tt.ToString() ,"Внимание!");err= true;}
else {t=tt ; err=false;}
public bool get_Err(){return err;}}
В последнем примере, не только сразу сообщается об ошибке с помощью
MessageBox, но и информация о ней сохраняется в поле err. Значение поля err
нельзя изменить напрямую, оно меняется только при изменении поля t.
Переключатели
Компоненты CheckBox и RadioButton используются, для того чтобы
пользователь мог включать и выключать какие-то режимы работы приложения
или индикации состояния.
CheckBox называют флажком. Это прямоугольник с надписью,
содержание которой определяется свойством Text. В прямоугольнике может
находиться галочка, в этом случае, говорят “флажок поднят”, при отсутствии
галочки говорят «флажок снят». Щелчок мышки поднимает или снимает
флажок. Поднятие и снятие флажка обуславливается свойством Checked. Это
свойство имеет булев тип. Значение true – соответствует поднятому флажку,
false – опущенному флажку.
Компонент RadioButton в единственном числе очень похож на компонент
CheckBox. Отличие заключается в том, что вместо прямоугольника на экран
выводится кружочек, а вместо галочки – точка. Появление или исчезновение
точки тоже связно со свойством Checked. Но компоненты RadioButton могут
объединяться в функциональные группы. В группу попадают все компоненты
RadioButton, расположенные в одном контейнере (контейнером называется
компонент, на котором могут располагаться другие компоненты, например,
19
форма или панели). В группе может быть выбран только один компонент
RadioButton. Компоненты CheckBox, расположенные в одном контейнере, в
группу не объединяются, они работают независимо друг от друга.
Этапы выполнения лабораторной работы
1. Поля, определенного в лабораторной работе №2 класса, сделать закрытыми,
т.е. задать им соответствующий уровень доступа.
2. Значения всех полей должны быть неотрицательными. Для одного поля
определить границы, согласно варианту индивидуального задания. Для
каждого поля написать по два открытых метода, обеспечивающих запись и
считывание информации в это поле, с учетом всех ограничений.
3. Откорректировать обработчики событий, программы лабораторной работы
№2, так, что бы они работали с объектами, измененного класса.
4. Дополнить класс двумя конструкторами, один из которых должен быть без
параметров, другой с параметрами.
5. Создать еще несколько долгоживущих объектов Вашего класса, число
объектов определяется индивидуальным заданием. Хотя бы один их них
должен быть создан конструктором с параметрами.
6. Создать поле формы, которое является ссылкой на объекты Вашего класса,
назовем ее буквой А (в Ваших программах она должна иметь другое имя).
7. На форму поместить столько радио-кнопок (компонентов RadioButton)
сколько определено долгоживущих объектов. Названия радио-кнопок
должны отражать связь с объектами, они могут называться так же, как и
объекты.
8. В программе несколько объектов Вашего класса, но в каждый момент
времени пользователь работает только с одним. Выбор объекта
производится с помощью радио-кнопок. Выбранный объект называется
активным. Можно сделать так, что бы ссылка А указывала на активный
объект (это требование не является обязательным).
20
9. Откорректировать обработчики событий Click кнопок, выполняющих ввод и
вывод информации в долгоживущий объект так, что бы они работали с
активным объектом.
10. Если ни одна радио-кнопка не выбрана, а пользователь нажимает кнопки
ввода или вывода, то программа должна сообщать об этом. Для вывода
сообщений можно использовать MessageBox . Например.
MessageBox.Show("Объект не выбран","Внимание!");
11. Отладить программу.
План отчета
6. Титульный лист.
7. Цель работы.
8. Задание.
9. Теоретический материал, используемый при выполнении задания.
10.Распечатка программы.
Варианты индивидуальных заданий
1. Ограничение на одно из полей следующее: его значение должно быть
больше 7 и меньше 10. Форма должна содержать 4 поля, являющиеся
объектами Вашего класса.
2. Ограничение на одно из полей следующее: его значение должно быть
больше 6 и меньше 14. Форма должна содержать 4 поля, являющиеся
объектами Вашего класса.
3. Ограничение на одно из полей следующее: его значение должно быть
больше 1 и меньше 8. Форма должна содержать 3 поля, являющиеся
объектами Вашего класса.
4. Ограничение на одно из полей следующее: его значение должно быть
больше 4 и меньше 16. Форма должна содержать 5 полей, являющихся
объектами Вашего класса.
21
5. Ограничение на одно из полей следующее: его значение должно быть
больше 2 и меньше 16. Форма должна содержать 4 поля, являющиеся
объектами Вашего класса.
6. Ограничение на одно из полей следующее: его значение должно быть
больше 8 и меньше 20. Форма должна содержать 5 полей, являющихся
объектами Вашего класса.
7. Ограничение на одно из полей следующее: его значение должно быть
больше 6 и меньше 10. Форма должна содержать 4 поля, являющиеся
объектами Вашего класса.
8. Ограничение на одно из полей следующее: его значение должно быть
больше 7 и меньше 17. Форма должна содержать 5 полей, являющихся
объектами Вашего класса.
9. Ограничение на одно из полей следующее: его значение должно быть
больше 12 и меньше 100. Форма должна содержать 5 полей, являющихся
объектами Вашего класса.
10.Ограничение на одно из полей следующее: его значение должно быть
больше 8 и меньше 33. Форма должна содержать 3 поля, являющиеся
объектами Вашего класса.
11.Ограничение на одно из полей следующее: его значение должно быть
больше 4 и меньше 20. Форма должна содержать 4 поля, являющиеся
объектами Вашего класса.
12.Ограничение на одно из полей следующее: его значение должно быть
больше 17 и меньше 40. Форма должна содержать 4 поля, являющиеся
объектами Вашего класса.
13.Ограничение на одно из полей следующее: его значение должно быть
больше 9 и меньше 30. Форма должна содержать 3 поля, являющиеся
объектами Вашего класса.
14.Ограничение на одно из полей следующее: его значение должно быть
больше 3 и меньше 18. Форма должна содержать 3 поля, являющиеся
объектами Вашего класса.
22
15.Ограничение на одно из полей следующее: его значение должно быть
больше 8 и меньше 18. Форма должна содержать 3 поля, являющиеся
объектами Вашего класса.
Вопросы:
1. Что задает слово private?
2. Как происходит доступ к членам класса?
3. Что такой конструктор класса?
4. В какой момент происходит вызов конструктора?
5. Может ли класс содержать несколько конструкторов?
6. В каком случае создается конструктор компилятором?
Лабораторная работа №4
Массивы ссылочных типов.
Цель работы - научится создавать и использовать массивы объектов
классов.
Справочный материал
Массивы
Массивом называют упорядоченную совокупность элементов одного
типа. Каждый элемент массива имеет один или несколько индексов. Индексы
задаются целыми числами. Массиву, как правило, выделяется непрерывная
область памяти.
Массивы могут быть одномерными и многомерными. Как все в мире C#,
массивы это объекты классов. Место для них выделяется в «куче», работа с
ними происходит по ссылке.
Одномерные массивы
Сначала рассмотрим числовые массивы. Описывается массив следующим
образом:
<тип> [] <имя_массива>;
23
Имя массива это ссылка, если массив не инициализируется при
объявлении, то создается он оператором new. Рассмотрим пример.
int [] mas1; mas1=new int[10];
Число элементов массива задается в момент его создания. В нашем
примере мы создали статический массив, но можно было поступить
следующим образом:
int n=Convert.ToInt32(textBox1.Text);
int [] mas2=new int[n];
В этом случае, число элементов массива задает пользователем во время
работы программы, т.е. создается динамический массив.
Массив может быть создан с помощь инициализирующего значения,
например:
int [] mas3={1,4.-5,9,-4};
в этом случае, массив не только создается, но и задаются значения его
элементов.
При создании массива с помощью оператора new, элементы обнуляются.
Нумерация элементов массива начинается с 0, т.е. первый элемент массива
будет иметь номер 0. Работа с массивом происходим стандартным образом:
mas1[0]=6;//первому элементу массива mas1 присвоено значение 6
mas2[0]=3;//элементу под номером 0, массива mas2 присвоено значение 3
mas1[1]=mas1[0]+mas3[0];
//элементу
под
номером
1,
массива
mas1
//присвоена сумма значений первых элементов массивов mas1, mas3.
Поскольку в C# массив – объект некоторого класса, можно использовать,
методы и свойства этого класса. Так, например, Length – свойство для чтения,
возвращающее число элементов массива, если x= mas3. Length; то х получит
значение 5.
Массивы ссылочных типов.
На примерах массивов целых чисел, мы рассмотрели, как строятся
массивы структурных типов. Рассмотрим, как создаются массивы ссылочных
типов.
24
Пусть у нас есть класс А:
class A { public int x,y;
public int f() {return x+y;}
public A() { x=1; y=2; }
public A (int xx, int yy) { x=xx; y=yy;} }
Создадим массив объектов этого класса. Команда
A[] mas4=new A[7];
Создает не сам массив, а массив ссылок. Каждый элемент массива должен
быть создан персонально, например, в цикле
for(int i=0;i<7;i++) mas4[i]=new A();
Возможно и такое решение:
A[] mas5={ new A(),new A(3,4),new A(1,2),new A(3,5)}
В этом случае, будет создан массив из 5 элементов и сразу инициализирован.
Неважно как создается массив, в любом случае, работа с ним происходим
стандартным образом:
mas4[0].x=6; // Полю х элемента под номером 0 присваивается число 6.
mas4[1].y=
mas4[0].x+4;
//
Полю
у
элемента
под
номером
1
присваивается результат вычисления выражения mas4[0].x+4, в котором
используется поле х элемента №0 того же массива.
mas4[1].x= mas4[0].f();Полю х элемента под номером 1 присваивается
значение, возвращенное методом f, вызванным для элемента №0 того же
массива.
Обратите внимание, элементы массива – это объекты класса. Каждый
элемент массива имеет свои поля, определенные в классе А, и для каждого
элемента можно вызвать метод f, так же определенный в классе А.
Компоненты ListBox и ComboBox.
Для
вывода
информации
обо
всех
элементах
массива
удобно
использовать компоненты ListBox и ComboBox.
25
Класс ListBox представляет распространенный компонент среды Windows
— список переменной длины, который позволяет пользователю выбрать один
из элементов. Здесь мы рассмотрим свойства и методы компонента,
необходимые для использования в лабораторной работе. Так, например, нас
интересует, прежде всего, работа со строками, поэтому мы будем только о
списках строк, хотя ListBox может содержать разные объекты.
Для добавления строки достаточно написать команду:
listBox1.Items.Add("Строка1");
или
string s= "Строка2";
listBox1.Items.Add(s);
Следующая команда очищает ListBox:
listBox1.Items.Clear();
Команда int n = listBox1.SelectedIndex; записывает в переменную n номер
выделенного элемента.
Компонент ComboBox похож на ListBox. Основным различием классов
ComboBox и ListBox является способ их отображения в окне. ComboBox
использует раскрывающийся список.
Компоненты
ListBox
и
ComboBox
можно
заполнить
на
этапе
проектирования программы. Для этого в списке свойств надо найти строку
Items, выделить ее и щелкнуть по кнопке с тремя точками, расположенной
правее слова Items, в открывшемся окне, ввести необходимый список.
План отчета
1. Титульный лист.
2. Цель работы.
3. Задание.
4. Теоретический материал, используемый при выполнении задания.
5. Распечатка программы.
26
Этапы выполнения задания и варианты индивидуальных заданий
Варианты классов нужно взять из задания по лабораторной работе №3,
затем нужно:
1. Создать массив долгоживущих объектов Вашего класса. Число
элементов массива определяется по формуле: х+3, где х - Ваш
порядковый номер в списке группы.
2. С формы проекта нужно удалить радио кнопки. На форму поместить
компонент ListBox и 2 кнопки. При нажатии на первую из этих кнопок
компонент ListBox очищается. При нажатии на вторую кнопку в
компонент ListBox помещается информация обо всех элементах
массива (значения полей, значения, возвращаемые методами).
3. Так же как в лабораторной работе №3, пользователю должна быть
предоставлена возможность работы с активным объектом
(возможность изменить значения полей активного объекта). Выбор
активного объекта можно реализовать различными способами.
Например, активным объектом может быть объект, выделенный в
списке ListBox, или объект, номер которого введен в специальное поле
ввода.
Лабораторная работа №5
Наследование классов.
Цель работы - изучение основных принципов наследования, создание
собственной иерархии классов.
Справочный материал
Наследование
Одним из наиболее мощных свойств класса С++, является возможность
их расширения с помощью наследования. Наследование – это создание нового
класса путём добавления новых членов к уже существующему классу. Класс, к
27
которому добавляются новые члены называется базовым или родительским
классом, а вновь созданный класс производным или дочерним классом.
Двоеточие после имени класса указывает компилятору на то, что класс
является производным от другого класса. За двоеточием следует имя базового
класса.
Напоминание: методы производного класса могут работать только с
открытыми (public ) и защищёнными ( protected и protected internal) членами
базового класса, и если классы находятся в одной сборке, то членами,
имеющими уровень доступа internal. Но не могут работать с собственными (
private ) членами базового класса.
Пример:
сlass cir: vec {
public int R;
public void fun(void)
{ return x*y+R;}}
Класс cir является наследником класса vec, метод fun использует наравне
с полем R , поля базового класса x,y, что возможно в том случае, когда
уровень доступности указанных полей либо public, protected.
Конструкторы при наследовании
Конструкторы не наследуются, но используются при создании объектов
производных классов. При создании объекта производного класса, сначала
вызывается конструктор базового класса, а затем производного класса.
По умолчанию, при создании объектов производного класса вызывается
конструктор базового класса без параметров.
Что делать, если необходимо использование для базового класса
конструктора с параметрами?
28
В этом случае нужно обязательно написать конструктор производного
класса и в описании этого конструктора включить дополнительную запись.
После имени конструктора в его описании поставить двоеточие, затем,
написать ключевое слово base и в скобках значения параметров.
class B{ public int x;
public B(int xx) { x=xx; }
}
class C:B{
public C(int xx):base(xx) {}}
В С# нет множественного наследования классов, т.е. для у любого
производного класса базовый класс всегда один. Сам базовый класс может быть
производным от некоторого другого класса.
В качестве базовых типов могут выступать интерфейсы, в этом случае класс
может быть наследником многих интерфейсов.
Замечание:
Некоторые авторы определяют наследование, как создание нового класса на
основе существующих. В этом случае, агрегация также подпадает под
определение наследования, и ее называют наследованием по модели
включение-делегирование.
Запрет наследования: классы объявленные как sealed
В некоторых случаях требуется запретить создание производных классов.
Разработчики хотят, чтобы класс использовался только в том виде, в каком он
создан, в этом случае ключевое слово sealed.
Класс String пространства имен System является закрытым для наследования.
Замечание: слово sealed не запрещает агрегацию.
Ссылки базового класса
Ссылки базового класса могут указывать на объекты производных
классов.
29
Примеры.
B b=new C();// классы В и С определены выше
B d=new D();
При работе с объектами производных классов, через ссылки базовых
классов, доступны, за одним исключением, только члены, определенные в
базовом классе (классе ссылки). Исключение – это виртуальные методы.
Если нужно перейти от ссылки базового класса к ссылке производного
класса, то надо выполнить преобразование типов.
C c; c=(C)d; b=c;
Поскольку по ссылке базового класса не всегда ясно на какой объект она
указывает, то в С# введены специальные операторы, которые выполняют
проверку возможно ли сделать соответствующее преобразование типов.
Операторы is и as.
Оператор is никогда не генерирует исключение, он работает со всеми
типами. Он имеет следующий вид:
Ссылка is Тип
Оператор is возвращает значение булево типа, true - если объект на
который указывает ссылка можно привести к типу, стоящему после is и false –
если ссылка нулевая или объект нельзя привести к указанному типу.
Например.
int i=8;
Object o=new Object();
Boolean b=(i is Object); //b будет равно true
Boolean b1=(o is int); //b1 будет равно false
Оператор as работает со ссылочными типами, он производит нужное
преобразование типов, если оно возможно и возвращает null, если оно
невозможно. Команда A a=o as A; будет выполнена успешно, но в ссылку а
будет записан null, и любое обращение к а как к объекту, например,
30
a.ToString(); вызовет генерацию исключения. Проверку того, не получила ли
ссылка нулевого значения, должен выполнить программист. В нашем примере
она будет выглядеть так if(a!=null)a.ToString();
Переопределение методов базового класса.
Производный класс наследует все члены базового класса, в том числе все
его методы. Во многих случаях требуется изменить работу какого-либо метода.
Изменение метода происходит путем его переопределение в производном
классе.
Например:
public class A
{
public int f()
{return 0;} }
public class B:A
{
public int f()
{return 1;} }
Метод f описан и в базовом и в производном классе. В следующем фрагменте
программы вызывается метод из класса В:
B b=new B();
int i=b.f();
Но для объекта b можно вызвать метод f базового класса, для этого надо
выполнить преобразование типов: ((A)b).f(); или A a=b; a.f();
В обоих случаях будет вызвана метод f базового класса. Для обычных (не
виртуальных) методов справедливо следующее правило:
При вызове невиртуального метода, метод определяется типом ссылки.
Но во многих случаях для работы с объектами производных типов необходимы
методы определенные в этих же типах, даже если работа выполняется через
ссылки базовых классов.
31
Для решения данной проблемы в объектно-ориентированных языках созданы
виртуальные методы.
При вызове виртуального метода, метод определяется типом объекта.
Определение виртуального метода происходит следующим образом:
В базовом классе при определении метода используется ключевое слово virtual,
а во всех производных классах, в которых этот метод переопределяется, слово
override. Например:
public class B {
public virtual int f()
{return 1;} }
public
class C:B{
public override int f()
{return 2;} }
public class D:C {
public override int f()
{return 3;} }
В следующем фрагменте программы во всех случаях будет вызван метод f из
класса D:
B b=new D();
int i=b.f();
i= ((C)b).f();
Замечание. Поскольку вызов виртуального метода не зависит от того, через
какую ссылку он вызывается, то некоторые авторы термин переопределение
метода используют только для виртуальных методов.
Этапы выполнения задания
1. Создать иерархию классов, определенную вариантом задания. Базовый
«Точка» должен содержать два метода, вычисляющие площадь, одну
32
обычную, другую виртуальную, оба эти метода должны возвращать
значение 0. Базовый класс может не содержать полей, все производные
должны содержать поля, которые позволяют решать поставленные в
индивидуальном задании задачи. Все производные классы должны
содержать конструкторы, задающие не нулевые значения полям класса.
2. В классе формы(Form1) определить поля, которые являются объектами
созданных Вами классов, по одному на каждый класс и еще одно поле t,
являющееся ссылкой базового класса «Точка». Ссылка t всегда будет
указывать на активный объект, по умолчанию, t указывает на объект
базового класса.
3. На форму поместить две панели (компоненты Panel). На них будут
размещены кнопки и метки (компоненты Label).
4. Кнопки, расположенные на первой панели (кнопки первой группы),
предназначены для выбора активного объекта. Число этих кнопок равно
числу полей класса Form1, являющихся объектами Ваших классов.
Каждому объекту ставиться в соответствии кнопка. Если кнопке
поставлен в соответствие объект некоторого класса, то надпись на этой
кнопке должна отражать имя этого класса. Например, если кнопка
связана с объектом класса Circle, то название этой кнопки должно быть
«Окружность»
5. При нажатии на кнопку из первой группы ссылке t присваивается адрес
объекта, с которым эта кнопка связана, т.е. данный объект считается
активным. Кроме того, через одну из меток выводится на форму имя
класса активного объекта или название нажатой кнопки.
6. На вторую панель помещаются кнопки, которым в соответствие ставятся
методы, определенные в классах Вашей иерархии. Для одноименных
методов, описанных в разных классах ставиться в соответствие одна
кнопка. Поскольку в каждом классе определены по два метода (они
должны иметь разные имена), вычисляющие площадь (одна – обычная,
другая – виртуальная), то для вычисления площади помещаются две
33
кнопки. Например, кнопки с названиями «Площадь_О» и «Площадь_В».
Названия кнопок второй группы должны соответствовать именам
методов поставленных в соответствие кнопкам.
7. При нажатии на любую кнопку из второй группы, кроме кнопки с именем
«Площадь_O», производится проверка того может ли активный объект
приведен к типу, в котором определен метод, соответствующий нажатой
кнопки, если да, то выводится значение этого метода, а если нет то
сообщение о невозможности произвести вычисления. Например:
if(t is Circle) label2.Text=((Circle)t).f().ToString();
else label2.Text=”Метод f() для активного объекта не определен”;
Вызываемый метод, должн работать корректно, т.е. при вычислении
площади окружности должна вычисляться площадь окружности, а не
треугольника.
8. При нажатии на кнопку «Площадь_В», вызывается виртуальный метод
вычисления площади для активного объекта.
План отчета
1. Титульный лист.
2. Цель работы.
3. Задание.
4. Проанализировать фрагменты программы, в которых вызываются
виртуальные и не виртуальные методы, отметить особенности работы
этих фрагментов.
5. Распечатка программы.
Варианты индивидуальных заданий.
1. Базовый класс «Точка». Классы «Окружность» и «Прямоугольный
треугольник» являются производными от класса «Точка». Класс «Конус»
является производным от класса «Окружность». Во всех классах
определить по два метода, вычисляющих площадь фигуры (площадь
точки равна нулю, для объемных тел вычисляется площадь полной
поверхности). Один метод виртуальный, другой обычный. В классе
34
«Прямоугольный треугольник» еще определить метод, вычисляющий
периметр. В классе «Конус» определить метод, вычисляющий объем.
2. Базовый класс «Точка». Классы «Окружность» и «Ромб» являются
производными от класса «Точка». Класс «Конус» является производным
от класса «Окружность». Во всех классах определить по два метода,
вычисляющих площадь фигуры (площадь точки равна нулю, для
объемных тел вычисляется площадь полной поверхности). Один метод
виртуальный, другой обычный. В классе «Ромб» еще определить метод,
вычисляющий периметр. В классе «Конус» определить метод,
вычисляющий объем.
3. Базовый класс «Точка». Классы «Правильный пятиугольник»,
«Прямоугольный треугольник», «Прямоугольник» являются
производными от класса «Точка». Во всех классах определить по два
метода, вычисляющих площадь фигуры (площадь точки равна нулю, для
объемных тел вычисляется площадь полной поверхности). Один метод
виртуальный, другой обычный. В классе «Прямоугольник» еще
определить метод, вычисляющий диагональ. В классах «Треугольник »,
«Правильный пятиугольник» и «Прямоугольник» определить методы,
вычисляющие периметры соответствующих фигур.
4. Базовый класс «Точка». Классы «Ромб», «Прямоугольный треугольник»,
«Прямоугольник» являются производными от класса «Точка». Во всех
классах определить по два метода, вычисляющих площадь фигуры
(площадь точки равна нулю, для объемных тел вычисляется площадь
полной поверхности). Один метод виртуальный, другой обычный. В
классе «Прямоугольник» еще определить метод, вычисляющий
диагональ. В классах «Прямоугольный треугольник», «Ромб» и
«Прямоугольник» определить методы, вычисляющие периметры
соответствующих фигур.
5. Базовый класс «Точка». Классы «Окружность» и «Равнобедренный
треугольник» являются производными от класса «Точка». Класс
«Цилиндр» является производным от класса «Окружность». Во всех
классах определить по два метода, вычисляющих площадь фигуры
(площадь точки равна нулю, для объемных тел вычисляется площадь
полной поверхности). Один метод виртуальный, другой обычный. В
классе «Окружность» еще определить метод, вычисляющий диаметр. В
классе «Цилиндр» определить метод, вычисляющий объем.
35
6. Базовый класс «Точка». Классы «Окружность» и «Ромб» являются
производными от класса «Точка». Класс «Цилиндр» является
производным от класса «Окружность». Во всех классах определить по
два метода, вычисляющих площадь фигуры (площадь точки равна нулю,
для объемных тел вычисляется площадь полной поверхности). Один
метод виртуальный, другой обычный. В классе «Окружность» еще
определить метод, вычисляющий диаметр. В классе «Цилиндр»
определить метод, вычисляющий объем.
7. Базовый класс «Точка». Классы «Окружность», «Равнобедренный
треугольник», «Квадрат» являются производными от класса «Точка». Во
всех классах определить по два метода, вычисляющих площадь фигуры
(площадь точки равна нулю, для объемных тел вычисляется площадь
полной поверхности). Один метод виртуальный, другой обычный. В
классе «Квадрат» еще определить метод, вычисляющий диагональ. В
классе «Окружность» еще определить метод, вычисляющий диаметр. В
классах «Равнобедренный треугольник » и «Квадрат» определить
методы, вычисляющие периметры.
8. Базовый класс «Точка». Классы «Окружность», «Равнобедренный
треугольник», «Ромб» являются производными от класса «Точка». Во
всех классах определить по два метода, вычисляющих площадь фигуры
(площадь точки равна нулю, для объемных тел вычисляется площадь
полной поверхности). Один метод виртуальный, другой обычный. В
классе «Ромб» еще определить метод, вычисляющий сторону. В классе
«Окружность» еще определить метод, вычисляющий диаметр. В классах
«Равнобедренный треугольник » и «Ромб» определить методы,
вычисляющие периметры.
9. Базовый класс «Точка». Классы «Окружность» и «Прямоугольник»
являются производными от класса «Точка». Класс «Конус» является
производным от класса «Окружность». Во всех классах определить по
два метода, вычисляющих площадь фигуры (площадь точки равна нулю,
для объемных тел вычисляется площадь полной поверхности). Один
метод виртуальный, другой обычный. В классе «Прямоугольник» еще
определить метод, вычисляющий диагональ прямоугольника. В классе
«Конус» определить метод, вычисляющий объем.
10. Базовый класс «Точка». Классы «Окружность» и «Ромб» являются
производными от класса «Точка». Класс «Конус» является производным
от класса «Окружность». Во всех классах определить по два метода,
36
вычисляющих площадь фигуры (площадь точки равна нулю, для
объемных тел вычисляется площадь полной поверхности). Один метод
виртуальный, другой обычный. В классе «Ромб» еще определить метод,
вычисляющий сторону. В классе «Конус» определить метод,
вычисляющий объем
11. Базовый класс «Точка». Классы «Правильный шестиугольник»,
«Правильный треугольник», «Квадрат» являются производными от
класса «Точка». Во всех классах определить по два метода,
вычисляющих площадь фигуры (площадь точки равна нулю, для
объемных тел вычисляется площадь полной поверхности). Один метод
виртуальный, другой обычный. Один метод виртуальный, другой
обычный. В классе «Квадрат» еще определить метод, вычисляющий
диагональ. В классах «Правильный треугольник», «Правильный
шестиугольник» и «Квадрат» определить методы, вычисляющие
периметры.
12. Базовый класс «Точка». Классы «Правильный шестиугольник»,
«Правильный треугольник», «Ромб» являются производными от класса
«Точка». Во всех классах определить по два метода, вычисляющих
площадь фигуры (площадь точки равна нулю, для объемных тел
вычисляется площадь полной поверхности). Один метод виртуальный,
другой обычный. Один метод виртуальный, другой обычный. В классе
«Ромб» еще определить метод, вычисляющий сторону. В классах
«Правильный треугольник», «Правильный шестиугольник» и «Квадрат»
определить методы, вычисляющие периметры.
13. Базовый класс «Точка». Классы «Окружность» и «Правильный
треугольник» являются производными от класса «Точка». Класс
«Правильная треугольная призма» является производным от класса
«Правильный треугольник». Во всех классах определить по два метода,
вычисляющих площадь фигуры (площадь точки равна нулю, для
объемных тел вычисляется площадь полной поверхности). Один метод
виртуальный, другой обычный. В классе «Окружность» еще определить
метод, вычисляющий диаметр. В классе «Правильная треугольная
призма» определить метод, вычисляющий объем.
14. Базовый класс «Точка». Классы «Ромб» и «Правильный треугольник»
являются производными от класса «Точка». Класс «Правильная
треугольная призма» является производным от класса «Правильный
треугольник». Во всех классах определить по два метода, вычисляющих
37
площадь фигуры (площадь точки равна нулю, для объемных тел
вычисляется площадь полной поверхности). Один метод виртуальный,
другой обычный. В классе «Ромб» еще определить метод, вычисляющий
периметр. В классе «Правильная треугольная призма» определить метод,
вычисляющий объем.
15. Базовый класс «Точка». Классы «Окружность» и «Квадрат» являются
производными от класса «Точка». Класс «Правильная четырехугольная
призма» является производным от класса «Квадрат». Во всех классах
определить по два метода, вычисляющих площадь фигуры (площадь
точки равна нулю, для объемных тел вычисляется площадь полной
поверхности). Один метод виртуальный, другой обычный. В классе
«Квадрат» еще определить метод, вычисляющий периметр. В классе
«Правильная четырехугольная призма» определить метод, вычисляющий
объем.
16. Базовый класс «Точка». Классы «Окружность», «Прямоугольный
треугольник», «Прямоугольник » являются производными от класса
«Точка». Во всех классах определить по два метода, вычисляющих
площадь фигуры (площадь точки равна нулю, для объемных тел
вычисляется площадь полной поверхности). Один метод виртуальный,
другой обычный. В классе «Окружность» еще определить метод,
вычисляющий диаметр. В классах «Прямоугольный треугольник» и
«Прямоугольник» определить методы, вычисляющие периметры.
17. Базовый класс «Точка». Классы «Окружность», «Прямоугольный
треугольник», «Ромб » являются производными от класса «Точка». Во
всех классах определить по два метода, вычисляющих площадь фигуры
(площадь точки равна нулю, для объемных тел вычисляется площадь
полной поверхности). Один метод виртуальный, другой обычный. В
классе «Окружность» еще определить метод, вычисляющий диаметр. В
классах «Прямоугольный треугольник» и «Ромб» определить методы,
вычисляющие периметры.
18. Базовый класс «Точка». Классы «Правильный шестиугольник»,
«Квадрат» являются производными от класса «Точка». Класс
«Правильная четырехугольная призма» является производным от класса
«Квадрат». Во всех классах определить по два метода, вычисляющих
площадь фигуры (площадь точки равна нулю, для объемных тел
вычисляется площадь полной поверхности). Один метод виртуальный,
другой обычный. В классе «Квадрат» еще определить метод,
38
вычисляющий диагональ. В классах, «Правильный шестиугольник» и
«Квадрат» определить методы, вычисляющие периметры. В классе
«Правильная четырехугольная призма» определить метод, вычисляющий
объем.
19. Базовый класс «Точка». Классы «Окружность», «Сектор»,
«Прямоугольник» являются производными от класса «Точка». Во всех
классах определить по два метода, вычисляющих площадь фигуры
(площадь точки равна нулю, для объемных тел вычисляется площадь
полной поверхности). Один метод виртуальный, другой обычный. В
классе «Прямоугольник» еще определить метод, вычисляющий
диагональ. В классе «Окружность» еще определить метод, вычисляющий
диаметр. В классе «Сектор» определить метод, вычисляющий длину
дуги.
20. Базовый класс «Точка». Классы «Окружность», «Сектор», «Ромб»
являются производными от класса «Точка». Во всех классах определить
по два метода, вычисляющих площадь фигуры (площадь точки равна
нулю, для объемных тел вычисляется площадь полной поверхности).
Один метод виртуальный, другой обычный. В классе «Ромб» еще
определить метод, вычисляющий сторону. В классе «Окружность» еще
определить метод, вычисляющий диаметр. В классе «Сектор»
определить метод, вычисляющий длину дуги.
21. Базовый класс «Точка». Классы «Окружность» и «Сектор» являются
производными от класса «Точка». Класс «Конус» является производным
от класса «Окружность». Во всех классах определить по два метода,
вычисляющих площадь фигуры (площадь точки равна нулю, для
объемных тел вычисляется площадь полной поверхности). Один метод
виртуальный, другой обычный. В классе «Сектор» еще определить метод,
вычисляющий длину дуги. В классе «Конус» определить метод,
вычисляющий объем.
22. Базовый класс «Точка». Классы «Сектор» и «Квадрат» являются
производными от класса «Точка». Класс «Правильная четырехугольная
пирамида» является производным от класса «Квадрат». Во всех классах
определить по два метода, вычисляющих площадь фигуры (площадь
точки равна нулю, для объемных тел вычисляется площадь полной
поверхности). Один метод виртуальный, другой обычный. В классе
«Квадрат» еще определить метод, вычисляющий периметр. В классе
39
«Правильная четырехугольная призма» определить метод, вычисляющий
объем.
23. Базовый класс «Точка». Классы «Окружность» и «Прямоугольник»
являются производными от класса «Точка». Класс «Параллелепипед»
является производным от класса «Прямоугольник». Во всех классах
определить по два метода, вычисляющих площадь фигуры (площадь
точки равна нулю, для объемных тел вычисляется площадь полной
поверхности). Один метод виртуальный, другой обычный. В классе
«Прямоугольник» еще определить метод, вычисляющий периметр. В
классе «Параллелепипед» определить метод, вычисляющий объем.
24. Базовый класс «Точка». Классы «Сектор», «Прямоугольный
треугольник», «Прямоугольник » являются производными от класса
«Точка». Во всех классах определить по два метода, вычисляющих
площадь фигуры (площадь точки равна нулю, для объемных тел
вычисляется площадь полной поверхности). Один метод виртуальный,
другой обычный. В классе «Сектор» еще определить метод,
вычисляющий длину дуги. В классах «Прямоугольный треугольник» и
«Квадрат» определить методы, вычисляющие периметры.
Вопросы:
1. Что такое наследование?
2. Как на языке С# оформляется наследование?
3. Какое наследование называется множественным?
4. Реализовано ли множественное наследование классов на языке С#?
5. Как оформляется виртуальный метод?
6. В чем отличие виртуального метода от не виртуального?
7. На какие объекты могут указывать ссылки базового класса?
40
Лабораторная работа №6
Абстрактные классы и интерфейсы.
Цель работы – Самостоятельное определение абстрактного класса и
интерфейса. Изучение особенностей наследования от абстрактного класса или
интерфейса
Справочный материал.
Окно Solution Explorer
Окно Solution Explorer позволяет просматривать и редактировать файлы
проекта.
Рассмотрим это окно на примере проекта WindowsApplication1. Проекты
объединяются в решения.
Для нашего приложения было создано одно решение. Решению
соответствует корневой значок дерева файлов, обозначенный как Solution
«WindowsApplication1»
На следующем уровне иерархии находится значок с надписью
WindowsApplication1. Далее следуют папки и файлы, входящие в проект.
Для создания новой формы надо выделить значок проекта и вызвать
оперативное меню. В оперативном меню выбрать команду Add , при этом
откроется дополнительный список, в котором выбрать Add Windows
Form...Далее, в открывшемся окне в поле ввода Name ввести желаемое имя
формы и нажать кнопку OK. При этом будет создан класс новой формы.
Для создания нового файла для нового класса нужно надо выделить
значок проекта и вызвать оперативное меню. В оперативном меню выбрать
команду Add , при этом откроется дополнительный список, в котором выбрать
Add Class...Далее, в открывшемся окне в поле ввода Name ввести желаемое
имя класса и нажать кнопку OK.
Для вывода новой формы на экран надо поступить следующим
образом:
1. Создать объект класса новой формы. (Form2 f=new Form2();)
41
2. Вывести созданный объект на экран с помощью методов Show или
ShowDialog.
Например, f.Show();f.ShowDialog();
Метод Show предназначен для вывода на экран нескольких форм и даёт
возможность работать с этими формами в параллельном режиме. Для того
чтобы перейти к некоторой форме t достаточно щёлкнуть по ней мышкой, при
этом остальные формы будут оставаться на экране, и к любой из них мы тоже
сможем перейти по щелчку мыши. Во многих приложениях такая работа не
нужна, она может привести к путанице. Чаще для активизации формы
используют метод ShowDialog.
При выводе формы методом ShowDialog переход к ранее открытым
формам возможен только после закрытия формы открытой с помощью метода
ShowDialog. Более того, выполнение команд, следующих за вызовом метода
ShowDialog, приостанавливается до закрытия соответствующей формы.
Поэтому фрагмент программы:
Form2 f=new Form2();
f.ShowDialog();
int i=f.j;
Не только создает и выводит на экран новую форму, но записывает в
переменную i то значение открытого поля j формы f, которое окажется в этом
поле в момент закрытия формы f. Если бы форма f выводилась методом Show,
то в переменную i , записалось бы число, которое находилось бы в поле j в
момент открытия формы f.
Окно Class Vew предназначено для быстрого перехода к нужному
описанию метода, свойства, поля или класса. Для быстрого перехода, надо в
представленном в окне Class Vew структурном дереве приложения найти
необходимое имя и выполнить двойной щелчок по нему.
Абстрактные классы
Класс называется абстрактным, если он предназначен только для
использования в качестве базового при наследовании и нельзя создавать его
42
объекты. На языке С# для описания базового класса используется служебное
слово abstract . Абстрактные классы могут содержать точно такие же члены,
как и обычные классы. Кроме того, они могут содержать и абстрактные
методы
– методы, не имеющие реализации.
Абстрактные методы
описываются специальным образом. Во первых при их описании используется
служебное слово abstract, а во вторых вместо описания тела метода ставится
точка с запятой.
Пример.
abstract class M{
public int x;
public int g(){return x;}
abstract public int fun(); }
Абстрактный класс М, содержит поле х, не абстрактный метод g() и
абстрактный метод fun().
Абстрактные методы не могут содержаться в неабстрактных классах. Все
абстрактные методы должны быть определены в производных классах с
использованием служебного слова override.
class N:M{
override public int fun(){return 3;}}
Интерфейсы
Интерфейсы нужны
для
стандартизации
интерфейсов
объектов.
Поскольку очень важно, чтобы методы, выполняющие сходные действия в
разных классах, назывались одинаково и имели одинаковые формальные
параметры.
Интерфейс – это именованный набор абстрактных членов. Интерфейсы
не могут содержать поля, но могут содержать абстрактные методы, свойства и
события.
В языке С# интерфейс – это специальный тип (interface), содержащий
толь абстрактные члены. Поскольку других членов в интерфейсе быть не
43
может, то при их описании не используется слово abstract , поскольку
интерфейс определяет только общедоступные члены, то при их описании не
указывается уровень доступа.
Пример.
interface I {
int Sq();}
Если класс наследует интерфейс, то в нем обязательно должны быть
определены все члены, входящие в интерфейс.
Class A:I{
public int Sq(){return 6;} }
Замечание. Вместо фразы «класс А наследует интерфейс I» говорят
«класс А реализует интерфейс I» или «класс А поддерживает интерфейс I».
Класс может поддерживать несколько интерфейсов.
Ссылки на интерфейс
Ссылки на интерфейс - это ссылки на объекты классов, поддерживающих
данный интерфейс. Если объявлена ссылка на интерфейс I, (I b;), а А – класс
поддерживающий интерфейс I, то можно написать b=new A(); и работать с
вновь созданным объектом класса А, через ссылку b. Если с объектом класса
мы работаем через ссылку на интерфейс, то в этом случае будут доступны
только члены, описанные в интерфейсе.
Ссылки на интерфейс могут быть формальными параметрами методов и
могут возвращаться методами.
Свойства
Поскольку в ООП поля классов рекомендуется создавать закрытыми, а
работа с закрытыми членами класса осуществляется через открытые методы, то
данная работа выполняется очень часто. Поэтому для ее облегчения создана
специальная синтаксическая конструкция, которая называется свойство.
44
Свойство – это два метода, предназначенные для работы с закрытым полем, и
оформленные специальным образом. В некоторых языках, таких как
Объектный Паскаль, в определение свойства включают и само закрытое поле.
Пример описания свойства:
private int svv;
public int sv
{
get{return svv;}
set{svv=value;} }
Если в определении свойства отсутствует раздел get, то свойство
предназначено только для записи, а если раздел set – то свойство
предназначено только для чтения.
Свойство имеет еще одно преимущество перед обычными методами,
обеспечивающими доступ к закрытому члену. Они вызываются специальным
образом, имитирующим обращение к полю. Например
f.sv=5;
int i=f.sv;
Этапы выполнения задания
1. Размер фигуры определяется размером прямоугольника, в который она
помещается, назовем его базовым. Расположение фигуры в этом
прямоугольнике, определяется вариантом задания. При выводе фигуры на
экран базовый прямоугольник не рисуется.
2. Создать форму Dialog для ввода размеров базового прямоугольника.
a. В класс формы Dialog добавить два открытых поля Х, У типа int,
для хранения вводимой информации.
b. На форму Dialog поместить два текстовых поля и одну кнопку. При
нажатии на кнопку информация, записанная в поля ввода должна
преобразовываться в тип int и записываться в поля Х и У.
3. Описать иерархию классов, определяемую вариантом задания. Каждый
класс иерархии определить в отдельном файле.
45
4. В класс Form1 добавить поле Figure, которое является ссылкой на
абстрактный класс для нечетных вариантов и ссылкой на интерфейс для
четных вариантов.
5. На форму Form1 поместить три кнопки и два поля ввода. Первые две из
кнопок должны иметь названия соответствующие именам производных
классов, третья – надпись «Рисование».
6. При нажатии на одну из двух первых кнопок должны выполняться
следующие действия:
a. Создаваться объект класса, имя которого соответствует надписи на
кнопке. Адрес созданного объекта должен записываться в ссылку
типа Figure .
b. Выводиться на экран форма Dialog. После ее закрытия,
информация из ее полей Х и У должна быть переписана в поля
созданного объекта.
7. При нажатии на кнопку «Рисование» должна выполняться проверка
того, что ссылка Figure не является нулевой, и если - нет, то на экран
должна выводиться фигура. Место положения фигуры должно
определяться информацией, находящейся в полях ввода формы Form1.
План отчета
9. Титульный лист.
10.Цель работы.
11.Задание.
12.Теоретический материал, используемый при выполнении задания.
13.Распечатка программы.
Варианты иерархий классов
1. Иерархия включает абстрактный базовый класс под названием «Фигура»,
и два его подкласса. Абстрактный класс содержит абстрактный метод
рисования фигуры и два поля или два свойства, определяющие размер
фигуры. В подклассах переопределяется абстрактный метод.
46
2. Иерархия включает интерфейс и два класса, поддерживающих этот
интерфейс. Интерфейс содержит метод рисования фигуры и два свойства,
определяющие размер фигуры.
Варианты фигур
1. Эллипс, вписанный в базовый прямоугольник.
2. Прямоугольник, совпадающий с базовым прямоугольником.
3. Шестиугольник (не обязательно правильный), расположение
шестиугольника в базовом прямоугольнике студент определяет
самостоятельно.
4. Пятиугольник (не обязательно правильный), расположение
пятиугольника в базовом прямоугольнике студент определяет
самостоятельно.
5. Ромб, вершины которого лежат на серединах базового прямоугольника.
6. Равнобедренный треугольник, основание треугольника совпадает с
нижней базового прямоугольника, а противоположная основанию
вершина лежит на середине верхней стороны базового прямоугольника.
7. Прямоугольный треугольник, катеты которого совпадают со сторонами
базового прямоугольника.
8. Сектор в 180 градусов. Для построения сектора, не используется понятие
базового прямоугольника.
9. Равнобокая трапеция. Основания трапеции должны лежать на сторонах
базового прямоугольника.
Варианты индивидуальных заданий
1. Первый вариант иерархии классов. 1, 2 варианты фигур.
2. Второй вариант иерархии классов, 1, 7 варианты фигур.
3. Первый вариант иерархии классов. 1, 3 варианты фигур.
4. Второй вариант иерархии классов, 1, 4 варианты фигур.
47
5. Первый вариант иерархии классов. 1, 6 варианты фигур.
6. Второй вариант иерархии классов, 1, 8 варианты фигур.
7. Первый вариант иерархии классов, 1, 9 варианты фигур.
8. Второй вариант иерархии классов, 1, 5 варианты фигур.
9. Первый вариант иерархии классов, 2, 3 варианты фигур.
10.Второй вариант иерархии классов, 2, 4 варианты фигур.
11.Первый вариант иерархии классов. 2, 5 варианты фигур.
12.Второй вариант иерархии классов, 2, 6 варианты фигур.
13.Первый вариант иерархии классов. 2, 7 варианты фигур.
14.Второй вариант иерархии классов, 2, 9 варианты фигур.
15.Первый вариант иерархии классов. 3, 8 варианты фигур.
16.Второй вариант иерархии классов, 6, 2 варианты фигур.
17.Первый вариант иерархии классов, 6, 4 варианты фигур.
18.Второй вариант иерархии классов, 6, 5 варианты фигур.
19.Первый вариант иерархии классов, 6, 7 варианты фигур.
20.Второй вариант иерархии классов, 6, 8 варианты фигур.
21.Первый вариант иерархии классов. 6, 9 варианты фигур.
22.Второй вариант иерархии классов, 7, 4 варианты фигур.
23.Первый вариант иерархии классов. 7, 5 варианты фигур.
24.Второй вариант иерархии классов, 7, 8 варианты фигур.
25.Первый вариант иерархии классов. 7, 9 варианты фигур.
Вопросы
1. Какой класс называется абстрактным?
2. Какие члены может содержать абстрактный класс?
3. Что такой тип называется интерфейсом?
4. Какие члены может содержать интерфейс?
5. Может ли интерфейс содержать поле?
6. Что такое свойство?
48
Лабораторная работа №7
Списки
Цель работы – научится работать со списками, используя библиотечные
классы .
Справочный материал.
Описание списков
Список — это абстрактный тип данных, представляющий собой
упорядоченный набор значений, в котором некоторое значение может
встречаться более одного раза. Значения, входящие в список называются
элементами списка; если значение встречается несколько раз, каждое
вхождение считается отдельным элементом. Список можно считать
компьютерной реализацией математического понятия конечной
последовательности.
В программе, списки могут быть реализованы с помощью массивов; но
эта реализация не является оптимальной, поскольку вставка или удаление
элемента из середины списка весьма трудоёмкие операции.
Чаще всего списки реализуются в виде отдельно расположенных
элементов, в которых хранятся не только значения, но и ссылки на соседние
элементы. Если список односвязный, то в первом элементе хранится ссылка на
второй элемент, во втором - на третий и т.д. Если список односвязный
кольцевой, то в последнем элементе хранится ссылка на первый элемент, в не
кольцевом списке такой ссылки нет.
Если список двусвязный, то в каждом элементе храниться две ссылки: на
соседа с большим номером и на соседа меньшим номером. Двусвязные списки
так же бывают кольцевыми и не кольцевыми. Во втором случае в первом
элементе есть ссылка на второй, а в последнем – на первый.
Список является чрезвычайно гибкой структурой т.к. его легко сделать
большим или меньшим. Списки можно объединить или разорвать на меньшие
списки. Элементы списка доступны для вставки, удлинения и просмотра.
49
В определении списка часто используется понятие текущая позиция или
курсор. Как правило, именно элемент, находящийся в текущей позиции, мы
можем просмотреть или удалить, вставляется новый элемент, так же в текущую
позицию или сразу в следующую за ней. При обращении к элементу по номеру,
потребности в текущей позиции нет, но существует достаточно много
алгоритмов, работающих со списками, в которых используется это понятие. В
данной работе мы будем создавать визуальные модели различных видов
списков.
Класс ArrayList и обобщающий класс List<T>
Т.к. списки широко используются при написании программ, то
практически библиотеки всех языков программирования содержат их
реализацию. Язык С# не является исключением. Пространства имен System
Collektions и System.Collections.Generic содержат классы, предназначенные для
работы со списками.
Рассмотрим сначала класс ArrayList из пространства имён System.
Collektions, его можно использовать для создания любого вида списка.
Команда L=newArrayList(); создает пустой список с именем L.
Элементами этого списка являются объекты типа оbject. Поскольку все
типы объявляются производными от класса оbject, то элементом списка может
быть объект любого класса или структурного типа.
Метод Add позволяет добавлять элемент в конец списка
L.Add(3);
Данная команда добавит число 3 в список L.
L.Add(4);
Теперь список содержит два элемента <3,4>. Нумерация элементов
списка начинается с 0.
Метод Insert (),позволяет вставить элемент в произвольное место списка.
Его первый параметр – это номер позиции, в которую вставляется элемент, а
50
второй параметр – сам элемент. Если указывается номер невозможной позиции,
то формируется исключение.
По команде L.Insert (1,5); число 5 будет помещено в позицию под
номером один нашего списка. Список примет вид <3,5,4>.
Методы Remove At, Remove предназначены для удаления элементов из
списка, первый удаляет элемент по номеру, второй – по значению. Для
удаления нулевого элемента можно использовать команду
L. Remove At(0);
Если задать номер несуществующего элемента, то будет сгенерировано
исключение.
Метод Remove удаляет элемент по значению, точнее, его первое
вхождение. Если удаляемого элемента в списке нет, то ничего не происходит.
Доступ к элементу в классе ArrayList реализован по номеру, поэтому его
можно считать динамическим массивом.
int i= (int)L[0];
Переменная i получит значение 5. Преобразование типов при этом
необходимо, поскольку элементы списка L имеют тип object.
Команда L[0]=8; изменит значение элемента под номером 0, если задать
номер несуществующего элемента, то будет сгенерировано исключение.
Свойство для чтения Count возвращает число элементов в списке.
Класс ArryList содержит много других членов, которые позволяют
упростить работу со списками. Например, метод Sort сортирует список по
возрастанию в тех случаях, когда это возможно, т.е. в тех случаях, когда типы
элементов списка реализуют интерфейс IComparable.
Методы Contains и IndexOf позволяют выяснить содержится ли объект в
списке, причём первый метод возвращает значение булева типа (true, false), а
второй – номер первого вхождения элемента в список, если элемент есть, или «1» в противном случае.
Метод AddRange позволяет добавить к списку список элементов.
L.AddRange(L);
51
Данная команда удлинит список вдвое.
Класс ArrayList в силу своей универсальности имеет недостатки.
Например, в список чисел L, кто-то может добавить объект типа Button.
Если нам надо построить строго типизированный список, лучше
использовать обобщенный класс List<T> из пространства имен
System.Collections.Generic, который обеспечивает такие же функциональные
возможности, как и необобщенный класс ArrayList, но при этом задает тип
элементов, в момент создания списка.
List< int > L1=new List<int>();
List< Button > L2=new List< Button >();
L1- это список чисел, L2 – список кнопок.
Работая со строго типизированным списком, нам уже не надо выполнять
преобразования типов при обращении к элементам. Например, строка
int i= L[0]; не вызовет проблем, если элемент списка №0 существует.
В определении списка часто используется понятие текущая позиция или
курсор. Как правило, именно элемент, находящийся в текущей позиции, мы
можем просмотреть или удалить, вставляется новый элемент, так же в текущую
позицию или сразу в следующую за ней. При обращении к элементу по номеру,
потребности в текущей позиции нет, но существует достаточно много
алгоритмов, работающих со списками, в которых используется это понятие. В
данной работе мы будем создавать визуальные модели различных видов
списков
Стек
Стек – это специальный тип списка, в котором все вставки и удаления
выполняются на одном конце, называемом вершиной. Движение элементов
происходит по принципу: последний вошёл – первый вышел. Очень часто при
просмотре элемента, находящегося на вершине стека происходит его удаление.
Пространство имен System.Collections содержит класс Stack, а
пространство имен System.Collections.Generic – обобщенный класс Stack<T>,
52
предназначенные для работы со стеками. Объект класса Stack содержит
элементы типа object, т.е. в стек можно поместить любой объект, но при его
просмотре потребуется преобразование типов. Обобщение Stack<T> позволяет
создать строго типизированный стек.
Метод Contains позволяют выяснить содержится ли объект в списке,
метод возвращает true или false. Метод Clear – очищает список, а свойство для
чтения Count возвращает число элементов стека.
Stack s=new Stack();//создание стека;
s.Push(8);//помещение в стек числа;
s.Push(6);//помещение в стек числа;
int i=(int)s.Peek();//просмотр элемента в вершине стека без его удаления;
i=(int)s.Pop();//просмотр и удаление элемента в вершине стека.
Очередь
Другой вид списка очередь работает по другому принципу: первый вошёл
– первый вышел. Пример очереди – это очередь в магазине, может быть в
Интернет магазине.
Пространство имен System.Collections содержит класс Queue,
пространство имен System.Collections.Generic – обобщенный класс Queue <T>,
предназначенные для работы с очередями.
Функции, выполняемые с очередями аналогичны функциям, работающим
со стеками. Существенное отличие заключается в том, что вставка новых
элементов осуществляется в конец очереди, а не в начало.
Queue q=new Queue();//Создание очереди
q.Enqueue(8);//Добавление числа
q.Enqueue(9);//Добавление числа
int i=(int)q.Dequeue();//Просмотр и удаление первого элемента
i=(int)q.Peek();//Просмотр без удаления первого элемента
53
Задание
Задание состоит из двух частей.
Варианты частей задания вычисляется следующим образом:
Пусть n-номер студента в списке группы. Находим остаток от деления n
на 4 и прибавляем единицу (n%4+1) получаем вариант первой части задания.
Для определения варианта второй части задания нужно найти остаток от
деления n на 5 и прибавить двойку (n%5+2), получим вариант второй части
задания.
В первом задании определяется тип элемента списка. Во втором задании
определяется вид списка.
Поскольку будет строиться визуальная модель работы со списком, то
элементы списка должны иметь фиксированную форму и размеры. Каждый
студент сам определяет геометрическую фигуру (многоугольник или эллипс),
которая будет изображать элемент списка. Многоугольники должны быть
уникальны для каждого студента и нужного размера, поэтому выбор студента
контролируется преподавателем.
Способ рисования списка зависит от типа его элементов.
Если элемент имеет координаты, то элемент рисуется с использованием
этих координат, в этом случае, выводится порядковый номер элемента списка.
Номер желательно нарисовать внутри фигуры, изображающей элемент.
Если элемент не имеет координат, то у него есть «имя». В этом случае все
элементы рисуются по горизонтали. Обозначим через xi координату х i-того
элемента. Координаты первого элемента выбираются произвольно, а
координата х2 вычисляется по формуле х2=х1+с, где с – ширина выбранного
студентом многоугольника, х3=х2+с и т.д. Внутри многоугольника выводится
«имя» элемента.
Если, при задании элемента, нужна дополнительная информация, то на
форму помещаются поля ввода. Например, если элемент содержит координаты,
то эти координаты задает пользователь, либо используя поля ввода, либо
54
указывая мышкой на нужную точку (точнее, выполняя щелчок левой кнопкой
мыши в нужной точке).
Варианты классов, объекты которых будут элементами списка.
1. Вариант 1. Класс, содержит следующие члены.
a. Поля для хранения координат х и у.
b. Два метода, один из которых возвращает х, второй – у ;
c. Конструктор класса с двумя параметрами.
2. Вариант 2. Класс, содержащий следующие члены.
a. Статическое поле, с помощью которого определяется порядковый
номер, создаваемого объекта :
b. Поле (не статическое), в которое записывается порядковый номер
создания этого элемента (таким образом, каждый объект получает
уникальное «имя»);
c. Метод возвращающий «имя» элемента.
d. Конструктор класса, в котором изменяется значение статического
поля.
3. Вариант 3. Класс, содержащий следующие члены.
a. Поле - «имя», в которое помещается случайное число от 0 до 100;
b. Метод возвращающий «имя» элемента.
c. Конструктор класса, в котором определяется «имя».
4. Вариант 4. Класс, содержащий следующие члены.
a. Поле, в котором хранится имя элемента, имя запрашивается у
пользователя в момент создания элемента;
b. Метод возвращающий «имя» элемента.
c. Конструктор класса с одним параметром.
55
Варианты списков
1. Односвязный не кольцевой список. На форме должны находиться кнопки,
выполняющие следующие действия:
a. Перемещать текущую позицию на элемент №0.
b. Перемещать текущую позицию на элемент с большим номером, если
это возможно.
c. Удалять текущий элемент.
d. Вставлять новый элемент, следом за текущим элементом, при этом
новый элемент становится текущим.
2. Односвязный кольцевой список. На форме должны быть кнопки,
выполняющие следующие действия:
a. Перемещать текущую позицию на элемент с большим номером, если
это возможно. Если текущий элемент последний, то позиция
перемещается на первый.
b. Удалять текущий элемент.
c. Вставлять новый элемент, следом за текущим элементом, при этом
новый элемент становится текущим.
3. Двухсвязный кольцевой список. На форме должны быть кнопки,
выполняющие следующие действия:
a. Перемещать текущую позицию на элемент с большим номером, если
это возможно. Если текущий элемент последний, то позиция
перемещается на первый.
b. Перемещать текущую позицию на элемент с меньшим номером, если
это возможно. Если текущий элемент первый, то позиция
перемещается на последний.
c. Удалять текущий элемент.
d. Вставлять новый элемент, следом за текущим элементом, при этом
новый элемент становится текущим.
4. Двухсвязный не кольцевой список. На форме должны быть кнопки,
выполняющие следующие действия:
56
a. Перемещать текущую позицию на элемент с большим номером, если
это возможно
b. Перемещать текущую позицию на элемент с меньшим номером, если
это возможно.
c. Удалять текущий элемент.
d. Вставлять новый элемент, следом за текущим элементом, при этом
новый элемент становится текущим..
5. Стек. Текущим элементов всегда должен быть последний элемент. На
форме должны быть кнопки, выполняющие следующие действия:
a. Удалять элемент.
b. Вставлять элемент.
6. Очередь. Первый и последний элементы должны быть закрашены как
текущие. На форме должны быть кнопки, выполняющие следующие
действия:
a. Удалять элемент.
b. Вставлять элемент.
Этапы выполнения лабораторной работы
1. Выбрать многоугольник, который будет изображать элемент списка,
согласовать свой выбор с преподавателем.
2. Опираясь на вторую часть задания, разработать интерфейс программы.
3. Описать классы «Элемент» и «Список элементов», дав им другие имена.
При выполнении этого этапа, желательно использовать приведенные
примеры.
4. Создать обработчики событий, позволяющие выполнить работу со
списком, определенным второй частью задания.
5. Отладить программу
6. Написать отчет.
План отчета
57
1. Титульный лист.
2. Цель работы.
3. Задание.
4. Теоретический материал, используемый при выполнении задания.
5. Распечатка программы.
Пример 1
Рассматривается пример односвязного списка элементов, заданный вариантом
№1 . Элементы списка рисуются в виде окружностей. Даются только описания
классов.
public class Vector //Описание класса «Элемент»
{
static int n;
int nn;
public Vector()
{
nn=n++;
}
public string getName()
{
return nn.ToString();
}
}
class VecList //Описание класса «Список элементов»
{
private List<Vector> List=new List<Vector>();
private int p=-1;
Graphics g=null;
public void Add(Vector v)//Добавление элемента
{
List.Insert(++p,v);
this.Draw();
}
public void Del()
{
if(Count<1)return;
List.RemoveAt(p);
58
if(p>0)p--;
if(Count<1)p=-1;
Draw();
}
public void Clear()//Очистка списка
{
List.Clear();
p=-1;
this.Draw();
}
public int Count//Количество элементов
{
get{return List.Count;}
}
public void NextPos() //Перемещение текущей позиции на элемент с
большим номером
{
if(p+1<Count)
{
++p;
this.Draw();
}
}
public void ClearPos()//Перемещение текущей позиции первый элемент
{
if(this.Count==0)return;
p=0;this.Draw();
}
public void setGraphics(Graphics gg)
{
g=gg;
}
public void Draw()//Рисование элементов списка
{
if(g==null)return;
g.Clear(Color.White);
if(Count<1)return;
g.FillEllipse(new SolidBrush(Color.LightBlue),(p+1)*21,50,20,20);
Pen pen=new Pen(Color.Red);
for(int i=0;i<Count;i++)
{
g.DrawString(List[i].getName(),new Font("Arial",8),new
SolidBrush(Color.Black),(i+1)*21+3,52);
g.DrawEllipse(pen, (i+1)*21,50,20,20);
}
59
}
}
На рисунке №1 изображено, как может выглядеть программа, рассмотренная в
этом примере.
Рисунок 1
Пример 2
В этом примере, элементы определяются вариантом №2, список так же
односвязный не кольцевой. В этом примере приводится описание класса Vector
и метод рисования класса VecList, весь остальной код такой же, как в примере
№1.
public class Vector //Описание класса «Элемент»
{int x,y;
public Vector(int xx, int yy)
{
x=xx;y=yy;
}
public int getX()
{
return x;
}
public int getY()
{
return y;
}}
public void Draw()//Описание метода Draw класса «Список элементов»
{
if(g==null)return;
g.Clear(Color.White);
if(Count<1)return;
g.FillEllipse(new SolidBrush(Color.LightBlue),
((Vector)List[p]).getX(),((Vector)List[p]).getY(),20,20);
60
Pen pen=new Pen(Color.Red);
for(int i=0;i<Count;i++)
{
g.DrawString(i.ToString(),new Font("Arial",8),new SolidBrush(Color.Black),
((Vector)List[i]).getX()+1,((Vector)List[i]).getY()+3);
g.DrawEllipse(pen, ((Vector)List[i]).getX(),((Vector)List[i]).getY(),20,20);
}
}
На рисунке №2 изображено, как может выглядеть программа, рассмотренная в
этом примере.
Рисунок 2
Контрольные вопросы
2. Что такое список?
3. Что такое стек?
4. Что такое очередь?
5. Перечислить виды списков.
6. Какие библиотечные классы языка C# предназначены для работы со
списками?
7. Как создать строго типизированный список?
8. Охарактеризуйте класс ArrayList.
9. Какие методы позволяют добавлять элементы в список?
10.Какие методы удаляют элементы из списка?
11. Какое свойство позволяет узнать число элементов списка?
12. Как соединить два списка?
13.Любой ли список мы можем упорядочить?
61
Литература
1. Джеффри Рихтер, Программирование на платформе Microsoft .NET
Framework 4.0 на языке C# , из-во: Питер, 2012.
2. Эндрю Троелсен, Язык программирования C# 2010 и платформа .NET
4, из-во: Вильямс, 2011.
Оглавления
Лабораторная работа №1 Знакомство со средой визуального
программирования Microsoft Visual Studio.NET .................................................. 3
Справочный материал .................................................................................. 3
Microsoft Visual Studio.NET ...................................................................... 3
Управляющая кнопка. Компонент Button ............................................. 5
Этапы выполнения лабораторной работы .................................................. 6
План отчета ................................................................................................ 6
Варианты индивидуальных заданий ....................................................... 6
Вопросы: .................................................................................................... 8
Лабораторная работа №2 Работа с классами ............................................ 9
Справочный материал .................................................................................. 9
Классы ........................................................................................................ 9
Приведение типов ................................................................................... 10
Этапы выполнения лабораторной работы ................................................ 12
План отчета .............................................................................................. 13
Варианты индивидуальных заданий ..................................................... 13
Вопросы: .................................................................................................. 15
Лабораторная работа №3 Работа с закрытыми членами классов...... 15
Справочный материал ................................................................................ 16
Конструктор класса ................................................................................ 16
Уровни доступа к членам класса ........................................................... 17
Работа с закрытыми полями класса ...................................................... 18
Переключатели ........................................................................................ 19
Этапы выполнения лабораторной работы ................................................ 20
План отчета .............................................................................................. 21
Варианты индивидуальных заданий ..................................................... 21
Вопросы: .................................................................................................. 23
Лабораторная работа №4 Массивы ссылочных типов. ........................ 23
Справочный материал ................................................................................ 23
Массивы ................................................................................................... 23
Компоненты ListBox и ComboBox. ....................................................... 25
План отчета .............................................................................................. 26
Этапы выполнения задания и варианты индивидуальных заданий ...... 27
Лабораторная работа №5 Наследование классов. ................................. 27
Справочный материал ................................................................................ 27
62
Наследование ........................................................................................... 27
Конструкторы при наследовании ......................................................... 28
Переопределение методов базового класса. ....................................... 31
Этапы выполнения задания ....................................................................... 32
План отчета .............................................................................................. 34
Вопросы: ...................................................................................................... 40
Лабораторная работа №6 Абстрактные классы и интерфейсы. ......... 41
Справочный материал. ............................................................................... 41
Окно Solution Explorer ............................................................................ 41
Абстрактные классы ............................................................................... 42
Интерфейсы ............................................................................................. 43
Свойства ................................................................................................... 44
Этапы выполнения задания ....................................................................... 45
План отчета .............................................................................................. 46
Варианты иерархий классов .................................................................. 46
Варианты фигур ...................................................................................... 47
Варианты индивидуальных заданий ..................................................... 47
Вопросы ................................................................................................... 48
Лабораторная работа №7 Списки ............................................................. 49
Справочный материал. ............................................................................... 49
Описание списков ................................................................................... 49
Класс ArrayList и обобщающий класс List<T> .................................... 50
Стек........................................................................................................... 52
Очередь .................................................................................................... 53
Задание ......................................................................................................... 54
Варианты классов, объекты которых будут элементами списка. ...... 55
Варианты списков ................................................................................... 56
Этапы выполнения лабораторной работы ........................................... 57
План отчета .............................................................................................. 57
Пример 1 .................................................................................................. 58
Пример 2 .................................................................................................. 60
Контрольные вопросы ............................................................................ 61
Литература ................................................................................................... 62
Оглавления................................................................................................... 62
63