四则运算安卓版

流过昼夜 提交于 2020-02-14 17:37:19
package com.example.example07;

import java.text.DecimalFormat;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

    private int index = 0; // 当前题数
    private int NUMBER = 0;; // 题目总数
    private static final int MAXNUMBER = 100; // 最大出题数
    private static final int MAXVALUE = 100; // 每道题目的最大值
    private boolean isSubmit = false; // 是否提交
    private String[] QUESTION = new String[MAXNUMBER]; // 题目集合
    private double[] ANSWER = new double[MAXNUMBER]; // 答案集合
    private double[] USER_ANSWER = new double[MAXNUMBER]; // 用户答案集合
    private boolean[] ANSWER_CHECK = new boolean[MAXNUMBER]; // 用户答案判定
    
    //声明控件
    private EditText et_number,et_answer,et_question; //题目数输入框 答案输入框 题目显示框
    private Button btn_confirm,btn_last,btn_next,btn_submit; //确定题数 上一题 下一题 提交题目
    private TextView tv_count,tv_check,tv_judge;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // 获取控件
        et_question = (EditText)findViewById(R.id.et_question); // 题目显示
        et_number = (EditText)findViewById(R.id.et_number); // 题数
        et_answer = (EditText)findViewById(R.id.et_answer); // 答案
        btn_confirm = (Button)findViewById(R.id.btn_confirm); // 确定题数
        btn_last = (Button)findViewById(R.id.btn_last); // 上一题
        btn_next = (Button)findViewById(R.id.btn_next); // 下一题
        btn_submit = (Button)findViewById(R.id.btn_submit); // 提交题目
        tv_count = (TextView)findViewById(R.id.tv_count); // 显示当前题目数
        tv_check = (TextView)findViewById(R.id.tv_check); // 输出答对题数
        tv_judge = (TextView)findViewById(R.id.tv_judge); // 判定正确与否
        
        // 确定输入题数按钮
        btn_confirm.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                // 如果输入题数范围正确
                if(inputNumber()){ 
                    et_number.setEnabled(false); // 题数不可再输入
                    btn_confirm.setEnabled(false); // Confirm按钮不可用
                    NUMBER = Integer.parseInt(et_number.getText().toString()); // 获取题目数
                    getQuestion(); // 获取题目
                    showItem(index); // 显示题目
                    
                    // 激活选题按钮
                    btn_next.setOnClickListener(new NextClick());
                    btn_last.setOnClickListener(new LastClick());
                }
            }
        });
        
        // 提交按钮
        btn_submit.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                if (inputNumber()) {
                    if (!isSubmit) {
                        if (check()) {
                            btn_submit.setText("重置");
                            isSubmit = true;
                            et_answer.setEnabled(false);
                        }
                    } else {
                        // 重置函数
                        reset();
                        btn_submit.setText("提交");
                        isSubmit = false;
                        et_answer.setEnabled(true);
                    }
                }
            }
        });
    }
    
    /*
     * 输入题数判断
     */
    private boolean inputNumber(){
        int temp = 0;
        try{
            temp = Integer.parseInt(et_number.getText().toString());
        }catch(Exception e){
            e.printStackTrace();
            return false;
        }
        
        if(temp >= 1 && temp <= MAXNUMBER){
            return true;
        }
        else{
            return false;
        }
    }
    
    // 输出所有100以内加减乘除的式子
    private void getQuestion(){
        DesignQuestion dq = new DesignQuestion();
        DecimalFormat df = new DecimalFormat(".00");
        for(int i = 0;i < NUMBER;i++){
            dq.reset();                                                  // 重新出题
            QUESTION[i] = dq.getString();                                // 获取题目
            ANSWER[i] = Double.parseDouble(df.format(dq.getAnswer()));    // 获取答案
        }
        
    }
    
   
    
    // 显示第i题的题目
    private void showItem(int i){
        et_question.setText(QUESTION[i]);
        index = i;
        tv_count.setText(""+(index+1)+"/"+NUMBER);
        if(USER_ANSWER[i]!=0.0){
            et_answer.setText(""+USER_ANSWER[i]);
        }
        
        // 如果提交
        if(isSubmit){
            if(ANSWER_CHECK[index] == true){
                tv_judge.setText("√");
                Toast.makeText(getApplicationContext(), "回答正确" ,Toast.LENGTH_SHORT).show();
            }
            else{
                tv_judge.setText("×");
                Toast.makeText(getApplicationContext(), "正确答案为"+ANSWER[index],Toast.LENGTH_SHORT).show();
            }
        }
        
        // 获取焦点
        et_answer.requestFocus();
    }
    
    // 上一题按钮
    class LastClick implements OnClickListener{

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            if(index == 0){
                Toast.makeText(getApplicationContext(), "这已经是第一题",Toast.LENGTH_SHORT).show();
            }
            else{
                if(!et_answer.getText().toString().equals("")){  // 输入非空
                    try{
                        USER_ANSWER[index] = Double.parseDouble(et_answer.getText().toString());
                    }catch(Exception e){
                        e.printStackTrace();
                        return;
                    }
                }
                // 显示上一题
                index--;
                et_answer.setText("");
                showItem(index);
            }
        }
        
    }
    
    // 下一题按钮
    class NextClick implements OnClickListener{

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            if(index == NUMBER-1){
                Toast.makeText(getApplicationContext(), "这已经是最后一题",Toast.LENGTH_SHORT).show();
            }
            else{
                // 如果输入非空
                if(!et_answer.getText().toString().equals("")){
                    try{
                        USER_ANSWER[index] = Double.parseDouble(et_answer.getText().toString());
                    }catch(Exception e){
                        e.printStackTrace();
                        return;
                    }
                }
                
                // 显示下一题
                index++;
                et_answer.setText("");
                showItem(index);
            }
        }
        
    }
    
    // 核对答案
    private boolean check(){
        
        // 判定最后一道题目
        if(!et_answer.getText().toString().equals("")){
            try{
                USER_ANSWER[index] = Double.parseDouble(et_answer.getText().toString());
            }catch(Exception e){
                e.printStackTrace();
                return false;
            }
        }
        
        // 核对所有题目
        int right = 0; // 答对题数
        for(int i = 0;i < NUMBER;i++){
            if(ANSWER[i] == USER_ANSWER[i]){
                right++;
                ANSWER_CHECK[i] = true;
            }
        }
        
        // 判定提交时正在显示的题目
        if(ANSWER_CHECK[index] == true){
            tv_judge.setText("√");
            Toast.makeText(getApplicationContext(), "回答正确" ,Toast.LENGTH_SHORT).show();
        }
        else{
            tv_judge.setText("×");
            Toast.makeText(getApplicationContext(), "正确答案为"+ANSWER[index],Toast.LENGTH_SHORT).show();
        }
        
        String str = "此次答题共" + NUMBER + "道题,答对" + right + "题。";
        tv_check.setText(str);
        
        return true;
    }
    
    // 重置函数
    private void reset(){
        // 重置变量
        index = 0;
        NUMBER = 0;
        ANSWER = new double[MAXNUMBER];
        QUESTION = new String[MAXNUMBER];
        USER_ANSWER = new double[MAXNUMBER];
        ANSWER_CHECK = new boolean[MAXNUMBER];
        
        // 重置控件
        btn_confirm.setEnabled(true);
        et_number.setEnabled(true);
        tv_count.setText("0/0");
        et_answer.setText("");
        tv_check.setText("");
        tv_judge.setText("");
        et_number.setText("");
        et_question.setText("");
        
    }
    
    
}
package com.example.example07;

