Назад | Начало урока | Вперед
Содержание

Глава 06

Вверх

Пример 6.5 Поиск месторождений золота

Задача. Золотодобывающая компания получила замеры инфракрасного излучения в определенном районе пустыни, где как предполагается может находиться месторождение золота. Эти данные должны помочь установить границы месторождения. Границы определяются на базе замеров, которые имеют большую величину, чем средний показатель, вычисленный на основе четырех точек вокруг проверяемой точки. Компания хотела бы иметь программу, которая определяет границы предполагаемого месторождения.

Решение. Карта замеров может рассматриваться по одному элементу за раз. Одновремнно будет выводиться карта тех величин, которые превышают средний уровень инфракрасного излучения. Предположим, что мы имеем массив 8х8 с такими данными:

Подсказка

Теперь мы можем вывести соответствующую карту:

Подсказка

Алгоритм.

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

point = data[i][j];
average = (data[i-1][j] + data[i+1][j] + data[i][j-1] + data[i][j+1]) / 4;
if (point > average)

map[i][j] = cover;

Следует рассмотреть еще один вопрос: как быть с точками, расположенными по краю карты? Мы будем исходить из того, что у нас достаточно данных для обнаружения месторождения, поэтому мы проигнорируем точки, расположенные на границе карты. Вот почему циклы, оценивающие точки, будут работать на участках массивов, которые ограничены индексами от 1 до rowmax-1 и от 1 до colmax-1.

Конструкция класса. В процессе решения задачи используются два набора данных, которые являются таблицами. Элементы одной таблицы имеют тип double, а другой - char. По этой причине нет необходимости объявлять отдельный класс, который бы что-нибудь моделировал и экземпляры которого создавались бы повторно. Однако стоит рассмотреть процедуры создания нескольких полезных методов.

Программа. Вот что представляет собой класс GoldExploration:


import java.io.*;
import javagently.*;
import myutilities.*;

class GoldExploration {

/* The Gold class by J M Bishop Jan 1997
* Java 1.1 October 1997
* Transforms raw geological readings into a character map of a
* possible gold reef.
* Illustrates two different multi-dimensional arrays in a class.
*/

int rowMax = 8;
int colMax = 8;
char map [][] = new char[rowMax][colMax];
double data [][] = new double[rowMax][colMax];
char blank = ' ';
char cover = '*';

Stream fin;

GoldExploration () throws IOException {

introduction();
getData();
assess();
report();
}

public void getData() throws IOException {

for (int i = 0; i < rowMax; i++)
for (int j = 0; j < colMax; j++)
data[i][j] = fin.readDouble();
}

public void assess() {

double point, average;
for (int i = 0; i < rowMax; i++) {
for (int j = 0; j < colMax; j++) {
map[i][j] = blank;
}
}
for (int i = 1; i < rowMax-1; i++) {
for (int j = 1; j < colMax-1; j++) {
point = data[i][j];
average = (data[i-1][j] + data[i+1][j] +
data[i][j-1] + data[i][j+1]) / 4;
if (point > average)
map[i][j] = cover;
}
}
}

public void report() {

System.out.println("Map of possible boundaries of the " +
"gold reef");
System.out.println("===================================" +
"========");
System.out.println();
System.out.print(" ");
for (int j = 0; j < colMax; j++) {
System.out.print(j+" ");
}
System.out.println();
for (int i = 0; i < rowMax; i++) {
System.out.print(i+" ");
for (int j = 0; j < colMax; j++)
System.out.print(map[i][j]+" ");
System.out.println();
}
System.out.println("Good luck prospecting!");
}

void introduction () throws IOException {

System.out.println("******* Savanna Exploration Inc. *****");
System.out.println("Will use test data in gold.dat"+
" if file open is unsuccessful");
fin = Filer.open("");
System.out.println("We shall find gold!\n");
}

public static void main(String[] args) throws IOException {

new GoldExploration ();
}

}

Метод introduction() использует класс открытия файлов Filer, который разработан нами в примере 4.9 и хранится в пакете myutilities. Если файл не найден, загружается карта mali.dat, используемая по умолчанию, в существовании которой мы уверены.

void introduction () throws IOException {

System.out.println("******* Savanna Exploration Inc. *****");
System.out.println("Will use test data in gold.dat"+
" if file open is unsuccessful");
fin = Filer.open("");
System.out.println("We shall find gold!\n");
}

Тестирование. Ранее уже был приведен вывод программы, которая обрабатывала файл, содержащий данные, которые позволяли составить карту месторождения. Мы решили дополнительно проверить программу и ввели одинаковые данные, вследствие чего получили следующее:

Подсказка

Подсказка


Назад | Начало урока | Вверх | Вперед
Содержание

Hosted by uCoz