首页 > 代码库 > "小明爸爸的四则运算" Android_版

"小明爸爸的四则运算" Android_版

程序一早就写完了,一直没时间写博客,时间也快截止了,还是来写了。

 

一,需求分析

初步计划是写一个简单的自动控制器给出n道简单的加减乘除的四则运算题目(含表达式和答案),为了方便使用及推广,使用平台android.编译平台eclipse.

用户给出需要的题目量n以及题目内数字个数m,程序取得需求生成n个题目类的实例对象,设置对象的属性数字个数为m,并生成四则运算表达式和答案

二,概要设计

 

算法方面无特殊,全是基本操作

 

三,详细设计及编码

安卓基本开发 + 基础程序设计

 

ActivityMain类

主界面没什么好说的。代码也没几行,获取基本的组件,设置属性,over

 

EquationActivity类

答题界面,通过主界面交互得到的数据创建适配器,动态显示题目列表

 1 package com.magician.mathmagic.ui; 2  3 import android.app.ActionBar; 4 import android.app.Activity; 5 import android.os.Bundle; 6 import android.view.Menu; 7 import android.view.MenuItem; 8 import android.widget.ListView; 9 10 import com.magician.mathmagic.adapter.AdapterEquation;11 import com.magician.mathmagic.controller.Intelligent;12 import com.magician.mathmagic.model.Equation;13 14 public class EquationActivity extends Activity {15 16     private ListView listEquation;17     private AdapterEquation adapterEquation;18     private Intelligent intelligent;19     20     @Override21     protected void onCreate(Bundle savedInstanceState) {22         super.onCreate(savedInstanceState);23         setContentView(R.layout.activity_equation);24         25         ActionBar actionBar = getActionBar();  26         actionBar.setDisplayHomeAsUpEnabled(true);  27         28         initView();29         initData();30     }31     32     private void initView() {33 34         listEquation = (ListView) findViewById(R.id.list_equation_equationlist);35     }36     37     private void initData() {38 39         int quantity, grade, numbers, bracket;40         41         Bundle bundle = getIntent().getExtras();42         quantity = bundle.getInt("quantity");43         grade = bundle.getInt("grade");44         numbers = bundle.getInt("numbers");45         bracket = bundle.getInt("bracket");46         47         intelligent = new Intelligent(quantity, grade, numbers, bracket);48         adapterEquation = new AdapterEquation(EquationActivity.this, intelligent);49         int i = 0;50         for (Equation equation : intelligent.getEquationList()) {51             i++;52             System.out.println(i + " " + equation.toString() + " " + equation.getAnswer());53         }54         listEquation.setAdapter(adapterEquation);55     }56 57     @Override58     public boolean onCreateOptionsMenu(Menu menu) {59         // Inflate the menu; this adds items to the action bar if it is present.60         getMenuInflater().inflate(R.menu.equation, menu);61         return true;62     }63 64     @Override  65     public boolean onOptionsItemSelected(MenuItem item) {  66         switch (item.getItemId()) {  67         case android.R.id.home:  68             finish();69             return true;70         }71         return false;  72     }  73 }
EquationActivity

 

AdapterEquation类

自定义的列表适配器,通过界面层传输的数据给出相应的处理之后返回界面效果给界面层

主要是创建一个管理者对象管理四则运算。

  1 /**************************************************************************************  2 *  3 * [Project]  4 *       MathMagic  5 * [Package]  6 *       com.magician.mathmagic.adapter  7 * [FileName]  8 *       AdapterEquation.java  9 * [Copyright] 10 *       Copyright 2014 brotherYang All Rights Reserved. 11 * [History] 12 *        @Version    :    1.0.0 13 *       @User        :     Administrator 14 *        @Time        :    2014-10-7 - 下午8:15:08 15 *        @Auther        :    brotherYang (include18883287887@gamil.com) 16 *        @Record        :    Create 17 * 18 **************************************************************************************/ 19  20 package com.magician.mathmagic.adapter; 21  22 import java.util.HashMap; 23 import java.util.LinkedList; 24 import java.util.Map; 25  26 import android.app.Activity; 27 import android.content.Context; 28 import android.text.Editable; 29 import android.text.TextWatcher; 30 import android.view.LayoutInflater; 31 import android.view.View; 32 import android.view.ViewGroup; 33 import android.widget.BaseAdapter; 34 import android.widget.Button; 35 import android.widget.EditText; 36 import android.widget.TextView; 37 import android.widget.Toast; 38  39 import com.magician.mathmagic.controller.Intelligent; 40 import com.magician.mathmagic.model.Equation; 41 import com.magician.mathmagic.ui.R; 42  43 public class AdapterEquation extends BaseAdapter{ 44  45     private LinkedList<Map<String, String>> aEquationItemData; 46     private Map<String, String> aEditorValue; 47     private Map<String, String> aAnswer; 48       49     private Intelligent intelligent; 50     private Equation equation; 51     private LayoutInflater aInflater; 52     private ViewHolder aHolder; 53     private Activity aContext; 54      55     public AdapterEquation (Context context, Intelligent intelligent) { 56         this.intelligent = intelligent; 57         this.aContext = (Activity) context; 58         this.aInflater = (LayoutInflater) context 59                 .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 60              61         init(); 62     } 63  64     // 初始化 65     private void init() { 66         aEquationItemData = http://www.mamicode.com/new LinkedList<Map<String,String>>(); 67         aEditorValue = http://www.mamicode.com/new HashMap<String, String>(); 68         aAnswer = new HashMap<String, String>(); 69         aEditorValue.clear(); 70         aAnswer.clear(); 71          72         for (int i = 0; i < getCount(); i++) { 73             aEquationItemData.add(i, null); 74         } 75     } 76           77     @Override 78     public int getCount() { 79         return intelligent.getEquationList().size(); 80     } 81  82     @Override 83     public Object getItem(int position) { 84         return intelligent.getEquationList().get(position); 85     } 86  87     @Override 88     public long getItemId(int position) { 89         return position; 90     } 91  92     @Override 93     public View getView(final int position, View convertView, ViewGroup parent) { 94         if (convertView == null) { 95             convertView = aInflater.inflate(R.layout.list_item_equation, null); 96             aHolder = new ViewHolder(); 97              98             aHolder.vBtonSubmit = (Button) convertView.findViewById(R.id.bton_equation_submit); 99             aHolder.vTexvWitchOne = (TextView) convertView.findViewById(R.id.texv_equation_witchone);100             aHolder.vTexvEquation = (TextView) convertView.findViewById(R.id.texv_equation_content);101             aHolder.vEditYourAnswer = (EditText) convertView.findViewById(R.id.edit_equation_youranswer);102             aHolder.vTexvAnswer = (TextView) convertView.findViewById(R.id.texv_equation_rightanswer);103             aHolder.vEditYourAnswer.setTag(position);104             aHolder.vBtonSubmit.setTag(position);105             convertView.setTag(aHolder);106             convertView.setId(position);107             ClearHolder(aHolder);108         } else {109             aHolder = (ViewHolder) convertView.getTag();110             ClearHolder(aHolder);111             aHolder.vEditYourAnswer.setTag(position);112             aHolder.vBtonSubmit.setTag(position);113         }114 115         equation = intelligent.getEquationList().get(position);116         aHolder.vRightAnswer = (equation.getAnswer());117         aHolder.vTexvWitchOne.setText((position+1) + " : ");118         aHolder.vTexvEquation.setText(equation.toString()); 119         120         class ATextWatcher implements TextWatcher {121             public ATextWatcher(ViewHolder holder) {122                 mHolder = holder;123             }124 125             private ViewHolder mHolder;126 127             @Override128             public void onTextChanged(CharSequence s, int start,129                     int before, int count) {130             }131 132             @Override133             public void beforeTextChanged(CharSequence s, int start,134                     int count, int after) {135             }136 137             @Override138             public void afterTextChanged(Editable s) {139                 if (s != null && !"".equals(s.toString())) {140                     int position = (Integer) mHolder.vEditYourAnswer.getTag();141                     aEditorValue.put(String.valueOf(position), s.toString());142                     // 当EditText数据发生改变的时候存到data变量中143                 }144             }145         }146         147         aHolder.vEditYourAnswer.addTextChangedListener(new ATextWatcher(aHolder));148         aHolder.vEditYourAnswer.setText(null == aEditorValue.get(String.valueOf(position)) ? "" : aEditorValue.get(String.valueOf(position)));149         aHolder.vTexvAnswer.setText(null == aEquationItemData.get(position) ? "" : aEquationItemData.get(position).get("answer"));150         aHolder.vBtonSubmit.setEnabled(!intelligent.getEquationList().get(position).isRight());151         aHolder.vBtonSubmit.setOnClickListener(new View.OnClickListener() {152             @Override153             public void onClick(View v) {154                 155                 // TODO Auto-generated method stub156                 aHolder.vYourAnswer = aEditorValue.get(String.valueOf(position));157                 aHolder.vRightAnswer = (intelligent.getEquationList()158                         .get(position).getAnswer());159                 int tPosition = (Integer) v.getTag();160 161                 if (null == (aHolder.vYourAnswer)) {162                     Toast.makeText(aContext, "题目 " + (tPosition+1) +" 答案为空!", Toast.LENGTH_SHORT).show();163                     return;164                 }165                 intelligent.getEquationList().get(tPosition).setAnswered(true);166                 if (Double.valueOf(aHolder.vYourAnswer) == (aHolder.vRightAnswer)) {167                     168                     aAnswer = new HashMap<String, String>();169                     aAnswer.put("answer", "回答正确!");170                     aEquationItemData.remove(tPosition);171                     aEquationItemData.add(tPosition, aAnswer);172                     intelligent.getEquationList().get(tPosition).setRight(true);173                 } else {174                     aAnswer = new HashMap<String, String>();175                     aAnswer.put("answer", "回答错误!正确答案是 : " + aHolder.vRightAnswer);176                     aEquationItemData.remove(tPosition);177                     aEquationItemData.add(tPosition, aAnswer);178                 }179                 notifyDataSetChanged();180             }181         });182         183         return convertView;184     }185 186     /**187      * 188      */189     private void ClearHolder(ViewHolder holder) {190         // TODO Auto-generated method stub191         holder.vTexvWitchOne.setText("");192         holder.vTexvEquation.setText("");193         holder.vTexvAnswer.setText("");194         holder.vEditYourAnswer.setText("");195     }196 197     public final class ViewHolder {198         public View vBaseView;199         public int vPosition;200         public TextView vTexvWitchOne;201         public TextView vTexvEquation;202         public TextView vTexvAnswer;203         public EditText vEditYourAnswer;204         public Button vBtonSubmit;205         206         public String vEquation;207         public String vYourAnswer;208         public double vRightAnswer;209     }210 }
AdapterEquation

 

Intelligent类

管理者,适配器传输的数据给出相应的动作,创建四则运算方程式

 1     /** 2      * 方程式集合 3      */ 4     private LinkedList<Equation> equationList; 5      6     /** 7      * 初始化题目数量 8      */ 9     private int quantity;10     11     /**12      * 构造方程式13      */14     public Intelligent(int quantity, int grade, int numbers, int bracket) {15         // TODO Auto-generated constructor stub16         this.quantity = quantity;17         18         equationList = new LinkedList<Equation>();19         for (int i = 0; i < quantity; i++) {20             equationList.addLast(new Equation(grade, numbers, bracket));21         }22     }

 

Equation类

方程式,通过初始化各属性生成四则运算表达式以及答案。

  1 /**************************************************************************************  2  *  3  * [Project]  4  *       MathMagic  5  * [Package]  6  *       com.magician.mathmagic.model  7  * [FileName]  8  *       Equation.java  9  * [Copyright] 10  *       Copyright 2014 brotherYang All Rights Reserved. 11  * [History] 12  *        @Version    :    1.0.0 13  *       @User        :     Administrator 14  *        @Time        :    2014-10-7 - 下午7:22:16 15  *        @Auther        :    brotherYang (include18883287887@gamil.com) 16  *        @Record        :    Create 17  * 18  **************************************************************************************/ 19  20 package com.magician.mathmagic.model; 21  22 import java.text.DecimalFormat; 23 import java.util.LinkedList; 24 import java.util.Random; 25  26 public class Equation { 27  28     /** 29      * 用于存放数的列表 30      */ 31     private LinkedList<String> numberList; 32  33     /** 34      * 用于存放計算符号的列表 35      */ 36     private LinkedList<String> arithmeticList; 37  38     private LinkedList<String> calculateList; 39  40     /** 41      * 初始化题目难度 - 年级(1-6) 42      */ 43     private int grade; 44  45     /** 46      * 初始化几个数字 - 个数(2-3) 47      */ 48     private int numbers; 49  50     /** 51      * 初始化是否有括号 52      */ 53     private int bracket; 54      55     /** 56      * 初始化括号数量 57      */ 58     private int numBracket; 59  60     /** 61      * 算法 - ( " + ", " - ", " * ", " / ") 62      */ 63     public static class Arithmetic { 64  65         public static final int plus = 0; 66         public static final int minus = 1; 67         public static final int multiply = 2; 68         public static final int divide = 3; 69         public static final int bracket = 0; 70         public static final int nobracket = 1; 71         public static final int randombracket = 2; 72         public static final int[] maxnumber = { 10, 30, 60, 100, 500, 1000 }; 73         public static final double wrongnumber = -2147483647; 74     }; 75  76     /** 77      * 方程式的答案 78      */ 79     private double answer; 80  81     /** 82      * 方程式的字符串 83      */ 84     private StringBuilder stringEquation; 85  86     /** 87      * 是否回答 88      */ 89     private boolean isAnswered; 90  91     /** 92      * 是否回答正确 93      */ 94     private boolean isRight; 95  96     /** 97      * @param grade 98      * @param numbers 99      * @param isBracket100      */101     public Equation(int grade, int numbers, int bracket) {102         this.grade = grade;103         this.numbers = numbers;104         this.bracket = bracket;105 106         if (bracket == Arithmetic.randombracket) {107             bracket = new Random().nextInt(2);108         }109         110         if (bracket == Arithmetic.nobracket) {111             numBracket = 0;112         } else {113             numBracket = new Random().nextInt(numbers - 1);114         }115         116         isAnswered = false;117         isRight = false;118         numberList = new LinkedList<String>();119         arithmeticList = new LinkedList<String>();120         calculateList = new LinkedList<String>();121         answer = Arithmetic.wrongnumber;122         stringEquation = new StringBuilder();123 124         for (int i = 0; i < numbers; i++) {125             numberList.add(String.valueOf((new Random()126                     .nextInt(Arithmetic.maxnumber[3]) + 1)));127             stringEquation.append(numberList.get(i) + " ");128             if (i < numbers - 1) {129                 arithmeticList.add(generateArithmetic());130                 stringEquation.append(arithmeticList.get(i) + " ");131             }132         }133 134         calculateAnswer();135     }136 137     /**138      * 139      */140     private String generateArithmetic() {141         // TODO Auto-generated method stub142 143         int intArithmetic = new Random().nextInt(4);144 145         switch (intArithmetic) {146         case Arithmetic.plus:147             return "+";148         case Arithmetic.minus:149             return "-";150         case Arithmetic.multiply:151             return "*";152         case Arithmetic.divide:153             return "/";154         default:155             return null;156         }157     }158 159     /**160      * (non-Javadoc)161      * 162      * @see java.lang.Object#toString()163      */164     @Override165     public String toString() {166         // TODO Auto-generated method stub167         return stringEquation.toString();168     }169 170     /**171      * 172      */173     private void calculateAnswer() {174         // TODO Auto-generated method stub175 176         for (int i = 0; i < numberList.size(); i++) {177             calculateList.addLast(numberList.get(i));178             while (i < arithmeticList.size()) {179                 if (arithmeticList.get(i).equals("*")) {180                     calculateList.addLast(String.valueOf(Double181                             .valueOf(calculateList.removeLast())182                             * Double.valueOf(numberList.remove(i + 1))));183                     arithmeticList.remove(i);184                 } else if (arithmeticList.get(i).equals("/")) {185                     calculateList.addLast(String.valueOf(Double186                             .valueOf(calculateList.removeLast())187                             / Double.valueOf(numberList.remove(i + 1))));188                     arithmeticList.remove(i);189                 } else {190                     calculateList.addLast(arithmeticList.get(i));191                     break;192                 }193             }194         }195 196         for (String it : calculateList) {197             System.out.println(" content " + it);198         }199         200         while (!calculateList.isEmpty()) {201             if (answer == Arithmetic.wrongnumber) {202                 answer = Double.valueOf(calculateList.removeFirst());203                 continue;204             }205             String cString = calculateList.removeFirst();206             if (cString.equals("+")) {207                 answer += Double.valueOf(calculateList.removeFirst());208                 continue;209             } else if (cString.equals("-")) {210                 answer -= Double.valueOf(calculateList.removeFirst());211                 continue;212             } else {213                 System.out.println("Error!");214             }215         }216         217         // 转换保留最后2为小数218         DecimalFormat df = new DecimalFormat(".##");219         answer = Double.valueOf(df.format(answer));220     }221 222     /**223      * @return the numbers224      */225     public int getNumbers() {226         return numbers;227     }228 229     /**230      * @param numbers231      *            the numbers to set232      */233     public void setNumbers(int numbers) {234         this.numbers = numbers;235     }236 237     /**238      * @return the grade239      */240     public int getGrade() {241         return grade;242     }243 244     /**245      * @param grade246      *            the grade to set247      */248     public void setGrade(int grade) {249         this.grade = grade;250     }251 252     /**253      * @return the isBracket254      */255     public int getBracket() {256         return bracket;257     }258 259     /**260      * @param isBracket261      *            the isBracket to set262      */263     public void setBracket(int bracket) {264         this.bracket = bracket;265     }266 267     /**268      * @return the answer269      */270     public double getAnswer() {271         return answer;272     }273 274     /**275      * @param answer276      *            the answer to set277      */278     public void setAnswer(double answer) {279         this.answer = answer;280     }281 282     /**283      * @return the isAnswered284      */285     public boolean isAnswered() {286         return isAnswered;287     }288 289     /**290      * @param isAnswered291      *            the isAnswered to set292      */293     public void setAnswered(boolean isAnswered) {294         this.isAnswered = isAnswered;295     }296 297     /**298      * @return the isRight299      */300     public boolean isRight() {301         return isRight;302     }303 304     /**305      * @param isRight306      *            the isRight to set307      */308     public void setRight(boolean isRight) {309         this.isRight = isRight;310     }311 }
Equation

 

 

四,测试及性能测试

 经过测试,界面不友好,人机交互不友好,存在逻辑上的小bug.

基本操作无误,可以使用。

性能测试

 

 也算是一个性能分析吧,不过也看不出什么来

 

五,总结

这只是一次小小的软件工程的作业,但里面收获的真的很多,有软件设计的基本流程的进一步巩固,android平台快速开发的经验,代码规范性,软件设计的思想等等,收获颇丰,期待下一次实战。

 

软件地址:

http://121.42.29.54/upload/MathMagic.apk

百度云盘:

http://pan.baidu.com/s/1bntShm3

 

"小明爸爸的四则运算" Android_版