1、实现功能:输入想要计算的表达式  例如3+2*2-9/3*2,计算器不会输入一点就算一点,而是在你输入=号的时候,根据运算符的优先级进行运算

 

2、思路:a、首先由于Lable上显示的都是字符串,那么我们输入的这一串表达式也最好以字符串的形式保存起来

      b、所以我们可以定义两个数组numMutableArray和operationMutableArray,一个用来存放数字,一个用来存放运算符。例如上面那个表达式,numMutableArray里面就存放[3,2,2,9,3,2],operationMutableArray里面就存放[+,*,-,/,*],而且它们的索引值是对应的

      c、接下来我们就可以遍历operationMutableArray这个数组,当出现* 或者/运算符的时候就把索引值i和i+1在numMutableArray里面对应值做相应的就算,这样第一遍便利结束,我们就可以把乘除运算完了,第二遍就来解决加法和减法

      d、接下来就是注意一些小细节,比如两个数运算完之后,我们需要将得到的这个数放在原来索引值为i的位置上,所以需要替换,那i+1位置上的数我们就需要删除,包括i对应的那个运算符也要删除

 

3、开始实现

a、首先打开Xcode,创建一个SingleViewApplication工程

得到如图的界面

iOS 科学计算器 开发 ios科学计算器app哪个好_数组

 

b、在左侧的storyboard里面我们可以看到一个iphone的模拟样式,点击模拟样式的最上边,然后在最右侧的选项里去掉这两个选项

iOS 科学计算器 开发 ios科学计算器app哪个好_字符串_02

 

c、我们可以使用最右侧下方的工具栏里的label和button工具为计算器添加框架,如图

iOS 科学计算器 开发 ios科学计算器app哪个好_iOS 科学计算器 开发_03

添加显示文字的UILabel

.可以自由拖动,调整视图在界面上的大小

    .改变alignment属性 设置居右对齐

    .设置font属性 改变文字的显示大小

    .background 设置背景颜色

    .text 设置显示的文字

  button一样的设置

d、接下来点击Xcode右上方的按键

iOS 科学计算器 开发 ios科学计算器app哪个好_xcode_04

得到与这个storyboard相对应的ViewController.m,在模拟样式里将鼠标放在按键上,按住ctrl键拖动,可以得到点击这个按钮的方法如图

iOS 科学计算器 开发 ios科学计算器app哪个好_字符串_05

然后将功能相同的数字键全部添加到这个方法上,你可以看到方法左侧有一个小加号,拖动加号到数字键上,就可以完成连接了,用相同的方法将操作键 + - * /完成,还有一个=号和清零键,对了还要把上方的label拖到代码里,定义一个属性变量,如图

iOS 科学计算器 开发 ios科学计算器app哪个好_字符串_06

 

e、拖拽工作全部完成后,我们开始进入代码阶段,具体实现的代码如下:

#import "ViewController.h"
 
//定义一个记录当前是输入数字还是操作键的枚举
typedefenum{
    kStatusNum,
    kStatusOperation,
    kStatusDone
}kStatus;
 
//定义一个判断当前操作是加减操作还是乘除操作的枚举
typedefenum {
    kComputetypePrimary,
    kComputetypeSenior
}kComputetype;
 
//定义一个当前操作是什么的枚举
typedefenum{
1,
    kOperationTypeMinus,
    kOperationTypeMultiple,
    kOperationTypeDevide
}kOperationType;
 
@interfaceViewController ()
@propertyweak, nonatomic) IBOutletUILabel *resultLable;
@propertynonatomic, assign) kStatus status;
@propertynonatomic, strong) NSMutableArray//存放输入的每个数字
@propertynonatomic, strong) NSMutableArray//存放输入的每个运算符
@propertynonatomic, strong) NSDictionary//定义个字典
@end
 
@implementation ViewController
 
- (void)viewDidLoad {
superviewDidLoad];
self.statuskStatusNum;
//初始化数组
self.numMutableArrayNSMutableArrayarray];
self.operationMutableArrayNSMutableArrayarray];
//初始化字典
self.operationDic@{@"+":@1, @"-":@2, @"*":@3, @"/":@4};
}
 
//按下数字键
- (IBAction)numButtonDidClicked:(UIButton *)sender {
//获取按钮上面的数字
inttitleLabel.textintValue];
longlong showNum;
    
