2017年软件工程第四次作业-3四则运算
one
要求1 參考《構建之法》第4章兩人合作,結對編程上述功能,要求每人發布隨筆1篇 (代碼是共同完成的,博客是分別完成的)。 (1) 給出每個功能的重點、難點、編程收獲。(2)給出結對編程的體會,以及 (3) 至少5項在編碼、爭論、復審等活動中花費時間較長,給你較大收獲的事件。
???(1).給出每個功能的重點、難點、編程收獲。
????? 功能一的重點難點我感覺是隨機數的產生以正確算數。
????? 功能二的重點難點是后波蘭表達式、堆棧的實現。
????? 功能三的重點難點是限定題目數量,避免重復打印,還要工整輸出。
????? 功能四的重點難點是分數參與運算,得到女神青睞。
????? 我的編程收獲是:首先看見四則運算就要想起來用棧來實現,分別有兩個棧,算數棧和算符棧。然后如何去讀取。其次就是涉及到四則運算就一定要用到運算符,運算符是有優先級的,就要想辦法對算符優先級進行比較,再決定哪個運算符進棧哪個運算符直接參與運算。最后就是逆波蘭表達式和堆棧問題,雖然此處我沒有寫出來,參考了別人的代碼,但是我對這個知識點也有了更省的了解。這就是我這次編程的收獲。
?(2).結對編程的體會:
???????? 首先我在結對編程之前先讀了《構建之法》第四章兩人合作這一部分知識,讓我更好的理解了結對編程的意義。鄒欣老師說,在結對編程中,任何一段代碼都至少被兩雙眼睛看過,被兩個腦袋思考過,結對編程避免了“我的代碼”還是“他的代碼”的問題,使而整個代碼的責任不屬于某個人,而是屬于兩個人,進而屬于整個團隊。還有結對編程中駕駛員和領航員的角色要經常互換,避免長時間緊張工作而導致的觀察力和判斷力下降。所以我認為結對編程還是很有必要的,對于一個好性能的軟件或者程序,我感覺結對編程是不可缺少的。
????? 和我結對編程的是黃澤宇同學,我們兩個互相監督完成了這次的作業。雖然說有些代碼是我們兩個從別人那里參考過來的,但是我們也是一起對代碼進行理解。謝謝黃澤宇同學對我提出的疑問耐心解答,對我不會的知識點進行講解,也因為黃澤宇同學的幫助和指導,我們的程序才會更好的運行出來。
(3).至少5項在編碼、爭論、復審等活動中花費時間較長,給你較大收獲的事件。
???? ?功能一的實現我們兩個花費了不少時間,因為功能一相對于其他功能是比較基礎的一個功能,我們在編碼中就用了不少時間,基本功能總是實現不了,我們兩個就開始百度或者查閱資料,比如在數據結構課本中再研究用棧來完成四則運算,是怎么讀取算數和算符,棧指針如何進行操作,讓我有較大的收獲。在功能二中逆波蘭表達式中也花費了不少時間,因為這個功能我們兩個實現不了,但是也掙扎過,查資料百度,然后試著理解編寫,但是也以失敗告終,最后還是用了大量時間從別人代碼里參考出來再用在自己的代碼里,使其功能能運行出來。其中我們兩個在限定題目數量和給出出題范圍中也花費了不少時間,功能一直實現不了,我們還是邊討論別查資料,總之道路還是很坎坷的哈哈。最后在代碼復審中,還是沒有完成老師規定的輸出格式,也花費不少時間來進行代碼規范,代碼規范應該是沒有問題的,我和黃澤宇會繼續努力的完善代碼。
要求2 給出照片1張,包括結對的2位同學、工作地點、計算機,可選項包括其他能表達結對編程工作經歷的物品或場景。
??????? 下面是我和黃澤宇同學一起結對編程的照片:
two
功能1. 四則運算?,支持出題4個數的四則運算題目,所有題目要求作者有能力正確回答
(提示:1/3 != 0.33333333333333333333333333333333,而是無限長)。
???? 功能1運行截圖:
功能2. 支持括號
功能3. 限定題目數量,"精美"打印輸出,避免重復
功能4. 支持分數出題和運算
功能2要求支持括號,我寫不出來逆波蘭式算法,我和黃澤宇從網上扒下來用在自己程序里了。
運行截圖如下:
three
??? 四則運算的實現需要用到棧來實現,運算式求值的核心思想:將運算式逐字符讀取,在這個讀取的過程中首先要先判斷是算符還是算數,如果是算符的話,就與算符棧站定元素進行優先級比較,如果優先級高,則進棧,否則就進行運算,如果是算數,則入算數棧。
?1.?本程序用了兩個棧,分一個為char類型存儲運算符,一個為float類型存儲算數。定義了四個棧指針分別是?
???????????????????????????????????????????????? SC *Push(SC *s, char c);? //使算符c進入算符棧
???????????????????????????????????????????????? SF *Push(SF *s, float f)?;?//使算數f進入算數棧
?????????????????????????????????????????????????SC *Pop(SC *s);????????????? //使算符棧的棧頂元素出棧
???????????????????????????????????????????????? SF *Pop(SF *s)?;????????????? //使算數棧的棧頂元素出棧
?
代碼如下:
?
?
SC *Push(SC *s, char c) {SC *p = (SC*)malloc(sizeof(SC));p->c = c;p->next = s;return p; } SF *Push(SF *s, float f) {SF *p = (SF*)malloc(sizeof(SF));p->f = f;p->next = s;return p; } SC *Pop(SC *s) {SC *q = s;s = s->next;free(q);return s; } SF *Pop(SF *s) {SF *q = s;s = s->next;free(q);return s; }2.對算數運算符的操作。
a.首先列出優先級關系,運算符支持+ - * /,#為結束符。
???????????? +??? -??? *??? /??? (???? )???? # ????
?????? +??? >??? >? ?<???<?? <? ?>? ?? >
?????? -???? >??? >?? <?? <?? <?? >??? ?>
?????? '?????>????>??? >?? >?? <?? >??? >
?????? /???? >????>??? >?? >?? <?? >??? >
?????? (??? <??? <??? <???<??? <?? =
?????? )??? >??? >??? >?? >?????????>?? ?>
??????#??? <??? <??? <?? <??? <???????? =
?
unsigned char Prior[7][7] = { '>', '>', '<', '<', '<', '>', '>','>', '>', '<', '<', '<', '>', '>','>', '>', '>', '>', '<', '>', '>','>', '>', '>', '>', '<', '>', '>','<', '<', '<', '<', '<', '=', ' ','>', '>', '>', '>', ' ', '>', '>','<', '<', '<', '<', '<', ' ', '=',};b.判斷是不是運算符, 判斷Test字符是否在運算符集里,返回是或者不是。
Status In(char Test, char *TestOp) {int Find = false;for (int i = 0; i< OPSETSIZE; i++){if (Test == TestOp[i])Find = true;}return Find; }c.判斷哪個是運算符,返回運算符在運算符集里的位置.
Status ReturnOpOrd(char op, char *TestOp) {for (int i = 0; i< OPSETSIZE; i++){if (op == TestOp[i])return i;} }d.判斷兩個算符的優先級,返回><=
char precede(char Aop, char Bop) {return Prior[ReturnOpOrd(Aop, OPSET)][ReturnOpOrd(Bop, OPSET)]; }3,求解運算式。 設OPTR和OPND分別為運算符棧和運算數棧,OP為運算符集合。??
float EvaluateExpression(char* MyExpression) { SC *OPTR = NULL; SF *OPND = NULL; char TempData[20];float Data, a, b;char theta, *c, Dr[] = { '#', '\0' };OPTR = Push(OPTR, '#');c = strcat(MyExpression, Dr);strcpy(TempData, "\0"); while (*c != '#' || OPTR->c != '#'){if (!In(*c, OPSET)){Dr[0] = *c;strcat(TempData, Dr); c++;if (In(*c, OPSET)){Data = atof(TempData); OPND = Push(OPND, Data);strcpy(TempData, "\0");}}else {switch (precede(OPTR->c, *c)){case '<': OPTR = Push(OPTR, *c);c++;break;case '=': OPTR = Pop(OPTR);c++;break;case '>': theta = OPTR->c; OPTR = Pop(OPTR);b = OPND->f; OPND = Pop(OPND);a = OPND->f; OPND = Pop(OPND);OPND = Push(OPND, Operate(a, theta, b));break;} //switch }} //while return OPND->f; }4.主函數。
int main() {srand((int)time(NULL)); int num1, num2, num3, num4, count, n, change, amount, shuchu, range, j, repeat = 0, bracket, proper_fs, right = 0, wrong = 0;string str_num1, str_num2, temp;float Answer, InputAns;cout << "Let's do the math. Be sure to follow the requirements. Come on!" << endl;cout << "All right, are you ready?" << endl;cout << "Is there a multiplication and division?1:YES,0:NO:" << endl;cin >> n;cout << "Are there parentheses?1:YES,0:NO:" << endl;cin >> bracket;cout << "Is there a proper fraction?1:YES,0:NO:" << endl;cin >> proper_fs;cout << "Please enter a numeric range:" << endl;cin >> range;cout << "Please enter the number of questions:" << endl;cin >> amount;string Equation[1000];char symbol;cout << "OK, let's get started:" << endl;for (int i = 0; i<amount; i++){//count = random() % 3 + 2;count = 4;str_num1 = create_num(proper_fs, range);str_num2 = create_num(proper_fs, range);symbol = create_symbol(n);Equation[i] = combination(str_num1, str_num2, symbol);if (count>2){for (count; count > 2; count--){symbol = create_symbol(n);str_num1 = Equation[i];if (bracket == 1){change = random() % 3;if (change == 0){str_num1 = '(' + str_num1 + ')';}}symbol = create_symbol(n);str_num2 = create_num(proper_fs, range);change = random() % 2;if (change == 0){temp = str_num1;str_num1 = str_num2;str_num2 = temp;}Equation[i] = combination(str_num1, str_num2, symbol);}}for (j = 0; j < i; j++){if (Equation[j] == Equation[i]){i = i - 1;repeat = 1;break;}}if (repeat != 1){cout << Equation[i] << "=";cin >> InputAns;Answer = get_ans(Equation[i]);Answer *= 100;int temp = (int)Answer;Answer = ((double)temp) / 100.00;if (InputAns == Answer){cout << "Correct answer!";right++;}else{cout << "Wrong answer!The correct answer is:";cout << setprecision(2) << fixed << Answer;wrong++;}cout << endl;}}cout << "You answer the correct number is " << right << ",You answer the wrong number is " << wrong << endl <<endl;system("pause");}
four
要求3 使用coding.net做版本控制。checkin 前要求清理 臨時文件、可執行程序,通常執行 build-clean可以達到效果
版本控制:
https://coding.net/u/MingZi-/p/f4-/git/tree/master
?
?
?
??????????????????????????????????????
?
?
?
?????
?
轉載于:https://www.cnblogs.com/Mingezi/p/7643708.html
總結
以上是生活随笔為你收集整理的2017年软件工程第四次作业-3四则运算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 将某个目录下的所有文件进行压缩
- 下一篇: Git undo 操作