需求分析: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. JavaWeb总结(十三)

    Web开发模式的变迁 了解了Servlet和JSP,知道利用Servlet就可以开发一个Web应用程序,但是Servlet的缺陷使Web应用程序开发变得非常繁琐且不利于分工协作.使用JSP(表达式.声 ...

  2. 【HNOI2014】画框

    题面 题解 这又是一种套路啊233 将\(\sum a_i\)和\(\sum b_i\)分别看做\(x\)和\(y\),投射到平面直角坐标系中,于是就是找\(xy\)最小的点 于是可以先找出\(x\) ...

  3. Python 学习 第二篇:数据类型(字符串)

    字符串是一个字符的.有序的.不可变的序列,用于存储基于文本的信息.字符串所包含的字符存在从左至右的位置顺序,不可以在原处(in-place)修改.Python没有C语言的字符和字符串之分,只有字符串. ...

  4. Python无参装饰器

    需求:想要在test_func函数前后执行一些代码   1.第一步(定义函数,将调用原函数,使用新函数替换) def test_func(): return 'test_func' def test_ ...

  5. c语言数字图像处理(九):边缘检测

    背景知识 边缘像素是图像中灰度突变的像素,而边缘是连接边缘像素的集合.边缘检测是设计用来检测边缘像素的局部图像处理方法. 孤立点检测 使用<https://www.cnblogs.com/Gol ...

  6. Unity生成简易二维码

    最近项目需求,需要在Unity中动态生成二维码.所以就研究了一下,下面把动态生成二维码的方法向大家分享一下. 第一种方法 需要一个 ZXing.dll文件. 下载地址我会在文章结尾给出. 直接将下载好 ...

  7. Window10家庭版启动hyper-v虚拟机组件

    在安装docker的时候发现如果直接使用docker for windows,对系统的要求是window10专业版或企业版,家庭版本身没有hyper-v,不能支持 虚拟化.但是后来我在搜索过程中发现, ...

  8. (转)CentOS7系统信息及运行情况查看

    原文链接:https://blog.csdn.net/qq_42196196/article/details/85063911 系统信息 CPU信息 内存信息 显卡信息 硬盘信息 网络信息 用户信息 ...

  9. 匹配追踪算法(MP)简介

    图像的稀疏表征 分割原始图像为若干个\[\sqrt{n} \times \sqrt{n}\]的块. 这些图像块就是样本集合中的单个样本\(y = \mathbb{R}^n\). 在固定的字典上稀疏分解 ...

  10. window搭建私有云,只要几分钟

    本文介绍如何在window搭建私有云网盘. 工具/原料:一台window系统电脑或者window服务器(vps),Xampp 安装包,可道云kodexplorer安装包 第一步,xampp安装 1.官 ...