Java程式設計實驗報告
第六次實驗設計
一、實驗內容
題目:基于類繼承和多型,在我們上午課程Shapes程式的基礎上撰寫一個畫圖程式,在已有Shape、Line、Circle、Rectangle、Triangle的基礎上增加Square和Ellipse兩種新的類,并支持圖形面積和周長的計算(Line面積設定為0),
提示:
- 考慮下圖中類的繼承關系是否合理?如果不合理應該如何改進?
答:正方形是一種矩形,但 是不應該定義一個 Square 類來擴展 Rectangle 類,因為 width 和 height 屬性并不適 合于正方形,應該定義一個繼承自 Shape 類的 Square 類,并為正方形的 邊定義一個 side 屬性,
- 為類Sharp增加抽象函式getArea(), getPerimeter(),在子類中實作它們,

- 從數學上,正方形是一種特殊的矩形,但是,從程式實作上考慮,正方形只要一個邊長,而矩形可以從正方形繼承后再增加一個邊長成員變數,另一方面來說,如果正方形從矩形繼承,那么就會出現冗余的第二個邊長變數
二、實驗運行結果
注意:將程式運行結果截圖粘貼在此處

三、程式源代碼
注意:將程式代碼粘貼在此處,注意源代碼中注釋行數不少于全部代碼的1/5
1. MyPic類:
package shapes;
public class MyPic {
public static void main(String[] args)
{
Picture pic = new Picture(420,300);
//新建圖形
Ellipse e1 = new Ellipse(50,50,50,60);//新增的橢圓
Circle c1 = new Circle(320,40,80);
Square square = new Square(350,150,50);//新增的正方形
Rectangle r1 = new Rectangle(100, 100, 100, 100);
Triangle t1 = new Triangle(100, 100, 200, 100, 150, 50);
Line l1 = new Line(0,205,400,205);
pic.add(c1);
pic.add(r1);
pic.add(t1);
pic.add(l1);
//把新增的加入進去
pic.add(square);
pic.add(e1);
//畫圖
pic.draw();
//對面積計算的測驗
System.out.println("橢圓e1的面積:"+e1.getArea()+",周長"+e1.getPerimeter());
System.out.println("圓c1的面積:"+c1.getArea()+",周長"+c1.getPerimeter());
System.out.println("正方形square的面積:"+square.getArea()+",周長"+square.getPerimeter());
System.out.println("長方形r1的面積:"+square.getArea()+",周長"+square.getPerimeter());
System.out.println("線l1的面積:"+l1.getArea()+",周長"+l1.getPerimeter());
System.out.println("三角形t1的面積:"+t1.getArea()+",周長"+t1.getPerimeter());
}
}
2. Picture類
package shapes;
import java.awt.Graphics;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Picture extends JFrame {
private static final long serialVersionUID = 1L;
private int width;
private int height;
private ArrayList<Shape> listShape = new ArrayList<Shape>();
private class ShapesPanel extends JPanel {
private static final long serialVersionUID = 1L;
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
for ( Shape s : listShape )
{
s.draw(g);
}
}
}
public void add(Shape s)
{
listShape.add(s);
}
public Picture(int width, int height)
{
add(new ShapesPanel());
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.width = width;
this.height = height;
}
public void draw()
{
setLocationRelativeTo(null);
setSize(width, height);
setVisible(true);
}
}
3. Shape類
package shapes;
import java.awt.Graphics;
public abstract class Shape {
public abstract void draw(Graphics g);
//計算周長和面積的抽象函式
public abstract double getPerimeter();
public abstract double getArea();
public static void main(String[] args) {
}
}
4. Line類
package shapes;
import java.awt.Graphics;
public class Line extends Shape {
private int x1;
private int y1;
private int x2;
private int y2;
public Line(int x1, int y1, int x2, int y2)
{
this.x1 = x1; this.y1 = y1;
this.x2 = x2; this.y2 = y2;
}
//抽象函式的多載
@Override
public void draw(Graphics g) {
g.drawLine(x1, y1, x2, y2);
}
@Override
public double getPerimeter() {
return Math.sqrt((y1-y2)*(y1-y2) + (x1-x2)*(x1-x2));
}
@Override
public double getArea() {
return 0;
}
}
5. Square類
package shapes;
import java.awt.*;
public class Square extends Shape {
public int x,y;
public int side;
//建構式
public Square() {
}
public Square(int x, int y, int side) {
this.x = x;
this.y = y;
this.side = side;
}
@Override
public void draw(Graphics g) {
g.drawRect(x,y,side,side);
}
@Override
public double getPerimeter() {
return 4 * side;
}
@Override
public double getArea() {
return side *side;
}
}
6. Rectangle類
package shapes;
import java.awt.Graphics;
public class Rectangle extends Shape {
private int x;
private int y;
private int width;
private int height;
public Rectangle(int x, int y, int width, int height) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
@Override
public void draw(Graphics g) {
g.drawRect(x, y, width, height);
}
//重寫抽象方法
@Override
public double getPerimeter() {
return 2 * (width + height);
}
@Override
public double getArea() {
return width * height;
}
}
7. Ellipse類
package shapes;
import java.awt.*;
public class Ellipse extends Shape{
public int x;
public int y;
public int a;
public int b;
public Ellipse(int x, int y, int a, int b) {
this.x = x;
this.y = y;
this.a = a;
this.b = b;
}
@Override
public void draw(Graphics g) {
g.drawOval(x,y,a,b);
}
@Override
public double getPerimeter() {
return 2 * Math.PI + 4 * (a - b);
}
@Override
public double getArea() {
return Math.PI * a * b;
}
}
8. Circle類
package shapes;
import java.awt.Graphics;
public class Circle extends Ellipse {
public Circle(int x, int y, int radius)
{
super(x,y,radius,radius);
}
}
9.Triangle類
package shapes;
import java.awt.Graphics;
public class Triangle extends Shape {
private int[] x = new int[3];
private int[] y = new int[3];
public Triangle(int x1, int y1, int x2, int y2, int x3, int y3)
{
x[0] = x1; x[1] = x2; x[2] = x3;
y[0] = y1; y[1] = y2; y[2] = y3;
}
@Override
public void draw(Graphics g) {
g.drawPolygon(x, y, x.length);
}
@Override
public double getPerimeter() {
double s1 = Math.sqrt(Math.pow(x[1] - x[2], 2) + Math.pow(y[1] - y[2], 2));
double s2 = Math.sqrt(Math.pow(x[1] - x[0], 2) + Math.pow(y[1 ]- y[0], 2));
double s3 = Math.sqrt(Math.pow(x[0] - x[2], 2) + Math.pow(y[0] - y[2], 2));
return s1+s2+s3;
}
//利用海倫公式計算面積
@Override
public double getArea() {
double s1 = Math.sqrt(Math.pow(x[1] - x[2], 2) + Math.pow(y[1] - y[2], 2));
double s2 = Math.sqrt(Math.pow(x[1] - x[0], 2) + Math.pow(y[1 ]- y[0], 2));
double s3 = Math.sqrt(Math.pow(x[0] - x[2], 2) + Math.pow(y[0] - y[2], 2));
double s = (s1 + s2 + s3) / 2;
return Math.sqrt(s * (s - s1) * (s - s2) * (s - s3));
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/41681.html
標籤:java
