• "小明爸爸的四则运算" 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     @Override
    21     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     @Override
    58     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 = new LinkedList<Map<String,String>>();
     67         aEditorValue = 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             @Override
    128             public void onTextChanged(CharSequence s, int start,
    129                     int before, int count) {
    130             }
    131 
    132             @Override
    133             public void beforeTextChanged(CharSequence s, int start,
    134                     int count, int after) {
    135             }
    136 
    137             @Override
    138             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             @Override
    153             public void onClick(View v) {
    154                 
    155                 // TODO Auto-generated method stub
    156                 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 stub
    191         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 stub
    16         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 isBracket
    100      */
    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 stub
    142 
    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     @Override
    165     public String toString() {
    166         // TODO Auto-generated method stub
    167         return stringEquation.toString();
    168     }
    169 
    170     /**
    171      * 
    172      */
    173     private void calculateAnswer() {
    174         // TODO Auto-generated method stub
    175 
    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(Double
    181                             .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(Double
    186                             .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 numbers
    224      */
    225     public int getNumbers() {
    226         return numbers;
    227     }
    228 
    229     /**
    230      * @param numbers
    231      *            the numbers to set
    232      */
    233     public void setNumbers(int numbers) {
    234         this.numbers = numbers;
    235     }
    236 
    237     /**
    238      * @return the grade
    239      */
    240     public int getGrade() {
    241         return grade;
    242     }
    243 
    244     /**
    245      * @param grade
    246      *            the grade to set
    247      */
    248     public void setGrade(int grade) {
    249         this.grade = grade;
    250     }
    251 
    252     /**
    253      * @return the isBracket
    254      */
    255     public int getBracket() {
    256         return bracket;
    257     }
    258 
    259     /**
    260      * @param isBracket
    261      *            the isBracket to set
    262      */
    263     public void setBracket(int bracket) {
    264         this.bracket = bracket;
    265     }
    266 
    267     /**
    268      * @return the answer
    269      */
    270     public double getAnswer() {
    271         return answer;
    272     }
    273 
    274     /**
    275      * @param answer
    276      *            the answer to set
    277      */
    278     public void setAnswer(double answer) {
    279         this.answer = answer;
    280     }
    281 
    282     /**
    283      * @return the isAnswered
    284      */
    285     public boolean isAnswered() {
    286         return isAnswered;
    287     }
    288 
    289     /**
    290      * @param isAnswered
    291      *            the isAnswered to set
    292      */
    293     public void setAnswered(boolean isAnswered) {
    294         this.isAnswered = isAnswered;
    295     }
    296 
    297     /**
    298      * @return the isRight
    299      */
    300     public boolean isRight() {
    301         return isRight;
    302     }
    303 
    304     /**
    305      * @param isRight
    306      *            the isRight to set
    307      */
    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

  • 相关阅读:
    python 基础2
    ffmpeg安装和录制linux桌面图像
    Python TCP Socket 传输服务器资源信息(C/S)
    ubuntu下,hue3.7编译安装,设置中文语言
    Python 图片转字符画
    Python快速教程
    spark安装部署
    python基础之文件处理
    python之路之函数
    python习题
  • 原文地址:https://www.cnblogs.com/qimumu/p/4037288.html
Copyright © 2020-2023  润新知