河南师范大学软件学院软件学院综合性、设计性实验报告专业:软件技术年级/班级:14级2014—2015学年第二学期课程名称Java程序设计基础指导教师岳冬利本组成员学号姓名胡浩然1428322048实验地点过街楼实验室实验时间每周五上午3,4节项目名称图形类编写及应用(4学时)实验类型综合性一、实验目的(1)理解类与对象的基本概念,掌握类的声明、对象的创建和使用的方法;(2)理解并掌握类的继承、方法重载与覆盖的多态性等面向对象的基础理论与编程方法;(3)理解抽象类、内部类、接口、包的含义,掌握java利用接口实现多重继承的机制;(4)掌握Java的异常处理机制。二、实验内容(1)编写图形类,该类有周长、面积等属性和求周长、求面积等成员函数;(2)编写该图形类的子类-----矩形类、三角形类、梯形类、圆形类等;(3)进行对象的定义,实现相关信息的输入和输出;(4)画出UML类图;(5)要求至少综合使用到实验目的中提到的三条或三条以上内容。三、实验仪器或设备学院提供公共机房,1台/学生微型计算机。四、总体设计(设计原理、设计方案及流程等)类关系设计图如下:河南师范大学软件学院五、实验步骤(包括主要步骤、代码分析等)Graph类中包含周长和面积的成员变量,并包含Output输出方法、Data数据输入检查。矩形、圆、三角、梯形继承Graph类,其中梯形类重写Output方法。三角形、梯形类中包含判断是否为合法图形的方法。编写图形(Graph)类:classGraph{publicdoubleC;publicdoubleArea;//输出函数publicvoidOutput(){DecimalFormatdf=newDecimalFormat(.##);System.out.println(〖周长:+df.format(C)+〗\n〖面积:+df.format(Area)+〗);}//数据合法性检测publicstaticdoubleData(Strings)throwsException{doublet;t=Double.parseDouble(s);if(t=0){thrownewException();}else{returnt;}}}编写矩形(Rect)类:classRectextendsGraph{publicdoubleL;publicdoubleW;Scannerin=newScanner(System.in);publicRect(){booleanb;do{b=false;Strings;try{System.out.print(请输入长和宽:);s=in.next();L=Graph.Data(s);s=in.next();W=Graph.Data(s);}catch(Exceptione){//e.printStackTrace();System.out.println(输入数据非法,请重新输入!(◎﹏◎));b=true;}}while(b);C=2*(L+W);Area=L*W;}}编写圆(Round)类:classRoundextendsGraph{publicdoubleR;Scannerin=newScanner(System.in);publicRound(){booleanb;do{b=false;河南师范大学软件学院Strings;try{System.out.print(请输入半径:);s=in.next();R=Graph.Data(s);}catch(Exceptione){System.out.println(输入数据非法,请重新输入!(◎﹏◎));b=true;}}while(b);C=2*Math.PI*R;Area=Math.PI*R*R;}}编写三角形(Triangle)类:classTriangleextendsGraph{publicdoubleb1,b2,b3;Scannerin=newScanner(System.in);//判读是否是一个三角形publicstaticbooleanisTriangle(doublea,doubleb,doublec){if((a+bc)&&(a+cb)&&(b+ca))returntrue;elsereturnfalse;}publicTriangle(){booleanb;Strings;doublep;do{b=false;try{System.out.print(请输入输入三角形三边长度:);s=in.next();b1=Graph.Data(s);s=in.next();b2=Graph.Data(s);s=in.next();b3=Graph.Data(s);p=(b1+b2+b3)/2;Area=Math.sqrt(p*(p-b1)*(p-b2)*(p-b3));if(Area=0||!(Triangle.isTriangle(b1,b2,b3))){System.out.println(这不是一个三角形!╮(╯-╰)╭);b=true;}}catch(Exceptione){System.out.println(输入数据非法,请重新输入!(◎﹏◎)2);b=true;}}while(b);C=b1+b2+b3;}}编写梯形(Ladder)类:classLadderextendsGraph{publicdouble[]a=newdouble[6];Scannerin=newScanner(System.in);//判断是否是一个梯形参数:上底下底高腰1腰2//这里检测不够严谨,没有判断所构成的三角形和梯形的高是否相同publicstaticbooleanisLadder(doublea,doubleb,doubleh,doublec,doubled){if(ch||dh||a==b||((c==d)&&(d==h)))returnfalse;elsereturnTriangle.isTriangle(Math.abs(a-b),c,d);}publicvoidOutput(){//重写Output函数DecimalFormatdf=newDecimalFormat(.##);if(a[0]==5)System.out.println(〖周长:+df.format(C)+〗\n〖面积:+df.format(Area)+〗);else{doublet=0;df.format(t);河南师范大学软件学院t=C+a[3]+Math.sqrt(Math.pow(a[1]-a[2],2)+a[3]*a[3]);System.out.println(〖直角梯形〗〖周长:+df.format(t)+〗〖面积:+df.format(Area)+〗);t=C+Math.sqrt(Math.pow((a[1]-a[2])/2,2)+a[3]*a[3])*2;System.out.println(〖等腰梯形〗〖周长:+df.format(t)+〗〖面积:+df.format(Area)+〗);//System.out.printf(〖等腰梯形〗〖周长:%.2f〗〖面积:%.2f〗\n,C+t*2,Area);}}publicLadder(){booleanb;do{b=false;//System.out.println(a[0]+|+a[1]);System.out.println(请依次输入梯形上底下底高腰长1腰长2(后两项可选):);try{Strings=in.nextLine();String[]arr=s.split();//System.out.println(arr.length);a[0]=arr.length;if(arr.length3||arr.length==4)thrownewException();for(inti=0;iarr.length;i++)a[i+1]=Graph.Data(arr[i]);if(a[0]==3)C=a[1]+a[2];else{C=a[1]+a[2]+a[4]+a[5];if(!Ladder.isLadder(a[1],a[2],a[3],a[4],a[5])){System.out.println(这不是一个梯形!╮(╯-╰)╭);b=true;}}//if(!Ladder.isLadder(a[1],a[2],a[3],a[4],a[5])){System.out.println(这不是一个梯形!╮(╯-╰)╭);b=true;}}catch(Exceptione){//e.printStackTrace();System.out.println(输入数据非法,请重新输入!(◎﹏◎));b=true;}}while(b);Area=((a[1]+a[2])*a[3])/2;}}编写主程序(Program)类:publicclassProgram{//staticpublicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubScannerin=newScanner(System.in);booleanb;Grapha;ints=6;do{a=null;b=true;System.out.println(【图形周长面积计算器】);System.out.println(〖1.矩形〗);System.out.println(〖2.圆形〗);System.out.println(〖3.三角形〗);System.out.println(〖4.梯形〗);System.out.println(〖5.退出程序〗);System.out.print(请输入要计算的图形编号:);Stringss=in.next();try{s=Integer.parseInt(ss);}catch(Exceptione){s=6;}switch(s){case1:{a=newRect();break;}case2:{a=newRound();break;}case3:{a=newTriangle();break;}河南师范大学软件学院case4:{a=newLadder();break;}case5:{b=false;break;}default:{System.out.println(未找到指定命令,请重新输入!);}}if(a!=null){a.Output();}}while(b);System.out.println(感谢使用!再见);in.close();}}河南师范大学软件学院六、结果分析与总结首先,我用的是一个普通的父类Graph类,其中包含两个成员变量分别是周长和面积,以及一个Output方法和Data静态方法。这里我说明一下我的思路:最开始我设想的Graph类中只有成员变量,输出由外部访问成员变量实现,但是由于我要编写的梯形类允许用户有两种数据格式输入,即输入腰长或者不输入,如果不输入腰长,那么两种规则梯形(等腰、直角)的周长是确定的,这样输出函数就会复杂一些。于是我把Output放在了Graph类中,并设为抽象类和抽象方法,由其他类来重写。但如果这样来做,每一个子类都要重写一次抽象方法,代码复用性就降低了,最后我将Graph类设为普通类,对于一般图形用父类的Output就能够实现功能。对于梯形类重写Output方法。这样不仅体现了多态,也提高了代码复用性。其次,我把数据输入放在每个类的构造器里,这样虽然比放在主程序中代码量会大一些,但是这样也就意味着输入完成即构造、计算完成。这里我用到了Graph类的Data静态方法,该方法传入字符串参数s,作用是把参数转化为double类型,且如果无法转换或者参数小于等于0就抛出一个异常,我这样做的目的是为了在各个类中添加异常处理以便于处理各种数据的输入。采用do-while中嵌套try-catch控制布尔型标记变量b来实现错误数据重新输入功能。我在三角形类和梯形类中添加