---恢复内容开始---
1,完成了功能一,基本支持四则运算,该功能之前就有,就不贴代码了。详情看前面作业。
2,新增了实现括号功能,支持随机生成括号并运算,下面附带改变代码。
下面的代码,rand()%5+1生成1-5之间的随机整数,然后能选择所有的括号类型。
1 switch(rand()%5) 2 { 3 4 case 1: s = "("+itos(n1)+ope[op1]+itos(n2)+")"+ope[op2]+itos(n3)+ope[op3]+itos(4);break; 5 case 2: s = "("+itos(n1)+ope[op1]+itos(n2)+ope[op2]+itos(n3)+")"+ope[op3]+itos(4);break; 6 case 3: s = itos(n1)+ope[op1]+"("+itos(n2)+ope[op2]+itos(n3)+")"+ope[op3]+itos(4);break; 7 case 4: s = itos(n1)+ope[op1]+"("+itos(n2)+ope[op2]+itos(n3)+ope[op3]+itos(4)+")";break; 8 case 5: s = "("+itos(n1)+ope[op1]+itos(n2)+")"+ope[op2]+"("+itos(n3)+ope[op3]+itos(4)+")";break; 9 10 }
1 void convert2RPN(string &s) { 2 stringstream ss; 3 stack<char> stk; 4 for (size_t i = 0; i < s.length(); i++) { 5 if (isdigit(s.at(i))) { 6 ss << s.at(i); 12 } 13 else { 14 if (stk.empty()) { 15 stk.push(s.at(i)); 16 } 17 else { 18 switch (s.at(i)) { 19 case '(': 20 stk.push(s.at(i)); 21 break; 22 case ')': 23 24 while (stk.top() != '(') { 25 ss << stk.top(); 26 stk.pop(); 27 } 28 stk.pop(); 29 break; 30 case '+': 31 case '-': 32 33 while (!stk.empty() && stk.top() != '(') { 34 ss << stk.top(); 35 stk.pop(); 36 } 37 stk.push(s.at(i)); 38 break; 39 case '*': 40 case '/': 41 42 while (!stk.empty() && (stk.top() == '*' || stk.top() == '/')) { 43 ss << stk.top(); 44 stk.pop(); 45 } 46 stk.push(s.at(i)); 47 break; 48 } 49 } 50 } 51 } 52 53 while (!stk.empty()) { 54 ss << stk.top(); 55 stk.pop(); 56 } 57 s = ss.str(); 58 }
上面代码可以看出,我在堆栈里加入了和括号相关的内容。当栈顶不是“(”时,元素一直出栈,直到遇到栈顶“("时,”(”)“同时出栈。
3.实现批量出题功能。
部分相关代码如下:
1 int main() 2 { 3 char ope[4]={'+','-','*','/'}; 4 int sumsoc = 0; 5 int n ; 6 cout<<"请输入出题的数量"; 7 cin>>n; 8 int sn = n; 9 while(n--) 10 { 11 srand(time(NULL)+n); 12 int ssn = sn - n; 13 cout<<"当前第"<<ssn<<"道题: "; 14 15 string s; 16 int soc; 17 int n1,n2,n3,n4,op1,op2,op3; 18 n1 = num(); 19 n2 = num(); 20 n3 = num(); 21 n4 = num(); 22 op1 = fh(); 23 op2 = fh(); 24 op3 = fh(); 25 soc = sqrt(n1+n2+n3+n4)*(op1+op2+op3); 26 switch(rand()%5) 27 { 28 29 case 1: s = "("+itos(n1)+ope[op1]+itos(n2)+")"+ope[op2]+itos(n3)+ope[op3]+itos(4);break; 30 case 2: s = "("+itos(n1)+ope[op1]+itos(n2)+ope[op2]+itos(n3)+")"+ope[op3]+itos(4);break; 31 case 3: s = itos(n1)+ope[op1]+"("+itos(n2)+ope[op2]+itos(n3)+")"+ope[op3]+itos(4);break; 32 case 4: s = itos(n1)+ope[op1]+"("+itos(n2)+ope[op2]+itos(n3)+ope[op3]+itos(4)+")";break; 33 case 5: s = "("+itos(n1)+ope[op1]+itos(n2)+")"+ope[op2]+"("+itos(n3)+ope[op3]+itos(4)+")";break; 34 35 } 36 cout << s+" "+"="+" "; 37 convert2RPN(s); 38 double res1 = calculateRPN(s); 39 cout<<res1; 40 cout<<" "<<"难度值:"<<" "<<soc<<endl; 41 }
才开始调试的时候,发现所有的题都是出的一样的,后来才找到原因。因为控制随机的是srand(time(NULL);如果程序运行很快的话,系统时间相当于没改变,这个函数会得到相同的结果,所有关于随机的全部失效,得到相同结果,后来改成srand(time(NULL)+n);因为n在每次循环后是不一样的。
功能四没做出来。以后继续做。
————————————————————————————————————————————————————————————
结对编程体会。
一开始找我结对,其实我是拒绝的,因为我和李权,所用的编程语言不一样,他用java,我用c和c++。所谓道不同不相为谋。
后来李权的诚心让我打动了,虽然编程语言不同,但是思想是相通的。
于是就这样,我俩走上了结对编程的道路。
说实话,一开始合作编程,效率不高,因为他总是跟我在一些无关紧要的问题上争论,比如我喜欢if()后面的大括号再起一行写,他分要说要紧跟着写,不然他看不懂。
后来,他渐渐话少了,然后我们都效率提高了,有时候我问他我不会的问题,虽然他也不会,但能帮我搜,还能一块讨论不懂的问题,一段时间后,我感觉我的团队意识增强了。