Объектно-ориентированное программирование. Языки C++ и C#
Объектно-ориентированное программирование. Языки C++ и C#
Зачем нужно что-то новое?
Как мы воспринимаем объекты?
Использование объектов
Объектно-ориентированное программирование. Языки C++ и C#
С чего начать?
Модель дороги с автомобилями
Модель дороги с автомобилями
Модель дороги с автомобилями
Объектно-ориентированное программирование. Языки C++ и C#
Классы
Класс «Дорога»
Класс «Дорога»
Класс «Дорога»
Новый конструктор
Конструктор с параметрами
Защита от неверных данных
Значения параметров по умолчанию
Класс «Машина»
Конструкторы класса «Машина»
Класс «Машина»: метод move
Основная программа
Использование указателей
Что в этом хорошего и плохого?
Объектно-ориентированное программирование. Языки C++ и C#
Зачем скрывать внутреннее устройство?
Пример: класс «перо»
Пример: класс «перо»
Пример: класс «перо»
Изменение внутреннего устройства
Преобразования int  hex
Преобразования hex ↔ int
Преобразования hex  int
Свойства в C#
Свойства в C#
Свойства в C#
Свойства в C#
Свойство «только для чтения»
Скрытие внутреннего устройства
Объектно-ориентированное программирование. Языки C++ и C#
Классификации
Что такое наследование?
Иерархия логических элементов
Базовый класс
Базовый класс
Установка входа
Что такое полиморфизм?
Базовый класс
Базовый класс
Абстрактный класс
Элемент «НЕ»
Элемент «НЕ»
Элементы с двумя входами
Элементы с двумя входами
Элементы с двумя входами
Вызов виртуального метода
Виртуальный метод
Пример: элемент «И-НЕ»
Модульность
Модульность
Сообщения между объектами
Сообщения между объектами
Сообщения между объектами
Сообщения между объектами
Сообщения между объектами
Объектно-ориентированное программирование. Языки C++ и C#
Интерфейс: объекты и сообщения
Классические программы
Программы, управляемые событиями
Программы, управляемые событиями
Что такое RAD-среда?
RAD-среды: Delphi
RAD-среды: MS Visual Studio
RAD-среды: Lazarus
Объектно-ориентированное программирование. Языки C++ и C#
Visual Studio Express (C#)
Язык C#
Проекты и решения
Простейший проект
Модуль формы
Модуль формы
Основная программа
Свойства формы
Обработчик событий
Обработчик события
Диалог с вопросом
Параметры MessageBox.Show
Объектно-ориентированное программирование. Языки C++ и C#
Панель компонентов
Просмотр рисунков
Настройка формы
Верхняя панель
Кнопка и выключатель
Компонент PictureBox
Выбор файла
Выбор файла
Масштабирование
Ввод и вывод данных
Обновление компонентов вывода
Обновление компонентов вывода
Вызов при запуске
Обработка ошибок
Обработка ошибок
Обработка ошибок
Блокирование неверных символов
Объектно-ориентированное программирование. Языки C++ и C#
Новый класс (модуль)
Обработчик KeyPress
Свойство Value
Поле для ввода целых чисел
Объектно-ориентированное программирование. Языки C++ и C#
Еще одна декомпозиция
Модель и представление
Модель и представление
Модель
Статический класс – набор функций
Модель: приоритет операций
Модель: номер последней операции
Модель: вычисления
Представление
Перехват нажатия на клавишу Enter
Обработка и вывод данных
Обработка и вывод данных
Перехват нажатия на клавишу Enter
Калькулятор
Конец фильма
Источники иллюстраций
3.72M
Категория: ПрограммированиеПрограммирование

Объектно-ориентированное программирование. Языки 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#

26
Объектноориентированное
программирование.
Языки C++ и C#
§ 49. Скрытие внутреннего
устройства
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

27. Зачем скрывать внутреннее устройство?

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
27
Зачем скрывать внутреннее устройство?
Объектная модель задачи:
интерфейсы
?
?
защита внутренних данных
проверка входных данных на корректность
изменение устройства с сохранением интерфейса
Инкапсуляция («помещение в капсулу») – скрытие
внутреннего устройства объектов.
!
Также объединение данных и методов в
одном объекте!
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

28. Пример: класс «перо»

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
28
Пример: класс «перо»
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

29. Пример: класс «перо»

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
29
Пример: класс «перо»
Получить значение:
string TPen::getColor ()
{
return FColor;
}
Записать значение:
void TPen::setColor ( string
{
if ( newColor.length()!= 6
FColor = "000000";
else FColor = newColor;
}
!
newColor )
)
если ошибка,
чёрный цвет
Защита от неверных данных!
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

30. Пример: класс «перо»

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
30
Пример: класс «перо»
Использование:
установить
цвет
TPen pen;
pen.setColor ( "FFFF00" );
cout << "цвет пера: " << pen.getColor();
!
Не очень удобно!
pen.color = "FFFF00";
cout << pen.color;
К.Ю. Поляков, Е.А. Ерёмин, 2014
прочитать
цвет
нельзя в
C++
http://kpolyakov.spb.ru

31. Изменение внутреннего устройства

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
31
Изменение внутреннего устройства
Удобнее хранить цвет в виде числа:
class TPen
Найди отличие!
{
private:
изменилось внутреннее
int FColor;
устройство
public:
string getColor();
void setColor( string newColor );
};
?
!
Интерфейс не изменился!
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

32. Преобразования int  hex

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
32
Преобразования int hex
Использование потока (байтов):
"FF00FF"
16711935
записываем в поток число в
шестнадцатеричной системе
#include <sstream>
stringstream s;
s << hex << FColor;
255 "FF"
"0000FF"
К.Ю. Поляков, Е.А. Ерёмин, 2014
читаем
строку
подключить
строковые потоки
?
Что плохо?
правильно так!
http://kpolyakov.spb.ru

33. Преобразования hex ↔ int

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
33
Преобразования 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

34. Преобразования hex  int

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
34
Преобразования 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

35. Свойства в C#

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
35
Свойства в 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

36. Свойства в C#

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
36
Свойства в 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

37. Свойства в C#

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
37
Свойства в C#
Защита от неверного ввода данных:
public string color
{
get { return FColor; }
set
{
if ( value.Length != 6 )
FColor = "000000";
else FColor = value;
}
переданное
}
значение
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

38. Свойства в C#

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
38
Свойства в 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

39. Свойство «только для чтения»

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
39
Свойство «только для чтения»
Скорость машины можно только читать:
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

40. Скрытие внутреннего устройства

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
40
Скрытие внутреннего устройства
Инкапсуляция («помещение в капсулу»)
К.Ю. Поляков, Е.А. Ерёмин, 2014
свойства
внутреннее
устройство
(private)
методы
интерфейс
(public)
http://kpolyakov.spb.ru

41. Объектно-ориентированное программирование. Языки C++ и C#

41
Объектноориентированное
программирование.
Языки C++ и C#
§ 50. Иерархия классов
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

42. Классификации

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
42
Классификации
?
Что такое классификация?
Классификация – разделение изучаемых объектов на
группы (классы), объединенные общими признаками.
?
Зачем это нужно?
Фрукт
Яблоко
Груша
базовый класс
Банан
Апельсин
классынаследники
это фрукт,
у которого…
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

43. Что такое наследование?

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
43
Что такое наследование?
класс Двудольные
семейство Бобовые
род Клевер
горный клевер
наследует свойства
(имеет все свойства)
Класс Б является наследником класса А, если можно
сказать, что Б – это разновидность А.
яблоко – фрукт
яблоко – это фрукт
горный клевер – клевер
горный клевер – это
растение рода Клевер
машина – двигатель
машина содержит
двигатель (часть – целое)
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

44. Иерархия логических элементов

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
44
Иерархия логических элементов
Логический элемент
с одним входом
НЕ
с двумя входами
И
ИЛИ
Объектно-ориентированное программирование –
это такой подход к программированию, при котором
программа представляет собой множество
взаимодействующих объектов, каждый из которых
является экземпляром определенного класса, а
классы образуют иерархию наследования.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

45. Базовый класс

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
45
Базовый класс
ЛогЭлемент
In1 (вход 1)
In2 (вход 2)
Res (результат)
calc
?
class TLogElement
{
public:
bool In1, In2, Res;
void calc();
};
вычислить
выход
Зачем хранить результат?
можно моделировать элементы
с памятью (триггеры)
?
К.Ю. Поляков, Е.А. Ерёмин, 2014
Что плохо?
http://kpolyakov.spb.ru

46. Базовый класс

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
46
Базовый класс
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

47. Установка входа

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
47
Установка входа
void TLogElement::setIn1(bool newIn1)
{
FIn1 = newIn1;
Что ещё?
calc();
}
пересчёт при изменении
входа
?
?
Как написать процедуру calc?
void TLogElement::calc()
{
}
!
заглушка
Проблема: наследники должны менять calc!
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

48. Что такое полиморфизм?

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
48
Что такое полиморфизм?
греч.: πολυ — много, μορφη — форма
Полиморфизм – это возможность классов-наследников
по-разному реализовать метод, описанный для
класса-предка.
!
Проблема: открыть данные и методы для
наследников и закрыть для остальных!
class TLogElement
{
...
protected:
void calc();
};
К.Ю. Поляков, Е.А. Ерёмин, 2014
защищённые элементы:
доступны только
наследникам
http://kpolyakov.spb.ru

49. Базовый класс

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
49
Базовый класс
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

50. Базовый класс

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
50
Базовый класс
class TLogElement
{
наследники будут
изменять поле
protected:
bool FRes;
virtual void calc()=
= 0;
bool getIn2() { return Fin2; }
void setIn2 ( bool newIn2 );
...
};
для элементов с одним
входом не нужно!
virtual (виртуальный) – этот метод могут переопределять
классы-наследники
= 0 (абстрактный метод) – этот метод базовый класс не будет
реализовывать (оставляет наследникам)
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

51. Абстрактный класс

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
51
Абстрактный класс
• все логические элементы должны иметь метод calc
• метод calc невозможно написать, пока неизвестен тип
логического элемента
Абстрактный метод – это метод класса, который
объявляется, но не реализуется в классе.
Абстрактный класс – это класс, содержащий хотя бы
один абстрактный метод.
нет логического элемента «вообще», как не «фрукта
вообще», есть конкретные виды
!
Нельзя создать объект абстрактного класса!
TLogElement – абстрактный класс из-за метода calc
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

52. Элемент «НЕ»

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
Элемент «НЕ»
52
наследник от
TLogElement
class TNot: public TLogElement
{
переопределяет метод
protected:
базового класса
void calc();
};
void TNot::calc()
{
FRes =!getIn1();
}
!
?
Почему не ! FIn1?
Это уже не абстрактный класс!
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

53. Элемент «НЕ»

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
53
Элемент «НЕ»
Использование:
создание объекта
TNot n;
n.setIn1 ( false );
cout << n.getRes();
К.Ю. Поляков, Е.А. Ерёмин, 2014
установка входа
вывод результата
http://kpolyakov.spb.ru

54. Элементы с двумя входами

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
54
Элементы с двумя входами
сохранить права
доступа
наследник от
TLogElement
class TLog2In: public TLogElement
{
повысить «видимость»
public:
(protected public)
TLogElement::setIn2;
TLogElement::getIn2;
};
?
Можно ли создать объект этого класса?
нельзя, он абстрактный
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

55. Элементы с двумя входами

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
55
Элементы с двумя входами
class TAnd: public TLog2In
{
protected:
void calc();
};
class TOr: public TLog2In
{
protected:
void calc();
};
К.Ю. Поляков, Е.А. Ерёмин, 2014
элемент «И»
элемент «ИЛИ»
http://kpolyakov.spb.ru

56. Элементы с двумя входами

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
56
Элементы с двумя входами
void TAnd::calc()
элемент «И»
{
FRes = getIn1() && getIn2();
}
элемент «ИЛИ»
void TOr::calc()
{
FRes = getIn1() || getIn2();
}
доступ к защищённому
полю (protected)
?
Почему не обратиться к FIn1 и FIn2?
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

57. Вызов виртуального метода

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
57
Вызов виртуального метода
В базовом классе:
void TLogElement::setIn1( bool newIn1 )
{
FIn1 = newIn1;
calc();
}
?
Какой метод вызывается?
class TLogElement
{
protected:
virtual void calc()= 0;
...
};
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

58. Виртуальный метод

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
58
Виртуальный метод
Статическое связывание:
транслятор записывает в код адрес процедуры
Динамическое связывание:
адрес процедуры определяется во время выполнения
программы в зависимости от типа объекта
Виртуальный метод – это метод базового класса,
который могут переопределить классы-наследники так,
что конкретный адрес вызываемого метода
определяется только при выполнении программы.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

59. Пример: элемент «И-НЕ»

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
59
Пример: элемент «И-НЕ»
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

60. Модульность

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
60
Модульность
Идея: выделить классы в отдельный модуль.
Интерфейс (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

61. Модульность

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
61
Модульность
Модуль (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

62. Сообщения между объектами

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
62
Сообщения между объектами
!
Задача – автоматическая передача
сигналов по цепочке!
class TLogElement
{
private:
TLogElement *FNextEl;
int FNextIn;
адрес следующего
...
элемента в цепочке
public:
void Link ( TLogElement *nextElement,
int nextIn = 1 );
};
номер входа
следующего элемента
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

63. Сообщения между объектами

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
63
Сообщения между объектами
Установка связи:
void TLogElement::Link(
TLogElement *nextElement,
int nextIn )
{
FNextEl = nextElement;
FNextIn = nextIn;
}
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

64. Сообщения между объектами

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
64
Сообщения между объектами
После изменения выхода «дергаем» следующий
элемент:
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

65. Сообщения между объектами

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
65
Сообщения между объектами
?
Как сделать, чтобы сначала FNextEl = NULL?
Новый конструктор:
TLogElement::TLogElement()
{
FNextEl = NULL;
}
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

66. Сообщения между объектами

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
66
Сообщения между объектами
Изменения в основной программе:
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

67. Объектно-ориентированное программирование. Языки C++ и C#

67
Объектноориентированное
программирование.
Языки C++ и C#
§ 51. Программы с графическим
интерфейсом
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

68. Интерфейс: объекты и сообщения

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
68
Интерфейс: объекты и сообщения
поле ввода
флажок
кнопка
переключатель
Все элементы окон – объекты, которые обмениваются
данными, посылая друг другу сообщения.
Сообщение – это блок данных определённой
структуры, который используется для обмена
информацией между объектами.
• адресат (кому) или широковещательное
• числовой код (тип) сообщения
• параметры (дополнительные данные)
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

69. Классические программы

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
69
Классические программы
начало
основная программа
ввод данных
обработка данных
вывод результатов
конец
!
процедуры и функции
Порядок выполнения команд определяется
программистом, пользователь не может вмешаться!
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

70. Программы, управляемые событиями

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
70
Программы, управляемые событиями
Событие – это переход какого-либо объекта из одного
состояния в другое.
• нажатие на клавишу
• щелчок мышью
• перемещение окна
• поступление данных из сети
• запрос к веб-серверу
• завершение вычислений
•…
!
Программа начинает работать при
наступлении событий!
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

71. Программы, управляемые событиями

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
71
Программы, управляемые событиями
клавиатура, мышь, …
системная очередь сообщений
начало
ожидание сообщения
стоп?
конец
очередь
программы
основная
программа
обработка сообщения
программа
!
операционная
система
обработчики
сообщений
Программа управляется событиями!
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

72. Что такое RAD-среда?

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
72
Что такое RAD-среда?
RAD = Rapid Application Development — быстрая
разработка приложений
Форма – это шаблон, по
Этапы разработки:
которому строится окно
• создание формы
программы или диалога
• минимальный код
добавляется автоматически
• расстановка элементов интерфейса с
помощью мыши и настройка их свойств
• создание обработчиков событий
• написание алгоритмов обработки данных
выполняются при
возникновении событий
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

73. RAD-среды: Delphi

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
73
RAD-среды: Delphi
Язык: Object Pascal, позднее Delphi:
1995: Borland, сейчас: Embarcadero Technologies
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

74. RAD-среды: MS Visual Studio

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
74
RAD-среды: MS Visual Studio
Языки: Visual Basic, Visual C++, Visual C#, Visual F#
c 1995 по н.в.: Microsoft
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

75. RAD-среды: Lazarus

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
75
RAD-среды: Lazarus
Языки: FreePascal, Delphi
свободное ПО:
lazarus.freepascal.org
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

76. Объектно-ориентированное программирование. Языки C++ и C#

76
Объектноориентированное
программирование.
Языки C++ и C#
§ 52. Программирование в
RAD-средах
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

77. Visual Studio Express (C#)

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
77
Visual Studio Express (C#)
http://www.visualstudio.com/ru-ru/products/visual-studio-express-vs.aspx
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

78. Язык C#

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
78
Язык C#
С С++ C#
Паскаль
Java
Smalltalk
Common Intermediate
Language
C#
VB.NET
F#
язык CIL
(байт-код)
Common
Language
Runtime
виртуальная
машина CLR
объединение программ на разных языках
полностью ООП – для больших программ
большая библиотека функций и компонентов
требовательна к ресурсам
Linux – проект
Mono
надёжно – только под Windows
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

79. Проекты и решения

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
79
Проекты и решения
Проект – это набор файлов, из которых компилятор
строит исполняемый файл программы.
• проект (.csproj, CSharp Project) – описание (XML)
• модули, из которых состоит программа (*.сs);
• ресурсы (*.resx) – строки (перевод сообщений).
основная
программа
обработчики
событий
ресурсы
Program.cs
Form1.cs
Form1.Designer.cs
Form1.resx
my.exe
описание
формы
Решение = один или несколько проектов.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

80. Простейший проект

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
80
Простейший проект
Файл – Создать проект – Приложение Windows Forms
Редактор
кода
Конструктор
формы
!
F5 – запуск!
Структура
проекта
Панель
элементов
Свойства
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

81. Модуль формы

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
81
Модуль формы
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

82. Модуль формы

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
82
Модуль формы
открытый
класс
частичное
описание
наследник
класса Form
public partial class Form1: Form
{
public Form1()
{
InitializeComponent();
}
}
Код этого метода – в
начальные
установки
Form1.Designer.cs!
!
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

83. Основная программа

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
83
Основная программа
библиотеки
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

84. Свойства формы

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
84
Свойства формы
MainForm
Name – имя формы
Size.Width – ширина
Size.Height – высота
Text – текст в заголовке окна
BackColor – цвет фона
Font – шрифт надписей
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

85. Обработчик событий

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
85
Обработчик событий
События
2 ЛКМ: создать
обработчик
FormClosing:
форма закрывается
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

86. Обработчик события

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
86
Обработчик события
закрытый
метод класса
MainForm
название
обработчика
private void MainForm_FormClosing (
object sender,
общий предок
FormClosingEventArgs e )
всех объектов
{
кто послал
дополнительные
}
сообщение
данные о событии
!
Автоматически добавлен в Form1.Designer.cs!
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

87. Диалог с вопросом

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
87
Диалог с вопросом
Метод 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

88. Параметры MessageBox.Show

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
88
Параметры MessageBox.Show
• сообщение пользователю
• заголовок окна
• тип запроса MessageBoxIcon
Error
ошибка
Warning
предупреждение
Information информация
Questionвопрос
• набор (множество) кнопок MessageBoxButtons:
YesNo
«Да», «Нет»
YesNoCancel «Да», «Нет», «Отмена»
OK
«OK»
OKCancel
«ОК», «Отмена»
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

89. Объектно-ориентированное программирование. Языки C++ и C#

89
Объектноориентированное
программирование.
Языки C++ и C#
§ 53. Использование
компонентов
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

90. Панель компонентов

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
90
Панель компонентов
Контейнеры
Стандартные
Диалоги
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

91. Просмотр рисунков

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
91
Просмотр рисунков
панель
Panel
кнопка
Button
выключатель
CheckBox
рисунок
PictureBox
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

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

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
92
Настройка формы
Файл – Создать проект – Приложение Windows Forms
Name MainForm
Text Просмотр
рисунков
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

93. Верхняя панель

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
93
Верхняя панель
панель Panel
Dock = Top
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

94. Кнопка и выключатель

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
94
Кнопка и выключатель
кнопка
Button
выключатель
CheckBox
Name = OpenBtn
Text = Открыть файл
К.Ю. Поляков, Е.А. Ерёмин, 2014
Name = SizeCB
Text = По размерам окна
http://kpolyakov.spb.ru

95. Компонент PictureBox

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
95
Компонент PictureBox
рисунок
PictureBox
Name = Image
Dock = Fill
К.Ю. Поляков, Е.А. Ерёмин, 2014
?
1) Загрузка файла?
2) Масштабирование?
http://kpolyakov.spb.ru

96. Выбор файла

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
96
Выбор файла
выбор рисунка
OpenFileDialog
Name = OpenDlg
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

97. Выбор файла

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
97
Выбор файла
2 ЛКМ
если файл выбран
if ( OpenDlg.ShowDialog() == DialogResult.OK )
Img.Image = new Bitmap (OpenDlg.FileName);
имя файла
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

98. Масштабирование

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
98
Масштабирование
2 ЛКМ
if ( SizeCB.Checked )
Img.SizeMode = PictureBoxSizeMode.Zoom;
else Img.SizeMode = PictureBoxSizeMode.Normal;
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

99. Ввод и вывод данных

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
99
Ввод и вывод данных
для веб-страниц
поле ввода rEdit
TextBox
метка rgbLabel
Label
метки
Label
панель rgbPanel
Panel
поле ввода bEdit
TextBox
К.Ю. Поляков, Е.А. Ерёмин, 2014
поле ввода gEdit
TextBox
http://kpolyakov.spb.ru

100. Обновление компонентов вывода

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
100
Обновление компонентов вывода
выделить все три
(+Shift)
2 ЛКМ
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

101. Обновление компонентов вывода

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
101
Обновление компонентов вывода
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

102. Вызов при запуске

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
102
Вызов при запуске
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

103. Обработка ошибок

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
103
Обработка ошибок
?
Если вместо числа ввести букву?
!
Программа не должна «вылетать»!
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

104. Обработка ошибок

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
104
Обработка ошибок
попытаться выполнить
try
{
// «опасные» команды
}
если исключение
catch
(аварийная ситуация)
{
// обработка ошибки
}
?
Какие у нас опасные операции?
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

105. Обработка ошибок

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
105
Обработка ошибок
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

106. Блокирование неверных символов

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
106
Блокирование неверных символов
выделить все три
(+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

107. Объектно-ориентированное программирование. Языки C++ и C#

107
Объектноориентированное
программирование.
Языки C++ и C#
§ 54. Совершенствование
компонентов
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

108. Новый класс (модуль)

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
108
Новый класс (модуль)
Задача: построить поле для ввода целых чисел, в котором
• есть защита от ввода неверных символов
• есть методы для чтения/записи целого числа
!
На основе класса TextBox!
Проект – Добавить класс
using System.Windows.Forms;
там объявлен
TextBox
class IntTextBox: TextBox
{
}
F5 – запуск! И компонент в палитре!
!
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

109. Обработчик KeyPress

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
109
Обработчик 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

110. Свойство Value

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
110
Свойство 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

111. Поле для ввода целых чисел

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
111
Поле для ввода целых чисел
Использование:
поле ввода decEdit
IntTextBox
метка hexLabel
Label
private void decEdit_TextChanged (
object sender, EventArgs e )
{
свойство
hexLabel.Text =
decEdit.Value.ToString ( "X" );
}
в шестнадцатеричную
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

112. Объектно-ориентированное программирование. Языки C++ и C#

112
Объектноориентированное
программирование.
Языки C++ и C#
§ 55. Модель и представление
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

113. Еще одна декомпозиция

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
113
Еще одна декомпозиция
Задача: повторное использование написанного ранее
готового кода.
решение
модель
представление
(данные и методы
их обработки)
(интерфейс с
пользователем)
решение
представление
(интерфейс с
пользователем)
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

114. Модель и представление

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
114
Модель и представление
Задача: хранить и использовать данные об изменении
курса доллара.
решение
модель
(массив, поиск
минимума и
максимума,
прогнозирование)
представление
(формулы, диаграммы,
графики, таблицы)
представление
x
1
2
3
y
1
2
3
z
4
5
6
модель
представление
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

115. Модель и представление

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
115
Модель и представление
Задача: вычисление арифметического выражения:
• целые числа
• знаки арифметических действий + - * /
Модель:
функция LastOp
• символьная строка
(глава 6)
• алгоритм вычисления:
k = номер последней операции
n1 = значение левой части
n2 = значение правой части
результат = операция(n1, n2)
!
Рекурсия!
k
22 + 13 – 3 * 8
n1
n2
К.Ю. Поляков, Е.А. Ерёмин, 2014
?
Чего не хватает?
http://kpolyakov.spb.ru

116. Модель

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
116
Модель
Псевдокод:
k = номер последней операции
if ( k < 0 )
результат:= строка в число
else {
n1 = значение левой части
n2 = значение правой части
результат = операция(n1, n2)
}
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

117. Статический класс – набор функций

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
117
Статический класс – набор функций
Проект – Добавить класс
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

118. Модель: приоритет операций

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
118
Модель: приоритет операций
int Priority ( char op )
{
switch ( op )
{
case '+':
case '-': return 1;
case '*':
case '/': return 2;
}
return 100;
}
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

119. Модель: номер последней операции

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
119
Модель: номер последней операции
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

120. Модель: вычисления

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
120
Модель: вычисления
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

121. Представление

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
121
Представление
выпадающий
список
ComboBox
Name = Input
Dock = Top
многострочное
поле TextBox
Name = Answers
Dock = Fill
ReadOnly = True
Multiline = True
if ( нажата клавиша Enter )
{
x = значение выражения
добавить результат в конец поля вывода
if ( выражения нет в списке )
добавить его в список
}
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

122. Перехват нажатия на клавишу Enter

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
122
Перехват нажатия на клавишу Enter
KeyPress для элемента Input:
private void Input_KeyPress (
object sender, KeyPressEventArgs e )
{
if ( e.KeyChar == (char)13 )
{
...
код клавиши
}
Enter
}
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

123. Обработка и вывод данных

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
123
Обработка и вывод данных
Вычисления (обращение к модели):
int x;
x = Calculator.Calc(
Input.Text);
Добавление строки в TextBox:
добавить строку
Answers.Text += Input.Text + "=" +
x.ToString() + "\r\n";
число в строку
К.Ю. Поляков, Е.А. Ерёмин, 2014
новая строка
http://kpolyakov.spb.ru

124. Обработка и вывод данных

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
124
Обработка и вывод данных
Добавление строки в ComboBox:
найти индекс
строки
int i = Input.FindString(Input.Text);
if ( i < 0 )
Input.Items .Insert ( 0, Input.Text );
массив строк в
ComboBox
К.Ю. Поляков, Е.А. Ерёмин, 2014
вставить
строку
позиция
списка
что
вставлять
http://kpolyakov.spb.ru

125. Перехват нажатия на клавишу Enter

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
125
Перехват нажатия на клавишу 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

126. Калькулятор

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
126
Калькулятор
!
К.Ю. Поляков, Е.А. Ерёмин, 2014
Самостоятельно!
http://kpolyakov.spb.ru

127. Конец фильма

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
127
Конец фильма
ПОЛЯКОВ Константин Юрьевич
д.т.н., учитель информатики
ГБОУ СОШ № 163, г. Санкт-Петербург
[email protected]
ЕРЕМИН Евгений Александрович
к.ф.-м.н., доцент кафедры мультимедийной
дидактики и ИТО ПГГПУ, г. Пермь
[email protected]
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

128. Источники иллюстраций

Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
128
Источники иллюстраций
1.
2.
3.
4.
5.
6.
www.picstopin.com
maugav.info
yoursourceisopen.com
ru.wikipedia.org
иллюстрации художников издательства «Бином»
авторские материалы
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
English     Русский Правила