(1)编写一个计算各种形状的面积和周长的程序。
要求:父类Shape2D为一个抽象类,其中包含计算周长和计算面积两个方法。其他形状圆(Circle),三角形(Triangle)和长方形(Rectangle)均继承自Shape2D类。而Square继承自Rectangle类。编写测试类来计算这些形状的面积。
提示:不同的形状包含的属性应该不同,构造函数应该不同,计算周长和面积的方法也应该不同。
Shape2D.java
package shape;
public abstract class Shape2D {
public abstract double getCircumference(); //计算周长
public abstract double getArea(); //计算面积
}
Circle.java
package shape;
import java.lang.*;
public class Circle extends Shape2D {
private double r; //圆的半径
public Circle(double r) {
super();
this.r = r;
}
@Override
public double getCircumference() {
return 2*Math.PI*r;
}
@Override
public double getArea() {
return Math.PI*r*r;
}
}
Triangle.java
package shape;
import java.lang.*;
public class Triangle extends Shape2D {
private double a;
private double b;
private double c;
public Triangle(double a, double b, double c) {
this.a=a;
this.b=b;
this.c=c;
}
@Override
public double getCircumference() {
// TODO Auto-generated method stub
return a+b+c;
}
@Override
public double getArea() {
// TODO Auto-generated method stub
double p = (a+b+c)/2.0;
return Math.sqrt(p*(p-a)*(p-b)*(p-c));
}
}
Rectangle.java
package shape;
public class Rectangle extends Shape2D {
private double c;
private double k;
public Rectangle(double c,double k) {
// TODO Auto-generated constructor stub
this.c=c;
this.k=k;
}
@Override
public double getCircumference() {
// TODO Auto-generated method stub
return 2*(c+k);
}
@Override
public double getArea() {
// TODO Auto-generated method stub
return c*k;
}
}
TestShape.java
package shape;
public class TestShape {
public static void main(String[] args) {
// TODO Auto-generated method stub
//测试矩形类,求矩形的周长和面积
Rectangle Rectrect=new Rectangle(5, 6);
System.out.println("长是5,宽是6的矩形的周长是: "+Rectrect.getCircumference());
System.out.println("长是5,宽是6的矩形的面积是: "+Rectrect.getArea());
//测试圆形类,求圆形的周长和面积
Circle circle=new Circle(5);
System.out.println("\n半径是5的圆的周长是: "+circle.getCircumference());
System.out.println("半径是5的圆的面积是: "+circle.getArea());
//测试三角形类,求三角形的周长和面积
Triangle triangle=new Triangle(3,4,5);
System.out.println("\n边长为3,4,5的三角形的周长是: "+triangle.getCircumference());
System.out.println("边长为3,4,5的三角形的面积是: "+triangle.getArea());
}
}
(2)设计并实现一个直线(Line2D)类,可以通过三个构造函数分别使用点斜式、两点式和截距式三种方法来构造直线。并对直线做简单的比较。
要求:1. 点需要使用Point2D类表示,并且重写Point2D类的equals()方法,来判断两个点是否相同。
2. 重写Line2D类的equals()方法,判断两条直线是否同一条。
3. 编写boolean isParallel(Line2D)方法,判断两条直线是否平行。
提示:1. 使用两点式构造函数时,注意两点重合则无法唯一确定一条直线。
2. 使用点斜式时,当直线平行于y轴时,斜率为无穷大,但是Java语言中double类型可以表示无穷大,Double. NEGATIVE_INFINITY和Double. POSITIVE_INFINITY,请参阅Java API文档。
3. 建议将三种构造函数统一成一种表示方法,以方便比较直线是否相等。
4. 在判断两条直线是否平行时,首先要排除两条直线重合的情况。
Point2D.java
package line;
public class Point2D {
private double x,y;
public Point2D(double param_x,double param_y){
x=param_x;
y=param_y;
}
public boolean equals(Point2D b){
if(x==b.x&&y==b.y)
return true;
else
return false;
}
public double getx(){
return x;
}
public double gety(){
return y;
}
}
Line2D.java
package line;
public class Line2D {
private double A,B,C;
public Line2D(double k,double b){
A=k;
B=-1;
C=b;
}
public Line2D(Point2D a,Point2D b){
if(!a.equals(b))
{
A=1/(a.getx()-b.getx());
B=1/(b.gety()-a.gety());
C=b.gety()/(a.gety()-b.gety())-b.getx()/(a.getx()-b.getx());
}
else
{
System.out.print("Two points is same!\n");
System.exit(0);
}
}
public Line2D(double a,double b,int t){
if(t==1)
{
A=b;
B=a;
C=-a*b;
}
else
{
System.out.println("Format error!");
System.exit(0);
}
}
public boolean equals(Line2D b){
if(A==b.A&&B==b.B&&C==b.C)
return true;
return false;
}
public boolean isParallel(Line2D b){
if(A*b.B==B*b.A&&C!=b.C)
return true;
return false;
}
}
(3)设计并实现三个类:班级(Class)、学生(Student)、课程(Course)。然后计算班上每个同学的加权成绩。最后允许用户输入学生的学号查询学生信息。
要求:班级类的私有属性包含班级名称、学生人数以及学生列表(用对象数组表示)。班级类的方法包括:
构造函数Class(int nSutdent)
使用addStudent(Student student)来往班级中添加学生
使用calculateWeightedGrade()方法计算班上所有学生的加权成绩
重写toString()方法来将班级信息转换成字符串
编写方法获得班上的学生
学生类的私有属性包含学生的学号、姓名、所选课程数量、所选课程(用对象数组表示)。学生类的方法包括
构造函数Student(int id, String name, int nCourse)
使用addCourse(Course course)来往学生类中添加课程
使用calculateWeightedGrade()来计算该学生的加权成绩
重写toString()方法来将学生信息转换成字符串
使用printStudentInfo()方法来打印学生的基本信息
课程类包含私有属性课程编号、课程名称、学分、是否缓考以及成绩(成绩要求在0到100分之间)。方法包括获取课程各个属性的方法。
构造函数Course(int id, String name, int credit)
使用方法设置是否缓考和成绩
重写toString()方法来将课程信息转换成字符串
编写一个测试类来测试这三个类的使用。要求最少往班级中创建5个学生,学生可以选修0到最多5门课程。程序运行后,先计算好班级中每个同学的加权成绩。然后等待用户输入学号查询学生,如果有对应的学生,则输出学生的信息、选修课程信息、最后输出加权成绩。直到用户输入-1退出程序。
提示:加权成绩的计算公式为:
其中,g表示最后的加权成绩,n表示同学选修的课程数,si表示第i门课的成绩,wi表示第i门课的学分。
注意:如果某生某课程缓考,则该门课成绩不能计入加权成绩内。此外,类中不可出现公用属性,必须使用封装。
Student.java
package test3;
//瀛︾敓绫荤殑绉佹湁灞炴�у寘鍚鐢熺殑瀛﹀彿銆佸鍚嶃�佹墍閫夎绋嬫暟閲忋�佹墍閫夎绋嬶紙鐢ㄥ璞℃暟缁勮〃绀猴級銆傚鐢熺被鐨勬柟娉曞寘鎷�
//飦瀯閫犲嚱鏁癝tudent(int id, String name, int nCourse)
//飦娇鐢╝ddCourse(Course course)鏉ュ線瀛︾敓绫讳腑娣诲姞璇剧▼
//飦娇鐢╟alculateWeightedGrade()鏉ヨ绠楄瀛︾敓鐨勫姞鏉冩垚缁�
//飦噸鍐檛oString()鏂规硶鏉ュ皢瀛︾敓淇℃伅杞崲鎴愬瓧绗︿覆
//飦娇鐢╬rintStudentInfo()鏂规硶鏉ユ墦鍗板鐢熺殑鍩烘湰淇℃伅
public class Student {
private int id;
private String name;
private int nCourse;
private Course[] course;
private int WeightedGrade = 0;
private int i = 0;
public Student(int id, String name, int nCourse) {
super();
this.id = id;
this.name = name;
this.nCourse = nCourse;
course = new Course[nCourse];
}
public int getId() {
return id;
}
public int getWeightedGrade() {
return WeightedGrade;
}
public void addCourse(Course course)
{
this.course[i] = course;
i++;
}
private void calculateWeightedGrade()
{
int sumgrade = 0;
int sumcredit = 0;
for(int i = 0;i < this.nCourse;i++)
{
if(!this.course[i].isDelay())
{
sumgrade = sumgrade+this.course[i].getGrade() * this.course[i].getCredit();
sumcredit = sumcredit+this.course[i].getCredit();
}
}
this.WeightedGrade = sumgrade/sumcredit;
}
public void printStudentInfo()
{
System.out.println("This student id is "+id+",name is "+name+",nCourse is "+nCourse);
for(int i = 0;i<this.nCourse;i++)
{
System.out.println(" "+this.course[i].toString()+" "+this.course[i].getGrade());
}
calculateWeightedGrade();
System.out.println("WeightedGrade is "+this.WeightedGrade);
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "This student id is "+id+",name is "+name+",nCourse is"+nCourse;
}
}
Class.java
package test3;
//鐝骇绫荤殑绉佹湁灞炴�у寘鍚彮绾у悕绉般�佸鐢熶汉鏁颁互鍙婂鐢熷垪琛紙鐢ㄥ璞℃暟缁勮〃绀猴級銆傜彮绾х被鐨勬柟娉曞寘鎷細
//飦瀯閫犲嚱鏁癈lass(int nSutdent)
//飦娇鐢╝ddStudent(Student student)鏉ュ線鐝骇涓坊鍔犲鐢�
//飦娇鐢╟alculateWeightedGrade()鏂规硶璁$畻鐝笂鎵�鏈夊鐢熺殑鍔犳潈鎴愮哗
//飦噸鍐檛oString()鏂规硶鏉ュ皢鐝骇淇℃伅杞崲鎴愬瓧绗︿覆
//飦紪鍐欐柟娉曡幏寰楃彮涓婄殑瀛︾敓
public class Class {
private String Classname;
private int Stunumber;
private Student[] Stulist;
private int i = 0;
public Class(String classname, int stunumber) {
super();
Classname = classname;
Stunumber = stunumber;
this.Stulist = new Student[this.Stunumber];
}
public void addStudent(Student student)
{
this.Stulist[i] = student;
i++;
}
public void calculateWeightedGrade()
{
for(int i = 0;i < this.Stunumber;i++)
{
this.Stulist[i].getWeightedGrade();
}
}
public void findstu(int a)
{
int j = -1;
for(int i = 0 ;i < this.Stunumber;i++)
{
if(this.Stulist[i].getId() == a)
j = i;
}
if(j!=-1)
{
this.Stulist[j].printStudentInfo();
}
else
{
System.out.println("Don't find");
}
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "This class classname is "+this.Classname+",stunumber is "+this.Stunumber;
}
}
Course.java
package test3;
//璇剧▼绫诲寘鍚鏈夊睘鎬ц绋嬬紪鍙枫�佽绋嬪悕绉般�佸鍒嗐�佹槸鍚︾紦鑰冧互鍙婃垚缁╋紙鎴愮哗瑕佹眰鍦�0鍒�100鍒嗕箣闂达級銆傛柟娉曞寘鎷幏鍙栬绋嬪悇涓睘鎬х殑鏂规硶銆�
//飦瀯閫犲嚱鏁癈ourse(int id, String name, int credit)
//飦娇鐢ㄦ柟娉曡缃槸鍚︾紦鑰冨拰鎴愮哗
//飦噸鍐檛oString()鏂规硶鏉ュ皢璇剧▼淇℃伅杞崲鎴愬瓧绗︿覆
public class Course {
private int id;
private String name;
private int credit;
private boolean delay;
private int grade;
public Course(int id, String name, int credit) {
super();
this.id = id;
this.name = name;
this.credit = credit;
}
public boolean isDelay() {
return delay;
}
public void setDelay(boolean delay) {
this.delay = delay;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
if(grade>=0&&grade<=100)
this.grade = grade;
else
{
System.out.println("grade is error");
this.grade = -1;
}
}
public int getCredit() {
return credit;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return id +" " + name + " " + credit;
}
}
Test.java
package test3;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Class myclass = new Class("NO.1",5);
Student stu1 = new Student(1,"A",1);
Course c1 = new Course(1,"GS",5);
c1.setGrade(91);
c1.setDelay(false);
stu1.addCourse(c1);
myclass.addStudent(stu1);
Student stu2 = new Student(2,"B",2);
Course c2 = new Course(1,"GS",5);
c2.setGrade(92);
c2.setDelay(false);
stu2.addCourse(c2);
Course c3 = new Course(2,"XD",4);
c3.setGrade(92);
c3.setDelay(false);
stu2.addCourse(c3);
myclass.addStudent(stu2);
Student stu3 = new Student(3,"C",3);
Course c4 = new Course(1,"GS",5);
c4.setGrade(93);
c4.setDelay(false);
stu3.addCourse(c4);
Course c5 = new Course(2,"XD",4);
c5.setGrade(93);
c5.setDelay(false);
stu3.addCourse(c5);
Course c6 = new Course(3,"LX",3);
c6.setGrade(93);
c6.setDelay(false);
stu3.addCourse(c6);
myclass.addStudent(stu3);
Student stu4 = new Student(4,"D",4);
Course c7 = new Course(1,"GS",5);
c7.setGrade(94);
c7.setDelay(false);
stu4.addCourse(c7);
Course c8 = new Course(2,"XD",4);
c8.setGrade(94);
c8.setDelay(false);
stu4.addCourse(c8);
Course c9 = new Course(3,"LX",3);
c9.setGrade(94);
c9.setDelay(false);
stu4.addCourse(c9);
Course c10 = new Course(4,"YY",2);
c10.setGrade(94);
c10.setDelay(false);
stu4.addCourse(c10);
myclass.addStudent(stu4);
Student stu5 = new Student(5,"E",5);
Course c11 = new Course(1,"GS",5);
c11.setGrade(95);
c11.setDelay(false);
stu5.addCourse(c11);
Course c12 = new Course(2,"XD",4);
c12.setGrade(95);
c12.setDelay(false);
stu5.addCourse(c12);
Course c13 = new Course(3,"LX",3);
c13.setGrade(95);
c13.setDelay(false);
stu5.addCourse(c13);
Course c14 = new Course(4,"YY",2);
c14.setGrade(95);
c14.setDelay(false);
stu5.addCourse(c14);
Course c15 = new Course(5,"HB",1);
c15.setGrade(95);
c15.setDelay(true);
stu5.addCourse(c15);
myclass.addStudent(stu5);
int i=1;
while(i==1)
{
System.out.println(myclass.toString());
myclass.calculateWeightedGrade();
System.out.println("Input student number:");
Scanner input= new Scanner(System.in);
int in = input.nextInt();
if(in == -1)
{
i = 0;
}
else
{
myclass.findstu(in);
}
}
}
}