iPhone 계산기만들기(3)

2011. 12. 6. 20:55제2외국어/iOS

지금 만드는 계산기는 

5+6*2-9/3 = ? 같이 수식으로 계산하기 떄문에 좀 귀찮습니다.


예외처리하기.


1. 연산자 다음에 바로 연산자가 나오지 못 하게하기

ex ) 3 + 5 -+ (x)


2. '.'은 다음 연산자를 넣을 때 까지 한번만 사용하게 하기

ex ) 3.5.3 (x)


3. '.'누르고 바로 연산자가 오는 경우 0을 붙여주기

ex ) 3. + 할 경우 -> 3.0 + 로 바꾸어 주기


시간이 늦어서.. 내일 덧붙일게요.


이어서...


각 함수들 정의입니다.


계산기를... 다른 버전으로 만들어야 되서 그냥 소스 올립니다.


-(IBAction)pressedNumber:(id)sender

{

    UIButton *pressed = sender;

   

    

    if([showResult.text isEqualToString:@"0"]) // showResult.text  0 같은가?

    {

        showResult.text = pressed.titleLabel.text;

    }

    else

    {

        if([pressed.titleLabel.text isEqualToString:@"0"])

        {

            showResult.text = [showResult.text stringByAppendingString:pressed.titleLabel.text];

        }

    }


}

-(IBAction)pressedCalculate:(id)sender

{

    UIButton *pressed = sender;

    // 마지막 문자 알아내기

    int length = [showResult.text length];

    NSString *temp =[showResult.text substringFromIndex:length-1];

   

    if (![showResult.text isEqualToString:@"0"]) {

        if( [temp isEqualToString:@"+"] || [temp isEqualToString:@"-"] || [temp isEqualToString:@"*"] || [temp isEqualToString:@"/"])

        {

            

        }else

        {

            if([temp isEqualToString:@"."])

            {

                showResult.text = [showResult.text stringByAppendingString:@"0"];

                showResult.text = [showResult.text stringByAppendingString:pressed.titleLabel.text];

                st_op[oP++] = pressed.titleLabel.text;

                po = NO;

            }

            else

            {

                showResult.text = [showResult.text stringByAppendingString:pressed.titleLabel.text];

                st_op[oP++] = pressed.titleLabel.text;

                po = NO;

            }


        }

    }


    

}

-(IBAction)pressedClear:(id)sender

{

    showResult.text = @"0";

    Result.text =@"";

}

-(IBAction)pressedDel:(id)sender

{

    NSString *temp = showResult.text;

    int length = [temp length]-1;

    

    showResult.text = [showResult.text substringWithRange:(NSRange){0,length}];

    

    if([showResult.text isEqualToString:@""])

        showResult.text = @"0";


}


-(IBAction)pressedPoint:(id)sender

{

    UIButton *pressed = sender;

    // 마지막 문자 알아내기

    int length = [showResult.text length];

    NSString *temp =[showResult.text substringFromIndex:length-1];

    

    if(po == NO)

    {

        if([showResult.text isEqualToString:@"0"])

        {

            showResult.text = [showResult.text stringByAppendingString:pressed.titleLabel.text];

            po = YES;

        }

        else

        {

            

            if( [temp isEqualToString:@"+"] || [temp isEqualToString:@"-"] || [tempisEqualToString:@"*"] || [temp isEqualToString:@"/"] || [temp isEqualToString:@"."])

            {

                // 연산자 다음에는 0   없다.

            }

            else

            {

                showResult.text = [showResult.text stringByAppendingString:pressed.titleLabel.text];

                po = YES;

            }

        

        }

    }


}


-(IBAction)pressedResult:(id)sender

{

    // 숫자와 연산자 분리하기!

    NSString *st_num[10];

    NSString *temp = showResult.text;

    

    NSCharacterSet *filter=[NSCharacterSet characterSetWithCharactersInString:@"+-*/"];


    NSArray *result_temp = [temp componentsSeparatedByCharactersInSet: filter];

    NSNumber *intarr;

    int nP=0;

    double outcome = 0.0;

    for(intarr in result_temp)

    {

        NSLog(@"%@ %@",intarr,st_op[nP]); 

        st_num[nP++]=[NSString stringWithFormat:@"%@", intarr ];    

    }

    NSLog(@"nP : %d",nP);

    NSLog(@"oP : %d",oP);

    

    // 순서 정하기

    int i,n=0,key=0;

    int turm[10]={0,};

    

    

    for(i=0;i<oP;i++)

    {

        if([st_op[i] isEqualToString:@"*"] || [st_op[i] isEqualToString:@"/"])

        {

            turm[n++] = i;

        }

        NSLog(@"st_op [%d] =  %@",i,st_op[i]);

    }   

    for(i=0;i<oP;i++)

    {

        if([st_op[i] isEqualToString:@"*"] || [st_op[i] isEqualToString:@"/"])

        {

            

        }

        else

            turm[n++] = i;

    }

    NSLog(@"n : %d",n);

    NSLog(@"outcome : %lf",outcome);

    for(i=0;i<n;i++)

    {

        key =turm[i] ;

        if( [st_op[ turm[i] ] isEqualToString:@"*" ] )

        {

            while([st_num[key] isEqualToString:@"0"]) key--;

                   

            outcome = [st_num[ key ] doubleValue] * [st_num[ turm[i] +1 ]doubleValue] ;

            st_num[ key ] = [ NSString stringWithFormat:@"%lf",outcome];

            st_num[ turm[i]+1 ] = @"0";

        }else if( [st_op[ turm[i] ] isEqualToString:@"/" ] )

        {

            while([st_num[key] isEqualToString:@"0"]) key--;

            

            outcome = [st_num[ key ] doubleValue] / [st_num[ turm[i] +1 ]doubleValue] ;

            st_num[ key ] = [ NSString stringWithFormat:@"%lf",outcome];

            st_num[ turm[i]+1 ] = @"0";

        }

        else if( [st_op[ turm[i] ] isEqualToString:@"+" ] )

        {

            while([st_num[key] isEqualToString:@"0"]) key--;

            

            outcome = [st_num[ key ] doubleValue] + [st_num[ turm[i] +1 ]doubleValue] ;

            st_num[ key ] = [ NSString stringWithFormat:@"%lf",outcome];

            st_num[ turm[i]+1 ] = @"0";

        }

        else if( [st_op[ turm[i] ] isEqualToString:@"-" ] )

        {

            while([st_num[key] isEqualToString:@"0"]) key--;

            

            outcome = [st_num[ key ] doubleValue] - [st_num[ turm[i] +1 ]doubleValue] ;

            st_num[ key ] = [ NSString stringWithFormat:@"%lf",outcome];

            st_num[ turm[i]+1 ] = @"0";

        }

    }

    Result.text = st_num[0];    

    

    for(int i=0; i<10; i++)

        st_op[i] = @"";

    oP = 0;

   

}