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

Содержание

Слайд 2

§ 46. Что такое ООП?

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

§ 46. Что такое ООП? Объектно-ориентированное программирование. Языки C++ и C#

Слайд 3

Зачем нужно что-то новое?

программы из миллионов строк
тысячи переменных и массивов

Э. Дейкстра: «Человечество еще

Зачем нужно что-то новое? программы из миллионов строк тысячи переменных и массивов
в древности придумало способ управления сложными системами: «разделяй и властвуй»».

Структурное программирование:

декомпозиция по задачам

человек мыслит иначе, объектами

Слайд 4

Как мы воспринимаем объекты?

существенные свойства

Абстракция – это выделение существенных свойств объекта, отличающих

Как мы воспринимаем объекты? существенные свойства Абстракция – это выделение существенных свойств
его от других объектов.

Слайд 5

Использование объектов

Программа – множество объектов (моделей), каждый из которых обладает своими свойствами

Использование объектов Программа – множество объектов (моделей), каждый из которых обладает своими
и поведением, но его внутреннее устройство скрыто от других объектов.

декомпозиция по объектам

Слайд 6

§ 47. Объекты и классы

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

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

Слайд 7

С чего начать?

Объектно-ориентированный анализ (ООА):

выделить объекты
определить их существенные свойства
описать поведение (команды, которые

С чего начать? Объектно-ориентированный анализ (ООА): выделить объекты определить их существенные свойства
они могут выполнять)

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

Состояние определяет поведение:

лежачий человек не прыгнет
незаряженное ружье не выстрелит

Класс – это множество объектов, имеющих общую структуру и общее поведение.

Слайд 8

Модель дороги с автомобилями

Объект «Дорога»:

методы (поведение)

свойства
(состояние)

название класса

Модель дороги с автомобилями Объект «Дорога»: методы (поведение) свойства (состояние) название класса

Слайд 9

Модель дороги с автомобилями

Объект «Машина»:

свойства: координаты и скорость

все машины одинаковы
скорость постоянна
на

Модель дороги с автомобилями Объект «Машина»: свойства: координаты и скорость все машины
каждой полосе – одна машина
если машина выходит за правую границу дороги, вместо нее слева появляется новая машина

Метод – это процедура или функция, принадлежащая классу объектов.

Слайд 10

Модель дороги с автомобилями

Взаимодействие объектов:

узнать длину

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

Модель дороги с автомобилями Взаимодействие объектов: узнать длину свойства объектов методы: операции,
(обмен данными) между объектами

Схема определяет

Слайд 11

§ 48. Создание объектов в программе

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

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

Слайд 12

Классы

программа – множество взаимодействующих объектов
любой объект – экземпляр какого-то класса
класс – описание

Классы программа – множество взаимодействующих объектов любой объект – экземпляр какого-то класса
группы объектов с общей структурой и поведением

Класс

Данные

Методы

отличие от структур!

состояние

поведение

Поле – это переменная, принадлежащая объекту.

Слайд 13

Класс «Дорога»

class TRoad
{
float Length;
int Width;
};

Объявление класса:

Объявление переменной (создание объекта):

TRoad

Класс «Дорога» class TRoad { float Length; int Width; }; Объявление класса:
road;

road.Length = 60;
road.Width = 3;

Попытка изменить данные:

private

ошибка

Слайд 14

Класс «Дорога»

class TRoad
{
public:
float Length;
int Width;
};

Объявление класса:

main()
{
TRoad

Класс «Дорога» class TRoad { public: float Length; int Width; }; Объявление
road;
road.Length = 60; // работает!
road.Width = 3; // работает!
}

Основная программа:

public:

Слайд 15

Класс «Дорога»

Конструктор – это метод класса, который вызывается для создания объекта этого

Класс «Дорога» Конструктор – это метод класса, который вызывается для создания объекта
класса.

TRoad road;

вызов конструктора

road.Length = ???
road.Width = ???

«мусор»

Слайд 16

Новый конструктор

