實驗2 面向物件程式設計(6學時)
- 設計一個名為figure的圖形軟體包(package)。包中包含三角形、矩形、圓三個類。要求:(1)每個類都要構造方法併為成員設定get和set方法;(2)每個類都要有計算周長和麵積的成員方法;(3)完成該軟體包後的編碼後,在另一個包的含有main方法的類中編寫程式碼,分別使用圖形軟體包中的三個類,生成三個物件,並打印出其周長和麵積。 ①圓類
package figure; import java.math.*; public class Circle { private double radius; public Circle() { } public Circle(double radius){ this.radius=radius; } public double getRadius() { return radius; } public void setRadius(int radius) { this.radius = radius; } public double getCircumference() { return radius*Math.PI*2; } public double getArea() { return radius*Math.PI*Math.PI; } }
②矩形類
package figure; public class Rectangle { private double length,width; public Rectangle() { } public Rectangle(double length,double width){ this.width=width; this.length=length; } public double getLength() { return length; } public void setLength(double length) { this.length = length; } public double getWidth() { return width; } public void setWide(double wide) { this.width = wide; } public double getCircumference() { return (length+width)*2; } public double getArea() { return length*width; } }
③三角形類
package figure; import java.math.*; public class Triangle { private double a,b,c; public Triangle() { } public Triangle(double a,double b,double c) { this.a=a; this.b=b; this.c=c; } public double getA() { return a; } public void setA(double a) { this.a = a; } public double getB() { return b; } public void setB(double b) { this.b = b; } public double getC() { return c; } public void setC(double c) { this.c = c; } public double getCircumference() { return a+b+c; } public double getArea() { double p=(a+b+c)/2; double S=Math.sqrt(p*(p-a)*(p-b)*(p-c)); return S; } public boolean judge() { if(a+b<=c||a+c<=b||b+c<=a||Math.abs(a-b)>=c||Math.abs(a-c)>=b||Math.abs(b-c)>=a||a<=0||b<=0||c<=0) { return false; } else { return true; } } }
④測試類:
package Main; import figure.*; import java.util.Scanner; public class Main { static Scanner cin=new Scanner (System.in); public static void main(String[] args) { Triangle tri=new Triangle(1,2,3); System.out.println("Triangle:"); if(tri.judge()==true) { System.out.println("Circumference: "+tri.getCircumference()); System.out.println("Area : "+tri.getArea()); } else { System.out.println("不能構成三角形"); } Rectangle rec=new Rectangle(1,1); System.out.println("Rectangle:"); System.out.println("Circumference: "+rec.getCircumference()); System.out.println("Area : "+rec.getArea()); Circle cir=new Circle(1); System.out.println("Circle:"); System.out.println("Circumference: "+cir.getCircumference()); System.out.println("Area : "+cir.getArea()); } }
2.設計一個帶表頭的雙向連結串列(連結串列中資料的具體型別可以隨意),提供以下方法:(1)insert:在某個位置插入物件;(2)insert:在連結串列的最後插入物件;(2)delete:在某個位置刪除物件;(3)delete:刪除連結串列中與x相同的元素;(4)size:返回當前連結串列中物件的個數;(5)isEmpty:判斷連結串列是否為空;(6)traverse:遍歷連結串列,打印出所有的元素;(7)getData:取得某個位置的物件。構造main函式進行測試。
①DLinkList類
package LinkList; import java.util.*; public class DLinkList { private class Node { private Node prior; private Node next; private Object data; public Node() { this.data = null; this.prior = null; this.next = null; } public Node(Object data, Node prior, Node next) { this.data = data; this.prior = prior; this.next = next; } } private int size; private Node head; private Node tail; /* * 初始化連結串列 */ public DLinkList() { head = new Node(null, null, null); tail = new Node(null, head, null); head.next = tail; // head=head.next; size = 0; } /* * 查詢第index個節點並返回 */ public Node getNode(int index) { if (index < 0 || index >= size) { throw new IndexOutOfBoundsException(); } Node p = head; for (int i = 0; i < index; i++) { p = p.next; } return p; } /* * (1)insert:在某個位置插入物件; */ public int insert(int index, Object data) { if (index < 0 || index >= size) { throw new IndexOutOfBoundsException(); } if (index == 0) { Node p = new Node(data, head, head.prior); head.next.prior = p; head.next = p; size++; return 1; } Node q = getNode(index - 1); Node p = new Node(data, q, q.next); q.next.prior = p; q.next = p; size++; return 1; } /* * (2)insert:在連結串列的最後插入物件; */ public int insert(Object data) { Node p = new Node(data, null, null); tail.prior.next = p; p.prior = tail.prior; p.next = tail; tail.prior = p; size++; return 1; } /* * (2)delete:在某個位置刪除物件; */ public int delete(int index, Object data) { if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); Node q = getNode(index); q.prior.next = q.next; q.next.prior = q.prior; size--; return 1; } /* * (3)delete:刪除連結串列中與x相同的元素; */ public int delete(Object data) { Node q = head; for (int i = 0; i < size; i++) { if (q.data.equals(data)) { this.delete(i, data); } q = q.next; } return 1; } /* * (4)size:返回當前連結串列中物件的個數; */ public int Getsize() { return size; } /* * (5)isEmpty:判斷連結串列是否為空; */ public boolean isEmpty() { if (size == 0) return true; else return false; } /* * (6)traverse:遍歷連結串列,打印出所有的元素; */ public void traverse() { Node q = head; for (int i = 0; i < size; i++) { q = q.next; if (i == 0) System.out.print(q.data); else System.out.print(" " + q.data); } System.out.print("\n"); } /* * (7)getData:取得某個位置的物件。 */ public Object getData(int index) { Node p = head; for (int i = 0; i < index; i++) { p = p.next; } return p.data; } }
②測試類:
package Main; import LinkList.DLinkList;; public class Main { public static void main(String[] args) { int x = 0; DLinkList list=new DLinkList(); System.out.println("獲取初始連結串列長度:\n"+list.Getsize()); System.out.println("在連結串列依次新增元素1,3,4,5,3,並列印連結串列:"); for(int i=1;i<=5;i++) { if(i!=2) list.insert(i); }list.insert(3); list.traverse(); System.out.println("在連結串列第2個位置新增元素2,並列印連結串列:"); list.insert(2,2); list.traverse(); System.out.println("獲取連結串列中第5個元素:\n"+list.getData(5)); System.out.println("刪除連結串列中第4個元素,並列印連結串列:"); list.delete(4,x); list.traverse(); System.out.println("刪除連結串列中第一個值為3的元素,並列印連結串列:"); list.delete(3); list.traverse(); System.out.println("判斷連結串列是否為空:\n"+list.isEmpty()); System.out.println("獲取連結串列長度:\n"+list.Getsize()); } }
3.設計一個教師類Teacher(屬於cn.net.sdkd包),要求:
1)屬性有編號(int no)、姓名(String name)、年齡(int age)、所屬學院(String seminary),為這些屬性設定相應2)的get和set方法。
3)為Teacher類重寫equals方法,要求:當兩個教師物件的no相同時返回true。
4)重寫Teacher類的toString方法,通過該方法可以返回“編號為**、姓名為**、年齡為**的**學院老師”形式的字串。
5)由多個Teacher物件所形成的陣列可以以兩種方法排序(編號由低到高排序):1)使用Arrays.sort(Object[] a)方法;2)6)使用Arrays.sort(Object[] a, Comparator c)方法。
7)再定義一個類TeacherManagement(屬於cn.sd包),提供方法search,方法可以在一組給定的教師中,根據姓名(或年齡)返回等於指定姓名(或年齡)的教師的字串資訊,資訊格式為:“編號為**、姓名為**、年齡為**的**學院老師”。如果沒有滿足條件的教師,則返回“沒有符合條件的教師”。
8)構造main方法進行測試。 ①Teacher類
package cn.net.sdkd; import java.util.Arrays; import java.util.Comparator; public class Teacher implements Comparable{ private int no; private int age; private String name; private String seminary; public Teacher() { } public Teacher(int no,int age,String name,String seminary) { this.no=no; this.age=age; this.name=name; this.seminary=seminary; } public int getNo() { return no; } public int getAge() { return age; } public String getName() { return name; } public String getSeminary() { return seminary; } public void setTeacher(int no,int age,String name,String seminary) { this.no=no; this.age=age; this.name=name; this.seminary=seminary; } public boolean equals(Teacher tea){ if(this.no==tea.no) return true; else return false; } public String toString() { String s; s = "編號為" + no + "、姓名為" + name + "、年齡為" + age + "的" + seminary + "學院老師"; return s; } public int compareTo(Object o) { int no2=((Teacher)o).no; if(no<no2) { return -1; } else { return 1; } } }
②TeacherManagement類
package cn.sd; import cn.net.sdkd.Teacher; public class TeacherManagement { /* * 按年齡查詢 */ public static void search(Teacher[] teachers,int age) { int len=teachers.length; for(int i=0;i<len;i++) { if(age==teachers[i].getAge()) { System.out.println(teachers[i].toString()); break; } else if(i==len-1) { System.out.println("沒有符合條件的老師"); } } } /* * 按姓名查詢 */ public static void search(Teacher[] teachers,String name) { int len=teachers.length; for(int i=0;i<len;i++) { if(name==teachers[i].getName()) { System.out.println(teachers[i].toString()); break; } else if(i==len-1) { System.out.println("沒有符合條件的老師"); } } } }
③測試類:
package Main; import cn.sd.TeacherManagement; import java.util.Arrays; import java.util.Comparator; import cn.net.sdkd.*; public class Main { public static void main(String[] args) { Teacher[] teachers = new Teacher[3]; teachers[0] = new Teacher(3, 30, "Tom", "外國語"); teachers[1] = new Teacher(1, 28, "張三", "化工"); teachers[2] = new Teacher(2, 59, "小明", "計算機"); System.out.println("未排序:"); for (int i = 0; i < 3; i++) { System.out.println(teachers[i].toString()); } System.out.println("按編號排序:"); Arrays.sort(teachers); Arrays.sort(teachers, new SortByNo()); for (int i = 0; i < 3; i++) { System.out.println(teachers[i].toString()); } System.out.println("查詢姓名為小明的老師:"); TeacherManagement.search(teachers, "小明"); System.out.println("查詢年齡為18歲的老師:"); TeacherManagement.search(teachers, 18); } } class SortByNo implements Comparator<Teacher>{ public int compare(Teacher o1, Teacher o2) { if(o1.getNo()<o2.getNo()){ return -1; } else { return 1; } } }
4.編碼實現一個類:(1)提供一個靜態方法,可以將輸入的一個int[]陣列按照從小到大的順序排列;(2)提供靜態方法,對排好序的陣列使用折半(二分)查詢(使用遞迴和非遞迴兩種形式分別實現)查詢某一個整數。
①FTest類
package Find; public class FTest { private static int []arr; public FTest(int []a,int n) { arr=new int[n]; for(int i=0;i<a.length;i++) { arr[i]=a[i]; } } /* * 1)提供一個靜態方法,可以將輸入的一個int[]陣列按照從小到大的順序排列; */ public static void sort() { for(int i=0;i<arr.length-1;i++) { for(int j=0;j<arr.length-1;j++) { if(arr[j]>arr[j+1]) { int temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } } /* * (2)提供靜態方法,對排好序的陣列使用折半(二分)查詢 * (使用遞迴和非遞迴兩種形式分別實現)查詢某一個整數。 */ //非遞迴 public static int search(int x) { int left=0; int right=arr.length-1; while(left <= right) { int middle = (left + right)/2; if(x==arr[middle]) { return middle; }else if (x < arr[middle]) { right = middle - 1; }else { left = middle + 1; } } return -1; } // 遞迴 public static int search(int x, int left, int right) { int middle = (left + right) / 2; if (x < arr[left] || x > arr[right]) { return -1; } if (x == arr[middle]) { return middle; } else if (x < arr[middle]) { search(x, left, middle - 1); } else { search(x, middle + 1, right); } return -1; } public static void Print() { for(int i=0;i<arr.length;i++) { if(i==0) { System.out.print(arr[i]); } else { System.out.print(" "+arr[i]); } } System.out.print("\n"); } }
②測試類
package Main; import Find.FTest; import java.math.*; public class Main { public static void main(String[] args) { int []arr=new int[5]; for(int i=0;i<5;i++) { arr[i]=5-i; } FTest A=new FTest(arr,arr.length); System.out.println("排序前:"); A.Print(); A.sort(); System.out.println("排序後: "); A.Print(); int ans=A.search(5); System.out.println("迴圈查詢數值為5的元素:"); if(ans==-1) { System.out.println("該元素不在陣列中。"); } else { System.out.println("該元素在第"+ans+"個位置。"); } ans=A.search(10, 0, arr.length-1); System.out.println("遞迴查詢數值為10的元素:"); if(ans==-1) { System.out.println("該元素不在陣列中。"); } else { System.out.println("該元素在第"+ans+"個位置。"); } } }
5.使用一維陣列編碼實現一個棧(Stack)類,要求提供以下操作:(1)boolean isEmpty():判斷棧當前是否為空;(2)入棧操作void push(obj):把資料元素obj插入堆疊;(3)出棧操作Object pop():出棧,並返回刪除的資料元素;(4)Object getTop():取堆疊當前棧頂的資料元素並返回;(5)利用Stack類實現一個方法:輸入一個正整數,輸出該整數所對應的二進位制數。
①Stack類
package Test; /* * 一維陣列編碼實現一個棧(Stack)類 */ public class Stack { private static Object []arr; private static int length; private int size=4; public static int getLength() { return length; } public Object getArr(int index) { return arr[index]; } private int addsize=10; public Stack() { arr = new Object[size]; length = 0; } /* * (1)boolean isEmpty():判斷棧當前是否為空; */ public boolean isEmpty() { return length==0; } /* * 陣列擴容 */ public void addLengthArray() { Object []brr=new Object[size+addsize]; System.arraycopy(arr, 0, brr, 0, arr.length); size=size+addsize; arr=brr; } /* * (2)入棧操作void push(obj):把資料元素obj插入堆疊; */ public void push(Object obj) { //陣列記憶體不足時,進行擴容操作 if(length+1>size) { addLengthArray(); } arr[length]=obj; length++; } /* * (3)出棧操作Object pop():出棧,並返回刪除的資料元素; */ public Object pop() { Object data=arr[length-1]; arr[length-1]=0; length--; return data; } /* * (4)Object getTop():取堆疊當前棧頂的資料元素並返回; */ public Object getTop() { return arr[length-1]; } /* * 列印棧內元素 */ public void print() { for(int i=0;i<length;i++) { System.out.print(arr[i]); } System.out.print("\n"); } }
②測試類
package Main; import Test.Stack; public class Main { public static void change(int data) { Stack s=new Stack(); while(data!=0) { int x=data%2; s.push(x); data/=2; } for(int i=s.getLength()-1;i>=0;i--) { System.out.print(s.getArr(i)); } System.out.print("\n"); } public static void main(String[] args) { Stack s=new Stack(); for(int i=1;i<6;i++) { s.push(i); } s.push("sss"); System.out.println("元素插入棧中後:"); s.print(); s.pop(); System.out.println("一次出棧操作後:"); s.print(); System.out.println("取堆疊當前棧頂的資料元素:"); System.out.println(s.getTop()); System.out.println("判斷棧當前是否為空:"); System.out.println(s.isEmpty()); System.out.println("將十進位制26轉為二進位制:"); change(26); } }
6.按照要求使用Java編碼。 1)以型別int[][]宣告一個叫matrix的二維陣列變數,將矩陣初始化為一個5個元素的陣列。 2)以下列方式為matrix的內部元素賦值:matrix從零開始迴圈到其長度值;例如索引為i,在每次迭代中,將matrix[i]指向一個新的整數陣列,其長度為i。然後用索引變數j,對陣列中的每一個元素進行迴圈。在每次內部迴圈中,將matrix[i][j]賦值為(i*j)。 3)通過迴圈列印matrix中的所有元素,結果為:
<>
<0>
<0 2>
<0 3 6>
<0 4 8 12>
package Test; public class Matrix { public static void main(String[] args) { int [][]matrix=new int[5][]; for(int i=0;i<5;i++) { matrix[i]=new int[i]; for(int j=0;j<i;j++) { matrix[i][j]=i*j; } } for(int i=0;i<5;i++) { System.out.print("<"); for(int j=0;j<i;j++) { if(j==0) System.out.print(matrix[i][j]); else System.out.print(" "+matrix[i][j]); } System.out.println(">"); } } }
7.利用二維陣列(double[])實現一個矩陣類:Matrix。要求提供以下方法:(1)set(int row, int col, double value):將第row行第col列的元素賦值為value;(2)get(int row,int col):取第row行第col列的元素;(3)width():返回矩陣的列數;(4)height():返回矩陣的行數;(5)Matrix add(Matrix b):返回當前矩陣與矩陣b相加後的矩陣;(6)Matrix multiply(Matrix b):返回當前矩陣與矩陣b相乘後的矩陣。(7)Matrix transpose():返回當前矩陣的轉置矩陣;(8)getMax():返回矩陣中的最大值及其所在行和列;(9)print():以行和列的形式打印出當前矩陣。
①Matrix類
package Matrix; import java.awt.Point; import java.util.Vector; public class Matrix { private double[][] matrix; private int n,m; public Matrix(int n,int m) { this.n=n; this.m=m; matrix=new double [n][m]; } public Matrix(double arr[][],int n,int m) { this.n=n; this.m=m; matrix=new double [n][m]; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { matrix[i][j]=arr[i][j]; } } } /* * (1)將第row行第col列的元素賦值為value; */ public void set(int row, int col, double value){ matrix[row-1][col-1]=value; } /* * (2)取第row行第col列的元素; */ public double get(int row,int col){ return matrix[row-1][col-1]; } /* * (3)返回矩陣的列數; */ public int width() { return m; } /* * (4)返回矩陣的行數; */ public int height() { return n; } /* * (5)返回當前矩陣與矩陣b相加後的矩陣; */ public Matrix add(Matrix b) { Matrix c=new Matrix(this.matrix,n,m); if(n!=b.n||m!=b.m) { throw new IndexOutOfBoundsException(); } for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { c.matrix[i][j]+=b.matrix[i][j]; } } return c; } /* * (6)返回當前矩陣與矩陣b相乘後的矩陣。 */ public Matrix multiply(Matrix b) { if (m != b.n) { throw new IndexOutOfBoundsException(); } Matrix c = new Matrix(n, b.m); for (int i = 0; i < c.n; i++) { for (int j = 0; j < c.m; j++) { for (int k = 0; k < m; k++) { c.matrix[i][j] += matrix[i][k] * b.matrix[k][j]; } } } return c; } /* * (7)返回當前矩陣的轉置矩陣; */ public Matrix transpose() { Matrix c=new Matrix(m,n); for(int i=0;i<c.n;i++) { for(int j=0;j<c.m;j++) { c.matrix[i][j]=matrix[j][i]; } } return c; } /* * (8)返回矩陣中的最大值及其所在行和列; */ public Vector<Point> getMax(){ Vector<Point> points = new Vector<Point>(100); double max=Double.MIN_EXPONENT; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(matrix[i][j]>max) { max=matrix[i][j]; } } } for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(matrix[i][j]==max) { Point p = new Point(i, j); points.add(p); } } } return points; } /* * (9)以行和列的形式打印出當前矩陣。 */ public void print(){ for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(j==0) { System.out.print(matrix[i][j]); }else { System.out.print(" "+matrix[i][j]); } } System.out.print("\n"); } } }
②測試類
package Main; import java.awt.Point; import java.util.Vector; import Matrix.Matrix; public class Main { public static void main(String[] args) { int n=2,m=3; double [][]arr=new double[10][10]; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { arr[i][j]=(i*i+j*j)%9+1;//隨便取的值 } } Matrix matrix = new Matrix(arr, n, m); System.out.println("列印原始矩陣:"); matrix.print(); System.out.println("將第1行第2列元素更改為6,並列印矩陣:"); matrix.set(1, 2, 6); matrix.print(); System.out.println("獲取矩陣第1行第2列元素:"); System.out.println(matrix.get(1, 2)); System.out.println("獲取矩陣的行數與列數: "); System.out.println(matrix.height()+" , "+matrix.width()); double [][]brr=new double[10][10]; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { brr[i][j]=1; } } Matrix matrix2 = new Matrix(brr, n, m); System.out.println("矩陣matrix與matrix2相加,並列印所得矩陣:"); matrix.add(matrix2).print(); double [][]crr=new double[10][10]; for(int i=0;i<m;i++) { for(int j=0;j<2*n;j++) { crr[i][j]=0; } } Matrix matrix3 = new Matrix(crr, m, 2*n); System.out.println("矩陣matrix與matrix3相乘,並列印所得矩陣:"); matrix.multiply(matrix3).print(); System.out.println("列印matrix的轉置矩陣:"); matrix.transpose().print(); System.out.println("獲取matrix矩陣的最大值及所在行和列:"); Vector<Point> points = matrix.getMax(); System.out.print(matrix.get((int)points.get(0).getX()+1, (int)points.get(0).getY()+1)); for(Point p:points) { System.out.print("\t( "+(int)(p.getX()+1)+", "+(int)(p.getY()+1)+" )"); } } }