svc.SetRate(2);
svc.Voice = svc.GetVoices(string.Empty, string.Empty).Item(3);
}
catch
{
MessageBox.Show("语音库不存在,请安装Microsoft Speech SDK 5.1和Microsoft Speech SDK 5.1 Language Pack! ");
checkBox1.Checked = false;
}
private void Voice()//
{
svc.Speak(name.Text.Trim(), svsf);
mythread.Abort();
}
//用于语音的朗读
mythread = new Thread(Voice);
mythread.Start();
“缺席”按键主要程序
“缺席”按键主要程序和“开始”类似(略)。只是BindToView(0, i, int.Parse(time.Text) + 2)函数输入为0。
2.1 操作流程
(注:如没有安装Microsoft Speech SDK 5.1和Microsoft Speech SDK 5.1 Language Pack的计算机则会提示:“语音库不存在,请安装Microsoft Speech SDK 5.1和Microsoft Speech SDK 5.1 Language Pack!” )
3.2.2 部分抽点模块
1.1设计方法
本功能模块主要实现按总人数比例生成随机抽点名单和更具历史出勤情况生成抽点名单,然后根据生成的抽点名单进行无声或语音点名。并向数据库记录下点名记录。主要工作流程见下图:
1.2界面设计
点击tabControl1上的部分点名选项卡,这时出现一个空白界面。然后向此界面上分别添加八个button按钮、一个checkBox、trackBar、两个comboBox、两个dataGridView和六个Label。再给上述控件设定相应的参数,具体参数见下表:
类型 Name Text
button openfile_1 打开
button back_1 上一个
Button next_1 下一个
Button appeare_1 开始
Button absent_1 缺勤
Button random 随机抽点
Button duty 出勤抽点
button re_1 重读
checkBox checkBox2 随机抽点
trackBar trackBar2
comboBox percent
comboBox time_1
dataGridView dataGridView2
dataGridView dataGridView3
Label tato1
Label name_1
Label Label3 次
Label Label4 第
Label Label5 抽点比例
Label Label7 抽点名单:
Label Label9 (注:1表示已到,0表示缺席。)
(注:向time_1的Itmes属性装入30个点名次数。例如:1,2,3...。
向percent的Itmes属性装入百分比。例如:10%、20%、30%、40%、50%、60%、70%、80%再对trackBar2的maximum和minmum赋值分别为100和0。)
这样部分抽点功能模块的界面就设计好了,如图所示:
1.3主要程序说明
1 基本函数
//创建到excel数据库的连接(同上,略)
//返回DataAdapter(同上,略)
//将数据装入到DataSet里面(同上,略)
//声明一个类,确定更改字段名。用于对数据的的修改添加。(同上,略)
//用于修改数据库内的数据(同上,略)
//显示文件到DataGridView2
显示文件到DataGridView3
public void dt_1(DataGridView Dgv,int[] ax)//创建数据表格用于装和显示生成的名单
{
DataTable dt1 = new DataTable();
DataColumn dc1 = new DataColumn("姓 名", Type.GetType("System.String"));
DataColumn dc2 = new DataColumn(time_1.Text, Type.GetType("System.String"));
dt1.Columns.Add(dc1);
dt1.Columns.Add(dc2);
for (int ij = 0; ij < (int)nummen; ij++)
{
//ij = Num(arrNum, ij);
if (ij < (int)nummen)
{
DataRow dr = dt1.NewRow();
dr["姓 名"] = reutrnDs().Tables[0].Rows[ax[ij]][1];
dr[time_1.Text] = reutrnDs().Tables[0].Rows[ax[ij]][int.Parse(time_1.Text)+2];
dt1.Rows.Add(dr);
}
}
Dgv.DataSource = dt1;
}
3.2.2.1 随机抽点子模块
在随机抽点子模块要做到的功能是从原始点名名单里随机的抽出一部分人来生成一个随机点名名单,然后对其进行点名。
随机抽点子模块主要利用一个随机函数来对DataSet数据集里面的学生所在行进行随机抽点。在DataSet数据集里面的数据是以二维表方式存放的,在这个二维表里面每一行代表一个学生及其出勤记录。而行号就是确定学生姓名的关键字了。我的做法是首先得到总行数row,确定抽点人数比例用这个比例去乘以row得出抽点人数nummen,然后再从0-row中随即抽取nummen个不相同的数字存放在数组arrNum中。这样就确定了抽点名单了,再将名单显是在dataGridView3里。点名时就只对arrNum数组里相对应行号的学生点名。
具体流程示意图:
主要相应函数:
//产生随机数并装入数组arrNum
int[] arrNum;
public int[] getRandomNum(int num, int minValue, int maxValue)
{
Random ra = new Random(unchecked((int)DateTime.Now.Ticks));
arrNum = new int[num];
for (int i = 0; i <= num - 1; i++)
{
arrNum[i] = 1234567;
}
int tmp = 0;
for (int i = 0; i <= num -1; i++)
{
tmp = ra.Next(minValue, maxValue); //随机取数
arrNum[i] = getNum(arrNum, tmp, minValue, maxValue, ra); //防止取到重复的数字,并值赋到数组中
}
return arrNum;
}
//判断是否有重复随机数
public int getNum(int[] arrNum, int tmp, int minValue, int maxValue, Random ra)
{
int n = 0;
while (n <= arrNum.Length - 1)
{
if (arrNum[n] == tmp) //利用循环判断是否有重复
{
tmp = ra.Next(minValue, maxValue); //重新随机获取。
tmp = getNum(arrNum, tmp, minValue, maxValue, ra);//递归:如果取出来的数字和已取得的数字有重复就重新随机获取。
}
n++;
}
return tmp;
}
3.2.2.2 出勤抽点子模块
出勤抽点子模块要做到的功能主要是根据学生每个人的历史出勤情况有针对性的按比例生成点名名单。也就是缺勤次数越多的学生被加入这个点名名单的几率越大。
出勤抽点子模块主要是利用两个数组和一个随机函数做到的。首先,获取DataSet内的点名名单的行数row,然后根据选取的抽点人数百分比得出抽点人数nummen。将0-row行学生的行号装入数组aa。之后对整个DataSet数据集里装的每个学生的出勤情况进行遍历,如有缺勤记录则向aa数组继续装入一次相应的行号(即同一个人出现几次缺勤就装几次他的行号进去增加被抽中的几率)。在遍历数据的同时记下所有人总的缺勤次数z。然后利用getRandomNum函数从0-row+z中随机取出nummen个不相同的数字存入arrNum。现在就可以根据arrNum内存的数据确定aa的相应行号,通过aa又可以确定DataSet数据集里面装得学生名单的行号了。实际上arrNum数组里面装得就是生成的出勤名单了。
流程示意图:
主要相应函数:
将将0-row行学生的行号和缺勤记录的行号装入数组aa。
z = row;
if (z <= 30)
t = 1;
if (30 < z && z <= 80)
t = 2;
if (80 < z && z <= 160)
t = 3;
if (160 < z)
t = 4;
aa = new int[row * row * t];
//原有行装入数组
for (a = 0; a < row; a++)
aa[a] = a;
//增加行装入数组
int dc = 0;
string dd = dc.ToString();
for (c = 0; c < row; c++)
for (a = 3; a < column; a++)
{
if (dd == reutrnDs().Tables[0].Rows[c][a].ToString())
{
for (int k = 0; k < t; k++)
aa[z] = c; z++;
}
}
出勤随机函数
Int wz;
public int[] getRandomNum(int num, int minValue, int maxValue)
{
wz=0;
Random ra = new Random(unchecked((int)DateTime.Now.Ticks));
arrNum = new int[num];
for (int i = 0; i <= num - 1; i++)
{
arrNum[i] = 1234567;
}
int tmp = 0;
for (int i = 0; i <= num -1; i++)
{
tmp = ra.Next(minValue, maxValue); //随机取数
arrNum[i] = getNum(arrNum, tmp, minValue, maxValue, ra); //取出值赋到数组中
wz++;
}
return arrNum;
}
//判断是否有重复随机数
public int getNum(int[] arrNum, int tmp, int minValue, int maxValue, Random ra)
{
int n = 0;
while (n <wz)
{
if (arrNum[n] == tmp||aa[arrNum[n]]==aa[tmp]) //利用循环判断是否有重复
{
tmp = ra.Next(minValue, maxValue); //重新随机获取。
tmp= getNum(arrNum, tmp, minValue, maxValue, ra);//递归:如果取出来的数字和已取得的数字有重复就重新随机获取。
}
n++;
}
return tmp;
}
2.1 操作流程
3.2.3 课堂答题抽点模块
1.1 设计方法
由于大学课堂人数众多,任课教师记不得很多学生的姓名。提供此功能主要免去了教师反复抽点某些认识的学生,使每个学生都有被抽到的机会。本功能模块主要实现课堂教学过程中任课教师进行的答题抽点功能,同时还提供小型浮动窗口置顶显示的功能方便教学时在PowerPoint、Word和其他一些演示功能的界面上进行抽点,这样就不会影响教学。
主要工作流程见下图:
1.2 界面设计
点击tabControl1上的答题点名选项卡,这时出现一个空白界面。在界面上添加一个button按钮和一个Label。再给上述控件设定相应的参数,具体参数见下表:
类型 Name Text
Label Label8 进入课堂答题点名系统!
button Button1 进 入
这样答题点名功能模块的部分界面就设计好了,如图所示:
现在开始设计答题点名窗体首先在课堂点名解决方案中添加一个窗体命名为que。然后向窗体上添加五个button、一个checkBox和三个label。再给上述控件设定相应的参数,具体参数见下表:
类型 Name Text
button openfile_3 选择名单
button Random_1 点名
button Button1 关闭
button Button2 显示置顶
button Button3 重读
checkBox checkBox1 语音
label Label1 请
label Label2 答题!
label Label3
这样答题点名功能模块的界面就设计好了,如图所示:
1.3主要程序说明
主窗体main部分:
本段代码主要用来进入子船体que
答题点名下的进入que界面的的button按键的事件
private void button1_Click(object sender, EventArgs e)
{
this.Hide();
qus qus = new qus();
qus.ShowDialog();
this.Close();
}
子窗体que部分:
本窗体主要用来进行答题点名功能。
首先选择点名名单利用open();函数
public void open()
{
ds.Clear();
this.openFileDialog1.ShowDialog();
string MyFileName = this.openFileDialog1.FileName;
address = MyFileName.Trim();
string strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + address + ";Extended Properties=Excel 8.0";
System.Data.OleDb.OleDbConnection conn = new OleDbConnection(strConn);
string strCmdText = "select * from [Sheet1$]";
OleDbDataAdapter od = new OleDbDataAdapter(strCmdText, conn);