用java面向对象思想求三角形的面积和周长

来源:互联网 发布:蚕丝被淘宝评价 编辑:程序博客网 时间:2024/05/16 06:56

问题:用户输入三角形的三条边,当三角形不成立的时候,给用户重新再次输入的时候,假设第二次输入正确,因为使用了函数嵌套,那么会出现递归的问题?

最终解决方法:强制抛出一个异常,就可以解决这个问题

以下是我的代码:

domain类

package com.itxiaojia.domain;//实体类public class Triangle {//三角形的三条边private double side1;private double side2;private double side3;public void setSide1(double side1){this.side1=side1;}public double getSide1(){return side1;}public void setSide2(double side2){this.side2=side2;}public double getSide2(){return side2;}public void setSide3(double side3){this.side3=side3;}public double getSide3(){return side3;}}


工具类,主要是验证数据

package com.itxiaojia.utils;import java.util.regex.*;/** * 检查工具类 * @author wu * */public class Check {/** * 判断是否为三角形 * @param a1 * @param a2 * @param a3 * @return */public static boolean isTriangle(double a1,double a2,double a3){if((a1+a2)>a3 && (a1+a3)>a2 && (a2+a3)>a1){return true; //如果符合三角形成立的条件,返回true}return false;}//判断用户输入是否是数字字符串public static boolean isNumber(String str){Pattern p=Pattern.compile("^\\d+[0-9 .]*");Matcher m=p.matcher(str);if(!m.matches()){return false;  //如果用户输入的不是数字,返回false}return true;}}

包含main函数的类

package com.itxiaojia.test;import java.util.Scanner;import com.itxiaojia.utils.Check;public class Demo1 {public static void main(String[] args){show();}/** * 显示界面 * @throws Exception  */public static void show(){System.out.println("*************************************\n" +"***需求: 用户输入三角形的三条边,求其周长和面积***\n************************************");Scanner scan=new Scanner(System.in);System.out.println("请输入三角的第一条边:");String str=scan.nextLine();while(!Check.isNumber(str)){System.out.println("你输入的格式不正确,请重新输入:");str=scan.nextLine();}double a1=Double.parseDouble(str);//第二条边System.out.println("请输入三角形的第二条边:");str=scan.nextLine();while(!Check.isNumber(str)){System.out.println("你输入的格式不正确,请重新输入:");str=scan.nextLine();}double a2=Double.parseDouble(str);//第三条边System.out.println("请输入三角形的第三条边:");str=scan.nextLine();while(!Check.isNumber(str)){System.out.println("你输入的格式不正确,请重新输入:");str=scan.nextLine();}double a3=Double.parseDouble(str);//判断三角形是否成立while(!Check.isTriangle(a1, a2, a3)){System.out.println("你输入的三条边不符合三角形成立的条件\n请重新开始输入:");show();}System.out.println("该三角形的周长为:"+getPerimeter(a1,a2,a3)+" 面积为:"+getArea(a1,a2,a3));}/** * 三角形的周长 * @param a1 * @param a2 * @param a3 * @return */public static double getPerimeter(double a1,double a2,double a3){return a1+a2+a3;}/** * 三角形的面积 * @param a1 * @param a2 * @param a3 * @return */public static double getArea(double a1,double a2,double a3){double d=(a1+a2+a3)/2;return Math.sqrt(d*(d-a1)*(d-a2)*(d-a3));}}

以下是运行后输出结果截图

这个是一次性并且值正常的结果



下面这个是问题,当输出三角形的面积和周长的时候并没有结束,而是进入了递归



解决方法:1,试过用return;但没有效果

   2,通过抛出一个异常强制结束递归

最初想到在show方法最后一行加上return;但是由于采用的递归,所以没有达到我要的效果。如下:

public static void show(){System.out.println("*************************************\n" +"***需求: 用户输入三角形的三条边,求其周长和面积***\n************************************");Scanner scan=new Scanner(System.in);System.out.println("请输入三角的第一条边:");String str=scan.nextLine();while(!Check.isNumber(str)){System.out.println("你输入的格式不正确,请重新输入:");str=scan.nextLine();}double a1=Double.parseDouble(str);//第二条边System.out.println("请输入三角形的第二条边:");str=scan.nextLine();while(!Check.isNumber(str)){System.out.println("你输入的格式不正确,请重新输入:");str=scan.nextLine();}double a2=Double.parseDouble(str);//第三条边System.out.println("请输入三角形的第三条边:");str=scan.nextLine();while(!Check.isNumber(str)){System.out.println("你输入的格式不正确,请重新输入:");str=scan.nextLine();}double a3=Double.parseDouble(str);//判断三角形是否成立while(!Check.isTriangle(a1, a2, a3)){System.out.println("你输入的三条边不符合三角形成立的条件\n请重新开始输入:");show();}System.out.println("该三角形的周长为:"+getPerimeter(a1,a2,a3)+" 面积为:"+getArea(a1,a2,a3));return;}

运行结果如下图,显然没有达到要求



后来想到了这个方法,也就是可以抛出一个异常来结束后面的代码执行。只要修改两个地方:第1个地方是在main方法中:

public class Demo1 {public static void main(String[] args){try {show();} catch (Exception e) {}} 

第2个地方是在show方法中:

public static void show() throws Exception{System.out.println("*************************************\n" +"***需求: 用户输入三角形的三条边,求其周长和面积***\n************************************");Scanner scan=new Scanner(System.in);System.out.println("请输入三角的第一条边:");String str=scan.nextLine();while(!Check.isNumber(str)){System.out.println("你输入的格式不正确,请重新输入:");str=scan.nextLine();}double a1=Double.parseDouble(str);//第二条边System.out.println("请输入三角形的第二条边:");str=scan.nextLine();while(!Check.isNumber(str)){System.out.println("你输入的格式不正确,请重新输入:");str=scan.nextLine();}double a2=Double.parseDouble(str);//第三条边System.out.println("请输入三角形的第三条边:");str=scan.nextLine();while(!Check.isNumber(str)){System.out.println("你输入的格式不正确,请重新输入:");str=scan.nextLine();}double a3=Double.parseDouble(str);//判断三角形是否成立while(!Check.isTriangle(a1, a2, a3)){System.out.println("你输入的三条边不符合三角形成立的条件\n请重新开始输入:");show();}System.out.println("该三角形的周长为:"+getPerimeter(a1,a2,a3)+" 面积为:"+getArea(a1,a2,a3));throw new Exception();  //强制退出递归}

最终运行的结果为:





1 0
原创粉丝点击