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

Содержание

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

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

Объекты и классы
§ 48. Создание объектов в программе
§ 49. Скрытие внутреннего устройства
§ 50. Иерархия классов
§ 51. Программы с графическим интерфейсом
§ 52. Программирование в § 52. Программирование в RAD-§ 52. Программирование в RAD-средах
§ 53. Использование компонентов
§ 54. Совершенствование компонентов
§ 55. Модель и представление






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


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

еще в древности придумало способ управления сложными системами: «разделяй и властвуй»».

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

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

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


Слайд 4Как мы воспринимаем объекты?
существенные свойства

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

отличающих его от других объектов.

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

свойствами и поведением, но его внутреннее устройство скрыто от других объектов.


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


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


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

которые они могут выполнять)

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

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

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

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


Слайд 8Модель дороги с автомобилями
Объект «Дорога»:

методы (поведение)
свойства
(состояние)
название класса


Слайд 9Модель дороги с автомобилями
Объект «Машина»:

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

постоянна
на каждой полосе – одна машина
если машина выходит за правую границу дороги, вместо нее слева появляется новая машина


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


Слайд 10Модель дороги с автомобилями
Взаимодействие объектов:


узнать длину

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

выполнять
связи (обмен данными) между объектами

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


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


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

описание группы объектов с общей структурой и поведением

Класс

Данные

Методы

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

состояние

поведение

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



Слайд 13Класс «Дорога»
class TRoad
{
float Length;
int Width;
};
Объявление класса:
Объявление переменной (создание

объекта):

TRoad road;

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

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

private


ошибка


Слайд 14Класс «Дорога»
class TRoad
{
public:
float Length;
int Width;
};
Объявление класса:
main()


{
TRoad road;
road.Length = 60; // работает!
road.Width = 3; // работает!
}

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

public:



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

этого класса.

TRoad road;

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

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

«мусор»


Слайд 16Новый конструктор
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 width0 );
};

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

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

Вызов:

TRoad road ( 60, 3 );




Слайд 18Защита от неверных данных
TRoad::TRoad ( float length0, int width0 )
{
if

( length0 > 0 )
Length = length0;
else Length = 1;
if ( width0 > 0 )
Width = width0;
else Width = 1;
}

Слайд 19Значения параметров по умолчанию
class TRoad
{
public:
...
TRoad

( float length0, int width0 = 3 );
};

Вызов:

TRoad road ( 60 );

= 3

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


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

width = 3


Слайд 20Класс «Машина»
class TCar
{
public:
float X, V;

int P;
TRoad *Road;
void move();
TCar (); // конструктор без параметров
TCar ( TRoad *road0, int p0, float v0 );
};

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

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

полоса


Слайд 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;
}


Слайд 22Класс «Машина»: метод move
void TCar::move()
{
X = X + V;


if ( X > Road->Length ) X = 0;
}

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


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


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

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


Слайд 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++ )
cars[i].move();
}
while ( !kbhit() );

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

#include



Слайд 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();

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

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


Слайд 25Что в этом хорошего и плохого?
основная программа – простая и понятная
классы

могут разрабатывать разные программисты независимо друг от друга (+интерфейс!)
повторное использование классов

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

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


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


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


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

корректность
изменение устройства с сохранением интерфейса

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


Слайд 28class TPen
{
private:
string FColor;
public:
string getColor

();
void setColor ( string newColor );
};

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

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

R

G

B

Field – поле

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

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


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


Записать значение:

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

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


Слайд 30Пример: класс «перо»
Использование:
TPen pen;
pen.setColor ( "FFFF00" );
cout

" << pen.getColor();

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

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

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


нельзя в C++


Слайд 31Изменение внутреннего устройства
class TPen
{
private:
int FColor;


public:
string getColor();
void setColor( string newColor );
};

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

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

int

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


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



записываем в поток число в

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

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

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

stringstream s;
s << hex << FColor;

"0000FF"

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

16711935

"FF00FF"


Слайд 33string TPen::getColor()
{
stringstream s;
s


<< hex << FColor;
return s.str();
}

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

#include
#include

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

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

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

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


Слайд 34Преобразования hex → int
void TPen::setColor ( string newColor )
{
stringstream s;

if ( newColor.length()!= 6 )
FColor = 0; // чёрный цвет
else {
s << newColor;
s >> hex >> FColor;
}
}

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



16711935

"FF00FF"


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

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

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

читаем число


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

имитирующий обращение к его внутренней переменной.

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

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

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

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

вызов pen.setColor

вызов pen.getColor


Слайд 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;


Слайд 37Свойства в C#
Защита от неверного ввода данных:
public string color
{
get

{ return FColor; }
set
{
if ( value.Length != 6 )
FColor = "000000";
else FColor = value;
}
}

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


