Глава 6
Задача 6.5 "Главы книг."
Расширьте класс, разработка которого была начата в задачах 2.10 и 3.19, чтобы он включал больше информации о каждой главе, например список из семи параграфов, количество задач, десять букв, которые являются ответами на вопросы для самоконтроля и тд.
Разработайте интерактивную программу, в которой была бы предусмотрена возможность ввода новых данных о главах по мере написания книги и вывода сведений о ее текущем состоянии. Обратите внимание на то, что в первоначальных версиях программы уже имеются три массива: массив глав, массив параграфов (которые являются объектами своего собственного класса, в котором есть названия строк и целые числа - номера страниц) и массив ответов на вопросы для самоконтроля, элементы которого имеют тип char.
Решение 2
Модифицируем предыдущий вариант программы таким образом, чтобы в класс Chapter вложить внутренний (вложенный) класс Paragraph, который имеет структуру, аналогичную той, которую имел класс Chapter до модификации. Соответственно в качестве одной из переменных поместим в класс Chapter двумерный массив объектов типа Paragraph, чтобы учесть множество параграфов в каждой главе. Напомню, что класс Chapter сам является вложенным в класс Book. И класс Book имеет одномерный массив объектов типа Chapter.
Код программы:
import java.io.*;
import javagently.*;
import java.util.*;
class Books {
Books()throws IOException {
System.out.println("");
System.out.println(" Book information ");
System.out.println("-------------------");
Book b = new Book("Judy Bishop ","Java 2", 590);
b.write();
}
public static void main (String [ ] args)throws IOException {
new Books ();
}
}//Books
class Book {
String nameAuthor;
String nameBook;
long pageBook;
Chapter ch[] = new Chapter[15];
int m = ch.length;
Book (String a, String b, int p) throws IOException {
nameAuthor = a;
nameBook = b;
pageBook = p;
Stream fin = new Stream(System.in);
try {
fin = Filer.open("data.txt");
}
catch (FileNotFoundException e) {
System.out.println("Five tries up");
System.out.println("Connecting to keyboard by default");
}
// try read file
try {
int i = 0;
for(;;){
String s = fin.readLine();
ch[i] = new Chapter((i+1), s, random_01(20,50));
i++;
}
}
catch (EOFException e) {
System.out.println(" All data is reading ");
}
fin.close();
}//Book construct
void write () {
System.out.println(nameAuthor + " \"" + nameBook + "\" " + pageBook + " pages" );
for (int j = 0;j < m;j++){
ch[j].write();
}
}
class Chapter {
int num;
String name;
long pgs;
Paragraph par[][] = new Paragraph[15][4];
int k = par.length;
Chapter (int j, String s, int p) throws IOException {
num = j;
name = s;
pgs = p;
Stream fin1 = new Stream(System.in);
try {
fin1 = Filer.open("data1.txt");
}
catch (FileNotFoundException e) {
System.out.println("Five tries up");
System.out.println("Connecting to keyboard by default");
}
// try read file
try {
int h = 0;
for(;;){
int i = 0;
for(;;){
String s1 = fin1.readLine();
if(s1.length() == 0)break;
par[h][i] = new Paragraph((i+1), s1, random_01(20,50));
i++;
}
h++;
}
}
catch (EOFException e) {
System.out.println(" All data is reading 1");
}
fin1.close();
}//Chapter construct
void write () {
System.out.println(" Chapter " + num + " "+ '"' + name + '"' + " " + pgs + " pages as manuscripn" );
for (int z = num-1;z < num;z++){
for (int j = 0;j < 4;j++){
par[z][j].write();
}
}
}
class Paragraph {
int numP;
String nameP;
long pgsP;
Paragraph (int j, String n, int s ) {
numP = j;
nameP = n;
pgsP = s;
}
void write () {
// System.out.println(" " + numP + " "+ '"' + nameP + '"' + " " + pgsP + " pages " );
System.out.println(" " + nameP + '"' + " " + pgsP + " pages " );
}
}//Paragraph
}//Chapter
int random_01 (int min, int max ){
int z =0;
while(z < min ){
z = (int) (Math.random()* max);
}
return z;
}
}//Book
Результат :
Judy Bishop "Java 2" 590 pages
Анализ
Итак расширим класс Chapter, добавив к нему класс Paragraph.
И объявим и инициируем в классе Chapter двумерный массив типа paragraph.
Paragraph par[][] = new Paragraph[15][4];
Инициируем его циклическим чтением данных из файла.
Естественно у нас должен быть для этого двойной цикл:
// try read file
try {
Хотя мы считываем данные в двумерный массив из одного файла, разделителем массивов является пустая строка. Строки до пустой строки считываются в один массив строк, после пустой строки - в другой имассив строк, и так до конца файла. У нас получается инициированный двумерный массив массивов строк. Поскольку в каждой главе несколько (массив) параграфов.
Программа довольно интересна. Тройное вложение классов. Считывание данных из файла в двумерный массив
Использованные приемы:
- Тройное вложение классов
- Одномерный и двумерный массивы объектов типа Chapter и Paragraph соответственно.
- Считывание данных из файла в двумерный массив, разделитель при считывании - пустая строка.
- Метод write() внешнего класса, который вызывает метод write() вложенного класса,
который вызывает метод write() вложенного класса.
Назад |
Начало урока |
Вверх |
Вперед
Содержание