四则运算第一次晋级
核心思想:使用运算类,一个条件一个成员函数,从主函数中输入判断是否满足条件
对于其他条件星期三下午完成
难点:括号的填充,用了星期六一天时间,直到星期六下午才完成,没有使用数据结构。
生成括号思想:
1.产生多项式个数,以及每个多项式的数字个数,随机产生,使用二维数组储存,一维代表多项式个数,二维代表每个多项式的数字个数。
2.根据每个多项式产生的数字个数,产生四则运算符号的个数使用二维数组储存,一维代表多项式个数,二维代表每个多项式的四则运算个数。
3.利用二维数组储存括号产生的位置,将括号根据位置插入进去。
生成括号遇到的问题:
1.左右括号的位置产生的条件不好限制。
2.而且括号的数量我用了人为控制为两个。
3.号位置的产生还可能重复,导致只有左括号或者只有右括号
虽然经过一番辛苦捉摸做完了,但是绕了很大的圈子,原因:
1.开始做之前没有经过自己的详细思考,只是大致有了自己的思路就开始做,没有考虑细节。
2.写程序不能一气呵成,导致在写的过程中不能很好的前后联系起来,效率降低了许多。
3.遇到困难心浮气躁,不能冷静下来思考,浪费了好多时间。
结果截图:
代码:
#pragma once #include <iostream> #include <string> using namespace std; #include <cmath> #include <ctime> #include <iomanip> class operation { private: int Fnum[100]; int Snum[100]; string mark[100]; int manynum[10][10]; int count; string savemark[10][10]; int number; //多项式的个数 int savenumbers[10]; //每一个多项式含有几个数 string position[10][10]; public: operation(); void Input(int c); /*int Range(int r1,int r2); //随机产生的数或符号可以在主函数中控制 int MandD(judge md);*/ int Remainder(int num1,int num2); int Negative(int num1,int num2); int Bractets(int judgebra); void Save(int num1,int num2,string str,int num); int Repat(int num1,int num2,string str); int Manynum(int min,int max,int judge,int i); void Output(int judge,int num); ~operation(void); };
#include "operation.h" operation::operation() { for(int i=0;i<100;i++) { Fnum[i]=0; Snum[i]=0; mark[i]='0'; } count=0; for(int m=0;m<10;m++) for(int n=0;n<10;n++) { savemark[m][n]=" "; manynum[m][n]=0; position[m][n]=" "; } } void operation::Input(int c) { count=c; } /*int operation::Range(int r1,int r2) { int s=10 return s; }*/ int operation::Remainder(int num1,int num2) { if(num1%num2==0) //没有余数 return true; else return false; } int operation::Negative(int num1,int num2) { if(num1>num2) return true; else return false; } void operation::Save(int num1,int num2,string str,int num) { Fnum[num]=num1; Snum[num]=num2; mark[num]=str; } int operation::Repat(int num1,int num2,string str) { int flag=1; for(int i=0;i<count;i++) { if(Fnum[i]==num1&&Snum[i]==num2&&mark[i]==str) flag=0; } return flag; } int operation::Manynum(int min,int max,int judge,int i) { string sympol[4]={"+","-","*","÷"}; srand((unsigned)time(0)); number = 1+rand()%8; while(number>count) { number=rand()%8; } int numbers; for(int m=0;m<number;m++) //产生多项式 { numbers=3+rand()%8; savenumbers[m]=numbers; for(int n=0;n<numbers;n++) { manynum[m][n]=min+rand()%(max-min); } if(judge) //产生符号 { for(int n=0;n<numbers-1;n++) { savemark[m][n]=sympol[rand()%4]; } } else { for(int n=0;n<numbers-1;n++) { savemark[m][n]=sympol[rand()%2]; } } } int pos[3]; for(int m=0;m<3;m++) pos[m]=0; for(int m=0;m<number;m++) { for(int t=0;t<savenumbers[m];t++) //没有设置内层循环跳出条件 { if(savenumbers[m]>3&&savenumbers[m]<=10) { for(int s=0;s<2;s++) { pos[s]=rand()%(savenumbers[m]/2);//可能随机产生相同的位置抵消了 while(position[m][pos[s]]!=" ") { pos[s]=rand()%(savenumbers[m]/2); } position[m][pos[s]]="("; } for(int s=0;s<2;s++) { pos[s]=savenumbers[m]/2+rand()%(savenumbers[m]/2); while(position[m][pos[s]]!=" ") { pos[s]=savenumbers[m]/2+rand()%(savenumbers[m]/2); } position[m][pos[s]]=")"; } t=savenumbers[m]; } } } return i+number; } void operation::Output(int judge,int num) { for(int i=num;i<count;i++) { cout<<setw(2)<<left<<Fnum[i]<<" "<<setw(2)<<left<<mark[i]<<" "<<setw(2)<<left<<Snum[i]<<endl; } if(judge) { for(int m=0;m<number;m++) { for(int n=0;n<savenumbers[m];n++) { if(position[m][n]=="(") cout<<position[m][n]<<manynum[m][n]<<savemark[m][n]; else cout<<manynum[m][n]<<position[m][n]<<savemark[m][n]; } cout <<endl; } } } operation::~operation(void) { }
#include<iostream> #include "operation.h" using namespace std; int main() { int count, judgeDiv, judgeRem, judgeNev, judgeBra, judgeRan; string mark[4]={"+","-","*","÷"}; operation operate; srand((unsigned)time(0)); cout <<"请输入要产生的计算题数量(0-88):"; cin>>count; if(count>88||count<0) { cout<<"你输入的数值不满足要求,将将产生88个题目"<<endl; count=88; } operate.Input(count); cout <<"产生的数是否有范围限制(1是或0否):"; cin>>judgeRan; int min=0,max=100; if(judgeRan) { cout <<"请输入最小值(默认最小值为0):"; cin>> min; if(min<0) min=0; cout <<"请输入最大值(默认最大值为100):"; cin>>max; if(max>100) max=100; } cout <<"产生的题目是否有乘除法(1是或0否):"; cin>>judgeDiv; cout <<"产生的题目结果是否有余数(1是或0否):"; //有问题,已经解决 cin>>judgeRem; cout <<"题目结果是否有负数(1是或0否):"; cin>>judgeNev; cout <<"产生的题目是否有括号(1是或0否):"; cin>>judgeBra; int i=0; int m; if(judgeBra) m=operate.Manynum(min,max,judgeDiv,i); for(i=m;i<count;i++) { int num1,num2; string sympol; num1=min+rand()%(max-min); num2=min+rand()%(max-min); if(judgeDiv) { sympol=mark[rand()%4]; } else { sympol=mark[rand()%2]; } if(!judgeRem&&sympol=="÷") //除法有问题,2016/3/17/17:05解决 { while(num1%num2!=0) { num1=min+rand()%(max-min); num2=min+rand()%(max-min); } } if(!judgeNev&&sympol=="-") { int mid; if(num1<num2) { mid=num1; num1=num2; num2=mid; } } if(operate.Repat(num1,num2,sympol)) { operate.Save(num1,num2,sympol,i); } else continue; } operate.Output(judgeBra,m); return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步