小学生测验(Java)
任务描述:面向小学低年级和高年级学生,随机选择两个整数和加减乘除法形成算式要求学生解答。
功能要求:
(1)电脑随机出10道题,每题10分,程序结束时显示学生得分;
(2)确保算式符合各年级的水平,低年级只允许进行50以内的加减法,不允许两数之和或之差为负数;
(3)每道题学生有三次机会输入答案,当学生输入错误答案时,提醒学生重新输入。
(4)对于每道题,学生第一次输入正确答案得10分,第二次输入正确答案得7分,第三次输入正确答案得5分,否则不得分;
(5)总成绩90以上显示“SMART”,80-90显示“GOOD”,70-80显示“OK”,60-70显示“PASS”,60以下“TRY AGAIN”。
创建题库类
连接ActionListener接口,并且判断答案的对错,并给出相应提示
import java.util.Random;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.*;
import javax.swing.*;
public class Question extends Main implements ActionListener{
public double numberOne,numberTwo;
//操作数
public int score=0;
//总分数
public int sum_result,sub_result,mul_result,mub_result;
//各类算法结果
public int k;
//判断错误次数
public int b=0;
//题号
public String operator="";
Random random;
int maxInteger;
//设置运算难度
JTextField textOne,textTwo,textResult,quenumber;
JLabel operatorLabel,message;
Question(){
random = new Random();
}
public void setMaxInteger(int n){
maxInteger=n;
}
//设置运算难度方法
public void actionPerformed(ActionEvent e)
{//动作事件监视器
String str=e.getActionCommand();//获取动作命令字符
if(str.equals("getProblem"))
{ //点击获取问题 触发
b++;
numberOne=random.nextInt(maxInteger)+1;
numberTwo=random.nextInt(maxInteger)+1;
//获取随机运算数字
if(maxInteger==20)
{ //低年级题库
int d=random.nextInt(2);
//随机运算符
double temp=0;
if(d==0)
operator="+";
else
{
operator="-";
while(numberOne<numberTwo) {//设置大数字减小数字
temp=numberTwo;
numberTwo=numberOne;
numberOne=temp;
}
}
}
else if(maxInteger==100)//高年级题库
{
int d=random.nextInt(4);//随机运算符
double temp=0;
if(d==0)
operator="+";
else if(d==1)
{
operator="-";
while(numberOne<numberTwo)
{ //设置大数字减小数字,防止出现负数
temp=numberTwo;
numberTwo=numberOne;
numberOne=temp;
}
}
else if(d==2)
operator="*";
else if(d==3)
operator="/";
}
sum_result=(int)(numberOne+numberTwo);
sub_result=(int)(numberOne-numberTwo);
mul_result=(int)(numberOne*numberTwo);
if((numberOne/numberTwo-(int)(numberOne/numberTwo))>0.5)
mub_result=(int)(numberOne/numberTwo)+1;
else
mub_result=(int)(numberOne/numberTwo);
quenumber.setText(""+b);
//显示题号
textOne.setText(""+numberOne);
textTwo.setText(""+numberTwo);
//显示题目
operatorLabel.setText(operator);
//显示运算符
message.setText("请回答 你现在的总分为:"+score);
textResult.setText(null);
}
else if(str.equals("answer"))
{
String answer = textResult.getText();
try{
int result=Integer.parseInt(answer);//answer强制转换整型
if(operator.equals("+"))
errorjudgement( message, result, sum_result,k=geti(),score);
else if(operator.equals("-"))
errorjudgement( message, result, sub_result,k=geti(),score);
else if(operator.equals("*"))
errorjudgement( message, result, mul_result,k=geti(),score);
else if(operator.equals("/"))
errorjudgement( message, result, mub_result,k=geti(),score);
}
catch(NumberFormatException ex){
message.setText("请输入数字字符");}
if(b==10)
{
if(score<60)
operator="TRY AGAIN";
else if(score<70&&score>=60)
operator="PASS";
else if(score<80&&score>=70)
operator="OK";
else if(score<90&&score>=80)
operator="GOOD";
else if(score>=90)
operator="SMART";
//弹出测验结果窗口
JFrame jf=new JFrame();
jf.setLayout(new BorderLayout());
jf.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
jf.setLocation(500,150);
jf.setSize(300,300);
jf.setVisible(true);
JLabel lab=new JLabel(operator,JLabel.CENTER);
lab.setFont(new Font("黑体",Font.PLAIN,20));
jf.add(lab);
message.setText("下次加油噢");
}
}
}
public void errorjudgement(JLabel message2,int result1,int trueresult,int j,int Score)
{ //判断结果对错及相应文本框的输出情况
if (result1 == trueresult)
{ switch (j) {
case 0:
Score += 10;
break;
case 1:
Score += 7;
break;
case 2:
Score += 5;
break;
}
message2.setText("回答正确,你现在的总分为:"+Score);
setscore(Score);
}
else
{ j++;
seti(j);
message2.setText("你回答错误,还可以回答" + (3 - j) + "次。");
if(j==3)
{ setscore(Score);
message2.setText("你错了三次了,小渣渣 你现在的总分为:"+score);
seti(0);
}
if(j==4)
{
message2.setText("就算你做对了也没分了");
return;
}
}
}
public void setscore(int sc) { this.score=sc;}
public void setJTextField(JTextField...t){
quenumber=t[0];
textOne=t[1];
textTwo=t[2];
textResult=t[3];
}
public void setJLabel(JLabel...label){
operatorLabel=label[0];
message=label[1];
}
//文本标签排列顺序
}
创建框架
在框架内增添组件 ,并添加监听事件,展示整洁界面。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import liaobiao.Question;
public class ComputerFrame extends JFrame {
private static final long serialVersionUID = -3815626439584100740L;
JMenuBar menubar;
JMenu choiceGrade;
JMenuItem grade1,grade2;
JTextField textOne,textTwo,textResult,quenumber;
JButton getProblem,giveAnswer;
JLabel operatorLabel,message;
ComputerFrame()
{
Question que=new Question();
que.setMaxInteger(20);
setLayout(new FlowLayout());
menubar=new JMenuBar();
choiceGrade=new JMenu("选择级别");
grade1=new JMenuItem("低年级");
grade2=new JMenuItem("高年级");
grade1.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e){que.setMaxInteger(20);}}
);//低年级题库事件
grade2.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e){que.setMaxInteger(100);}}
);//高年级题库事件
choiceGrade.add(grade1);
choiceGrade.add(grade2);//添加监听事件
menubar.add(choiceGrade);
setJMenuBar(menubar);
quenumber=new JTextField(2);
textOne=new JTextField(5);
textTwo=new JTextField(5);
textResult=new JTextField(5);
operatorLabel=new JLabel("+");
operatorLabel.setFont(new Font("Arial",Font.BOLD,20));
message=new JLabel("你还没有回答呢");
getProblem=new JButton("获取题目");
giveAnswer=new JButton("获取答案");
//添加组件
add(quenumber);
add(textOne);
add(operatorLabel);
add(textTwo);
add(new JLabel("="));
add(textResult);
add(giveAnswer);
add(message);
add(getProblem);
textResult.requestFocus();
textOne.setEditable(false);
textTwo.setEditable(false);
quenumber.setEditable(false);
getProblem.setActionCommand("getProblem");
textResult.setActionCommand("answer");
giveAnswer.setActionCommand("answer");
//设置监听事件的命令法号
que.setJTextField(quenumber,textOne,textTwo,textResult);
que.setJLabel(operatorLabel,message);
getProblem.addActionListener(que);
giveAnswer.addActionListener(que);
textResult.addActionListener(que);
//添加监听事件
setVisible(true);
validate();
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
}
}
主函数
public class Main {
int i=0;
public static void main(String[] args) {
ComputerFrame frame=new ComputerFrame();
frame.setTitle("算数测试");
frame.setBounds(300,150,650,180);
}
public int geti()
{return i;}
public void seti(int k)
{this.i=k; }
}
运行界面