结对项目--四则运算图形化最终版
四则运算器图形化最终版
(然而被我做成了奇怪的东西
组员:13070030张博文 13070033刘云峰
一、概念阶段
最初是想试试用android做个计算器app,无奈从零学起着实太赶,而且这个计划在试用了无比卡顿占内存的android studio后就彻底搁浅了。
然后就被路人谣传说MFC好用,无奈从零学起着实太赶,而且这个计划在无人指导的摸黑下也顺手搁浅了。
最终便沦为了EasyX旧传统,好歹有点基础,但果然还是不太甘心。
以及因为当初想做app,所以抠了iphone计算器的图想当UI,结果就顺延地用到了最后,做完才发现成品跟老师的要求略有差池
因为根本就没让做普通的计算器。。。。
顺便一说长这样
二、执行阶段
上一个姑且算是个答题器才对,主要包含了从文件按行读取预先写好的算式,然后中缀转后缀,再进行后缀表达式求值,最后根据用户输入的数值进行比对给出结果。
然而我做着做着就跑偏了,做成了用户在图形化界面输入一个算式,然后按下等号,就会在后面出现相应的结果(A REALLY CALCULATOR!!)
演示起来大概就是这样:
输入式子并点击等于生成结果→
顺便一说刚才截图的时候发现原来我的中缀转后缀有问题导致结果有错,因为我的后缀表达式求值是根据中缀转后缀时用空格分隔操作数和计算符来识别的,结果因为空格生成位置问题导致两个计算符之间缺个空格结果答案就崩溃了,不过我已经机智的修复了(不过当初选择空格这个解决方法还真是弱智又粗暴)
string Transform(string bef){ //中缀转后缀并加入标示予以区分内部成分 string aft; stack<char> str; int i=0; while (bef[i] != '='){ switch (bef[i]){ case '-': case '+': aft = aft + ' '; while (!str.empty() && str.top() != '('){ aft = aft + str.top(); str.pop(); aft = aft + ' '; } str.push(bef[i]); break; case '*': case '/': aft = aft + ' '; if (!str.empty()){ while (str.top() == '*' || str.top() == '/' ){ aft = aft + str.top(); str.pop(); aft = aft + ' '; if (str.empty()) break; } } str.push(bef[i]); break; case '(': str.push(bef[i]); break; case ')': if (!str.empty()){ while (str.top() != '('){ aft = aft + ' '; aft = aft + str.top(); str.pop(); } } if (str.top() == '(') str.pop(); else{ cout << "算式错误,缺少左括号"; exit(1); } break; default: aft = aft + bef[i]; break; } i++; } aft = aft + ' '; while (!str.empty()){ aft = aft + str.top(); str.pop(); aft = aft + ' '; } aft = aft + '#'; return aft; }
三、执行阶段Ver2.0
恍然大悟的时刻到来了,我突然意识到,说好的出题呢??这玩意跟出题毫无瓜葛啊!!于是我转念一想,顺手改装了一下做成了答题器和计算器二合一终极版
这是一个简单的选择界面,恩,我用画图画的
然后鼠标左键点击计算器或答题器便进入相应界面
计算器: 答题器: 区别在于计算器界面的左右括号按钮改为了±(其实也可以用减号代替)
细心的同学就会发现,答题器界面居然有算式??是的,这就是综合了上一个四则运算程序,外加新增的出题函数的新版本
string Create(int size,int sum){ srand((unsigned)time(NULL)); float dec = 0; int inte = 0; int sel = 0; int sel1 = 0; string quiz; char temp[100]; int cases = 0; bool lock = false; for (int i = 0; i < sum; i++){ for (int j = 0; j < size; j++){ dec = rand() % 100; dec = dec / 100; inte = rand() % 5+1; //随机生成一个整数 dec = dec + inte; //随机生成一个小数 sel = rand() % 4; //随机生成一个用于判断情况的数0123 sel1 = rand() % 4; switch (cases){ case 0: //初始部分 if (sel>1){ if (sel > 1) sprintf(temp, "%.2f", dec); //生成小数 else sprintf(temp, "%d", inte); //生成整数 quiz += temp; cases = 1; } else{ quiz += '('; //生成左括号 lock = true; cases = 3; } break; case 1: //前一个输出的是数 if (sel == 0) quiz += '+'; if (sel == 1) quiz += '-'; if (sel == 2) quiz += '*'; if (sel == 3) quiz += '/'; cases = 2; break; case 2: //前一个输出的是符号 if (sel1 > 1 && lock == false){ quiz += '('; lock = true; cases = 3; break; } if (sel > 1) sprintf(temp, "%d", inte); //生成整数 else sprintf(temp, "%.2f", dec); //生成小数 quiz += temp; cases = 1; if (sel1 <2 && lock == true){ quiz += ')'; lock = false; } break; case 3: if (sel > 1) sprintf(temp, "%d", inte); //生成整数 else sprintf(temp, "%.2f", dec); //生成小数 quiz += temp; if (sel == 0) quiz += '+'; if (sel == 1) quiz += '-'; if (sel == 2) quiz += '*'; if (sel == 3) quiz += '/'; cases = 2; break; } temp[0] = '\0'; } if (cases == 3){ sel = rand() % 2; if (sel > 0) sprintf(temp, "%d", inte); //生成整数 else sprintf(temp, "%.2f", dec); //生成小数 quiz += temp; if (sel == 0) quiz += '+'; if (sel == 1) quiz += '-'; if (sel == 2) quiz += '*'; if (sel == 3) quiz += '/'; sel = rand() % 2; if (sel > 0) sprintf(temp, "%d", inte); //生成整数 else sprintf(temp, "%.2f", dec); //生成小数 quiz += temp; } if (lock == true){ quiz += ')'; lock = false; } temp[0] = '\0'; cases = 0; quiz = quiz + '=' + '\n'; } return quiz; }
答题器演示:
输入答案: 回答错误(会显示正确答案): 回答正确:
其他的类似于后缀表达式求值或者图形界面的代码就不一一列举了,不过果然还是想做一个app。。。。
附上组员合照:
2016-04-11