一、设计思路
第三版程序在第二版上增加了用户填写答案和自动批改答案功能,并且还能显示一共答对了多少题。
在这里我引入的是datagridview控件来控制用户答题的变量,以及提取运算数和运算符号。在C#中这是一款功能很强大的控件,使用起来也相当方便。
二、程序源代码
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 = "是"; amout1.Text = "0"; amout2.Text = "100"; fushu.Text = "是"; yushu.Text = "否"; hangju.Text = "0"; dataGridView1.CellBorderStyle = DataGridViewCellBorderStyle.None; dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; } 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,iamout1,iamout2,ifushu,iyushu,ihangju;//获取变量参数
iamout1 = Convert.ToInt16(amout1.Text.Trim()); iamout2 = Convert.ToInt16(amout2.Text.Trim()); ihangju = Convert.ToInt16(hangju.Text.Trim()); if (iamout1 > iamout2) { MessageBox.Show("您输入的范围错误,第一个数应该小于等于第二个数,现默认范围为1~100"); iamout1 = 1; iamout2 = 100; amout1.Text="1"; amout2.Text ="100"; } if (chengchu.Text.Trim() == "是") { ichengchu = 1; } else { ichengchu = 0; } if (fushu.Text.Trim() == "是") { ifushu = 1; } else { ifushu = 0; } if (yushu.Text.Trim() == "是") { iyushu = 1; } else { iyushu = 0; } //生成一个表
DataTable dt = new DataTable(); dt.Columns.Add("num1", Type.GetType("System.Int16")); dt.Columns.Add("sign", Type.GetType("System.String")); dt.Columns.Add("num2", Type.GetType("System.Int16")); dt.Columns.Add("=", Type.GetType("System.String")); dt.Columns.Add("write", Type.GetType("System.Int16")); dt.Columns.Add("T/F", Type.GetType("System.String")); dt.Columns.Add("answer", Type.GetType("System.Int16")); //结束
int i = 0,j=0; int num1, num2; 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; if (ichengchu == 1) { sign = zufu[rand(0, 4)]; } else { sign = zufu1[rand(0, 2)]; } if (sign == "/") { if (sushu(num1, iyushu)) //排除素数因素,否则会导致死循环
{ num2 = 1; } else { j = 0; while (true) { num2 = rand(iamout1, iamout2); if (j >= ishuliang*5) //为了防止有些数找不到能被整除的数而陷入死循环
{ break; } if (num2 == num1) //为了排除出现同一个数相除这种简单的题目
{ continue; } if (num2 != 0 && cefushu(num1, num2, ifushu) && ceyushu(num1, num2, iyushu))//num2!=0要放在最前面,防止ceyushu函数中除数为0
{ break; } j++; } } } else if (sign == "-") { while (true) { num2 = rand(iamout1, iamout2); if (cefushu(num1, num2, ifushu)) { break; } } } else { num2 = rand(iamout1, iamout2); } DataRow dr = dt.NewRow(); dr["num1"] = num1; dr["sign"] = sign; dr["num2"] = num2; dr["="] = "="; // dr["write"] = "0";
dr["T/F"] = "(在前面填写答案)"; // dr["answer"] = 0;
dt.Rows.Add(dr); i++; } dataGridView1.DataSource = dt; } private void button2_Click(object sender, EventArgs e) //清空
{ dataGridView1.DataSource = null; /* DataTable dt = (DataTable)dataGridView1.DataSource; dt.Rows.Clear(); dataGridView1.DataSource = dt;*/ textBox1.Text = " "; } private void button3_Click(object sender, EventArgs e) { if (dataGridView1.DataSource != null) { int ishuliang = Convert.ToInt16(shuliang.Text.Trim()); int i, num1, num2, num3, write, biaoji = 0; String sgin; if (true) { for (i = 0; i < ishuliang; i++) { num1 = Convert.ToInt16(dataGridView1.Rows[i].Cells[0].Value); sgin = Convert.ToString(dataGridView1.Rows[i].Cells[1].Value); num2 = Convert.ToInt16(dataGridView1.Rows[i].Cells[2].Value); //write = Convert.ToInt16(dataGridView1.Rows[i].Cells[4].Value);
write = 0; if (dataGridView1.Rows[i].Cells[4].Value == DBNull.Value) { write = -156887; } else { write = Convert.ToInt16(dataGridView1.Rows[i].Cells[4].Value); } if (sgin == "+") { num3 = num1 + num2; } else if (sgin == "-") { num3 = num1 - num2; } else if (sgin == "/") { num3 = num1 / num2; } else { num3 = num1 * num2; } dataGridView1.Rows[i].Cells[6].Value = num3; if (num3 == write) { dataGridView1.Rows[i].Cells[5].Value = "正确"; } else { dataGridView1.Rows[i].Cells[5].Value = "错误"; biaoji++; } textBox1.Text = "本次作业一共" + ishuliang + "道\r\n" + "正确" + (ishuliang - biaoji) + "道\r\n" + "错误" + biaoji + "道"; } } else { MessageBox.Show("错误,请先填写答案再批改"); } } else { MessageBox.Show("错误,没有数据,请先生成题目再批改"); } } private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) { }
} }
三、程序截图
四、活动记录表
一、项目计划总结:
周活动总结表
姓名:柴珏辉 日期:2015.3.16
日期 任务 |
听课 |
编写程序 |
阅读课本 |
准备考试 |
|
|
日总计 |
周日 |
|
|
|
|
|
|
|
周一 |
|
|
|
|
|
|
|
周二 |
2 |
1 |
|
|
|
|
3 |
周三 |
|
1.5 |
|
|
|
|
1.5 |
周四 |
|
|
|
|
|
|
|
周五 |
2 |
0.5 |
|
|
|
|
2.5 |
周六 |
|
|
|
|
|
|
|
周总结 |
4 |
3 |
|
|
|
|
7 |
二、时间记录表:
学生 柴珏辉 日期 3.16
教师 王建民 课程 PSP
日期 |
开始时间 |
结束时间 |
中断时间 |
净时间 |
活动 |
备注 |
3.17 |
8:00 |
10:00 |
|
2 |
上课 |
软件工程课 |
3.17 |
6:00 |
7:00 |
|
1 |
编程 |
完成结队开发 |
3.18 |
19:30 |
21:00 |
|
1.5 |
编程 |
编写四则运算3 |
3.20 |
8:00 |
10:00 |
|
2 |
上课 |
软件工程课 |
3.20 |
19:30 |
20:00 |
|
0.5 |
编程 |
四则运算3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
三、缺陷记录日志:
学生 柴珏辉
日期 3.16
教员 王建民
程序号
日期 |
编号 |
类型 |
引入阶段 |
排除阶段 |
修复时间 |
修复缺陷 |
3.18 |
1 |
|
编译 |
编译 |
10min |
|
Datetable的行数据添加过程中数据类型引发的问题 |
||||||
3.18 |
2 |
|
编译 |
编译 |
20min |
|
Datagridview控件中空元素的判断出现错误 |
||||||
3.20 |
3 |
|
设计 |
编译 |
1min |
|
输入数据范围不规范引发的错误 |
五、实验体会总结
这次的程序可以说在第二个的基础上稍加改动,不过一开始却并不顺利。我不知道如何在没有数据库的情况下使用datagridview,于是我就上网查询,并且用网上的方法进行了不断的尝试,在几经波折之后还是运行成功了,这次的程序虽然实现了题目的要求,但是一些对错误处理上还是显得很不完善。
这次实验让我明白了在编程中不会做不要紧,只要知道正确的途径去寻找答案就好