博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
四则运算3.2
阅读量:6846 次
发布时间:2019-06-26

本文共 12466 字,大约阅读时间需要 41 分钟。

一、队友:http://home.cnblogs.com/u/surver/

二、设计思路

1、在上一次的代码基础上叠加一个计算函数。

2、计算函数首先将产生的算式按顺序分成两个数组拆分,第一个数组存数字,第二个数组存运算符。

3、计算时使用c里面栈的思想计算。不过,这里是分各种情况讨论运算。第一个运算符先入数组,根据第二个运算符确定

4、当运算符出现*+或*-或/+或/-这些情况时,数字数组的前两个数字弹出数组,*或者/弹出运算符数组进行计算成一个数,然后将这个数存到刚才两个数的第一个数的位置,数组的长度减1。运算符的+或-代替前一个运算符,运算符数组长度减1.

5、当出现左括号时,运算符继续入数组,当遇到右括号时,数字数组弹出后两个数,将带右括号的三个运算符弹出,计算。运算结果放到弹出的两个数的第一个数的位置。数字数组长度减1,运算符数组长度减3.

6、当出现类似于+*+这种优先关系的运算符时,先弹出后两个数字进行*或/运算,结果入数组,长度减1,后一个运算符代替前一个运算符的位置,运算符数组长度减1,再判断下一个运算符。

7、当出现++或者+-或者-+或者--的情况,先弹出前两个数,和前一个运算符进行运算,结果再入数组,运算符数组长度减1,数字数组长度减1。

8、当出现=号时,如果数字只剩下两个数时,运算符数组只剩下一个运算符,那么两个数根据运算符运算。如果数字超过两个数时,先进行上面提到的运算分析。

9、运算结果可以是分数也可以是整数,也可以是分数。因此,定义输入字符串,当字符串里出现“/”时,将“/”号前后的字符串转成数字,再进行计算。

 

三:代码

