四則運算式自動生成
四則運算式自動生成
0.題目
我們在剛開始上課的時候介紹過一個小學四則運算自動生成程序的例子,請實現它,要求:
· 能夠自動生成四則運算練習題
· 可以定制題目數量
· 用戶可以選擇運算符
· 用戶設置最大數(如十以內、百以內等)
· 用戶選擇是否有括號、是否有小數
· 用戶選擇輸出方式(如輸出到文件、打印機等)
· 最好能提供圖形用戶界面(根據自己能力選做,以完成上述功能為主
1.前言
這次工程是結對編程,我是駕駛員角色,顧同學是領航員角色。
代碼地址: 四則運算式自動生成
2.需求分析
從題目可以大概了解到面向的服務群體是老師,小學生,和學生家長等,是一個自動生成小學四則運算的程序。考慮到小學生是為了課後練習,提高計算能力,所以還需要顯示答案
3.產品設計
根據這個題目,做一下簡單的產品設計,用戶可以輸入題目數量
。
然後選擇運算符
,由於是服務群體是小學,所以考慮加減乘除四個運算符。
用戶根據自身水品,選擇所要生成的運算範圍,所以需要有一個最大值
和最小值
的輸入,這個可以考慮負數的情況。
用戶進階可以選擇小數運算
和多項式運算
,這裏考慮用兩個開關來控制。
計算自動生成的運算式的結果
,供用戶參考。
暫時就先考慮這麽些。
4.編碼
這裏就簡單介紹一下我們的思路和主要方法,代碼源碼已提供,具體方法功能都有註釋,需求請在上方鏈接自取。
下面是我們的思路:
1.首先,我們把四則運算分為了三種,整數型運算式
,小數型運算式
和整數多項式
。
2.然後就是分別考慮這三種情況,這裏我講解一下小數型運算式
我們的思路,關於隨機小數的生成,我們采用了隨機整數拼接小數點在拼接隨機0到9的方法,這樣可以得到隨機一位小數,然後將用戶所選擇的不同運算符存入數組,進行隨機運算符,最後就是簡單的拼接小數與運算符達到自動生成小數型運算式的目的。
//生成隨機小數
- (float)decimal:(int)maxNum min:(int)minNum{
int first;
int second;
first = [self getRandomNumber:minNum to:maxNum];
second = [self getRandomNumber:0 to:10];
decimal = [NSString stringWithFormat:@"%d.%d",first,second];
return [decimal floatValue];
}
//小數四則運算
- (void)decimalArithmetic{
int temp;
float first;
float second;
NSString *string;
NSString *key;
DecimalNumber *decimalNumber = [[DecimalNumber alloc]init];
_dic = [NSMutableDictionary dictionary];
for (int i=0; i<count; i++) {
//生成隨機運算符
temp = [self getRandomNumber:0 to:(int)signArray.count-1];
//NSLog(@"temp is %d",temp);
//生成隨機小數
first = [decimalNumber decimal:maxValue min:minValue];
second = [decimalNumber decimal:maxValue min:minValue];
NSLog(@"(%.1f) %@ (%.1f)",first,[signArray objectAtIndex:temp],second);
string = [NSString stringWithFormat:@"(%.1f) %@ (%.1f)",first,[signArray objectAtIndex:temp],second];
key = [NSString stringWithFormat:@"%d",i];
[_dic setValue:string forKey:key];
}
}
3.關於求和,我們將隨機生成的運算式存入了字典類型,並將運算結果也存入了字典類型。
//運算式存入_dic字典
NSLog(@"%d %@ %d",first,[signArray objectAtIndex:temp],second);
string = [NSString stringWithFormat:@"%d %@ %d",first,[signArray objectAtIndex:temp],second];
key = [NSString stringWithFormat:@"%d",i];
[_dic setValue:string forKey:key];
//運算式結果存入_answerDic字典
NSString *sign = [NSString stringWithFormat:@"%@",[signArray objectAtIndex:temp]];
//計算運算結果函數
answer = [self answerFirst:first Sign:sign Second:second];
NSString *strAnswer = [NSString stringWithFormat:@"%d",answer]; [_answerDic setValue:strAnswer forKey:key];
4.展示部分,我們選擇了常見的tableview去展示運算式,當用戶點擊運算式,便可以得到正確答案。
關於這個展示部分我不得不多說兩句,這裏我寫完展示代碼之後卻一直沒有效果,展示的內容不是應該輸出的運算式而是一片空白,我一直調試到深夜,最後我才發現我將tableview定義了兩次,給tableview傳值之後又重新定義了一次。。。哇,我是在用生命寫bug。。。
5.測試
這裏就交給了我的導航員了,想看bug請移步--->我寫的代碼怎麽可能有bug之燙燙燙燙
6.成果展示
啟動動畫
正常輸入
小數式生成
多項式生成
計算結果
輸入異常處理
運算符異常處理
最值異常處理
6.對領航員的評價
這次的結對編程較之上次,合作關系更為緊密,雖然自己之前也有過結對編程的經驗,全是男的啊,怎麽能跟女生相提並論呢,2333,開個玩笑。所以評價談不上,更貼切的詞語應該是感謝吧,我的結對夥伴----顧同學,初期邀請我為結對夥伴,讓我脫離了沒有結對夥伴的尷尬境地,中期一起進行的需求分析,產品設計,代碼編寫,尤其是測試部分,都給予了很多幫助,比如,編寫代碼時當我實現了某個功能而沾沾自喜時,能夠真心的與我體會快樂,而不是潑冷水;當我為某個實現低頭懊惱,她能為我加油鼓勁,轉移我的負面情緒,當然,不僅限於此,也檢測出了代碼的很多bug,頁面的適配問題,輸入異常值的崩潰,而且UI方面也提供了很多建議,應用開啟閃屏圖片的挑選,界面的整體布局,顏色的搭配...諸如此類,不勝枚舉。整個工程在這樣積極的氛圍中提前完成了,也完成了最後一次結對作業,最後再次感謝顧同學,謝謝。
7.總結
這次的工程整個過程還是相當愉快的,因為之前有開發的基礎,所以這個項目對我來說難度不是很大。一些學習經驗在這個工程中也得到了良好的應用,之前的開發中自己作為一個被動者,雖然在一些前輩的引導下一直規範自己,但一直對一些軟件工程方面的理解不是很到位,這次自己轉被動為主動,對這些知識有了深刻的理解,為什麽必須先進行項目需求分析,是為了化抽象為客觀,不僅編碼時有助於梳理自己的思路,而且系統設計時也能考慮到一些可能的變更預留接口;編碼過程中應及時註釋而不是整個工程完畢之後再寫,不僅可以及時定位方法函數,而且可以記錄自己的一些靈感;開發工程中及時上傳Git,防止一些不可預估原因導致前功盡棄等等。路漫漫其修遠兮,吾努力當加之。
四則運算式自動生成