效果图
Masonry
使用数组来自动约束
NSArray *buttonArrayOne = @[_buttonAC, _buttonLeftBracket, _buttonRightBracket, _buttonDivide];
[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);
}];
计算部分:
+ (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;
}
|