1 #writher Megau Bing And Surver Devin  2 #edit date 20160317  3   4 from fractions import Fraction#分数  5 from random import randint#随机数  6   7   8 def replace(line):  9     line=line.replace('+',' + ') 10     line=line.replace('-',' - ') 11     line=line.replace('*',' * ') 12     line=line.replace('/',' / ') 13     line=line.replace('(',' ( ') 14     line=line.replace(')',' ) ') 15     line=line.replace('  ',' ') 16     line=line.replace('=',' = ') 17     return line 18  19 def calculate(operator_cal,operator_num1,operator_num2): 20     answer=0 21     if(operator_cal=="+"): 22         answer=operator_num1+operator_num2 23     if(operator_cal=="-"): 24         answer=operator_num1-operator_num2 25     if(operator_cal=="*"): 26         answer=operator_num1*operator_num2 27     if(operator_cal=="/"): 28         answer=operator_num1/operator_num2 29     #print"####结果",answer 30     return answer 31  32  33 def result_get(str1): 34     operator_anw=[""]*100#存取运算符的数组 35     operator_ord=0#指针,计算运算符位置,统计运算符的个数 36  37     figure_anw=[0]*100#存取运算数的数组 38     figure_ord=0#指针,计算运算数位置,统计运算数的个数 39  40     line=replace(str1) 41     #print line 42     line = line.split() 43     for word in line: 44         #print "word:",word 45         if(word=="+"): 46             operator_anw[operator_ord]="+" 47             operator_ord=operator_ord+1 48         elif(word=="-"): 49             operator_anw[operator_ord]="-" 50             operator_ord=operator_ord+1 51         elif(word=="*"): 52             operator_anw[operator_ord]="*" 53             operator_ord=operator_ord+1 54         elif(word=="/"): 55             operator_anw[operator_ord]="/" 56             operator_ord=operator_ord+1 57         elif(word=="("): 58             operator_anw[operator_ord]="(" 59             operator_ord=operator_ord+1 60         elif(word==")"): 61             operator_anw[operator_ord]=")" 62             operator_ord=operator_ord+1 63         elif(word=="="): 64             if(operator_ord==2):#如果出现运算符剩两个的情况,运算第二个运算符 65                 figure_anw[1]=calculate(operator_anw[1],figure_anw[1],figure_anw[2]) 66             figure_anw[0]=calculate(operator_anw[0],figure_anw[0],figure_anw[1]) 67             #print figure_anw[0],"end" 68             return figure_anw[0] 69  70         else: 71             word=int(word) 72             word=Fraction(word,1) 73             figure_anw[figure_ord]=word 74             figure_ord=figure_ord+1 75             #print "已存入数字",word 76             #print "下一个数字位置",figure_ord 77             #print "下一个运算符位置",operator_ord 78             #print operator_anw 79             #print figure_anw 80         #判断并进行运算,进栈出栈 81  82         #优先级进行判断,是否入栈是否运算(+—同一类,*/同一类) 83  84         #*+问题 85         if((word=="+"or word=="-")and operator_ord>1 and (operator_anw[operator_ord-1]=="*" or operator_anw[operator_ord-1]=="/")): 86             figure_anw[figure_ord-2]=calculate(operator_anw[operator_ord-2],figure_anw[figure_ord-2],figure_anw[figure_ord-1]) 87             operator_anw[operator_ord-1]="" 88             figure_anw[figure_ord-1]=0 89             operator_ord=operator_ord-1 90             operator_anw[operator_ord-1]=word 91             figure_ord=figure_ord-1 92             #print operator_anw 93             #print figure_anw 94              95              96         if(word==")"):#1判断是否出现右括号 97             #运算函数 98             #if 如果出现+*两层运算问题,这个if解决第一层*/ 99             if(operator_anw[operator_ord-3]=="+" or operator_anw[operator_ord-3]=="-"):100                 figure_anw[figure_ord-2]=calculate(operator_anw[operator_ord-2],figure_anw[figure_ord-2],figure_anw[figure_ord-1])101                 figure_anw[figure_ord-1]=0102                 operator_anw[operator_ord-1]=""103                 operator_anw[operator_ord-2]=")"104                 figure_anw[figure_ord-1]=0105                 operator_ord=operator_ord-1106                 figure_ord=figure_ord-1107                 108             #这段是将括号中残存的唯一运算符进行运算并消掉括号和运算符109             figure_anw[figure_ord-2]=calculate(operator_anw[operator_ord-2],figure_anw[figure_ord-2],figure_anw[figure_ord-1])110             figure_anw[figure_ord-1]=0111             operator_anw[operator_ord-3]=""112             operator_anw[operator_ord-2]=""113             operator_anw[operator_ord-1]=""114             operator_ord=operator_ord-3115             figure_ord=figure_ord-1116 117         #+*+问题 解决118         if((word=="+"or word=="-")and (operator_anw[operator_ord-2]=="*" or operator_anw[operator_ord-2]=="/")and operator_ord>1):119             figure_anw[figure_ord-2]=calculate(operator_anw[operator_ord-2],figure_anw[figure_ord-2],figure_anw[figure_ord-1])120             operator_anw[operator_ord-2]=word121             operator_anw[operator_ord-1]=""122             figure_anw[figure_ord-1]=0123             figure_ord=figure_ord-1124             operator_ord=operator_ord-1125             #print"*+"126                 127         #++问题128         if((word=="+"or word=="-")and operator_ord>1):129             #print "************************************************",operator_anw[operator_ord-2]130             #print operator_anw[operator_ord-2]131             if(operator_anw[operator_ord-2]=="+"or operator_anw[operator_ord-2]=="-"):132                 figure_anw[figure_ord-2]=calculate(operator_anw[operator_ord-2],figure_anw[figure_ord-2],figure_anw[figure_ord-1])133                 operator_anw[operator_ord-1]=""134                 figure_anw[figure_ord-1]=0135                 operator_ord=operator_ord-1136                 operator_anw[operator_ord-1]=word137                 figure_ord=figure_ord-1138                 #print operator_anw139                 #print figure_anw140 141 142 def layer(layer_accual2,operat_number2,brackets2,layer_amount2):#递归程序143     if(layer_accual2>0):#对第一层开始计算,将形成3个以上的数字,层数暂时为设定的3。144          #选择数字标号145         #print"layer_accual2",layer_accual2146         opreation_radom=randint(0,layer_accual2-1)#第一层加1,抽取号码,进行替换147         find_operat_number=operat_number[opreation_radom]148         #即两个数中选择一个数进行替换成为一个简单的四则二元运算149         #print "operater_num",operater_num150         #将选中的数字从第二层开始,用一个简单的二元运算式替换选中的数字,并插入数组151         #插入时依据数字编号判断是否加入括号,依据此数字所在的周围是否有*\符号152         #判断是否有添加括号153         if((operator[opreation_radom]=="-")or operator[opreation_radom+1]=="-")or operator[opreation_radom]=="/"or(operator[opreation_radom]=="*")or(operator[opreation_radom+1]=="/")or(operator[opreation_radom+1]=="*"):#判断选中数字周围的符号154             brackets[layer_accual2]=1155         if(multiplication_and_division==2):156             brackets[layer_accual2]=0157 158 159     operater_num=randint(1,multiplication_and_division)  #将运算符入数组160     operator_one="?"161     #operater_num=2162     if(operater_num==1):163         operator_one="+"164     if(operater_num==2):165         operator_one="-"166     if(operater_num==3):167         operator_one="*"168     if(operater_num==4):169         operator_one="/"170         171     if(layer_accual2==0):172         operator[1]=operator_one173     else:174     175         mov_amount=layer_accual2+2-opreation_radom176         for i in range(0,mov_amount):177             operator[layer_accual2+2-i]=operator[layer_accual2+2-i-1]178             #print"i",i 179         operator[opreation_radom+1]=operator_one180         181     zhen_zheng=randint(1,2)  #是真分数或者整数,随机182     if(fraction_exist==0):183         zhen_zheng=1184     if(zhen_zheng==1):          #产生第一个数字 185         first_num=randint(1,number_range)186         first_num=str(first_num)187     else:188         first_num1=2189         first_num2=1190         while (first_num1>=first_num2):191             first_num1=randint(1,number_range)192             first_num2=randint(1,number_range)193         first_num=Fraction(first_num1,first_num2)194         if(first_num!=0):195             first_num="("+str(first_num)+")"        196         first_num=str(first_num)197     zhen_zheng=randint(1,2)  #是真分数或者整数,随机198     if(fraction_exist==0):199         zhen_zheng=1200     if(zhen_zheng==1):          #产生第二个数字 201         second_num=randint(1,10)202         second_num=str(second_num)203     else:204         second_num1=2205         second_num2=1206         while (second_num1>=second_num2):207             second_num1=randint(1,number_range)208             second_num2=randint(1,number_range)209         second_num=Fraction(second_num1,second_num2)210         if(second_num!=0):211             second_num="("+str(second_num)+")"  212 213     if(layer_accual2==0):#第0层,将最开始的两个数字存入数组214         operat_number[0]=first_num215         operat_number[1]=second_num216         if(negative_exit==0):#(如果不存在负数)217             if(second_num>first_num and operator_one==2):218                 while(second_num>=first_num):219                     second_num=randint(1,number_range)220                     221         if(remainder==0):#(如果不存在余数)222            if(operator_one==4):223                 while(second_num%first_num!=0):224                     print"remainder"225                     second_num=randint(1,number_range)226                     227 228     #从第一层开始存入两个数字229     if(layer_accual2>0):230         mov_amount=layer_accual2+2-opreation_radom231         for i in range(0,mov_amount):232             operat_number[layer_accual2+1-i]=operat_number[layer_accual2+1-i-1]233         operat_number[opreation_radom]=first_num234         operat_number[opreation_radom+1]=second_num235 236     237     #整理算式238     if(layer_accual2<1):239         expressions=""240 241         242     if(layer_accual2==1):243         tempperate1=str(operat_number[0])244         tempperate2=str(operat_number[1])245         expressions=operat_number[0]+operator[1]+operat_number[1]246       247     if(layer_accual2>1):248         #先找到替换数字,然后产生表达式2,用2替换表达式1249         global expressions250         kk=str(operat_number[opreation_radom])251         expressions2=first_num+operator_one+second_num252         if ( brackets[layer_accual2]==1):253             expressions2="("+first_num+operator_one+second_num+")"254 255         256         #创建一个查找机制,寻找不同的数字将其替换?257         #while(same_amount>0):258         #print"上一层句子",expressions259         #print"替换句子",expressions2260         #print"用于替换的的数字",find_operat_number261         expressions=expressions.replace(find_operat_number," "+find_operat_number+" ")262         expressions3=""263         recording_1=0264         line=expressions.split()265         for word2 in line:266             if (word2==find_operat_number and recording_1==0):267 268                 word2=expressions2269                 recording_1=1270             expressions3=expressions3+word2271         expressions3=expressions3.replace(" ","")272         expressions=expressions3273 274     layer_accual2=layer_accual2+1275     if(layer_accual2
0.7*expressions_amount):421 print"你太棒了"422 if(right_amount<0.6*expressions_amount):423 print"错的有点多,继续努力哦"424 print "参考答案:"#,answer_matrix425 num=1426 for i in answer_matrix:427 print "第",num,"题:",428 num=num+1429 print i430 431 print"退出?0为退出,1为继续"432 temp=input()433 while(temp!=0 and temp!=1):434 print"请重新输入"435 temp=input()436 quit_num=temp

