IOS学习笔记---多目运算计算器

需求:

(1)完成一个计算器,可以进行多目运算,而且可以判断优先级.


设计思路:

(1)先画UI,设置好位置

(2)处理限制输入:

1.处理不能同时输入多个符号,不能重复输入符号

2.开头不能为* 和 ÷

3.÷后面的数字不能为0

4.处理小数点

5.处理=

6.处理以符号结尾的公式,自动删除

(3)设计一个数组进行历史记载

(4)设计退出键


代码如下:

//
//  ViewController.h
//  Calculator
//  作者:DRAGON-Yeah
//  Created by 5016 on 13-12-20.
//  Copyright (c) 2013年 dradon. All rights reserved.
//

#import 

@interface ViewController : UIViewController
{
    UITextField *textField;//输入与结果显示
    UIButton *button;//按键
    NSMutableString * str;//公式字符串
    NSMutableArray *HistoryArr;//历史数组
}
@end

//
//  ViewController.m
//  Calculator
//  作者:DRAGON-Yeah
//  Created by 5016 on 13-12-20.
//  Copyright (c) 2013年 dradon. All rights reserved.
//

#import "ViewController.h"
#import "MessageHandle.h"
#import "ViewInit.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.view setBackgroundColor:[UIColor colorWithRed:238/255.0 green:236/255.0 blue:238/255.0 alpha:1.0]];
	//画UI
    [self initControl];
    
    str = [[NSMutableString alloc] init];
    [str setString:@""];
    HistoryArr = [[NSMutableArray alloc]init];
}

/*
 *初始化控件
 */
-(void)initControl
{
    [self initUItextField];
    [self initUIbutton];
}

/*
 *按键
 */
-(void)initUIbutton
{
    //初始化 button
    ViewInit *viewinit = [[ViewInit alloc]init];
    for (int i = 0; i<20; i++) {
        button = [viewinit btnInit:i];
        //绑定事件
        [button addTarget:self action:@selector(onclick:) forControlEvents:UIControlEventTouchDown];
        
        //4.添加到视图控制器
        [self.view addSubview:button];
        [button release];
    }
    [viewinit release];
}

//按键响应事件
-(void)onclick:(UIButton*)btn
{
    //按键处理
    MessageHandle *msgHandle = [[MessageHandle alloc] init];
    [str setString:[msgHandle onClick:btn.tag andStr:str andHistroy:HistoryArr]];
    
    //显示处理
    [self display];
}

/*
 *显示处理
 */
-(void)display
{
    if ([str length]>10) {
        NSMutableString *tempStr = [[NSMutableString alloc]init];
        [tempStr setString:str];
        [tempStr setString:[str substringWithRange:NSMakeRange([str length]-10, 10)]];
        [textField setText:tempStr];
        [tempStr release];
    }else{
        [textField setText:str];
    }
}

/*
 *输入与结果
 */
-(void)initUItextField
{
    //初始化 textField
    ViewInit *viewinit = [[ViewInit alloc]init];
    textField = [viewinit textFildInit];
    [viewinit release];
    
    //设置代理
    textField.delegate = self;
    [self.view addSubview:textField];
    [textField release];
}

