zoukankan      html  css  js  c++  java
  • 【留念贴】Android开发——计算器

    【过程】

    在电商学霸&&代码女神XuFei的影响下,接触到了关于Android客户端的一些开发,第一次在Android平台搞出了一个App,真的是激动不已,所以必须开个留念贴记录一下。

    本来准备一晚上搞定计算器的,但是当我看到那些天花乱坠的语法,简直蛋碎!最终吃起了烧烤。。。。下起了飞行棋。。。。五子棋。。。。还被虐!!。。。。T T

    第二天又看了一下ChenYong的代码,感觉可以写了,理论上能做出来,但是没有装编译器.....因此花一晚上的时间去装.....终于跑起来了....但是不知道怎么导入工程.....因此只打开了一个能写代码的文件在那写.....连语法报错都没有,更别说能跑起来了.....最终失败了.....

    第三天,在室友ZhangYiZhong的电脑上搞,他写语法,我写算法。终于一个半成品(还有不少的BUG)在我眼前诞生,说实话还是很激动的,我写的东西居然能够在手机上跑起来!!!多么不可思议的一回事!!!

    从电脑控制台黑框到手机App的界面。一个历史性的转变.....

    【技术】

    关于这个计算器的一些技术,其核心是把中缀表达式转化为后缀表达式,这个时候需要使用一个最基础的数据结构——栈。

    具体的操作原理可以参考这个博客 http://www.nowamagic.net/librarys/veda/detail/2307

    然而,对于这个问题,早在上学期就已经解决了,但是那时候纯粹是为了Accepted HDU 1237 http://acm.hdu.edu.cn/showproblem.php?pid=1237 并没有为了要做出一个真正意义上能用的计算器App。这次开发的时候,直接把当年写的很挫的代码拉了下来用。

    Android开发似乎用的都是Java,不得不说这是一种很好的语言,集成了很多很多有用的功能,需要的时候只需调用一下就行,不像C/C++那样,都要自己纯手打。

    计算器核心代码如下:(当时连栈都是手动模拟的,加减乘除还是用的数字表示,代码好丑。。)

    #include<stdio.h>
    #include<string.h>
    // + 999991
    // - 999992
    // * 999993
    // / 999994
    int stack1[1000];
    double stack2[1000];
    int a[1000], b[1000];
    int main()
    {
        int i;
        char s[1000];
        while (gets(s))
        {
            if (strlen(s) == 1 && s[0] == '0')break;
            int y = strlen(s);
            s[y] = ' '; s[y + 1] = '';
            int top1 = -1, top2 = -1, q = 1, sum = 0;
            for (i = 0; i<strlen(s); i++)
            {
                if (s[i] == ' ' && (s[i - 1]<'0' || s[i - 1]>'9')) continue;
                else if (s[i] == ' ')a[q] = sum, sum = 0, q++;
                else if (s[i] == '+')a[q] = 999991, q++;
                else if (s[i] == '-')a[q] = 999992, q++;
                else if (s[i] == '*')a[q] = 999993, q++;
                else if (s[i] == '/')a[q] = 999994, q++;
                else if (s[i] >= '0'&&s[i] <= '9') sum = 10 * sum + (s[i] - '0');
            }
            //1到q-1;
            //    for(i=1;i<q;i++) printf("%d
    ",a[i]);
    
            int qq = -1;
            for (i = 1; i<q; i++)
            {
                if (a[i]<999991) qq++, b[qq] = a[i];
                else if (a[i] >= 999991)
                {
                    if (top1 == -1)//栈为空
                    {
                        top1++;
                        stack1[top1] = a[i];
                    }
                    else
                    {
                        if (a[i] == 999991 || a[i] == 999992)
                        {
                            while (1)
                            {
                                qq++;
                                b[qq] = stack1[top1];
                                top1--;
                                if (top1 == -1) break;
                            }
                            top1++;
                            stack1[top1] = a[i];
                        }
                        else if (a[i] == 999993 || a[i] == 999994)
                        {
                            while (1)
                            {
                                if (stack1[top1] == 999991 || stack1[top1] == 999992 || top1 == -1) break;
                                qq++;
                                b[qq] = stack1[top1];
                                top1--;
                            }
                            top1++;
                            stack1[top1] = a[i];
                        }
                    }
                }
            }
            for (i = top1; i >= 0; i--) qq++, b[qq] = stack1[i];
            for (i = 0; i <= qq; i++)
            {
                if (top2 == -1)
                {
                    top2++;
                    stack2[top2] = b[i];
                }
                else if (b[i]<999991) top2++, stack2[top2] = b[i];
                else if (b[i] == 999991)top2--, stack2[top2] = stack2[top2] + stack2[top2 + 1];
                else if (b[i] == 999992)top2--, stack2[top2] = stack2[top2] - stack2[top2 + 1];
                else if (b[i] == 999993)top2--, stack2[top2] = stack2[top2] * stack2[top2 + 1];
                else if (b[i] == 999994)top2--, stack2[top2] = 1.0*stack2[top2] / stack2[top2 + 1];
            }
            printf("%.2lf
    ", stack2[0]);
        }
        return 0;
    }

    【感慨】

    大学一年以来,在很多书上都看到了这句话:程序=算法+数据结构。那让我扩充一下吧,软件=程序+开发工具,即 软件=算法+数据结构+开发工具。正如这个计算器,从控制台的黑框界面通过开发工具,变成了能让人们使用的软件,算是一个重要的转折吧。程序设计竞赛竞赛考察的内容100%来源于算法+数据结构,对开发工具的考察等于零!而对于软件外包、服务外包那些竞赛,也许更着重于开发工具吧,因为要做出美丽的外观才能获得很好的奖励。我已经选择了软件工程专业,日后有很大的可能去搞项目开发(但似乎对算法研究与创新更加有兴趣),所以在竞赛之余还是要稍微接触一下开发方面的东西的。正如LvHao学长所言,他们需要T字型人才,如果大学期间单纯的只参加竞赛,那一竖确实很长很长,但缺少了那一横,并不是他们所需要的。

    大一就这样结束了,参加了几场比赛,跟随God Wang大神与WuTianQi学长参加了省赛,拿到了Au,但我的水平远远不及他们,从蓝桥杯国赛他们两个是全国一等,我是二等就能看出差距。还记得去年开学的时候都不知道什么是C语言,跟着ChenYanHong导师和God Wang大神的步伐,一点一点的从0积累到了现在,下学期要学的数据结构,我和XiangRunYe似乎都基本啃完,图论的书啃到了网络流,最近还接触了一些动态规划和数论的东西,要学的知识还有很多很多。有一些比我们水平弱的小伙伴们,经常会膜拜为什么能解决一些他们解决不了的问题,正如我仰慕我校的God Wang、ZSTU的WuYiQi、SHU的KuangBin他们那样。如今,我觉得那只是时间的问题,因为我几乎把所有的时间都投入到了竞赛当中,编码能力与程序设计能力自然比别人稍微高了一点,时间久了,熟能生巧,当然这都要建立在善于思考、努力学习的基础上。而我们接触这些东西的时间也远远不及那些大神们,所以难以超越他们。

    必须非常努力,才能看起来毫不费力。

  • 相关阅读:
    关于面向对象和面象过程的一些感想
    面向对象之旅软件生命周期
    函数参数栈传递
    看完后停下来想想我们究竟在追求什么???
    面向对象之旅设计与设计原则
    [译]多重继承和虚继承的内存布局
    61条面向对象设计的经验原则
    数据库设计14个技巧(转)
    js的tween
    三、windows8 store
  • 原文地址:https://www.cnblogs.com/zufezzt/p/4668377.html
Copyright © 2011-2022 走看看