Случайно наткнулся на задачу: "Предусмотреть в классе методы вычисления и вывода сведений о фигуре - периметр, площадь, диагональ. Создать производный класс - куб, добавить в класс метод определения объема фигуры, переопределить методы расчета площади и вывода сведений о фигуре. Написать программу, демонстрирующую работу с классом: дано N1 квадратов и N2 кубов. Найти среднюю площадь квадратов и количество кубов с наибольшей площадью." Вроде бы и задача "ни о чём", а люди копья там ломали гипотезы какие-то странные... Но ни одного варианта какого-то внятного решения так и не предложили... Сделал решение, но получилось нечто монструозное для таких простеньких исходных данных. Предложите как бы сделать компактнее. Каюсь: делал не строго по букве задания, а более обобщённо (ну не только квадраты и кубы считать, а прямоугольники и параллелепипеды тоже). Одним словом, вот такая х...орош-ш-шая вестчь:
Если до сюда дочитали уже отдельное Спасибо! :)
Кликните здесь для просмотра всего текста
Код:
import java.util.*;
public class Square {
int length, width;
public void setLength(int length) {
this.length = length;
}
public void setWidth(int width) {
this.width = width;
}
public Square(int length, int width) {
setLength(length);
setWidth(width);
}
public int area() {
return length * width;
}
public int perimeter() {
return (length + width) * 2;
}
public double diagonal() {
return Math.sqrt(width * width + length * length);
}
public String output() {
return String.format("Площадь равна = %9d%nПериметр равен = %8d%nДиагональ равна = %12.4f", area(), perimeter(), diagonal());
}
}
class Cube extends Square {
private int height;
public void setHeight(int aHeight) {
height = aHeight;
}
public Cube(int length, int width, int height) {
super(length, width);
setHeight(height);
}
@Override
public int area() {
return (width * length + width * height + length * height) * 2;
}
@Override
public int perimeter() {
return (width + length + height) * 4;
}
@Override
public double diagonal() {
double diagS = super.diagonal();
return Math.sqrt(height * height + diagS * diagS);
}
public int volume() {
return width * length * height;
}
@Override
public String output() {
String output = super.output();
return output + String.format("%nОбъём равен = %,11d%n", volume());
}
}
class Calculation {
public static void main(String[] args) {
calcSquare();
System.out.println();
calcCube();
System.out.println();
testSquare(array(rnd(5, 10)));
System.out.println();
testCube(array(rnd(6, 12)));
}
public static void calcSquare() {
System.out.println("= Расчёт прямоугольника =");
Square square = new Square(sizeSet(0), sizeSet(1));
System.out.printf(square.output());
}
public static void calcCube() {
System.out.println("= Расчёт параллелепипеда =");
Cube cube = new Cube(sizeSet(0), sizeSet(1), sizeSet(2));
System.out.printf(cube.output());
}
public static void testSquare(int[] array) {
Square square;
int temp = 0;
int[] areaS = new int[array.length];
System.out.println("Создадим " + array.length + " квадратов со сторонами " + Arrays.toString(array));
for (int i = 0; i < array.length; i++) {
square = new Square(array[i], array[i]);
areaS[i] = square.area();
temp += areaS[i];
}
System.out.println("Площадь квадратов: " + Arrays.toString(areaS) + " средняя площадь: " + temp / areaS.length);
}
public static void testCube(int[] array) {
Cube cube;
int count = 0;
int[] area = new int[array.length];
System.out.println("Создадим " + array.length + " кубов со сторонами " + Arrays.toString(array));
for (int i = 0; i < array.length; i++) {
cube = new Cube(array[i], array[i], array[i]);
area[i] = cube.area();
}
System.out.println("Площади кубов: " + Arrays.toString(area));
Arrays.sort(area);
for (int i = area.length - 1; i >= 0; i--) {
if (area[area.length - 1] == area[i]) {
count++;
}
}
System.out.println("Кубов с максимальной площадью: " + count);
}
public static int sizeSet(int i) {
String[] name = {"Задайте длину: ", "Задайте ширину: ", "Задайте высоту: "};
System.out.print(name[i]);
return new Scanner(System.in).nextInt();
}
public static int rnd(int n, int m) {
return (int) (Math.random() * n + m);
}
public static int[] array(int n) {
int[] array = new int[n];
for (int i = 0; i < array.length; i++) {
array[i] = rnd(10, 9);
}
return array;
}
}