一、设计思路
第三版程序在第二版上增加了用户填写答案和自动批改答案功能,并且还能显示一共答对了多少题。
在这里我引入的是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 + "道
" + "正确" + (ishuliang - biaoji) + "道
" + "错误" + 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,于是我就上网查询,并且用网上的方法进行了不断的尝试,在几经波折之后还是运行成功了,这次的程序虽然实现了题目的要求,但是一些对错误处理上还是显得很不完善。
这次实验让我明白了在编程中不会做不要紧,只要知道正确的途径去寻找答案就好