/*
 * 出题类
 * 可调用的方法:
 * 1.重新出题
 * 2.获取题目
 * 3.获取答案
 */

public class DesignQuestion {

    private int valueNum;
    private int[] values;
    private int[] symbols;
    private static int MAXVALUE = 100;
    
    
    // 构造函数
    public DesignQuestion(){
        valueNum = 3;
        toRandom();
    }
    
    public void reset(){
        toRandom();
    }
    
    // 生成随机数和符号
    private void toRandom(){
        // 数值随机
        values = new int[valueNum];
        for(int i = 0; i < values.length;i++){
            values[i] = (int)(1+Math.random()*MAXVALUE);
        }
        // 符号随机
        symbols = new int[valueNum-1];
        for(int i = 0;i < symbols.length;i++){
            symbols[i] = (int)(1+Math.random()*4);
        }
    }
    
    /* 生成答案
     * 1.如果第一个符号为加 则先计算后面
     * 2.如果第一个符号为减 
     * 第二个符号位加减 则先计算前面 否则先计算后面
     * 3.如果第一个符号为乘除 则先计算前面
     */
    public double getAnswer(){
        double temp = 0;
        switch(symbols[0]){
        case 1:{
            temp = getResult(values[1],values[2],symbols[1]);
            return getResult(values[0],(int)temp,symbols[0]);
        }
        case 2:{
            if(symbols[1] == 1 || symbols[1] == 2){  // 第二位为加减
                temp = getResult(values[0],values[1],symbols[0]);
                return getResult((int)temp,values[2],symbols[1]);
            }
            else{
                temp = getResult(values[1],values[2],symbols[1]);
                return getResult(values[0],(int)temp,symbols[0]);
            }
        }
        case 3:
        case 4:{
            temp = getResult(values[0],values[1],symbols[0]);
            return getResult((int)temp,values[2],symbols[1]);
        }
        default: return 0;
        }
    }
    
