JAVA第二次平时作业
作业2:
作业要求:
设计一个处理复数运算的类,该类中至少有两个成员方法:
复数加法和复数减法运算。
在上述类中添加两个静态方法:求一个复数的模和求一个复
数的复角。
设计一个子类,该子类继承了上述的类,并且至少拥有自己
的两个方法:复数乘法和复数除法。
再设计一个类,包含main方法,对上面的类进行应用与测试。
该作业要求编程并调试通过。对你设计的类要有详细的文字
说明(类所封装的内容,属性、方法的功能与含义等)
代码:
package homework2; //Calculate类 public class Calculate extends Operation{ public Calculate(){} //计算两复数相乘 public Complex multiple(Complex complex1,Complex complex2){ double ret_real = complex1.real*complex2.real - complex1.imaginary*complex2.imaginary; double ret_imaginary = complex1.real*complex2.imaginary + complex1.imaginary*complex2.real; Complex ret = new Complex(ret_real,ret_imaginary); return ret; } //计算两复数相除 public Complex div(Complex complex1,Complex complex2) { double real = (complex1.real*complex2.real + complex1.imaginary*complex2.imaginary) /(complex2.real*complex2.real + complex2.imaginary*complex2.imaginary); double imaginary = (complex1.imaginary*complex2.real - complex1.real*complex2.imaginary) /(complex2.real*complex2.real + complex2.imaginary*complex2.imaginary); Complex ret = new Complex(real,imaginary); return ret; } }
1 package homework2; 2 3 //复数类 4 public class Complex { 5 //实部和虚部 6 double real,imaginary; 7 8 9 public Complex(){} 10 //构造方法 11 public Complex(double real,double imaginary){ 12 this.real = real; 13 this.imaginary = imaginary; 14 } 15 16 //输出复数的实部和虚部 17 public void print() { 18 System.out.println(real + " " + imaginary); 19 } 20 }
1 package homework2; 2 3 import java.lang.Math; 4 5 //处理复数运算的类 6 public class Operation { 7 8 public Operation(){} 9 10 //复数加法 11 public Complex add(Complex complex1,Complex complex2){ 12 Complex ret = new Complex(complex1.real + complex2.real,complex1.imaginary + complex2.imaginary); 13 return ret; 14 } 15 16 //复数减法 17 public Complex sub(Complex complex1,Complex complex2){ 18 Complex ret = new Complex(complex1.real - complex2.real,complex1.imaginary - complex2.imaginary); 19 return ret; 20 } 21 22 //求一个复数的模 23 public static double abs(Complex complex){ 24 return Math.sqrt(complex.real*complex.real + complex.imaginary*complex.imaginary); 25 } 26 27 //求一个复数的辐角 28 public static double arg(Complex complex){ 29 return Math.atan2(complex.imaginary,complex.real); 30 } 31 32 }
1 package homework2; 2 3 import java.util.Scanner; 4 5 //Test类包含main方法,对其他三个类进行应用与测试 6 public class Test { 7 public static void main(String args[]) { 8 Complex complex1 = new Complex();//复数1 9 Complex complex2 = new Complex();//复数2 10 11 //使用Scanner读入两复数 12 Scanner reader = new Scanner(System.in); 13 //读入第一个复数 14 System.out.println("请输入第一个复数的实部和虚部:"); 15 complex1.real = reader.nextDouble();//读入实部 16 complex1.imaginary = reader.nextDouble();//读入虚部 17 //读入第二个复数 18 System.out.println("请输入第二个复数的实部和虚部:"); 19 complex2.real = reader.nextDouble();//读入实部 20 complex2.imaginary = reader.nextDouble();//读入虚部 21 22 //停止输入 23 reader.close(); 24 25 //创建operate对象 26 Operation operate = new Operation(); 27 28 //通过operate实现两复数相加 29 Complex addtion = operate.add(complex1, complex2); 30 //输出相加后的结果 31 System.out.println("两复数相加后实部和虚部分别为"); 32 addtion.print(); 33 34 //通过operate实现两复数相减 35 Complex sub = operate.sub(complex1, complex2); 36 //输出相减后的结果 37 System.out.println("两复数相减后实部和虚部分别为"); 38 sub.print(); 39 40 //输出第一个复数的模长 41 System.out.println("第一个复数的模长为:"+Operation.abs(complex1)); 42 //输出第一个复数的辐角 43 System.out.println("第一个复数的辐角为:"+Operation.arg(complex1)); 44 45 //创建calculte对象 46 Calculate calculate = new Calculate(); 47 48 //通过calculate实现两复数相乘 49 Complex mul = calculate.multiple(complex1, complex2); 50 //输出相乘后的结果 51 System.out.println("两复数相乘后实部和虚部分别为"); 52 mul.print(); 53 54 //通过calculate实现两复数相除 55 Complex div = calculate.div(complex1, complex2); 56 //输出相除后的结果 57 System.out.println("两复数相除后实部和虚部分别为"); 58 div.print(); 59 } 60 }
运行结果:
作业3:
作业要求:
编写一个线段类 MyLine,要求如下:
主要属性有: x ,y ;类型为Point (查看API)
编写构造方法,如 MyLine(Point p1 , Point p2)
编写5个成员方法。如:
检查线段是否位于第一象限check()…
求线段的长度 length() …
判断两条直线是否相交(另一线段作为参数)。
编写一点到该线段(或延长线)的距离
其他方法。
注:编写方法时,考虑利用Point类的方法
编写测试程序
该作业要求编程并调试通过。对你设计的类要有详细的文字
说明(类所封装的内容,属性、方法的功能与含义等)
代码:
1 package homework3; 2 3 import java.awt.Point; 4 import java.math.*; 5 import java.util.Scanner; 6 7 class MyLine { 8 Point x,y; 9 10 public MyLine(){}//构造方法 11 12 //构造方法 13 public MyLine(Point p1,Point p2){ 14 x = p1; 15 y = p2; 16 } 17 18 //检查线段是否位于第一象限 19 public boolean check() { 20 if (x.x > 0 && x.y > 0 && y.x > 0 && y.y > 0) return true; 21 else return false; 22 } 23 24 //求线段的长度 25 public double length() { 26 return Math.sqrt((x.y-x.x)*(x.y-x.x)+(y.y-y.x)*(y.y-y.x)); 27 } 28 29 //判断两条线段是否相交 30 public boolean intersection(MyLine bLine) { 31 /* 32 *快速排斥: 33 *两个线段为对角线组成的矩形,如果这两个矩形没有重叠的部分,那么两条线段是不可能出现重叠的 34 */ 35 if(!(Math.min(this.x.x,this.y.x)<=Math.max(bLine.x.x,bLine.y.x) && 36 Math.min(bLine.x.y,bLine.y.y)<=Math.max(this.x.y,this.y.y)&& 37 Math.min(bLine.x.x,bLine.y.x)<=Math.max(this.x.x,this.y.x) && 38 Math.min(this.x.y,this.y.y)<=Math.max(bLine.x.y,bLine.y.y))) 39 return false; 40 /* 41 *跨立实验: 42 *如果两条线段相交,那么必须跨立,就是以一条线段为标准,另一条线段的两端点一定在这条线段的两段 43 *也就是说a b两点在线段cd的两端,c d两点在线段ab的两端 44 */ 45 double u,v,w,z;//分别记录两个向量 46 u=(bLine.x.x-this.x.x)*(this.y.y-this.x.y)-(this.y.x-this.x.x)*(bLine.x.y-this.x.y); 47 v=(bLine.y.x-this.x.x)*(this.y.y-this.x.y)-(this.y.x-this.x.x)*(bLine.y.y-this.x.y); 48 w=(this.x.x-bLine.x.x)*(bLine.y.y-bLine.x.y)-(bLine.y.x-bLine.x.x)*(this.x.y-bLine.x.y); 49 z=(this.y.x-bLine.x.x)*(bLine.y.y-bLine.x.y)-(bLine.y.x-bLine.x.x)*(this.y.y-bLine.x.y); 50 return (u*v<=0.00000001 && w*z<=0.00000001); 51 } 52 53 //一点到该线段(或延长线)的距离 54 public double distancePointToMyLine(Point aPoint) { 55 double A = x.y - y.y; 56 double B = y.x - x.x; 57 double C = x.x*y.y-x.y*y.x; 58 double dis = (Math.abs(A*aPoint.x+B*aPoint.y+C)/Math.sqrt(A*A+B*B)); 59 return dis; 60 } 61 62 //判断点是否在线段所在直线上 63 public boolean pointOnMyLine(Point aPoint) { 64 return ((y.y-x.y)/(y.x-x.x) == (aPoint.y - x.y)/(aPoint.x-x.x)); 65 } 66 } 67 68 public class Test{ 69 public static void main(String args[]) { 70 71 Scanner reader = new Scanner(System.in); 72 73 //输入第一条线段的左端点的横纵坐标 74 Point ax = new Point(); 75 System.out.println("请输入第一条线段的左端点的横纵坐标"); 76 ax.x = reader.nextInt(); 77 ax.y = reader.nextInt(); 78 79 //第一条线段的右端点的横纵坐标 80 Point ay = new Point(); 81 System.out.println("请输入第一条线段的右端点的横纵坐标"); 82 ay.x = reader.nextInt(); 83 ay.y = reader.nextInt(); 84 85 MyLine aLine = new MyLine(ax,ay); 86 87 //输入第二条线段的左端点的横纵坐标 88 Point bx = new Point(); 89 System.out.println("请输入第二条线段的左端点的横纵坐标"); 90 bx.x = reader.nextInt(); 91 bx.y = reader.nextInt(); 92 93 //输入第一条线段的右端点的横纵坐标 94 Point by = new Point(); 95 System.out.println("请输入第一条线段的右端点的横纵坐标"); 96 by.x = reader.nextInt(); 97 by.y = reader.nextInt(); 98 99 MyLine bLine = new MyLine(bx,by); 100 101 //检查线段是否位于第一象限 102 if (aLine.check()){ 103 System.out.println("aLine在第一象限"); 104 }else System.out.println("aLine不在第一象限"); 105 106 //求线段的长度 107 System.out.println("aLine的长度是:"+aLine.length()); 108 109 //判断两条线段是否相交 110 if (aLine.intersection(bLine)){ 111 System.out.println("aLine和bLine相交"); 112 }else System.out.println("aLine和bLine不相交"); 113 114 //输入一个点的坐标,然后求该点到aLine的距离 115 Point point = new Point(); 116 System.out.println("请输入点的横纵坐标:"); 117 point.x = reader.nextInt(); 118 point.y = reader.nextInt(); 119 //一点到该线段(或延长线)的距离 120 System.out.println("点到aLine的距离为:"+aLine.distancePointToMyLine(point)); 121 122 //判断点是否在线段所在直线上 123 if(aLine.pointOnMyLine(point)){ 124 System.out.println("点在线段所在直线上"); 125 }else System.out.println("点不在线段所在直线上"); 126 } 127 }
运行结果:
作业4:
作业要求:
编写一个book类:
两个属性:
String bname (书名) int price(定价)
注:本题中假定书名唯一,可作为书的标识。
一个构造方法: book(String p1,int p2)
两个成员方法:
String getName() 获取书名
int getPrice() 获取价格
编写一个BookCard类(借书卡)
三个属性:
int rno 读者号
String rname 读者名
book[] books 在借图书(最多10本)
一个构造方法:
BookCard(int p1,String p2,book[] p3)
八个成员方法:
int getRno() 取读者号
String getRname() 取读者名
int bnum() 统计在借图书数(已借了几本书)
boolean borrow(book b)
借书方法:参数为所借书之对象。返回值为true表示借书成功,
返回值为false表示借书不成功(如已借10本)。
boolean returnBook(String s)
还书方法:参数为所还书名。返回值为true表示还书成功,返
回值为false表示还书不成功(如没借此书)
void printBooks()
该方法输出在借书名清单,每行一个书名。
int expensive(int p)
该方法统计出在借图书中定价高于参数p的图书册数。
String[] search(String s)
本方法的参数是指定的一个关键词(如“计算机”)。本方法找出所有在借图书中书名包括该关键词的图书,并将找到的书以数组形式返回。
提示:
数组元素为空时其值表示为 null
自己在主程序中编写测试用例,要用到BookCard类的8个方法,
要测试方法的不同返回值。例:
public static void main(String args[]){
book b1 =new book("计算机文化基础",23);
book b2 = new book("数据库与计算机管理",32);
book b3 = new book(“Java面向对象程序设计",40);
book[] books={b1,b2,b3};
BookCard b = new BookCard (980001,"王山",books);
b.printBooks() ;
. . . . . .
该作业要求编程并调试通过。对你设计的类要有详细的文字
说明(类所封装的内容,属性、方法的功能与含义等)
代码:
package task4; //Book类 public class Book { String bname; int price; Book(){} //构造方法 Book(String bname,int price) { this.bname = bname; this.price = price; } //获得名字 String getName() { return bname; } //获得价格 int getPrice() { return price; } }
1 package task4; 2 3 public class BookCard { 4 int rno; 5 String rname; 6 Book [] books = new Book [10]; 7 BookCard(int p1,String p2,Book[] p3){ 8 rno = p1; 9 rname = p2; 10 books = p3; 11 } 12 13 //取读者号 14 int getRno(){ 15 return rno; 16 } 17 18 //取读者名 19 String getRname(){ 20 return rname; 21 } 22 23 //统计在借图书数 24 int bnum(){ 25 return books.length; 26 } 27 28 //借书 29 boolean borrow(Book b){ 30 if (books.length == 10) return false; 31 else { 32 int len = books.length; 33 books[len-1] = b; 34 return true; 35 } 36 } 37 38 //还书 39 boolean returnBook(String s){ 40 for (int i = 0;i < books.length;++i){ 41 if (books[i] != null && books[i].bname == s){ 42 int len = books.length; 43 books[i] = books[len-1]; 44 books[len-1] = null; 45 return true; 46 } 47 } 48 return false; 49 } 50 51 //输出在借书名清单 52 void printBooks(){ 53 for(int i = 0;i < books.length;++i) { 54 System.out.println(books[i].getName()); 55 } 56 } 57 58 //统计出在借图书中定价高于参数p的图书册数 59 int expensive(int p){ 60 int count = 0; 61 for(int i = 0;i < books.length;++i) { 62 if(books[i] != null && books[i].getPrice() > p) count++; 63 } 64 return count; 65 } 66 67 //找出所有在借图书中书名包括该关键词的图书 68 String[] search(String s){ 69 String[] ret = new String[10]; 70 int cnt = 0; 71 for(int i = 0;i < books.length;++i) { 72 if(books[i] != null && books[i].getName().indexOf(s) != -1) ret[cnt++] = books[i].getName(); 73 } 74 return ret; 75 } 76 77 78 }
1 package task4; 2 3 public class Test { 4 public static void main(String args[]){ 5 Book b1 =new Book("离散数学及其应用",23); 6 Book b2 = new Book("大学计算机基础",32); 7 Book b3 = new Book("Java面向对象程序设计",40); 8 Book b4 = new Book("C++程序设计", 65); 9 Book b5 = new Book("大学英语", 12); 10 Book[] books={b1,b2,b3,b4,b4,b5,b5,b4,b5}; 11 BookCard b = new BookCard (216132,"xxx",books); 12 13 System.out.println("读者号:" + b.getRno() + " 读者名:" + b.getRname() + " 在借图书数目:" + b.bnum()); 14 //输出已经借了的图书 15 System.out.println("在借图书有:"); 16 b.printBooks(); 17 18 //借书测试 19 if (b.borrow(b5)){ 20 System.out.println(b5.bname+"借书成功!"); 21 }else System.out.println(b5.bname+"借书失败!"); 22 23 //借书测试 24 if (b.borrow(b5)){ 25 System.out.println(b5.bname+"借书成功!"); 26 }else System.out.println(b5.bname+"借书失败!"); 27 28 //还书测试 29 if(b.returnBook("离散数学及其应用")) { 30 System.out.println("离散数学及其应用还书成功!"); 31 }else System.out.println("离散数学及其应用还书失败!"); 32 33 //还书测试 34 if(b.returnBook("离散数学及其应用")) { 35 System.out.println("离散数学及其应用还书成功!"); 36 }else System.out.println("离散数学及其应用还书失败!"); 37 38 39 //寻找定价高于33的书 40 System.out.println("定价高于33的书有:" + b.expensive(33) + "本"); 41 42 //寻找书名中含C的书 43 System.out.println("书名内包含C的书有:"); 44 String[] cout = b.search("C"); 45 for(int i = 0;cout[i] != null;++i) { 46 System.out.println(cout[i]); 47 } 48 49 } 50 }
运行结果: