安卓版四则运算
这次编程主要是对我们之前编写的C++四则运算进行移植,将其一直到安卓手机平台,因为之前做的是C++版本的,所以做起来饶了很多弯路,需要现将其改编为Java语言,在进行后续工作。
这个个安卓程序主有三个Activity界面,第一个上边输入想要做的题目数量,用intent将其传值道第二个Activity界面上,然后根据这些条件出题,每个题目由3-5个数组成,最后能算出答案并进行比较,结束后会统计做对的题目数量,然后给出正确率。第三个界面则是对这个软件的介绍了,如何使用和版本等信息。
我们的代码主要如下:
第一个布局文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/background" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="40dp" android:text="易百分" android:textColor="#0000FF" android:textSize="30dp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="0.02" android:orientation="vertical" > <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="30dp" android:text="请输入题目数量" android:textSize="20sp" /> <EditText android:id="@+id/edtnumber" android:layout_width="107dp" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="10dp" android:ems="10" android:inputType="numberSigned" > <requestFocus /> </EditText> <RadioGroup android:id="@+id/radioGroup1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="20dp" > <RadioButton android:id="@+id/radio0" android:layout_width="wrap_content" android:layout_height="wrap_content" android:checked="true" android:text="一位数运算" /> <RadioButton android:id="@+id/radio1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="两位数运算" /> </RadioGroup> <Button android:id="@+id/btnTijiao" android:layout_width="123dp" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="30dp" android:onClick="onClickTijiao2" android:text="提 交" /> </LinearLayout> </LinearLayout>
这个界面对应的Java文件:
1 package com.ml.caculate; 2 3 import android.app.Activity; 4 import android.app.AlertDialog; 5 import android.content.Intent; 6 import android.os.Bundle; 7 import android.view.ContextMenu; 8 import android.view.ContextMenu.ContextMenuInfo; 9 import android.view.View; 10 import android.widget.EditText; 11 import android.widget.RadioButton; 12 import android.widget.RadioGroup; 13 import android.widget.RadioGroup.OnCheckedChangeListener; 14 import android.widget.TextView; 15 16 public class page2 extends Activity { 17 18 TextView tv1; 19 EditText edtnum; 20 RadioButton mRadio1; 21 RadioButton mRadio2; 22 RadioGroup genderGroup; 23 String info="0"; 24 @Override 25 protected void onCreate(Bundle savedInstanceState) { 26 // TODO Auto-generated method stub 27 super.onCreate(savedInstanceState); 28 setContentView(R.layout.help2); 29 tv1=(TextView)findViewById(R.id.textView2); 30 edtnum=(EditText)findViewById(R.id.edtnumber); 31 mRadio1 = (RadioButton) findViewById(R.id.radio0); 32 mRadio2 = (RadioButton) findViewById(R.id.radio1); 33 genderGroup=(RadioGroup)findViewById(R.id.radioGroup1); 34 genderGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() { 35 36 @Override 37 public void onCheckedChanged(RadioGroup group, int checkedId) { 38 // TODO Auto-generated method stub 39 if (checkedId == mRadio1.getId()) 40 { 41 info="0"; 42 } 43 else if (checkedId == mRadio2.getId()) 44 { 45 info="1"; 46 } 47 } 48 }); 49 50 51 } 52 53 @Override 54 public void onCreateContextMenu(ContextMenu menu, View v, 55 ContextMenuInfo menuInfo) { 56 // TODO Auto-generated method stub 57 58 super.onCreateContextMenu(menu, v, menuInfo); 59 } 60 61 public void onClickTijiao2(View v) 62 { 63 String S1=edtnum.getText().toString(); 64 if(S1.length()==0) //判断输入框是否为空 65 { 66 new AlertDialog.Builder(this) 67 .setTitle("提示信息") 68 .setMessage("您还没有输入数量") 69 .setPositiveButton("现在输入", null) 70 .show(); 71 } 72 else 73 { 74 String R=info; //传值表示式子类型 75 String number=edtnum.getText().toString(); 76 Intent intent=new Intent(); 77 intent.setClass(page2.this,MainActivity.class); 78 intent.putExtra("extra", number); //put传到另一个界面 79 intent.putExtra("redio", R); //put传到另一个界面 80 81 //启动 82 this.startActivity(intent); 83 } 84 85 } 86 87 88 }
第二个布局文件,也是实现主要功能的布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/LinearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center_vertical" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="24dp" android:text="小学生计算题" android:textSize="26dp" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:gravity="center" > <TextView android:id="@+id/tvNum" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="请" android:textSize="20dp" /> <TextView android:id="@+id/tvSuanshi" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="点击下一题开始做题" android:textSize="20sp" /> </LinearLayout> <LinearLayout android:layout_width="110dp" android:layout_height="wrap_content" android:layout_gravity="center" android:orientation="vertical" > <TextView android:id="@+id/textView4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:text="输入你的结果" android:textSize="18dp" /> <EditText android:id="@+id/editText1" android:layout_width="105dp" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:ems="10" android:inputType="none" android:text="" /> </LinearLayout> <LinearLayout android:layout_width="200dp" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="25dp" android:onClick="onClickYes" > <Button android:id="@+id/btnYes" android:layout_width="100dp" android:layout_height="wrap_content" android:onClick="onClickYes" android:text="确 定" /> <Button android:id="@+id/btnClear" android:layout_width="100dp" android:layout_height="wrap_content" android:onClick="ClearClick" android:text="下一题" /> </LinearLayout> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="90dp" android:text="版本号:V 15.04.0001" /> </LinearLayout>
对应的Java文件:
package com.ml.caculate; import java.math.BigDecimal; import java.util.Stack; import android.os.Bundle; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.content.DialogInterface.OnClickListener; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends Activity { /* (non-Javadoc) * @see android.app.Activity#onOptionsItemSelected(android.view.MenuItem) */ @Override public boolean onOptionsItemSelected(MenuItem item) { // TODO Auto-generated method stub int id=item.getItemId(); if(id==R.id.action_settings) { Intent i = new Intent(MainActivity.this , page1.class); //启动帮助说明界面 startActivity(i); return true; } return super.onOptionsItemSelected(item); } TextView ss,suanshi,zhengque,nandu; EditText edtResult; int j=10; boolean i=true; int num=0; String str=Way_1(); int shumu=0; int trr=0,err=0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ss=(TextView)findViewById(R.id.tvNum); zhengque=(TextView)findViewById(R.id.textView1); nandu=(TextView)findViewById(R.id.textView4); suanshi=(TextView)findViewById(R.id.tvSuanshi); edtResult=(EditText)findViewById(R.id.editText1); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); ss.setText(""); return true; } //产生算式的函数 private static int Operands_2() /*1-9*/ { int Operand=(int)(Math.random()*9)+1; return Operand; } private static int Operands_3() /*1-99*/ { int Operand=(int)(Math.random()*99)+1; return Operand; } private static String Operator_1(String formula)/*随机产生运算符 有乘除*/ { int f=(int)(Math.random()*4); if(f==0) { formula+="+"; } if(f==1) { formula+="-"; } if(f==2) { formula+="*"; } if(f==3) { formula+="/"; } return formula; } private static String Way_1() /*最多可支持10个数参与计算 有乘除 有括号 10以内 加减有负数 除法有余数*/ { String formula=""; int length=(int)(Math.random()*1)+3; /*随机产生表达式中操作数的个数 3-4 个*/ int left=0,right=0,flag=0,left_1; for(int i=0;i<length-1;i++) { left_1=left; // left=Bracket_l(left,formula); //--------- int f=(int)(Math.random()*3); if(f<2) { } if(f==2) { formula+="("; left++; } //****** if(left_1!=left) /*产生了左括号 flag=i*/ { flag=i; } formula+=Operands_2(); if(left>right&&flag!=i) /*左括号大于右括号的个数 and 产生左括号和右括号不在一个循环里 即不会产生“(随机数)” 这种无效情况*/ { //right=Bracket_r(right,formula); int r=(int)(Math.random()*5); if(r==0) { } if(r>0) /*产生右括号的概率大 */ { formula+=")"; right++; } } formula=Operator_1(formula); /*有乘除*/ } /*因为 一个操作数一个运算符 还缺少一个操作数 (0 -- 9)*/ formula+=Operands_2(); for(int i=0;i<left-right;i++) { formula+=")"; } return formula+="#"; } private static String Way_2() /* 有乘除 有括号 100以内 加减有负数 除法有余数*/ { String formula=""; int length=(int)(Math.random()*1)+3; /*随机产生表达式中操作数的个数3-4 个*/ int left=0,right=0,flag=0,left_1; for(int i=0;i<length-1;i++) { left_1=left; // left=Bracket_l(left,formula); //--------- int f=(int)(Math.random()*3); if(f<2) { } if(f==2) { formula+="("; left++; } //****** if(left_1!=left) /*产生了左括号 flag=i*/ { flag=i; } formula+=Operands_3(); if(left>right&&flag!=i) /*左括号大于右括号的个数 and 产生左括号和右括号不在一个循环里 即不会产生“(随机数)” 这种无效情况*/ { //right=Bracket_r(right,formula); int r=(int)(Math.random()*5); if(r==0) { } if(r>0) /*产生右括号的概率大 */ { formula+=")"; right++; } } formula=Operator_1(formula); /*有乘除*/ } /*因为 一个操作数一个运算符 还缺少一个操作数 (0 -- 9)*/ formula+=Operands_3(); for(int i=0;i<left-right;i++) { formula+=")"; } return formula+="#"; } //---------------------------------------------- static double jisuan(double x,double y,char oper) { switch(oper) { case '+': { return x+y; } case '-': { return x-y; } case '*': { return x*y; } case '/': { return x/y; } } return 0; } static char precede(char ch1,char ch2) { int i = 0,j=0; char[][] a={ //优先级对照表,依次为+ - * / ( ) # // + - * / ( ) # {'>','>','<','<','<','>','>'}, // + {'>','>','<','<','<','>','>'}, // - {'>','>','>','>','<','>','>'}, // * {'>','>','>','>','<','>','>'}, // / {'<','<','<','<','<','=','0'}, // ( {'>','>','>','>','0','>','>'}, // ) {'<','<','<','<','<','0','='} // # }; switch(ch1) { //优先级与矩阵匹配 case '+': { i=0; break; } case '-': { i=1; break; } case '*': { i=2; break; } case '/': { i=3; break; } case '(': { i=4; break; } case ')': { i=5; break; } case '#': { i=6; break; } } switch(ch2) { //优先级与矩阵匹配 case '+': { j=0; break; } case '-': { j=1; break; } case '*': { j=2; break; } case '/': { j=3; break; } case '(': { j=4; break; } case ')': { j=5; break; } case '#': { j=6; break; } } return a[i][j]; } static double fun(String str) { double result = 0; Stack<Character> optr = new Stack<Character> (); Stack<Double> opnd = new Stack<Double>(); //SqStack optr,opnd; //运算符 操作数 //InitStack(optr); //push(optr,'#'); optr.push('#'); //InitStack(opnd); int length=str.length(); int i=0; char ch; char s[] = str.toCharArray(); ch=s[i]; while(ch!='#'||optr.peek()!='#'&&i<length) { if(ch>='0'&&ch<='9') { char chh=s[++i]; if(chh>='0'&&chh<='9') { double c=(ch-48)*10+chh-48; opnd.push(c); ch=s[++i]; } else { double c=ch-48; opnd.push(c); ch=chh; } } else switch(precede(optr.peek(),ch)){ case '<': { //push(optr,ch); optr.push(ch); ch=s[++i]; break; } case '>': { //double y=pop1(opnd); //double x=pop1(opnd); double y=opnd.pop(); double x=opnd.pop(); char c=optr.pop(); result=jisuan(x,y,c); //push1(opnd,result+48); opnd.push(result); break; } case '=': { //pop(optr); optr.pop(); ch=s[++i]; break; } } } return result; } public void onClickYes(View v) //确定按钮 { Intent intent = getIntent(); String nn=intent.getStringExtra("extra"); int number=Integer.parseInt(nn); //从前一个界面传过来的值 if(shumu==number) { new AlertDialog.Builder(this) .setTitle("提示信息") .setMessage("您已经做完"+number+"道题,共答对"+trr+"道题") .setPositiveButton("OK", null) .show(); } String S1=edtResult.getText().toString(); if(ss.getText()=="请"||S1.length()==0) //判断输入框是否为空 { new AlertDialog.Builder(this) .setTitle("提示信息") .setMessage("您还没有输入答案或还没开始") .setPositiveButton("现在输入", null) //.setNegativeButton("是", null) .show(); } else { String str=ss.getText().toString(); double result1 = fun(str); BigDecimal bg = new BigDecimal(result1); double f1 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); // ss.setText(str); double answer=Double.valueOf(edtResult.getText().toString()); if (answer!=f1) { new AlertDialog.Builder(this) .setTitle("错误提示") .setMessage("很遗憾 ,回答错误!") .setNegativeButton("下一题",new OnClickListener() { @Override public void onClick(DialogInterface arg0, int arg1) { // TODO Auto-generated method stub Intent intent = getIntent(); String rr=intent.getStringExtra("redio"); int red=Integer.parseInt(rr); if(red==0) { String str=Way_1(); ss.setText(str); zhengque.setText("小学生计算题"); suanshi.setText(" ?"); } else { String str=Way_1(); ss.setText(str); zhengque.setText("小学生计算题"); suanshi.setText(" ?"); } } }) .show(); shumu++; } else if(answer==f1) { suanshi.setText(" ?"); zhengque.setText("恭喜回答正确!!!"); ss.setText("请点击下一道题,继续..."); trr++; } edtResult.setText(""); } } public void ClearClick(View v) //下一题按钮 { Intent intent = getIntent(); String nn=intent.getStringExtra("extra"); String rr=intent.getStringExtra("redio"); int number=Integer.parseInt(nn); //从前一个界面传过来的值 int red=Integer.parseInt(rr); if(shumu<number) { edtResult.setText(""); if(red==0) { String str=Way_1(); ss.setText(str); zhengque.setText("小学生计算题"); suanshi.setText(" ?"); shumu++; } else { String str=Way_2(); ss.setText(str); zhengque.setText("小学生计算题"); suanshi.setText(" ?"); shumu++; } } else { new AlertDialog.Builder(this) .setTitle("提示信息") .setMessage("您已经做完"+number+"道题,共答对"+trr+"道题") .setPositiveButton("OK", null) .show(); ss.setText(""); String s2=trr+"/"+number+"#"; double s=fun(s2); BigDecimal bg = new BigDecimal(s); double f1 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); suanshi.setText("正确率:"+f1*100+"%"); } } }
帮助说明布局文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="40dp" android:text="帮助说明" android:textSize="24dp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="35dp" android:orientation="vertical" > <TextView android:id="@+id/textView2" android:layout_width="238dp" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="16dp" android:layout_weight="0.59" android:text="1.您可以选择题目数量。" android:textSize="20dp" /> <TextView android:id="@+id/textView3" android:layout_width="238dp" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="16dp" android:layout_weight="0.59" android:text="2.您可以选择有无乘除。" android:textSize="20dp" /> <TextView android:id="@+id/textView4" android:layout_width="238dp" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="16dp" android:layout_weight="0.59" android:text="3.结果是小数的,保留两位小数。" android:textSize="20dp" /> <TextView android:id="@+id/textView5" android:layout_width="238dp" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="16dp" android:layout_weight="0.59" android:text="4.结果是整数的,保留一位小数。" android:textSize="20dp" /> <TextView android:id="@+id/textView6" android:layout_width="238dp" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="16dp" android:layout_weight="0.59" android:text="5.预祝你取得好成绩!" android:textSize="20dp" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="60dp" android:gravity="center_horizontal" > <TextView android:id="@+id/textView7" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="版本号:" /> <TextView android:id="@+id/textView8" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="V 15.04.0001" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal"> <TextView android:id="@+id/textView9" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="关注博客园:_小学生and小青年" /> </LinearLayout> </LinearLayout>
对应的Java文件:
1 package com.ml.caculate; 2 3 import android.app.Activity; 4 import android.content.Intent; 5 import android.os.Bundle; 6 import android.view.ContextMenu; 7 import android.view.ContextMenu.ContextMenuInfo; 8 import android.view.View; 9 import android.widget.RadioButton; 10 import android.widget.RadioGroup; 11 import android.widget.TextView; 12 13 public class page1 extends Activity { 14 15 public RadioGroup rg; 16 public RadioButton mRadio1, mRadio2,mRadio3; 17 String []info=new String [3]; 18 TextView tv1; 19 20 @Override 21 protected void onCreate(Bundle savedInstanceState) { 22 // TODO Auto-generated method stub 23 super.onCreate(savedInstanceState); 24 setContentView(R.layout.help); 25 tv1=(TextView)findViewById(R.id.textView1); 26 } 27 28 @Override 29 public void onCreateContextMenu(ContextMenu menu, View v, 30 ContextMenuInfo menuInfo) { 31 // TODO Auto-generated method stub 32 super.onCreateContextMenu(menu, v, menuInfo); 33 } 34 35 public void onClickTijiao1(View v) 36 { 37 Intent i = new Intent("android.intent.action.PAGE2"); 38 i.putExtra(info[0], info[0]); 39 //启动 40 startActivity(i); 41 } 42 }
结果:
实验感想:
这次试验有很多细节的地方,比如判空语句,比如判断对错的对话框,光判空语句就占了将近1/4的代码量,做完了这个小软件,感觉一点点成就感。
项目计划总结: | ||||
日期 | 听课 | 编写程序 | 查阅资料 | 日总计 |
星期一 | 2 | 2 | 2 | 6 |
星期二 | ||||
星期三 | 3 | 1 | 4 | |
星期四 | 2 | 2 | 4 | |
星期五 | 2 | 2 | ||
星期六 | 3 | 1 | 4 | |
星期日 | 3 | 1 | 4 | |
周总计 | 17 | 7 | 24 |
时间记录日志: | ||||||
日期 | 开始时间 | 结束时间 | 中断时间 | 净时间 | 活动 | 备注 |
4月1日 | 14:00 | 16:10 | 10 | 120 | 编写编程 | 修改程序 |
4月2日 | 8:20 | 10:40 | 30 | 110 | 编写程序 | 将程序改为Java语言 |
4月3日 | 16:30 | 20:30 | 30 | 210 | 查阅资料 | 查资料和调试 |
4月4日 | 15:00 | 21:40 | 100 | 3000 | 编程 | 修改和调试 |
4月5日 | 10:00 | 17:30 | 90 | 3600 | 调试 | 最终调试 |
4月6日 | 18:00 | 18:30 | 30 | 博客 | 撰写博客 |
缺陷记录日志: | ||||||||||
日期 | 编号 | 引入阶段 | 排除阶段 | 调试过程中遇到的BUG以及解决办法 | ||||||
4月1日 | 1 | 编码 | 编译 | 对C++的四则运算进行了修改,变为Java语言 | ||||||
4月2日 | 2 | 编码 | 编译 | 在安卓里边,每次都在判断下一个结果,修改执行顺序。 | ||||||
4月3日 | 3 | 编码 | 编译 | 判断时,为了不出现循环小数,我们保留两位小数。 | ||||||
4月4日 | 4 | 编码 | 编译 | 问题带“#”输出,让其在计算的时候加“#”,输出时没有。 | ||||||
4月4日 | 5 | 编码 | 编译 | 加入了一个新界面,用来获取用户输入的题目数量和难度。 | ||||||
4月6日 | 6 | 编码 | 编译 | 页面之间传值过不去,仔细看了一下怎样用Intent传参,问题解决。 |
队友:于磊 20133078 http://www.cnblogs.com/cnyulei/