iOS计算器的搭建-数据结构部分

本周学习任务是编写iOS下自带的计算器app,本篇博客主要用于讲解遇到的数据结构问题
首先计算器app的搭建是基于objective -c语言,(oc),oc语言的特性是基于c语言,但是计算器这个数据结构要用到表达式求值,也就是栈的特性,但是oc中没有 stack 文件,所以需要自己搭建栈在这里插入图片描述
由于这个计算器就加减乘除,所以在这里我就运用了结构体,以达到存储的效果。
首先存储表达式需要两个栈一个是存储字符,另一个是存储运算结果,所以在这里model.h文件里声明了两个类型的结构体在这里插入图片描述
然后就需要写栈的一些基本方法

入栈在这里插入图片描述

出栈

在这里插入图片描述

判定是否为空

在这里插入图片描述

用于比较远算符号的优先级在这里插入图片描述

这样就基本上解决了oc中栈的问题
剩下的就按照之前c语言实现的就可以基本实现了。详情可以看之前写的博客 栈的应用(表达式求值)
不过基本实现还具有一些问题就是数字输出的问题
之前输出是这样在这里插入图片描述
但是显然这样是不符合需求的,我们的需求是需要小数有小数需要整数就是整数所以这里就用到了NSNumber
这样就可以解决输出的一部分问题
在这里插入图片描述
输出如下在这里插入图片描述
在这里插入图片描述
粗粗一看好像没有太大的问题,但是仔细一看还存在精度转换的问题
如下
在这里插入图片描述
在这里插入图片描述
这不是搞我吗?
其实出现这样如果你是细心的人会发现上面定义的结构题有问题
在这里插入图片描述
原因是因为
@”0.01” 转换成float时, 经常会变成 0.009999799 这种形式, 因为float类型无法精准保存, 系统会选一个接近的值来代替.

而double类型则可以有更好的精度.
所以改为double便迎刃而解
如下
在这里插入图片描述
写到这里有点感叹必须要严谨,一个类型一点点的差距就会有不一样的结果
但发现好像有一些问题就是连续一些小数的加减还会出现一些问题
不过在大数据大佬的提示下
发现转换的方法改为 NSNumber * c = [NSNumber numberWithFloat:b];
就没有问题了
** 不过为什么是这个** 其实我也有点不太清楚目前
不过后来我把double的结构体改为float还是可以的
百度了一下没有很明确的解释
就感觉应该是方法的问题
感觉这个方法应该自带转换精度的问题,

最后为了给这个app增加一些方法,比如增加一个括号匹配如果不匹配则直接报错
因为这个计算器比较简单只有小括号,就可以直接运用一个数出现左括号就++,出现有括号–,如果出现右括号此时值是初始值则报错,或者如果等到判断完毕不为初始值则报错
代码实现
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

发布了34 篇原创文章 · 获赞 4 · 访问量 736

猜你喜欢

转载自blog.csdn.net/weixin_44824650/article/details/102258471