Похожие презентации:
Объектно-ориентированное программирование. Языки C++ и C#
1. Объектно-ориентированное программирование. Языки C++ и C#
1Объектно-ориентированное
программирование.
Языки C++ и C#
§ 46. Что такое ООП?
§ 47. Объекты и классы
§ 48. Создание объектов в программе
§ 49. Скрытие внутреннего устройства
§ 50. Иерархия классов
§ 51. Программы с графическим интерфейсом
§ 52. Программирование в RAD-средах
§ 53. Использование компонентов
§ 54. Совершенствование компонентов
§ 55. Модель и представление
К.Ю. Поляков, Е.А. Ерёмин, 2013
http://kpolyakov.spb.ru
2. Объектно-ориентированное программирование. Языки C++ и C#
2Объектноориентированное
программирование.
Языки C++ и C#
§ 46. Что такое ООП?
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
3. Зачем нужно что-то новое?
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс3
Зачем нужно что-то новое?
!
Главная проблема – сложность!
• программы из миллионов строк
• тысячи переменных и массивов
Э. Дейкстра: «Человечество еще в древности
придумало способ управления сложными системами:
«разделяй и властвуй»».
Структурное программирование:
декомпозиция по
задача
задачам
подзадача 1
подзадача 2.1
подзадача 2
подзадача 2.2
К.Ю. Поляков, Е.А. Ерёмин, 2014
подзадача 3
подзадача 2.3
человек мыслит
иначе, объектами
http://kpolyakov.spb.ru
4. Как мы воспринимаем объекты?
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс4
Как мы воспринимаем объекты?
существенные
свойства
Абстракция – это выделение существенных свойств
объекта, отличающих его от других объектов.
!
К.Ю. Поляков, Е.А. Ерёмин, 2014
Разные цели –
разные модели!
http://kpolyakov.spb.ru
5. Использование объектов
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс5
Использование объектов
Программа – множество объектов (моделей), каждый из
которых обладает своими свойствами и поведением,
но его внутреннее устройство скрыто от других
объектов.
!
Нужно «разделить» задачу на объекты!
А
В
Б
Б1
В1
Б2
В2
В3
Б3
Г
Г1
К.Ю. Поляков, Е.А. Ерёмин, 2014
Г2
декомпозиция по
объектам
http://kpolyakov.spb.ru
6. Объектно-ориентированное программирование. Языки C++ и C#
6Объектноориентированное
программирование.
Языки C++ и C#
§ 47. Объекты и классы
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
7. С чего начать?
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс7
С чего начать?
Объектно-ориентированный анализ (ООА):
• выделить объекты
• определить их существенные свойства
• описать поведение (команды, которые они
могут выполнять)
Что такое объект?
?
Объектом можно назвать то, что имеет чёткие границы
и обладает состоянием и поведением.
Состояние определяет поведение:
• лежачий человек не прыгнет
• незаряженное ружье не выстрелит
Класс – это множество объектов, имеющих общую
структуру и общее поведение.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
8. Модель дороги с автомобилями
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс8
Модель дороги с автомобилями
Объект «Дорога»:
ширина
(число полос)
длина
свойства
(состояние)
Дорога
длина
ширина
название
класса
методы
(поведение)
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
9. Модель дороги с автомобилями
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс9
Модель дороги с автомобилями
Объект «Машина»:
свойства: координаты и скорость
P
V
X
• все машины одинаковы
• скорость постоянна
• на каждой полосе – одна машина
• если машина выходит за правую
границу дороги, вместо нее слева
появляется новая машина
Машина
X (координата)
P (полоса)
V (скорость)
двигаться
Метод – это процедура или функция, принадлежащая
классу объектов.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
10. Модель дороги с автомобилями
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс10
Модель дороги с автомобилями
Взаимодействие объектов:
Дорога
длина
ширина
узнать длину
Машина
X (координата)
P (полоса)
V (скорость)
двигаться
Схема определяет
• свойства объектов
• методы: операции, которые они могут выполнять
• связи (обмен данными) между объектами
!
Ни слова о внутреннем устройстве объектов!
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
11. Объектно-ориентированное программирование. Языки C++ и C#
11Объектноориентированное
программирование.
Языки C++ и C#
§ 48. Создание объектов в
программе
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
12. Классы
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс12
Классы
• программа – множество взаимодействующих объектов
• любой объект – экземпляр какого-то класса
• класс – описание группы объектов с общей структурой и
поведением
отличие от
структур!
Класс
Данные
состояние
Методы
поведение
Поле – это переменная, принадлежащая объекту.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
13. Класс «Дорога»
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс13
Класс «Дорога»
Объявление класса:
class TRoad
{
float Length;
int Width;
};
!
Память не выделяется!
Объявление переменной (создание объекта):
TRoad road;
Попытка изменить данные:
ошибка
road.Length = 60;
road.Width = 3;
!
private
По умолчанию все члены класса закрытые!
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
14. Класс «Дорога»
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс14
Класс «Дорога»
Объявление класса:
class TRoad
{
public:
float Length;
int Width;
};
!
Общедоступные данные!
Основная программа:
main()
{
TRoad road;
road.Length = 60; // работает!
road.Width = 3;
// работает!
}
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
15. Класс «Дорога»
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс15
Класс «Дорога»
вызов конструктора
TRoad road;
Конструктор – это метод класса, который
вызывается для создания объекта этого класса.
!
Конструктор по умолчанию строится автоматически!
?
Что записано в полях?
road.Length = ???
road.Width = ???
К.Ю. Поляков, Е.А. Ерёмин, 2014
«мусор»
http://kpolyakov.spb.ru
16. Новый конструктор
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс16
Новый конструктор
Класс:
class TRoad
Имя конструктора совпадает
{
с именем класса!
public:
float Length;
int Width;
TRoad(); // объявление конструктора
};
!
Конструктор:
TRoad::TRoad()
{
Length = 0;
Width = 0;
}
К.Ю. Поляков, Е.А. Ерёмин, 2014
метод aaa класса TRoad
TRoad::aaa()
{
...
}
http://kpolyakov.spb.ru
17. Конструктор с параметрами
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс17
Конструктор с параметрами
class TRoad
{
public:
...
TRoad ( float length0, int width0 );
};
Конструктор:
TRoad::TRoad ( float length0, int width0 )
{
Length = length0;
Width = width0;
}
Вызов:
TRoad road ( 60, 3 );
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
18. Защита от неверных данных
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс18
Защита от неверных данных
TRoad::TRoad ( float length0, int width0 )
{
if ( length0 > 0 )
Length = length0;
else Length = 1;
if ( width0 > 0 )
Width = width0;
else Width = 1;
}
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
19. Значения параметров по умолчанию
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс19
Значения параметров по умолчанию
class TRoad
значение по
{
умолчанию
public:
...
TRoad ( float length0, int width0 = 3 );
};
Вызов:
TRoad road ( 60 );
последние в списке
параметров
width = 3
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
20. Класс «Машина»
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс20
Класс «Машина»
class TCar
координата,
{
скорость
public:
float X, V; полоса
int P;
TRoad *Road;
дорога, по
которой едет
void move();
TCar (); // конструктор без параметров
TCar ( TRoad *road0, int p0, float v0 );
};
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
21. Конструкторы класса «Машина»
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс21
Конструкторы класса «Машина»
TCar::TCar ()
{
Road = NULL;
P = 0; V = 0; X = 0;
}
защита от ошибок –
самостоятельно
TCar::TCar ( TRoad *road0, int p0,
float v0 )
{
Road = road0;
P = p0; V = v0; X = 0;
}
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
22. Класс «Машина»: метод move
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс22
Класс «Машина»: метод move
Равномерное движение:
X X 0 V t
t 1 интервал
дискретизации
перемещение за одну
единицу времени
void TCar::move()
выезжает с другой
{
стороны
X = X + V;
if ( X > Road->Length ) X = 0;
}
обращение через
указатель
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
23. Основная программа
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс23
Основная программа
const int N = 3;
TCar cars[N];
int i;
for ( i = 0; i < N; i++ )
{
cars[i].Road = &road;
cars[i].P = i + 1;
cars[i].V = 2.0*(i + 1);
}
do {
for ( i = 0; i < N; i++ )
#include <conio.h>
cars[i].move();
}
пока не нажата
while ( !kbhit() );
(любая) клавиша
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
24. Использование указателей
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс24
Использование указателей
const int N = 3;
TCar *cars[N];
массив указателей
for ( i = 0; i < N; i ++ )
cars[i] = new TCar ( &road, i+1,
2.0*(i+1) );
создание объектов
for ( i = 0; i < N; i ++ )
cars[i]->move();
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
25. Что в этом хорошего и плохого?
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс25
Что в этом хорошего и плохого?
ООП – это метод разработки больших программ!
основная программа – простая и понятная
классы могут разрабатывать разные программисты
независимо друг от друга (+интерфейс!)
повторное использование классов
неэффективно для небольших задач
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
26. Задание
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс26
Задание
«A»: Построить класс Попугай (TParrot), который умеет
говорить какую-то фразу, заранее определённую при
описании класса.
Пример:
TParrot p;
p.say();
Привет, друзья!
«B»: Изменить класс из задания A так, чтобы фраза
задавалась при создании конкретного экземпляра.
Пример:
TParrot p1( "Гав!" );
TParrot p2( "Мяу!" );
p1.say();
Гав!
p2.say();
Мяу!
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
27. Задание
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс27
Задание
«С»: Изменить класс из задания B так, чтобы фразу можно
было изменять во время работы программы.
Пример:
TParrot p( "Гав!" );
p.say();
Гав!
p.newText( "Мяу!" );
p.say();
Мяу!
«D»: Изменить класс из задания C так, чтобы при вызове
метода say можно было задать число повторений.
Пример:
TParrot p( "Гав!" );
p.say();
Гав!
p.newText( "Мяу!" );
p.say( 3 );
Мяу! Мяу! Мяу!
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
28. Задание
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс28
Задание
«E»: Изменить класс из задания D так, чтобы можно было
добавлять фразы в набор фраз, которые знает попугай.
При вызове метода say попугай выдаёт случайную фразу
из своего набора.
Пример:
TParrot p( "Гав!" );
p.say();
Гав!
p.learn( "Мяу!" );
p.say();
Гав!
p.say(3);
Мяу! Мяу! Мяу!
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
29. Объектно-ориентированное программирование. Языки C++ и C#
29Объектноориентированное
программирование.
Языки C++ и C#
§ 49. Скрытие внутреннего
устройства
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
30. Зачем скрывать внутреннее устройство?
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс30
Зачем скрывать внутреннее устройство?
Объектная модель задачи:
интерфейсы
?
?
защита внутренних данных
проверка входных данных на корректность
изменение устройства с сохранением интерфейса
Инкапсуляция («помещение в капсулу») – скрытие
внутреннего устройства объектов.
!
Также объединение данных и методов в
одном объекте!
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
31. Защита внутренних данных
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс31
Защита внутренних данных
состояние
методы
!
Cat
энергия
настроение
голод
есть
спать
играть
Меняем состояние
только через методы!
К.Ю. Поляков, Е.А. Ерёмин, 2014
?
Можно изменять
вучную?
метод есть
+ энергия
+ настроение
- голод
метод спать
+ энергия
+ голод
метод играть
- энергия
+ настроение
+ голод
http://kpolyakov.spb.ru
32. Пример: класс «перо»
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс32
Пример: класс «перо»
class TPen
Field – поле
{
R
G
B
private:
string FColor; // цвет, "FF00FF"
};
По умолчанию все члены класса
закрытые – private!
class TPen
{
Как к ним обращаться?
private:
string FColor;
методы
доступа
public:
string
stringgetColor
getColor();
();
void
voidsetColor
setColor(( string
stringnewColor
newColor );
);
};
!
?
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
33. Пример: класс «перо»
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс33
Пример: класс «перо»
Получить значение:
string TPen::getColor ()
{
return FColor;
}
Записать значение:
void TPen::setColor ( string
{
if ( newColor.length()!= 6
FColor = "000000";
else FColor = newColor;
}
!
newColor )
)
если ошибка,
чёрный цвет
Защита от неверных данных!
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
34. Пример: класс «перо»
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс34
Пример: класс «перо»
Использование:
установить
цвет
TPen pen;
pen.setColor ( "FFFF00" );
cout << "цвет пера: " << pen.getColor();
!
Не очень удобно!
pen.color = "FFFF00";
cout << pen.color;
К.Ю. Поляков, Е.А. Ерёмин, 2014
прочитать
цвет
нельзя в
C++
http://kpolyakov.spb.ru
35. Изменение внутреннего устройства
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс35
Изменение внутреннего устройства
Удобнее хранить цвет в виде числа:
class TPen
Найди отличие!
{
private:
изменилось внутреннее
int FColor;
устройство
public:
string getColor();
void setColor( string newColor );
};
?
!
Интерфейс не изменился!
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
36. Преобразования int hex
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс36
Преобразования int hex
Использование потока (байтов):
"FF00FF"
16711935
записываем в поток число в
шестнадцатеричной системе
#include <sstream>
stringstream s;
s << hex << FColor;
255 "FF"
"0000FF"
К.Ю. Поляков, Е.А. Ерёмин, 2014
читаем
строку
подключить
строковые потоки
?
Что плохо?
правильно так!
http://kpolyakov.spb.ru
37. Преобразования hex ↔ int
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс37
Преобразования hex ↔ int
#include <sstream>
#include <iomanip>
подключить
манипуляторы
string TPen::getColor()
{
заполнять не
stringstream s;
пробелами, а нулями
s << setfill('0')
<< setw(6)
вывести 6 знаков
<< hex << FColor;
прочитать строку
return s.str();
string из потока
}
255 "0000FF"
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
38. Преобразования hex int
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс38
Преобразования hex int
Использование потока:
"FF00FF"
записываем в
поток строку
16711935
читаем число в
шестнадцатеричной системе
void TPen::setColor ( string newColor )
{
stringstream s;
if ( newColor.length()!= 6 )
FColor = 0; // чёрный цвет
else {
записываем строку
s << newColor;
s >> hex >> FColor;
читаем число
}
}
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
39. Свойства в C#
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс39
Свойства в C#
Доступ с помощью методов:
TPen pen;
pen.setColor ( "FFFF00" );
cout << "цвет пера: " << pen.getColor();
Доступ с помощью свойства color:
вызов pen.setColor
TPen pen;
pen.color = "FFFF00";
cout << "цвет пера: " << pen.color;
вызов pen.getColor
Свойство – это способ доступа к внутреннему
состоянию объекта, имитирующий обращение к его
внутренней переменной.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
40. Свойства в C#
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс40
Свойства в C#
class TPen
закрытое поле
{
private string FColor;
открытое
public string color
свойство
{
метод чтения
get { return FColor; }
set { FColor = value; }
}
метод записи
}
Использование:
TPen pen;
pen.color = "FFFF00";
string s = pen.color;
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
41. Свойства в C#
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс41
Свойства в C#
Защита от неверного ввода данных:
public string color
{
get { return FColor; }
set
{
if ( value.Length != 6 )
FColor = "000000";
else FColor = value;
}
переданное
}
значение
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
42. Свойства в C#
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс42
Свойства в C#
Изменение внутреннего устройства:
class TPen
{
private int FColor;
public string color
шестнадцатеричный
{
формат, 6 знаков
в строку
get {
return FColor.ToString ( "X6" );
}
переданное
в целое
значение
set {
FColor = Convert.ToInt32(value, 16);
}
из шестнадцатеричной
}
записи
}
Данные – целое число, свойство – строка!
!
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
43. Свойство «только для чтения»
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс43
Свойство «только для чтения»
Скорость машины можно только читать:
class TCar {
нет метода записи
private:
double Fv;
public:
double getV() { return Fv; }
};
Свойство на C#:
class TCar {
private double Fv;
public double V {
get { return Fv; }
}
};
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
44. Скрытие внутреннего устройства
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс44
Скрытие внутреннего устройства
Инкапсуляция («помещение в капсулу»)
К.Ю. Поляков, Е.А. Ерёмин, 2014
свойства
внутреннее
устройство
(private)
методы
интерфейс
(public)
http://kpolyakov.spb.ru
45. Задание
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс45
Задание
«A»: Построить класс РядЛампочек (TLampRow), который
хранит состояние ряда из 8 лампочек в виде символьной
строки. Цифра 0 обозначает выключенную лампочку,
цифра 1 – включенную.
Методы getState и setState скрывают внутреннюю
переменную state, которая хранит состояние лампочек.
При записи нового значения проверяется, что длина
строки состояния равна 8, иначе записываются все нули.
Метод show выводит на экран состояние лампочек,
обозначая выключенную лампочку как минус, а
включённую – как «*».
Пример:
TLampRow lamps;
lamps.show();
-------lamps.setState( "10101010" );
cout << lamps.getState() << endl; 10101010
lamps.show();
*-*-*-* К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
46. Задание
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс46
Задание
«B»: Дополните класс TLampRow из задания A так, чтобы
количество лампочек в цепочке можно было задавать в
конструкторе.
Пример:
TLampRow lamps( 6 );
lamps.show();
-----lamps.setState( "101010" );
cout << lamps.getState() << endl; 101010
lamps.show();
*-*-*lamps.setState( "10101010" );
ошибка
cout << lamps.getState() << endl; 000000
lamps.show();
------
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
47. Задание
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс47
Задание
«С»: Дополните класс TLampRow из задания B так, чтобы
лампочки могли гореть одним из двух цветов – красный
цвет имеет код 1 и обозначается при выводе как «*», а
зелёный цвет имеет код 2 и обозначается как «о».
Пример:
TLampRow lamps( 6 );
lamps.show();
-----lamps.setState( "102102" );
cout << lamps.getState() << endl; 102102
lamps.show();
*-o*-o
lamps.setState( "10201010" );
ошибка
cout << lamps.getState() << endl; 000000
lamps.show();
------
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
48. Задание
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс48
Задание
«D»: Дополните класс TLampRow из задания C так, чтобы код
состояния хранился как целое число. При этом
интерфейс (способ чтения и записи свойства state) не
должен измениться.
Пример:
TLampRow lamps( 6 );
lamps.show();
-----lamps.setState( "102102" );
cout << lamps.getState() << endl; 102102
lamps.show();
*-o*-o*
lamps.setState( "10201010" );
ошибка
cout << lamps.getState() << endl; 000000
lamps.show();
------
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
49. Объектно-ориентированное программирование. Языки C++ и C#
49Объектноориентированное
программирование.
Языки C++ и C#
§ 50. Иерархия классов
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
50. Классификации
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс50
Классификации
?
Что такое классификация?
Классификация – разделение изучаемых объектов на
группы (классы), объединенные общими признаками.
?
Зачем это нужно?
Фрукт
Яблоко
Груша
базовый класс
Банан
Апельсин
классынаследники
это фрукт,
у которого…
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
51. Что такое наследование?
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс51
Что такое наследование?
класс Двудольные
семейство Бобовые
род Клевер
горный клевер
наследует свойства
(имеет все свойства)
Класс Б является наследником класса А, если можно
сказать, что Б – это разновидность А.
яблоко – фрукт
яблоко – это фрукт
горный клевер – клевер
горный клевер – это
растение рода Клевер
машина – двигатель
машина содержит
двигатель (часть – целое)
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
52. Иерархия логических элементов
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс52
Иерархия логических элементов
Логический элемент
с одним входом
НЕ
с двумя входами
И
ИЛИ
Объектно-ориентированное программирование –
это такой подход к программированию, при котором
программа представляет собой множество
взаимодействующих объектов, каждый из которых
является экземпляром определенного класса, а
классы образуют иерархию наследования.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
53. Базовый класс
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс53
Базовый класс
ЛогЭлемент
In1 (вход 1)
In2 (вход 2)
Res (результат)
calc
?
class TLogElement
{
public:
bool In1, In2, Res;
void calc();
};
вычислить
выход
Зачем хранить результат?
можно моделировать элементы
с памятью (триггеры)
?
К.Ю. Поляков, Е.А. Ерёмин, 2014
Что плохо?
http://kpolyakov.spb.ru
54. Базовый класс
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс54
Базовый класс
class TLogElement
{
private:
bool FIn1, Fin2, FRes;
void calc();
Почему здесь?
public:
bool getIn1() { return FIn1; }
void setIn1 ( bool newIn1 );
bool getIn2() { return Fin2; }
void setIn2 ( bool newIn2 );
bool getRes() { return FRes; }
};
только для
чтения
?
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
55. Установка входа
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс55
Установка входа
void TLogElement::setIn1(bool newIn1)
{
FIn1 = newIn1;
Что ещё?
calc();
}
пересчёт при изменении
входа
?
?
Как написать процедуру calc?
void TLogElement::calc()
{
}
!
заглушка
Проблема: наследники должны менять calc!
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
56. Что такое полиморфизм?
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс56
Что такое полиморфизм?
греч.: πολυ — много, μορφη — форма
Полиморфизм – это возможность классов-наследников
по-разному реализовать метод, описанный для
класса-предка.
!
Проблема: открыть данные и методы для
наследников и закрыть для остальных!
class TLogElement
{
...
protected:
void calc();
};
К.Ю. Поляков, Е.А. Ерёмин, 2014
защищённые элементы:
доступны только
наследникам
http://kpolyakov.spb.ru
57. Базовый класс
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс57
Базовый класс
class TLogElement
{
private:
bool FIn1, Fin2;
наследники будут
protected:
изменять поле
bool FRes;
virtual void calc()=
= 0;
bool getIn2() { return Fin2; }
void setIn2 ( bool newIn2 );
public:
bool getIn1() { return FIn1; }
void setIn1 ( bool newIn1 );
bool getRes() { return FRes; }
};
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
58. Базовый класс
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс58
Базовый класс
class TLogElement
{
наследники будут
изменять поле
protected:
bool FRes;
virtual void calc()=
= 0;
bool getIn2() { return Fin2; }
void setIn2 ( bool newIn2 );
...
};
для элементов с одним
входом не нужно!
virtual (виртуальный) – этот метод могут переопределять
классы-наследники
= 0 (абстрактный метод) – этот метод базовый класс не будет
реализовывать (оставляет наследникам)
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
59. Абстрактный класс
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс59
Абстрактный класс
• все логические элементы должны иметь метод calc
• метод calc невозможно написать, пока неизвестен тип
логического элемента
Абстрактный метод – это метод класса, который
объявляется, но не реализуется в классе.
Абстрактный класс – это класс, содержащий хотя бы
один абстрактный метод.
нет логического элемента «вообще», как не «фрукта
вообще», есть конкретные виды
!
Нельзя создать объект абстрактного класса!
TLogElement – абстрактный класс из-за метода calc
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
60. Элемент «НЕ»
Объектно-ориентированное программирование. Языки C++ и C#. 11 классЭлемент «НЕ»
60
наследник от
TLogElement
class TNot: public TLogElement
{
переопределяет метод
protected:
базового класса
void calc();
};
void TNot::calc()
{
FRes =!getIn1();
}
!
?
Почему не ! FIn1?
Это уже не абстрактный класс!
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
61. Элемент «НЕ»
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс61
Элемент «НЕ»
Использование:
создание объекта
TNot n;
n.setIn1 ( false );
cout << n.getRes();
К.Ю. Поляков, Е.А. Ерёмин, 2014
установка входа
вывод результата
http://kpolyakov.spb.ru
62. Элементы с двумя входами
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс62
Элементы с двумя входами
сохранить права
доступа
наследник от
TLogElement
class TLog2In: public TLogElement
{
повысить «видимость»
public:
(protected public)
TLogElement::setIn2;
TLogElement::getIn2;
};
?
Можно ли создать объект этого класса?
нельзя, он абстрактный
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
63. Элементы с двумя входами
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс63
Элементы с двумя входами
class TAnd: public TLog2In
{
protected:
void calc();
};
class TOr: public TLog2In
{
protected:
void calc();
};
К.Ю. Поляков, Е.А. Ерёмин, 2014
элемент «И»
элемент «ИЛИ»
http://kpolyakov.spb.ru
64. Элементы с двумя входами
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс64
Элементы с двумя входами
void TAnd::calc()
элемент «И»
{
FRes = getIn1() && getIn2();
}
элемент «ИЛИ»
void TAnd::calc()
{
FRes = getIn1() || getIn2();
}
доступ к защищённому
полю (protected)
?
Почему не обратиться к FIn1 и FIn2?
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
65. Вызов виртуального метода
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс65
Вызов виртуального метода
В базовом классе:
void TLogElement::setIn1( bool newIn1 )
{
FIn1 = newIn1;
calc();
}
?
Какой метод вызывается?
class TLogElement
{
protected:
virtual void calc()= 0;
...
};
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
66. Виртуальный метод
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс66
Виртуальный метод
Статическое связывание:
транслятор записывает в код адрес процедуры
Динамическое связывание:
адрес процедуры определяется во время выполнения
программы в зависимости от типа объекта
Виртуальный метод – это метод базового класса,
который могут переопределить классы-наследники так,
что конкретный адрес вызываемого метода
определяется только при выполнении программы.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
67. Пример: элемент «И-НЕ»
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс67
Пример: элемент «И-НЕ»
main()
{
A
&
TNot elNot;
B
TAnd elAnd;
int A, B;
cout << " A B !(A&B)" << endl;
cout << "-------------" << endl;
for ( A = 0; A <= 1; A++ ) {
elAnd.setIn1 ( A );
for ( B = 0; B <= 1; B++ ) {
elAnd.setIn2 ( B );
elNot.setIn1 ( elAnd.getRes() );
cout << " " << A << " " << B
<< "
" << elNot.getRes() << endl;
}
}
}
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
68. Модульность
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс68
Модульность
Идея: выделить классы в отдельный модуль.
Интерфейс (log_elem.h):
class
{ … }
class
{ … }
class
{ … }
class
{ … }
class
{ … }
TLogElement
TLog2In: public TLogElement
TNot: public TLogElement
TAnd: public TLog2In
TOr: public TLog2In
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
69. Модульность
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс69
Модульность
Модуль (log_elem.cpp):
#include <log_elem.h>
void TLogElement::setIn1 ( bool newIn1 )
{ ... }
void TLogElement::setIn2 ( bool newIn1 )
{ ... }
void TNot::calc()
реализация методов
{ ... }
классов
void TAnd::calc()
{ ... }
void TOr::calc()
Чего не хватает?
{ ... }
?
В основную программу:
#include <log_elem.h>
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
70. Сообщения между объектами
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс70
Сообщения между объектами
!
Задача – автоматическая передача
сигналов по цепочке!
class TLogElement
{
private:
TLogElement *FNextEl;
int FNextIn;
адрес следующего
...
элемента в цепочке
public:
void Link ( TLogElement *nextElement,
int nextIn = 1 );
};
номер входа
следующего элемента
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
71. Сообщения между объектами
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс71
Сообщения между объектами
Установка связи:
void TLogElement::Link(
TLogElement *nextElement,
int nextIn )
{
FNextEl = nextElement;
FNextIn = nextIn;
}
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
72. Сообщения между объектами
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс72
Сообщения между объектами
После изменения выхода «дергаем» следующий
элемент:
void TLogElement::setIn1 ( bool newIn1 )
{
если следующий
FIn1 = newIn1;
элемент установлен…
calc();
if ( FNextEl )
switch ( FNextIn ) {
case 1:
FNextEl->setIn1 ( getRes() );
case 2:
FNextEl->setIn2 ( getRes() );
}
передать результат на
}
нужный вход
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
73. Сообщения между объектами
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс73
Сообщения между объектами
?
Как сделать, чтобы сначала FNextEl = NULL?
Новый конструктор:
TLogElement::TLogElement()
{
FNextEl = NULL;
}
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
74. Сообщения между объектами
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс74
Сообщения между объектами
Изменения в основной программе:
TNot elNot;
установить
TAnd elAnd;
связь
elAnd.Link ( &elNot );
...
for ( A = 0; A <= 1; A ++ ) {
elAnd.setIn1 ( A );
for ( B = 0; B <= 1; B++ ) {
elAnd.setIn2( B );
elNot.setIn1(elAnd.getRes());
...
это уже не
}
нужно!
}
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
75. Задание
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс75
Задание
«A»: Постройте класс TPet (домашнее животное) с двумя
скрытыми полями: FName (имя) и FAge (возраст). Они
должны быть доступны для чтения через свойства name
и age и недоступны для записи. Метод gettingOlder
увеличивает возраст на 1 год. Класс TPet – абстрактный,
он имеет абстрактный метод say.
Постройте два класса-наследника – TCat (кошка) и TDog
(собака).Они должны реализовать метод say.
Описания классов должны быть в отдельном модуле
animals.cpp.
Пример: см. следующий слайд.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
76. Задание
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс76
Задание
«A»:
Шарик: 6 лет
Пример:
Мурка: Мяу!
TPet *p, *pets[2];
p = new TDog("Шарик", 5); Шарик: Гав!
p->gettingOlder();
cout << p->getName() << ": "
<< p->getAge() << " лет" << endl;
pets[0] = new TCat("Мурка", 3);
pets[1] = p;
for( auto p: pets )
p->say();
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
77. Задание
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс77
Задание
«B»: Добавьте класс TMammal (млекопитающее) –
наследник класса TPet и предок для классов TCat и
TDog. Он должен иметь метод run (бежать), который
выводит сообщение вида «Вася побежал».
Пример:
TPet *pets[2];
pets[0] = new TCat("Мурзик", 3);
pets[1] = new TDog("Шарик", 5);;
for( int i = 0; i < 2; i++ ) {
pets[i]->say();
auto pMammal = dynamic_cast
<TMammal*> (pets[i]); Мурзик: Мяу!
if( pMammal )
Мурзик
побежал...
pMammal->run();
Шарик: Гав!
}
Шарик побежал...
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
78. Задание
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс78
Задание
«C»: Добавьте класс TReptilia (рептилии) – наследник класса TPet и
предок для новых классов TTurtle (черепаха) и TSnake (змея).
Он должен иметь метод crawl (ползти), который выводит
сообщение вида «Вася пополз…».
Мурзик: Мяу!
Пример:
Мурзик побежал...
TPet *pets[4];
Зак: ...
pets[0] = new TCat("Мурзик", 3);
Зак пополз...
pets[1] = new TTurtle("Зак", 32);
Шарик: Гав!
pets[2] = new TDog("Шарик", 5);
Шарик побежал...
pets[3] = new TSnake("Чаки", 2);
Чаки: ш-ш-ш-ш...
for( int i = 0; i < 4; i++ ) {
Чаки пополз...
pets[i]->say();
auto pMammal = dynamic_cast <TMammal*> (pets[i]);
if( pMammal )
pMammal->run();
auto pRept = dynamic_cast <TReptilia*> (pets[i]);
if( pRept )
pRept->crawl();
}
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
79. Задание
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс79
Задание
«A»: Собрать полную программу и построить таблицу
истинности последовательного соединения элементов
«ИЛИ» и «НЕ».
Пример:
A | B | not(A+B)
------------------0 | 0 | 1
0 | 1 | 0
1 | 0 | 0
1 | 1 | 0
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
80. Задание
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс80
Задание
«B»: Добавить в иерархию классов элементы «И-НЕ» (TNAnd)
и «ИЛИ-НЕ» (TNOr), которые представляют собой
последовательные соединения элементов «И» и «ИЛИ» с
элементом «НЕ». Построить их таблицы истинности.
Пример:
A | B | A nand B
------------------0 | 0 | 1
0 | 1 | 1
1 | 0 | 1
1 | 1 | 0
A | B | A nor B
------------------0 | 0 | 1
0 | 1 | 0
1 | 0 | 0
1 | 1 | 0
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
81. Задание
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс81
Задание
«C»: Добавить в иерархию классов элемент «исключающее
ИЛИ» (TXor) и «импликация» (TImp). Построить их
таблицы истинности.
Пример:
A | B | A xor B
------------------0 | 0 | 0
0 | 1 | 1
1 | 0 | 1
1 | 1 | 0
A | B | A -> B
------------------0 | 0 | 1
0 | 1 | 1
1 | 0 | 0
1 | 1 | 1
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
82. Задание
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс82
Задание
«D»: Добавить в иерархию классов элемент «триггер»
(TTrigger). Построить его таблицу истинности при
начальных значениях выхода Q, равных 0 и 1.
Пример:
При Q = 0:
A | B | Q
------------------0 | 0 | 0
0 | 1 | 0
1 | 0 | 1
1 | 1 | 1
При Q = 1:
A | B | Q
------------------0 | 0 | 1
0 | 1 | 0
1 | 0 | 1
1 | 1 | 1
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
83. Объектно-ориентированное программирование. Языки C++ и C#
83Объектноориентированное
программирование.
Языки C++ и C#
§ 51. Программы с графическим
интерфейсом
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
84. Интерфейс: объекты и сообщения
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс84
Интерфейс: объекты и сообщения
поле ввода
флажок
кнопка
переключатель
Все элементы окон – объекты, которые обмениваются
данными, посылая друг другу сообщения.
Сообщение – это блок данных определённой
структуры, который используется для обмена
информацией между объектами.
• адресат (кому) или широковещательное
• числовой код (тип) сообщения
• параметры (дополнительные данные)
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
85. Классические программы
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс85
Классические программы
начало
основная программа
ввод данных
обработка данных
вывод результатов
конец
!
процедуры и функции
Порядок выполнения команд определяется
программистом, пользователь не может вмешаться!
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
86. Программы, управляемые событиями
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс86
Программы, управляемые событиями
Событие – это переход какого-либо объекта из одного
состояния в другое.
• нажатие на клавишу
• щелчок мышью
• перемещение окна
• поступление данных из сети
• запрос к веб-серверу
• завершение вычислений
•…
!
Программа начинает работать при
наступлении событий!
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
87. Программы, управляемые событиями
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс87
Программы, управляемые событиями
клавиатура, мышь, …
системная очередь сообщений
начало
ожидание сообщения
стоп?
конец
очередь
программы
основная
программа
обработка сообщения
программа
!
операционная
система
обработчики
сообщений
Программа управляется событиями!
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
88. Что такое RAD-среда?
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс88
Что такое RAD-среда?
RAD = Rapid Application Development — быстрая
разработка приложений
Форма – это шаблон, по
Этапы разработки:
которому строится окно
• создание формы
программы или диалога
• минимальный код
добавляется автоматически
• расстановка элементов интерфейса с
помощью мыши и настройка их свойств
• создание обработчиков событий
• написание алгоритмов обработки данных
выполняются при
возникновении событий
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
89. RAD-среды: Delphi
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс89
RAD-среды: Delphi
Язык: Object Pascal, позднее Delphi:
1995: Borland, сейчас: Embarcadero Technologies
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
90. RAD-среды: MS Visual Studio
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс90
RAD-среды: MS Visual Studio
Языки: Visual Basic, Visual C++, Visual C#, Visual F#
c 1995 по н.в.: Microsoft
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
91. RAD-среды: Lazarus
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс91
RAD-среды: Lazarus
Языки: FreePascal, Delphi
свободное ПО:
lazarus.freepascal.org
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
92. Объектно-ориентированное программирование. Языки C++ и C#
92Объектноориентированное
программирование.
Языки C++ и C#
§ 52. Программирование в
RAD-средах
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
93. Visual Studio Express (C#)
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс93
Visual Studio Express (C#)
http://www.visualstudio.com/ru-ru/products/visual-studio-express-vs.aspx
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
94. Язык C#
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс94
Язык C#
С С++ C#
Паскаль
Java
Smalltalk
Common Intermediate
Language
C#
VB.NET
F#
язык CIL
(байт-код)
Common
Language
Runtime
виртуальная
машина CLR
объединение программ на разных языках
полностью ООП – для больших программ
большая библиотека функций и компонентов
требовательна к ресурсам
Linux – проект
Mono
надёжно – только под Windows
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
95. Проекты и решения
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс95
Проекты и решения
Проект – это набор файлов, из которых компилятор
строит исполняемый файл программы.
• проект (.csproj, CSharp Project) – описание (XML)
• модули, из которых состоит программа (*.сs);
• ресурсы (*.resx) – строки (перевод сообщений).
основная
программа
обработчики
событий
ресурсы
Program.cs
Form1.cs
Form1.Designer.cs
Form1.resx
my.exe
описание
формы
Решение = один или несколько проектов.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
96. Простейший проект
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс96
Простейший проект
Файл – Создать проект – Приложение Windows Forms
Редактор
кода
Конструктор
формы
!
F5 – запуск!
Структура
проекта
Панель
элементов
Свойства
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
97. Модуль формы
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс97
Модуль формы
F7 – перейти из конструктора к коду формы
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
библиотеки
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Project1
пространство имён
{
public partial class Form1: Form {
public Form1(){ InitializeComponent(); }
}
конструктор
}
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
98. Модуль формы
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс98
Модуль формы
открытый
класс
частичное
описание
наследник
класса Form
public partial class Form1: Form
{
public Form1()
{
InitializeComponent();
}
}
Код этого метода – в
начальные
установки
Form1.Designer.cs!
!
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
99. Основная программа
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс99
Основная программа
библиотеки
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace Project1
статический класс
{
static class Program {
static void Main() {
создание формы
...
Application.Run ( new Form1() );
}
запуск цикла
}
обработки сообщений
}
!
Статический класс – набор методов!
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
100. Свойства формы
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс100
Свойства формы
MainForm
Name – имя формы
Size.Width – ширина
Size.Height – высота
Text – текст в заголовке окна
BackColor – цвет фона
Font – шрифт надписей
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
101. Обработчик событий
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс101
Обработчик событий
События
2 ЛКМ: создать
обработчик
FormClosing:
форма закрывается
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
102. Обработчик события
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс102
Обработчик события
закрытый
метод класса
MainForm
название
обработчика
private void MainForm_FormClosing (
object sender,
общий предок
FormClosingEventArgs e )
всех объектов
{
кто послал
дополнительные
}
сообщение
данные о событии
!
Автоматически добавлен в Form1.Designer.cs!
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
103. Диалог с вопросом
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс103
Диалог с вопросом
Метод MessageBox.Show:
private void MainForm_FormClosing (
object sender, FormClosingEventArgs e)
{
тип: результат диалога
DialogResult res;
res = MessageBox.Show (
"Вы действительно хотите выйти из программы?",
"Подтверждение",
MessageBoxButtons.YesNo, MessageBoxIcon.Question
);
if ( res == DialogResult.No )
нажали «Нет»,
e.Cancel = true;
отменить закрытие
}
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
104. Параметры MessageBox.Show
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс104
Параметры MessageBox.Show
• сообщение пользователю
• заголовок окна
• тип запроса MessageBoxIcon
Error
ошибка
Warning
предупреждение
Information информация
Questionвопрос
• набор (множество) кнопок MessageBoxButtons:
YesNo
«Да», «Нет»
YesNoCancel «Да», «Нет», «Отмена»
OK
«OK»
OKCancel
«ОК», «Отмена»
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
105. Объектно-ориентированное программирование. Языки C++ и C#
105Объектноориентированное
программирование.
Языки C++ и C#
§ 53. Использование
компонентов
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
106. Панель компонентов
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс106
Панель компонентов
Контейнеры
Стандартные
Диалоги
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
107. Просмотр рисунков
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс107
Просмотр рисунков
панель
Panel
кнопка
Button
выключатель
CheckBox
рисунок
PictureBox
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
108. Настройка формы
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс108
Настройка формы
Файл – Создать проект – Приложение Windows Forms
Name MainForm
Text Просмотр
рисунков
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
109. Верхняя панель
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс109
Верхняя панель
панель Panel
Dock = Top
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
110. Кнопка и выключатель
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс110
Кнопка и выключатель
кнопка
Button
выключатель
CheckBox
Name = OpenBtn
Text = Открыть файл
К.Ю. Поляков, Е.А. Ерёмин, 2014
Name = SizeCB
Text = По размерам окна
http://kpolyakov.spb.ru
111. Компонент PictureBox
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс111
Компонент PictureBox
рисунок
PictureBox
Name = Image
Dock = Fill
К.Ю. Поляков, Е.А. Ерёмин, 2014
?
1) Загрузка файла?
2) Масштабирование?
http://kpolyakov.spb.ru
112. Выбор файла
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс112
Выбор файла
выбор рисунка
OpenFileDialog
Name = OpenDlg
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
113. Выбор файла
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс113
Выбор файла
2 ЛКМ
если файл выбран
if ( OpenDlg.ShowDialog() == DialogResult.OK )
Img.Image = new Bitmap (OpenDlg.FileName);
имя файла
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
114. Масштабирование
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс114
Масштабирование
2 ЛКМ
if ( SizeCB.Checked )
Img.SizeMode = PictureBoxSizeMode.Zoom;
else Img.SizeMode = PictureBoxSizeMode.Normal;
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
115. Ввод и вывод данных
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс115
Ввод и вывод данных
для веб-страниц
поле ввода rEdit
TextBox
метка rgbLabel
Label
метки
Label
панель rgbPanel
Panel
поле ввода bEdit
TextBox
К.Ю. Поляков, Е.А. Ерёмин, 2014
поле ввода gEdit
TextBox
http://kpolyakov.spb.ru
116. Обновление компонентов вывода
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс116
Обновление компонентов вывода
выделить все три
(+Shift)
2 ЛКМ
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
117. Обновление компонентов вывода
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс117
Обновление компонентов вывода
private void rEdit_TextChanged (
object sender, EventArgs e )
{
из строки в число
int r, g, b;
r = Int32.Parse ( rEdit.Text );
g = Int32.Parse ( gEdit.Text ); построить
цвет
b = Int32.Parse ( bEdit.Text );
rgbPanel.BackColor =
Color.FromArgb ( r, g, b );
rgbLabel.Text = "#" + r.ToString("X2")
+ g.ToString("X2") + b.ToString("X2");
}
в шестнадцатеричную
систему, 2 знака
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
118. Вызов при запуске
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс118
Вызов при запуске
private void MainForm_Load (
object sender, EventArgs e )
{
rEdit_TextChanged ( rEdit, e );
}
вызывающий
объект – rEdit
(здесь – всё равно!)
private void MainForm_Load (
object sender, EventArgs e )
{
rEdit_TextChanged ( null, null );
}
пустой объект
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
119. Обработка ошибок
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс119
Обработка ошибок
?
Если вместо числа ввести букву?
!
Программа не должна «вылетать»!
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
120. Обработка ошибок
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс120
Обработка ошибок
попытаться выполнить
try
{
// «опасные» команды
}
если исключение
catch
(аварийная ситуация)
{
// обработка ошибки
}
?
Какие у нас опасные операции?
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
121. Обработка ошибок
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс121
Обработка ошибок
try {
r = Int32.Parse ( rEdit.Text );
g = Int32.Parse ( gEdit.Text );
b = Int32.Parse ( bEdit.Text );
rgbPanel.BackColor =
Color.FromArgb ( r, g, b );
rgbLabel.Text = "#" + r.ToString("X2")
+ g.ToString("X2") + b.ToString("X2");
}
если ошибка, записать "?"
catch {
rgbLabel.Text = "?";
}
?
Что делать, если ошибка?
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
122. Блокирование неверных символов
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс122
Блокирование неверных символов
выделить все три
(+Shift)
private void rEdit_KeyPress (
object sender, KeyPressEventArgs e )
это цифра
{
if ( ! ( Char.IsDigit(e.KeyChar) ||
e.KeyChar == (char) 8) )
e.Handled = true;
Backspace
}
обработка завершена
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
123. Задание
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс123
Задание
«A»: Постройте программу, которая вычисляет площадь
комнаты.
Требования:
1) размер окна нельзя менять
2) при попытке закрыть окно выдаётся запрос на
подтверждение
3) площадь пересчитывается сразу же, как только
изменяются значения длины или ширины комнаты
4) если длина или ширина отрицательны или не числа,
вместо площади выводится знак вопроса
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
124. Задание
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс124
Задание
«B»: Постройте программу, которая вычисляет площадь стен
комнаты и определяет, сколько рулонов обоев нужно на
оклейку всех стен. Количество рулонов – целое число.
Остальные требования такие же, как в варианта «А».
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
125. Задание
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс125
Задание
«С»: Доработайте программу так, чтобы по щелчку по кнопке
«Сохранить» все данные сохранялись в файле с
расширением .dat (имя файла можно выбрать), а по
щелчку по кнопке «Загрузить» данные загружались из
файла (имя файла также выбирается).
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
126. Объектно-ориентированное программирование. Языки C++ и C#
126Объектноориентированное
программирование.
Языки C++ и C#
§ 54. Совершенствование
компонентов
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
127. Новый класс (модуль)
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс127
Новый класс (модуль)
Задача: построить поле для ввода целых чисел, в котором
• есть защита от ввода неверных символов
• есть методы для чтения/записи целого числа
!
На основе класса TextBox!
Проект – Добавить класс
using System.Windows.Forms;
там объявлен
TextBox
class IntTextBox: TextBox
{
}
F5 – запуск! И компонент в палитре!
!
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
128. Обработчик KeyPress
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс128
Обработчик KeyPress
class IntTextBox: TextBox
{
перекрыть метод
только для
базового класса
наследников
protected override void OnKeyPress (
KeyPressEventArgs e )
{
if ( !(Char.IsDigit(e.KeyChar) ||
e.KeyChar == (char)8) )
e.Handled = true;
base.OnKeyPress(e);
}
вызвать метод
}
базового класса
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
129. Свойство Value
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс129
Свойство Value
class IntTextBox: TextBox
{ общедоступное
свойство
...
public int Value
число в строку
{
set { Text = value.ToString(); }
get {
try { return Int32.Parse(Text); }
catch { return 0; }
из строки в
}
число
}
}
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
130. Поле для ввода целых чисел
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс130
Поле для ввода целых чисел
Использование:
поле ввода decEdit
IntTextBox
метка hexLabel
Label
private void decEdit_TextChanged (
object sender, EventArgs e )
{
свойство
hexLabel.Text =
decEdit.Value.ToString ( "X" );
}
в шестнадцатеричную
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
131. Объектно-ориентированное программирование. Языки C++ и C#
131Объектноориентированное
программирование.
Языки C++ и C#
§ 55. Модель и представление
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
132. Еще одна декомпозиция
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс132
Еще одна декомпозиция
Задача: повторное использование написанного ранее
готового кода.
решение
модель
представление
(данные и методы
их обработки)
(интерфейс с
пользователем)
решение
представление
(интерфейс с
пользователем)
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
133. Модель и представление
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс133
Модель и представление
Задача: хранить и использовать данные об изменении
курса доллара.
решение
модель
(массив, поиск
минимума и
максимума,
прогнозирование)
представление
(формулы, диаграммы,
графики, таблицы)
представление
x
1
2
3
y
1
2
3
z
4
5
6
модель
представление
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
134. Модель и представление
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс134
Модель и представление
Задача: вычисление арифметического выражения:
• целые числа
• знаки арифметических действий + - * /
Модель:
функция LastOp
• символьная строка
(глава 6)
• алгоритм вычисления:
k = номер последней операции
n1 = значение левой части
n2 = значение правой части
результат = операция(n1, n2)
!
Рекурсия!
k
22 + 13 – 3 * 8
n1
n2
К.Ю. Поляков, Е.А. Ерёмин, 2014
?
Чего не хватает?
http://kpolyakov.spb.ru
135. Модель
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс135
Модель
Псевдокод:
k = номер последней операции
if ( k < 0 )
результат:= строка в число
else {
n1 = значение левой части
n2 = значение правой части
результат = операция(n1, n2)
}
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
136. Статический класс – набор функций
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс136
Статический класс – набор функций
Проект – Добавить класс
static class Calculator
приоритет
операции
{
static int Priority ( char op ) {
...
последняя
операция
}
static int LastOp ( string s ) {
...
вычислить
}
public static int Calc ( string s ) {
...
}
Calc – открытый метод!
}
!
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
137. Модель: приоритет операций
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс137
Модель: приоритет операций
int Priority ( char op )
{
switch ( op )
{
case '+':
case '-': return 1;
case '*':
case '/': return 2;
}
return 100;
}
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
138. Модель: номер последней операции
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс138
Модель: номер последней операции
int LastOp ( string s )
вернёт номер
{
символа
int i, minPrt, res;
minPrt = 50; // любое между 2 и 100
res = -1;
for ( i = 0; i < s.Length; i++ )
if ( Priority(s[i]) <= minPrt )
{
minPrt = Priority(s[i]);
res = i;
Почему <=?
}
return res;
}
?
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
139. Модель: вычисления
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс139
Модель: вычисления
public static int Calc(string s)
{
int k, n1, n2, res = 0;
k = LastOp ( s );
if ( k < 0 ) return Int32.Parse(s);
n1 = Calc( s.Substring(0, k) ); // левая
n2 = Calc( s.Substring(k+1) ); // правая
switch ( s[k] ) {
case '+': res = n1 + n2; break;
case '-': res = n1 - n2; break;
case '*': res = n1 * n2; break;
case '/': res = n1 / n2; break;
}
return res;
}
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
140. Представление
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс140
Представление
выпадающий
список
ComboBox
Name = Input
Dock = Top
многострочное
поле TextBox
Name = Answers
Dock = Fill
ReadOnly = True
Multiline = True
if ( нажата клавиша Enter )
{
x = значение выражения
добавить результат в конец поля вывода
if ( выражения нет в списке )
добавить его в список
}
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
141. Перехват нажатия на клавишу Enter
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс141
Перехват нажатия на клавишу Enter
KeyPress для элемента Input:
private void Input_KeyPress (
object sender, KeyPressEventArgs e )
{
if ( e.KeyChar == (char)13 )
{
...
код клавиши
}
Enter
}
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
142. Обработка и вывод данных
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс142
Обработка и вывод данных
Вычисления (обращение к модели):
int x;
x = Calculator.Calc(
Input.Text);
Добавление строки в TextBox:
добавить строку
Answers.Text += Input.Text + "=" +
x.ToString() + "\r\n";
число в строку
К.Ю. Поляков, Е.А. Ерёмин, 2014
новая строка
http://kpolyakov.spb.ru
143. Обработка и вывод данных
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс143
Обработка и вывод данных
Добавление строки в ComboBox:
найти индекс
строки
int i = Input.FindString(Input.Text);
if ( i < 0 )
Input.Items .Insert ( 0, Input.Text );
массив строк в
ComboBox
К.Ю. Поляков, Е.А. Ерёмин, 2014
вставить
строку
позиция
списка
что
вставлять
http://kpolyakov.spb.ru
144. Перехват нажатия на клавишу Enter
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс144
Перехват нажатия на клавишу Enter
KeyPress для элемента Input:
private void Input_KeyPress (
object sender, KeyPressEventArgs e )
{
if ( e.KeyChar == (char)13 )
{
int x = Calculator.Calc ( Input.Text );
Answers.Text += Input.Text + "="
+ x.ToString() + "\r\n";
int i = Input.FindString(Input.Text);
if ( i < 0 )
Input.Items.Insert(0, Input.Text);
}
}
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
145. Задание
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс145
Задание
«A»: Измените программу так, чтобы она могла вычислять
значения выражений с вещественными числами.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
146. Задание
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс146
Задание
«B»: Измените программу так, чтобы она могла вычислять
значения выражений со скобками.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
147. Задание
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс147
Задание
«С»: Измените программу так, чтобы она могла вычислять
значения выражений, содержащих вызовы функций abs,
sin, cos, sqrt.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
148. Задание
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс148
Задание
«D»: Измените программу так, чтобы при вводе неверного
выражения выводилось сообщение об ошибке.
Все результаты вычислений и сообщения об ошибках
записываются в файл results.txt:
...
sin(1.2)*sqrt(1.7)=1.215230290196084
Неверное выражение sin(1.2)*sqrt(1.7)qwe
Оформите процедуру записи в файл как метод log класса
формы.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
149. Калькулятор
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс149
Калькулятор
!
К.Ю. Поляков, Е.А. Ерёмин, 2014
Самостоятельно!
http://kpolyakov.spb.ru
150. Конец фильма
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс150
Конец фильма
ПОЛЯКОВ Константин Юрьевич
д.т.н., учитель информатики
ГБОУ СОШ № 163, г. Санкт-Петербург
[email protected]
ЕРЕМИН Евгений Александрович
к.ф.-м.н., доцент кафедры мультимедийной
дидактики и ИТО ПГГПУ, г. Пермь
[email protected]
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
151. Источники иллюстраций
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс151
Источники иллюстраций
1.
2.
3.
4.
5.
6.
www.picstopin.com
maugav.info
yoursourceisopen.com
ru.wikipedia.org
иллюстрации художников издательства «Бином»
авторские материалы
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru