您的位置:首页 > 其它

计算器

2015-11-13 18:18 183 查看
生活中,各种设备上都有计算器,手机上,电脑上,电子称上,处处可见,一说到计算器,可能我们每个人都觉得这是一个简单的工程,因为我们身边有,而且还经常使用,但去实现一个计算器对于我们新手来说并没有想象中的那么简单,它需要你有很强的逻辑思维,方方面面都要考虑的。经过两天的努力一个计算器的基本功能也算是完成,下面我就说说我个人的思路,如果有更好的方法希望大神不吝赐教

,对于一个新手真的需要大神来引导。

想到计算器首先我们都知道我们需要它能完成加减乘除正弦,余弦,正切等计算,并且考虑他们的优先级,涉及到优先级我们就需要在结构上多下功夫,一个好的结构会使整个工程实现起来比较简单。下面我就直接说说我的具体做法吧:

第一步:定义变量。在事件处理中设置好三个字符串变量,一个非静态字符串变量newData用来接收新的数据(实时更新);一个静态字符串变量disData用来记录所有的点击事件(将第一个非静态字符串变量拼接在本字符串上),用来送至lable中进行显示,可跟据具体要求使用拼接剪切换行等方法,实现不同的显示风格;最后一个静态字符串变量proData也是用来记录所有的点击事件,和上一个静态字符串变量不同的是本字符串变量是用来进行加减乘除运算的(字符串怎么实现加减乘除运算呢?我们需要对字符串中的各个数据进行处理再进行运算),还有一些中间变量,标志位在需要时,我们再适时添加。

第二步:设定输入规则。什么可以输入,什么情况下可以输入什么,这些是我们在写程序之前应该理清楚的,比如:我们向计算器进行第一次输入时,常规来说我们是不能输入运算符的,所以第一次输入我们只允许它输入0~9个数字,当有数字后我们才允许输入其他运算符但不阻止数字的再次输入,这种规则的设定就需要我们使用标志位(全局或局部)结合字符串中记录的数据来完成。数据处理是建立在规则的基础上的,规则的设定是为了更好的处理数据,规则上有漏洞会导致数据处理紊乱,结果出错,所以设定规则很重要。

第三步:数据处理(对proData字符串进行处理)。我设计的计算器是当有等号后才进行运算的,通过小小的改动还可以实现实时运算(当有运算符输入就开始对运算符以前的数据进行加减乘除的计算),为了思路清晰,当有等号过来时,我对字符串proData中的所有数据进行切分,把数字和运算符依次放入临时数组中,在根据优先顺序对数组遍历,先遍优先级高的像括号,乘除等,再遍历加减,每次遍历到运算符就进行运算,注意运算后的结果我们要处理好,比如我们有一个式子23+2*3+7=,转化成数组后则为@[@"23",@"+",@"2",@"*",@"3",@"+",@"7"],我们先遍历乘除(高优先级)一旦找到乘号就进行计算(乘号前后两个元素进行类型转换后作乘法运算)(注意)将结果放在乘号后一个元素所在的位置(覆盖),因为,如果有连乘计算,通过下一次循环便可以计算到,将乘号前边的元素及乘号用乘号前边的前边的运算符+号进行替换,替换后得到新的数组@[@"23",@"+",@"+",@"+",@"6",@"+",@"7"],这时候我们只需要对处理过的数组进行顺序计算便可以轻松的得到结果(+做类型转换后的结果为0)。我再通过几个数组来展示我的算法:

2+2*3*6+7= 处理后 @[@"2",@"+",@"2",@"*",@"3",@"*",@"6",@"+",@"7"]遍历到第一个乘号后进行第一次乘法运算根据上面所说的方法将数组处理成@[@"2",@"+",@"+",@"+",@"6",@"*",@"6",@"+",@"7"]下次遍历到乘号时做和上面相同的操作得到
@[@"2",@"+",@"+",@"+",@"+",@"+",@"36",@"+",@"7"]已没有乘号,遍历完毕,接下来进行+、-符号遍历,设置一个变量sum(初值为第一个数字sum=2)用来接收结果,遇到加号则sum与加号后面的数字做和运算(sum+=6),遇到减号便做差运算(sum-=2),遍历完后运算结果就存在sum中,这时候将sum送到lable中显示一个计算到此也就设计完毕了。

大致的一个思路就是这样,如果有不对的,不合理的请大神给指出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: