范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

每日一练之模拟计算器逻辑部分

  今天跟着bilibili的教程,参考了网上的一些资料,实现了计算器app的基本逻辑部分,实际上需要细化的还用很多,但只是个练习,就不抠细节部分了,只是熟悉掌握按键互动的一些基本命令。
  package com.example.myapplication_test;  import android.graphics.drawable.Drawable; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView;  import androidx.appcompat.app.AppCompatActivity;  import java.util.LinkedList; import java.util.Stack;  public class CalculatorActivity extends AppCompatActivity {      private Button btn_0;     private Button btn_1;     private Button btn_sqrt;     private Button btn_2;     private Button btn_3;     private Button btn_4;     private Button btn_5;     private Button btn_6;     private Button btn_7;     private Button btn_8;     private Button btn_9;     private Button btn_point;     private Button btn_plus;     private Button btn_minus;     private Button btn_multiply;     private Button btn_pide;     private Button btn_ce;     private Button btn_clear;     private Button btn_del;  // 清除一个数字     private Button btn_equal;     private TextView tv_num_calculate;//算数表达式     private TextView tv_result;//计算结果     private boolean is_new_calculate; //判断是否是新的计算开始     @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_calculator);         //控制button上图标大小         btn_sqrt = findViewById(R.id.sqrt);         Drawable drawable1 = getResources().getDrawable(R.drawable.kaifang);         drawable1.setBounds(20, 20, 100, 100);//第一0是距左边距离,第二0是距上边距离,40分别是长宽         btn_sqrt.setCompoundDrawables(drawable1, null, null, null);//只放左边 //        计算结果         tv_result = findViewById(R.id.result_text);         tv_num_calculate = findViewById(R.id.num_calculate); //        每个按钮注册监听         btn_0 = findViewById(R.id.zero);         btn_1 = findViewById(R.id.one);         btn_2 = findViewById(R.id.two);         btn_3 = findViewById(R.id.three);         btn_4 = findViewById(R.id.four);         btn_5 = findViewById(R.id.five);         btn_6 = findViewById(R.id.six);         btn_7 = findViewById(R.id.seven);         btn_8 = findViewById(R.id.eight);         btn_9 = findViewById(R.id.nine);         btn_point = findViewById(R.id.point);         btn_plus = findViewById(R.id.plus);         btn_minus = findViewById(R.id.minus);         btn_multiply = findViewById(R.id.multiply);         btn_pide = findViewById(R.id.pide);         btn_del = findViewById(R.id.del);  // 倒数         btn_equal = findViewById(R.id.equal);  // 等于         btn_ce = findViewById(R.id.CE_btn);  // 回退         btn_clear = findViewById(R.id.clear);  // 清除          btn_0.setOnClickListener(ClickFn);         btn_1.setOnClickListener(ClickFn);         btn_2.setOnClickListener(ClickFn);         btn_3.setOnClickListener(ClickFn);         btn_4.setOnClickListener(ClickFn);         btn_5.setOnClickListener(ClickFn);         btn_6.setOnClickListener(ClickFn);         btn_7.setOnClickListener(ClickFn);         btn_8.setOnClickListener(ClickFn);         btn_9.setOnClickListener(ClickFn);         btn_point.setOnClickListener(ClickFn);         btn_plus.setOnClickListener(ClickFn);         btn_minus.setOnClickListener(ClickFn);         btn_multiply.setOnClickListener(ClickFn);         btn_pide.setOnClickListener(ClickFn);         btn_sqrt.setOnClickListener(ClickFn);         btn_del.setOnClickListener(ClickFn);         btn_equal.setOnClickListener(ClickFn);         btn_ce.setOnClickListener(ClickFn);         btn_clear.setOnClickListener(ClickFn);      }       private View.OnClickListener ClickFn = new View.OnClickListener() {         private static final String TAG = "CalculatorActivity";          @Override         public void onClick(View view) {             String input_text = tv_num_calculate.getText().toString();             if (is_new_calculate && view.getId()!=R.id.equal) {                 input_text = "";                 is_new_calculate = false;                 tv_result.setText("=0");                 tv_num_calculate.setText(input_text);             }               tv_result.setTextSize(30);             switch (view.getId()) {                 case R.id.zero:                 case R.id.one:                 case R.id.two:                 case R.id.three:                 case R.id.four:                 case R.id.five:                 case R.id.six:                 case R.id.seven:                 case R.id.eight:                 case R.id.nine:                     input_text = input_text + ((Button) view).getText().toString();                     tv_num_calculate.setText(input_text);                     break;                 case R.id.sqrt:                     input_text = input_text + "√";                     ;                 case R.id.point:                 case R.id.plus:                 case R.id.minus:                 case R.id.multiply:                 case R.id.pide: //                   不允许连续输入多个运算符                     if (input_text != null && !input_text.equals("")) { //                        char c = input_text.charAt(input_text.length() - 1); //                        if ((byte)c>41 && (byte)c<48 || c.equals("-")) {                         //acsii的42-47为* + , - . /                         String c = input_text.substring(input_text.length() - 1);                         if (c.equals("+") || c.equals("-") || c.equals("×") || c.equals("÷") || c.equals(".") || c.equals("√")) { //                            判断如果两次按的都是运算符,取最后一个运算符                             tv_num_calculate.setText(input_text.substring(0, input_text.length() - 1) + ((Button) view).getText());                         } else {                             //判断如果第两次按不是运算符,直接按字符串累加                             tv_num_calculate.setText(input_text + ((Button) view).getText());                         }                     }                     break;                 case R.id.del:                     if (input_text != null && !input_text.equals("")) {                         input_text = input_text.substring(0, input_text.length() - 1);                         tv_num_calculate.setText(input_text);                     }                     break;                 case R.id.CE_btn:                     //第一次ac清空calculate,第二次清空result                     if(input_text.equals("")){                         //calculate为空则清空计算结果                         tv_result.setText("0");                     }                     input_text = "";                     tv_num_calculate.setText(input_text);                     break;                 case R.id.clear:                     input_text = "";                     tv_result.setText("0");                     tv_num_calculate.setText(input_text);                 case R.id.equal: //                   按 = 时进行,tv_num_calculate为结果值                     tv_result.setTextSize(40);                      if (input_text == null || input_text.equals("")) {                         tv_result.setText("0");                     } else {                         tv_result.setText("=" + input_text);                         // 每输入一次数字后就进行计算                         tv_result.setText("=" + getResult(input_text));                         is_new_calculate = true;                     }                      break;                 default:                     break;             }              Log.d(TAG, "onClick: " + input_text);         }          private String getResult(String input_text) {              if (input_text == null || input_text.equals("")) {                 return "";             }             // 如果不为空,先判断末尾是否是符号,如果是符号,就去掉             String c = input_text.substring(input_text.length() - 1);             if (c.equals("+") || c.equals("-") || c.equals("×") || c.equals("÷") || c.equals(".") || c.equals("√")) {                 input_text = input_text.substring(0, input_text.length() - 1);             }             double return_num = 0;             return_num = calculator(input_text);             //    如果小数位为0输出整形int             String return_string;             if (return_num % 1 == 0) {                 return_string = String.valueOf((int) return_num);             } else {                 return_string = String.valueOf(return_num);             }             return return_string;         }          //        运算,将数字类型改为double并在其中加入小数的运算         private double calculator(String input_text) { //            一、 把表达式分解成运算符和数字             Stack stkEles = new Stack();             LinkedList tempBackcal = new LinkedList();             for (int i = 0; i < input_text.length(); i++) {                 // 1.遇到了数字                 if (Character.isDigit(input_text.charAt(i))) {                     // 注意多位数的获取                     int k = i + 1;                     //小数点也加入数字中                     for (; k < input_text.length() && (Character.isDigit(input_text.charAt(k)) || input_text.charAt(k) == "."); k++) {                      }                     tempBackcal.add(input_text.substring(i, k));                     i = k - 1;// 更新 i                     continue;                 }                 // 2.遇到了乘除运算符 //                if (input_text.charAt(i) == "/" || input_text.charAt(i) == "*") {                 if (input_text.charAt(i) == "÷" || input_text.charAt(i) == "×") {                      while (!stkEles.isEmpty() && (stkEles.lastElement().equals("÷") || stkEles.lastElement().equals("×"))) {                         tempBackcal.add(stkEles.pop()); // 弹出优先级相同或以上的栈内运算符                     }                     stkEles.add(String.valueOf(input_text.charAt(i))); // 运算符入栈                     continue;                 }                 // 3.遇到了加减运算符                 if (input_text.charAt(i) == "+" || input_text.charAt(i) == "-") {                     while (!stkEles.isEmpty() && !isNumeric(stkEles.lastElement())) {                         tempBackcal.add(stkEles.pop()); // 弹出优先级相同或以上的栈内运算符                     }                     stkEles.add(String.valueOf(input_text.charAt(i))); // 运算符入栈                     continue;                 }             }             // 4.最后弹出栈内所有元素到表达式             while (stkEles.size() > 0) {                 tempBackcal.add(stkEles.pop());             }             // 二、 把分解的运算符和数字进行计算             Stack calStk = new Stack();             for (String c : tempBackcal) {                 // 1.数字,入栈                 if (isNumeric(c)) {                     calStk.push(Double.valueOf(c)); // string to int                     continue;                 }                 // 2.非数字,则为符号,出栈两个元素计算出结果然后再入栈该计算值                 else {                     Double a = calStk.pop();                     Double b = calStk.pop();                     switch (c.toCharArray()[0]) {                         // 注意减法和除法时,注意出栈的顺序与原表达式是相反的                         case "+":                             calStk.push(b + a);                             continue;                         case "-":                             calStk.push(b - a);                             continue;                         case "×":                             calStk.push(b * a);                             continue;                         case "÷":                             calStk.push(b / a);                             continue;                     }                 }             }             return calStk.pop();         }          private boolean isNumeric(String str) {             for (int i = 0; i < str.length(); i++) {                 //是否为数字或者小数点                 if (!Character.isDigit(str.charAt(i)) && str.charAt(i) != ".") {                     return false;                 }             }             return true;         }          ;     }; }

农村酒席用酒,越来越讲究,尤其是这3种酒受欢迎,你喝全了吗?随着疫情的逐渐放开,经济也得到了回暖,不管是城市还是农村,消费水平都有所提升,尤其是在如今的农村,生活条件跟城市不相上下,大部分的农村人将房子修整的非常豪华,而且生活水平也是非常好宝鸡市的区划变动,陕西省的重要城市,12个区县是怎么来的?在之前的文章中给大家说了相当多城市的区划变迁,每个城市的变迁严格都是独一无二的,因为我国的历史非常悠久。5000年的历史文化传承,让我国56个民族紧紧的融合在一起,形成了现如今民族巴黎梦中婚礼的地方巴黎,浪漫之都,一座充满浪漫气息的城市。无数人,到这里来,又从这里离去。每个人,身上都藏着一朵玫瑰花。三月,刚刚过去几周。空气中飘舞的淡淡花香,似乎在回味着,刚刚的故事。光滑的石板麦田里无助的身影头条创作挑战赛五月的风吹熟了蓝天下的麦子,白色的云从麦田上空飘过,,依稀记得当时还在上初中,由于父亲在外务工没回来,家里只剩我和母亲。金色的麦穗在太阳的灼晒下,深深的低下了头,麦粒你救火的身影真帅!郓城见义勇为模范王增涛入选山东好人大众网海报新闻记者李效谨郓城报道王增涛,男,1974年生,山东省菏泽市郓城县唐庙镇邓垓小学校长。2022年4月22日,王增涛发现一居民楼失火,不顾个人安危,第一时间冲上去帮助灭火,王晶我拍过的女人,都是你的梦中情人!有人说最能代表香港电影的不是香港美人,而是香港导演。除了周星驰的黑色幽默喜剧,这两位导演算的上是其中的佼佼者。一是专攻文艺电影的王家卫,二则是主战商业片的王晶。但是,王晶的口碑却呈英超官方曼城数年内多次违反财务规则北京时间2月6日晚,英超联赛官方宣布,经过长达四年的调查,确认曼城俱乐部在多年来数次违反财务公平规则,时间从2009年到2023年。据英国媒体报道,如果曼城违规得到确认,那么他们有最后亮相巡游方阵中山慈善万人行中的青年身影作为大学生,能有机会在慈善万人行上向全市人民亮相,我觉得是一件非常荣幸的事。今年在电子科技大学中山学院就读的大四学生林彦燊,在毕业前也在中山的慈善万人行巡游中体验了一次走方阵201走荡口古镇,发现曾经的富庶和文涵曾经,无锡流传着小苏州,金甘露,银荡口的说法来形容这里的富庶。如今去荡口游玩的人,都会走进那和所有同质化打造古镇的景区去看那里的小桥流水和灯红酒绿。而荡口曾经的样子,也绝对不是今天人气古镇召稼楼景区为何关闭?原因在这里近日,位于闵行区浦江镇的召稼楼古镇宣布停止景区旅游服务功能,并将于近日逐步取消其余配套服务功能。这座有800多年历史的古镇,在2010年世博会召开之际完成了首次修复改造,一跃成为国1。5亿!官渡古镇4A景区基础设施将提升改造近期,昆明市官渡区国有资产投资经营有限公司发布官渡古镇4A景区基础设施提升改造工程项目拟招标计划表,官渡区计划投资为15746。21万元,对景区进行提升改造。预计招标公告发布时间为
第二春!44岁德罗巴携白人超模亮相金球,为她踹掉相伴20年黑人妻子10月19日消息,当地时间17日举行的金球奖颁奖典礼上,切尔西名宿德罗巴担任了颁奖主持人,44岁的德罗巴也带着年轻漂亮的白人新女友正式亮相,为了她魔兽一脚踹掉了相伴20年的黑人妻子CBA最新消息!姚全曝光禁赛真相,刘雁宇伤情出炉,杨鸣老叔寒暄第一,姚全曝出艾伦禁赛真相,CBA的一张官方处罚单,让辽宁男篮遭遇严重打击,其主人公郭艾伦被禁赛六场罚款10万,与此同时助理教练主教练球队队长总经理也难逃一劫,又被追加一万的处罚。轰164完爆费城火箭帮!8500万先生真香,名记冲最佳第六人北京时间10月19日,凯尔特人在揭幕战126比117击败76人,绿军双探花塔图姆和杰伦布朗都砍下35分。替补席上新援布罗格登打出了高效表现,出战24分钟得到16分2篮板4助攻2抢断上市深企三季度业绩抢先看近9成报喜,同比涨幅最高6倍作为实体经济的基本盘,上市公司的业绩表现总是牵动着市场的神经。Wind数据显示,截至10月19日,近400家上市深企中已有6家率先披露了三季报,另有30家发布了三季度业绩预告。其中盐选神回复为什么没有奥特曼在下雨天的时候打怪兽?1。卖家到现在都不明白为什么蓝牙耳机会因为信号太强被退货。2。可能她孙子在童界是最帅的那只3。兄弟们,为什么没有,奥特曼,在下雨天的时候打怪兽?4。结婚了,大家觉得我们两个怎么样,72岁被吹逆天童颜脸的王薇薇,原来全是假的?时尚设计师里的不老神话VeraWang王薇薇,最近又被拍到带着小男友在曼哈顿购物。73岁的年纪,这身板和头发身边有鲜肉男友陪伴奢侈品店提前清场接待,外形爱情经济实力一网打尽,很难不10。19周三兴隆足球赛事分析周三001瑞超AIK索尔纳VS赫根首推让胜周三002英超利物浦VS西汉姆联首推胜周三003英超纽卡斯尔联VS埃弗顿首推胜周三004英超布伦特福德VS切尔西首推负周三005曼彻斯特联英超布伦特福德VS切尔西波特还在蜜月期,拿到图赫尔剧本?布伦特福德赛季至今布伦特福德跌跌撞撞处在积分榜第九位,符合球队的定位,甚至有些超出预期了,第二轮40击败曼联就属于意外收获。但小蜜蜂赛季至今的亮眼发挥,也就是战胜曼联和利兹联这两场怒气未消!克莱怒喷ESPN采访2K主管你们采访这个小丑?根据之前报道,克莱汤普森对自己今年在2K能力值极度不满,于是发表社交媒体怒喷2K,并且在自己的三分能力值88上加了呕吐的表情。在这件事情过去一个多月后,克莱似乎怒气未消,稍早前NB在篮网场均6。4分的格里芬,在凯尔特人首秀,他交出这种答卷今天NBA新赛季正式打响,开局NBA就安排上了强强对决的重头戏,76人VS凯尔特人。休赛期这两队都进行了针对性补强,76人将一众火箭旧将收入麾下,自此有了休斯顿分舵的别称凯尔特人也写给最爱的人愿你快乐,愿你幸福,愿你平安,愿你健康头号解忧馆愿有岁月可回首,且以深情共白首,美好的愿望,成了一生的期盼,多希望未来的日子里,我们还能深情相拥,没有你的日子里,每时每刻都在想念你。不能在你身边陪伴,祝福却从来不会间断