• 初识_IOS-简易计算器-问题总结


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

    我们都知道,计算器首要任务就是计算,那我们就直接看成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 < 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;
        }
        
        
        
        
    }
    - (IBAction)Eduit:(UIButton *)sender

    这样我们就完成了键盘操作的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];
        }
    - (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 = @"0";
    - (IBAction)Zero:(UIButton *)sender

    在键盘输入事件内:

        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;
        }
    - (IBAction)zhengfu:(UIButton *)sender

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

        double beishu = 0;
        beishu = [_lablenumber.text doubleValue] / 100;
        _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 < 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
    --JSQ_test
  • 相关阅读:
    流体布局、响应式布局
    CSS
    表格的合并
    HTML
    http请求与响应
    MySQL存储引擎
    MySQL之索引以及正确使用索引
    MySQL之视图、触发器、存储过程、函数、事务、数据库锁
    MySQL之正则表达式
    MySQL练习题
  • 原文地址:https://www.cnblogs.com/IT-jqm/p/IT_JQm_test.html
Copyright © 2020-2023  润新知