1.题目要求:
可怜的二柱子同学,老师又对他的自动出题系统提出了新的要求:
(1)、题目避免重复;
(2)、可定制(数量/打印方式);
(3)、可以控制下列参数: 是否有乘除法、是否有括号、
数值范围、加减有无负数、除法有无余数、否支持分数 (真分数, 假分数, …)、是否支持小数 (精确到多少位)、打印中每行的间隔可调整;
2.设计思想:
1.题目要求:题目避免重复
将每个算式的第一个数存到一个数组,每次生成第一个数组的时候回溯一遍如果有重复就重新生成。
2.可定制(数量、打印方式)
接受用户输入的一个参数来控制打印的数量
3.是否有乘除法
将整个算法分成两个部分,一部分有四则运算,另一部分只有加减
4.是否有括号
把生成的算式分成两元和三元两种选择
5.数值范围的限定
对rand函数做运算处理,使之生成的数在一定范围之内
6.加减有无负数
生成两个数之后比较一下,保证前者大于后者
7.除法有无余数
生成两个数之后,把这两者做%处理,确保结果为0
8.是否支持分数假分数,真分数
将这一点作为限定条件放到第三点问题上一起处理(未实现)
9.是否支持小数(精确到多少位)
处理位置与3相同,精确到多少位(未实现)
10.打印中每行位置的间隔可调整
在打印每一条数据间控制回车符的数量
使用语言软件:由于用户输入参数太多,打算使用C#来设计。
整个程序的构架,因为选择很多,我把选择点全都放在一个while循环里,将选择量简化,在循环里分模块,这样程序看上去比较精简而且清楚
3.程序源代码
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace suanshu { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { shuliang.Text = "10"; chengchu.Text = "是"; kuohao.Text = "否"; amout1.Text = "0"; amout2.Text = "100"; fushu.Text = "是"; xiaoshu.Text = "否"; yushu.Text = "是"; fenshu.Text = "否"; hang.Text = "10"; hangju.Text = "0"; } Random ra = new Random(System.DateTime.Now.Millisecond);//时间毫秒数,取得随机数 int rand(int num1, int num2) { int x; // Random ra = new Random(System.DateTime.Now.Millisecond);//时间毫秒数,取得随机数 x = ra.Next(num1,num2); return x; } bool chongfu(int [] zu,int i,int num) { if(i==0) { return true; } else { int x=0,biaoji=1; while(x<i) { if (zu[x] == num) { biaoji = 0; break; } x++; } if (biaoji == 0) { return false; } else { return true; } } } bool cefushu(int num1, int num2,int ifushu) { if (ifushu ==0) { if (num1 >= num2) { return true; } else { return false; } } else { return true; } } bool ceyushu(int num1, int num2, int iyushu) { if (iyushu == 0) { if (num1%num2==0) { return true; } else { return false; } } else { return true; } } bool sushu(int num,int iyushu) //检测是否是素数 { if (iyushu == 1) { return false; } else { int i = 2, j = num / 2,biaoji=0; while (i <= j) { if (num % i == 0) { biaoji = 1; break; } i++; } if (biaoji == 1) { return false; } else { return true; } } } private void button1_Click(object sender, EventArgs e) { int ishuliang = Convert.ToInt16( shuliang.Text.Trim()); int ichengchu,ikuohao,iamout1,iamout2,ifushu,iyushu,ifenshu,ixiaoshu,ihang,ihangju;//获取变量参数 iamout1 = Convert.ToInt16(amout1.Text.Trim()); iamout2 = Convert.ToInt16(amout2.Text.Trim()); ihang = Convert.ToInt16(hang.Text.Trim()); ihangju = Convert.ToInt16(hangju.Text.Trim()); if (chengchu.Text.Trim() == "是") { ichengchu = 1; } else { ichengchu = 0; } if (kuohao.Text.Trim() == "是") { ikuohao = 1; } else { ikuohao = 0; } if (fenshu.Text.Trim() == "是") { ifenshu = 1; } else { ifenshu = 0; } if (fushu.Text.Trim() == "是") { ifushu = 1; } else { ifushu = 0; } if (yushu.Text.Trim() == "是") { iyushu = 1; } else { iyushu = 0; } if (xiaoshu.Text.Trim() == "是") { ixiaoshu = 1; } else { ixiaoshu = 0; } int i = 0,j=0; int num1, num2,p,num3,bj; int [] zu; string [] zufu={"+","-","*","/"}; string[] zufu1 = { "+", "-" }; zu=new int[ishuliang]; while (i < ishuliang) { j = 0; num1 = rand(iamout1, iamout2); //rand函数是生成一个随机数 while (true) { if (j >= ishuliang) { break; } if (chongfu(zu, i, num1)) //chongfu函数是检测产生的数与前面有木有重复 { zu[i] = num1; break; } num1 = rand(iamout1, iamout2); //rand函数是生成一个随机数 j++; } string sign,sign1; if (ichengchu == 1) { sign = zufu[rand(0, 4)]; } else { sign = zufu1[rand(0, 2)]; } if (sign == "/") { if (sushu(num1, iyushu)) //排除素数因素,否则会导致死循环 { num2 = 1; } else { while (true) { num2 = rand(iamout1, iamout2); if (num2 == num1) //为了排除出现同一个数相除这种简单的题目 { continue; } if (num2 != 0 && cefushu(num1, num2, ifushu) && ceyushu(num1, num2, iyushu))//num2!=0要放在最前面,防止ceyushu函数中除数为0 { break; } } } } else if (sign == "-") { while (true) { num2 = rand(iamout1, iamout2); if (cefushu(num1, num2, ifushu)) { break; } } } else { num2 = rand(iamout1, iamout2); } bj = rand(0,3); if (ikuohao == 1) //选择有无括号 { num3 = rand(iamout1, iamout2); if (ichengchu == 1) { sign1 = zufu[rand(0, 4)]; } else { sign1 = zufu1[rand(0, 2)]; } if (bj == 0) { textBox1.Text += num1 + sign + num2 + sign1 + num3 + "= "; } else if (bj == 1) { textBox1.Text += "(" + num1 + sign + num2 + ")" + sign1 + num3 + "= "; } else { textBox1.Text += num1 + sign +"("+ num2 + sign1 + num3 + ")"+"= "; } } else { textBox1.Text += num1 + sign + num2 + "= "; } if (ihang == 0) //设定每行题目的数量 { } else { if ((i % (ihang )) == (ihang-1)) { p=0; while(p<=ihangju) { textBox1.Text += "\r\n"; //设置行距 p++; } } } i++; } } private void button2_Click(object sender, EventArgs e) //清空 { textBox1.Text = ""; } } }
4.程序截图实现
5.工作记录表格
周活动总结表
姓名:柴珏辉
日期:2015.3.10
日期 任务 |
听课 |
编写程序 |
阅读课本 |
准备考试 |
日总计 |
||
周日 |
|||||||
周一 |
|||||||
周二 |
2 |
0.5 |
2.5 |
||||
周三 |
2.5 |
0.5 |
3 |
||||
周四 |
1.5 |
0.5 |
2 |
||||
周五 |
2 |
2 |
|||||
周六 |
0.5 |
0.5 |
1 |
||||
周总结 |
4 |
4.5 |
2 |
10.5 |
二、时间记录表:
学生 柴珏辉 日期 3.10
教师 王建民 课程 PSP
日期 |
开始时间 |
结束时间 |
中断时间 |
净时间 |
活动 |
备注 |
3.10 |
8:00 |
10:00 |
2 |
上课 |
软件工程课 |
|
3.11 |
10:30 |
11:30 |
1 |
编程 |
完成四则运算题作业 |
|
3:30 |
5:00 |
0.5 |
1 |
编程 |
同上 |
|
9:10 |
9:40 |
0.5 |
编程 |
同上 |
||
3.12 |
4:30 |
5:30 |
1 |
编程 |
同上 |
|
3.14 |
21:30 |
22:00 |
0.5 |
编程 |
同上 |
三、缺陷记录日志:
学生 柴珏辉
日期 3.10
教员 王建民
程序号
日期 |
编号 |
类型 |
引入阶段 |
排除阶段 |
修复时间 |
修复缺陷 |
||||||||||
3.11 |
1 |
编译 |
编译 |
5min |
||||||||||||
Rand函数的new如果在函数中,运行的时候一直出现同一个数 |
||||||||||||||||
3.11 |
2 |
编译 |
编译 |
2min |
||||||||||||
Rand.next(x,y)生成的数a,应该是x<=a<y |
||||||||||||||||
3.11 |
3 |
设计 |
编译 |
10min |
||||||||||||
在解决除法没有余数的问题中,没有考虑到素数这一因素,导致程序出现死循环 |
||||||||||||||||
3.11 |
4 |
编译 |
编译 |
1min |
||||||||||||
C#中,1和0不能代表bool值,要用true和false |
||||||||||||||||
3.12 |
5 |
编译 |
编译 |
2min |
||||||||||||
多了一个大括号 |
||||||||||||||||
3.12 |
6 |
编译 |
编译 |
15min |
||||||||||||
设置自动分行代码时,运行程序出错 |