iOS開發(fā)實(shí)現(xiàn)計(jì)算器功能
本文實(shí)例為大家分享了iOS實(shí)現(xiàn)計(jì)算器功能的具體代碼,供大家參考,具體內(nèi)容如下
效果圖

Masonry
使用數(shù)組來(lái)自動(dòng)約束
NSArray *buttonArrayOne = @[_buttonAC, _buttonLeftBracket, _buttonRightBracket, _buttonDivide];
//withFixedSpacing: 每個(gè)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));
}];
對(duì)最后一行單獨(dú)處理
[_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的數(shù)字對(duì)齊
計(jì)算部分:
+ (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) {
//剛計(jì)算過(guò)括號(hào),符號(hào)前可以沒(méi)有數(shù)字讀入
} 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;
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
設(shè)計(jì)模式中的迭代器模式在Cocoa Touch框架中的使用
這篇文章主要介紹了設(shè)計(jì)模式中的迭代器模式在Cocoa Touch框架中的使用,示例代碼為傳統(tǒng)的Objective-C,需要的朋友可以參考下2016-03-03
iOS自定義UICollectionViewLayout實(shí)現(xiàn)瀑布流布局
這篇文章主要為大家詳細(xì)介紹了iOS自定義UICollectionViewLayout實(shí)現(xiàn)瀑布流布局,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12
iOS11 WKWebView 無(wú)法加載內(nèi)容的解決方法
這篇文章主要介紹了iOS11 WKWebView 無(wú)法加載內(nèi)容,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11
iOS開發(fā)中Swift3 監(jiān)聽(tīng)UITextView文字改變的方法(三種方法)
在項(xiàng)目中使用文本輸入框出UITextField之外還會(huì)經(jīng)常使用 UITextView ,難免會(huì)有需求監(jiān)聽(tīng)UITextView文本框內(nèi)文本數(shù)量.下面介紹在swift3中兩種常用方式,需要的朋友參考下吧2016-11-11
iOS利用AFNetworking3.0——實(shí)現(xiàn)文件斷點(diǎn)下載
這篇文章主要介紹了iOS利用AFNetworking3.0——實(shí)現(xiàn)文件斷點(diǎn)下載,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-01-01
iOS10實(shí)現(xiàn)推送功能時(shí)的注意點(diǎn)和問(wèn)題總結(jié)
很多朋友都反饋,發(fā)現(xiàn)了iOS9升級(jí)到iOS10推送功能不正常的問(wèn)題,所以這篇文章總結(jié)了一下要點(diǎn),親們可以根據(jù)以下步驟,逐步排查問(wèn)題,也可以逐步實(shí)現(xiàn)iOS10的推送功能。下面來(lái)一起看看吧。2016-09-09
IOS中無(wú)限滾動(dòng)Scrollview效果
這篇文章主要為大家詳細(xì)介紹了IOS中無(wú)限滾動(dòng)Scrollview效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-02-02

