程序要求:
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()函数没有写出来,不过我会继续改进一下,不然我就用二维数组尝试重新写一个。
#include <iostream>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <fstream>
#include <string>
using namespace std; //数字转换为字符串
string int_string(int number)
{
int temp = abs(number);//取绝对值
char str[];
_itoa_s(temp, str, ); //运用itoa()函数将int型整数转换为字符串
string str_= str;
return str_;
}
//算式转换为字符串
string group(string str1, string str2, char m) // group:算式组合
{
string Equation; // equation:算式
Equation = str1 + m + str2;
return Equation;
}
//生成运算符
char mark(int opt)
{
int opt1, a;
char symbol[]; // 符号数组
if (opt == )
{
opt1 = ;
}
if (opt == )
{
opt1 = ;
}
a = rand() % opt1+; //随机生成1-2或1-4的数,随opt的值而定,opt意为是否含有乘除法
if (a == ) symbol[] = '+';
if (a == ) symbol[] = '-';
if (a == ) symbol[] = '*';
if (a == ) symbol[] = '÷';
return symbol[];
}
//主函数
void main()
{
int num1, num2, minus, remainder;
int opt, bracket, output, max, min, amount, control, b, c;
string str_num1, str_num2, value; //数字-字符串
cout << "是否需要包含乘除法?1(有),0(没有):" << endl;
cin >> opt; //opt:选择是否含有乘除法
cout << "是否含有括号?1(有),0(没有):" << endl;
cin >> bracket;
cout << "是否需要包含负数1(有),0(没有):" << endl;
cin >> minus;
cout << "题目是否要在文件中输出?1(是),0(不是):" << endl;
cin >> output;
cout << "请输入数字范围:(格式为:最小数 空格 最大数)" << endl;
cin >> max>>min;
cout << "请输入出题数量:" << endl;
cin >> amount;
string equation[]; //定义数组
char symbol;
ofstream fout;
if (opt == )
{
cout << "除法有无余数,1(有),0(无)" << endl;
cin >> remainder;
}
if ( output == )
{
fout.open("output.txt");
fout << amount << "道四则运算题如下:" << endl;
}
else
{
cout << amount << "道四则运算题如下:" << endl;
}
for (int i = ; i<amount; i++) //为输出规定题数
{
srand((int)time(NULL)); //设置时间种子,每次执行种子不同,生成不同的随机数
num1 = rand() % (max - min + ) + min;// 随机生成min-max的整数
num2 = rand() % (max - min + ) + min;// 随机生成min-max的整数
control = rand() % + ; //控制是几个数的运算式,最多支持10个数的运算式
symbol = mark(opt);
if (minus == )
{
if (remainder == )
{
str_num1 = int_string(num1);
str_num2 = int_string(num2);
}
if (remainder == )//??????????
{
str_num1 = int_string(num1);
str_num2 = int_string(num2);
}
}
if (minus == )//??????????????错误!
{
if (remainder == )
{
str_num1 = int_string(num1);
str_num2 = int_string(num2);
}
if (remainder == )//??????????
{
str_num1 = int_string(num1);
str_num2 = int_string(num2);
}
}
if (remainder == )
{
str_num1 = int_string(num1);
str_num2 = int_string(num2);
}
equation[i] = group(str_num1, str_num2, symbol);
if (control >= )
{
for (; control >= ; control--)
{
symbol = mark(opt);
str_num1 = equation[i];
if (bracket == )
{
b = rand() % ; //随机生成0-2的数
if (b == ) //如果b=2,就在字符串str_num1的左右加上括号
{
str_num1 = '(' + str_num1 + ')';
}
}
symbol = mark(opt);
str_num2 = int_string(num2);
b = rand() % ;
if (b == )
{
value = str_num1;
str_num1 = str_num2;
str_num2 = value;
}
equation[i] = group(str_num1, str_num2, symbol);
}
}
//判断是否重复
int repeat = ; //repeat:重复
for (c = ; c<i; c++)
{
if (equation[c] == equation[i])
{
i = i - ;
repeat = ;
break;
}
}
if (repeat != )//若不重复,则输出
{
if (output == )
{
fout << equation[i] << "=" << endl;
}
else
{
cout << equation[i] << "=" << endl;
}
} }
if (output == ) //输出到文件
{
fout.close();
}
}
程序运行截图:
问题(错误)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 | 编码 | 编译 | |