Laborator 9
Problema 1
Mutand clasa B in "pachet2", pachetul care contine clasa A, "pachet1", trebuie inclus(nu e necesar tot, ci doar clasa A) in "pachet2". Astfel, deoarece clasa A se afla intr-un fisier "x.java", inseamna ca pentru a putea importa clasa A, aceasta trebuie sa fie de tip "public". Pentru acest lucru, vom muta clasa A intr-un fisier de tip "A.java" inclus in acelasi "pachet1".
Astfel:
Fisierul x.java va contine:
package pachet1;
public class x {
}
Fisierul y.java va contine:
package pachet1;
public class y {
}
Fisierul A.java va contine:
package pachet1;
public class A{
}
Astfel, "pachet1" cuprinde clasele: x, y, A.
Prin urmare "pachet2" va cuprinde "clasa B"
package pachet2;
import pachet1.A; //Astfel am inclus in pachet doar clasa A
class B extends A{
}
Problema 2
Pachetul "FiguriGeometrice" va contine :
package FiguriGeometrice;
public abstract class FiguraGeometrica {
private Punct O;
public FiguraGeometrica(){
}
public FiguraGeometrica(Punct O){
this.O=O;
}
public Punct getO() {
return O;
}
abstract public String toString();
public abstract boolean equals(Object o);
}
package FiguriGeometrice;
public class Punct{
private double x, y;
public Punct(double x, double y){
this.x=x;
this.y=y;
}
public double getX() {
return x;
}
public double getY() {
return y;
}
public boolean equals(Object o) {
if(o instanceof Punct)
return ( ( ((Punct)o).getX()==x ) && ( ((Punct)o).getY()==y ) );
else
return false;
}
public String toString(){
return "("+x+", "+y+")";
}
}
package FiguriGeometrice;
public class Patrat extends FiguraGeometrica {
private Punct P;
public Patrat(Punct O, Punct P){
super(O);
this.P=P;
}
public Punct getP() {
return P;
}
public double getLatura(){
return Math.sqrt( Math.pow(getO().getX()-getP().getX(), 2) + Math.pow(getO().getY()-getP().getY(), 2) );
}
public boolean equals(Object o) {
if (o instanceof Patrat)
return ( ( ((Patrat) o).getLatura() == this.getLatura() ) ); //&& (((Patrat) o).getO().equals(getO())));
else
return false;
}
public String toString(){
return "Patrat: "+getO().toString()+" l="+getLatura();
}
}
package FiguriGeometrice;
public class Cerc extends FiguraGeometrica {
private double raza;
public Cerc(Punct O, double raza){
super(O);
this.raza=raza;
}
public double getRaza() {
return raza;
}
public boolean equals(Object o) {
if(o instanceof Cerc)
return ( ( ((Cerc)o).getO().equals(getO()) ) && ( ((Cerc)o).getRaza()==getRaza() ) );
else
return false;
}
public String toString(){
return "Cerc: "+getO().toString()+" R="+raza;
}
}
Pachetul "stivaFiguriGeometrice" va contine pachetul "stivaExceptions" si clasa "stiva".
Pachetul "stivaExceptions" este:
package stivaFiguriGeometrice.stivaExceptions;
public class duplicateException extends Exception {
public duplicateException(String mesaj){
super(mesaj);
}
}
package stivaFiguriGeometrice.stivaExceptions;
public class maxElementsReached extends Exception {
public maxElementsReached(String mesaj){
super(mesaj);
}
}
package stivaFiguriGeometrice.stivaExceptions;
public class noElementsException extends Exception {
public noElementsException(String mesaj){
super(mesaj);
}
}
package stivaFiguriGeometrice.stivaExceptions;
public class nrElementeNegativeException extends RuntimeException{
public nrElementeNegativeException(String mesaj){
super(mesaj);
}
}
Clasa "stiva" este:
package stivaFiguriGeometrice;
import FiguriGeometrice.*;
import stivaFiguriGeometrice.stivaExceptions.*;
public class stiva {
private int nrElementeMax;
private int nrElementeCurente=0;
private FiguraGeometrica[] figuraGeometrica=new FiguraGeometrica[1];
public stiva(int nrElementeMax)throws nrElementeNegativeException{
if (nrElementeMax < 0)
throw new nrElementeNegativeException("Numarul de elemente nu poate fi negativ!");
else{
this.nrElementeMax=nrElementeMax;
figuraGeometrica=new FiguraGeometrica[nrElementeMax];
}
}
public void adauga(FiguraGeometrica figuraGeometrica) throws maxElementsReached,duplicateException{
if(nrElementeCurente>=nrElementeMax)
throw new maxElementsReached("Limita maxima de figuri geometrice s-a atins deja. ");
else{
for(int i=0;i<nrElementeCurente;i++)
if(figuraGeometrica.equals(this.figuraGeometrica[i]))
throw new duplicateException("Elementul "+figuraGeometrica.toString()+" este deja stocat");
nrElementeCurente++;
this.figuraGeometrica[nrElementeCurente]=figuraGeometrica;
}
}
public FiguraGeometrica getUltimaFiguraGeometrica() throws noElementsException {
if(nrElementeCurente==0)
throw new noElementsException("Stiva este goala");
else
return figuraGeometrica[nrElementeCurente];
}
public void stergereUltimElement()throws noElementsException{
if(nrElementeCurente==0)
throw new noElementsException("Stiva este goala");
else{
figuraGeometrica[nrElementeCurente]=null;
nrElementeCurente--;
}
}
public String toString(){
if(nrElementeCurente==0)
return "Stiva este goala!";
String result="";
for(int i=nrElementeCurente;i>0;i--){
result=result+"\nFigura "+i+"\n"+figuraGeometrica[i].toString()+"\n";
}
return result;
}
}
Pachetul "reader" contine subpachetele "reader.input" si "reader.output".
Pachetul "reader.input" contine subpachetul "reader.input.text" si interfata "setFigura".
package reader.input;
import FiguriGeometrice.FiguraGeometrica;
public interface setFigura {
FiguraGeometrica set();
int optiune();
}
Subpachetul "reader.input.txt" este:
package reader.input.text;
import FiguriGeometrice.*;
import reader.input.setFigura;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class citireFigura implements setFigura {
private InputStreamReader inputKeyboard = new InputStreamReader(System.in);
private BufferedReader buffKeyboard = new BufferedReader(inputKeyboard);
public FiguraGeometrica set() {
try {
System.out.println("Vreti sa cititi un cerc sau un patrat? Tastati 1 pentru patrat si 0 pentru cerc");
System.out.print("Alegere=");
int choice=Integer.parseInt(buffKeyboard.readLine());
if(choice==1) {
System.out.print("Introduceti coordonatele punctului O ale patratului:\n");
System.out.print("x=");
double x = Double.parseDouble(buffKeyboard.readLine());
System.out.print("y=");
double y = Double.parseDouble(buffKeyboard.readLine());
Punct O = new Punct(x, y);
System.out.print("Introduceti coordonatele punctului P ale patratului:\n");
System.out.print("x=");
x = Double.parseDouble(buffKeyboard.readLine());
System.out.print("y=");
y = Double.parseDouble(buffKeyboard.readLine());
Punct P = new Punct(x, y);
return new Patrat(O,P);
}
else{
System.out.print("Introduceti coordonatele punctului O ale cercului:\n");
System.out.print("x=");
double x = Double.parseDouble(buffKeyboard.readLine());
System.out.print("y=");
double y = Double.parseDouble(buffKeyboard.readLine());
Punct O = new Punct(x, y);
System.out.print("Introduceti raza cercului:\n");
System.out.print("raza=");
double raza = Double.parseDouble(buffKeyboard.readLine());
return new Cerc(O,raza);
}
} catch (IOException e) {
System.err.println("Something wrong happend!");
}
return null;
}
//Nu vreau alta exceptie..
public int optiune() {
int op=-1;
try {
System.out.println("1: Adaugare element");
System.out.println("2: Returneaza ultimul element");
System.out.println("3: Sterge ultimul element");
System.out.println("4: Afisare stiva");
System.out.println("0: Iesire");
op = Integer.parseInt(buffKeyboard.readLine());
} catch (IOException e) {
System.err.println("Introduceti un numar intreg!");
}
return op;
}
}
Pachetul "reader.output" contine subpachetul "reader.output.txt" si interfata "afisareStiva".
Interfata este:
package reader.output;
import stivaFiguriGeometrice.stiva;
public interface afisareStiva {
void afisare(stiva Stiva);
}
Pachetul "reader.output.txt" este:
package reader.output.text;
import reader.output.afisareStiva;
import stivaFiguriGeometrice.*;
public class afisareStivaEcran implements afisareStiva {
public void afisare(stiva Stiva){
System.out.println(Stiva.toString());
}
}
Clasa Main, contine metoda de tip main in care sunt utilizate cele de mai sus.
package com.company;
import FiguriGeometrice.FiguraGeometrica;
import reader.input.text.citireFigura;
import reader.output.text.afisareStivaEcran;
import stivaFiguriGeometrice.stiva;
import stivaFiguriGeometrice.stivaExceptions.duplicateException;
import stivaFiguriGeometrice.stivaExceptions.noElementsException;
public class Main {
public static void main(String[] args) {
stiva Stiva=new stiva(10);
afisareStivaEcran afisareEcran=new afisareStivaEcran();
citireFigura Citire=new citireFigura();
int op=-1;
while(op!=0) {
op = Citire.optiune();
switch (op) {
case 1:
FiguraGeometrica figuraGeometrica;
figuraGeometrica = Citire.set();
try {
Stiva.adauga(figuraGeometrica);
} catch (stivaFiguriGeometrice.stivaExceptions.maxElementsReached maxElementsReached) {
maxElementsReached.printStackTrace();
} catch (duplicateException e) {
e.printStackTrace();
}
break;
case 2:
try {
System.out.print("Ultimul element este: " + Stiva.getUltimaFiguraGeometrica() + "\n");
} catch (noElementsException e) {
e.printStackTrace();
}
break;
case 3:
try {
Stiva.stergereUltimElement();
} catch (noElementsException e) {
e.printStackTrace();
}
break;
case 4:
afisareEcran.afisare(Stiva);
break;
default:break;
}
}
}
}