作为一个新手,只好拿所有开发者都写的不想写又没有太大难度的计算器来下手咯。比较细一点,耐心哟。

我们都知道,计算器首要任务就是计算,那我们就直接看成A+B=C,来进行分析了。对A,B,C三个对象进行分析。

我们来想象一下真实计算器的操作,首先进行的就是输入了,那我们就先来解决输入问题:

----------键盘的输入

  1. 输入时我们得知道此次输入的值是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 < ) {
//stringByAppendingString 字符串的累加
_lablenumber.text = [_lablenumber.text stringByAppendingString:@"."];
}
else if(range.length > )
{
_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 < ) {
//stringByAppendingString 字符串的累加
_lablenumber.text = [_lablenumber.text stringByAppendingString:@"."];
}
else if(range.length > )
{
_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 < ) {
_lablenumber.text = [_lablenumber.text stringByAppendingString:@"."];
}
else if(range.length > )
{
_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;
} }

- (IBAction)Eduit:(UIButton *)sender

这样我们就完成了键盘操作的Demo

----------运算Demo

这个很简单,会上过小学数学的都会,就不再解释了,上代码。

double resoult = ;
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];
}

- (void)jisuan

我们可以看到有四个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 可执行

BOOL

        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;

[sender.currentTitle isEqualToString:@"-"

if (_isfirstCaculator)
{
[self jisuan];
}
_isleftOrringt = NO;
_isEduitfirst = NO;
_isfirstCaculator = YES;
_isplus = NO;
_ischeng = YES;
_ischu = NO;
_isjian = NO;

[sender.currentTitle isEqualToString:@"*"]

            if (_isfirstCaculator)
{
[self jisuan];
}
_isleftOrringt = NO;
_isEduitfirst = NO;
_isfirstCaculator = YES;
_isplus = NO;
_ischeng = NO;
_ischu = YES;
_isjian = NO;

[sender.currentTitle isEqualToString:@"/"]

  2.经常玩计算器的人都知道,第二次点击运算符时我们要输出结果,点击等号之后我们也要输出结果,上面算法虽然实现了连乘连加等,但是点击等号之后就不行了,因为等号点过之后要是点击运算符则不能进行计算,要是输入数字的话判断不了是否为左值或右值,无法进行正常的运算。

所以我们要也要1.判断运算之前,等号点过了没,如果点过的话  我们就不要进行计算了,2.输入之前判断是否点击过等号,要是点过,就全部初始化,这样就不会出错。此时我们再bool一个,判断点过等号之后用户点击的是运算符还是键盘输入。

@property (assign,nonatomic) BOOL isafterDeng;  //YES 表示等号之后点击运算符号  初始化为yes
//NO 表示等号之后点击数字输入键盘

等号事件:

    //初始化
_isafterDeng = YES;
//如果是不是第一次点击运算符
if (_isfirstCaculator) {
[self jisuan];
}
else
{
//若是第一次点击运算符
_lablenumber.text = _lablenumber.text;

- (IBAction)deng:(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 = @"";

- (IBAction)Zero:(UIButton *)sender

在键盘输入事件内:

    if (_isafterDeng) {
  //若点击过等号,全部初始化
[self Zero:_clearBtn];
_isafterDeng = NO;
}

在运算事件内让_isafterDeng = no  即可。让键盘操作知道就行

--------%Demo,+/-Demo

大头都写完了 ,就剩这两个Demo了。这两个也极为简单。看代码:

double zhengfu1 = ;
double zhengfu2 = ;
//_iszhengfu判断点击几次,yes为,一次no为两次
if (_iszhengfu) {
zhengfu1 = - [_lablenumber.text doubleValue];
_lablenumber.text = [NSString stringWithFormat:@"%g",zhengfu1];
}
else
{
zhengfu1 = - [_lablenumber.text doubleValue];
zhengfu2 = - zhengfu1;
_lablenumber.text = [NSString stringWithFormat:@"%g",zhengfu2];
_iszhengfu = NO;
}
_isringtNum = _lablenumber.text;
if (!_isleft)
{
_isleftNum = _lablenumber.text;
}
else
{
_isringtNum = _lablenumber.text;
}

- (IBAction)zhengfu:(UIButton *)sender

在正负号上编写上要注意:正负号要赋给左值还是右值这点就不需要过多解释,你懂的,bool _isleft判断

    double beishu = ;
beishu = [_lablenumber.text doubleValue] / ;
_lablenumber.text = [NSString stringWithFormat:@"%g",beishu];
_isleftNum = _lablenumber.text;

- (IBAction)baifenhao:(UIButton *)sender

好了,今天到这里吧,谢谢您。

全部源代码:

@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 < ) {
//stringByAppendingString 字符串的累加
_lablenumber.text = [_lablenumber.text stringByAppendingString:@"."];
}
else if(range.length > )
{
_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 < ) {
_lablenumber.text = [_lablenumber.text stringByAppendingString:@"."];
}
else if(range.length > )
{
_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 = ;
double zhengfu2 = ;
if (_iszhengfu) {
zhengfu1 = - [_lablenumber.text doubleValue];
_lablenumber.text = [NSString stringWithFormat:@"%g",zhengfu1];
}
else
{
zhengfu1 = - [_lablenumber.text doubleValue];
zhengfu2 = - 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 = ;
beishu = [_lablenumber.text doubleValue] / ;
_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 = ;
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 = @"";
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} @end

--JSQ_test

初识_IOS-简易计算器-问题总结的更多相关文章

  1. 自制c#简易计算器

    这是一个课堂作业,我觉得作为一个简易的计算器不需要态度复杂的东西,可能还有一些bug,有空再慢慢加强. using System;using System.Collections.Generic;us ...

  2. 剖析简易计算器带你入门微信小程序开发

    写在前面,但是重点在后面 这是教程,也不是教程. 可以先看Demo的操作动图,看看是个什么玩意儿,GitHub地址(https://github.com/dunizb/wxapp-sCalc) 自从微 ...

  3. PHP学习笔记02——简易计算器

    <!DOCTYPE html> <html> <head> <title>PHP简易计算器</title> </head> &l ...

  4. JavaScript之简易计算器

    <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8&quo ...

  5. 菜鸟学习Struts——简易计算器

    这是学习Struts的一个简单的例子文件结构如下: 1.配置Struts环境 2.新建input.jsp,success.jsp,error.jsp input.jsp代码如下: <%@ pag ...

  6. Python之实现一个简易计算器

    自己动手写计算器 一.功能分析 用户输入一个类似这样 3*( 4+ 50 )-(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4) 这样的表达式,假设表达式里 ...

  7. 使用HTML+CSS,jQuery编写的简易计算器

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  8. 使用HTML+CSS,jQuery编写的简易计算器后续(添加了键盘监听)

    之前发布了一款简易的计算器,今天做了一下修改,添加了键盘监听事件,不用再用鼠标点点点啦 JS代码: var yunSuan = 0;// 运算符号,0-无运算;1-加法;2-减法;3-乘法;4-除法 ...

  9. C#Windows Form简易计算器实现(中)

    昨天花了一天的时间弄计算器.也算是做出来了,还是简易的(怀疑猿生!!).在此先感谢昨天被我骚扰的朋友. 先贴一张界面看看 其实健壮性还是挺差的,用户体验也是极差的.比如说用户输入了不合理运算式子,我就 ...

  10. C#Windows Form简易计算器实现(上)

    第一次写博客,来分享一个简易计算器的代码.作为一名准程序员,就是要多写代码才能孰能生巧.重视基础知识才能飞的更快更高以及更稳. 代码可能会写的很糟糕,不完美不安全之处希望发现的越多越好 c#编写计算器 ...

随机推荐

  1. String功能测试

    package foxe; import java.io.IOException;import java.util.StringTokenizer; public class MainClass { ...

  2. SQLSERVER内核架构剖析 (转)

    我们做管理软件的,主要核心就在数据存储管理上.所以数据库设计是我们的重中之重.为了让我们的管理软件能够稳定.可扩展.性能优秀.可跟踪排错. 可升级部署.可插件运行,我们往往研发自己的管理软件开发平台. ...

  3. 二维码生成 - QrCodeNet

    下载QrCodeNet /// <summary> /// 生成QR码 /// </summary> /// <param name="output_path& ...

  4. call()与apply()传参需要注意的一点

    call()与apply()是用来改变函数体内的this指向,第一个参数是调用函数的母对象,他是调用上下文,函数体内通过this来获得对它的引用,换句话说就是第一参数===函数中的this. 但是如下 ...

  5. HDU 5903 - Square Distance [ DP ] ( BestCoder Round #87 1002 )

    题意: 给一个字符串t ,求与这个序列刚好有m个位置字符不同的由两个相同的串拼接起来的字符串 s, 要求字典序最小的答案    分析: 把字符串折半,分成0 - n/2-1 和 n/2 - n-1 d ...

  6. 3、HelloKhala示例说明

    最简单的dome程序只需3行代码 int main() { //设置端口号 InetAddress listenAddr(USER_PORT); //将端口号绑定到Server NodeServer ...

  7. document.cookie

    概念相关: cookie是存于用户硬盘上的一个文件,对应一个域名,当浏览器再次访问这个域名时,便使用这个cookie. cookie 可以跨越一个域名下的多个网页,但不能跨越多个域名使用. cooki ...

  8. Kendo Web UI Grid里时间格式转换

    我和大家分享一下我的kendo的学习心得.如果不好的地方多多包含或者给我留言请看图 kendo里时间格式如图Oder Date列里的格式.但是我们想把时间转换成中国人习惯的格式.如Shipped Da ...

  9. 将less编译成css的gulp插件

    简介:gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:她不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成:使用她,我们不仅可以很愉快的编写代码, ...

  10. Js与Jq 获取浏览器和对象值的方法

    JS and Jquery 都能获取页面元素的宽度,高度和相对位移等数值,那他们之间能相互转换或替代吗,写法又有哪些差异呢?本文将详细为你介绍. 1.Js获取浏览器高度和宽度document.docu ...