Слайд 38Свойства в C#
Изменение внутреннего устройства:
class TPen
{
private int FColor;
public string

color
{
get {
return FColor.ToString ( "X6" );
}
set {
FColor = Convert.ToInt32(value, 16);
}
}
}

в строку

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

в целое

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

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


Слайд 39Свойство «только для чтения»
class TCar {
private:
double Fv;


public:
double getV() { return Fv; }
};

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

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

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

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


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

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


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


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

Яблоко
Груша
Банан
Апельсин
базовый

класс

Фрукт

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

это фрукт, у которого…


Слайд 43Что такое наследование?
класс Двудольные
семейство Бобовые

род Клевер
горный клевер




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

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

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

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

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

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

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




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


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

Логический элемент
с одним входом
с двумя входами
НЕ
Объектно-ориентированное программирование – это

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

Слайд 45Базовый класс
class TLogElement
{
public:
bool In1, In2, Res;

void calc();
};

можно моделировать элементы с памятью (триггеры)

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


Слайд 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; }
};

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


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

при изменении входа

void TLogElement::calc()
{
}

заглушка


Слайд 48Что такое полиморфизм?
греч.: πολυ — много, μορφη — форма
Полиморфизм – это

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

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

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


Слайд 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; }
};

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

virtual

= 0;


Слайд 50Базовый класс
class TLogElement
{
protected:
bool FRes;
virtual void

calc()= 0;
bool getIn2() { return Fin2; }
void setIn2 ( bool newIn2 );
...
};

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

virtual

= 0;

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

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

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


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

реализуется в классе.

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

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

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

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


Слайд 52Элемент «НЕ»
class TNot: public TLogElement
{
protected:
void

calc();
};

void TNot::calc()
{
FRes =!getIn1();
}

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

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


Слайд 53Элемент «НЕ»
TNot n;
n.setIn1 ( false );
cout

результата


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

TLogElement::getIn2;
};

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

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

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

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


Слайд 55Элементы с двумя входами
class TAnd: public TLog2In
{
protected:
void

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

элемент «И»

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


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


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

элемент «И»

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

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


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


}

В базовом классе:

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

virtual


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

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

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

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


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

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


Слайд 59Пример: элемент «И-НЕ»
main()
{
TNot elNot;
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;
}
}
}

Слайд 60Модульность
class TLogElement
{ … }
class TLog2In: public TLogElement
{ … }
class

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

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

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


Слайд 61Модульность
void TLogElement::setIn1 ( bool newIn1 )
{ ... }
void TLogElement::setIn2 ( bool

newIn1 )
{ ... }
void TNot::calc()
{ ... }
void TAnd::calc()
{ ... }
void TOr::calc()
{ ... }

#include

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

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

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

#include


Слайд 62Сообщения между объектами
class TLogElement
{
private:
TLogElement *FNextEl;
int

FNextIn;
...
public:
void Link ( TLogElement *nextElement,
int nextIn = 1 );
};

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

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


Слайд 63Сообщения между объектами
void TLogElement::Link(
TLogElement *nextElement,
int

nextIn )
{
FNextEl = nextElement;
FNextIn = nextIn;
}

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


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

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

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

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

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


Слайд 65Сообщения между объектами
TLogElement::TLogElement()
{
FNextEl = NULL;


}

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


Слайд 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());
...
}
}

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

elAnd.Link ( &elNot );

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

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


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


Слайд 68Интерфейс: объекты и сообщения
поле ввода

кнопка

флажок

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

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

данными, посылая друг другу сообщения.

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

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


Слайд 69Классические программы


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


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

в другое.

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


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


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


Слайд 72Что такое RAD-среда?
RAD = Rapid Application Development — быстрая разработка приложений
создание

формы
минимальный код добавляется автоматически
расстановка элементов интерфейса с помощью мыши и настройка их свойств
создание обработчиков событий
написание алгоритмов обработки данных

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

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

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


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


Слайд 74RAD-среды: MS Visual Studio
Языки: Visual Basic, Visual C++, Visual C#, Visual

F#

c 1995 по н.в.: Microsoft


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


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


Слайд 77Visual Studio Express (C#)
http://www.visualstudio.com/ru-ru/products/visual-studio-express-vs.aspx


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


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

Language Runtime

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

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

Linux – проект Mono


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

программы.

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

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

Program.cs

Form1.Designer.cs

Form1.cs

my.exe



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

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

ресурсы

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

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


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

формы

Структура проекта


Слайд 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(); }
}
}

библиотеки

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

конструктор


Слайд 82Модуль формы
public partial class Form1: Form
{
public Form1()
{


InitializeComponent();
}
}

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

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

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

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


Слайд 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() );
}
}
}

библиотеки

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

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

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


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

в заголовке окна
BackColor – цвет фона
Font – шрифт надписей

