利用栈求表达式的值

上传人:hs****ma 文档编号:512998809 上传时间:2023-01-16 格式:DOCX 页数:29 大小:505.28KB
返回 下载 相关 举报
利用栈求表达式的值_第1页
第1页 / 共29页
利用栈求表达式的值_第2页
第2页 / 共29页
利用栈求表达式的值_第3页
第3页 / 共29页
利用栈求表达式的值_第4页
第4页 / 共29页
利用栈求表达式的值_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《利用栈求表达式的值》由会员分享,可在线阅读,更多相关《利用栈求表达式的值(29页珍藏版)》请在金锄头文库上搜索。

1、软件综合课程设计利用栈求表达式的值二O四年六月课程设计一、利用栈求表达式的值1问题陈述 利用栈求表达式的值,可供小学生作业,并能给出分数。(限1 人完成) 要求:建立试题库文件,随机产生n个题目;题目涉及加减乘除,带括弧 的混合运算;随时可以退出;保留历史分数,能回顾历史,给出与历史分 数比较后的评价2程序代码#include #include #include #include #include #include #define MAX_LEN 1024#define EXP_LEN 4const char*OPERATOR=+-*/;/* S1 保存数字或运算结果, S2 保存操作符,Ex

2、p为输入的表达式* T1 为栈S1的顶指针,T2为栈S2的顶指针,p为扫描Exp的位置*/charS2MAX_LEN,ExpMAX_LEN*2;int S1MAX_LEN,T1,T2,p;/* 检查生成的表达式是否合理 */int isCorrect;/* number为随机生成的表达式的 操作数,oper为运算符,bracket为 括号数组(0表示没有括号,-1表示左括号, 1表示右括号) */int numberEXP_LEN,bracketEXP_LEN7char operEXP_LEN-1;/* 用户答案 */char replyMAX_LEN*2;/* 题目 数量,默认为5道题 */

3、int N = 5;/* 获得运算符的优先 级 */int GetPriority(char c) if(c = + | c = -) return 1;else return 2;/*将字符转换成int */int GetNum() int r = 0;while(isdigit(Expp)r = r * 10 + Expp - 0;p = p + 1;return r;/* 从栈顶取出两个数字 , 进行 op 对应的操作 */void Calc(char op)int a = S1T1 - 2, b= S1T11;if(op = +)a += b;else if(op = -) a -=

4、b;/* 如果中间结果出现负数,认为 不合法 */if(a 0)T2 = T2 + 1;T2 = T2 - 1;elseCalc(S2T2);/* 先计算优先级高的表达式 */ return S10;while(T20&S2T2-1!=(/* 打印欢迎*/& GetPriority(S2T2-1)=void Welcome()GetPriority(op)printf( T2 = T2 - 1;*n); printf( * 欢迎进入四则运算表达式测试中心 *n); printf(*系统为您随机生成了d道题,请您开始答题*n, N);printf (“*(总分%d 分,每题 10 分)*n, N

5、* 10);printf( *输入任意字母退出系统*n);printf(*n); printf(n);printf(n);/* 生成合法的表达式(中间结果没有负数,分数和小数等) */int GenerateExp()int i, j, k, w, ret, digit16;/* 一直循环直到随机到一个合法的表达式 */ while(true) isCorrect = 1; /* 随机操作数 */ for(i = 0; i EXP_LEN; i+)numberi = rand() % 100 + 1; /*随机操作符 */ for(i = 0; i EXP_LEN - 1; i+)operi

6、= OPERATORrand() % 4;j = -1; /* 随机括号的位置 */ memset(bracket, 0, sizeof(bracket);while(true) i = j + 1;if(EXP_LEN - 1 - i = 0)break;j = rand() % (EXP_LEN - 1 - i) + i;bracketj = -1;i = j + 1;j = rand() % (EXP_LEN - i) + i;bracketj = 1; /* 构造生成的表达式 */memset(Exp, 0, sizeof(Exp);j = 0;for(i = 0; i 0)digit

7、k = numberi % 10;numberi /= 10;k+;for(w = k - 1; w = 0; w-)Expj = digitw + 0;j = j + 1;if(bracketi = 1)Expj = );j = j + 1;Expj = operi;j+; /* 计算表达式的结果 */ ret = ProcessExp(); /* 如果合法,退出 */ if(isCorrect)break; return ret;/* 结合学生的历史成绩进行评估 */void Evaluate(int totalNum, int correctNum)/* 打开历史数据文件 */FILE*

8、 file = fopen(history.txt, at+);double curAccurate = correctNum * 100.0 / totalNum, lastAccurate, avgAccurate = 0;int linebreak = 1, improve = 0, hTotalNum, hCorrectNum;/* 打印本次测试结果(总题数,答对数,答错数,总分以及正确率) */printf (“您共回答了%d道题,答对%d道题,答错%d道题!n, totalNum, correctNum, totalNum - correctNum);printf (“您的总得分为

9、 d 分,正确率为.2lf%n,correctNum * 10, curAccurate );/* 文件打开失败 */if(file = NULL)prin tf(历史文件读入有误!n); else/* 读取历史数据,并计算历史平均正确率,和最近的一次正确率 */ printf(n历史数据评估:n);while(fscanf(file, %d%d, &hTotalNum, &hCorrectNum) != EOF) prin tf(%d 道题答对d 道 ,hT ot alNum, hCorrec tNum); if(linebreak % 5 = 0)printf(n);linebreak+;

10、lastAccurate = hCorrectNum * 100.0 / hTotalNum; avgAccurate += lastAccurate;printf(nn);/* 若有过1次及以上的历史测试 */if(linebreak 1)/* 打印对比本次正确率和历史平均正确率,上一次正确率之间的 关系 */avgAccurate /= linebreak - 1;printf(您的平均正确率为.2lf%,上一次的正确率 为.2廿%,avgAccura te, las tAccura te);prin tf(本次测试您的正确率为%.2lf%,不$于平均正确 率!nn, curAccura

11、te, curAccura te las tAccura te ? 低:高);/* 计算此次正确率相比上一次正确率的增幅 */ if(fabs(lastAccurate) 1e-7)improve = (curAccurate - lastAccurate) * 100 / lastAccurate;elseimprove = curAccurate;/* 若没有增幅 */if(improve = 0)prin tf(相比上一次测试,您的正确率没有变化!n);else /*若是负增幅,则为退步,否则为进步(根据增幅的大小,打 印不同的程度略微,较大等) */prin tf(相比上一次测试,你有了);if(abs(impro

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号