运行结果

1

2

3

4

5

6

7

 项目记录日志

  听课 编写程序 阅读相关书籍 网上查阅资料 总计
周一 2 0 0 0 2
周二 0 1 1 1 3
周三 0 2.5 1 0 3.5
周四 2 2.5 0 0 4.5
周五 0 5 0 0 1
周六 0 0 0 0 0
周日          
总计 4 11 2 1 18

时间记录日志

日期  开始时间 结束时间 中断时间 净时间 活动 备注
周一 14:00 15:50 10 100min 听课 上课+编程
周二 16:00;19:00 17:00;20:00 0 60 看书,编程 第一函数
周三 14:00;19:30 15:00;22:00 0 150 看书,编程 对计算做第一步完善
周四 19:00 21:30 0 150 编程 第二步完善
周五 15:00; 22:00 120 300 编程 系统进行修改完善
周六 0 0 0 0 0 0

缺陷记录

日期 类型 引入阶段 排除阶段 修复时间 修复的缺陷 编号
0315 输入 编译 复审 15 输入不能以分数结果直接输入 1
          是构建骨架,逐步完善的过程  

 

转载于:https://www.cnblogs.com/Megau/p/5294858.html

你可能感兴趣的文章
MusicXML 3.0 (6) - 符杠分组
查看>>
分享一个比lightbox配置更方便的jQuery web2.0图片显示插件:Topup
查看>>
Linux IPTables: Incoming and Outgoing Rule Examples (SSH and HTTP)
查看>>
C以二进制读、写、文本
查看>>
SYS_Oracle Erp打印机设定(案例)
查看>>
VBS基础篇 - 循环语句(3) - For...Next
查看>>
为你的程序换个皮肤(转载)
查看>>
SQL 学习笔记
查看>>
XML Publisher 并发程序由于"输出提交处理程序提交失败
查看>>
C#温故而知新学习系列之.NET框架高级特性—.NET框架中自身提供的属性(二)
查看>>
ora-12170:tns连接超时
查看>>
【转载】世界各地对BI的应用状况
查看>>
js获取url参数值
查看>>
动态他Transact-SQL语句处理中的常见问题演示.sql
查看>>
浅谈管理软件开发类项目是怎么来的,怎么接到项目的,欢迎大家补充(转载和标注)...
查看>>
快速了解必要的网络知识
查看>>
HTML5标签嵌套规则
查看>>
Linux下面如何安装Django
查看>>
MySQL 中now()时间戳用法
查看>>
【数据结构与算法】二分查找
查看>>