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] + " " + toSymbol(symbols[i]) + " "; } temp = temp + values[valueNum-1]+ " ="; 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/