当前位置:文档之家› 实验四Java语言解决算法问题

实验四Java语言解决算法问题

实验四Java语言解决算法问题(4学时)
一、实验目的
(1)熟悉Java图形用户界面GUI类;
(2)学习处理ActionEvent事件;
(3)掌握事件源、监视器、处理事件的接口这三个概念;
(4)使用Java语言解决算法问题。

二、实验学时:2学时
三、实验要求
(1)编写一个训练算术能力的测试软件;
(2)Teacher类对象给出题目,判断答案是否正确;ComputerFrame类对象提供题目GUI 视图;MainClass作为主类。

四、实验原理
(1)事件源指的是能够产生事件的对象,如文本框、按钮等;
(2)监视器指的是对事件源进行监视的对象,以便对发生的事件进行处理;
(3)Java语言使用接口回调技术设计了它的处理事件模式。

事件源增加监视的方法addXXXListener(XXXListener listener)中的参数是一个接口,listener可以引
用任何实现了该接口的类所创建的对象,当事件源发生事件时,接口listener立
刻回调被类实现的接口中的某个方法。

五、实验内容
课堂实验任务:请按模板要求,将【代码】替换为Java程序代码。

1.题目一算术测试
模板代码:Teacher.java
public class Teacher
{ int numberOne,numberTwo;
String operator="";
boolean right;
public int giveNumberOne(int n)
{ numberOne=(int)(Math.random()*n)+1;
return numberOne;
}
public int giveNumberT wo(int n)
{ numberTwo=(int)(Math.random()*n)+1;
return numberTwo;
}
public String giveOperator()
{ double d=Math.random();
if(d>=0.5)
operator="+";
else
operator="-";
return operator;
}
public boolean getRight(int answer)
{ if(operator.equals("+"))
{ if(answer==numberOne+numberTwo)
right=true;
else
right=false;
}
else if(operator.equals("-"))
{ if(answer==numberOne-numberTwo)
right=true;
else
right=false;
}
return right;
}
}
模板代码:ComputerFrame.java
import java.awt.*;
import java.awt.event.*;
public class ComputerFrame extends Frame implements ActionListener { TextField textOne,textTwo,textResult;
Button getProblem,giveAnwser;
Label operatorLabel,message;
Teacher teacher;
ComputerFrame(String s)
{ super(s);
teacher=new Teacher();
setLayout(new FlowLayout());
textOne=【代码1】 //创建textOne,其可见字符长是10
textTwo=【代码2】 //创建textTwo,其可见字符长是10
textResult=【代码3】 //创建textResult,其可见字符长是10
operatorLabel=new Label("+");
message=new Label("你还没有回答呢");
getProblem=new Button("获取题目");
giveAnwser=new Button("确认答案");
add(getProblem);
add(textOne);
add(operatorLabel);
add(textTwo);
add(new Label("="));
add(textResult);
add(giveAnwser);
add(message);
textResult.requestFocus();
textOne.setEditable(false);
textTwo.setEditable(false);
【代码4】//将当前窗口注册为getProblem的ActionEvent事件监视器
【代码5】//将当前窗口注册为giveAnwser的ActionEvent事件监视器
【代码6】//将当前窗口注册为textResult的ActionEvent事件监视器 setBounds(100,100,450,100);
setVisible(true);
validate();
addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent e) { System.exit(0);
}
}
);
}
public void actionPerformed(ActionEvent e)
{ if(【代码7】) //判断事件源是否是getProblem
{ int number1=teacher.giveNumberOne(100);
int number2=teacher.giveNumberTwo(100);
String operator=teacher.givetOperator();
textOne.setText(""+number1);
textTwo.setText(""+number2);
operatorLabel.setText(operator);
message.setText("请回答");
textResult.setText(null);
}
if(【代码8】) //判断事件源是否是giveAnwser
{ String answer=textResult.getText();
try{
int result=Integer.parseInt(answer);
if(teacher.getRight(result)==true)
{ message.setText("你回答正确");
}
else
{ message.setText("你回答错误");
}
}
catch(NumberFormatException ex)
{ message.setText("请输入数字字符");
}
}
textResult.requestFocus();
validate();
}
}
模板代码:MainClass.java
public class MainClass
{ public static void main(String args[])
{ ComputerFrame frame;
frame=【代码9】//创建窗口,其标题为:算术测试
}
}
题目二稀疏矩阵
如果在矩阵中,多数的元素为0,称此矩阵为稀疏矩阵(sparse matrix)。

在这里介绍的方法较为简单,数组只储存矩阵的行数、列数与有数据的索引位置及其值,在需要使用矩阵数据时,再通过程序运算加以还原,例如矩阵数据如下,其中0表示矩阵中该位置没有数据:
0 0 0 0 0 0
0 3 0 0 0 0
0 0 0 6 0 0
0 0 9 0 0 0
0 0 0 0 12 0
这个矩阵是5*6矩阵,非零元素有4个,要使用的数组第一列记录其列数、行数与非零元素个数:
5 6 4
数组的第二列起,记录其位置的列索引、行索引与储存的值:
1 1 3
2 3 6
3 2 9
4 4 12
所以原本要用30个元素储存的矩阵内容,现在只使用了15个元素来储存,节省了不少内存的使用。

根据提供的Matrix.java文件进行调试。

运行结果如下:
六、思考练习
(1)给上述程序增加测试乘、除的功能。

相关主题