很屌的计算器

//

//  CalculatorViewController.m

//  Calculator

//

//  Created by Yingyu on 11-5-31.

//  Copyright 2011 __MyCompanyName__. All rights reserved.

//


#import "CalculatorViewController.h"


@implementation CalculatorViewController


@synthesize display;

@synthesize showFoperator;

@synthesize showSpecial;

@synthesize sqrXButton;

@synthesize radsigXButton;

@synthesize expButton;

@synthesize tensqrButton;

@synthesize fracButton;

@synthesize msubButton;

@synthesize clrtvmButton;

@synthesize clrcfButton;



// 初始化计算器

- (void)viewDidLoad 

{

display.text = @"";

showFoperator.text = @"";

showSpecial.text = @"";

operator = @"=";

fstOperand = 0;

sumOperand = 0;

tvN = 0; tvIy = 0; tvPv = 0; tvPmt = 0; tvFv = 0;

bBegin = YES;

cptOpen = NO;

secOpen = NO;

}


// 按键事件处理

-(IBAction)buttonClicked:(id)sender 

{

UIButton *btn = (UIButton *)sender;

int tag = btn.tag;

switch (tag) 

{

// 初始化清屏

case clearBtn: // C    1

[self clearDisplay];

break;

// 退格

case backBtn: // ←    2

[self backSpace];

break;


// 双操作数运算符

case plusBtn: // +    3

case subBtn: // -    4

case mulBtn: // x    5

case divBtn: // ÷    6

case sqrXBtn: // yⁿ   7

case radsigXBtn:// ⁿ√y  8

case equalBtn: // =    9

[self inputDoubleOperator:btn.titleLabel.text];

break;

// 增加小数点

case dotBtn: // .    10

[self addDot];

break;

// 增加正负号

case signBtn: // +/-  11

[self addSign];

break;

// 单操作数运算符

case sqr2Btn: // x²   12

case radsig2Btn: // √x 13

case logeBtn: // ln 14

case log10Btn: // log 15

case expBtn: // eⁿ 16

case tensqrBtn: // 10ⁿ 17

case percBtn: // % 18

case fracBtn: // 1/x 19

[self inputSingleOperator:btn.titleLabel.text];

break;

// 求金融运算值

case cptBtn: // CPT  20

[self cptOperator];

break;

// tv金融运算符

case nBtn: // N    21

case iyBtn: // I/Y  22

case pvBtn: // PV   23

case pmtBtn: // PMT  24

case fvBtn: // FV   25

[self inputTimeValueOperator:btn.titleLabel.text];

break;

// 操作数保留

case mrBtn: // mr   33

case mplusBtn: // m+   34

case msubBtn: // m-   35

[self numberMemory:btn.titleLabel.text];

break;

// 2nd切换按键

case secBtn: // 2nd 36

[self secKey];

break;

// 清空tvm变量

case clrtvmBtn: // CLR TVM  37

[self clearTvm];

break;

// 清空tvm变量

case clrcfBtn: // CLR CF   38

[self clearCf];

break;


// 数字分支

default:

[self inputNumber:btn.titleLabel.text];

break;

}

}


// C方法

- (void)clearDisplay

{

display.text = @"";

showFoperator.text = @"C";

operator = @"=";

fstOperand = 0;

sumOperand = 0;

bBegin = YES;

cptOpen = NO;

}


// ←方法

- (void)backSpace

