.计划
UML 图
Psp个人计划:
1.随机产生一组(10个)算数题,产生算式,除去不够减,循环产生。
2.在界面显示出题目,结果文本框,计时器,以及开始重置提交功能
3.显示对错,统计正确率,统计时间。
二.开发
1.需求分析
作为一名一年级小学生的家长,我希望制作一个出题软件,完成100以内的正整数的加减法题随机产生。以便减轻我的家庭负担。
2.生成设计文档
3.设计复审
4.代码规范
注意大小写,注意缩进,括号一定要配对,注意要分行。
5.具体设计
系统开始,随机产生10道加法或者减法,计算完成后,统计做了多少道题,正确率,以及用了多少时间,系统结束。
6.具体编码
package test;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.*;
import java.util.List;
//StudentTopic
//主窗口
public class StudentTopic extends JFrame{
public static int firstnum,secondnum,sign;//第一个数,第二个数,sign:0-1:0="+";1="-"
public static String c = null;//运算符,+ -
public static JPanel Result;//计算面板
public JPanel Buttonpanel;//按钮及结果面板
public static JButton Resetbutton;//重置按钮
public static JButton Printfbutton;//打印按钮
public static JButton Startbutton;//开始按钮
public static JLabel CountLable;//正确率在标签显示
public static JLabel sumtimeLable;//显示时间
public static List<Integer>/*Integer*/ Resultlist = new ArrayList<>();//文本框结果的集合
public static List<JLabel> Topiclist = new ArrayList<>();//(标签)集合,题目在标签显示
public static List<JTextField> Textlist = new ArrayList<>();//文本框集合
public static List<Integer> Correctlist = new ArrayList<>();//正确答案集合
public static int j=0;
public static int k=0;
public static int i=0;
public static int num ;//设置用户答对的题数
public static long sum1,sum2,sum3;//存放开始时间,结束时间;sum3=sum1-sum2
public StudentTopic(){
//初始化按钮
Resetbutton = new JButton("重置");
Printfbutton = new JButton("提交");
Startbutton = new JButton("开始");
//设置按钮大小
Resetbutton.setSize(50,100);
Printfbutton.setSize(50,100);
Startbutton.setSize(50,100);
sumtimeLable = new JLabel(" ");
sumtimeLable.setPreferredSize(new Dimension(100, 100));
sumtimeLable.setFont(new Font("楷体",Font.BOLD, 15));
sumtimeLable.setText("耗时:");
//初始化计数面板
Result = new JPanel();
Result.setLayout(new GridLayout(25, 4));
//初始化按钮面板
Buttonpanel = new JPanel();
Buttonpanel.setLayout(new FlowLayout());
Buttonpanel.setSize(600,80);
Buttonpanel.setBorder(BorderFactory.createLineBorder(Color.GREEN));
Buttonpanel.add(Startbutton);
CountLable = new JLabel(" ");
CountLable.setFont(new Font("楷体",Font.BOLD, 15));
CountLable.setPreferredSize(new Dimension(100,20));
CountLable.setText("正确率:");
//将按钮添加至按钮及结果面板中
Buttonpanel.add(Resetbutton);
Buttonpanel.add(Printfbutton);
Buttonpanel.add(CountLable);
Buttonpanel.add(sumtimeLable);
//为计数面板添加标签和文本框
//设置窗体属性
setLayout(new BorderLayout());
setBounds(100,100,600,600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container container = getContentPane();
//将计数面板,按钮面板放置在容器中指定位置
container.add(Result, BorderLayout.NORTH);
container.add(Buttonpanel,BorderLayout.SOUTH);
}
//设置Result面板中的组件
public static void Result(){
for(i=0;i<10;i++){
JLabel label = new JLabel();
//在设置布局的条件下,调用setPreferredSize(new Dimension(80, 20))可以设置标签的大小
//不能调用setsize()方法
label.setPreferredSize(new Dimension(80, 20));
label.setFont(new Font("楷体",Font.BOLD, 20)); label.setBorder(BorderFactory.createLineBorder(Color.GREEN));//设置标签的边框
Topiclist.add(label);
// Topiclist为题目(标签)集合,题目在标签中呈现
JTextField textField = new JTextField(4);
textField.enable(false);
//Textlist为用户输入计算结果的文本框集合
Textlist.add(textField);
}
for(i = 0;i<20;i++){
//用if-else语句来间隔输出标签和文本框
if(i%2 == 0){//如果余数为0,则添加标签
Result.add( Topiclist.get(j));
j++;
}else{//如果余数为1,则添加文本框
Result.add(Textlist.get(k));
k++;
}
}
//调用创建随机题目的方法CreateRandom();
CreateRandom();
//调用按钮的动作监听方法myAddActionLIstener()
myAddActionLIstener();
}
//随机创建算术题
public static void CreateRandom(){
Random random = new Random();
// Topiclist为题目(标签)集合,题目在标签中呈现
for(JLabel lable: Topiclist){
firstnum = random.nextInt(101);
secondnum = random.nextInt(101);
sign = random.nextInt(2);
String d = "=";
switch (sign) {
case 0:
c = "+";
//创建规定算数题范围函数,即和不大于100,差不小于0
RandomRange();
lable.setText(firstnum+c+secondnum+d);
//Correctlist为所有题目正确答案的集合
Correctlist.add(firstnum+secondnum);
break;
default:
c = "-";
//创建规定算数题范围函数,即和不大于100,差不小于0
RandomRange();
lable.setText(firstnum+c+secondnum+d);
//Correctlist为所有题目正确答案的集合
Correctlist.add(firstnum-secondnum);
break;
}
}
}
//创建规定算数题范围函数,即和不大于100,差不小于0
public static void RandomRange(){
Random r = new Random();
switch (c) {
case "+":
while(firstnum+secondnum>100){
firstnum = r.nextInt(101);
secondnum = r.nextInt(101);
if(firstnum + secondnum <= 100){
}
}
break;
default:
while(firstnum-secondnum<0){
firstnum = r.nextInt(101);
secondnum = r.nextInt(101);
if(firstnum - secondnum >= 0){
break;
}
}
break;
}
}
//为按钮添加动作监听方法
public static void myAddActionLIstener() {
//为重置按钮添加动作监听
Resetbutton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
for(JTextField cleartextField : Textlist){
cleartextField.setText("");
}
for(int i=0;i<Topiclist.size();i++) {
Topiclist.get(i).setText("");
Topiclist.get(i).setBorder(BorderFactory.createLineBorder(Color.GREEN));
}
Correctlist.removeAll(Correctlist);
Resultlist.removeAll(Resultlist);
CountLable.setText("正确率:");
sum3=0;
sum1=0;
sum2=0;
CreateRandom();
}
});
//为提交按钮添加监听
Printfbutton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
Integer i;
Double result1;
num = 0;
//获取用户在文本框中输入的计算结果
//Textlist为用户输入计算结果的文本框集合
for(i = 0;i<Textlist.size();i++){
if("".equals(Textlist.get(i).getText())) {
Textlist.get(i).setText("-1");;
}
Resultlist.add(Integer.parseInt(Textlist.get(i).getText()));
}
//计算用户做对的题目个数
//System.out.println(Correctlist.get(0)+"============"+Resultlist.get(0));
for(i = 0;i<Resultlist.size();i++){
if(Correctlist.size()==0) {
break;
}
if(Resultlist.get(i)==Correctlist.get(i)){
num++;
//Correctlist为所有题目正确答案的集合
}else{
Topiclist.get(i).setBorder(BorderFactory.createLineBorder(Color.RED));
Topiclist.get(i).setText( Topiclist.get(i).getText()+" 错误 "
+ " 正确答案:"+Correctlist.get(i) );
}
}
//计算用户做题的正确率
result1 = ((num*1.0)/( Topiclist.size())*100);
CountLable.setText("正确率:");
CountLable.setText(CountLable.getText()+result1 + "%");
sumtimeLable.setText("耗时:");
sum2=System.currentTimeMillis();
sum3 =(sum2-sum1)/1000;
if(sum1==0 && Integer.parseInt(Textlist.get(1).getText())==-1) {
sumtimeLable.setText(sumtimeLable.getText()+""+0+"s");
}else { sumtimeLable.setText(sumtimeLable.getText()+""+sum3+"s");
}
Correctlist.removeAll(Correctlist);
Resultlist.removeAll(Resultlist);
}
});
Startbutton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
for(int i = 0;i<Textlist.size();i++) {
Textlist.get(i).setText("");
Textlist.get(i).enable(true);
Topiclist.get(i).setBorder(BorderFactory.createLineBorder(Color.GREEN));
}
Resultlist.removeAll(Resultlist);
Correctlist.removeAll(Correctlist);
CreateRandom();
sum1= System.currentTimeMillis();
}
});
}
public static void main(String[] args) {
for(int i1 = 0;i1<Textlist.size();i1++) {
Textlist.get(i1).enable(false);
}
new StudentTopic().setVisible(true);
Result();
}
}
运行结果
7.代码复审
8.测试
总结:看似简单实际上要考虑很多问题,界面的设计及其功能的实现,重置按钮如何重置等问题,虽然过程有点难,但是理清思路就好写很多,先写界面再写功能实现