class TRoad
{
public:
float Length;
int Width;
TRoad(); // объявление

Новый конструктор class TRoad { public: float Length; int Width; TRoad(); //
конструктора
};

Класс:

TRoad();

TRoad::TRoad()
{
Length = 0;
Width = 0;
}

Конструктор:

TRoad::aaa()
{
...
}

метод aaa класса TRoad

Слайд 17

Конструктор с параметрами

class TRoad
{
public:
...
TRoad ( float length0, int

Конструктор с параметрами class TRoad { public: ... TRoad ( float length0,
width0 );
};

TRoad::TRoad ( float length0, int width0 )
{
Length = length0;
Width = width0;
}

Конструктор:

Вызов:

TRoad road ( 60, 3 );

Слайд 18

Защита от неверных данных

TRoad::TRoad ( float length0, int width0 )
{
if (

Защита от неверных данных TRoad::TRoad ( float length0, int width0 ) {
length0 > 0 )
Length = length0;
else Length = 1;
if ( width0 > 0 )
Width = width0;
else Width = 1;
}

Слайд 19

Значения параметров по умолчанию

class TRoad
{
public:
...
TRoad ( float length0,

Значения параметров по умолчанию class TRoad { public: ... TRoad ( float
int width0 = 3 );
};

Вызов:

TRoad road ( 60 );

= 3

значение по умолчанию

последние в списке параметров

width = 3

Слайд 20

Класс «Машина»

class TCar
{
public:
float X, V;
int P;

Класс «Машина» class TCar { public: float X, V; int P; TRoad
TRoad *Road;
void move();
TCar (); // конструктор без параметров
TCar ( TRoad *road0, int p0, float v0 );
};

дорога, по которой едет

координата, скорость

полоса

Слайд 21

Конструкторы класса «Машина»

TCar::TCar ()
{
Road = NULL;
P = 0; V

Конструкторы класса «Машина» TCar::TCar () { Road = NULL; P = 0;
= 0; X = 0;
}

защита от ошибок – самостоятельно

TCar::TCar ( TRoad *road0, int p0,
float v0 )
{
Road = road0;
P = p0; V = v0; X = 0;
}

Слайд 22

Класс «Машина»: метод move

void TCar::move()
{
X = X + V;
if

Класс «Машина»: метод move void TCar::move() { X = X + V;
( X > Road->Length ) X = 0;
}

Равномерное движение:

перемещение за одну единицу времени

выезжает с другой стороны

обращение через указатель

Слайд 23

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

const int N = 3;
TCar cars[N];
int i;
for ( i = 0;

Основная программа const int N = 3; TCar cars[N]; int i; for
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++ )
cars[i].move();
}
while ( !kbhit() );

пока не нажата (любая) клавиша

#include

Слайд 24

Использование указателей

const int N = 3;
TCar *cars[N];

for ( i = 0; i

Использование указателей const int N = 3; TCar *cars[N]; for ( i
< N; i ++ )
cars[i] = new TCar ( &road, i+1,
2.0*(i+1) );

for ( i = 0; i < N; i ++ )
cars[i]->move();

массив указателей

создание объектов

Слайд 25

Что в этом хорошего и плохого?

основная программа – простая и понятная
классы могут

Что в этом хорошего и плохого? основная программа – простая и понятная
разрабатывать разные программисты независимо друг от друга (+интерфейс!)
повторное использование классов

неэффективно для небольших задач

ООП – это метод разработки больших программ!

Слайд 26

Задание

«A»: Построить класс Попугай (TParrot), который умеет говорить какую-то фразу, заранее определённую

Задание «A»: Построить класс Попугай (TParrot), который умеет говорить какую-то фразу, заранее
при описании класса.
Пример:
TParrot p;
p.say(); Привет, друзья!

«B»: Изменить класс из задания A так, чтобы фраза задавалась при создании конкретного экземпляра.
Пример:
TParrot p1( "Гав!" );
TParrot p2( "Мяу!" );
p1.say(); Гав!
p2.say(); Мяу!

Слайд 27

Задание

«С»: Изменить класс из задания B так, чтобы фразу можно было изменять

Задание «С»: Изменить класс из задания B так, чтобы фразу можно было
во время работы программы.
Пример:
TParrot p( "Гав!" );
p.say(); Гав!
p.newText( "Мяу!" );
p.say(); Мяу!

«D»: Изменить класс из задания C так, чтобы при вызове метода say можно было задать число повторений.
Пример:
TParrot p( "Гав!" );
p.say(); Гав!
p.newText( "Мяу!" );
p.say( 3 ); Мяу! Мяу! Мяу!

Слайд 28

Задание

«E»: Изменить класс из задания D так, чтобы можно было добавлять фразы

Задание «E»: Изменить класс из задания D так, чтобы можно было добавлять
в набор фраз, которые знает попугай. При вызове метода say попугай выдаёт случайную фразу из своего набора.
Пример:
TParrot p( "Гав!" );
p.say(); Гав!
p.learn( "Мяу!" );
p.say(); Гав!
p.say(3); Мяу! Мяу! Мяу!

Слайд 29

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

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

§ 49. Скрытие внутреннего устройства Объектно-ориентированное программирование. Языки C++ и C#

Слайд 30

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

Объектная модель задачи:

интерфейсы

защита внутренних данных
проверка входных данных на корректность
изменение

Зачем скрывать внутреннее устройство? Объектная модель задачи: интерфейсы защита внутренних данных проверка
устройства с сохранением интерфейса

Инкапсуляция («помещение в капсулу») – скрытие внутреннего устройства объектов.

Слайд 31

Защита внутренних данных

метод есть
+ энергия
+ настроение
- голод

метод спать
+

Защита внутренних данных метод есть + энергия + настроение - голод метод
энергия
+ голод

метод играть
- энергия
+ настроение
+ голод

состояние

методы

Слайд 32

class TPen
{
private:
string FColor;
public:
string getColor ();
void

class TPen { private: string FColor; public: string getColor (); void setColor
setColor ( string newColor );
};

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

class TPen
{
private:
string FColor; // цвет, "FF00FF"
};

R

G

B

Field – поле

string getColor ();
void setColor ( string newColor );

методы доступа

Слайд 33

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

Получить значение:

string TPen::getColor ()
{
return FColor;
}

Записать

Пример: класс «перо» Получить значение: string TPen::getColor () { return FColor; }
значение:

void TPen::setColor ( string newColor )
{
if ( newColor.length()!= 6 )
FColor = "000000";
else FColor = newColor;
}

если ошибка, чёрный цвет

Слайд 34

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

Использование:

TPen pen;
pen.setColor ( "FFFF00" );
cout << "цвет пера: "

Пример: класс «перо» Использование: TPen pen; pen.setColor ( "FFFF00" ); cout установить
<< pen.getColor();

установить цвет

прочитать цвет

pen.color = "FFFF00";
cout << pen.color;

нельзя в C++

Слайд 35

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

class TPen
{
private:
int FColor;
public:
string getColor();

Изменение внутреннего устройства class TPen { private: int FColor; public: string getColor();
void setColor( string newColor );
};

Удобнее хранить цвет в виде числа:

string getColor();
void setColor( string newColor );

int

изменилось внутреннее устройство

Слайд 36

Преобразования int → hex

#include

Использование потока (байтов):

записываем в поток число в шестнадцатеричной

Преобразования int → hex #include Использование потока (байтов): записываем в поток число
системе

читаем строку

подключить строковые потоки

stringstream s;
s << hex << FColor;

"0000FF"

правильно так!

16711935

"FF00FF"

Слайд 37

string TPen::getColor()
{
stringstream s;
s << setfill('0')
<< setw(6)
<<

string TPen::getColor() { stringstream s; s return s.str(); } Преобразования hex ↔
hex << FColor;
return s.str();
}

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

#include
#include

подключить манипуляторы

заполнять не пробелами, а нулями

вывести 6 знаков

прочитать строку string из потока

Слайд 38

Преобразования hex → int

void TPen::setColor ( string newColor )
{
stringstream s;
if

Преобразования hex → int void TPen::setColor ( string newColor ) { stringstream
( newColor.length()!= 6 )
FColor = 0; // чёрный цвет
else {
s << newColor;
s >> hex >> FColor;
}
}

Использование потока:

16711935

"FF00FF"

записываем в поток строку

читаем число в шестнадцатеричной системе

записываем строку

читаем число

Слайд 39

Свойства в C#

Свойство – это способ доступа к внутреннему состоянию объекта, имитирующий

Свойства в C# Свойство – это способ доступа к внутреннему состоянию объекта,
обращение к его внутренней переменной.

Доступ с помощью методов:

TPen pen;
pen.setColor ( "FFFF00" );
cout << "цвет пера: " << pen.getColor();

Доступ с помощью свойства color:

TPen pen;
pen.color = "FFFF00";
cout << "цвет пера: " << pen.color;

вызов pen.setColor

вызов pen.getColor

Слайд 40

Свойства в C#

class TPen
{
private string FColor;
public string color
{

Свойства в C# class TPen { private string FColor; public string color
get { return FColor; }
set { FColor = value; }
}
}

метод чтения

метод записи

закрытое поле

открытое свойство

Использование:

TPen pen;
pen.color = "FFFF00";
string s = pen.color;

Слайд 41

Свойства в C#

Защита от неверного ввода данных:

public string color
{
get {

Свойства в C# Защита от неверного ввода данных: public string color {
return FColor; }
set
{
if ( value.Length != 6 )
FColor = "000000";
else FColor = value;
}
}

переданное значение

Слайд 42

Свойства в C#

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

class TPen
{
private int FColor;
public string color

Свойства в C# Изменение внутреннего устройства: class TPen { private int FColor;
{
get {
return FColor.ToString ( "X6" );
}
set {
FColor = Convert.ToInt32(value, 16);
}
}
}

в строку

шестнадцатеричныйформат, 6 знаков

в целое

из шестнадцатеричной записи

переданное значение

Слайд 43

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

class TCar {
private:
double Fv;
public:
double

Свойство «только для чтения» class TCar { private: double Fv; public: double
getV() { return Fv; }
};

нет метода записи

Скорость машины можно только читать:

class TCar {
private double Fv;
public double V {
get { return Fv; }
}
};

Свойство на C#:

Слайд 44

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

Инкапсуляция («помещение в капсулу»)

интерфейс (public)

внутреннее устройство (private)

Скрытие внутреннего устройства Инкапсуляция («помещение в капсулу») интерфейс (public) внутреннее устройство (private)

Слайд 45

Задание

«A»: Построить класс РядЛампочек (TLampRow), который хранит состояние ряда из 8 лампочек

Задание «A»: Построить класс РядЛампочек (TLampRow), который хранит состояние ряда из 8
в виде символьной строки. Цифра 0 обозначает выключенную лампочку, цифра 1 – включенную.
Методы getState и setState скрывают внутреннюю переменную state, которая хранит состояние лампочек. При записи нового значения проверяется, что длина строки состояния равна 8, иначе записываются все нули.
Метод show выводит на экран состояние лампочек, обозначая выключенную лампочку как минус, а включённую – как «*».
Пример:
TLampRow lamps;
lamps.show(); --------
lamps.setState( "10101010" );
cout << lamps.getState() << endl; 10101010
lamps.show(); *-*-*-*-

Слайд 46

Задание

«B»: Дополните класс TLampRow из задания A так, чтобы количество лампочек в

Задание «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(); ------

Слайд 47

Задание

«С»: Дополните класс TLampRow из задания B так, чтобы лампочки могли гореть

Задание «С»: Дополните класс 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(); ------

Слайд 48

Задание

«D»: Дополните класс TLampRow из задания C так, чтобы код состояния хранился

Задание «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(); ------

Слайд 49

§ 50. Иерархия классов

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

§ 50. Иерархия классов Объектно-ориентированное программирование. Языки C++ и C#

Слайд 50

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

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

Яблоко

Груша

Банан

Апельсин

базовый класс

Фрукт

классы-наследники

это

Классификации Классификация – разделение изучаемых объектов на группы (классы), объединенные общими признаками.
фрукт, у которого…

Слайд 51

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

класс Двудольные
семейство Бобовые
род Клевер
горный клевер

наследует свойства (имеет

Что такое наследование? класс Двудольные семейство Бобовые род Клевер горный клевер наследует
все свойства)

Класс Б является наследником класса А, если можно сказать, что Б – это разновидность А.

яблоко – это фрукт

машина – двигатель

яблоко – фрукт

горный клевер – клевер

горный клевер – это растение рода Клевер

машина содержит двигатель (часть – целое)

Слайд 52

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

Логический элемент

с одним входом

с двумя входами

НЕ

Объектно-ориентированное программирование – это такой

Иерархия логических элементов Логический элемент с одним входом с двумя входами НЕ
подход к программированию, при котором программа представляет собой множество взаимодействующих объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования.

Слайд 53

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

class TLogElement
{
public:
bool In1, In2, Res;
void calc();
};

можно моделировать

Базовый класс class TLogElement { public: bool In1, In2, Res; void calc();
элементы с памятью (триггеры)

вычислить выход

Слайд 54

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

class TLogElement
{
private:
bool FIn1, Fin2, FRes;
void calc();
public:

Базовый класс class TLogElement { private: bool FIn1, Fin2, FRes; void calc();
bool getIn1() { return FIn1; }
void setIn1 ( bool newIn1 );
bool getIn2() { return Fin2; }
void setIn2 ( bool newIn2 );
bool getRes() { return FRes; }
};

только для чтения

Слайд 55

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

void TLogElement::setIn1(bool newIn1)
{
FIn1 = newIn1;
calc();
}

пересчёт при изменении входа

void

Установка входа void TLogElement::setIn1(bool newIn1) { FIn1 = newIn1; calc(); } пересчёт
TLogElement::calc()
{
}

заглушка

Слайд 56

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

греч.: πολυ — много, μορφη — форма

Полиморфизм – это возможность

Что такое полиморфизм? греч.: πολυ — много, μορφη — форма Полиморфизм –
классов-наследников по-разному реализовать метод, описанный для класса-предка.

class TLogElement
{
...
protected:
void calc();
};

защищённые элементы: доступны только наследникам

Слайд 57

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

class TLogElement
{
private:
bool FIn1, Fin2;
protected:
bool FRes;
virtual

Базовый класс class TLogElement { private: bool FIn1, Fin2; protected: bool FRes;
void calc()= 0;
bool getIn2() { return Fin2; }
void setIn2 ( bool newIn2 );
public:
bool getIn1() { return FIn1; }
void setIn1 ( bool newIn1 );
bool getRes() { return FRes; }
};

наследники будут изменять поле

virtual

= 0;

Слайд 58

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

class TLogElement
{
protected:
bool FRes;
virtual void calc()= 0;

Базовый класс class TLogElement { protected: bool FRes; virtual void calc()= 0;
bool getIn2() { return Fin2; }
void setIn2 ( bool newIn2 );
...
};

наследники будут изменять поле

virtual

= 0;

для элементов с одним входом не нужно!

virtual (виртуальный) – этот метод могут переопределять классы-наследники

= 0 (абстрактный метод) – этот метод базовый класс не будет реализовывать (оставляет наследникам)

Слайд 59

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

Абстрактный метод – это метод класса, который объявляется, но не реализуется

Абстрактный класс Абстрактный метод – это метод класса, который объявляется, но не
в классе.

Абстрактный класс – это класс, содержащий хотя бы один абстрактный метод.

все логические элементы должны иметь метод calc
метод calc невозможно написать, пока неизвестен тип логического элемента

нет логического элемента «вообще», как не «фрукта вообще», есть конкретные виды

TLogElement – абстрактный класс из-за метода calc

Слайд 60

Элемент «НЕ»

class TNot: public TLogElement
{
protected:
void calc();
};

void TNot::calc()
{

Элемент «НЕ» class TNot: public TLogElement { protected: void calc(); }; void
FRes =!getIn1();
}

наследник от TLogElement

переопределяет метод базового класса

Слайд 61

Элемент «НЕ»

TNot n;
n.setIn1 ( false );
cout << n.getRes();

Использование:

создание объекта

установка входа

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

Элемент «НЕ» TNot n; n.setIn1 ( false ); cout Использование: создание объекта установка входа вывод результата

Слайд 62

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

class TLog2In: public TLogElement
{
public:
TLogElement::setIn2;
TLogElement::getIn2;
};

наследник от

Элементы с двумя входами class TLog2In: public TLogElement { public: TLogElement::setIn2; TLogElement::getIn2;
TLogElement

повысить «видимость» (protected → public)

нельзя, он абстрактный

сохранить права доступа

Слайд 63

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

class TAnd: public TLog2In
{
protected:
void calc();
};

Элементы с двумя входами class TAnd: public TLog2In { protected: void calc();

class TOr: public TLog2In
{
protected:
void calc();
};

элемент «И»

элемент «ИЛИ»

Слайд 64

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

void TAnd::calc()
{
FRes = getIn1() && getIn2();
}
void TAnd::calc()
{

Элементы с двумя входами void TAnd::calc() { FRes = getIn1() && getIn2();
FRes = getIn1() || getIn2();
}

элемент «И»

элемент «ИЛИ»

доступ к защищённому полю (protected)

Слайд 65

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

void TLogElement::setIn1( bool newIn1 )
{
FIn1 = newIn1;
calc();
}

В

Вызов виртуального метода void TLogElement::setIn1( bool newIn1 ) { FIn1 = newIn1;
базовом классе:

class TLogElement
{
protected:
virtual void calc()= 0;
...
};

virtual

Слайд 66

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

Виртуальный метод – это метод базового класса, который могут переопределить классы-наследники

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

Статическое связывание:

транслятор записывает в код адрес процедуры

Динамическое связывание:

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

Слайд 67

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

main()
{
TNot elNot;
TAnd elAnd;
int A, B;
cout

Пример: элемент «И-НЕ» main() { TNot elNot; TAnd elAnd; int A, B;
<< " 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;
}
}
}

Слайд 68

Модульность

class TLogElement
{ … }
class TLog2In: public TLogElement
{ … }
class TNot:

Модульность class TLogElement { … } class TLog2In: public TLogElement { …
public TLogElement
{ … }
class TAnd: public TLog2In
{ … }
class TOr: public TLog2In
{ … }

Идея: выделить классы в отдельный модуль.

Интерфейс (log_elem.h):

Слайд 69

Модульность

void TLogElement::setIn1 ( bool newIn1 )
{ ... }
void TLogElement::setIn2 ( bool newIn1

Модульность void TLogElement::setIn1 ( bool newIn1 ) { ... } void TLogElement::setIn2
)
{ ... }
void TNot::calc()
{ ... }
void TAnd::calc()
{ ... }
void TOr::calc()
{ ... }

#include

Модуль (log_elem.cpp):

реализация методов классов

В основную программу:

#include

Слайд 70

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

class TLogElement
{
private:
TLogElement *FNextEl;
int FNextIn;
...
public:

Сообщения между объектами class TLogElement { private: TLogElement *FNextEl; int FNextIn; ...
void Link ( TLogElement *nextElement,
int nextIn = 1 );
};

адрес следующего элемента в цепочке

номер входа следующего элемента

Слайд 71

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

void TLogElement::Link(
TLogElement *nextElement,
int nextIn )
{
FNextEl

Сообщения между объектами void TLogElement::Link( TLogElement *nextElement, int nextIn ) { FNextEl
= nextElement;
FNextIn = nextIn;
}

Установка связи:

Слайд 72

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

void TLogElement::setIn1 ( bool newIn1 )
{
FIn1 = newIn1;
calc();

Сообщения между объектами void TLogElement::setIn1 ( bool newIn1 ) { FIn1 =

if ( FNextEl )
switch ( FNextIn ) {
case 1:
FNextEl->setIn1 ( getRes() );
case 2:
FNextEl->setIn2 ( getRes() );
}
}

После изменения выхода «дергаем» следующий элемент:

если следующий элемент установлен…

передать результат на нужный вход

Слайд 73

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

TLogElement::TLogElement()
{
FNextEl = NULL;
}

Новый конструктор:

Сообщения между объектами TLogElement::TLogElement() { FNextEl = NULL; } Новый конструктор:

Слайд 74

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

TNot elNot;
TAnd elAnd;
elAnd.Link ( &elNot );
...
for ( A = 0;

Сообщения между объектами TNot elNot; TAnd elAnd; elAnd.Link ( &elNot ); ...
A <= 1; A ++ ) {
elAnd.setIn1 ( A );
for ( B = 0; B <= 1; B++ ) {
elAnd.setIn2( B );
elNot.setIn1(elAnd.getRes());
...
}
}

Изменения в основной программе:

elAnd.Link ( &elNot );

установить связь

это уже не нужно!

Слайд 75

Задание

«A»: Постройте класс TPet (домашнее животное) с двумя скрытыми полями: FName (имя)

Задание «A»: Постройте класс TPet (домашнее животное) с двумя скрытыми полями: FName
и FAge (возраст). Они должны быть доступны для чтения через свойства name и age и недоступны для записи. Метод gettingOlder увеличивает возраст на 1 год. Класс TPet – абстрактный, он имеет абстрактный метод say.
Постройте два класса-наследника – TCat (кошка) и TDog (собака).Они должны реализовать метод say.
Описания классов должны быть в отдельном модуле animals.cpp.
Пример: см. следующий слайд.

Слайд 76

Задание

«A»:
Пример:
TPet *p, *pets[2];
p = new TDog("Шарик", 5);
p->gettingOlder();
cout << p->getName()

Задание «A»: Пример: TPet *p, *pets[2]; p = new TDog("Шарик", 5); p->gettingOlder();
<< ": "
<< p->getAge() << " лет" << endl;
pets[0] = new TCat("Мурка", 3);
pets[1] = p;
for( auto p: pets )
p->say();

Шарик: 6 лет Мурка: Мяу!
Шарик: Гав!

Слайд 77

Задание

«B»: Добавьте класс TMammal (млекопитающее) – наследник класса TPet и предок для

Задание «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
(pets[i]);
if( pMammal )
pMammal->run();
}

Мурзик: Мяу!
Мурзик побежал...
Шарик: Гав!
Шарик побежал...

Слайд 78

Задание

«C»: Добавьте класс TReptilia (рептилии) – наследник класса TPet и предок для

Задание «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 (pets[i]);
if( pMammal )
pMammal->run();
auto pRept = dynamic_cast (pets[i]);
if( pRept )
pRept->crawl();
}

Мурзик: Мяу!
Мурзик побежал...
Зак: ...
Зак пополз...
Шарик: Гав!
Шарик побежал...
Чаки: ш-ш-ш-ш...
Чаки пополз...

Слайд 79

Задание

«A»: Собрать полную программу и построить таблицу истинности последовательного соединения элементов «ИЛИ»

Задание «A»: Собрать полную программу и построить таблицу истинности последовательного соединения элементов
и «НЕ».
Пример:
A | B | not(A+B)
-------------------
0 | 0 | 1
0 | 1 | 0
1 | 0 | 0
1 | 1 | 0

Слайд 80

Задание

«B»: Добавить в иерархию классов элементы «И-НЕ» (TNAnd) и «ИЛИ-НЕ» (TNOr), которые

Задание «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

Слайд 81

Задание

«C»: Добавить в иерархию классов элемент «исключающее ИЛИ» (TXor) и «импликация» (TImp).

Задание «C»: Добавить в иерархию классов элемент «исключающее ИЛИ» (TXor) и «импликация»
Построить их таблицы истинности.
Пример:
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

Слайд 82

Задание

«D»: Добавить в иерархию классов элемент «триггер» (TTrigger). Построить его таблицу истинности

Задание «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

Слайд 83

§ 51. Программы с графическим интерфейсом

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

§ 51. Программы с графическим интерфейсом Объектно-ориентированное программирование. Языки C++ и C#

Слайд 84

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

поле ввода

кнопка

флажок

переключатель

Все элементы окон – объекты, которые обмениваются данными,

Интерфейс: объекты и сообщения поле ввода кнопка флажок переключатель Все элементы окон
посылая друг другу сообщения.

Сообщение – это блок данных определённой структуры, который используется для обмена информацией между объектами.

адресат (кому) или широковещательное
числовой код (тип) сообщения
параметры (дополнительные данные)

Слайд 85

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

основная программа

Классические программы основная программа

Слайд 86

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

Событие – это переход какого-либо объекта из одного состояния в

Программы, управляемые событиями Событие – это переход какого-либо объекта из одного состояния
другое.

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

Слайд 87

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

основная
программа

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

Слайд 88

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

RAD = Rapid Application Development — быстрая разработка приложений

создание формы
минимальный

Что такое RAD-среда? RAD = Rapid Application Development — быстрая разработка приложений
код добавляется автоматически
расстановка элементов интерфейса с помощью мыши и настройка их свойств
создание обработчиков событий
написание алгоритмов обработки данных

Этапы разработки:

Форма – это шаблон, по которому строится окно программы или диалога

выполняются при возникновении событий

Слайд 89

RAD-среды: Delphi

Язык: Object Pascal, позднее Delphi:

1995: Borland, сейчас: Embarcadero Technologies

RAD-среды: Delphi Язык: Object Pascal, позднее Delphi: 1995: Borland, сейчас: Embarcadero Technologies

Слайд 90

RAD-среды: MS Visual Studio

Языки: Visual Basic, Visual C++, Visual C#, Visual F#

c

RAD-среды: MS Visual Studio Языки: Visual Basic, Visual C++, Visual C#, Visual
1995 по н.в.: Microsoft

Слайд 91

RAD-среды: Lazarus

Языки: FreePascal, Delphi

свободное ПО:
lazarus.freepascal.org

RAD-среды: Lazarus Языки: FreePascal, Delphi свободное ПО: lazarus.freepascal.org

Слайд 92

§ 52. Программирование в RAD-средах

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

§ 52. Программирование в RAD-средах Объектно-ориентированное программирование. Языки C++ и C#

Слайд 93

Visual Studio Express (C#)

http://www.visualstudio.com/ru-ru/products/visual-studio-express-vs.aspx

Visual Studio Express (C#) http://www.visualstudio.com/ru-ru/products/visual-studio-express-vs.aspx

Слайд 94

Язык C#

С → С++ → C#

язык CIL
(байт-код)

Common Intermediate Language

виртуальная машина CLR

Common Language

Язык C# С → С++ → C# язык CIL (байт-код) Common Intermediate
Runtime

объединение программ на разных языках
полностью ООП – для больших программ
большая библиотека функций и компонентов

требовательна к ресурсам
надёжно – только под Windows

Linux – проект Mono

Слайд 95

Form1.resx

Проект – это набор файлов, из которых компилятор строит исполняемый файл программы.

проект

Form1.resx Проект – это набор файлов, из которых компилятор строит исполняемый файл
(.csproj, CSharp Project) – описание (XML)
модули, из которых состоит программа (*.сs);
ресурсы (*.resx) – строки (перевод сообщений).

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

Program.cs

Form1.Designer.cs

Form1.cs

my.exe

основная программа

обработчики событий

ресурсы

описание формы

Решение = один или несколько проектов.

Слайд 96

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

Файл – Создать проект – Приложение Windows Forms

Свойства

Панель элементов

Редактор кода

Конструктор формы

Структура

Простейший проект Файл – Создать проект – Приложение Windows Forms Свойства Панель
проекта

Слайд 97

Модуль формы

F7 – перейти из конструктора к коду формы

using System;
using System.Collections.Generic;
using System.ComponentModel;
using

Модуль формы F7 – перейти из конструктора к коду формы using System;
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(); }
}
}

библиотеки

пространство имён

конструктор

Слайд 98

Модуль формы

public partial class Form1: Form
{
public Form1()
{
InitializeComponent();

Модуль формы public partial class Form1: Form { public Form1() { InitializeComponent();
}
}

открытый класс

частичное описание

наследник класса Form

начальные установки

Слайд 99

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace Project1
{
static class Program {

Основная программа using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; namespace Project1
static void Main() {
...
Application.Run ( new Form1() );
}
}
}

библиотеки

статический класс

создание формы

запуск цикла обработки сообщений

Слайд 100

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

Name – имя формы
Size.Width – ширина
Size.Height – высота
Text – текст в

Свойства формы Name – имя формы Size.Width – ширина Size.Height – высота
заголовке окна
BackColor – цвет фона
Font – шрифт надписей

MainForm

Слайд 101

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

2×ЛКМ: создать обработчик

FormClosing: форма закрывается

События

Обработчик событий 2×ЛКМ: создать обработчик FormClosing: форма закрывается События

Слайд 102

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

private void MainForm_FormClosing (
object sender,
FormClosingEventArgs e )
{
}

закрытый

Обработчик события private void MainForm_FormClosing ( object sender, FormClosingEventArgs e ) {
метод класса MainForm

название обработчика

общий предок всех объектов

кто послал сообщение

дополнительные данные о событии

Слайд 103

private void MainForm_FormClosing (
object sender, FormClosingEventArgs e)
{
DialogResult res;

private void MainForm_FormClosing ( object sender, FormClosingEventArgs e) { DialogResult res; res
res = MessageBox.Show (
"Вы действительно хотите выйти из программы?",
"Подтверждение",
MessageBoxButtons.YesNo, MessageBoxIcon.Question
);
if ( res == DialogResult.No )
e.Cancel = true;
}

тип: результат диалога

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

Метод MessageBox.Show:

нажали «Нет», отменить закрытие

Слайд 104

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

сообщение пользователю
заголовок окна
тип запроса MessageBoxIcon
Error ошибка
Warning предупреждение
Information информация
Question вопрос
набор (множество) кнопок

Параметры MessageBox.Show сообщение пользователю заголовок окна тип запроса MessageBoxIcon Error ошибка Warning
MessageBoxButtons:
YesNo «Да», «Нет»
YesNoCancel «Да», «Нет», «Отмена»
OK «OK»
OKCancel «ОК», «Отмена»

Слайд 105

§ 53. Использование компонентов

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

§ 53. Использование компонентов Объектно-ориентированное программирование. Языки C++ и C#

Слайд 106

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

Стандартные

Контейнеры

Диалоги

Панель компонентов Стандартные Контейнеры Диалоги

Слайд 107

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

панель
Panel

выключатель
CheckBox

рисунок
PictureBox

кнопка
Button

Просмотр рисунков панель Panel выключатель CheckBox рисунок PictureBox кнопка Button

Слайд 108

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

Файл – Создать проект – Приложение Windows Forms

Name → MainForm
Text →

Настройка формы Файл – Создать проект – Приложение Windows Forms Name →
Просмотр рисунков

Слайд 109

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

панель Panel

Dock = Top

Верхняя панель панель Panel Dock = Top

Слайд 110

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

кнопка
Button

выключатель
CheckBox

Name = OpenBtn
Text = Открыть файл

Name = SizeCB
Text = По

Кнопка и выключатель кнопка Button выключатель CheckBox Name = OpenBtn Text =
размерам окна

Слайд 111

Компонент PictureBox

рисунок
PictureBox

Name = Image
Dock = Fill

Компонент PictureBox рисунок PictureBox Name = Image Dock = Fill

Слайд 112

Выбор файла

Name = OpenDlg

выбор рисунка
OpenFileDialog

Выбор файла Name = OpenDlg выбор рисунка OpenFileDialog

Слайд 113

Выбор файла

if ( OpenDlg.ShowDialog() == DialogResult.OK )
Img.Image = new Bitmap (OpenDlg.FileName);

если

Выбор файла if ( OpenDlg.ShowDialog() == DialogResult.OK ) Img.Image = new Bitmap
файл выбран

имя файла

2×ЛКМ

Слайд 114

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

2×ЛКМ

if ( SizeCB.Checked )
Img.SizeMode = PictureBoxSizeMode.Zoom;
else Img.SizeMode = PictureBoxSizeMode.Normal;

Масштабирование 2×ЛКМ if ( SizeCB.Checked ) Img.SizeMode = PictureBoxSizeMode.Zoom; else Img.SizeMode = PictureBoxSizeMode.Normal;

Слайд 115

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

для веб-страниц

метка rgbLabel
Label

панель rgbPanel
Panel

поле ввода rEdit
TextBox

поле ввода bEdit
TextBox

поле ввода

Ввод и вывод данных для веб-страниц метка rgbLabel Label панель rgbPanel Panel
gEdit
TextBox

Слайд 116

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

выделить все три (+Shift)

2×ЛКМ

Обновление компонентов вывода выделить все три (+Shift) 2×ЛКМ

Слайд 117

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

private void rEdit_TextChanged ( object sender, EventArgs e )
{

Обновление компонентов вывода 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 знака

Слайд 118

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

private void MainForm_Load (
object sender, EventArgs e )

Вызов при запуске private void MainForm_Load ( object sender, EventArgs e )

{
rEdit_TextChanged ( rEdit, e );
}

private void MainForm_Load (
object sender, EventArgs e )
{
rEdit_TextChanged ( null, null );
}

пустой объект

вызывающий объект – rEdit (здесь – всё равно!)

Слайд 119

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

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

Слайд 120

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

try
{
// «опасные» команды
}
catch
{
// обработка ошибки
}

попытаться выполнить

если исключение

Обработка ошибок try { // «опасные» команды } catch { // обработка
(аварийная ситуация)

Слайд 121

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

try {
r = Int32.Parse ( rEdit.Text );
g = Int32.Parse

Обработка ошибок try { r = Int32.Parse ( rEdit.Text ); g =
( 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 = "?";
}

rgbLabel.Text = "?";

если ошибка, записать "?"

Слайд 122

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

private void rEdit_KeyPress (
object sender, KeyPressEventArgs e )
{

Блокирование неверных символов private void rEdit_KeyPress ( object sender, KeyPressEventArgs e )
if ( ! ( Char.IsDigit(e.KeyChar) ||
e.KeyChar == (char) 8) )
e.Handled = true;
}

Backspace

выделить все три (+Shift)

обработка завершена

это цифра

Слайд 123

Задание

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

Задание «A»: Постройте программу, которая вычисляет площадь комнаты. Требования: размер окна нельзя
попытке закрыть окно выдаётся запрос на подтверждение
площадь пересчитывается сразу же, как только изменяются значения длины или ширины комнаты
если длина или ширина отрицательны или не числа, вместо площади выводится знак вопроса

Слайд 124

Задание

«B»: Постройте программу, которая вычисляет площадь стен комнаты и определяет, сколько рулонов

Задание «B»: Постройте программу, которая вычисляет площадь стен комнаты и определяет, сколько
обоев нужно на оклейку всех стен. Количество рулонов – целое число. Остальные требования такие же, как в варианта «А».

Слайд 125

Задание

«С»: Доработайте программу так, чтобы по щелчку по кнопке «Сохранить» все данные

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

Слайд 126

§ 54. Совершенствование компонентов

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

§ 54. Совершенствование компонентов Объектно-ориентированное программирование. Языки C++ и C#

Слайд 127

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

Задача: построить поле для ввода целых чисел, в котором

есть защита

Новый класс (модуль) Задача: построить поле для ввода целых чисел, в котором
от ввода неверных символов
есть методы для чтения/записи целого числа

class IntTextBox: TextBox
{
}

Проект – Добавить класс

using System.Windows.Forms;

там объявлен TextBox

Слайд 128

Обработчик KeyPress

class IntTextBox: TextBox
{
protected override void OnKeyPress (
KeyPressEventArgs e )

Обработчик KeyPress class IntTextBox: TextBox { protected override void OnKeyPress ( KeyPressEventArgs
{
if ( !(Char.IsDigit(e.KeyChar) ||
e.KeyChar == (char)8) )
e.Handled = true;
base.OnKeyPress(e);
}
}

только для наследников

перекрыть метод базового класса

base.OnKeyPress(e);

вызвать метод базового класса

Слайд 129

Свойство Value

class IntTextBox: TextBox
{
...
public int Value
{
set

Свойство Value class IntTextBox: TextBox { ... public int Value { set
{ Text = value.ToString(); }
get {
try { return Int32.Parse(Text); }
catch { return 0; }
}
}
}

общедоступное свойство

число в строку

из строки в число

Слайд 130

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

private void decEdit_TextChanged (
object sender, EventArgs

Поле для ввода целых чисел private void decEdit_TextChanged ( object sender, EventArgs
e )
{
hexLabel.Text =
decEdit.Value.ToString ( "X" );
}

Использование:

метка hexLabel
Label

поле ввода decEdit
IntTextBox

свойство

в шестнадцатеричную

Слайд 131

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

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

§ 55. Модель и представление Объектно-ориентированное программирование. Языки C++ и C#

Слайд 132

решение

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

Задача: повторное использование написанного ранее готового кода.

решение

решение Еще одна декомпозиция Задача: повторное использование написанного ранее готового кода. решение

Слайд 133

решение

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

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

решение Модель и представление Задача: хранить и использовать данные об изменении курса доллара.

Слайд 134

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

Задача: вычисление арифметического выражения:

целые числа
знаки арифметических действий + - *

Модель и представление Задача: вычисление арифметического выражения: целые числа знаки арифметических действий
/

Модель:

символьная строка
алгоритм вычисления:

k = номер последней операции
n1 = значение левой части
n2 = значение правой части
результат = операция(n1, n2)

функция LastOp (глава 6)

Слайд 135

Модель

k = номер последней операции
if ( k < 0 )
результат:= строка

Модель k = номер последней операции if ( k результат:= строка в
в число
else {
n1 = значение левой части
n2 = значение правой части
результат = операция(n1, n2)
}

Псевдокод:

Слайд 136

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

static class Calculator
{
static int Priority (

Статический класс – набор функций static class Calculator { static int Priority
char op ) {
...
}
static int LastOp ( string s ) {
...
}
public static int Calc ( string s ) {
...
}
}

Проект – Добавить класс

приоритет операции

последняя операция

вычислить

Слайд 137

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

int Priority ( char op )
{
switch ( op )

Модель: приоритет операций int Priority ( char op ) { switch (

{
case '+':
case '-': return 1;
case '*':
case '/': return 2;
}
return 100;
}

Слайд 138

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

int LastOp ( string s )
{
int i, minPrt,

Модель: номер последней операции int LastOp ( string s ) { int
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;
}

<=

вернёт номер символа

Слайд 139

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

public static int Calc(string s)
{
int k, n1, n2, res

Модель: вычисления public static int Calc(string s) { int k, n1, n2,
= 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;
}

Слайд 140

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

многострочное поле TextBox

выпадающий список ComboBox

Name = Answers
Dock = Fill
ReadOnly = True
Multiline =

Представление многострочное поле TextBox выпадающий список ComboBox Name = Answers Dock =
True

Name = Input
Dock = Top

if ( нажата клавиша Enter )
{
x = значение выражения
добавить результат в конец поля вывода
if ( выражения нет в списке )
добавить его в список
}

Слайд 141

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

private void Input_KeyPress (
object sender, KeyPressEventArgs

Перехват нажатия на клавишу Enter private void Input_KeyPress ( object sender, KeyPressEventArgs
e )
{
if ( e.KeyChar == (char)13 )
{
...
}
}

KeyPress для элемента Input:

if ( e.KeyChar == (char)13 )
{
...
}

код клавиши Enter

Слайд 142

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

int x;
x = Calculator.Calc(
Input.Text);

Вычисления (обращение к модели):

Answers.Text +=

Обработка и вывод данных int x; x = Calculator.Calc( Input.Text); Вычисления (обращение
Input.Text + "=" +
x.ToString() + "\r\n";

Добавление строки в TextBox:

добавить строку

число в строку

новая строка

Слайд 143

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

int i = Input.FindString(Input.Text);
if ( i < 0 )

Обработка и вывод данных int i = Input.FindString(Input.Text); if ( i Input.Items
Input.Items .Insert ( 0, Input.Text );

Добавление строки в ComboBox:

Input.Items

вставить строку

найти индекс строки

массив строк в ComboBox

позиция списка

что вставлять

Слайд 144

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

private void Input_KeyPress (
object sender, KeyPressEventArgs

Перехват нажатия на клавишу Enter 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);
}
}

KeyPress для элемента Input:

Слайд 145

Задание

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

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

Слайд 146

Задание

«B»: Измените программу так, чтобы она могла вычислять значения выражений со скобками.

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

Слайд 147

Задание

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

Задание «С»: Измените программу так, чтобы она могла вычислять значения выражений, содержащих
функций abs, sin, cos, sqrt.

Слайд 148

Задание

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

Задание «D»: Измените программу так, чтобы при вводе неверного выражения выводилось сообщение
ошибке.

Все результаты вычислений и сообщения об ошибках записываются в файл results.txt:

...
sin(1.2)*sqrt(1.7)=1.215230290196084
Неверное выражение sin(1.2)*sqrt(1.7)qwe

Оформите процедуру записи в файл как метод log класса формы.

Слайд 149

Калькулятор

Калькулятор

Слайд 150

Конец фильма

ПОЛЯКОВ Константин Юрьевич
д.т.н., учитель информатики
ГБОУ СОШ № 163, г. Санкт-Петербург
kpolyakov@mail.ru
ЕРЕМИН

Конец фильма ПОЛЯКОВ Константин Юрьевич д.т.н., учитель информатики ГБОУ СОШ № 163,
Евгений Александрович
к.ф.-м.н., доцент кафедры мультимедийной дидактики и ИТО ПГГПУ, г. Пермь
eremin@pspu.ac.ru
Имя файла: Объектно-ориентированное-программирование.-Языки-C++-и-C#.pptx
Количество просмотров: 44
Количество скачиваний: 0