• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

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

java 来源:青鸟路过佳城 7次浏览

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

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

以下是我的代码:

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(); //强制退出递归
	}


最终运行的结果为:





版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)