程序要求:
1.题目避免重复
2.可定制(数量打印方式)
3.可以一下控制参数
① 是否有乘除法
② 是否有括号(最多支持十个数参与运算)
③ 数值范围
④加减有无负数
⑤除法有无余数
分析:① 如果是两个数的算式很容易就可以输出,但是多个数就有点儿难住我了,仔细想想可以将一个算式看作为一个数再加上一个符号和一个数就可以输出,但int型和char型无法一起输出,于是我就去网上寻找解决办法,找到了itoa()函数,这个函数可以将int型转为字符型,这样就可以将一个算式作为一个string字符串输出,具体的用法我是在 http://www.cnblogs.com/lidabo/archive/2012/07/10/2584706.html 和http://blog.csdn.net/lwj103862095/article/details/12005105 这个博客上学习的。将整数型转为字符型后加入括号也就容易了许多,我是用这样一个语句加入的:str_num1 = '(' + str_num1 + ')',在字符串str_num的左右添加括号。
② 选择是否添加乘除法,首先建立一个存储符号的数组,如果不添加乘除就随机生成1或2两个数,1代表“+”,2代表“-”,如果添加乘除就随机生成1-4四个数,1代表“+”,2代表“-”,3代表“*”,4代表“÷”
③数值范围的控制:num1 = rand() % (max - min + 1) + min;// 随机生成min-max的整数
④加减有无负数和除法有无余数这两个功能目前还没有实现,我感觉这两个功能的实现如果我一开始用二维数组写这个程序会容易很多,现在我用itoa()函数没有写出来,不过我会继续改进一下,不然我就用二维数组尝试重新写一个。
1 #include <iostream> 2 #include <time.h> 3 #include <stdio.h> 4 #include <stdlib.h> 5 #include <math.h> 6 #include <fstream> 7 #include <string> 8 using namespace std; 9 10 11 //数字转换为字符串 12 string int_string(int number) 13 { 14 int temp = abs(number);//取绝对值 15 char str[100]; 16 _itoa_s(temp, str, 10); //运用itoa()函数将int型整数转换为字符串 17 string str_= str; 18 return str_; 19 } 20 //算式转换为字符串 21 string group(string str1, string str2, char m) // group:算式组合 22 { 23 string Equation; // equation:算式 24 Equation = str1 + m + str2; 25 return Equation; 26 } 27 //生成运算符 28 char mark(int opt) 29 { 30 int opt1, a; 31 char symbol[1]; // 符号数组 32 if (opt == 0) 33 { 34 opt1 = 2; 35 } 36 if (opt == 1) 37 { 38 opt1 = 4; 39 } 40 a = rand() % opt1+1; //随机生成1-2或1-4的数,随opt的值而定,opt意为是否含有乘除法 41 if (a == 1) symbol[0] = '+'; 42 if (a == 2) symbol[0] = '-'; 43 if (a == 3) symbol[0] = '*'; 44 if (a == 4) symbol[0] = '÷'; 45 return symbol[0]; 46 } 47 //主函数 48 void main() 49 { 50 int num1, num2, minus, remainder; 51 int opt, bracket, output, max, min, amount, control, b, c; 52 string str_num1, str_num2, value; //数字-字符串 53 cout << "是否需要包含乘除法?1(有),0(没有):" << endl; 54 cin >> opt; //opt:选择是否含有乘除法 55 cout << "是否含有括号?1(有),0(没有):" << endl; 56 cin >> bracket; 57 cout << "是否需要包含负数1(有),0(没有):" << endl; 58 cin >> minus; 59 cout << "题目是否要在文件中输出?1(是),0(不是):" << endl; 60 cin >> output; 61 cout << "请输入数字范围:(格式为:最小数 空格 最大数)" << endl; 62 cin >> max>>min; 63 cout << "请输入出题数量:" << endl; 64 cin >> amount; 65 string equation[100]; //定义数组 66 char symbol; 67 ofstream fout; 68 if (opt == 1) 69 { 70 cout << "除法有无余数,1(有),0(无)" << endl; 71 cin >> remainder; 72 } 73 if ( output == 1 ) 74 { 75 fout.open("output.txt"); 76 fout << amount << "道四则运算题如下:" << endl; 77 } 78 else 79 { 80 cout << amount << "道四则运算题如下:" << endl; 81 } 82 for (int i = 0; i<amount; i++) //为输出规定题数 83 { 84 srand((int)time(NULL)); //设置时间种子,每次执行种子不同,生成不同的随机数 85 num1 = rand() % (max - min + 1) + min;// 随机生成min-max的整数 86 num2 = rand() % (max - min + 1) + min;// 随机生成min-max的整数 87 control = rand() % 9 + 2; //控制是几个数的运算式,最多支持10个数的运算式 88 symbol = mark(opt); 89 if (minus == 0) 90 { 91 if (remainder == 0) 92 { 93 str_num1 = int_string(num1); 94 str_num2 = int_string(num2); 95 } 96 if (remainder == 1)//?????????? 97 { 98 str_num1 = int_string(num1); 99 str_num2 = int_string(num2); 100 } 101 } 102 if (minus == 1)//??????????????错误! 103 { 104 if (remainder == 0) 105 { 106 str_num1 = int_string(num1); 107 str_num2 = int_string(num2); 108 } 109 if (remainder == 1)//?????????? 110 { 111 str_num1 = int_string(num1); 112 str_num2 = int_string(num2); 113 } 114 } 115 if (remainder == 0) 116 { 117 str_num1 = int_string(num1); 118 str_num2 = int_string(num2); 119 } 120 equation[i] = group(str_num1, str_num2, symbol); 121 if (control >= 2) 122 { 123 for (; control >= 2; control--) 124 { 125 symbol = mark(opt); 126 str_num1 = equation[i]; 127 if (bracket == 1) 128 { 129 b = rand() % 2; //随机生成0-2的数 130 if (b == 0) //如果b=2,就在字符串str_num1的左右加上括号 131 { 132 str_num1 = '(' + str_num1 + ')'; 133 } 134 } 135 symbol = mark(opt); 136 str_num2 = int_string(num2); 137 b = rand() % 2; 138 if (b == 0) 139 { 140 value = str_num1; 141 str_num1 = str_num2; 142 str_num2 = value; 143 } 144 equation[i] = group(str_num1, str_num2, symbol); 145 } 146 } 147 //判断是否重复 148 int repeat = 0; //repeat:重复 149 for (c = 0; c<i; c++) 150 { 151 if (equation[c] == equation[i]) 152 { 153 i = i - 1; 154 repeat = 1; 155 break; 156 } 157 } 158 if (repeat != 1)//若不重复,则输出 159 { 160 if (output == 1) 161 { 162 fout << equation[i] << "=" << endl; 163 } 164 else 165 { 166 cout << equation[i] << "=" << endl; 167 } 168 } 169 170 } 171 if (output == 1) //输出到文件 172 { 173 fout.close(); 174 } 175 }
程序运行截图:
问题(错误)1:num2每次生成的数都一样
错误2:无法生成含乘除法的算式
总结:通过本次编程我发现我还有太多的不足,对于很多编程的基本知识还没有掌握,现在想想以前总是对编程不上心,得过且过,真的很后悔,现在大三我一定积极努力,努力把编程水平提升上去。
项目计划总结:
日期任务 | 听课/时 | 编写程序/时 | 查阅资料/时 | 日总计/时 |
星期一 | 2 | 1 | 0.5 | 3.5 |
星期二 | 2 | 2 | ||
星期三 | 3 | 1 | 4 | |
星期四 | 2 | 2 | 4 | |
星期五 | 2.5 | 1 | 3.5 | |
星期六 | 5 | 2 | 7 | |
星期日 | ||||
周总计 | 4 | 15.5 | 4.5 |
24 |
时间记录日志:
日期 | 开始时间 | 结束时间 | 中断时间 | 净时间 | 活动 | 备注 |
3/7 | 14:00 | 15:50 | 10 | 100 | 听课 | 软件工程上课 |
16:30 | 17:30 | 60 | 编写程序 | 作业 | ||
21:00 | 21:30 | 30 | 阅读书籍 | 《构建之法》 | ||
3/8 | 19:00 | 21:00 | 20 | 90 | 查资料,编写程序 | 作业 |
3/9 | 14:25 | 16:30 | 15 | 110 | 编写程序 | 作业 |
17:00 | 18:00 | 60 | 查阅资料和阅读构建之法 | |||
21:00 | 22::00 | 60 | 编写程序 | 作业 | ||
3/10 | 14:00 | 15:50 | 10 | 100 | 听课 | 软件工程上课 |
21:20 | 22:10 | 50 | 查资料,编写程序 | 聊天+作业 | ||
3/11 | 16:20 | 18:30 | 10 | 120 | 继续编程... | |
19:40 | 20:30 | 50 | 阅读《构建之法》 | |||
21:00 | 21:45 | 45 | 查阅资料 | 聊天+上网查阅资料 | ||
3/12 | 9:00 | 11:40 | 160 | 编程 | 作业 | |
12:20 | 15:00 | 160 | 调试程序 | |||
15:00 | 写博客 |
缺陷记录日志:(错误很多,没有专门去记录,以后会注意养成这个习惯的)
日期 | 编号 | 引入阶段 | 排除阶段 | 修复时间&问题描述 |
3/7 | 1 | 编码 | 编译 | |
3/8 | ||||
3/9 | ||||
3/10-3/11 | 2 | 编码 | 编译 | |
3/11-3/12 | 3 | 编码 | 编译 | |