Laborator 9

Lab 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;

}

}

}

}