初识_IOS-简易计算器-问题总结
作为一个新手,只好拿所有开发者都写的不想写又没有太大难度的计算器来下手咯。比较细一点,耐心哟。
我们都知道,计算器首要任务就是计算,那我们就直接看成A+B=C,来进行分析了。对A,B,C三个对象进行分析。
我们来想象一下真实计算器的操作,首先进行的就是输入了,那我们就先来解决输入问题:
----------键盘的输入:
- 输入时我们得知道此次输入的值是A还是B,因为如果分不清是左值还是右值那就无法进行正确的赋值,那可想而之我们的计算器得成什么样。
但是用其他方法来实现这一辨别很显然很麻烦,这时候我们很容易想到同样有两个状态的BOOL基本类型。
@property (assign,nonatomic) BOOL isleftOrringt;//YES 为左值 NO为右值
BOOL声明之后我们拿到运算符的点击事件里边做状态的转换,这样就解决了,左右值赋值问题。
2.同样因为我们的计算器在我们不操作的时候显示为“0”,所以我们不可能把零也带着显示,所以当为第一次输入时得进行清零操做。声明BOOL值判断(方便。哈哈)
//判断是否为第一次输入 @property (assign,nonatomic) BOOL isEduitfirst;//NO 为第一次写入 YES为不是第一次操作
3.输入问题还有一个成员“.”,我们也得把它处理了 不能出来两次以上这个问题,我的解决方法是声明一个string赋值为“。”然后和lable上的值进行比较,要是有一个了就不让它输入了
NSString *str = @".";//声明一个字符串与_lable值进行比较 NSRange range;//声明一个range纪录相同字符串的长度 range = [_lablenumber.text rangeOfString:str]; //如果输入"." if ([sender.currentTitle isEqualToString:@"."] ) { //若"."的个数小于1个 if (range.length < 1) { //stringByAppendingString 字符串的累加 _lablenumber.text = [_lablenumber.text stringByAppendingString:@"."]; } else if(range.length > 1) { _lablenumber.text = _lablenumber.text; } } else { _lablenumber.text = [_lablenumber.text stringByAppendingString:sender.currentTitle]; }
解决这个问题之后我们就算完成键盘操作Demo了
@property (weak, nonatomic) IBOutlet UILabel *lablenumber;//lable值 @property (strong,nonatomic) NSString *isleftNum;//左值 @property (strong,nonatomic) NSString *isringtNum;//右值 @property (strong,nonatomic) NSString *isresoult;//结果
- (IBAction)Eduit:(UIButton *)sender { NSString *str = @".";//声明一个字符串与_lable值进行比较 NSRange range; } //如果是左值 if (_isleftOrringt) { if (_isEduitfirst) //如果不是第一次则字符串累加 { //range获取_lablenumber.text中"."的个数 range = [_lablenumber.text rangeOfString:str]; //如果输入"." if ([sender.currentTitle isEqualToString:@"."] ) { //若"."的个数小于1个 if (range.length < 1) { //stringByAppendingString 字符串的累加 _lablenumber.text = [_lablenumber.text stringByAppendingString:@"."]; } else if(range.length > 1) { _lablenumber.text = _lablenumber.text; } } else { _lablenumber.text = [_lablenumber.text stringByAppendingString:sender.currentTitle]; } } //如果是第一次操作,则清零 else { //如果输入"."则lable上显示"0." if ([sender.currentTitle isEqualToString:@"."]) { _lablenumber.text = @"0."; } else { _lablenumber.text = sender.currentTitle; } _isEduitfirst = YES; } //赋值给左值 _isleftNum = _lablenumber.text; } else { if (_isEduitfirst) //如果不是第一次则字符串累加 { range = [_lablenumber.text rangeOfString:str]; if ([sender.currentTitle isEqualToString:@"."] ) { if (range.length < 1) { _lablenumber.text = [_lablenumber.text stringByAppendingString:@"."]; } else if(range.length > 1) { _lablenumber.text = _lablenumber.text; } } else { _lablenumber.text = [_lablenumber.text stringByAppendingString:sender.currentTitle]; } } //如果是第一次操作,则清零 else { if ([sender.currentTitle isEqualToString:@"."]) { _lablenumber.text = @"0."; } else { _lablenumber.text = sender.currentTitle; } _isEduitfirst = YES; } _isringtNum = _lablenumber.text; } }
这样我们就完成了键盘操作的Demo
----------运算Demo
这个很简单,会上过小学数学的都会,就不再解释了,上代码。
double resoult = 0; if (_isplus) { resoult = [_isleftNum doubleValue] + [_isringtNum doubleValue]; } else if(_isjian) { resoult = [_isleftNum doubleValue] - [_isringtNum doubleValue]; } else if (_ischeng) { resoult = [_isleftNum doubleValue] * [_isringtNum doubleValue]; } else if (_ischu) { resoult = [_isleftNum doubleValue] / [_isringtNum doubleValue]; }
我们可以看到有四个BOOL值变量,我用这四个bool值进行判断用户点击了哪个运算符然后进行相应的运算,因为只需要在运算符添加点击事件,事件中改一下bool值状态,就行了呗,简单点
//判断是否为本次运算 //"+" @property (assign,nonatomic) BOOL isplus;//YES 可执行 //"-" @property (assign,nonatomic) BOOL isjian;//YES 可执行 //"*" @property (assign,nonatomic) BOOL ischeng;//YES 可执行 //"/" @property (assign,nonatomic) BOOL ischu;//YES 可执行
1.到这里我又遇到问题了点击一次和点击两次运算符可不一样呀,第一次点击不能运算的。好吧我亲爱的bool值,来吧
为了理解方便我把所需的bool值声明全显示出来
//判断左右值 @property (assign,nonatomic) BOOL isleftOrringt;//YES 为左值 NO为右值 //判断是否为第一次输入 @property (assign,nonatomic) BOOL isEduitfirst;//NO 为第一次写入 YES为不是第一次操作 //判断是否为第一次计算 @property (assign,nonatomic) BOOL isfirstCaculator; //NO 为第一次计算 YES为不是第一次计算 //判断是否为本次运算 //"+" @property (assign,nonatomic) BOOL isplus;//YES 可执行 //"-" @property (assign,nonatomic) BOOL isjian;//YES 可执行 //"*" @property (assign,nonatomic) BOOL ischeng;//YES 可执行 //"/" @property (assign,nonatomic) BOOL ischu;//YES 可执行
if ([sender.currentTitle isEqualToString:@"+"]) { //若是第一次点击运算符 if (_isfirstCaculator) { //注:_isfirstCaculator = no; //若不是第一次点击则直接执行运算 [self jisuan]; } //若是第一次执行运算则把加号运算符状态改为YES //每一次点击运算符把_isleftOrringt = NO;_isEduitfirst = NO;前边我们讲过了,所以此时要转换状态 _isleftOrringt = NO; _isEduitfirst = NO; _isfirstCaculator = YES; _isplus = YES; _ischeng = NO; _ischu = NO; _isjian = NO; }
if (_isfirstCaculator) { [self jisuan]; } _isleftOrringt = NO; _isEduitfirst = NO; _isfirstCaculator = YES; _isplus = NO; _ischeng = NO; _ischu = NO; _isjian = YES;
if (_isfirstCaculator) { [self jisuan]; } _isleftOrringt = NO; _isEduitfirst = NO; _isfirstCaculator = YES; _isplus = NO; _ischeng = YES; _ischu = NO; _isjian = NO;
if (_isfirstCaculator) { [self jisuan]; } _isleftOrringt = NO; _isEduitfirst = NO; _isfirstCaculator = YES; _isplus = NO; _ischeng = NO; _ischu = YES; _isjian = NO;
2.经常玩计算器的人都知道,第二次点击运算符时我们要输出结果,点击等号之后我们也要输出结果,上面算法虽然实现了连乘连加等,但是点击等号之后就不行了,因为等号点过之后要是点击运算符则不能进行计算,要是输入数字的话判断不了是否为左值或右值,无法进行正常的运算。
所以我们要也要1.判断运算之前,等号点过了没,如果点过的话 我们就不要进行计算了,2.输入之前判断是否点击过等号,要是点过,就全部初始化,这样就不会出错。此时我们再bool一个,判断点过等号之后用户点击的是运算符还是键盘输入。
@property (assign,nonatomic) BOOL isafterDeng; //YES 表示等号之后点击运算符号 初始化为yes //NO 表示等号之后点击数字输入键盘
等号事件:
//初始化 _isafterDeng = YES; //如果是不是第一次点击运算符 if (_isfirstCaculator) { [self jisuan]; } else { //若是第一次点击运算符 _lablenumber.text = _lablenumber.text; }
在键盘输入事件和运算事件内添加判断是否点击过等号
之前让我们先做一个计算器的归零操作
_isleftOrringt = YES; _isEduitfirst = NO; _isfirstCaculator = NO; _isplus = NO; _ischeng = NO; _ischu = NO; _isjian = NO; _isleftNum = [[NSString alloc] init]; _isresoult = [[NSString alloc] init]; _isresoult = [[NSString alloc] init]; _lablenumber.text = @"0";
在键盘输入事件内:
if (_isafterDeng) {
//若点击过等号,全部初始化 [self Zero:_clearBtn]; _isafterDeng = NO; }
在运算事件内让_isafterDeng = no 即可。让键盘操作知道就行
--------%Demo,+/-Demo
大头都写完了 ,就剩这两个Demo了。这两个也极为简单。看代码:
double zhengfu1 = 0; double zhengfu2 = 0; //_iszhengfu判断点击几次,yes为,一次no为两次 if (_iszhengfu) { zhengfu1 = 0 - [_lablenumber.text doubleValue]; _lablenumber.text = [NSString stringWithFormat:@"%g",zhengfu1]; } else { zhengfu1 = 0 - [_lablenumber.text doubleValue]; zhengfu2 = 0 - zhengfu1; _lablenumber.text = [NSString stringWithFormat:@"%g",zhengfu2]; _iszhengfu = NO; } _isringtNum = _lablenumber.text; if (!_isleft) { _isleftNum = _lablenumber.text; } else { _isringtNum = _lablenumber.text; }
在正负号上编写上要注意:正负号要赋给左值还是右值这点就不需要过多解释,你懂的,bool _isleft判断
double beishu = 0; beishu = [_lablenumber.text doubleValue] / 100; _lablenumber.text = [NSString stringWithFormat:@"%g",beishu]; _isleftNum = _lablenumber.text;
好了,今天到这里吧,谢谢您。
全部源代码:
@interface ViewController () @property (weak, nonatomic) IBOutlet UILabel *lablenumber;//lable值 @property (strong,nonatomic) NSString *isleftNum;//左值 @property (strong,nonatomic) NSString *isringtNum;//右值 @property (strong,nonatomic) NSString *isresoult;//结果 //判断左右值 @property (assign,nonatomic) BOOL isleftOrringt;//YES 为左值 NO为右值 //判断是否为第一次输入 @property (assign,nonatomic) BOOL isEduitfirst;//NO 为第一次写入 YES为不是第一次操作 //判断是否为第一次计算 @property (assign,nonatomic) BOOL isfirstCaculator; //NO 为第一次计算 YES为不是第一次计算 //判断是否为本次运算 //"+" @property (assign,nonatomic) BOOL isplus;//YES 可执行 //"-" @property (assign,nonatomic) BOOL isjian;//YES 可执行 //"*" @property (assign,nonatomic) BOOL ischeng;//YES 可执行 //"/" @property (assign,nonatomic) BOOL ischu;//YES 可执行 @property (weak, nonatomic) IBOutlet UIButton *clearBtn; //+/- @property (assign,nonatomic) BOOL iszhengfu;//YES 第一次点击 NO 第二次点击 //判断是否在等号之后输入又输入数字而不是运算符 @property (assign,nonatomic) BOOL isafterDeng; //YES 表示等号之后点击运算符号 //NO 表示等号之后点击数字输入键盘 @property (assign,nonatomic) BOOL isleft; //判断给左值还是给右值增加正负号 @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; _isleftOrringt = YES; _iszhengfu = YES; _isafterDeng = YES; _isleft = YES; // Do any additional setup after loading the view, typically from a nib. } //键盘操作Demo - (IBAction)Eduit:(UIButton *)sender { NSString *str = @".";//声明一个字符串与_lable值进行比较 NSRange range; if (_isafterDeng) { [self Zero:_clearBtn]; _isafterDeng = NO; } //如果是左值 if (_isleftOrringt) { if (_isEduitfirst) //如果不是第一次则字符串累加 { //range获取_lablenumber.text中"."的个数 range = [_lablenumber.text rangeOfString:str]; //如果输入"." if ([sender.currentTitle isEqualToString:@"."] ) { //若"."的个数小于1个 if (range.length < 1) { //stringByAppendingString 字符串的累加 _lablenumber.text = [_lablenumber.text stringByAppendingString:@"."]; } else if(range.length > 1) { _lablenumber.text = _lablenumber.text; } } else { _lablenumber.text = [_lablenumber.text stringByAppendingString:sender.currentTitle]; } } //如果是第一次操作,则清零 else { //如果输入"."则lable上显示"0." if ([sender.currentTitle isEqualToString:@"."]) { _lablenumber.text = @"0."; } else { _lablenumber.text = sender.currentTitle; } _isEduitfirst = YES; } //赋值给左值 _isleftNum = _lablenumber.text; _isleft = YES; } else { if (_isEduitfirst) //如果不是第一次则字符串累加 { range = [_lablenumber.text rangeOfString:str]; if ([sender.currentTitle isEqualToString:@"."] ) { if (range.length < 1) { _lablenumber.text = [_lablenumber.text stringByAppendingString:@"."]; } else if(range.length > 1) { _lablenumber.text = _lablenumber.text; } } else { _lablenumber.text = [_lablenumber.text stringByAppendingString:sender.currentTitle]; } } //如果是第一次操作,则清零 else { if ([sender.currentTitle isEqualToString:@"."]) { _lablenumber.text = @"0."; } else { _lablenumber.text = sender.currentTitle; } _isEduitfirst = YES; } _isringtNum = _lablenumber.text; _isleft = NO; } } //+/- 运算 - (IBAction)zhengfu:(UIButton *)sender { double zhengfu1 = 0; double zhengfu2 = 0; if (_iszhengfu) { zhengfu1 = 0 - [_lablenumber.text doubleValue]; _lablenumber.text = [NSString stringWithFormat:@"%g",zhengfu1]; } else { zhengfu1 = 0 - [_lablenumber.text doubleValue]; zhengfu2 = 0 - zhengfu1; _lablenumber.text = [NSString stringWithFormat:@"%g",zhengfu2]; _iszhengfu = NO; } _isringtNum = _lablenumber.text; if (!_isleft) { _isleftNum = _lablenumber.text; } else { _isringtNum = _lablenumber.text; } } - (IBAction)baifenhao:(UIButton *)sender { double beishu = 0; beishu = [_lablenumber.text doubleValue] / 100; _lablenumber.text = [NSString stringWithFormat:@"%g",beishu]; _isleftNum = _lablenumber.text; } //运算Demo - (IBAction)Caculator:(UIButton *)sender { _isafterDeng = NO; //如果点击加号事件 if ([sender.currentTitle isEqualToString:@"+"]) { //若是第一次点击运算符 if (_isfirstCaculator) { //注:_isfirstCaculator = no; //若不是第一次点击则直接执行运算 [self jisuan]; } //若是第一次执行运算则把加号运算符状态改为YES //每一次点击运算符把_isleftOrringt = NO;_isEduitfirst = NO;前边我们讲过了,所以此时要转换状态 _isleftOrringt = NO; _isEduitfirst = NO; _isfirstCaculator = YES; _isplus = YES; _ischeng = NO; _ischu = NO; _isjian = NO; } else if ([sender.currentTitle isEqualToString:@"-"]) { if (_isfirstCaculator) { [self jisuan]; } _isleftOrringt = NO; _isEduitfirst = NO; _isfirstCaculator = YES; _isplus = NO; _ischeng = NO; _ischu = NO; _isjian = YES; } else if ([sender.currentTitle isEqualToString:@"*"]) { if (_isfirstCaculator) { [self jisuan]; } _isleftOrringt = NO; _isEduitfirst = NO; _isfirstCaculator = YES; _isplus = NO; _ischeng = YES; _ischu = NO; _isjian = NO; } else if ([sender.currentTitle isEqualToString:@"/"]) { if (_isfirstCaculator) { [self jisuan]; } _isleftOrringt = NO; _isEduitfirst = NO; _isfirstCaculator = YES; _isplus = NO; _ischeng = NO; _ischu = YES; _isjian = NO; } } - (void)jisuan { double resoult = 0; if (_isplus) { resoult = [_isleftNum doubleValue] + [_isringtNum doubleValue]; } else if(_isjian) { resoult = [_isleftNum doubleValue] - [_isringtNum doubleValue]; } else if (_ischeng) { resoult = [_isleftNum doubleValue] * [_isringtNum doubleValue]; } else if (_ischu) { resoult = [_isleftNum doubleValue] / [_isringtNum doubleValue]; } _isfirstCaculator = NO; _isresoult = [NSString stringWithFormat:@"%g",resoult]; _isleftNum = _isresoult; _lablenumber.text = _isresoult; } //等号事件 - (IBAction)deng:(UIButton *)sender { _isafterDeng = YES; if (_isfirstCaculator) { [self jisuan]; } else { _lablenumber.text = _lablenumber.text; } } //归零操作Demo - (IBAction)Zero:(UIButton *)sender { _isleftOrringt = YES; _isEduitfirst = NO; _isfirstCaculator = NO; _isplus = NO; _ischeng = NO; _ischu = NO; _isjian = NO; _isleftNum = [[NSString alloc] init]; _isresoult = [[NSString alloc] init]; _isresoult = [[NSString alloc] init]; _lablenumber.text = @"0"; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。