str=JOptionPane.showInputDialog("猜小了,再输入你的猜测:
");
yourGuess=Integer.parseInt(str);
}
}
JOptionPane.showMessageDialog(null,"恭喜你,猜对了!
数为:
"+yourGuess);
}
}
该程序的执行结果如下图所示:
该程序的类图截图如下图所示:
实验后的思考:
1.用“yourGuess>realNumber”替换【代码1】,可以么?
答:
可以。
其执行结果如下:
2.语句:
“JOptionPane.showMessageDialog(null,"猜对了!
这个数就是"+realNumber);”为何要放在while循环语句之后?
放在while语句的循环体中合理吗?
请将回答写在实验报告中。
这个问题我不太了解,XX也查不出个所以然。
实验3—5、分析并运行下面程序,并回答下面问题,最后完善异常处理程序。
publicclassQuestion9_1{
publicvoidrun(){
for(inti=0;i<4;i++){
inta;
try{
switch(i){
case0:
//除数为0
intzero=0;
a=4/zero;
break;
case1:
//数组越界访问
int[]b=newint[5];
a=b[5];
break;
case2:
int[]c=newint[-1];
a=c[0];
break;
case3:
int[]d=null;
a=d[0];
break;
}
}
catch(Exceptione){
System.out.println("Case"+i+"hasanexception");
System.out.println(e);
}
}
}
}
问题:
(1)程序运行结果怎样,出现了哪些异常?
程序运行结果截图如下:
该程序运行出现了除数不能为0,数组越界,还有空指针放回等异常。
(2)分析异常是怎样抛出、捕获和处理的?
抛出异常:
在方法的运行过程中,如果发生了异常,则该方法生成一个代表该异常的对象并把它交给运行时系统,运行时系统便寻找相应的代码来处理这一异常。
捕获异常:
运行时系统在方法的调用栈中查找,从生成异常的方法开始进行回溯,直到找到包含相应异常处理的方法为止。
处理异常方法有两种:
一是声明抛出异常,二是捕获异常。
(3)程序中设计循环目的是什么?
个人认为循环可以节省代码,使程序简明易懂。
实验3—6.、编写程序:
输入一个整数n,计算n的阶乘并捕捉可能出现的异常。
实验要求:
(1)阶乘方法命名为factorial();
(2)无论是否出现异常,最后都要能够显示:
“Finishcomputingfactorialnumber.”。
(3)当输入的数大于20时,请抛出一个自定义的“数字过大俺算不了”异常(名字自定吧,总之n>20就抛出自定义异常给出提示说数字太大了,算不了阶乘)。
(4)请使用编好的程序分别计算”abc”,”-1”,”20”以及”21”的阶乘,程序输出结果截图。
提示:
(1)输入字符串时,可能会产生IOException异常;
(2)输入的字符串如果不能转换成int类型,将产生NumberFormatException异常;
(3)当输入的字符串转换成int类型之后为负数时,在计算阶乘时,请抛出一个IllegalArgumentException异常;
(4)抛出自定义的异常;
(5)其他可能异常,也需要给出提示信息。
该程序的代码如下:
packagezi;
importjava.util.Scanner;
importjava.util.Scanner;
classtoobigextendsException{
publictoobig(){
super("数字太大算不了!
");
}
}
publicclassEx3_6{
publicstaticvoidmain(String[]args){
System.out.print("请输入一个整数:
");
Scannern1=newScanner(System.in);
intn=n1.nextInt();
System.out.println();
System.out.print(n+"的阶乘为:
");
intsum=factorial(n);
System.out.print(sum);
}
privatestaticintfactorial(inti){
if(i<=1)
{
return1;
}
else
{
return(int)i*factorial(i-1);
}
}
}
执行结果如下图所示:
其类图截图如下:
实验3—7、课本102页习题第6题。
这个题目要求输入0.1元到5.0元的值,然后自动给出最小找零方案,比如输入2.01,就找2.99元,最小找零方案是:
两元1张,五角1枚,二角2枚,五分1枚,二分2枚。
这题主要是算法思路,请大家仔细审题,提供思路如下(参考):
(1)存在元、角、分不同币值,在计算时建议统一转换成分,比如5元就是500分,2元就是200分;
(2)用几个数组,按顺序存储可以使用的转换后的币值,如200,100,2;还有对应币值的名字,如两元,一元,二分;还有对应的单位,如元,元,枚;
(3)怎么才算最小找零方案,张数(枚数)最小就意味着尽量用大币值去找零,所以把找零的总额转成分后,依次除以大币值,得出的商就是该币值的找零张数(枚数),而得出的模(也就是余数)就是继续要找零的,继续除以下一个较小的币值,。
。
。
依次类推,知道最后不再有余数,说明找零成功,把依次得到的商对应相对应的币值输出即可。
该题的代码如下:
packagezi;
publicclassPrice{
publicstaticvoidmain(Stringargs[]){
System.out.println("输入商品价格:
");
floata=Keyboard.getFloat();
intc=(int)(a*100);
intb=500-c;
System.out.println("找零如下:
");
if(b/200!
=0){System.out.println(b/200+"张2元");b-=(b/200)*200;}
if(b/100!
=0){System.out.println(b/100+"张1元");b-=(b/100)*100;}
if(b/50!
=0){System.out.println(b/50+"张5角");b-=(b/50)*50;}
if(b/20!
=0){System.out.println(b/20+"张2角");b-=(b/20)*20;}
if(b/10!
=0){System.out.println(b/10+"张1角");b-=(b/10)*10;}
if(b/5!
=0){System.out.println(b/5+"个5分");b-=(b/5)*5;}
if(b/2!
=0){System.out.println(b/2+"个2分");b-=(b/2)*2;}
if(b!
=0)System.out.println(b+"个1分");
}
}
packagezi;
importjava.io.*;
publicclassKeyboard{
staticBufferedReaderinputStream=newBufferedReader(newInputStreamReader(System.in));
publicstaticintgetInteger(){
try{
return(Integer.valueOf(inputStream.readLine().trim()).intValue());
}catch(Exceptione){
e.printStackTrace();
return0;
}
}
publicstaticStringgetString(){
try{
return(inputStream.readLine());
}catch(IOExceptione){
return"0";
}
}
publicstaticfloatgetFloat(){
Strings="";
try{
BufferedReaderin=newBufferedReader(newInputStreamReader(System.in));
s=in.readLine();
return(Float.parseFloat(s));
}
catch(IOExceptione)
{
System.out.println("输入非法!
");
return(0.0f);
}
}
}
其执行结果如下图所示:
其类图的截图如下图所示:
实验3—8、编写Java程序,要求利用方法重载,键盘录入任意2个数或3个数,求最大数,其中,这2个数或3个数要么全是整数,要么全是浮点数。
实验要求:
(1)求3个数的时候调用现有的2个数的方法来辅助求解。
(2)需考虑录入者输入一个整数跟一个浮点的异常处理。
(3)采用上述《猜随机数》的人机界面,用对话框来完成整个程序。
(4)(选做)是否可以一行一次性录入2或3个数,而不需要每次只录入一个数?
该程序的代码如下:
packagezi;
importjavax.swing.JOptionPane;
publicclassEx3_8{
publicstaticvoidmain(String[]args){
Stringinput,input1,input2,input3;
intn;
floata,b,c;
input=JOptionPane.showInputDialog("选择输入2个数还是3个数:
");
n=Integer.parseInt(input);
if(n==2){
input1=JOptionPane.showInputDialog("输入第一个数");
input2=JOptionPane.showInputDialog("输入第二个数");
a=Integer.parseInt(input1);
b=Integer.parseInt(input2);
max(a,b);
}
elseif(n==3){
input1=JOptionPane.showInputDialog("输入第一个数");
input2=JOptionPane.showInputDialog("输入第二个数");
input3=JOptionPane.showInputDialog("输入第三个数");
a=Integer.parseInt(input1);
b=Integer.parseInt(input2);
c=Integer.parseInt(input3);
max(a,b,c);
}
elseSystem.out.print("数的个数不正确,请重新输入!
");}
publicstaticvoidmax(floata,floatb)
{
//Stringinput1,input2;
floatmax;
if(a>b)max=a;
elsemax=b;
JOptionPane.showMessageDialog(null,a+","+b+"中的最大数是:
"+max,"最大数结果",JOptionPane.PLAIN_MESSAGE);
}
publicstaticvoidmax(floata,floatb,floatc)
{
floatmax;
if(a>b)
if(a>c)
max=a;
else
max=c;
else
if(b>c)
max=b;
else
max=c;
JOptionPane.showMessageDialog(null,a+","+b+","+c+"中的最大数是:
"+max,"最大数结果",JOptionPane.PLAIN_MESSAGE);
}
}
输入两个数运行结果截图如下:
输入三个数的运行结果截图如下:
实验3—9、有关注解的例子:
请大家按顺序完成以下这个例子(参考他人形成的例子),具体知识请参照书本或自行检索。
(1)建立一个简单的注解例子。
新建一个注解,文件名跟注解名叫TestA,其截图如下:
接下来的注解太复杂了,编译老出错,就不截图了。
实验心得:
1、个人觉得本次实验较前两次实验难度较大,部分内容也较难理解和应用。
2、不过本次实验我也体验到用Java编译小程序的乐趣,比如说猜数游戏,找零钱等,觉得较为实用,并可用于日常生活中。