摄影网站制作设计,企业电子商城网站建设,秒火食品代理网,手机在线作图让我们想看看二元四则运算都需要实现什么#xff1a; #xff08;1#xff09; 定制题目数量 #xff08;2#xff09; 是否有乘除法 #xff08;3#xff09; 题目数值范围 #xff08;4#xff09; 加减有无负数 #xff08;5#xff09; 除法有无余数 #xff0…让我们想看看二元四则运算都需要实现什么 1 定制题目数量 2 是否有乘除法 3 题目数值范围 4 加减有无负数 5 除法有无余数 6 是否支持分数真分数、假分数… 7 是否支持小数精确到多少位 8 打印中每行的间隔 为了实现以上功能并且为了便于后期实现功能拓展我们可以将其封装成类通过在外界设置类的参数实现不同的功能。可以将类定义如下 1 class CTitle2 {3 public:4 CTitle();5 ~CTitle();6 void setTitleCount(int titleCount); // 设置题量7 void setMD(int hasMD); // 设置乘除法8 void setBracket(int hasBracket); // 设置括号9 void setNumRand(int numRand); // 设置数值范围
10 void setMinus(int hasMinus); // 设置负号
11 void setResidue(int hasResidue); // 设置余数
12 void setFraction(int hasFraction); // 设置分数
13 void setFractionType(int fractionType); // 设置是否支持假分数
14 void setDecimal(int hasDecimal); // 设置小数
15 void setDecimalLong(int decimalLong); // 设置小数位数
16 void newTitle(); // 新建题目
17 private:
18 int titleCount; // 题目数量
19 int hasMD; // 是否有乘除法
20 int hasBracket; // 是否有括号
21 int numRand; // 数值范围
22 int hasMinus; // 加减有无负数
23 int hasResidue; // 除法有无余数
24 int hasFraction; // 是否支持分数
25 int fractionType; // 是否支持假分数
26 int hasDecimal; // 是否支持小数
27 int decimalLong; // 小数位数
28 int decimalLongPow; // 小数位数
29
30 void newIntegerFormula(); // 新建整数运算公式
31 void newDecimalFormula(); // 新建小数运算公式
32 void newFractionFormula(); // 新建分数运算公式
33 void recordTitle(string szTitle); // 记录题目至文件
34 void recordAnswer(string szAnswer); // 记录答案至文件
35 void reduceFraction(int nume, int deno);// 化简分数
36 }; 接下来我们需要实现类的功能接口并且对类的属性实现初始化 1 CTitle::CTitle()2 {3 titleCount 0; // 题量4 hasMD 0; // 是否有乘除法5 numRand 0; // 数值范围6 hasMinus 0; // 加减有无负数7 hasResidue 0; // 除法有无余数8 hasFraction 0; // 是否支持分数9 fractionType 0; // 是否支持假分数
10 hasDecimal 0; // 是否支持小数
11 decimalLong 0; // 小数位数
12 decimalLongPow 0; // 小数位数
13 }
14 CTitle::~CTitle()
15 {
16 }
17 // 设置行间距
18 void CTitle::setTitleCount(int titleCount)
19 {
20 this-titleCount titleCount;
21 }
22 // 设置乘除法
23 void CTitle::setMD(int hasMD)
24 {
25 this-hasMD hasMD;
26 }
27 // 设置数值范围
28 void CTitle::setNumRand(int numRand)
29 {
30 this-numRand numRand;
31 }
32 // 设置负号
33 void CTitle::setMinus(int hasMinus)
34 {
35 this-hasMinus hasMinus;
36 }
37 // 设置余数
38 void CTitle::setResidue(int hasResidue)
39 {
40 this-hasResidue hasResidue;
41 }
42 // 设置分数
43 void CTitle::setFraction(int hasFraction)
44 {
45 this-hasFraction hasFraction;
46 }
47 // 设置是否支持假分数
48 void CTitle::setFractionType(int fractionType)
49 {
50 this-fractionType fractionType;
51 }
52 // 设置小数
53 void CTitle::setDecimal(int hasDecimal)
54 {
55 this-hasDecimal hasDecimal;
56 }
57 // 设置小数位数
58 void CTitle::setDecimalLong(int decimalLong)
59 {
60 this-decimalLong decimalLong;
61 this-decimalLongPow pow(10, decimalLong);
62 } 接着我们为类添加方法让类可以按需求生成不同类型的运算题目。那么如何才能使类可以随机生成不同类型的运算呢通过对题目进行分析我们发现所有可能出现的运算类型共有4中他们分别是 1整数运算 2整数运算 小数运算 3整数运算 分数运算 4整数运算 分数运算 小数运算 1 void CTitle::newTitle()2 {3 srand(time(0));4 int numType 1 hasDecimal hasFraction;5 int titleType 1;6 for (int i 0; i titleCount; i)7 {8 switch(numType)9 {
10 // 运算中仅有整数运算
11 case 1:
12 newIntegerFormula();
13 break;
14 // 运算中包含包含两种运算整数小数 或 整数分数
15 case 2:
16 titleType rand() % 2 1;
17 if (titleType 1)
18 {
19 newIntegerFormula();
20 }
21 else
22 {
23 if (hasDecimal 1)
24 {
25 newDecimalFormula();
26 }
27 else if (hasFraction 1)
28 {
29 newFractionFormula();
30 }
31 }
32 break;
33 // 运算中包含小数运算和分数运算
34 case 3:
35 titleType rand() % 3 1;
36 if (titleType 1)
37 {
38 newIntegerFormula();
39 }
40 else if (titleType 2)
41 {
42 newDecimalFormula();
43 }
44 else
45 {
46 newFractionFormula();
47 }
48 break;
49 }
50 }
51 } 接下来我们需要解决的问题就是如何生成整数运算、小数运算以及分数运算并计算其结果。在本例中我们用文件分别对运算表达式和运算结果进行存储。将表达式存储于Title.txt文件内将运算结果存储于Answer.txt文件内。 所以我们先要在Ctitle的构造函数内加入如下代码以保证每次类初始化时文件内容会被清空。 1 FILE *fp NULL;2 errno_t err;3 if ((err fopen_s(fp, Title.txt, w)) 0)4 {5 fclose(fp);6 }7 if ((err fopen_s(fp, Answer.txt, w)) 0)8 {9 fclose(fp);
10 } 并且增加写入表达式和写入答案的方法 1 // 记录题目至文件2 void CTitle::recordTitle(string szTitle)3 {4 FILE *fp NULL;5 errno_t err;6 if ((err fopen_s(fp, Title.txt, a)) 0)7 {8 fprintf_s(fp, %s\n, szTitle.c_str());9 fclose(fp);
10 }
11 }
12 // 记录答案至文件
13 void CTitle::recordAnswer(string szAnswer)
14 {
15 FILE *fp NULL;
16 errno_t err;
17 if ((err fopen_s(fp, Answer.txt, a)) 0)
18 {
19 fprintf_s(fp, %s\n, szAnswer.c_str());
20 fclose(fp);
21 }
22 } 接下来我们实现创建整数运算的方法在这里与要注意以下问题 1除法运算时除数不能为0 2若运算不能还有余数要保证生成的除法运算均可以整除 3若运算可以还有余数要保证生成的结果为: 5 ÷ 2 2...1 而非2.5 1 // 新建整数运算公式2 void CTitle::newIntegerFormula()3 {4 string szTitle ;5 string szAnswer ;6 char caTitle[100] { };7 char caAnswer[100] { };8 int num1 rand() % numRand 1;// 随机整数1默认是正数9 int num2 rand() % numRand 1;// 随机整数2默认是正数10 int op rand() % 2 1; // 运算符默认仅有加减运算11 // 设置四则运算12 if (hasMD 1)13 {14 op rand() % 4 1;15 }16 switch (op)17 {18 case 1:19 // 加减运算中包含负数20 if (hasMinus 1)21 {22 num1 rand() % (numRand * 2) - numRand;23 num2 rand() % (numRand * 2) - numRand;24 }25 if (num2 0)26 {27 // 记录题目28 sprintf_s(caTitle, %d(%d), num1, num2);29 szTitle caTitle;30 recordTitle(szTitle);31 // 记录答案32 sprintf_s(caAnswer, %d, num1num2);33 szAnswer caAnswer;34 recordAnswer(szAnswer);35 }36 else37 {38 // 记录题目39 sprintf_s(caTitle, %d%d, num1, num2);40 szTitle caTitle;41 recordTitle(szTitle);42 // 记录答案43 sprintf_s(caAnswer, %d, num1 num2);44 szAnswer caAnswer;45 recordAnswer(szAnswer);46 }47 break;48 case 2:49 // 加减运算中包含负数50 if (hasMinus 1)51 {52 num1 rand() % (numRand * 2) - numRand;53 num2 rand() % (numRand * 2) - numRand;54 }55 if (num2 0)56 {57 // 记录题目58 sprintf_s(caTitle, %d-(%d), num1, num2);59 szTitle caTitle;60 recordTitle(szTitle);61 // 记录答案62 sprintf_s(caAnswer, %d, num1 - num2);63 szAnswer caAnswer;64 recordAnswer(szAnswer);65 }66 else67 {68 // 记录题目69 sprintf_s(caTitle, %d%d, num1, num2);70 szTitle caTitle;71 recordTitle(szTitle);72 // 记录答案73 sprintf_s(caAnswer, %d, num1 - num2);74 szAnswer caAnswer;75 recordAnswer(szAnswer);76 }77 break;78 case 3:79 // 记录题目80 sprintf_s(caTitle, %d×%d, num1, num2);81 szTitle caTitle;82 recordTitle(szTitle);83 // 记录答案84 sprintf_s(caAnswer, %d, num1 * num2);85 szAnswer caAnswer;86 recordAnswer(szAnswer);87 break;88 case 4:89 // 除数为090 while (num2 0)91 {92 num2 rand() % numRand 1;93 }94 // 无余数的除法95 if(hasResidue 0)96 { 97 // 保证可以整除98 while (num1 % num2 ! 0)99 {
100 num1 rand() % numRand 1;
101 }
102 // 记录题目
103 sprintf_s(caTitle, %d÷%d, num1, num2);
104 szTitle caTitle;
105 recordTitle(szTitle);
106 // 记录答案
107 sprintf_s(caAnswer, %d, num1 / num2);
108 szAnswer caAnswer;
109 recordAnswer(szAnswer);
110 }
111 // 有余数的除法
112 else
113 {
114 // 记录题目
115 sprintf_s(caTitle, %d÷%d, num1, num2);
116 szTitle caTitle;
117 recordTitle(szTitle);
118 // 记录答案
119 sprintf_s(caAnswer, %d...%d, num1 / num2, num1 % num2);
120 szAnswer caAnswer;
121 recordAnswer(szAnswer);
122 }
123 break;
124 }126 } 接下来实现小数运算在这里小数的位数是可以自主选定的所以如果小数位数选择的是2位那么在记录如文件时也要保证多余位数不会被记录。如double类型默认写入文件是2.510000那我们只能保留2.51并将保留后的结果写入文件。 1 // 新建小数运算公式2 void CTitle::newDecimalFormula()3 {4 string szTitle ;5 string szAnswer ;6 string szOp ;7 string szNum1 ;8 string szNum2 ;9 char caTitle[100] { };10 char caAnswer[100] { };11 char caNum1[100] { };12 char caNum2[100] { };13 double dAnswer 0;14 int num1 rand() % numRand 1;// 随机整数1默认是正数15 int num2 rand() % numRand 1;// 随机整数2默认是正数16 double dotNum1 (rand() % (decimalLongPow) 1);// 随机小数117 double dotNum2 (rand() % (decimalLongPow)1);// 随机小数218 int op rand() % 2 1; // 运算符默认仅有加减运算19 dotNum1 dotNum1 / decimalLongPow;20 dotNum2 dotNum2 / decimalLongPow;21 sprintf_s(caNum1, %lf, num1 dotNum1);22 szNum1 caNum1;23 szNum1 szNum1.substr(0, szNum1.length() - 6 decimalLong);24 sprintf_s(caNum2, %lf, num2 dotNum2);25 szNum2 caNum2;26 szNum2 szNum2.substr(0, szNum2.length() - 6 decimalLong);27 // 设置四则运算28 if (hasMD 1)29 {30 op rand() % 4 1;31 }32 switch (op)33 {34 case 1:35 // 加减运算中包含负数36 if (hasMinus 1)37 {38 num1 rand() % (numRand * 2) - numRand;39 num2 rand() % (numRand * 2) - numRand;40 szNum1 ;41 szNum2 ;42 sprintf_s(caNum1, %lf, num1 dotNum1);43 szNum1 caNum1;44 szNum1 szNum1.substr(0, szNum1.length() - 6 decimalLong);45 sprintf_s(caNum2, %lf, num2 dotNum2);46 szNum2 caNum2;47 szNum2 szNum2.substr(0, szNum2.length() - 6 decimalLong);48 }49 if (num2 0)50 {51 // 记录题目52 szOp ;53 szNum2 ( szNum2 );54 // 记录答案55 dAnswer num1 dotNum1 num2 dotNum2;56 }57 else58 {59 // 记录题目60 szOp ;61 // 记录答案62 dAnswer num1 dotNum1 num2 dotNum2;63 }64 break;65 case 2:66 // 加减运算中包含负数67 if (hasMinus 1)68 {69 num1 rand() % (numRand * 2) - numRand;70 num2 rand() % (numRand * 2) - numRand;71 szNum1 ;72 szNum2 ;73 sprintf_s(caNum1, %lf, num1 dotNum1);74 szNum1 caNum1;75 szNum1 szNum1.substr(0, szNum1.length() - 6 decimalLong);76 sprintf_s(caNum2, %lf, num2 dotNum2);77 szNum2 caNum2;78 szNum2 szNum2.substr(0, szNum2.length() - 6 decimalLong);79 }80 if (num2 0)81 {82 // 记录题目83 szOp ;84 szNum2 ( szNum2 );85 // 记录答案86 dAnswer num1 dotNum1 - num2 - dotNum2;87 }88 else89 {90 // 记录题目91 szOp ;92 // 记录答案93 dAnswer num1 dotNum1 - num2 - dotNum2;94 }95 break;96 case 3:97 // 记录题目98 szOp ×;99 // 记录答案
100 dAnswer (num1 dotNum1) * (num2 dotNum2);
101 break;
102 case 4:
103 // 除数为0
104 while (num2 0 dotNum2 0)
105 {
106 num2 rand() % numRand 1;
107 dotNum2 (rand() % (decimalLong)1);
108 }
109 // 记录题目
110 szOp ÷;
111 // 记录答案
112 dAnswer (num1 dotNum1) / (num2 dotNum2);
113 break;
114 }
115 // 记录题目
116 szTitle szNum1 szOp szNum2;
117 recordTitle(szTitle);
118 // 记录答案
119 sprintf_s(caAnswer, %lf, dAnswer);
120 szAnswer caAnswer;
121 szAnswer szAnswer.substr(0, szAnswer.length() - 6 decimalLong);
122 recordAnswer(szAnswer);124 } 最后需要进行的就是生成分数在这里我们需要注意 1是否进行假分数的运算 2要对分数的运算结果进行约分将分数化为最简。并且将假分数化简。如5/2要化简为2‘1/2二又二分之一 1 // 新建分数运算2 void CTitle::newFractionFormula()3 {4 string szTitle ;5 string szAnswer ;6 char caTitle[100] { };7 char caAnswer[100] { };8 int deno1 rand() % numRand 1;// 随机分母1默认是正数9 int deno2 rand() % numRand 1;// 随机分母2默认是正数10 int nume1 rand() % numRand 1;// 随机分子1默认是正数11 int nume2 rand() % numRand 1;// 随机分子2默认是正数12 int nweNume 0;13 int nweDeno 0;14 // 支持假分数15 if (fractionType 1)16 {17 // 分母为0或118 while (deno1 0 || deno1 1)19 {20 deno1 rand() % numRand 1;21 }22 while (deno2 0 || deno1 1)23 {24 deno2 rand() % numRand 1;25 }26 }27 // 不支持假分数28 if (fractionType 0)29 {30 // 分母为0或131 while (nume1 0 || nume1 1)32 {33 nume1 rand() % numRand 1;34 }35 while (nume2 0 || nume2 1)36 {37 nume2 rand() % numRand 1;38 }39 if (deno1 nume1)40 {41 int temp deno1;42 deno1 nume1;43 nume1 temp;44 }45 if (deno2 nume2)46 {47 int temp deno2;48 deno2 nume2;49 nume2 temp;50 }51 }52 int op rand() % 2 1; // 运算符默认仅有加减运算53 // 设置四则运算54 if (hasMD 1)55 {56 op rand() % 4 1;57 }58 switch (op)59 {60 case 1:61 // 记录题目62 sprintf_s(caTitle, %d/%d%d/%d, nume1, deno1, nume2, deno2);63 szTitle caTitle;64 recordTitle(szTitle);65 // 记录答案66 nweNume nume1*deno2 deno1*nume2;67 nweDeno deno1*deno2;68 break;69 case 2:70 // 记录题目71 sprintf_s(caTitle, %d/%d%d/%d, nume1, deno1, nume2, deno2);72 szTitle caTitle;73 recordTitle(szTitle);74 // 记录答案75 nweNume nume1*deno2 - deno1*nume2;76 nweDeno deno1*deno2;77 reduceFraction(nweNume, nweDeno);78 break;79 case 3:80 // 记录题目81 sprintf_s(caTitle, %d/%d×%d/%d, nume1, deno1, nume2, deno2);82 szTitle caTitle;83 recordTitle(szTitle);84 // 记录答案85 nweNume nume1*nume2;86 nweDeno deno1*deno2;87 break;88 case 4:89 // 记录题目90 sprintf_s(caTitle, %d/%d÷%d/%d, nume1, deno1, nume2, deno2);91 szTitle caTitle;92 recordTitle(szTitle);93 // 记录答案94 nweNume nume1*deno2;95 nweDeno deno1*nume2;96 break;97 }98 reduceFraction(nweNume, nweDeno); // 化简99 if (nweNume 0)
100 {
101 recordAnswer(0);
102 }
103 else if (nweDeno 1)
104 {
105 sprintf_s(caAnswer, %d, nweNume);
106 szAnswer caAnswer;
107 recordAnswer(szAnswer);
108 }
109 else if (nweNume nweDeno)
110 {
111 sprintf_s(caAnswer, %d/%d, nweNume, nweDeno);
112 szAnswer caAnswer;
113 recordAnswer(szAnswer);
114 }
115 else if (nweNume nweDeno)
116 {
117 if (nweNume%nweDeno ! 0)
118 {
119 sprintf_s(caAnswer, %d%d/%d, nweNume / nweDeno, nweNume%nweDeno, nweDeno);
120 szAnswer caAnswer;
121 recordAnswer(szAnswer);
122 }
123 else
124 {
125 sprintf_s(caAnswer, %d, nweNume / nweDeno);
126 szAnswer caAnswer;
127 recordAnswer(szAnswer);
128 }
129 }
130 else
131 {
132 recordAnswer(1);
133 }
134 }
135 // 化简分数
136 void CTitle::reduceFraction(int nume, int deno)
137 {
138 int temp;
139 int a nume;
140 int b deno;
141 int gcd 0; // 最大公约式
142 if (a b)
143 {
144 temp a;
145 a b;
146 b temp;
147 }
148 while (b ! 0)
149 {
150 temp a % b;
151 a b;
152 b temp;
153 }
154 gcd a;
155 nume nume / gcd;
156 deno deno / gcd;
157 } 至此我们的类就编写完成了。接下来只需要在主函数生成类并进行类方法的调用就行了。 1 #include iostream2 #include time.h3 #include CTitle.h4 #include CTitle.h5 using namespace std;6 void setting();7 CTitle title;8 int lineSpacing 0;9 int main()10 {11 setting();12 title.newTitle();13 // 从文件打印题目14 FILE *fp NULL;15 FILE *fp2 NULL;16 errno_t err;17 char caTitle[100];18 char caAnsewr[100];19 char myansewr[100];20 int mark 1;21 if ((err fopen_s(fp, Title.txt, r)) 0 (err fopen_s(fp2, Answer.txt, r)) 0)22 {23 // 读取题目24 while ((fscanf_s(fp, %s, caTitle, 100) ! EOF))25 {26 // 读取答案27 fscanf_s(fp2, %s, caAnsewr, 100);28 do29 {30 cout caTitle ;31 cin myansewr;32 if (strcmp(myansewr, caAnsewr) 0)33 {34 cout √ endl;35 mark 1;36 }37 else38 {39 cout × endl;40 mark 0;41 }42 for (int i 0; i lineSpacing; i)43 {44 cout endl;45 }46 } while (mark 0);47 }48 cout 恭喜你完成今日作业 endl;49 }50 return 0;51 }52 void setting()53 {54 int input 0;55 cout 请完成如下设置 endl;56 cout 设置今日题量;57 cin input;58 title.setTitleCount(input);59 cout endl;60 cout 设置数值范围绝对值;61 cin input;62 title.setNumRand(input);63 cout endl;64 do65 {66 cout 加减有无负数1有0无;67 cin input;68 } 69 while (input ! 0 input ! 1);70 title.setMinus(input);71 cout endl;72 do73 {74 cout 是否有乘除法1有0无;75 cin input;76 } 77 while (input ! 0 input ! 1);78 title.setMD(input);79 cout endl;80 if (input 1)81 {82 do83 {84 cout 整数除法有无余数1有0无;85 cin input;86 } 87 while (input ! 0 input ! 1);88 title.setResidue(input);89 cout endl;90 }91 92 do93 {94 cout 是否支持小数1有0无;95 cin input;96 } 97 while (input ! 0 input ! 1);98 title.setDecimal(input);99 cout endl;
100 if (input 1)
101 {
102 cout 设置小数位数(1~5);
103 cin input;
104 title.setDecimalLong(input);
105 cout endl;
106 }
107 do
108 {
109 cout 是否支持分数1有0无;
110 cin input;
111 }
112 while (input ! 0 input ! 1);
113 title.setFraction(input);
114 cout endl;
115 if (input 1)
116 {
117 cout 设置是否支持假分数1有0无;
118 cin input;
119 title.setFractionType(input);
120 cout endl;
121 }
122 cout 设置打印行间隔;
123 cin input;
124 lineSpacing input;
125 cout endl;
126 } 恩对于这一次的作业我只完成了二元式的生成和运算没有涉及到多元式所以没有写上括号生成与运算的问题。本来只是想简单写写好久没有用C写过程序了没想到写着写着就写了这么多行但好像也没有实现什么功能只是保证了最基础的运行。还是要继续提升啊。 转载于:https://www.cnblogs.com/libaoquan/p/5271351.html