- •2. Основные понятия объектно-ориентированного программирования 7
- •3. Управляемый и неуправляемый код и данные 17
- •3.3 Управляемый и неуправляемый код и данные 17
- •5. Классы 38
- •6. Наследование классов и интерфейсы 49
- •7. Программа ввода/вывода информации 62
- •8. Управляемые данные и их использование 76
- •Предисловие
- •2.Основные понятия объектно-ориентированного программирования
- •2.1 Объекты
- •2.2Классы
- •Пример 2.2.2. Создание и использование объектов.
- •2.3Объекты, классы и uml
- •2.4Основные свойства объектно-ориентированного программирования
- •Пример 2.4.1. Класс cColBall, наследуемый класс cBall.
- •Пример 2.4.2. Использование функций объектов.
- •2.5Библиотеки классов
- •3.Управляемый и неуправляемый код и данные
- •3.1Виртуальная машина языка Java
- •3.2Общеязыковая среда выполнения clr платформы .Net
- •3.3Управляемый и неуправляемый код и данные
- •3.4Сборщик мусора
- •3.5Ссылочные типы и типы-значения
- •3.6Метаданные
- •3.7Библиотеки, пакеты и пространства имён
- •4.1О типах данных
- •4.2Консольный ввод и вывод
- •Void main (void)
- •Import java.Io.*;
- •Int X; // Целочисленная переменная X
- •4.3Объявление переменных
- •4.4Операторы динамического распределения памяти new и delete
- •Int X; // Выделить память в стеке
- •Пример 4.4.2. Использование оператора new в языках Java и c#.
- •Import java.Io.*;
- •Int X; // Выделить память в стеке для переменной
- •Int X; // Выделить память в стеке для переменной
- •4.5 Массивы
- •Пример 4.5.2. Описание одномерных массивов на изыках Java и c#.
- •Пример 4.5.4. Создание массивов объектов на языке Java.
- •Import java.Io.*;
- •4.6Объявления структур и перечислений
- •4.7Ссылки
- •Пример 4.7.1. Использование ссылочной переменной.
- •Void main()
- •4.8Перегрузка функций
- •Пример 4.8.1. Перегруженные функции swap (int &, int &) и swap (bool &,bool &).
- •Void swap (int &a, int &b) // Целочисленные параметры
- •Void swap (bool &a, bool &b) // Булевские параметры
- •4.9Объявление функций и передача аргументов по умолчанию
- •Void swap (int &, int &);
- •Void swap (char 8t, char &);
- •Пример 4.9.1. Задание значений параметров функции по умолчанию.
- •Void main ( )
- •5.Классы
- •5.1Определение класса
- •Пример 5.1.1. Описание класса и создание его объектов.
- •Int X; // Закрытая переменная X
- •Void Show ( ) // Открытая функция
- •Int X; // Закрытая (по умолчанию) переменная X
- •Void Show ( ) // Открытая функция
- •Пример 5.2.1. Описание функций вне класса.
- •Int X; //Закрытая переменная х
- •Void Set(int m,char n); // 0бъявление функции Set
- •Void Show (); // Объявление функции Show()
- •5.3Некоторые замечания о классах
- •Пример 5.3.1. Области видимости.
- •Int GetK() {return k;} // Функция GetK() видна в файле, классе а и в
- •Int n; // Переменная n закрыта и видна только в классе а
- •Int GetM () {return n;} // Функция GetM() открыта и видна
- •5.4Объекты в объектах
- •Пример 5.4.1. Объект содержит объект другого класса.
- •Void Show ()
- •Void Show ()
- •5.5Специальный вид функций класса - конструкторы и деструкторы
- •Пример 5.5.1. Перегруженные конструкторы.
- •Int GetX() {return X;} // Возвратить значение закрытой переменной
- •Void ShowX () // Вывести значение переменной
- •5.6Статические функции класса
- •Пример 5.6.1. Статические функции.
- •Void f() {Console::WriteLine("f()");} // Обычная функция
- •Int main() // Главная статическая функция Main()
- •6.Наследование классов и интерфейсы
- •6.1Об интерфейсах
- •Пример 6.2.1. Программа, использующая порождение public.
- •Void Show ()
- •Void Show()
- •Int main() // Главная статическая функция
- •6.4Использование конструктора базового класса
- •Java и j#
- •Java и j#
- •Пример 6.4.1. Выполнение конструкторов.
- •Int X; // Закрытая переменная X
- •Int Get() {return X;} // Получить значение X
- •Int main() // Главная статическая функция main()
- •6.5Сокрытые переменные, функции и их использование
- •Пример 6.5.1. Сокрытые переменные и функции.
- •6.6Интерфейсы
- •6.6.1Определение интерфейса
- •Interface class имя-интерф [ : public имя-базов-интерф
- •Interface имя-интерф [ : имя-базов-интерф [, имя-базов-интерф ] ... ]
- •Interface имя-интерф [ extends имя-базов-интерф
- •Interface Ipe // Интерфейс, объявляющий свойство p и функцию Hallo
- •Int p {set; get;} //Объявить свойство
- •Void Hallo(); // Объявить функцию
- •6.6.2Базовые интерфейсы
- •6.7 Упаковка и распаковка типов данных
- •Int main() // Главная статическая функция main()
- •7.Программа ввода/вывода информации
- •7.1Постановка задачи
- •Диаграмма вариантов использования
- •7.2 Диаграмма классов
- •7.3Диаграмма последовательности
- •7.4Диаграмма видов деятельности
- •Пример 7.5.1. Реализация класса cComputer.
- •Пример 7.5.2. Реализация класса cShop.
- •Пример 7.5.3. Реализация класса cData.
- •Void main()
- •Пример 7.5.4. Реализация Inf-приложения.
- •Void main()
- •7.6Реализация Inf-приложения иа языке c# Пример 7.6.1. Реализация Inf-приложения иа языке c#.
- •Int cost; // Стоимость компьютера
- •Int year; // Год изготовления
- •Inf.Enter();
- •Inf.Enter();
- •Inf.Show();
- •8.Управляемые данные и их использование
- •Void set(тип value)
- •Пример 8.1.2. Свойства в Java.
- •Import java.Io.*;
- •Пример 8.2.1. Создание и использование делегата.
- •Void main() // Главная функция программы
- •Пример 8.2.2. Использование делегата как параметра функции.
- •Void r(void) {Console::WriteLine ("r");}
- •Void main () // Главная функция программы
- •Void имя-функции ( void );
- •Пример 8.3.1. Событие и делегат.
- •Void main ()
- •Vold имя-функции-активизации()
- •Пример 8.3.2. Использование события.
- •Void GenerateEv() // Функция-генератор события
- •Void main()
- •Void GenerateEv (String л str) // Функция- генератор события
- •Void main ( )
- •06BeKTfirst клaccaUseEvпoлyчилcoбытиe one
- •Interface iEv
- •IE,HandlerEv (); // Выполнить обработчик
- •Void GenerateEv ( ) // Сгенерировать событие
- •Void main (void)
- •V{ oid FireConnectEvent (object sender, SourceEventArgs e)
- •Void FireConnectEvent (object sender, EventArgs args)
- •8.4. Уведомления и события в Java
- •8.4.1. Уведомления в Java
- •Void notifyObservers () - уведомить всех обозревателей данного наблюдаемого
- •Void notifyObservers (Object obj) - уведомить всех обозревателей данного на-
- •Void update(Observable observable. Object obj) - эта функция данного объекта
- •Import java.Util.*;
- •II Два наблюдателя и один наблюдаемый объект
- •Importjava.Util.*;
- •Importjava.Utll,*;
- •Importjava.Util.*;
- •Int num; // Номер уведомляющего объекта
- •8.4.2. События в Java
- •Import java.Utii.*;
- •Void DatePerformed (DataDate dd); // Обработчик
- •Int n; // Номер объекта-приёмника
- •Int num; // Номер объекта приёмника
- •Import cJHappenListerner.*;
- •Importjava.Uti).*;
- •Void performedHappen (HappenData hD);
- •Import cJHappenListerner.*; | | Импортировать библиотеку
- •9. Потоки и синхронизация их выполнения
- •9.1. Процессы
- •9.3. Потоки в Java
- •Int num; // Номер потокового объекта
- •2. Поскольку объявленному в классе cThread потоковому объекту thr типа
- •9.4. Потоковый объект, выдающий событие
- •If (lllfe) // Если потоковый объект не функционирует,
- •ImportJava,util.*;
- •If (!life) // Если потоковый объект не функционирует,
- •9.5. Поток получил событие из объекта
- •If (!life)
- •If (received)
- •Importjava.Utll.*;
- •If (lllfe)
- •If (received)
- •9.6. Синхронизация выполнения потоков
- •9.6.1. Операторы lock и synchronized
- •Int num; // Номер объекта
- •9.6.2. Связи между потоками
- •9.6.2.1. Связи меяеду потоками в Java
- •If(waiting)
- •9.6.2.2. Связи между потоками в c#
- •If (I moving)
- •9.6.2.1.1 Наязыке Java, отличаясьтолько применением функций монитора
- •10. Библиотека .Net Framework и библиотеки
- •10.1. Приложение
- •10.2. Классы, объекты и элементы приложения
- •Visual Studio .Net как библиотеки .Net Framework, так и пакетов языка Java
- •10.3. Простейшие приложения
- •Import java.Awt.*;
- •Void main ( )
- •10.3.1.1. Оказывается, класс Form сам наследует множество других классов,
- •10.4. Сообщения Windows, события и делегаты
- •X0.4.1. Обработка событий мыши на языке c#
- •Void OurMouseDown (object sender, MouseEventArgs args);
- •Vold maln ()
- •10.4.3. Обработка событий мыши на языке Java с использо-
- •10.4.4. Связь события с несколькими объектами на языке c#
- •10.5. Ещё раз о событиях и уведомлении в языке Java
- •10.5.1. Обработка событий элементов интерфейса пользовате-
- •ItemListener, KeyListener, MouseListener, MouseMotionListener, TextListener
- •10.5.2. Обработка событий мыши на языке Java, используя
- •Importjava.Awt.Event.*;
- •Importjava.Awt.*;
- •Import java.Awt.Event.*;
- •Importjava.Awt.*;
- •Import java.Awt.Event.*;
- •10.5.3. Обработка событий мыши на языке Java, используя классы адап-
- •Importjava.Awt.*;
- •Importjava.Awt.Event.*;
- •Importjava.Awt.*;
- •Importjava.Awt.Event.*;
- •10.5.4. Обработка событий мыши на языке Java, используя внутренние
- •Import java.Awt.*;
- •Import java.Awt.Event.*;
- •Importjava.Awt.*;
- •Import java.Awt.Event.*;
- •10.5.5. Обработка события закрытия окна
- •Import java.Awt.*;
- •Import java.Awt.Event.*;
- •10.6. Графика
- •10.6.1. Графические объекты
- •15, 15, 60, 70); // Нарисовать эллипс
- •Vold maln ()
- •10.7. Событие Paint и его обработчик
- •Int len; // Текущая длина массива points
- •Void OurMouseDown (object sender, MouseEventArgs arg)
- •Invalidate ( ); // Перерисовать
- •Int len; // Текущая длина массива points
- •Import java.Awt.Event.*;
- •10.8. Управляющие элементы
- •1 «Button j 1
- •Import java.Awt,event.*;
- •Int n; // Индекс цвета
- •10.8.4,10.8.5 И 10.8.6, а также программа, поэтапно разрабатываемая в разде-
- •Invalidate ();
- •Importjava.Awt.*;
- •Import java.Awt.Event.*;
- •Importjava.Util.*;
- •10.9. Дочерние окна
- •Int n; // Индекс массива colors
- •IiTipOrt jav'a.Avvt. •)
- •Import java.Awt.Event.*;
- •Int n; // Индекс цвета
- •Virtual void OnPaint (PaintEventArgs л arg) override // Перерисовать область
- •10.10.3, В котором вызываются две функции.
- •Importjava.Awt.*;
- •Importjava.Awt.Event.*;
- •It); // Подписать обработчик
- •Void main ( )
- •11.1. Программа с точки зрения пользователя
- •11.2. Объектное представление программы
- •11.3. События, потоки и их синхронизация
- •11.4. Поэтапная разработка программы
- •11.4.1. Первый этап. Разработка класса Warehouse
- •4Cxrt()
- •Int partLoad; // Выгружаемая или загружаемая порция
- •If(full) return false; // Полный грузовик не загружать
- •Invalidate ();
- •Importjava.Awt.*;
- •Importjava,utll.*;
- •Void notifyObs (WarehouseEventArgs arg)
- •Int partLoad; // Получаемая или помещаемая порция груза
- •If (full) return false;
- •If(full) return false; // Полный грузовик не загружать
- •Void Change ( )
- •Invalidate ();
- •Importjava.Awt.*;
- •Importjava.Util.*;
- •Import cjWarehouse.*
- •11.4.2. Второй этап. Разработка классов ContrlRegion и Lorry
- •11.4.2.1, А сам класс представлен в примере 11.4.2.1. Класс ContrlRegion язы-
- •Importjava.Awt.Event.*;
- •Void Work ( ) // Выполнить работу
- •Int number;
- •Int number;
- •Int timePeriod;
- •Int y; // Координата y пути грузовика
- •Invalidate ();
- •11.4.3. Третий этап. Разработка приложения csLorryAndWarehouse
- •4IorryAndWa rho uses()
- •4Main()
- •Int y; // Координата y пути грузовика
- •Invalidate ( );
- •If(lorry.GetFull())
- •If(lorry.GetLeftRight()) g.SetColor(Color.Red);
- •Int numLorry; // Номер грузовика
- •Void But_Run (Object Ло, EventArgs ле)
- •Void main ( )
- •11.4.4. Четвертый этап. Удаление ресурса
- •Int number;
- •If(!lorry.Running)lorry.Run ( );
- •12. Зачетные задачи
- •12.1. Задание 1
- •Importjava.Awt.*;
- •Import Java.Awt.Event.*;
- •Importjava.Util.*;
- •12.2. Задание 2
- •Importjava.Awt.*;
- •Importjava.Awt.Event,*;
- •Importjava.Util.*;
- •Invalidate ( );
- •12.3. Задание 3
- •Importjava.Awt.*;
- •Import java.Awt.Event.*;
- •Importjava.Util.*;
- •If(bool) Start ();
- •If(lrunnlng)
- •Void BallFunc ()
- •Void ThrFunc ( )
- •Vold OnButAdd (object obj, EventArgs arg)
- •Void HandlerEv ( )
- •Invalidate ( );
- •12.4. Задание 4
- •If(reg.R.Contains(p) && !inRect)
- •If(!reg.R,Contains(p) && lnRect)
- •Void OnButAdd (object obj, EventArgs arg)
- •Void HandlerEv ( )
- •Invalidate ();
- •Importjava.Awt.*;
- •Importjava.Awt.Event.*;
- •Importjava.Utll.*;
- •Int w, int h, Color c, Wind wind)
- •If(reg.R.Contains(p) && !lnRect)
- •If(!reg.R.Contains(p) && inRect)
- •If(d.GetDel())
- •13. Ещё о важном в объектно-ориентирован-
- •13.1. Виртуальные функции
- •13.1.1. Преобразование типов
- •Void f ( ) {cout « "ca:: f" « endl;}
- •Void main ( )
- •Void f ()
- •Void main ( )
- •Vold f ( )
- •Vold Do (ca* pCa)
- •Void main ( )
- •13.1.2, Виртуальные функции
- •Virtual void f ( ) {Console::WriteLine ("a:: f");}
- •Void f ( ) {Console::WriteLine ("b:: f");}
- •Void f ( ) {Console::WrlteLlne ("c:: f");}
- •Vold f ( ) {Console::WrlteLlne("b:: f");}
- •Vold Do (a* pA)
- •Void main ()
- •13.1.3. Виртуальные функции, используемые в книге
- •13.2. Абстрактные классы и функции
- •13.2.1. Абстрактные функции
- •13.2.2. Абстрактные классы
- •Void f ( ) {Console::WriteLine ("b:: f");}
- •Vold f ( ) {Console::WriteLine ("d:: f");}
- •Vold main ( )
- •13.2. Нововведения в языке c#
- •13.2.1.Делегаты и события
- •Iorry.Run ( );
- •13.3.2. Статические классы
- •Int partLoad; // Выгружаемая или загружаемая порция
- •If(!full)
- •Invalidate ( );
- •Int number;
- •Int y; // Координата y пути грузовика
- •Iorry.Stop ();
- •If(llorry.Running)lorry.Run ( );
- •Invalidate ( );
- •1) Создать новый проект:
- •Value 28, 30
- •Value type 34
- •Visual Studio .Net и Edipse.
- •420111, Казань, Дзержинского, 3. Тел.: 292-24-76.
If(llorry.Running)lorry.Run ( );
lorry.Dispose ( );
lorry.Finish();
aL.Remove (lorry);
listBox.Items.Remove (lorry.Number);
return;
>
}
>
}
// Потоковая функция перерисовки
private vold ThrPaint ()
{
while (life)
{
// Console.WriteLine ("+++");
Invalidate ( );
Thread.Sleep (150);
>
>
// Завершить поток перерисовки
public void Finish ( )
{
life= false; thread.Join ( );
>
// Обработать кнопку закрытия окна
protected override void OnClosed (EventArgs e)
{
base.OnClosed (e);
IEnumerator lnum= aL.GetEnumerator ();
while (inum.MoveNext ( ))
{
Lorry lorry= (Lorry) inum,Current;
lorry.Finlsh ();
lorry= null;
}
Finish ( );
}
// Перерисовать область клиента прикладного окна
protected override void OnPaint (PaintEventArgs e)
{
base.OnPaint (e);
IEnumerator inum= aL.GetEnumerator ( );
while (inum.MoveNext ( ))
{
Lorry lorry= (Lorry) inum.Current;
e.Graphics.DrawEllipse (new Pen(Color.Blue, 2),
lorry.Point.X - 10, lorry.Point.Y - 10, 20, 20);
if(lorry.Full)e.Graphics.FillElllpse (new
SolldBrush(Color.Blue), lorry.Point.X - 10,
lorry.Polnt.Y - 10, 20, 20);
e.Graphics.DrawString (lorry.Number.ToString ( ),
Font, new SolidBrush (Color.Blue),
lorry.Point.X + 10,
lorry.Point.Y + 10);
if(leftRight)
e.Graphics.FIIIRectangle (new
SolidBrush(Color.Red),240,110,100,10);
else e.Graphics.FIIIRectangle (new
SolidBrush(Color,Green),240,110,100,10)
>
// обработать событие склада
public void EvFromWarehouseHandler (object sender,
WarehouseEventArgs args)
{
WarehouseEventArgs wH= (WarehouseEventArgs) args;
if((lwH.Left && wH.Full)||(wH.Left && wH.Full))
{
lock(this)
{
leftRight= !leftRight;
// Console.WriteLine("leftRight= " + leftRight);
IEnumerator inum= aL.GetEnumerator ( );
while (inum.MoveNext ( ))
{
Lorry lorry= (Lorry) inum.Current;
lorry.LeftRight= leftRight;
>
Invalidate();
>
// Основная функция
static void Main ()
{
Application.Run (new LorryAndWarhouses ( ));
Приложение 2. cjLorryAndWarehouse- приложение
на языке Java(J#)
///////////////
П JdVd
// Приложение с компонентами Lorry, Warehouse, ConrlRegion
// и с управляющими элементами
//
importjava.awt.*;
importJava.util.*;
import java.awt.event.*;
// Класс данных события
public class WarehouseEventArgs
{
private boolean left; // Признак идентификации склада
private boolean full; // Признак заполнения склада
// Конструктор
public WarehouseEventArgs (boolean left, boolean full)
{
this.left= left; thls.full= full;
>
// Свойство заполнения склада
public boolean getFull ( ) {return full;>
// Свойство идентификации склада
public boolean getLeft ( ) {return left;}
>
class beWatched extends Observable // Класс наблюдаемого объекта
{
// Конструктор
public beWatched ( ) { }
void notlfyObs (WarehouseEventArgs arg)
{ setChanged ( ); notifyObservers (arg);}
>
// Класс склада
public class Warehouse extends Panel
{
boolean left; // Признак идентификации склада
lnt allLoad; // Текущий размер груза в складе
lnt PartLoad= 10; // Размер груза грузовика
int partLoad; // Получаемая или помещаемая порция груза
int tlmePeriod= 100; // Время получения или помещения груза
public beWatched bW; // Ссылка на вспомогательный наблюдаемый
// объект
// Конструктор
publicWarehouse (boolean left, boolean full)
{
allLoad= 100;
this.left= left;
if (!full) allLoad= 0; // Склад пуст
bW= new beWatched (); // Наблюдаемый объект склада
// Поместить груз в склад
synchronized public boolean Put (boolean full )
{
if (!full) return false;
if (allLoad >= 100) return false;
// Выгрузить грузовик и увеличить груз склада
partLoad= PartLoad; // Определить выгрузку
change ( );
return true; >
// Получить груз из склада
synchronized public boolean Get (boolean full )
{
if (full) return false;
if (((allLoad) < PartLoad))
{
// Недостаточно груза в складедля загрузки грузовика
WarehouseEventArgs wA= new WarehouseEventArgs
(left, false);
bW.notifyObs (wA); // Уведомить обозревателя
return false;
}
// Загрузить грузовик и уменьшить груз склада
partLoad= -PartLoad; // Определить выгрузку
change ();
return true;
// Поместить или получить груз
public void change ()
{
// Выполнить операцию только с одним грузовиком
synchronized (this) // Критическая секция
>
allLoad += partLoad;
try
{
Thread.sleep (timePeriod);
>
catch (InterruptedExceptlon e) { >
repaint ( );
// Перерисовать размещение груза в складе
public void paint (Graphics g)
{
g.setColor (Color.yellow);
g.drawRect (0, 0, this.getSize().width, this.getSize().height);
g.fillRect (0, this.getSize().height - allLoad, thls.getSize().wldth,
this.getSize().height);
g.setColor (Color.black);
g.drawString (Integer.toString (allLoad), 5, 30);
>
// Класс ContrlRegion
public class ContrlRegion extends Panel
{
// Проконтролировать грузовик
public vold Work ()
{
try
{
Thread.sleep (1000);
>
catch (InterruptedException e){}
>
// Класс Lorry
public class Lorry implements Runnable
{
public int number; // Номер грузовика
public Point p; // Координаты объекта грузовика
lnt dX; // Приращение координаты X
public boolean leftRight; // Направление перемещения груза
ContrlRegion region; // Ссылка на зону контроля
boolean inContrl; // Признак нахождения в зоне контроля
boolean life; // Признак жизни потока
boolean running; // Признак выполнения потока
Thread thr; // Ссылка на объект потока
lnt timePerlod= 100;
Warehouse leftWH;
Warehouse rlghtWH;
// Временной интервал перемещения
// Ссылка на левый склад
// Ссылка на правый склад
Rectangle rect;
boolean full;
// Конструктор
public Lorry (lnt Number, lntY, lnt DX, Warehouse LeftWH,
Warehouse RightWH, ContrlRegion Region)
{
number= Number: dX= -DX; leftRight= true;
leftWH= LeftWH; rightWH= RightWH; full= false;
region= Region; inContrl= false; p= new Point ( );
p.x= leftWH,getLocation().x+leftWH.WIDTH + 50; p.y= Y;
rect= new Rectangle (region.getLocation().x,
region.getLocatlon().y, reg!on.getSize().wldth,
reglon.getSize().height);
running= true; life= true;
// Создать объект потока
thr= newThread (this);
thr.start (); >
// Свойство Number
public int getNumber () {return number;>
// Свойство Point
public Point getPoint ( ) {return p;}
// Свойство LeftRight
public boolean getLeftRight ( )<return leftRight;}
public void setLeftRight (boolean LeftRight) {this.leftRight= LeftRight;}
/p/u Сblвicо йbсoтoвlоe aFnu lgl etFull (){return full;} // Завершить поток
public vold Finish () {life= false;};
public void Stop ( ) // Приостановить поток
synchronized public void Run ( ) // Возобновить поток
{
running= true;
notify();
{
running= false;
}
// Потоковая функция
public void run ( )
{
while (life)
{
try
<
synchronized (this)
{
if(!runnina)
wait (); // Подождать
>
>
catch(InterruptedException e) { >
// Грузовик достиг справа левый склад
if(p.x <= leftWH.getLocation().x+leftWH.WIDTH)
{
//System.out.println ("the left warehouse");
if (leftRight) // Пересылка слева направс
{if(leftWH.Get(full)) full= true;> // Загрузить груз
else
{if(ieftWH.Put(full)) full= false;} // Выгрузить груз
dX= -dX;
>
// Грузовикдостигслева правый склад
if(p.x >= rightWH.getLocatlon().x)
{
//System.out.println ("the right warehouse");
if (leftRight) // Пересылка слева направо
{lf(rightWH.Put(full)) full= false;} // Выгрузить груз
else
{if(rightWH.Get(full)) fuil= true;} // Загрузить груз
dX= -dX;
>
// Обслужить в зоне контроля
//' Вошли в зону контроля
if (rect.contains (p) && !inContrl) // Вошли в зону
{
//System.out.println ("enter In the region");
inContrl= true;
synchronized(region)
{
region.Work ();
if (!rect.contains (p) && inContrl) // Вышли из зоны
{
//System.out.println ("leave the region");
InContrl= false; >
try
{
Thread,sleep (timePeriod);
>
catcn (Interruptedtxception e){}
p.x += dX;
class LorryAndWarehouses extends Frame implements Runnable, Observer
{
Lorry lorry;
Warehouse leftWH;
Warehouse rlghtWH;
ContrlRegion region;
Button butRun, butStop;
Button butAdd, butDel;
Choice choice;
Thread thread;
boolean llfe;
lnt numLorry= 0;
boolean leftRight;
int Y= 20;
Random rand;
ArrayList aL;
// Ссылка нэ объект грузовика
// Ссылка на объект левого склада
// Ссылка на объект правого склада
// Ссылка на объект зоны контроля
// Ссылки на интерфейсные кнопки
// Ссылки на интерфейсные кнопки
// Ссылка на элемент списока
|| Ссылка на объект потока перерисовки
// Признак жизни потока перерисовки
// Номер грузовика
// Признак направления перемещения грузовиков
|f Координата Y пути грузовика
// Ссылка на случайное число
// Ссылка на список объектов грузовиков
// Конструктор
LorryAndWarehouses ( )
{
this.setTitle ("Test"); // Установить заголовок окна
this.setSize (350, 180); // Установить размер окна
this.setLayout (null); // Установить отсутствие менеджера расстановки
this.setBackground (Color.lightGray);
aL= new ArrayList ( ); // Создать объект списка грузовиков
rand= new Random ( ); // Создать случайное число
leftRight= true; // Установить направление "слева направо"
// Создать кнопки
// Создать кнопку "Add" добавления шара
butAdd= new Button ("Add"); // Создать объект кнопки
butAdd.setLocation (240,85); // Разместить в окне
butAdd.setSize (65, 20); // Установить размер кнопки
butAdd.setBackground (Color.lightGray);
thls.add (butAdd); // Добавить кнопку в коллекцию окна
// Подписать обработчик на событие кнопки ""Add"
butAdd.addActionListener (new ActionListener ()
{
public void actionPerformed (ActlonEvent aE)
{
numLorry++;
Y += 20;
lnt dX = rand.nextInt (5) + 5;
if (leftRight) dX= dX;
else dX= -dX;
// Создать объект грузовика
lorry= new Lorry (numLorry, Y, dX, leftWH, rightWH,
reglon);
aL.add (lorry); // Включить объект в список грузовиков
// Добавить номер грузовика в элемент списка номеров
cholce.addItem (Integer.toString(numLorry));
>
»;
// Создать кнопку "Del" удаления
butDel= new Button ("Del"); // Создать объект кнопки
butDel.setLocation (240,115); // Разместить в окне
butDel.setSize (65, 20); // Установить размер кнопки
butDel.setBackground (Color.lightGray);
this.add (butDel); // Добавить кнопку в коллекцию окна
// Подписать обработчик на событие кнопки "Del"
butDel.addActionListener (new ActionListener ()
{
public void actionPerformed (ActionEvent aE)
{
// Если есть элементы в списке, то удалить грузовик с
// наименьшим номером или выбранным номером из
// списка
if(cholce.getItemCou nt() I=0)
{
String s= choice.getSelectedItem();
int num= Integer.parseInt(s);
for (lnt i= 0; i<aL.size(); I++)
{
Lorry lorry= (Lorry) aL.get(i);
if (lorry.number == num)
{
lorry.Finish ( );
aL.remove (I);
choice.remove(s);
return;
>
>
> »;
// Создать кнопку "Run" пуска
butRun= new Button ("Run"); // Создать объект кнопки
butRun.setLocatlon (240,25); // Разместить в окне
butRun.setSize (45, 20); // Установить размер кнопки
butRun.setBackground (Color.llghtGray);
44%t<. unj.Q дuИuЯ ^ fkw<uiu^\Duimiij,V ,,/ /^ nu^ufui^unn,,i^b, л„Н,.у^чпл./,. . un ^.«,л|н«_|„&.Р,| Цти„ икпа.
// Подписать обработчик на событие кнопки "Run"
butRun.addActlonLlstener (new ActionListener ()
{
public vold actionPerformed (Act!onEvent aE)
{
for (int 1= 0; i<aL.size(); i++)
{
Lorry lorry= (Lorry) aL.get(i);
lorry.Run ( );
>
>
»;
// Создать кнопку "Stop" останова
butStop= new Button ("Stop"); // Создать объект кнопки
butStop.setLocatlon (240,55); // Разместить в окне
butStop.setSize (45, 20); // Установить размер кнопки
butStop.setBackground (Color.lightGray);
thls.add (butStop); // Добавить кнопку в коллекцию окна
// Подписать обработчик на событие кнопки "Stop"
butStop.addActionListener (new ActionListener ( ) {
public void actionPerformed (ActionEvent aE)
{
for(inti= 0; l<aL.size(); i++)
{
Lorry lorry= (Lorry) aL.get(i);
lorry.Stop ( );
}
>
»;
// Создать элемент списка номеров грузовиков
choice= new Choice ( ); // Создать объект элемента списка
cholce.setLocation (240, 145); // Разместить в окне
cholce.setSize (60, 20); // Установить размер элемента
thls.add (choice); // Добавить элемент в коллекцию окна
// Создать склады
// Создать объект leftWH левого склада
leftWH= new Warehouse (true, true); // Создать объект склада
leftWH.setLocation (10, 10); // Разместить в окне
leftWH.setSlze (30, 100); // Установить размер склада
leftWH.setBackground (Color.whlte);
leftWH.bW.addObserver(thls);
thls.add (leftWH); // Добавить склад в коллекцию окна
leftWH.show ();
// Создать объект rightWH правого склада
rightWH= new Warehouse (false, false); // Создать объект склада
rlghtWH.setLocation (200, 10); // Разместить в окне
rightWH.setSlze (30, 100); // Установить размер склада
rightWH.setBackground (Color.whlte);
rig htWH. bW. addObserver(this);
thls.add (rlghtWH); // Добавить склад в коллекцию окна
rightWH.show ( );
// Создать область region контроля
reglon= new ContrlRegion (); // Создать объект области контроля
region.setLocatlon (100, 0); // Разместить в окне
region.setSlze (30, 200); // Установить размер области
region.setBackground (Color.green);
this.add (region); //Добавить область в коллекцию окна
// Создать поток thread перерисовки и запустить его
llfe= true;
thread= new Thread (this,"controlThread");
thread.start();
>
// Потоковая функция run перерисовки
public void run ( )
{
while (life)
{
repaint (); // Перерисовать окно
try
{
Thread.sleep (150);
>
catch (InterruptedExceptlon e){>
>
>
// Завершить поток перерисовки
public vold Finish ( )
{
life= false;
// Завершить все потоки при закрытии прикладного окна
public boolean handleEvent (Event e)
{
if(e.ld == Event.WINDOW_DESTROV)
{
// Завершить потоки грузовиков
for (lnt 1= 0; l<aL.size(); I++)
{
Lorry lorry= (Lorry) aL.get(i);
lorry.Flnish ( ):
>
// Завершить поток перерисовки
Finish ();
// Завершить основной поток
System.exlt(0); >
return (super.handleEvent(e));
>
И Перерисовать область клиента прикладного окна
public void paint (Graphics g)
{
// Нарисовать каждый грузовик с номером
for (int i= 0; l<aL.size(); I++)
{
Lorry lorry= (Lorry) aL.get(l);
g.setColor (Color.blue);
g.drawOval (lorry.p.x - 10, lorry.p.y - 10, 20, 20);
lf(lorry.getFull())
g.fillOval (lorry.p.x - 10, lorry.p.y - 10, 20, 20);
lf(lorry.getLeftRight()) g.setColor(Color.red);
else g.setColor(Color.green);
g.drawString (Integer.toString(lorry.number), lorry.p.x + 10,
lorry.p.y + 10); >
>
// обработать уведомление склада
public void update (Observable obs, Object args)
{
WarehouseEventArgs arg=(WarehouseEventArgs) args;
// Изменить направление перемещения грузовиков
if(arg.getLeft() && larg.getFull())
leftRight= false;
if (!arg.getLeft() && !arg.getFull())
leftRight= true;
// Завершить потоки грузовиков
for (int i= 0; i<aL.size(); i++)
{
Lorry lorry= (Lorry) aL.get(i);
lorry.setLeftRlght (leftRight);
>
// Выдать информацию о направлении перемещения и
// о складе, объект которого сгенерировал событие
//Console.Write("eventevFromWarehouse leftRight=" +
// leftRight);
if (arg.getLeft())
System.out.print("OcnaA leftWH ");
else
System.out.prlnt(" Склад rightWH ");
if (arg.getFull())
System.out.println(" полный");
else
System.out.println(" пустой");
>
// Выполнить основной поток приложения
public static void main ()
{
LorryAndWarehouses laWH= new LorryAndWarehouses ( );
laWH.show ();
>
Приложение 6. Использование сред разработ-
ки программ
Использование Visual Studio .NET
Рассматривается последовательность действий в среде Visual Studio
для создания консольных и Windows-приложент.
Консольное С++/СЫ-приложение
Для создания и выполнения консольного С++/СХ/-приложения после
запуска Visual Studio выполнить действия:
