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

Глава 06

Массивы и таблицы

Вверх

Пример 06_01 Frequencies Определение частоты употребления значений

В этой программе использовано применение массива и функции Math.random()


import javagently.*;

class Frequencies {

/* The Frequencies Program by J M Bishop Dec 1996
* ----------------------- Java 1.1
* updated May 2000
* Counts the frequencies of scores from 0 to 19.
* Tested by generating random numbers.
* Illustrates simple array handling
*/

Frequencies () {

int maxscore = 20;
int scoreFreqs [] = new int [maxscore];
int score;

for (int i=0; i < 100; i++) {

score = (int) (Math.random() * maxscore);
scoreFreqs[score] ++;
}

System.out.println("Table of Score Frequencies\n"+
"==========================\n\n"+
" Score occurred");
for (int i = 0; i < maxscore; i++) {

System.out.println(Stream.format(i, 6) +
Stream.format(scoreFreqs[i], 6));
}
}

public static void main (String [] args) {

new Frequencies ();
}
}

Результат:

Подсказка

Программа проста.

Сначала объявляем переменные:

Frequencies () {

int maxscore = 20;
int scoreFreqs [] = new int [maxscore];
int score;


Далее инструкция Math.random() * maxscore случайным образом генерирует целое число
в интервале от 0 до maxscore ( в нашем случае это значение равно 20),

for (int i=0; i < 100; i++) {

score = (int) (Math.random() * maxscore);
scoreFreqs[score] ++;
}

это сгенерированное случайное значение присваивается переменной score, эта переменная
служит для определения индекса элемента в массиве

scoreFreqs[score] ++;

Этот элемент инкременируется.
Это происходит в цикле случайным образом, так, что происходит накопление значений (за счет инкремента) в каждом элементе массива. Затем после 100 итераций индексы и значения элементов массива выводятся на экран.

System.out.println("Table of Score Frequencies\n"+
"==========================\n\n"+
" Score occurred");
for (int i = 0; i < maxscore; i++) {

System.out.println(Stream.format(i, 6) +
Stream.format(scoreFreqs[i], 6));
}

Вверх

Пример 06_02 Соревнования по прыжкам в воду

Программа состоит из двух модулей. Первый модуль класс Dive.


import java.io.*;

class Dive {

/* The Dive Class by J M Bishop Dec 1996
* Java 1.1 October 1997
* Stores and assesses diving scores for one dive.
*
* Illustrates arrays
*/

int minJudge, maxJudge, minScore, maxScore, sum;

private int noOfJudges;
private int score [];

Dive (int n) {

noOfJudges = n;
score = new int [noOfJudges];
}

void setScore (int i, int s) {

score [i] = s;
}

void assessScores() {

minScore = 10;
maxScore = 0;
sum = 0;
for (int i = 0; i < noOfJudges; i++) {
sum += score[i];
if (score[i] <= minScore) {
minScore = score[i];
minJudge = i;
}
if (score[i] > maxScore) {
maxScore = score[i];
maxJudge = i;
}
}
minJudge++;
maxJudge++;
}
}

Анализ

Сначала объявляются переменные

int minJudge, maxJudge, minScore, maxScore, sum;

private int noOfJudges;
private int score [];

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

Dive (int n) {

noOfJudges = n;
score = new int [noOfJudges];
}

Число элементов массива передается через параметр конструктора и равно числу судей. Таким образом каждый судья будет иметь в массиве свою ячейку, куда он кладет свою оценку. Таким образом получается массив с оценками.
А инициализировать массив мы будем вызывая во втором модуле программы функцию setScore,
при чтении данных с экрана (какой судья сколько положил очков за выступление спортсмена).

void setScore (int i, int s) {

score [i] = s;
}

Функция assessScores() просматривает весь инициализированный массив и делает всю остальную работу по поиску наибольшей и наименьшей оценки, и в какой ячейке (индекс элемента массива) они находятся, то есть какой судья их дал. Вычисляет так же сумму всех значений в массиве.

void assessScores() {

minScore = 10;
maxScore = 0;
sum = 0;
for (int i = 0; i < noOfJudges; i++) {
sum += score[i];
if (score[i] <= minScore) {
minScore = score[i];
minJudge = i;
}
if (score[i] > maxScore) {
maxScore = score[i];
maxJudge = i;
}
}
minJudge++;
maxJudge++;
}

Алгоритм поиска наибольшей и наименьшей оценки в этом массиве традиционен. Сначала берется первый элемент массива и он считается наименьшим (или наибольшим), затем выбираются по очереди все элементы массива и сравниваются с наименьшим ( или наибольшим), если он оказывается еще меньше, то значение заменяется вновь найденным наименьшим. Просмотрев весь массив, найдем наименьшее ( или наибольшее) значение.

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



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

class DivingCompetition {

/* The Diving program by J M Bishop Dec 1996
* ------------------ Java 1.1 October 1997
* updated May 2000
* Uses the Judge class to record the
* correct scores for dives.
* Illustrates calling class methods,
* and typed methods and using arrays
* in a separate class. */

Display d = new Display ("Diving Competition");
int noOfDives = 3;
int noOfJudges = 8;

DivingCompetition () throws IOException {

headings ();

double result, total = 0;
// There is one Dives object which records 8 scored
// and is reused for each dive

Dive dive = new Dive (noOfJudges);
int score;

for (int i=0; i < noOfDives; i++) {

d.println("Dive no: "+(i+1));
d.println("Enter the scores for the judges");
d.ready("Press ready to continue");
for (int j = 0; j < noOfJudges; j++) {
score = d.getInt("Judge "+(j+1));
dive.setScore(j, score);
}
dive.assessScores();
result = (double) (dive.sum - dive.minScore - dive.maxScore)
/ (double) (noOfJudges - 2);
total += result;
d.println("Scores " + dive.minScore + " from judge "
+ dive.minJudge + " and " + dive.maxScore +
" from judge "
+ dive.maxJudge + " excluded.");
d.println("Result is: " + Text.writeDouble(result,5,1));
}
System.out.println("Diving average is : "+
Text.writeDouble(total/noOfDives,5,3));
}

void headings () {

d.println ("Diving Score Calculator\n" +
"=======================\n");

d.println("For each of " + noOfDives +
" dives give scores for "+noOfJudges+" judges.");
for (int i = 1; i<=noOfJudges; i++)

d.prompt ("Judge "+i,0);
}

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

new DivingCompetition ();
}

}

