需求分析: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语言的更多相关文章

  1. 20175226 2018-2019-2《java程序设计》结对编程-四则运算(第一周-阶段总结)

    结对编程-四则运算(第一周-阶段总结) 需求分析 实现一个四则运算程序,要求: 自动随机生成小学四则运算题目(加,减,乘,除) 支持整数.真分数且支持多项式 能够利用栈的思想,将中缀转换为后缀表达式 ...

  2. 20175305张天钰Java结对编程四则运算(二)

    Java结对编程四则运算(二) 一.题目描述及要求 Git提交粒度不要太粗,建议一个文件/一个类/一个函数/一个功能/一个bug修复都进行提交,不能一天提交一次,更不能一周一次,参考Commit Me ...

  3. 20175305张天钰Java结对编程四则运算

    Java结对编程四则运算 一.题目描述:如何对表达式进行求值运算呢 1.中缀表达式与后缀表达式(娄老师讲解) 中缀表达式就是运算符号在运算数中间的表达式,比如1+2,顾名思义,后缀表达式就是运算符在运 ...

  4. 结对编程--四则运算(Java)萧英杰 夏浚杰

    结对编程--四则运算(Java)萧英杰 夏浚杰 Github项目地址 功能要求 题目:实现一个自动生成小学四则运算题目的命令行程序 使用 -n 参数控制生成题目的个数(实现) 使用 -r 参数控制题目 ...

  5. 结对编程--四则运算(Java)梅进鹏 欧思良

    结对编程--四则运算(Java)梅进鹏 欧思良 Github项目地址:https://github.com/MeiJinpen/Arithmetic 功能要求 题目:实现一个自动生成小学四则运算题目的 ...

  6. 王译潇20162314 实验报告三plus结对编程四则运算第一阶段

    北京电子科技学院BESTI实验报告 课程:程序设计与数据结构 班级: 1623 姓名: 王译潇 学号:20162314 指导教师:娄佳鹏老师.王志强老师 实验日期:2017年5月12号 实验密级: 非 ...

  7. Java结对编程四则运算一周小结

    Java结对编程四则运算一周小结 需求分析 对于四则运算来说最主要的就是要计算出产生的式子(字符串的形式). 设计思路 总体可将这个项目分解为几个部分:产生式子,计算式子,判断对错并记录: 具体的思路 ...

  8. 结对编程四则运算gui

    码市地址:https://git.coding.net/linzhao/sizeyunsuangui.git 林 钊 -- 201421123105 吴世荣 -- 201421123119 王坤彬 - ...

  9. 结对编程-四则运算-GUI

     201421123022 王若凡        201421123026  欧阳勇 https://git.coding.net/ttoyy/sizeyunsuan-GUI.git a.需求分析: ...

随机推荐

  1. Python中re模块详细介绍

    正则的介绍及应用实例详解 """ 1.什么是正则 正则就是用一系列具有特殊含义的字符组成一套规则,该规则用来描述具有某一特征的字符串, 正则就是用来去一个大的字符串中匹配 ...

  2. Merge语句中NULL的陷阱

    NULL表示unknown,不确定值,所以任何值(包括null值)和NULL值比较都是不可知的,在on子句,where子句,Merge或case的when子句中,任何值和null比较的结果都是fals ...

  3. UWP 五星评价(不跳转到龟速商店)

    之前写过一篇文章  UWP 五星好评  代码如下 var pfn = Package.Current.Id.FamilyName; await Launcher.LaunchUriAsync(new ...

  4. 不把DB放进容器的理由

    原文地址:http://www.tuicool.com/articles/6VbqeqQ 原文为英文,以下是笔者的个人总结. 此处的DB包括但不限于Redis.ElasticSearch. 1.数据安 ...

  5. 一个很NB的404页面

    一个带彩蛋的 404 页面 不得不说这个程序猿很有才 前往404页面 触发方法 按住鼠标左键 在页面中心不停的画圈 就可以进入神奇的地方了

  6. hadoop组件概念理解

    一.HADOOP 二.HIVE 三.SQOOP 1.来由和作用 sqoop由一些封装好的MR程序的jar包构成,后演变成框架,但sqoop只有map任务没有reduce任务. 用于 hdfs.hive ...

  7. Hadoop源码编译环境搭建

    准备工具: maven 3.0.0版本或者更高版本(配置中心库) protocbuff 2.5.0 http://www.zlib.net/ git bash(Windows环境可以用此工具执行编译命 ...

  8. 解决k8s出现pod服务一直处于ContainerCreating状态的问题的过程

    参考于: https://blog.csdn.net/learner198461/article/details/78036854 https://liyang.pro/solve-k8s-pod-c ...

  9. Cocos2d-x的跨平台原理

    为了充分发挥硬件性能,手机游戏通常使用Native App开发模式,这就造成开发商要为iOS 和Android平台用户开发不同的应用,无论是产品迭代还是运行维护都非常麻烦.Cocos2d-x在iOS, ...

  10. Kubernetes探索学习005--Kubernetes的Controller模型和ReplicaSet伸缩

    1.Kubernetes的controller pattern 需要认识到Kubernetes操作Pod的逻辑,都是由控制器来完成的. 查看之前写过的nginx-deployment的YAML文件 [ ...