MainForm


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


Слайд 86Обработчик события
private void MainForm_FormClosing (
object

sender,
FormClosingEventArgs e )
{
}

закрытый метод класса MainForm

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

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

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

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


Слайд 87private void MainForm_FormClosing (
object sender, FormClosingEventArgs e)
{
DialogResult

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

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

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

Метод MessageBox.Show:




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



Слайд 88Параметры MessageBox.Show
сообщение пользователю
заголовок окна
тип запроса MessageBoxIcon
Error ошибка
Warning предупреждение
Information информация
Question вопрос
набор

(множество) кнопок MessageBoxButtons:
YesNo «Да», «Нет»
YesNoCancel «Да», «Нет», «Отмена»
OK «OK»
OKCancel «ОК», «Отмена»






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


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


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


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

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

Слайд 93Верхняя панель
панель Panel
Dock = Top


Слайд 94Кнопка и выключатель
кнопка
Button
выключатель
CheckBox
Name = OpenBtn
Text = Открыть файл
Name = SizeCB
Text =

По размерам окна




Слайд 95Компонент PictureBox
рисунок
PictureBox
Name = Image
Dock = Fill


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


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

(OpenDlg.FileName);

если файл выбран

имя файла

2×ЛКМ


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

= PictureBoxSizeMode.Normal;

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

ввода gEdit
TextBox

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


Слайд 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 знака


Слайд 102Вызов при запуске
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 (здесь – всё равно!)


Слайд 103Обработка ошибок


Слайд 104Обработка ошибок
try
{
// «опасные» команды
}
catch
{
// обработка ошибки
}
попытаться выполнить
если

исключение (аварийная ситуация)

Слайд 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 = "?";
}

rgbLabel.Text = "?";

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


Слайд 106Блокирование неверных символов
private void rEdit_KeyPress (
object sender, KeyPressEventArgs

e )
{
if ( ! ( Char.IsDigit(e.KeyChar) ||
e.KeyChar == (char) 8) )
e.Handled = true;
}

Backspace

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

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

это цифра


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


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

защита от ввода неверных символов
есть методы для чтения/записи целого числа

class IntTextBox: TextBox
{
}

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

using System.Windows.Forms;

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


Слайд 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);
}
}

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

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

base.OnKeyPress(e);

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


Слайд 110Свойство Value
class IntTextBox: TextBox
{

...
public int Value
{

set { Text = value.ToString(); }
get {
try { return Int32.Parse(Text); }
catch { return 0; }
}
}
}

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

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

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


Слайд 111Поле для ввода целых чисел
private void decEdit_TextChanged (

object sender, EventArgs e )
{
hexLabel.Text =
decEdit.Value.ToString ( "X" );
}

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

метка hexLabel
Label

поле ввода decEdit
IntTextBox


свойство

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



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


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


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


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

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

* /

Модель:

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

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


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


Слайд 116Модель

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

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


Псевдокод:


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

static class Calculator
{

static int Priority ( char op ) {
...
}
static int LastOp ( string s ) {
...
}
public static int Calc ( string s ) {
...
}
}


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

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

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

вычислить


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

int Priority ( char op )
{
switch ( op

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



Слайд 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;
}

<=

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


Слайд 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;
}



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

= True

Name = Input
Dock = Top

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


Слайд 122Перехват нажатия на клавишу Enter
private void Input_KeyPress (

object sender, KeyPressEventArgs e )
{
if ( e.KeyChar == (char)13 )
{
...
}
}

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

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

код клавиши Enter


Слайд 123Обработка и вывод данных
int x;
x = Calculator.Calc(

Input.Text);

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

Answers.Text += Input.Text + "=" +
x.ToString() + "\r\n";

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

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

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



новая строка


Слайд 124Обработка и вывод данных
int i = Input.FindString(Input.Text);
if ( i < 0

)
Input.Items .Insert ( 0, Input.Text );

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

Input.Items

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

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



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

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

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


Слайд 125Перехват нажатия на клавишу 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:


Слайд 126Калькулятор


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

ЕРЕМИН Евгений Александрович
к.ф.-м.н., доцент кафедры мультимедийной дидактики и ИТО ПГГПУ, г. Пермь
eremin@pspu.ac.ru

Слайд 128Источники иллюстраций
www.picstopin.com
maugav.info
yoursourceisopen.com
ru.wikipedia.org
иллюстрации художников издательства «Бином»
авторские материалы


Обратная связь

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

Email: Нажмите что бы посмотреть 

Что такое ThePresentation.ru?

Это сайт презентаций, докладов, проектов, шаблонов в формате PowerPoint. Мы помогаем школьникам, студентам, учителям, преподавателям хранить и обмениваться учебными материалами с другими пользователями.


Для правообладателей

Яндекс.Метрика