1、编写MyDate类,完善上次实验中的人员信息录入,实现日期合法性判断,包括大小月和闰年。
实验一的student类,此处复用
package Ex1.Firstquestion;
public class Student{
private String name;
private int age;
private double marksOfJava;
private int year;
private int month;
private int day;
public Student(String name,int age,int year,int month,int day,double marksOfJava){
this.name = name;
this.age = age;
this.year = year;
this.month = month;
this.day = day;
this.marksOfJava = marksOfJava;
}
public void show(){
System.out.printf("name: %15s age: %3d year: %5d month: %3d day: %3d markOfJava: %6.2f",
this.name,this.age, this.year,this.month,this.day,this.marksOfJava);
}
}
package Ex2.Firstquestion;
import java.util.Scanner;
import Ex1.Firstquestion.Student;
/**
* @author 15328
* 1、编写MyDate类,完善上次实验中的人员信息录入,
* 实现日期合法性判断,包括大小月和闰年。
*/
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String name;
int age, year, month, day;
double markOfJava;
int numOfStudent;
System.out.println("请输入学生数量: ");
numOfStudent = input.nextInt();
input.nextLine();
System.out.printf("请输入这%d个学生的信息:\n", numOfStudent);
System.out.println("将依次是:名字、年龄、出生年月日、Java成绩");
String[] names = new String[numOfStudent];
int[] ages = new int[numOfStudent];
int[] years = new int[numOfStudent];
int [] months = new int[numOfStudent];
int [] days = new int[numOfStudent];
double [] markOfJavas = new double[numOfStudent];
int numOfTrue = 0;
for(int i = 0; i < numOfStudent; i++) {
name = input.next();
age = input.nextInt();
year = input.nextInt();
month = input.nextInt();
day = input.nextInt();
markOfJava = input.nextDouble();
input.nextLine();
if(MyDate.judgeOfMonth(year,month,day)){
names[numOfTrue]=name;
ages[numOfTrue]=age;
years[numOfTrue]=year;
months[numOfTrue]=month;
days[numOfTrue]=day;
markOfJavas[numOfTrue]=markOfJava;
numOfTrue++;
}
}
System.out.println("有效学生信息的人数: " + numOfTrue);
Student[] students = new Student[numOfTrue];
for(int j = 0; j < numOfTrue; j++){
students[j] = new Student(names[j], ages[j], years[j], months[j], days[j], markOfJavas[j]);
}
System.out.println("有效学生信息如下:");
for(Student x:students){
x.show();
if(x!=students[students.length-1]){
System.out.println();
}
}
}
}
class MyDate{
public static int isLeapYear(int year){
if(year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
return 1;
}
else{
return 0;
}
}
public static boolean judgeOfDay1(int month,int day,boolean isTrue){
if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
if(day < 1 || day > 31){
System.out.printf("非法输入日期,%d月没有第%d天\n",month,day);
isTrue = false;
}
}
else if(month == 4 || month == 6 || month == 9 || month == 11) {
if(day < 1 || day > 30){
System.out.printf("非法输入日期,%d月没有第%d天\n",month,day);
isTrue = false;
}
}
return isTrue;
}
public static boolean judgeOfMonth(int year,int month,int day){
boolean isTrue = true;
if(month < 0 || month > 12) {
System.out.printf("非法输入日期,没有第%d个月\n",month);
isTrue = false;
}
else {
if(month == 2) {
if(isLeapYear(year) == 1) {
/*如果使用LocalDate类,也可以直接调用其类中的方法isLeapYear
* 来判断是否是闰年,但是也会出现一个问题:
* 当输入年份为闰年的时候,如果2月的日期输入错误,
* 在构造date对象的时候就会检测到并抛出异常:
* Exception in thread "main" java.time.DateTimeException: Invalid date 'FEBRUARY 30'
* at java.base/java.time.LocalDate.create(LocalDate.java:461)
* at java.base/java.time.LocalDate.of(LocalDate.java:273)
* at Ex2.Firstquestion.MyDate.judgeOfMonth(MyDate.java:42)
* at Ex2.Firstquestion.Main.main(Main.java:39)
*
*
* LocalDate date = LocalDate.of(year, month, day);
* if(date.isLeapYear()){
**/
if(day < 0 || day > 29) {
System.out.printf("非法输入日期,闰年%d月没有第%d天\n", month, day);
isTrue = false;
}
}
else {
if(day < 0 || day > 28) {
System.out.printf("非法输入日期,非闰年%d月没有第%d天\n", month, day);
isTrue = false;
}
}
}
else{
isTrue = judgeOfDay1(month,day,isTrue);
}
}
return isTrue;
}
}
4、定义接口Shape及其抽象方法getArea()和getPerimeter()用于计算图形和面积和周长。定义类Rectangle(矩形)、类Circle(圆形)、类Triangle(三角形),要求这些类继承点类Coordinates()并实现接口的抽象方法。
提示:
class Coordinates
{
long x;
long y;
Coordinate(long x, long y)
{
this.x=x;
this.y=y;
}
}
package Ex2.forthquestion;
import java.util.Scanner;
/**
* @author 15328
* 4、定义接口Shape及其抽象方法getArea()和getPerimeter()用于计算图形和面积和周长。
* 定义类Rectangle(矩形)、类Circle(圆形)、类Triangle(三角形),
* 要求这些类继承点类Coordinates()并实现接口的抽象方法。
*/
public class Main {
public static void showOfSelect(){
System.out.println("选择一种图形形状:");
System.out.println("****1、矩形****");
System.out.println("****2、圆形****");
System.out.println("****3、三角形****");
}
public static boolean judgeOfData(long x){
if(x < 0) {
System.out.printf("非法输入,其首个非法值为:%4d\n",x);
return false;
}
else{
return true;
}
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
long x,y,r,z;
System.out.println("请输入要计算的图形的数量:");
int num = input.nextInt();
Coordinate [] coordinates = new Coordinate[num];
int judgeOfShape = 0;
for(int i = 0; i < num; i++){
showOfSelect();
judgeOfShape = input.nextInt();
input.nextLine();
switch(judgeOfShape){
case 1:{
System.out.println("请输入长和宽:");
x = input.nextLong();
y = input.nextLong();
input.nextLine();
if(!judgeOfData(x) || !judgeOfData(y)) {
// 如果第一个为FALSE,第二个则不再执行,所以如果两个输入都非法,
// 那么只会显示第一个非法值的数值
break;
}
coordinates[i] = new Rectangle(x, y);
System.out.printf("矩形面积:%4.2f\n",coordinates[i].getArea());
System.out.printf("矩形周长:%4.2f\n",coordinates[i].getPerimeter());
break;
}
case 2: {
System.out.println("请输入圆心x坐标、y坐标、半径r: ");
x = input.nextLong();
y = input.nextLong();
r = input.nextLong();
input.nextLine();
if(!judgeOfData(r)) {
break;
}
coordinates[i] = new Circle(x,y,r);
System.out.printf("圆形面积:%4.2f\n",coordinates[i].getArea());
System.out.printf("圆形周长:%4.2f\n",coordinates[i].getPerimeter());
break;
}
case 3: {
System.out.println("请输入边长x、边长y、边长z: ");
x = input.nextLong();
y = input.nextLong();
z = input.nextLong();
input.nextLine();
if(!judgeOfData(x) || !judgeOfData(y) || !judgeOfData(z)) {
// 如果第一个为FALSE,第二个则不再执行,所以如果两个输入都非法,
// 那么只会显示第一个非法值的数值
break;
}
if(x + y > z && x - y < z && y - x < z && x + z > y && x - z < y
&& z - x < y && y + z > x && y - z < x && z - y < x) {
coordinates[i] = new Triangle(x,y,z);
System.out.printf("三角形面积:%4.2f\n",coordinates[i].getArea());
System.out.printf("三角形周长:%4.2f\n",coordinates[i].getPerimeter());
break;
}
else{
System.out.printf("边%d、 %d、 %d、不能组成三角形\n",x,y,z);
break;
}
}
default: {
System.out.printf("%d为非法输入\n",judgeOfShape);
}
}
}
}
}
class Coordinate implements Shape {
long x;
long y;
Coordinate(long x, long y) {
this.x=x;
this.y=y;
}
@Override
public double getArea() {
return 0;
}
@Override
public double getPerimeter() {
return 0;
}
}
interface Shape{
double getArea();//面积
double getPerimeter();//周长
}
class Rectangle extends Coordinate implements Shape{
/**矩形类用xy做长和宽*/
Rectangle(long x,long y){
super(x,y);
}
@Override
public double getArea(){
return (double)(this.x*this.y);
}
@Override
public double getPerimeter() {
return (double)(2*(this.x+this.y));
}
}
class Circle extends Coordinate implements Shape{
/**圆形类,xy表示圆心坐标,另外设radius表示半径长度*/
private long radius;
Circle(long x,long y,long radius){
super(x,y);
this.radius = radius;
}
@Override
public double getArea() {
return Math.PI * (double)this.radius * (double)this.radius;
}
@Override
public double getPerimeter() {
return Math.PI * 2.0 * (double)this.radius;
}
}
class Triangle extends Coordinate implements Shape{
/**三角形类,xyz三条边长度*/
private long z;
Triangle(long x,long y,long z){
super(x,y);
this.z = z;
}
@Override
public double getArea() {
//海伦公式
double p =(double)(this.x+this.y+this.z)/2.0;
return Math.sqrt(p * (p - (double) this.x) * (p - (double) this.y) * (p - (double) this.z));
}
@Override
public double getPerimeter() {
return (double)(this.x+this.y+this.z);
}
}
选择图形的非法输入情况:
对矩形(包含输入数据的非法输入情况):
对圆形(包含输入数据的非法输入情况):
对三角形(包含输入数据的非法输入情况):
5、包的定义和使用
创建自定义包Mypackage
在存放源程序的文件夹中建立一个子文件夹 Mypackage。例如,在“E:\java\程序”文件夹之中创建一个与包同名的子文件夹 Mypackage(E:\java\程序\Mypackage),并将编译过的 class 文件放入该文件夹中。注意:包名与文件夹名大小写要一致。再添加环境变量 classpath 的路径,例如:E:\j2sdk1.4.2_01\lib; E:\java\程序
在包中创建类
YMD.java 程序功能:在源程序中,首先声明使用的包名Mypackage,然后创建YMD 类,该类具有计算今年的年份并输出一个带有年月日的字符串的功能。源代码如下:
编译Test_YMD.java文件,然后将Test_YMD.class文件存放到Mypackage文件夹中。
编写使用包Mypackage中Test_YMD类的程序
YMD_2.java程序功能:给定某人姓名与出生日期,计算该人年龄,并输出该人姓名,年龄,出生日期。程序使用了Test_YMD的方法来计算年龄。源代码如下:
编译并运行程序。
package Ex2.Mypackage;
import java.util.Calendar;
/**
* @author 15328
*/
public class Test_YMD {
private int year,month,day;
public static void main(String[] args) {
}
public Test_YMD(int y,int m,int d){
year = y;
month = (((m >= 1) & (m <= 12)) ? m : 1);
day = (((d >= 1) & (d <= 31)) ? d : 1);
}
public Test_YMD(){
this(0,0,0);
}
public static int thisyear(){
return Calendar.getInstance().get(Calendar.YEAR);
//返回当年的年份
}
public int year(){
return year;
//返回年份
}
@Override
public String toString(){
return year + "-" + month + "-" + day;
}
}
package Ex2.Mypackage;
/**
* @author 15328
*/
public class YMD_2 {
private String name;
private Test_YMD birth;
public static void main(String[] args) {
YMD_2 a = new YMD_2("张弛", 1900, 1, 11);
a.output();
}
public YMD_2(String n1,Test_YMD d1){
name = n1;
birth = d1;
}
public YMD_2(String n1,int y,int m,int d){
this(n1,new Test_YMD(y,m,d));
//初始化变量与对象
}
public int age(){
return Test_YMD.thisyear()- birth.year();
//返回当前年与出生年的差即年龄
}
public void output(){
System.out.println("姓名:" + name);
System.out.println("出生日期:" + birth.toString());
System.out.println("今年年龄:" + age());
}
}