Подсказка

Рис 6.2 Интерфейс класса Display для программы "Соревнования по прыжкам в воду".

Результат выполнения программы будет выведен в поле TextArea. Программа еще интересна для меня тем, что в ней интерактивно считываются с экрана сведения (значения типа int) введенные пользователем.

Анализ:

Объявляем переменные:

Display d = new Display ("Diving Competition");
int noOfDives = 3;//количество прыжков
int noOfJudges = 8;//количество судей

Далее в конструкторе вызывается функция headings ()

DivingCompetition () throws IOException {

headings ();

Эта функция дает объявление в правой части окна Display (там, гды выводятся результаты), а в левой части окна при помощи цикла создает сразу восемь элементов типа TextField. Поле типа TextField создается при помощи вызова функции prompt () класса Display с параметрами - d.prompt ("Judge "+i,0) :

void headings () {

d.println ("Diving Score Calculator\n" +
"=======================\n");

d.println("For each of " + noOfDives +
" dives give scores for "+noOfJudges+" judges.");
for (int i = 1; i<=noOfJudges; i++)

d.prompt ("Judge "+i,0);
}
Далее создаем экземпляр класса Dave

Dive dive = new Dive (noOfJudges);
int score;

for (int i=0; i < noOfDives; i++) {

d.println("Dive no: "+(i+1));
d.println("Enter the scores for the judges");
d.ready("Press ready to continue");
for (int j = 0; j < noOfJudges; j++) {
score = d.getInt("Judge "+(j+1));
dive.setScore(j, score);
}

В последней инструкции - dive.setScore(j, score) - мы инициализировали массив с оценками.

Вспомните функцию:

void setScore (int i, int s) {

score [i] = s;
}

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

dive.assessScores();

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

Далее остается рассчитать среднюю оценку одного прыжка без учета максимального и минимального результата:

result = (double) (dive.sum - dive.minScore - dive.maxScore)
/ (double) (noOfJudges - 2);

Увеличим значение total, чтобы в дальнейшем подсчитать среднюю оценку из трех прыжков:

total += result;

Выведем результаты этого прыжка:

d.println("Scores " + dive.minScore + " from judge "

+ dive.minJudge + " and " + dive.maxScore +
" from judge "
+ dive.maxJudge + " excluded.");
d.println("Result is: " + Text.writeDouble(result,5,1));
} // end for

Конец цикла for, который надо повторить три раза для каждого из трех прыжков


Выведем окончательную оценку по трем прыжкам:

System.out.println("Diving average is : "+

Text.writeDouble(total/noOfDives,5,3));
}


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

Hosted by uCoz