需求分析: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. 3、计数排序,电影top100

    1.计数排序 # -*- coding: utf-8 -*- # @Time : 2018/07/31 0031 11:32 # @Author : Venicid def count_sort(li ...

  2. Python面向对象之封装、property特性、绑定方法与非绑定方法

    一.封装 ''' 1.什么封装 封:属性对外是隐藏的,但对内是开放的(对内是开放的是因为在类定义阶段这种隐藏已经发生改变) 装:申请一个名称空间,往里装入一系列名字/属性 2.为什么要封装 封装数据属 ...

  3. 约束4:唯一约束,Check约束和null

    大家知道,关系型数据库的逻辑运算的结果是三值型的,TRUE,FALSE和UNKNOWN,特别是,NULL值和任何值都不相等,任何值和NULL的比较,返回的逻辑结果都是unknown.而NULL值在唯一 ...

  4. halcon二 图像校正

    1.get_image_size(Image : : : Width, Height) 返回图像的尺寸. 2.parameters_image_to_world_plane_centered (Cam ...

  5. 通过XML文件实现人物之间的对话

    一.建立一个XML文档,放在项目中Assert/Resources/XML文件下 XML的内容如下: <?xml version="1.0" encoding="u ...

  6. Linux速成(二)

    四.Linux 系统目录结构 树状目录结构: 以下是对这些目录的解释: /bin:bin是Binary的缩写, 这个目录存放着最经常使用的命令. /boot:这里存放的是启动Linux时使用的一些核心 ...

  7. java基础---JDK、JRE、JVM的区别和联系

    当我们学习java语言时,首先需要安装到我们电脑上的就是jdk.jdk是java语言的开发环境,只有安装了jdk,我们才能使用java语言开发程序. JDK=JRE+开发工具包 JRE=JVM+核心类 ...

  8. phpcmsv9广告版位调用方法

    <div class="ya"> <?php // pc:get 使用sql语句获取指定条件的广告版位! ?> {pc:get sql="SELE ...

  9. HackRF 升级固件到新版本

    本文内容.开发板及配件仅限用于学校或科研院所开展科研实验! 淘宝店铺名称:开源SDR实验室 HackRF链接:https://item.taobao.com/item.htm?spm=a1z10.1- ...

  10. 基于Java Junit测试框架 + jmeter 做压力测试

    1.JUnit 用户指南请查阅: https://junit.org/junit5/docs/current/user-guide/ 以一下代码为例:add接口 代码测试正常后,导出包: 下一步: j ...