//判断是否是一个新的数字的开始
ifself.statuskStatusNum) {
//不是一个新的数字的开始
//计算(拼接)输入的数字
self.resultLable.textlongLongValue] * 10 + num;
else{
//判断之前是否有结果如果有结果我们将丢弃这个结果
ifself.statuskStatusDone) {
self.numMutableArrayremoveAllObjects];
        }
//这是一个新的数字的开始
        showNum = num;
        
self.statuskStatusNum;
    }
//显示在label上
self.resultLable.textNSStringstringWithFormat:@"%lld",showNum];
    
}
 
- (IBAction)operationButtonDidClicked:(UIButton *)sender {
//判断是不是重复按下操作键了
ifself.statuskStatusOperation) {
//1.上一个不是按下操作键
//改变当前的状态通知上面的方法开始输入新的数字了
self.statuskStatusOperation;
        
//这个数字结束了将这个数字保存到数组里面
self.numMutableArrayaddObject:self.resultLable.text];
        
//保存当前点击按钮上的title
self.operationMutableArrayaddObject:sender.titleLabel.text];
else{
//2.重复按下操作键
//用新的操作键代替原来那个
//获取数组的最后一个索引值
NSIntegerself.operationMutableArray.count1;
        
//替换
self.operationMutableArrayreplaceObjectAtIndex:lastIndex withObject:sender.titleLabel.text];
    }
}
 
//等号被按下
- (IBAction)calculate:(UIButton *)sender {
//添加当前最后一个数字
self.numMutableArrayaddObject:self.resultLable.text];
//开始计算
selfcomputeWithtype:kComputetypeSenior];
selfcomputeWithtype:kComputetypePrimary];
    
//将结果显示到界面上
self.resultLable.textself.numMutableArrayfirstObject];
    
self.statuskStatusDone;
    
self.numMutableArrayremoveAllObjects];
    
}
 
- (void)computeWithtype:(kComputetype)type{
NSString *firstOperation;
NSString *secondOperation;
ifkComputetypePrimary) {
@"+";
@"-";
else{
@"*";
@"/";
    }
//开始计算
forint0; i< self.operationMutableArray.count; i++) {
//获取i对应的运算符
NSStringself.operationMutableArrayobjectAtIndex:i];
        
//判断是什么运算符
ifisEqualToString:firstOperation]||[opr isEqualToString:secondOperation]) {
//获取即将进行运算的两个数
longlongself.numMutableArrayobjectAtIndex:i] longLongValue];
longlongself.numMutableArrayobjectAtIndex:i+ 1longLongValue];
longlongselfcompute:firstNum second:secondNum operation:opr];
            
//覆盖i对应的值
self.numMutableArrayreplaceObjectAtIndex:i withObject:[NSStringstringWithFormat:@"%lld",result]];
            
//删除后面的一个数
self.numMutableArrayremoveObjectAtIndex:i+1];
            
//删除i对应的那个运算符
self.operationMutableArrayremoveObjectAtIndex:i];
            
//将i减1  因为删除了后面的一个数
            i--;
        }
        
    }
}
 
//计算结果
- (longlong)compute:(longlong)firstNum second:(longlong)secondNum operation:(NSString *)operation{
//从字典里面获取这个字符串的运算符对应的枚举值
kOperationTypekOperationType)[[self.operationDicobjectForKey:operation] longLongValue];
    
longlong result;
switch (type) {
casekOperationTypeAdd:
            result = firstNum + secondNum;
break;
casekOperationTypeMinus:
            result = firstNum - secondNum;
break;
casekOperationTypeMultiple:
            result = firstNum * secondNum;
break;
casekOperationTypeDevide:
            result = firstNum / secondNum;
break;
default:
break;
    }
return result;
}
 
//清空
- (IBAction)clearButtonDidClicked:(UIButton *)sender {
self.resultLable.text@"0";
self.numMutableArrayremoveAllObjects];
self.operationMutableArrayremoveAllObjects];
self.statuskStatusNum;
}
- (IBAction)isPlusButtonDidClicked:(UIButton *)sender {
longlongself.resultLable.textlongLongValue];
longlong num2 = -(num);
self.resultLable.textNSStringstringWithFormat:@"%lld",num2];
}
 
@end

 

最后,这个计算器还不是太好,小数点的功能还没有实现,也就是说无法完成某些除法,小数的运算,本人也是新手,欢迎讨论,不喜勿喷!