- •Введение
- •Как получить исходные тексты
- •Что требуется знать для чтения книги
- •Предисловие к первому изданию
- •Благодарности
- •1.3.Новая парадигма
- •Что читать дальше
- •Упражнения
- •2.7.3.Зацепление и связность
- •2.9. Выбор представления данных
- •Упражнения
- •Глава 3 Классы и методы
- •Упражнения
- •Глава 4 Сообщения, экземпляры и инициализация
- •Упражнения
- •Глава 5 Учебный пример: задача о восьми ферзях
- •Упражнения
- •Глава 6 Учебный пример: игра «Бильярд»
- •Упражнения
- •Глава 7 Наследование
- •7.6.Издержки наследования
- •Упражнения
- •Глава 8 Учебный пример: Пасьянс
- •8.4.1.Основание SuitPile
- •8.4.2.Колода DeckPile
- •Упражнения
- •9.1.1. «Быть экземпляром» и «включать как часть»
- •Упражнения
- •Глава 10 Подклассы и подтипы
- •Упражнения
- •Глава 11 Замещение и уточнение
- •Упражнения
- •Глава 12 Следствия наследования
- •Упражнения
- •Глава 13 Множественное наследование
- •13.1.Комплексные числа
- •Литература для дальнейшего чтения
- •Упражнения
- •Глава 14 Полиморфизм
- •Полиморфные переменные
- •Виртуальное и невиртуальное переопределение
- •Параметрическая перегрузка
- •Отложенные методы в C++
- •Обобщенные функции и шаблоны
- •Полиморфные переменные
- •Отложенные методы в Object Pascal
- •Полиморфные переменные
- •Отложенные методы в Objective-C
- •Полиморфные переменные
- •Отложенные методы в Smalltalk
- •Упражнения
- •Глава 15 Учебный пример: контейнерные классы
- •Упражнения
- •Глава 16 Пример: STL
- •Упражнения
- •Глава 17 Видимость и зависимость
- •Родственные экземпляры
- •Дружественные функции
- •Пространства имен
- •Постоянные члены
- •Упражнения
- •Глава 18 Среды и схемы разработки
- •18.1.1. Java API
- •Упражнения
- •19.5.Класс application
- •19.5.1.Класс button
- •Упражнения
- •Глава 20 Новый взгляд на классы
- •20.2.2.Класс Class
- •Упражнения
- •Глава 21 Реализация объектно-ориентированных языков
- •Литература для дальнейшего чтения
- •Упражнения
- •А.1. «Задача о восьми ферзях» на языке Apple Object Pascal
- •A.3. «Задача о восьми ферзях» на языке Java
- •A.3.1. HTML-файл для апплета Java
- •A.4. «Задача о восьми ферзях» на языке Objective-C
- •A.5. «Задача о восьми ферзях» на языке Smalltalk
- •Б.1. Версия без использования наследования
- •Б.2. Версия с использованием наследования
- •Глоссарий
converted to PDF by BoJIoc
{
//проверка горизонталей if (row == testRow)
return true;
//проверка диагоналей
int columnDifference = testColumn — column; if ((row + columnDifference == testRow) ||
(row — columnDifference == testRow)) return true;
// попробовать соседа
return neighbor && neighbor->canAttack(testRow, testColumn);
}
bool queen::findSolution()
{
// проверить позицию, не атакуют ли соседи
while (neighbor && neighbor->canAttack (row, column)) if (! advance ())
return false;
// решение найдено! return true;
}
bool queen::advance()
{
if (row < 8)
{
row++;
return findSolution();
}
if (neighbor && ! neighbor->advance()) return false;
row = 1;
return findSolution ();
}
void queen::print()
{
if (neighbor) neighbor->print();
cout << "column " << column << " row " << row << '\n';
}
void main()
{
queen * lastQueen = 0;
for (int i = 1; i <= 8; i++)
{
lastQueen = new queen(i, lastQueen); if (! lastQueen->findSolution())
cout << "no solution\n";
}
lastQueen->print();
}
A.3. «Задача о восьми ферзях» на языке Java
/*
Задача «Восемь ферзей», язык Java
Автор: Тимоти Бадд, университет штата Орегон, январь 1996
*/
converted to PDF by BoJIoc
import java.awt.*; import java.applet.*; class Queen
{
//поля данных private int row; private int column; private Queen neighbor;
//конструктор
Queen (int c, Queen n)
{
// инициализировать поля данных row = 1;
column = c; neighbor = n;
}
public boolean findSolution ()
{
while (neighbor != null && neighbor.canAttack(row, column))
if (! advance()) return false;
return true;
}
public boolean advance()
{
if (row < 8)
{
row++;
return findSolution();
}
if (neighbor != null)
{
if (! neighbor.advance ()) return false;
}
else
return false; row = 1;
return findSolution();
}
private boolean canAttack(int testRow, int testColumn)
{
int columnDifference = testColumn — column; if ((row == testRow) ||
(row + columnDifference == testRow) || (row — columnDifference == testRow))
return true;
if (neighbor != null)
return neighbor.canAttack(testRow, testColumn); return false;
}
public void paint (Graphics g)
{
// сперва нарисуем соседа if (neighbor != null)
neighbor.paint(g);
converted to PDF by BoJIoc
//затем нарисуем себя
//x, y — это верхний левый угол int x = (row — 1) * 50;
int y = (column — 1) * 50;
g.drawLine(x+5, |
y+45, |
x+45, y+45); |
g.drawLine(x+5, |
y+45, |
x+5, y+5); |
g.drawLine(x+45, y+45, x+45, y+5); g.drawLine(x+5, y+35, x+45, y+35); g.drawLine(x+5, y+5, x+15, y+20); g.drawLine(x+15, y+20, x+25, y+5); g.drawLine(x+25, y+5, x+35, y+20); g.drawLine(x+35, y+20, x+45, y+5); g.drawOval(x+20, y+20, 10, 10);
}
}
public class QueenSolver extends Applet
{
private Queen lastQueen; public void init()
{
int i;
lastQueen = null;
for (i = 1; i <= 8; i++)
{
lastQueen = new Queen(i, lastQueen); lastQueen.findSolution();
}
}
public void paint(Graphics g)
{
// нарисовать доску
for (int i = 0; i <= 8; i++)
{
g.drawLine(50 * i, 0, 50*i, 400); g.drawLine(0, 50 * i, 400, 50*i);
}
// нарисовать ферзей lastQueen.paint(g);
}
public boolean mouseDown(java.awt.Event evt, int x, int y)
{
lastQueen.advance();
repaint(); return true;
}
}
A.3.1. HTML-файл для апплета Java
<html>
<title>Eight-Queen Puzzle</title> <body>
<h1> Головоломка «8 Ферзей» на языке Java</h1> <h2>Из главы 5 книги</h2>
<h2>«Объектно-ориентированное программирование в действии»</h2> <h2>Автор: Тимоти Бадд<</h2>
<hr>