Задание
Разработать сериализований класс для хранения параметров и результатов вычисления. Используя композицию, разработать класс для нахождения решения задачи.
Разработать класс для демонстрации в диалоговом режиме сохранения и восстановления состояния объекта, используя серпализацию. Показать особенности использования transient полей.
Разработать класс для тестирования корректности результатов вычислений.
Использовать комментарии для автоматической генерации документации средствами javadoc.
Определить количество 1 в двоичном представлении целевой части сумма периметров равнобедренного треугольника и прямоугольника по заданной высоте и длине стороны основания.
2 Разработка программы
2.1 Используемые средства ООП
Процесс превращения объектов в байтовые потоки для хранения называется сериализации. Процесс извлечения объекта с байтового потока называется десериализацией. Для объекта класса могли быть подвергнуты процессу сериализации, этот класс должен расширять интерфейс Serializable. Этот процесс заключается в сериализации каждого поля объекта, но только в том случае если это поле не имеет модификатора static или transient. Модификатор transient означает, что поле ним замечено, не может быть предметом сериализации.
2.2 Иерархия и структура классов
Данная программа имеет 2 класса для расчета периметра и получения количества единиц двоичного исчисления. Есть два класса для хранения данных. В главной программе мы используем готовые функции для нахождения количество единиц в двоичной системе.
2.3 Описание программы
Программа находит стороны треугольника и подсчитывает его периметр, затем подсчитывает количество единиц числе, что получилось. В прямоугольник же высота равна его стороне. Поэтому мы сразу подсчитывает значения периметра и находим его количество единиц.
Выполним генерацию документации:
3 Текст программы
3.1 Клас Item1
package ex01;
import java.io.Serializable;
/**Хранит исходные данные о треугольнике
* @author Александр
*/
public class Item1 implements Serializable{
private double x;
private double y;
private double p;
/**автоматическая сгенерированная константа */
private static final long serialVersionUID = 1L;
/**Инициализация поля {@linkplain Item1#x}, {@linkplain Item1#y}, {@linkplain Item1#p}*/
public Item1(){
x = .0;
y = .0;
p = .0;
}
/**устанавливает значения полей
* @param x - основание треугольника
* @param y - высота треугольника
*/
public Item1(double x, double y) {
this.x = x;
this.y = y;
}
/**устанавливает значения полей
* @param p - периметр треугольника
*/
public void setP(double p) {
this.p = p;
}
/**Получение периметра треугольника
*@return - возвращает периметр треугольника
*/
public double getP(){
return p;
}
/**Устанавливает значения
* @param x - основание треугольника
* @param y - высота треугольника
* @return - возвращает значение основания и высоты
*/
public Item1 setXY(double x, double y) {
this.x = x;
this.y = y;
return this;
}
/**предоставление информации в виде результата вычисления за прошедший день.*/
public String toString(){
return "x = " + x + " , y = " + y;
}
}
3.2 Клас Item2
package ex01;
import java.io.Serializable;
import javax.print.attribute.standard.MediaSize.Other;
/**Хранит исходные данные о треугольнике
* @author Александр
*/
public class Item2 implements Serializable{
private double x;
private double y;
private double p;
/**автоматическая сгенерированная константа */
private static final long serialVersionUID = 1L;
/**Инициализация поля {@linkplain Item1#x}, {@linkplain Item1#y}, {@linkplain Item1#p}*/
public Item2(){
x = .0;
y = .0;
}
/**устанавливает значения полей
* @param x - основание треугольника
* @param y - высота треугольника
*/
public Item2(double x, double y) {
this.x = x;
this.y = y;
}
/**устанавливает значения полей
* @param p - периметр треугольника
*/
public void setP(double p) {
this.p = p;
}
/**Получение периметра треугольника
*@return - возвращает периметр треугольника
*/
public double getP(){
return p;
}
/**Устанавливает значения
* @param x - основание треугольника
* @param y - высота треугольника
* @return - возвращает значение основания и высоты
*/
public Item2 setXY(double x, double y) {
this.x = x;
this.y = y;
return this;
}
/**предоставление информации в виде результата вычисления за прошедший день.*/
public String toString(){
return "x = " + " , y = " + y;
}
}
3.3 Клас CalcT
package ex01;
import java.io.IOException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
/**Содержит реализацию методов для вычисления и отображения результатов для треугольника
* @author Александр
*/
public class CalcT {
private static final String FNAME = "Item1.bin";
private Item1 result;
public CalcT() {
result = new Item1();
}
/**Установка значения ({@linkplain CalcT#result}) */
public void setResult (Item1 result){
this.result = result;
}
/**Получаем значения {@linkplain CalcT#result}}*/
public Item1 getResult(){
return result;
}
/**вычисляет значение периметра треугольника
* @return - периметр треугольника
*/
public double calcT (double x, double y){
result.setP(y + Math.hypot(x/2, y) + Math.hypot(x/2, y)); //находжение площади треугольника
return result.getP();
}
/**Вычисление функции и сохранение рельтата
* результат в объекте {@linkplain CalcT#result}}
* @param x - основание треугольника
* @param y - высота треугольника
*/
public void init (double x, double y){
result.setXY(x,y);
result.setP(calcT(x,y));
}
/**Вывод результата*/
public void show(){
System.out.println(result);
}
/**Получение периметра треугольника*/
public double getP(){
return result.getP();
}
/**Вывод результата в бинарной системе*/
public void bin(){
int b = 1;
int i = 0;
int p = (int)result.getP();
while (p > 1 ){
b = b*2;
if (p - 2*b < 0){
p = p - b;
b = 1;
i++;
}
}
if (p == 1 ) i++;
System.out.println(i);
}
/**Сохраняет {@linkplain CalcT#result}} В файле {@linkplain CalcT#FNAME}}
* @throws IOException
* */
public void save() throws IOException{
ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(FNAME));
os.writeObject(result);
os.flush();
os.close();
}
/**Восстанавливаем {@linkplain CalcT#result} из файла {@linkplain CalcT#FNAME}
* @throws IOException
* */
public void restore() throws Exception{
ObjectInputStream is = new ObjectInputStream(new FileInputStream(FNAME));
result = (Item1)is.readObject();
is.close();
}
}
3.4 Клас CalcP
package ex01;
import java.io.IOException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
/**Содержит реализацию методов для вычисления и отображения результатов для треугольника
* @author Александр
*/
public class CalcP {
private static final String FNAME = "Item2.bin";
private Item2 result;
public CalcP() {
result = new Item2();
}
/**Установка значения ({@linkplain CalcT#result}) */
public void setResult (Item2 result){
this.result = result;
}
/**Получаем значения {@linkplain CalcT#result}}*/
public Item2 getResult(){
return result;
}
/**вычисляет значение периметра треугольника
* @param x - основание треугольника
* @param y - высота треугольника
* @return - периметр треугольника
*/
public double calcP (double x,double y){
result.setP(2*(x+y)); //находжение площади треугольника
return result.getP();
}
/**Вычисление функции и сохранение рельтата
* результат в объекте {@linkplain CalcT#result}}
* @param x - основание треугольника
* @param y - высота треугольника
*/
public void init(double x, double y){
result.setXY(x,y);
result.setP(calcP(x,y));
}
/**Вывод результата*/
public void show(){
System.out.println(result);
}
/**Получение периметра треугольника*/
public double getP(){
return result.getP();
}
/**Вывод результата в бинарной системе*/
public void bin(){
int b = 1;
int i = 0;
int p;
double p_temp;
p_temp = result.getP();
p = (int)p_temp;
while (p > 1 ){
b = b*2;
if (p - 2*b < 0){
p = p - b;
b = 1;
i++;
}
}
if (p == 1 ) i++;
System.out.println(i);
}
/**Сохраняет {@linkplain CalcT#result}} В файле {@linkplain CalcT#FNAME}}
* @throws IOException
* */
public void save() throws IOException{
ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(FNAME));
os.writeObject(result);
os.flush();
os.close();
}
/**Восстанавливаем {@linkplain CalcT#result} из файла {@linkplain CalcT#FNAME}
* @throws IOException
* */
public void restore() throws Exception{
ObjectInputStream is = new ObjectInputStream(new FileInputStream(FNAME));
result = (Item2)is.readObject();
is.close();
}
}
3.5 Клас Main
package ex01;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
/**Вычисление и отображение результатов
* Содержит реализацию статического метода main()
* @author Александр
* @see Main#main(String[])
*/
public class Main {
/**Объект класса {@linkplain CalcT}*/
private CalcT calcT =new CalcT();
/**Объект класса {@linkplain CalcP}*/
private CalcP calcP = new CalcP();
/**Отображаем меню*/
private void menu() throws Exception {
String s = null;
double x,y;
BufferedReader in = new BufferedReader(new InputStreamReader(System.in ));
do{
do{
System.out.println("Enter Command: ");
System.out.println("1 - Vvod Treugolnik");
System.out.println("2 - Vvod Pryamougolnik");
System.out.println("3 - Vivod perimetra Treugolnika");
System.out.println("4 - Vivod perimetra Pryamougolnika");
System.out.println("5 - Vivod perimetra Treugolnika BIN");
System.out.println("6 - Vivod perimetra Pryamougolnika BIN");
System.out.println("7 - Save");
System.out.println("8 - Restore");
System.out.println("9 - Exit");
try{
s = in.readLine();
} catch(IOException e){
System.out.println("Error: " + e);
System.exit(0);
}
}while (s.length() != 1);
switch (s.charAt(0)) {
case '1':
System.out.println("Vvedite ocnovaiye i visotu: ");
x = Double.parseDouble(in.readLine());
y = Double.parseDouble(in.readLine());
calcT.init(x,y);
calcT.show();
break;
case '2':
System.out.println("Vvedite dve storoni: ");
x = Double.parseDouble(in.readLine());
y = Double.parseDouble(in.readLine());
calcP.init(x,y);
calcP.show();
break;
case '3':
System.out.println("Perimetr treugolnika = " + calcT.getP());
calcT.show();
break;
case '4':
System.out.println("Perimetr pryamougolnika = " + calcT.getP());
calcP.show();
break;
case '5':
System.out.print("Edinits v perimetre treugolnika = ");
calcT.bin();
break;
case '6':
System.out.print("Edinits v perimetr pryamougolnika = ");
calcP.bin();
break;
case '7':
System.out.println("Save current ");
try{
calcT.save();
}catch(IOException e){
System.out.println("Treugolnik: Serialozation ERROE: " + e);
}
calcT.show();
try{
calcP.save();
}catch(IOException e){
System.out.println("Pryamougolnik: Serialozation ERROE: " + e);
}
calcP.show();
break;
case '8':
System.out.println("Restore last saved ");
try{
calcT.restore();
}catch(IOException e){
System.out.println("Treugolnik: Serialozation ERROE: " + e);
}
calcT.show();
try{
calcP.restore();
}catch(IOException e){
System.out.println("Pryamougolnik: Serialozation ERROE: " + e);
}
calcP.show();
break;
case '9':
System.out.println("Exit.");
System.out.println(calcT.getResult().getP());
break;
default:System.out.print("Wround command:) ");
}
}while(s.charAt(0) != '9');
}
/**Выполняется при запуске програмы
* Вычисляется значение периметров треугольника и прямоугольника
* @param srgs - параметры запуска программы
*/
public static void main(String[] srgs) throws Exception{
Main main = new Main();
main.menu();
}
}
3.6 Клас MainTest
package ex01;
import ex01.CalcT;
import java.io.IOException;
import junit.framework.TestCase;
/**Выполняет тестирование разработанного класса CalcT
* @author Александр
*/
public class MainTest extends TestCase {
/**проверка основной функциональности класса*/
public void testCalcT(){
CalcT calcT = new CalcT();
calcT.init(1, 1);
assertEquals(3.23606797749979, calcT.getResult().getP(), .1e-5);
calcT.init(2, 2);
assertEquals(6.47213595499958, calcT.getResult().getP(), .1e-5);
calcT.init(3, 3);
assertEquals(9.70820393249937, calcT.getResult().getP(), .1e-5);
calcT.init(4, 4);
assertEquals(12.94427190999916, calcT.getResult().getP(), .1e-5);
calcT.init(5, 5);
assertEquals(16.18033988749895, calcT.getResult().getP(), .1e-5);
}
}
4 Результат тестирования и работы программы