结对编程:四则运算。组员:闫浩楠 杨钰宁 开发语言:C语言
需求分析:1.能够自动出题并给出答案
2.包含“+,—,*,/,()” 的四则运算。
3.显示题目的答案
结构设计:1.自动出题用随机数生成语句实现:包括随机生成数字、运算符号和题目长度
2.用变量约束左右括号顺序和同时存在的特点。
3.将题目输出并用字符串存储。
4.对字符串入栈进行运算。
部分核心代码:
随机生成题目长度:
a=rand()%+;
for(i=0;i<a;i++)
{
……
}
随机生成数字及符号:
c=rand()%+; //数字
printf("%d",c);
b=rand()%4; //符号
switch(b)
{
case 0: printf("+"); math[m]='+';m++;
if(i<a-3&&j==10) b=10;
else b=rand()%4; break;
case 1: printf("-"); math[m]='-';m++;
if(i<a-3&&j==10) b=10;
else b=rand()%4; break;
case 2: printf("*"); math[m]='*';m++;
if(i<a-3&&j==10) b=10;
else b=rand()%4; break;
case 3: printf("/"); math[m]='/';m++;
b=20; break;
}
if(b==10)
{
printf("(");
math[m]='(';m++;
j=3;
b=rand()%4;
}
if(j!=10)
j--;
if(j==0){
printf(")");
math[m]=')';
m++;
b=rand()%3;
j=10;
}
利用栈对表达式进行计算:
采用符号优先值对五种运算符号进行控制。
while(c!='='||x!='=') //循环处理表达式中的每一个字符
{
if(isOperator(c)) //如果是运算符
{
if(flag){
seqStackPush(StackData,q); //表达式入栈
q=; //操作数清零
flag=; //标志清零,表示操作数已经入栈
}
switch(PRI(x,c)) //判断运算符优先级
{
case -:
seqStackPush(StackOper,c); //运算符进栈
c=exp[i++];
break;
case :
c=seqStackPop(StackOper); //运算符括号,等号出栈,被抛弃
c=exp[i++]; //取下一个 字符
break;
case :
oper=seqStackPop(StackOper); //运算符出栈
b=seqStackPop(StackData);
a=seqStackPop(StackData); //两个操作数出栈
t=Calc(a,oper,b); //计算结果
seqStackPush(StackData,t); //将运算结果入栈
break; }
}else if(c>=''&&c<='') //如果输出的字符在0到9之间
{
c-=''; //把字符转换成数字
q=q*+c; //多位数的进位处理 c=exp[i++]; //取出下一位字符
flag=; //设置标志,表示操作数未入栈
}
else {
printf("输入错误\n");
getch();
exit();
}
x=seqStackPeek(StackOper); //获取栈顶操作符
}
q=seqStackPop(StackData);
seqStackfree(StackOper);
seqStackfree(StackData); //释放内存占用空间
return q; //出栈,返回结果 }
优先值的判定:
int PRI(char oper1,char oper2)
{
int pri;
switch(oper2) //判断优先级
{
case '+':
case '-':
if(oper1=='('||oper1=='=') //为左括号
pri=-; //oper1<oper2
else
pri=; //oper1>oper2
break;
case '*':
case '/':
if(oper1=='*'||oper1=='/'||oper1==')')
pri=; //oper1>oper2
else
pri=-; //oper1<oper2
break;
case '(':
if(oper1==')') //右括号右侧不能马上出现左括号
{
printf("语法错误\n");
exit();
} else
pri=-; //oper1<oper2
break;
case ')':
if(oper1=='(')
pri=;
else if(oper1=='=')
{
printf("括号不匹配\n");
exit();
}else
pri=;
break;
case '=':
if(oper1=='(')
{
printf("括号不匹配\n");
exit();
}else if(oper1=='=')
pri=; //等号匹配,返回0
else
pri=; //oper1>oper2
break;
}
return pri;
}
主函数控制题目数量:
char ans[]="\0";
int b,i;
srand(time());
while()
{
printf("当前功能:生成题库\n");
printf("请输入所需题目数量:");
scanf("%d",&b);
for(i=;i<b;i++){
exp();
printf("%d\n",CalcExp(math)); }
}
运行结果:


结对编程:四则运算。组员:闫浩楠 杨钰宁 开发语言:C语言的更多相关文章
- 20175226 2018-2019-2《java程序设计》结对编程-四则运算(第一周-阶段总结)
结对编程-四则运算(第一周-阶段总结) 需求分析 实现一个四则运算程序,要求: 自动随机生成小学四则运算题目(加,减,乘,除) 支持整数.真分数且支持多项式 能够利用栈的思想,将中缀转换为后缀表达式 ...
- 20175305张天钰Java结对编程四则运算(二)
Java结对编程四则运算(二) 一.题目描述及要求 Git提交粒度不要太粗,建议一个文件/一个类/一个函数/一个功能/一个bug修复都进行提交,不能一天提交一次,更不能一周一次,参考Commit Me ...
- 20175305张天钰Java结对编程四则运算
Java结对编程四则运算 一.题目描述:如何对表达式进行求值运算呢 1.中缀表达式与后缀表达式(娄老师讲解) 中缀表达式就是运算符号在运算数中间的表达式,比如1+2,顾名思义,后缀表达式就是运算符在运 ...
- 结对编程--四则运算(Java)萧英杰 夏浚杰
结对编程--四则运算(Java)萧英杰 夏浚杰 Github项目地址 功能要求 题目:实现一个自动生成小学四则运算题目的命令行程序 使用 -n 参数控制生成题目的个数(实现) 使用 -r 参数控制题目 ...
- 结对编程--四则运算(Java)梅进鹏 欧思良
结对编程--四则运算(Java)梅进鹏 欧思良 Github项目地址:https://github.com/MeiJinpen/Arithmetic 功能要求 题目:实现一个自动生成小学四则运算题目的 ...
- 王译潇20162314 实验报告三plus结对编程四则运算第一阶段
北京电子科技学院BESTI实验报告 课程:程序设计与数据结构 班级: 1623 姓名: 王译潇 学号:20162314 指导教师:娄佳鹏老师.王志强老师 实验日期:2017年5月12号 实验密级: 非 ...
- Java结对编程四则运算一周小结
Java结对编程四则运算一周小结 需求分析 对于四则运算来说最主要的就是要计算出产生的式子(字符串的形式). 设计思路 总体可将这个项目分解为几个部分:产生式子,计算式子,判断对错并记录: 具体的思路 ...
- 结对编程四则运算gui
码市地址:https://git.coding.net/linzhao/sizeyunsuangui.git 林 钊 -- 201421123105 吴世荣 -- 201421123119 王坤彬 - ...
- 结对编程-四则运算-GUI
201421123022 王若凡 201421123026 欧阳勇 https://git.coding.net/ttoyy/sizeyunsuan-GUI.git a.需求分析: ...
随机推荐
- OpenCV学习系列(一) Mac下OpenCV + xcode人脸检测实现
# OpenCV学习系列(一) Mac下OpenCV + xcode人脸检测实现 [-= 博客目录 =-] 1-学习目标 1.1-本章介绍 1.2-实践内容 1.3-相关说明 2-学习过程 2.1-环 ...
- [arc072F]Dam-[单调队列]
Description 传送门 Solution 首先我们肯定不能那么耿直地直接把水混合起来吧..不然分分钟完球. 那么怎么找到最优解呢?假如我们把水的体积和温度按顺序插入队列,这时我们插入第i天的水 ...
- 11- IO模型-未完成
1.同步.异步.阻塞.非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么 ...
- 【AHOI2012】信号塔
题面 题解 xgzc怒切计算几何 最小圆覆盖板子题 整体算法如下: 枚举第一个点,考虑当前圆是否包含了这个点,如果没有,则把圆变成以这个点为圆心,半径为\(0\)的圆.再枚举第二个点,考虑圆是否包含了 ...
- java spring 等启动项目时的异常 或 程序异常的解决思路
今天搭建ssm项目的时候,因为pagehelper的一个jar包没有导入idea的web项目下的lib目录中,异常报错找不到pagehelper,这个问题在出异常的时候疯狂crash,让人心情十分不舒 ...
- Flutter - Stateful(有状态) 和 stateless(无状态) widgets
Stateful(有状态) 和 stateless(无状态) widgets 有些widgets是有状态的, 有些是无状态的 如果用户与widget交互,widget会发生变化,那么它就是有状态的. ...
- Android Studio —— java.lang.VerifyError: Verifier rejected class 问题解决
用as开发过程中遇见问题app闪退 log如下图: 解决: File—Settings: 点击Apply—OK重新运行即可
- Unity Shader 学习之旅之SurfaceShader
Unity Shader 学习之旅之SurfaceShader unity shader 图形图像 如果大地的每个角落都充满了光明 谁还需要星星,谁还会 在夜里凝望 寻找遥远的安慰——江河 官方文档 ...
- 关于spring boot 使用 mybatis plus INSERT的时候id报错
mybatis plus 在INSERT的时候会默认自动设置插入id 我当时数据库采用的id自增. 在使用插入语句的时候并没有set ID 但是它默认给了一大串 更改mybatis plus全局配置 ...
- 解析xml报文,xml与map互转
这段时间写了一个关于xml报文的工具类,做一下具体的讲解: xml文本 <NTMMessage version="1.03"> <NTMHeader> &l ...