iOS计算器功能 iOS开发实现计算器功能
Billy Miracle 人气:0想了解iOS开发实现计算器功能的相关内容吗,Billy Miracle在本文为您仔细讲解iOS计算器功能的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:iOS,计算器,下面大家一起来学习吧。
效果图
Masonry
使用数组来自动约束
NSArray *buttonArrayOne = @[_buttonAC, _buttonLeftBracket, _buttonRightBracket, _buttonDivide]; //withFixedSpacing: 每个view中间的间距 //leadSpacing: 左最开始的间距 //tailSpacing:; 右边最后的的间距 [buttonArrayOne mas_distributeViewsAlongAxis:MASAxisTypeHorizontal withFixedSpacing:15 leadSpacing:15 tailSpacing:15]; [buttonArrayOne mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(@(selfHeight - (buttonHeight * 5 + 110))); make.height.equalTo(@(buttonHeight)); }];
对最后一行单独处理
[_buttonZero mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(@15); make.top.equalTo(@(selfHeight - (buttonHeight + 50))); make.width.equalTo(@(buttonWidth * 2 + 15)); make.height.equalTo(@(buttonHeight)); }]; [_buttonZero.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(_buttonOne.titleLabel); }]; //使0的数字对齐
计算部分:
+ (Result)CalculateFor:(char*) formula andLen: (long) length { Result result = {0, 0.0f}; int numberOfDots = 0; int index; int digitsNum = 0; float digits[CALCULATE_MAX_DIGITS]; memset(digits, 0, sizeof(digits)); int optNum = 0; char operator[CALCULATE_MAX_OPERATOR]; memset(operator, 0, sizeof(operator)); int digitNum = 0; char digit[CALCULATE_MAX_DIGIT]; memset(digit, 0, sizeof(digit)); char *p = formula; while (length--) { switch (*p) { case '+': case '-': case '*': case '/': numberOfDots = 0; if (0 == digitNum && '-' == *p) { digit[digitNum++] = *p; } else { if (-1 == digitNum) { //刚计算过括号,符号前可以没有数字读入 } else if (0 == digitNum || CALCULATE_MAX_DIGITS == digitsNum - 1) { result.error = CALCULATE_ERR; return result; } else { digits[digitsNum++] = atof(digit); memset(digit, '\0', sizeof(digit)); } digitNum = 0; operator[optNum++] = *p; } break; case '(': { char *pointer_son; int ExistEnd = 0; pointer_son = ++p; while(length--) { if ('(' == *p) { ExistEnd--; } else if (')' == *p) { ExistEnd++; } if (1 == ExistEnd) { break; } p++; } Result result_son = [self CalculateFor:pointer_son andLen:p - pointer_son]; if (CALCULATE_ERR == result_son.error) { result.error = result_son.error; return result; } digits[digitsNum++] = result_son.value; memset(digit, 0, sizeof(digit)); digitNum = -1; break; } case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '.': digit[digitNum++] = *p; if (numberOfDots == 0 && *p == '.') { numberOfDots = 1; } else if (numberOfDots == 1 && *p == '.') { result.error = CALCULATE_ERR; return result; } break; default: result.error = CALCULATE_ERR; return result; } if (0 == length && 0 < digitNum) { digits[digitsNum++] = atof(digit); memset(digit, 0, sizeof(digit)); digitNum = 0; } p ++; } if (digitsNum != optNum + 1) { result.error = CALCULATE_ERR; return result; } for (index = 0; index < optNum; index ++) { if ('*' == operator[index]) { digits[index + 1] = digits[index] * digits[index + 1]; digits[index] = 0; operator[index] = '?'; } else if ('/' == operator[index]) { if (digits[index + 1] == 0) { result.error = CALCULATE_ERR; return result; } digits[index + 1] = digits[index] / digits[index + 1]; digits[index] = 0; operator[index] = '?'; } } for (index = 0; index < optNum; index ++) { if ('?' == operator[index]) { if (0 == index) { operator[index] = '+'; } else { operator[index] = operator[index - 1]; } } } result.value = digits[0]; for (index = 0; index < optNum; index ++) { if ('+' == operator[index]) { result.value += digits[index + 1]; } else if ('-' == operator[index]) { result.value -= digits[index + 1]; } } return result; }
加载全部内容