-(BOOL)textFieldShouldReturn:(UITextField *)_textField
{
    [_textField resignFirstResponder];
    return YES;
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

//
//  ViewInit.h
//  Calculator
//  作者:DRAGON-Yeah
//  Created by 5016 on 13-12-21.
//  Copyright (c) 2013年 dradon. All rights reserved.
//

#import 
#import 

@interface ViewInit : NSObject
//初始化控件
-(UITextField *)textFildInit;
-(UIButton *)btnInit:(int)i;

@end

//
//  ViewInit.m
//  Calculator
//  作者:DRAGON-Yeah
//  Created by 5016 on 13-12-21.
//  Copyright (c) 2013年 dradon. All rights reserved.
//

#import "ViewInit.h"

@implementation ViewInit

/*
 *方法:textFildInit
 *功能:textField初始化
 *参数:无
 *返回值:textField
 */
-(UITextField *)textFildInit
{
    UITextField *textField = [UITextField alloc];//实例化textField
    [textField initWithFrame:CGRectMake(20, 20, 280, 70)];
    [textField setBackgroundColor:[UIColor colorWithRed:190/255.0 green:183/255.0 blue:165/255.0 alpha:0.5]];
    [textField setFont:[UIFont fontWithName:@"Arial" size:45.0f]];
    [textField setTextAlignment:NSTextAlignmentRight];
    [textField setUserInteractionEnabled:NO];
    [textField setBorderStyle:UITextBorderStyleRoundedRect];
    
    [textField setTag:100];
    return [textField autorelease];
}


/*
 *方法:btnInit:(int)i
 *功能:按钮初始化
 *参数:
 *    i   ---------按键号
 *返回值:button
 */
-(UIButton *)btnInit:(int)i
{
    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    button.titleLabel.font = [UIFont systemFontOfSize: 30.0];
    [button setTitleColor:[UIColor grayColor] forState:UIControlContentHorizontalAlignmentCenter];
    [button setBackgroundImage:[UIImage imageNamed:@"num.9.png"] forState:UIControlStateNormal];
    
    if (i<4) {
        [button setFrame:CGRectMake(22 + 72*i,110,60,60)];
        switch (i) {
            case 0:
                [button setTitle:@"退出" forState:UIControlStateNormal];
                button.titleLabel.font = [UIFont systemFontOfSize: 22.0];
                [button setBackgroundImage:[UIImage imageNamed:@"0.9.png"] forState:UIControlStateNormal];
                [button setTitleColor:[UIColor whiteColor] forState:UIControlContentHorizontalAlignmentCenter];
                break;
            case 1:
                [button setTitle:@"历史" forState:UIControlStateNormal];
                button.titleLabel.font = [UIFont systemFontOfSize: 22.0];
                [button setBackgroundImage:[UIImage imageNamed:@"0.9.png"] forState:UIControlStateNormal];
                [button setTitleColor:[UIColor whiteColor] forState:UIControlContentHorizontalAlignmentCenter];
                break;
            case 2:
                [button setTitle:@"C" forState:UIControlStateNormal];
                [button setBackgroundImage:[UIImage imageNamed:@"C.9.png"] forState:UIControlStateNormal];
                [button setTitleColor:[UIColor whiteColor] forState:UIControlContentHorizontalAlignmentCenter];
                break;
            case 3:
                [button setTitle:@"" forState:UIControlStateNormal];
                [button setBackgroundImage:[UIImage imageNamed:@"x.9.png"] forState:UIControlStateNormal];
                [button setTitleColor:[UIColor whiteColor] forState:UIControlContentHorizontalAlignmentCenter];
                break;
        }
    }else if(i>=4 && i<8){
        [button setFrame:CGRectMake(22 + 72*(i-4),10+110+60,60,60)];
        switch (i) {
            case 4:
                [button setTitle:@"7" forState:UIControlStateNormal];
                break;
            case 5:
                [button setTitle:@"8" forState:UIControlStateNormal];
                break;
            case 6:
                [button setTitle:@"9" forState:UIControlStateNormal];
                break;
            case 7:
                [button setTitle:@"" forState:UIControlStateNormal];
                [button setBackgroundImage:[UIImage imageNamed:@"sub.9.png"] forState:UIControlStateNormal];
                [button setTitleColor:[UIColor whiteColor] forState:UIControlContentHorizontalAlignmentCenter];
                break;
        }
    }else if(i>=8 && i<12){
        [button setFrame:CGRectMake(22 + 72*(i-8),10+10+110+60+60,60,60)];
        switch (i) {
            case 8:
                [button setTitle:@"4" forState:UIControlStateNormal];
                break;
            case 9:
                [button setTitle:@"5" forState:UIControlStateNormal];
                break;
            case 10:
                [button setTitle:@"6" forState:UIControlStateNormal];
                break;
            case 11:
                [button setTitle:@"" forState:UIControlStateNormal];
                [button setBackgroundImage:[UIImage imageNamed:@"mul.9.png"] forState:UIControlStateNormal];
                [button setTitleColor:[UIColor whiteColor] forState:UIControlContentHorizontalAlignmentCenter];
                break;
        }
    }else if(i>=12 && i<16){
        [button setFrame:CGRectMake(22 + 72*(i-12),10+10+10+110+60+60+60,60,60)];
        switch (i) {
            case 12:
                [button setTitle:@"1" forState:UIControlStateNormal];
                break;
            case 13:
                [button setTitle:@"2" forState:UIControlStateNormal];
                break;
            case 14:
                [button setTitle:@"3" forState:UIControlStateNormal];
                break;
            case 15:
                [button setTitle:@"" forState:UIControlStateNormal];
                [button setBackgroundImage:[UIImage imageNamed:@"-.9.png"] forState:UIControlStateNormal];
                [button setTitleColor:[UIColor whiteColor] forState:UIControlContentHorizontalAlignmentCenter];
                break;
        }
    }else{
        [button setFrame:CGRectMake(22 + 72*(i-16),10+10+10+10+110+60+60+60+60,60,60)];
        switch (i) {
            case 16:
                [button setTitle:@"." forState:UIControlStateNormal];
                break;
            case 17:
                [button setTitle:@"0" forState:UIControlStateNormal];
                break;
            case 18:
                [button setTitle:@"" forState:UIControlStateNormal];
                [button setBackgroundImage:[UIImage imageNamed:@"=.9.png"] forState:UIControlStateNormal];
                [button setTitleColor:[UIColor whiteColor] forState:UIControlContentHorizontalAlignmentCenter];
                break;
            case 19:
                [button setTitle:@"" forState:UIControlStateNormal];
                [button setBackgroundImage:[UIImage imageNamed:@"+.9.png"] forState:UIControlStateNormal];
                [button setTitleColor:[UIColor whiteColor] forState:UIControlContentHorizontalAlignmentCenter];
                break;
        }
    }
    
    [button setTag:200+i];
    [button setShowsTouchWhenHighlighted:YES];
    return button;
}

//内存管理
-(void)dealloc
{
    [super dealloc];
}

@end

//
//  MessageHandle.h
//  Calculator
//  作者:DRAGON-Yeah
//  Created by 5016 on 13-12-21.
//  Copyright (c) 2013年 dradon. All rights reserved.
//

#import 

@interface MessageHandle : NSObject

//按键处理
-(NSMutableString *)onClick:(int)btnTag andStr:(NSMutableString *)str andHistroy:(NSMutableArray*)HistoryArr;

@end

//
//  MessageHandle.m
//  Calculator
//  作者:DRAGON-Yeah
//  Created by 5016 on 13-12-21.
//  Copyright (c) 2013年 dradon. All rights reserved.
//

#import "MessageHandle.h"
#import "CalculateResult.h"

@implementation MessageHandle

//标志按下=
BOOL equalFlag = NO;
//历史记录计数器
static int histroyNum = 0;

/*
 *方法:dealEqualString:(NSMutableString*)str
 *功能:按=之后是否继续按下符号或者数据
 *参数:
 *    str   ---------处理的字符串
 *返回值:void
 */
-(void)dealEqualString:(NSMutableString*)str
{
    if (equalFlag) {
        equalFlag = NO;
        NSString *temp = [str substringWithRange:NSMakeRange([str length]-1, 1)];
        if (!([temp isEqualToString:@"+"]||[temp isEqualToString:@"-"]||[temp isEqualToString:@"*"]||[temp isEqualToString:@"/"])) {
            [str setString:@""];
        }
    }
}

/*
 *方法:Equaldisplay:(NSMutableString*)str
 *功能:按=之后结果保留10位有效数字
 *参数:
 *    str   ---------处理的字符串
 *返回值:void
 */
-(void)Equaldisplay:(NSMutableString*)str
{
    if ([str length]>10) {
        [str setString:[str substringWithRange:NSMakeRange(0, 10)]];
    }
}

/*
 *方法:dealEqual:(NSMutableString*)str
 *功能:处理开始时候按下=,避免空指针异常
 *参数:
 *    str   ---------处理的字符串
 *返回值:void
 */
-(void)dealEqual:(NSMutableString*)str
{
    //处理空字符串出现异常
    if ([str isEqual:@""]) {
        [str setString:@" "];
    }else{
        [str setString:str];
    }
    
    NSSet *set =[NSSet setWithObjects:@"+",@"-",@"*",@"/",nil];
    if ([set containsObject:[str substringWithRange:NSMakeRange([str length]-1, 1)]]) {
        [str setString:[str substringWithRange:NSMakeRange(0,[str length]-1)] ];
    }
}

/*
 *方法:onClick:(int)btnTag andStr:(NSMutableString *)str
 *功能:按键处理
 *参数:
 *    btnTag---------按钮的标志
 *    str   ---------处理的字符串
 *返回值:str
 */
-(NSMutableString *)onClick:(int)btnTag andStr:(NSMutableString *)str andHistroy:(NSMutableArray*)HistoryArr
{
   
    switch (btnTag) {
        case 200:
            NSLog(@"退出");
            exit(0);
            break;
        case 201:
            NSLog(@"历史");
            if([HistoryArr count] == 0)//处理点击历史时候,没有数据崩溃
            {
                NSMutableString *ms =[[NSMutableString alloc]init];
                [ms setString:@" "];
                return [ms autorelease];
            }
            //让历史记录循环
            if (histroyNum == [HistoryArr count]) {
                histroyNum = 0;
            }
            [str setString:[HistoryArr objectAtIndex:histroyNum]];
            histroyNum++;
            equalFlag = YES;
            break;
        case 202:
            NSLog(@"C");
            [str setString:@""];
            break;
        case 203:
            NSLog(@"xxx");
            if ([str length]>0) {
                NSMutableString *tempStr = [[NSMutableString alloc]init];
                [tempStr setString:str];
                [str setString:[tempStr substringWithRange:NSMakeRange(0, [tempStr length]-1)]];
                [tempStr release];
            }
            break;
        case 204:
            NSLog(@"7");
            [self dealEqualString:str];
            [str appendString:@"7"];
            break;
        case 205:
            NSLog(@"8");
            [self dealEqualString:str];
            [str appendString:@"8"];
            break;
        case 206:
            NSLog(@"9");
            [self dealEqualString:str];
            [str appendString:@"9"];
            break;
        case 207:
            NSLog(@"/");
            [str appendString:@"/"];
            //判断是否重复
            [self dealRepeat:str andPram:@"/"];
            [self dealRepeat:str andPram:@"."];
            break;
        case 208:
            NSLog(@"4");
            [self dealEqualString:str];
            [str appendString:@"4"];
            break;
        case 209:
            NSLog(@"5");
            [self dealEqualString:str];
            [str appendString:@"5"];
            break;
        case 210:
            NSLog(@"6");
            [self dealEqualString:str];
            [str appendString:@"6"];
            break;
        case 211:
            NSLog(@"*");
            [str appendString:@"*"];
            //判断是否重复
            [self dealRepeat:str andPram:@"*"];
            [self dealRepeat:str andPram:@"."];
            break;
        case 212:
            NSLog(@"1");
            [self dealEqualString:str];
            [str appendString:@"1"];
            break;
        case 213:
            NSLog(@"2");
            [self dealEqualString:str];
            [str appendString:@"2"];
            break;
        case 214:
            NSLog(@"3");
            [self dealEqualString:str];
            [str appendString:@"3"];
            break;
        case 215:
            NSLog(@"-");
            [str appendString:@"-"];
            //注意顺序不能调换
            [self dealMinus:str andPram:@"-"];
            [self dealRepeat:str andPram:@"-"];
            [self dealRepeat:str andPram:@"."];
            break;
        case 216:
            NSLog(@".");
            [str appendString:@"."];
            //判断是否重复
            [self dealRepeatPoint:str andPram:@"."];
            break;
        case 217:
            NSLog(@"0");
            [self dealEqualString:str];
            [str appendString:@"0"];
            //[self dealZero:str andPram:@"/"];
            break;
        case 218:
            NSLog(@"=");
            equalFlag = YES;
            [self dealEqual :str];
            CalculateResult* result= [[CalculateResult alloc]init];
            [str setString:[result getResult:str]];
            [HistoryArr addObject:[result getResult:str]];//记录历史
           // NSLog(@"HistoryArr = %@",HistoryArr);
           // NSLog(@"res=%@",str);
            [result release];
            [self Equaldisplay:str];
            
            break;
        case 219:
            NSLog(@"+");
            [str appendString:@"+"];
            [self dealRepeat:str andPram:@"+"];
            [self dealMinus:str andPram:@"-"];
            [self dealRepeat:str andPram:@"."];
            break;
            
    }
    return str;
}

/*
 *方法:dealRepeatPoint:(NSMutableString*)str andPram:(NSString*)Pram
 *功能:控制重复小数点
 *参数:
 *    str   ---------处理的字符串
 *    Pram  ---------匹配参数
 *返回值:void
 */
-(void)dealRepeatPoint:(NSMutableString*)str andPram:(NSString*)Pram
{
    NSSet *set =[NSSet setWithObjects:@"+",@"-",@"*",@"/",nil];
    //去掉重复
    BOOL flag = [set containsObject:[str substringWithRange:NSMakeRange([str length] - 1, 1)]];
    if (flag) {//去掉第二个重复的
        [str setString:[str substringWithRange:NSMakeRange(0,[str length]-1)] ];
    }
    
    NSInteger len = [str length];
    
    NSMutableArray *marr = [[NSMutableArray alloc]init];
     NSMutableArray *marr1 = [[NSMutableArray alloc]init];
    //变成数组
    for (NSInteger i = len-1; i >=0; i--) {
        [marr addObject:[str substringWithRange:NSMakeRange(i, 1)]];
    }
    
    //NSLog(@"marr = %@",marr);
    //向前遍历,直到符号或没有
    for (int i = 0; i < [marr count]; i++) {
        if ([set containsObject:[marr objectAtIndex:i]]) {
            break;
        }
        if (i< [marr count] -1) {
           [marr1 addObject:[marr objectAtIndex:i+1]];
        }
        
    }
     //NSLog(@"marr1 = %@",marr1);
    
    if ([marr1 containsObject:@"."]) {
        [str setString:[str substringWithRange:NSMakeRange(0,[str length]-1)] ];
    }

}

/*
 *方法:dealZero:(NSMutableString*)str andPram:(NSString*)Pram
 *功能:控制0
 *参数:
 *    str   ---------处理的字符串
 *    Pram  ---------匹配参数
 *返回值:void
 */
-(void)dealZero:(NSMutableString*)str andPram:(NSString*)Pram
{
    //去掉重复
    BOOL flag = [[str substringWithRange:NSMakeRange([str length]-2, 1)] isEqualToString:Pram];
    if (flag) {//去掉第二个重复的
        [str setString:[str substringWithRange:NSMakeRange(0,[str length]-1)] ];
    }
}

/*
 *方法:dealRepeat:(NSMutableString*)str andPram:(NSString*)Pram
 *功能:处理重复出现的符号
 *参数:
 *    str   ---------处理的字符串
 *    Pram  ---------匹配参数
 *返回值:void
 */
-(void)dealRepeat:(NSMutableString*)str andPram:(NSString*)Pram
{
    NSSet *set =[NSSet setWithObjects:@"+",@"-",@"*",@"/",nil];
    //NSLog(@"%@",set);
    
    //去掉重复
    BOOL flag = [[str substringWithRange:NSMakeRange([str length]-2, 1)] isEqualToString:Pram];
    if (flag) {//去掉第二个重复的
        [str setString:[str substringWithRange:NSMakeRange(0,[str length]-1)] ];
    }
    
    //不能输入多个符号
    if ([set containsObject:[str substringWithRange:NSMakeRange([str length]-2, 1)]]) {
        [str setString:[str substringWithRange:NSMakeRange(0,[str length]-1)] ];
    }
    
    //开头字符不能为÷ x
    if ([str isEqualToString:@"/"] || [str isEqualToString:@"*"]) {
        //NSLog(@"第一个字符不能为x或÷");
        [str setString:@""];
    }
}

/*
 *方法:dealMinus:(NSMutableString*)str andPram:(NSString*)Pram
 *功能:处理减号(--得正)
 *参数:
 *    str   ---------处理的字符串
 *    Pram  ---------匹配参数
 *返回值:void
 */
-(void)dealMinus:(NSMutableString*)str andPram:(NSString*)Pram
{

    BOOL flag = [[str substringWithRange:NSMakeRange([str length]-2, 1)] isEqualToString:Pram];
    if (flag) {//去掉第二个重复的
        [str setString:[str substringWithRange:NSMakeRange(0,[str length]-2)] ];
        [str appendString:@"+"];
    }
    
    flag = [[str substringWithRange:NSMakeRange([str length]-2, 1)] isEqualToString:@"+"];
    if (flag) {//去掉第二个重复的
        [str setString:[str substringWithRange:NSMakeRange(0,[str length]-2)] ];
        [str appendString:@"-"];
    }
}

//内存管理
-(void)dealloc
{
    [super dealloc];
}

@end

//
//  CalculateResult.h
//  Calculator
//  作者:DRAGON-Yeah
//  Created by 5016 on 13-12-23.
//  Copyright (c) 2013年 dradon. All rights reserved.
//

#import 

@interface CalculateResult : NSObject

//计算结果,并返回结果
-(NSString *)getResult:(NSMutableString *)str;

@end

//
//  CalculateResult.m
//  Calculator
//  作者:DRAGON-Yeah
//  Created by 5016 on 13-12-23.
//  Copyright (c) 2013年 dradon. All rights reserved.
//

#import "CalculateResult.h"

@implementation CalculateResult

/*
 *方法:contains:(NSString*)str1 andStr:(NSString*)str2
 *功能:判断字符串是否包含某个字符
 *参数:
 *    str1   ---------处理的字符串
 *    str2   ---------匹配的字符串 
 *返回值:flag
 */
-(BOOL)contains:(NSString*)str1 andStr:(NSString*)str2
{
    BOOL flag = NO;
    
    for (int i =0 ; i < str1.length; i++) {
        NSString *temp = [str1 substringWithRange:NSMakeRange(i, 1)];
        if ([temp isEqualToString:str2]) {
            flag = YES;
        }
    }
    return flag;
}

/*
 *方法:dealWithPointZero:(NSMutableString *)str
 *功能:判断/后面是否为0
 *参数:
 *    str   ---------处理的字符串
 *返回值:YES/NO
 */
-(BOOL)dealWithPointZero:(NSMutableString *)str
{
    NSMutableString *mstr = [str copy];
    
    
    NSMutableArray *marr = [[NSMutableArray alloc]init];
    NSArray *arr = [mstr componentsSeparatedByString:@"/"];
    for (NSString *str0 in arr) {
        [marr addObject:str0];
    }
    
    NSSet *set =[NSSet setWithObjects:@"+",@"-",@"*",@"/",nil];

    NSMutableString *mstr1 = [[NSMutableString alloc]init];
   // NSLog(@"marr = %@",marr);
    for (NSString *s in marr)
    {
        for (int i = 0; i< [s length]; i++)
        {
            NSString *temp = [s substringWithRange:NSMakeRange(i, 1)];
            if ([set containsObject:temp])
            {
                break;
            }
            [mstr1 appendString:temp];
        }
        if([mstr1 doubleValue] == 0)//如果有0
        {
            return YES;
        }
        [mstr1 setString:@""];//清空,保证每次只有一个数
    }
    [mstr1 release];
    [mstr release];
    return NO;
}

/*
 *方法:getResult:(NSMutableString *)str
 *功能:返回处理好并且运算好的结果
 *参数:
 *    str   ---------处理的字符串
 *返回值:[[NSNumber numberWithDouble:result] stringValue]
 */
-(NSString *)getResult:(NSMutableString *)str
{
    double MSresult = 0.0;//乘除结果
    double ADresult = 0.0;//加减结果
    double result = 0.0;//总结果
   // NSMutableString *string = [[NSMutableString alloc]init];
   // [string setString:@".8-2.78+5-6-8+34-35*23/34/32*45+12+457+2/6*47*78/12-56-78"];

    /*处理/.0000000*/
    if ([self dealWithPointZero:str]) {
        return str;
    }
    
    [self dealWithPointZero:str];
    NSMutableString *string = str;//接收传来字符串
    NSMutableArray *marr = [[NSMutableArray alloc] init];
    
    //1.以+号分离
    NSArray *arr1 = [string componentsSeparatedByString:@"+"];
    //NSLog(@"arr1 = %@",arr1);
    
    for (NSString *str0 in arr1) {
        //NSLog(@"str0 = %@",str0);
         NSArray *arr2 = [str0 componentsSeparatedByString:@"-"];
        for (int i = 0; i<[arr2 count]; i++) {
            NSString *temp = [arr2 objectAtIndex:i];
            NSString *temp1 = @"-";
            NSString *temp2 = @"";
           // NSLog(@"temp = %@",temp);
            if (i>0) {
               temp2 =  [temp1 stringByAppendingFormat:@"%@",temp];
            }else{
                temp2 = temp;
            }
            [marr addObject:temp2];
        }
    }

    NSLog(@"marr = %@",marr);
    
    NSMutableArray *marr1 = [[NSMutableArray alloc] init];
    NSMutableArray *marr2 = [[NSMutableArray alloc] init];
    
    //优先级分离出+- 与 */
    for (NSString *s in marr) {
        if ([self contains:s andStr:@"*"]||[self contains:s andStr:@"/"]) {
            [marr1 addObject:s];//乘除
        }else{
            [marr2 addObject:s];//OK 加减
        }
    }
    
    //处理乘除,获取结果
    for (NSString *s in marr1) {
        //NSLog(@"s=%@",s);
       MSresult += [self tempResult:s];
    }
    NSLog(@"MSresult = %lf",MSresult);
    
    //处理加减,获取结果
    ADresult = [self aluResult:marr2];
    NSLog(@"ADresult = %lf",ADresult);
    
    //求总结果
    result = MSresult + ADresult;
    NSLog(@"result = %lf",result);
    [marr release];
    [marr1 release];
    [marr2 release];
    return [[NSNumber numberWithDouble:result] stringValue];
}

/*
 *方法:tempResult:(NSString*)str
 *功能:返回乘除的每一条结果
 *参数:
 *    str   ---------处理的字符串
 *返回值:result
 */
-(double)tempResult:(NSString*)str
{
    double result = 0.0;
    NSMutableArray *marr = [[NSMutableArray alloc]init];
    NSArray *arr = [str componentsSeparatedByString:@"*"];
    
    for (int i = 0 ; i<[arr count] ; i++) {
       // NSLog(@"s=%@",s);
        NSString *temp = [arr objectAtIndex:i];
        NSString *temp1 = @"*";
        NSString *temp2 = @"";
        if (i>0) {
            temp2 =  [temp1 stringByAppendingFormat:@"%@",temp];
        }else{
            temp2 = temp;
        }
        //NSLog(@"temp2=%@",temp2);
        NSArray *arr1 = [temp2 componentsSeparatedByString:@"/"];
        for (int j=0 ;j<[arr1 count]; j++) {
           // NSLog(@"s1=%@",[arr1 objectAtIndex:j]);
            NSString *t = [arr1 objectAtIndex:j];
            NSString *t1 = @"/";
            NSString *t2 = @"";
            if (j>0) {
                t2 =  [t1 stringByAppendingFormat:@"%@",t];
            }else{
                t2 = t;
            }
           // NSLog(@"t2 = %@",t2);
            [marr addObject:t2];
        }
    }
    //计算值
    result = [self aluMS:marr];
    return result;
}

/*
 *方法:aluMS:(NSMutableArray*)marr
 *功能:返回乘除的一条结果
 *参数:
 *    marr   ---------处理的一条乘除公式的数组
 *返回值:res
 */
-(double)aluMS:(NSMutableArray*)marr
{  
    double res=1.0*[[marr objectAtIndex:0] doubleValue];
  //  NSLog(@"res = %lf",res);
    
    for (int i = 1; i<[marr count]; i++) {
       // NSLog(@"res =%@",[marr objectAtIndex:i]);
        NSString *temp = [marr objectAtIndex:i];
        NSString *first = [temp substringWithRange:NSMakeRange(0, 1)];
        NSString *second = [temp substringWithRange:NSMakeRange(1, [temp length]-1)];
        
        //NSLog(@"first = %@",first);
        //NSLog(@"second = %@",second);
        
        if ([first isEqualToString:@"*"]) {
            res = res*[second doubleValue];
        }else if([first isEqualToString:@"/"]){
            res = res/[second doubleValue];
        }
    }
   // NSLog(@"res = %lf",res);
    return res;
}


/*
 *方法:aluResult:(NSMutableArray*)marr
 *功能:返回累加结果
 *参数:
 *    marr   ---------处理的一条加减公式的数组
 *返回值:result
 */
-(double)aluResult:(NSMutableArray*)marr
{
    //NSLog(@"加减marr = %@",marr);
    double result = 0.0;

    for (int i = 0; i<[marr count]; i++) {
        NSString *temp = [marr objectAtIndex:i];
        //NSLog(@"加减 = %@",temp);
        result += [temp doubleValue];
    }
    return result;
}

//内存管理
-(void)dealloc
{
    [super dealloc];
}
@end




IOS学习笔记---多目运算计算器_第1张图片IOS学习笔记---多目运算计算器_第2张图片

你可能感兴趣的:(计算器,多目运算符,处理字符串)