{

showFoperator.text = @"←";

if (backOpen

{

if (display.text.length == 1)

{

display.text = @"";

}

else if (![display.text isEqualToString:@""])

{

display.text = [display.text substringToIndex:display.text.length -1];

}

}

}


// 双操作数运算方法 

- (void)inputDoubleOperator: (NSString *)dbopt

{

showFoperator.text = dbopt;

backOpen = NO;

if(![display.text isEqualToString:@""])

{

fstOperand = [display.text doubleValue];

if(bBegin)

{

operator = dbopt;

}

else

{           

if([operator isEqualToString:@"="])

{

sumOperand = fstOperand;

}

else if([operator isEqualToString:@"+"])

{

sumOperand += fstOperand;

display.text = [NSString stringWithFormat:@"%g",sumOperand];

}

else if([operator isEqualToString:@"-"])

{

sumOperand -= fstOperand;

display.text = [NSString stringWithFormat:@"%g",sumOperand];

}

else if([operator isEqualToString:@"x"])

{

sumOperand *= fstOperand;

display.text = [NSString stringWithFormat:@"%g",sumOperand];

}

else if([operator isEqualToString:@"÷"])

{

if(fstOperand!= 0)

{

sumOperand /= fstOperand;

display.text = [NSString stringWithFormat:@"%g",sumOperand];

}

else

{

display.text = @"nan";

operator= @"=";

}

}

else if ([operator isEqualToString:@"xⁿ"])

{

sumOperand = pow(sumOperand, fstOperand);

display.text = [NSString stringWithFormat:@"%g",sumOperand];

}

else if ([operator isEqualToString:@"ⁿ√x"])

{

sumOperand = pow(sumOperand, 1/fstOperand);

display.text = [NSString stringWithFormat:@"%g",sumOperand];

}

bBegin= YES;

operator= dbopt;

}

}

}


// 增加.方法

- (void)addDot

{

showFoperator.text = @".";

if(![display.text isEqualToString:@""] && ![display.text isEqualToString:@"-"])

{

NSString *currentStr = display.text;

BOOL notDot = ([display.text rangeOfString:@"."].location == NSNotFound);

if (notDot) 

{

currentStr= [currentStr stringByAppendingString:@"."];

display.text= currentStr;

}

}

}


// 增加+/-方法

- (void)addSign

{

showFoperator.text = @"+/-";

if(![display.text isEqualToString:@""] && ![display.text isEqualToString:@"0"] && ![display.text isEqualToString:@"-"])

{

double number = [display.text doubleValue];

number = number*(-1);

display.text= [NSString stringWithFormat:@"%g",number];

if(bBegin)

{

sumOperand = number;

}

}    

}


// 单操作数运算方法

- (void)inputSingleOperator: (NSString *)sgopt

{

showFoperator.text = sgopt;

backOpen = NO;

if(![display.text isEqualToString:@""])

{

operator = sgopt;

fstOperand = [display.text doubleValue];

if([operator isEqualToString:@"x²"])

{

sumOperand = pow(fstOperand , 2);

display.text= [NSString stringWithFormat:@"%g",sumOperand];

}

else if([operator isEqualToString:@"√x"])

{

sumOperand = sqrt(fstOperand);

display.text= [NSString stringWithFormat:@"%g",sumOperand];

}

else if([operator isEqualToString:@"ln"])

{

sumOperand = log(fstOperand);

display.text= [NSString stringWithFormat:@"%g",sumOperand];

}

else if([operator isEqualToString:@"log"])

{

sumOperand = log10(fstOperand);

display.text= [NSString stringWithFormat:@"%g",sumOperand];

}

else if([operator isEqualToString:@"eⁿ"])

{

sumOperand = exp(fstOperand);

display.text= [NSString stringWithFormat:@"%g",sumOperand];

}

else if([operator isEqualToString:@"10ⁿ"])

{

sumOperand = pow(10 , fstOperand);

display.text= [NSString stringWithFormat:@"%g",sumOperand];

}

else if([operator isEqualToString:@"%"])

{

sumOperand = fstOperand / 100;

display.text= [NSString stringWithFormat:@"%g",sumOperand];

}

else if([operator isEqualToString:@"1/x"])

{

if (fstOperand!= 0)

{

sumOperand = 1 / fstOperand;

display.text= [NSString stringWithFormat:@"%g",sumOperand];

}

else 

{

display.text = @"nan";

}

}

bBegin = YES;

}

}


// cpt求值方法

- (void)cptOperator

{

showFoperator.text = @"CPT";

cptOpen = YES;

}


//金融运算方法

- (void)inputTimeValueOperator: (NSString *)tvopt

{

showFoperator.text = tvopt;

showFoperator.text = [showFoperator.text stringByAppendingString:@"="];

operator = tvopt;

backOpen = NO;


if (cptOpen

{

if([operator isEqualToString:@"N"])

{

tvmOperand = (log(((tvFv * tvIy - tvPmt) / ((- tvPv * tvIy) - tvPmt)))) / (log(1 + tvIy));

}

else if([operator isEqualToString:@"I/Y"])

{

}

else if([operator isEqualToString:@"PMT"])

{

tvmOperand = (-tvPv - tvFv/pow(1 + tvIy/100, tvN))/((1 - 1/pow(1 + tvIy/100, tvN))/(tvIy/100));

}

else if([operator isEqualToString:@"PV"])

{

tvmOperand = -(tvFv/pow(1 + tvIy/100, tvN) + (1 - 1/pow(1 + tvIy/100, tvN))/(tvIy/100) * tvPmt);

}

else if([operator isEqualToString:@"FV"])

{

tvmOperand = (-tvPv - (1 - 1/pow(1 + tvIy/100, tvN))/(tvIy/100) * tvPmt) * pow(1 + tvIy/100, tvN);

}

display.text= [NSString stringWithFormat:@"%g",tvmOperand]; 

cptOpen = NO;

}

else 

{

if(![display.text isEqualToString:@""])

{

if([operator isEqualToString:@"N"])

{

if (fstOperand >= 0

{

tvN = [display.text doubleValue];

}

else

{

display.text = @"nan";

}

}

else if([operator isEqualToString:@"I/Y"])

{

tvIy = [display.text doubleValue];

}

else if([operator isEqualToString:@"PMT"])

{

tvPmt = [display.text doubleValue];

}

else if([operator isEqualToString:@"PV"])

{

tvPv = [display.text doubleValue];

}

else if([operator isEqualToString:@"FV"])

{

tvFv = [display.text doubleValue];

}

}

}

bBegin = YES;

}


// 操作数保留方法

- (void)numberMemory: (NSString *)nmopt

{

showFoperator.text = nmopt;

operator = nmopt;

if([operator isEqualToString:@"mr"])

{

[self inputNumber:[NSString stringWithFormat:@"%g",mrOperand]];

}

else if([operator isEqualToString:@"m+"])

{

mrOperand = [display.text doubleValue];

}

else if([operator isEqualToString:@"m-"])

{

mrOperand = 0;

}

}


// 2nd切换方法

- (void)secKey

{

if (secOpen

{

showSpecial.text = @"";

secOpen = NO;

sqrXButton.hidden = YES;

radsigXButton.hidden = YES;

expButton.hidden = YES;

tensqrButton.hidden = YES;

fracButton.hidden = YES;

msubButton.hidden = YES;

clrtvmButton.hidden = YES;

clrcfButton.hidden = YES;

}

else

{

showSpecial.text = @"2nd";

secOpen = YES;

sqrXButton.hidden = NO;

radsigXButton.hidden = NO;

expButton.hidden = NO;

tensqrButton.hidden = NO;

fracButton.hidden = NO;

msubButton.hidden = NO;

clrtvmButton.hidden = NO;

clrcfButton.hidden = NO;

}

}


// 清空tvm变量方法

- (void)clearTvm

{

showFoperator.text = @"CLR TVM";

tvN = 0; tvIy = 0; tvPv = 0; tvPmt = 0; tvFv = 0;

}


// 清空cf变量方法

- (void)clearCf

{

showFoperator.text = @"CLR CF";

}


// 数字输入方法

- (void)inputNumber: (NSString *)nbstr

{

backOpen = YES;

cptOpen = NO;

if(bBegin)

{

showFoperator.text = @"";

display.text = nbstr;

}

else

{

display.text = [display.text stringByAppendingString:nbstr];

}

bBegin = NO;

}



- (void)didReceiveMemoryWarning {

// Releases the view if it doesn't have a superview.

    [super didReceiveMemoryWarning];

// Release any cached data, images, etc that aren't in use.

}


- (void)viewDidUnload {

self.display = nil;

self.showFoperator = nil;

self.showSpecial = nil;

self.sqrXButton = nil;

self.radsigXButton = nil;

self.expButton = nil;

self.tensqrButton = nil;

self.fracButton = nil;

self.msubButton = nil;

self.clrtvmButton = nil;

self.clrcfButton = nil;

}



- (void)dealloc {

[display release];

[showFoperator release];

[showSpecial release];

[sqrXButton release];

[radsigXButton release];

[expButton release];

[tensqrButton release];

[fracButton release];

[msubButton release];

[clrtvmButton release];

[clrcfButton release];

    [super dealloc];

}


@end


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值