结课项目需求
运用所学的知识,设计计算图形面积和周长的系统,要求用到对象和类,构造方法,继承,抽象类(或接口)和多态。实现如下功能:
- 根据菜单提示选择要计算的图像类型。
- 输入矩形的长和宽,计算矩形的面积和周长。
- 输入圆的半径,计算圆形的面积和周长。(要求保留两位小数)
- 输入三角形的三边,计算三角形的面积和周长。
- 如果根据菜单提示输入有误,有相关提示并重新选择。
- 退出(非右上角x号退出)
1.图形父类完成两个抽象方法面积和周长用于子类继承和重写(也可以用接口的方式实现),这里我加了两个shou方法,需要输出面积和周长时直接调用就可以了。
//父类图形
abstract class Shape{
abstract double Area();
abstract double Girth();
abstract void showArea();
abstract void showGirth();
}
2.子类继承并重写父类中的方法
矩形
//子类矩形
class Rectangle extends Shape{
double length;
double wide;
public Rectangle(double length, double wide) {
= length;
= wide;
}
@Override
double Area() {
return length*wide;
}
@Override
double Girth() {
return 2*(length+wide);
}
@Override
void showArea() {
("The area of the rectangle:"+"%.2f", Area());
();
}
@Override
void showGirth() {
("The girth of the rectangle:" +"%.2f", Girth());
();
}
}
圆
//子类圆形
class Circle extends Shape{
double radius;
final double PI = 3.14;
public Circle(double radius) {
= radius;
}
@Override
double Area() {
return PI*radius*radius;
}
@Override
double Girth() {
return 2*PI*radius;
}
@Override
void showArea() {
("The girth of the circle:"+"%.2f", Area());
();
}
@Override
void showGirth() {
("The girth of the circle:" +"%.2f", Girth());
();
}
}
三角形
//子类三角形
class Triangle extends Shape{
double a,b,c;
public Triangle(double a, double b, double c) {
= a;
= b;
= c;
}
@Override
double Girth() {
return a + b + c;
}
@Override
double Area() {
return (()*(()-a)*(()-b)*(()-c));
}
@Override
void showArea() {
("The girth of the triangle:" +"%.2f", Area());
();
}
@Override
void showGirth() {
("The girth of the triangle:" +"%.2f", Girth());
();
}
}
还需要什么图形自行添加就可以。
下面是需要用到的相关方法
1.主菜单:
//主菜单
static void Menu(){
("*********图形面积周长计算系统*********");
("*********请挑选需要进行的操作*********");
("*************1.计算矩形**************");
("*************2.计算圆形**************");
("*************3.计算三角形************");
("*************4.退出******************");
}
2.退出方法,输入y代表确认退出,其他的代表否
static boolean exit(String c,boolean condition){
if ("y".equalsIgnoreCase(c)){//判断是否为y,equalsIgnoreCase不区分大小写
condition = false;
("退出成功!");
}
else
("继续操作!");
return condition;
}
3.清屏函数。
每一次走到Switch的最后都进行一次清屏,首先我想到的是和c一样用close(),但是发现java并没有close()这个方法,所以这里我并没有想到好的方法,只能用事件来代替人为的操作鼠标和键盘来实现清理控制台,但是这样有不好的地方,首先,当你清屏之后,控制台中什么也没有直接进行到下一次输入需要操作的选项,所以这里清屏之前需要给出一点友好的提示并再次确认;其次如果清屏快捷键不同也不能使用,我这里清理控制台的快捷键设置为Ctrl+R,如果你的清屏快捷键不是这个的话这个函数你将需要做一些修改。当然你也可以选择不用清屏函数,这个看个人需要。
//清屏函数,利用GUI来实现鼠标事件和键盘事件Ctrl+R
//我这里设置的清屏快捷键为Ctrl+R,如果快捷键为其他的该方法体内的内容不同
static void clear()throws AWTException{
Robot r = new Robot();
(InputEvent.BUTTON3_DOWN_MASK);//按下鼠标右键
(InputEvent.BUTTON3_DOWN_MASK);//释放鼠标右键
(KeyEvent.VK_CONTROL);//按下ctrl键
(KeyEvent.VK_R);//按下R键
(KeyEvent.VK_R);//释放R键
(KeyEvent.VK_CONTROL);//释放ctrl键
}
4.判断输入格式是否正确
//判断输入的格式是否符合矩形
static boolean IsRectangle(double length,double wide){
return length > 0 && wide > 0;
}
//判断输入是否是圆
static boolean IsCircle(double radius){
return radius > 0;
}
//判断输入的三条边能否构成三角形
static boolean IsTriangle(double side[]){
return side[1] + side[0] > side[2] && side[2] - side[0] < side[1] && side[0] > 0 && side[1] > 0 && side[2] > 0;
}
5.是否确认清屏及友好提示
//是否要清屏
static void whether() throws AWTException {
("是否清屏(Y),输入其他的代表否");
("注意清屏之后控制台什么提示也没有,需要直接输入一次需要选择操作的序号");
Scanner in = new Scanner();
String s = ();
if ("y".equalsIgnoreCase(s))
clear();
}
6.循环体
//循环体
static void CirculatingBody() throws AWTException {
while (isFlag){
Scanner in = new Scanner();
Menu();
int n = ();
switch (n){
case 1:
boolean condition1 = true;
while (condition1){
double length,wide;
do {
("请输入矩形的长和宽(数字):");
length = ();
wide = ();
if (!IsRectangle(length,wide)){
("输入数据有误,请从新输入");
}
}while (!IsRectangle(length,wide));//输入数据有误循环继续重新输入
Shape rectangle = new Rectangle(length,wide);//多态向下转型
();
();
("是否返回到上一级(Y),输入其他的代表否");
String s = ();
condition1 = exit(s,condition1);
}
break;
case 2:
boolean condition2 = true;
while (condition2){
double radius;
do {
("请输入圆的半径(数字):");
radius = ();
if (!IsCircle(radius)){
("输入有误,请重新输入!");
}
}while (!IsCircle(radius));//输入有误,重新输入,循环继续
Shape circle = new Circle(radius);//多态向下转型
();
();
("是否返回到上一级(Y),输入其他的代表否");
String s = ();
condition2 = exit(s,condition2);
}
break;
case 3:
boolean condition3 = true;
while (condition3){
double []side = new double[3];
do {
("请输入三角形的三条边(数字)");
side[0] = ();
side[1] = ();
side[2] = ();
(side);//将输入的三条边按从小到大排序
if (!IsTriangle(side)){
//三角形的条件是两边之和大于第三边,两边之差小于第三边
//边的长度肯定也不能为0
("输入的三条边不能构成一个三角形,请重新输入");
}
}while (!IsTriangle(side));//不能构成三角形重新输入循环继续
Shape triangle = new Triangle(side[0],side[1],side[2]);//多态向下转型
();
();
("是否返回到上一级(Y),输入其他的代表否");
String s = ();
condition3 = exit(s,condition3);
}
break;
case 4:
("是否确认退出(Y),输入其他的代表否");
String s = ();
isFlag = exit(s,isFlag);
break;
default:
("输入有误,请重新输入");
break;
}
whether();
}
}
}
下面附上完整代码
import .*;
import ;
import ;
import ;
import ;
public class ClosingProject {
static boolean isFlag = true;//控制循环退出
public static void main(String[] args) throws AWTException {//抛出AWT可能出现的异常,下面同理
CirculatingBody();//调用循环体
}
//主菜单
static void Menu(){
("*********图形面积周长计算系统*********");
("*********请挑选需要进行的操作*********");
("*************1.计算矩形**************");
("*************2.计算圆形**************");
("*************3.计算三角形************");
("*************4.退出******************");
}
//退出方法
static boolean exit(String c,boolean condition){
if ("y".equalsIgnoreCase(c)){//判断是否为y,equalsIgnoreCase不区分大小写
condition = false;
("退出成功!");
}
else
("继续操作!");
return condition;
}
//清屏函数,利用GUI来实现鼠标事件和键盘事件Ctrl+R
//我这里设置的清屏快捷键为Ctrl+R,如果快捷键为其他的该方法体内的内容不同
static void clear()throws AWTException{
Robot r = new Robot();
(InputEvent.BUTTON3_DOWN_MASK);//按下鼠标右键
(InputEvent.BUTTON3_DOWN_MASK);//释放鼠标右键
(KeyEvent.VK_CONTROL);//按下ctrl键
(KeyEvent.VK_R);//按下R键
(KeyEvent.VK_R);//释放R键
(KeyEvent.VK_CONTROL);//释放ctrl键
}
//是否要清屏
static void whether() throws AWTException {
("是否清屏(Y),输入其他的代表否");
("注意清屏之后控制台什么提示也没有,需要直接输入一次需要选择操作的序号");
Scanner in = new Scanner();
String s = ();
if ("y".equalsIgnoreCase(s))
clear();
}
//判断输入的格式是否符合矩形
static boolean IsRectangle(double length,double wide){
return length > 0 && wide > 0;
}
//判断输入是否是圆
static boolean IsCircle(double radius){
return radius > 0;
}
//判断输入的三条边能否构成三角形
static boolean IsTriangle(double side[]){
return side[1] + side[0] > side[2] && side[2] - side[0] < side[1] && side[0] > 0 && side[1] > 0 && side[2] > 0;
}
//循环体
static void CirculatingBody() throws AWTException {
while (isFlag){
Scanner in = new Scanner();
Menu();
int n = ();
switch (n){
case 1:
boolean condition1 = true;
while (condition1){
double length,wide;
do {
("请输入矩形的长和宽(数字):");
length = ();
wide = ();
if (!IsRectangle(length,wide)){
("输入数据有误,请从新输入");
}
}while (!IsRectangle(length,wide));//输入数据有误循环继续重新输入
Shape rectangle = new Rectangle(length,wide);//多态向下转型
();
();
("是否返回到上一级(Y),输入其他的代表否");
String s = ();
condition1 = exit(s,condition1);
}
break;
case 2:
boolean condition2 = true;
while (condition2){
double radius;
do {
("请输入圆的半径(数字):");
radius = ();
if (!IsCircle(radius)){
("输入有误,请重新输入!");
}
}while (!IsCircle(radius));//输入有误,重新输入,循环继续
Shape circle = new Circle(radius);//多态向下转型
();
();
("是否返回到上一级(Y),输入其他的代表否");
String s = ();
condition2 = exit(s,condition2);
}
break;
case 3:
boolean condition3 = true;
while (condition3){
double []side = new double[3];
do {
("请输入三角形的三条边(数字)");
side[0] = ();
side[1] = ();
side[2] = ();
(side);//将输入的三条边按从小到大排序
if (!IsTriangle(side)){
//三角形的条件是两边之和大于第三边,两边之差小于第三边
//边的长度肯定也不能为0
("输入的三条边不能构成一个三角形,请重新输入");
}
}while (!IsTriangle(side));//不能构成三角形重新输入循环继续
Shape triangle = new Triangle(side[0],side[1],side[2]);//多态向下转型
();
();
("是否返回到上一级(Y),输入其他的代表否");
String s = ();
condition3 = exit(s,condition3);
}
break;
case 4:
("是否确认退出(Y),输入其他的代表否");
String s = ();
isFlag = exit(s,isFlag);
break;
default:
("输入有误,请重新输入");
break;
}
whether();
}
}
}
//父类图形
abstract class Shape{
abstract double Area();
abstract double Girth();
abstract void showArea();
abstract void showGirth();
}
//子类矩形
class Rectangle extends Shape{
double length;
double wide;
public Rectangle(double length, double wide) {
= length;
= wide;
}
@Override
double Area() {
return length*wide;
}
@Override
double Girth() {
return 2*(length+wide);
}
@Override
void showArea() {
("The area of the rectangle:"+"%.2f", Area());
();
}
@Override
void showGirth() {
("The girth of the rectangle:" +"%.2f", Girth());
();
}
}
//子类圆形
class Circle extends Shape{
double radius;
final double PI = 3.14;
public Circle(double radius) {
= radius;
}
@Override
double Area() {
return PI*radius*radius;
}
@Override
double Girth() {
return 2*PI*radius;
}
@Override
void showArea() {
("The girth of the circle:"+"%.2f", Area());
();
}
@Override
void showGirth() {
("The girth of the circle:" +"%.2f", Girth());
();
}
}
//子类三角形
class Triangle extends Shape{
double a,b,c;
public Triangle(double a, double b, double c) {
= a;
= b;
= c;
}
@Override
double Girth() {
return a + b + c;
}
@Override
double Area() {
return (()*(()-a)*(()-b)*(()-c));
}
@Override
void showArea() {
("The girth of the triangle:" +"%.2f", Area());
();
}
@Override
void showGirth() {
("The girth of the triangle:" +"%.2f", Girth());
();
}
}