    // 根据符号返回计算结果
    private double getResult(int leftValue,int rightValue,int symbol){
        switch(symbol){
        case 1:return leftValue + rightValue;
        case 2:return leftValue - rightValue;
        case 3:return leftValue * rightValue;
        case 4:return (double)leftValue / (double)rightValue;
        default:return 0;
        }
    }
    
    // 生成题目
    public String getString(){
        String temp = "";
        for(int i = 0;i < valueNum-1;i++){
            temp = temp + values[i] + "\t\t\t" + toSymbol(symbols[i]) + "\t\t\t";
        }
        temp = temp + values[valueNum-1]+ "\t\t\t=";
        return temp;
    }
    
    // 根据数字返回符号
    private String toSymbol(int i){
        switch(i){
        case 1:return "+";
        case 2:return "-";
        case 3:return "*";
        case 4:return "/";
        default:return null;
        }
    }
    
}

 



 

一、题目

         每个同学选一个方向,把程序扩展一下:

1、让程序能接受用户输入答案,并判定对错。并输出正确的错题数

2、把程序变成一个网页程序,用户通过设定参数,就可以得到各种题目。

3、把程序变成一个Windows 图形界面的程序。

4、把程序变成一个智能手机程序 (你正在用什么手机, 就写那个手机的程序)。(可以延期3周后)

5、选一个你从来没有学过的编程语言,试一试实现基本功能。

二、实验思路   四则运算出题应用  

1.输入出题数 ,点击Confirm  ( 1<=n<=MAXNUMBER)  

2.提交成功后,显示第一道题目  

3.点击Last和Next可切换题目  

4.点击Submit后,核对题目正确与否,并输出答对题数    

注意:   1.答案保留一位小数   2.除法总是用较大的数除以较小的数

三、实验截图

 

 

四、实验日志

项目记录 日志:

 

听课

编写程序

阅读相关书籍

网上查找资料

日总计

上周四

2

0

0

0

2

上周五

0

1

1

0

2

上周六

0

3

0.5

1

4.5

上周日

2

0.5

0.5

0

3

周一

0

3

0.5

1

4.5

周二

0

1

0

1

2

周三

0

2

1

0

4

周总计

4

12.5

3.5

3

21

时间记录日志

日期

开始 时间

结束时间

中断时间

净时间

活动

备注

上周四

14:00

16:00

10

100

上课

软件工程

上周五

16:00

17:00

0

60

编程

二维数组问题

 

 

19:00

20:00

0

60

阅读书籍

构建之法

上周六

12:00

16:00

60

180

编程

 

 

19:00

21:00

30

90

阅读书籍

构建之法

上周日

14:00

16:00

10

100

上课

软件工程

 

19:00

20:00

0

60

编程 查找资料

四则运算安卓版

星期一

13:00

17:00

60

180

编程

数组问题

四则运算安卓版

 

17:00

18:00

0

60

上网

查资料

星期二

12:00

14:00

30

90

编程

数组问题

星期三

13:00

15:00

0

180

编程

四则运算安卓版

缺陷记录日志:

日期

编号

类型

引入阶段

排除阶段

修复阶段

修复缺陷

 

4/1

1

操作数的个数

 

 

12h

 

 

在编写的程序中,从一开始的两个数的运算增加到三个数的运算

 

 

 

 

 

五、实验总结:本次实验是在上几次四则运算的基础上编写出来的,我们应用移动应用开发技术将本次实验发布成安卓版本,并可以安装到手机上,我们这次的思路没有改变,知识语言由c++转变为Java语言,Java语言相对比较简单,好多函数、类都能调用,比较方便。而且在此次编写 的过程中,我们对安卓的开发更加熟悉,使我们获益不少。

  我的伙伴 张瑶:http://www.cnblogs.com/zhangyao999/

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!