课堂点名软件(一)

时间:2021-03-20 15:15:34 计算机毕业论文 我要投稿

课堂点名软件(一)

课堂点名软件
 目  录
一、绪  论 2
1.1.当代大学生出勤的现状 2
1.2.对大学课堂点名现状的分析 3
二、对课堂点名软件的分析 3
2.1 设计思想 3
2.1.1 系统的设计思想 3
2.1.2  系统的设计目标 4
2.1.3  系统的基本框架 4
2.1.3.1 总体模块结构 5
2.1.3.2 子模块结构 5
2.1.4  系统的实现环境 7
2.1.4.1 硬件环境 7
2.1.4.2 软件环境 7
2.2开发工具的选用及介绍 7
三、课堂点名软件的具体设计与实现 10
3.1数据表的设计与实现 10
3.2 课堂点名软件的软件部分设计 11
3.2.1 全体点名模块 12
3.2.2 部分抽点模块 21
3.2.2.1 随机抽点子模块 25
3.2.2.2 出勤抽点子模块 26
3.2.3 课堂答题抽点模块 29
3.2.4 出勤统计模块 33
四、系统的测试与运行 37
4.1   软件测试 37
4.2 测试小结 37
参考文献 38

课堂点名软件(一)

 


一、绪  论
在电器化教学飞速发展的今天,计算机成为课堂辅助教学的重要工具。它在课堂教学的课件演示、课堂实验、课堂学生管理等各个方面发挥着重要的作用。目前课堂教学,尤其是大学课堂教学课件的演示主要是用计算机来实现的,很多的课堂实验也是用计算机模拟可以实现的。而学生管理等方面更是少不了计算机的应用,从一名大学生进入大学校园的那一天起他的档案资料就被录入了学校的计算机。为了更好的管理学生日常的学习、生活大学校园也实现了自动化办公和自动化教学。这种种自动化办公和自动化教学也是由各种功能的软件所支撑其来的。可见计算机软件管理在学生管理中起到了很大的作用。所以我想到了设计一个课堂点名软件来辅助课堂教学。本软件采用Microsoft Visual Studio 2005.NET的Visual C#进行编写。

关键字:课堂点名,点名,课堂,软件
1.1.当代大学生出勤的现状
大学生是国家青年中的精华,是未来建设祖国、实现中华民族伟大复兴的中坚力量;而大学又是人一生中学习知识、锻炼能力的关键时期。大学生在大学中能够接受多少知识直接关系到他们未来的发展,决定他们能不能担当起祖国合格建设者的光荣职责。在大学生的学习生活中,学校教育无疑是最重要的环节,通过老师们的言传身教,大学生能够迅速掌握各种知识,提升个人素质。但是,在当代大学生却存在一个及其普遍的现象——逃课,“必修课选逃、选修课必逃”成为很多学生的上课准则,一个课堂上只有寥寥数人的景象经常发生;有些课堂上虽然有不少人在上课,但迟到、早退,上课中途又逃课等现象却频频会发生。
学生的天职是学习,上好每一节课是其最基本的任务,也是其汲取知识、增长才干的最基本途径。而近些年来,大学生逃课现象在大学校园里普遍出现,并由逐步蔓延的趋势,几乎成了高校中流行的通病,严重影响了大学的教学质量。大学生出勤率的高低是衡量大学教学管理是否科学的标准之一.只有保证有较高的出勤率,才能保证教学质量,才能让学生学到更多的科学文化知识,才能更好的提高大学生科学文化素质.据此希望大学能够采取科学的措施来改善这种状况,营造良好的大学学风,为学生负责,为社会负责。
高校扩招以来,伴随着教育改革的深入,越来越多的青年学子能够有机会步入理想的大学校园,实现青春的梦想.但是大学生并非一些人心中的殿堂,当不少大学生感受到大学所带来的压力时,彷徨和困惑接踵而至.此时,逃课成了他们逃避现实的方法之一.首先,同学们对于"必修课选逃,选修课选逃"等对旷课的说法普遍持有"可以接受"的态度,站人说的70%.虽然没有人支持逃课,但是明确反对的仅占20%,而抱"无所谓"心态的同学则可以理解为默许,占到总人数的10%.(如表1)
    表1对旷课的看法
 支持 反对 可以接受 无所谓
人数 1 2 21 3
百分比 0% 20% 70% 10%

这是旨在了解同学在思想认识上是如何看待逃课现象的,他们在各自思想的指导下,表现为"逃课"或者"不逃课"的行为,与此相吻合的是,同学中有逃课经历的人数竟然站调查人数的66.7%.其中,逃课缺勤的课程选择上,"对其无兴趣的"占总人数的63.33%,"课程管理松的"占26.67%.(如表2)
   
 表2缺勤较多的课程
 专业课 基础课 课程管理松 无兴趣
人数 1 2 8 19
百分比 3.33% 6.67% 26.7% 63.33%
1.2.对大学课堂点名现状的分析
通过上述对当代大学生出勤现状的调查分析,我们得出一个结论当代大学生课堂出勤率持续低下以成普遍现象。目前大学期间学生获得知识增长才干的主要途径仍是课堂教学,但在如今低下得出勤率的情况下学生在课堂又能学到多少知识令人堪忧。由此大部分学校或任课教师为保证教学质量让更多的学生学到更多的知识,采用了课堂点名签到的办法提高出勤率。此方法确实起到了立竿见影的效果,很多课堂上又出现了座无虚席的景象。有保障的出勤率使得教学质量大大提高。
目前任课教师课堂点名一般采用两种方式,即逐个对全部学生点名和自己进行抽点。全部逐个点名的好处显而易见,它可以真实的记录和反映所有学生得出勤情况,具有很强的说服力。但是此方法的弱点也是显而易见的耗时多,教师点名工作量大占去课堂教学的大量时间。为此抽点则要实用的多,可以短时间完成点名减少教师点名工作量,从而减少因点名而占用的课堂时间。不过这种点名方式也有它的弊端,他带有教师强烈的主管情绪。做不到真正公平的随机抽点,也做不到按一定比例进行抽点。
目前课堂点名大多还是使用传统的点名方式,即任课教师手持学生点名名单对名单上的学生姓名点出,然后由学生答到再由教师对点名名单进行手工的记录出勤与否。如此教师每次给不同的班上课都要带多份纸制名单很不方便,而且名单容易丢失。点名期间点错后不易修改,且教师每次点名工作量大。有时由于课堂人多人声嘈杂还会出现漏点、错点和点名效率低下的情况。
二、对课堂点名软件的分析
2.1 设计思想
2.1.1 系统的设计思想
        先进性:采用先进的计算机和数据库技术,选用具有良好发展前景的产品,为应用及开发创造一个良好的环境,使系统具有先进性,并在相当长的时期内不失其先进性。
        实用性:选用的产品技术先进、成熟,支持软件多、开发工具丰富,价格合理,符合国际、国家或行业标准;用户界面做到直观、友好,业务人员只需经过简单培训即可操作。在归纳共性的基础上充分考虑具体商业企业的个性,使之成为一个结构合理、功能齐全、界面友好、实用性强的系统。
        可靠性:采用良好的操作系统和数据库,确保数据的一致性和完整性,并使系统免受病毒感染。提供完善的数据备份方案和系统崩溃后的恢复手段。
        可维护性:系统提供强有力的数据库管理功能,能有效地进行数据库系统的管理、维护、监视;能方便地进行系统的控制、重组和性能调整,使系统保持良好的性能。应用系统应有相应的管理、维护功能,提供用户帮助功能以方便用户的使用和维护。
        可扩充性:学生名单的增减不影响系统的运行;系统设备配置灵活方便,兼容性和开放性好,便于升级;应用软件实现模块相互独立,控制程序和执行程序相分离,具有高度的程序独立性和数据独立性,使机构和业务变化的影响减至最小,方便了扩充和修改。
2.1.2  系统的设计目标
操作界面简单,容易操作。
实现课堂全部点名的功能和指定某人点名。
实现按人数比例对学生进行随机抽点和根据历史出勤情况进行智能抽点。
实现课堂答题的随机抽点功能。
实现语音化点名或无声点名。
实现对点名数据的统计分析功能。
具有点名名单的扩充性和灵活性。
2.1.3  系统的基本框架
本系统采用C/S开发模式;
C/S (Client/Server)结构,即大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。目前大多数应用软件系统都是Client/Server形式的两层结构。
C/S其结构分为两层,数据层、应用层


2.1.3.1 总体模块结构

2.1.3.2 子模块结构
2.1.3.2.1  全体点名模块

2.1.3.2.2  部分抽点模块

2.1.3.2.3  答题点名模块

2.1.3.2.4  出勤统计

2.1.4  系统的实现环境
应用系统与其所处的系统环境密切相关,一个系统的功能及性能好坏,环境起着十分显著的作用。
2.1.4.1 硬件环境
系统的硬件配置如下:
        PIII 800 CPU
        256M 内存
        15英寸显示器
        30G 硬盘
2.1.4.2 软件环境
课堂点名软件要求安装在Windows 2000以上的系统里,并要求安装Microsoft .NET Framework 2.0。若要实现中文语音点名则还必须安装Microsoft Speech SDK 5.1和Microsoft Speech SDK 5.1 Language Pack。
2.2开发工具的选用及介绍
     开发本软件开发工具主要用到了Microsoft Visual Studio 2005.NET和Microsoft Office 2003,以及Microsoft .NET Framework 2.0、Microsoft Speech SDK 5.1和Microsoft Speech SDK 5.1 Language Pack等平台的支持。
     Visual Studio .NET 是一套完整的开发工具,用于生成 ASP Web 应用程序、XML Web services、桌面应用程序和移动应用程序。Visual Basic .NET、Visual C++ .NET、Visual C# .NET 和 Visual J# .NET 全都使用相同的集成开发环境 (IDE),该环境允许它们共享工具并有助于创建混合语言解决方案。另外,这些语言利用了 .NET Framework 的功能,此框架提供对简化 ASP Web 应用程序和 XML Web services 开发的关键技术的访问。
Windows 窗体
Windows 窗体是用于 Microsoft Windows 应用程序开发的、基于 .NET Framework 的新平台。此框架提供一个有条理的、面向对象的、可扩展的类集,使您能够开发功能丰富的 Windows 应用程序。另外,Windows 窗体可作为多层分布式解决方案中的本地用户界面。

.NET Framework 旨在实现下列目标:
提供一个一致的面向对象的编程环境,而无论对象代码是在本地存储和执行,还是在本地执行但在 Internet 上分布,或者是在远程执行的。
提供一个将软件部署和版本控制冲突最小化的代码执行环境。
提供一个可提高代码(包括由未知的或不完全受信任的第三方创建的代码)执行安全性的代码执行环境。
提供一个可消除脚本环境或解释环境的性能问题的代码执行环境。
使开发人员的经验在面对类型大不相同的应用程序(如基于 Windows 的应用程序和基于 Web 的应用程序)时保持一致。
按照工业标准生成所有通信,以确保基于 .NET Framework 的代码可与任何其他代码集成。
.NET Framework 具有两个主要组件:公共语言运行库和 .NET Framework 类库。公共语言运行库是 .NET Framework 的基础。您可以将运行库看作一个在执行时管理代码的代理,它提供内存管理、线程管理和远程处理等核心服务,并且还强制实施严格的类型安全以及可提高安全性和可靠性的其他形式的代码准确性。事实上,代码管理的概念是运行库的基本原则。以运行库为目标的代码称为托管代码,而不以运行库为目标的代码称为非托管代码。.NET Framework 的另一个主要组件是类库,它是一个综合性的面向对象的可重用类型集合,您可以使用它开发多种应用程序,这些应用程序包括传统的命令行或图形用户界面 (GUI) 应用程序,也包括基于 ASP.NET 所提供的最新创新的应用程序(如 Web 窗体和 XML Web services)。
.NET Framework 可由非托管组件承载,这些组件将公共语言运行库加载到它们的进程中并启动托管代码的执行,从而创建一个可以同时利用托管和非托管功能的软件环境。.NET Framework 不但提供若干个运行库宿主,而且还支持第三方运行库宿主的开发。
.NET Framework 环境

()

SAPI SDK(Microsoft Speech SDK 5.1和Microsoft Speech SDK 5.1 Language Pack)
SAPI SDK是微软公司免费提供的语音应用开发工具包,这个SDK中包含了语音应用设计接口(SAPI)、微软的连续语音识别引擎(MCSR)以及微软的语音合成(TTS)引擎等等。目前的5.1版本一共可以支持3种语言的识别 (英语,汉语和日语)以及2种语言的合成(英语和汉语)。SAPI中还包括对于低层控制和高度适应性的直接语音管理、训练向导、事件、语法编译、资源、语音识别(SR)管理以及TTS管理等强大的设计接口。其结构如图(1):


图(1)
语音引擎则通过DDI层(设备驱动接口)和SAPI(SpeechAPI)进行交互,应用程序通过API层和SAPI通信。通过使用这些API,用户可以快速开发在语音识别或语音合成方面应用程序。
()

三、课堂点名软件的具体设计与实现
3.1数据表的设计与实现
   本系统使用Microsoft Office 2003 里的EXECL表作为数据库。这主要是介于目前学校实际网络情况而定的,如设计SQL Server 2000等数据库实现全校统一管理则需要良好的网络环境。通过实际了解本了教室的网络情况得出以下不利因素:
1.网络稳定性差
2.网络病毒流行
3.很多教室网络完全不通
为了能够更好的保障本系统的使用。所以,选择了基于本地数据库的设计方法。
其次,从了解得知任课教师从教务处获得的名单格式为Html的网页格式。具体请见下图:

名单为Html网页格式。介于对Html网页文件的`操作安全性、数据存储性和可操作行方面考虑,所以放弃了直接将Html网页作数据库的设计。从而选择了操作更加简单,安全性更高的EXCEL表做数据库。
EXECL点名数据库的结构如下:
列  名 类   型
序号 常   规
姓名 常   规
学号 常   规
第一次 常   规
… …
在本数据库中用1和0表示出勤和缺勤的记录,空值表示未点名。
任课教师可以方便的自行建立数据库进行点名。具体方法是:将原名单的Html文件打开,将其中表格内的所有行和所有列进行复制,然后新建一个excel表,打开新建的excel表,在excel表的第一个空点击鼠标右键粘贴,然后保存退出即可。如此一个学生数据库名单就建立成功,便可以方便的进行点名操作了。
建立好的数据库具体见下图:

3.2 课堂点名软件的软件部分设计
本系统主要为实现:
操作界面简单,容易操作。
实现课堂全部点名的功能和指定某人点名。
实现按人数比例对学生进行随机抽点和根据历史出勤情况进行智能抽点。
实现课堂答题的随机抽点功能。
实现语音化点名或无声点名。
实现对点名数据的统计分析功能。
具有点名名单的扩充性和灵活性。
为实现上述点名功能本系统由两个Winform窗体和四个的模块组成。两个Winform窗体分别为main主窗体和que答题点名窗体。main主窗体主要由全体点名模块、部分抽点模块和出勤统计模块组成,而que答题点名窗体主要由课堂答题抽点模块组成。具体架构如下所示:

3.2.1 全体点名模块
1.1 设计方法
     本模块用于对全体学生进行点名,也可以指定对某人进行点名。需要实现无声点名和语音点名功能,并向数据库记录下点名记录。主要工作流程见下图:


1.2界面设计
    打开Microsoft Visual Studio 2005,选择【文件】|【项目】|【Visual C#】|【Windows应用程序】命令,然后就可以新建项目,如图所示:


这时在窗口上会出现一个新窗体。向窗体中添加一个tabControl用于切换各个模块的功能界面。如图所示:

    然后向tabpage1上添加控件,分别为八个button,;再填加一个checkBox、trackBar、comboBox和dataGridView;最后添加五个Label。再给上述控件设定相应的参数,具体参数见下表:
类型 Name Text
tabpage Tabpage1 全体点名
tabpage Tabpage2 部分点名
tabpage Tabpage3 答题点名
tabpage Tabpage4 出勤统计
button openfile 打开
button top 第一个
button tail 最后一个
button back 上一个
button next 下一个
button appeare 开始
button absent 缺勤
button red 重度
checkBox checkBox1 语音点名
trackBar trackBar1 
comboBox time 
dataGridView dataGridView1 
Label Label1 第
Label Label2 次
Label Label10 (注:1表示已到,0表示缺席。)
Label tato 
Label name 
(注:向comboBox1的Itmes属性装入30个点名次数。例如:1,2,3...。再对trackBar1的maximum和minmum赋值分别为100和0。)
这样第一个功能模块的界面就设计好了,如图所示:

1.3主要程序说明
   1 基本函数
//创建到excel数据库的连接
public OleDbConnection returnConn()
        {
            string strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + address + ";Extended Properties=Excel 8.0";
            System.Data.OleDb.OleDbConnection conn = new OleDbConnection(strConn);
            return conn;
        }
        //返回DataAdapter
        public OleDbDataAdapter returnRa()
        {
            string strCmdText = "select * from [Sheet1$]";
            OleDbDataAdapter od = new OleDbDataAdapter(strCmdText, returnConn());
            return od;
        }

        //将数据装入到DataSet里面
        DataSet ds;
        public DataSet reutrnDs()
        {
            if (ds != null) //用于判断数据集是否为空,防治数据集的重读现象。
            {
                return ds;
            }
            else
            {
                ds = new DataSet();
                returnRa().Fill(ds, "ds");
                return ds;
            }
        }

//声明一个类,确定更改字段名。用于对数据的的修改添加。
        public string ReturnName(int i)
        {
            string[] AllName = new string[] { "序号", "姓 名", "学 号", "第1次", "第2次", "第3次", "第4次", "第5次", "第6次", "第7次", "第8次", "第9次", "第10次", "第11次", "第12次", "第13次", "第14次", "第15次", "第16次", "第17次", "第18次", "第19次", "第20次", "第21次", "第22次", "第23次", "第24次", "第25次", "第26次", "第27次", "第28次", "第29次", "第30次" };
            if (i >= 0 && i < AllName.Length)
                return AllName[i];
            else
                MessageBox.Show("值错误");
            return "";
        }

         //打开文件
        public void open()
        {
            this.openFileDialog1.ShowDialog();
            string MyFileName = this.openFileDialog1.FileName;//获取文件地址
            address = MyFileName.Trim();
            if (address != "")
            {
                row = reutrnDs().Tables[0].Rows.Count;//获取名单的总行数
                column = reutrnDs().Tables[0].Columns.Count;//获取名单的总列数
            }
        }

//显示文件到DataGridView1
        void dis(DataGridView Dgv, Label lab, int i, int j)
        {
            returnConn();
            returnRa();
            Dgv.DataSource = reutrnDs().Tables[0].DefaultView;//将名单显示到dataGridView1里面
            lab.Text = reutrnDs().Tables[0].Rows[i][j].ToString();//将人名显示到name里面
        }


//用于修改数据库内的数据
        public void BindToView(int UpValue, int whichUpdateRow, int whichUpdateCl)
        {
            DataSet ds = reutrnDs();
            try
            {

                ds.Tables["ds"].Rows[whichUpdateRow][whichUpdateCl] = UpValue;
            }
            catch
            {
                MessageBox.Show("类型不匹配或者主键不可更改");
                return;
            }
            OleDbDataAdapter od = returnRa();
            if (true)
            {
                if (ds.Tables["ds"].GetChanges() != null)
                {
                    OleDbConnection conn = returnConn();
                    od.UpdateCommand = new OleDbCommand();
                    od.UpdateCommand.CommandText = "update [sheet1$] set " + ReturnName(whichUpdateCl) + "='" + ds.Tables["ds"].Rows[whichUpdateRow][whichUpdateCl].ToString() + "' where [" + ReturnName(2) + "]=" + ds.Tables["ds"].Rows[whichUpdateRow][2].ToString();
                    od.UpdateCommand.Connection = conn;
                    conn.Open();;
                    od.UpdateCommand.ExecuteNonQuery();
                }
            }


点击事件程序
首先编写了“打开”按键下的点击事件。用于选择要打开的excel数据库文件。并将其显示在dataGridView1、name和tato里面。dataGridView1用于显示选定的整个数据库的内容,name显示当前点名学生的姓名,tato用于显示数据库名称,一般可设为班级名称。
private void openfile_Click(object sender, EventArgs e)
        {
            if (ds != null) //将数据集清空,以备用。
            {
                ds.Dispose();
            }

            open();
            if (address != "")
            {
                i = 0; //数据的行控制
j = 1; //数据的列控制
hang = 0; //用于控制dataGridView1里面的光标移动
                l = 1; //用于判断是否选择了名单
                dis(dataGridView1, name, i, j);
                dataGridView1.CurrentCell = dataGridView1.Rows[i].Cells[1];
            }
            tato.Text = openFileDialog1.FileName.Substring(openFileDialog1.FileName.LastIndexOf("\\") + 1);
            appeare.Text = "开  始";
            tot = 0; //用于记录点名总人数
sd = 0; //用于记录实到人数
dy= 0; //用于控制语音朗读
        }

“上一个”按键主要程序
i -= 1;
     dataGridView1.CurrentCell = dataGridView1.Rows[dataGridView1.CurrentRow.Index + 1].Cells[1];
    name.Text = reutrnDs().Tables[0].Rows[i][j].ToString();

“下一个”按键主要程序
i += 1;
     dataGridView1.CurrentCell = dataGridView1.Rows[dataGridView1.CurrentRow.Index + 1].Cells[1];
    name.Text = reutrnDs().Tables[0].Rows[i][j].ToString();

“第一个”按键主要程序
i = 0;
       dataGridView1.CurrentCell = dataGridView1.Rows[0].Cells[1];
     name.Text = reutrnDs().Tables[0].Rows[i][1].ToString();

“最后一个”按键主要程序
i = row-1;
       dataGridView1.CurrentCell = dataGridView1.Rows[0].Cells[1];
     name.Text = reutrnDs().Tables[0].Rows[i][1].ToString();

“开始”按键主要程序
本按键主要用于朗读姓名和记录出勤。记录出勤主要调用到BindToView(1, i, int.Parse(time.Text) + 2)函数。
编写语音函数首先要安装Microsoft Speech SDK 5.1和Microsoft Speech SDK 5.1 Language Pack。然后在Visual Studio 2005.NET程序里添加引用中的COM里引用Microsoft Speech Object Library。


语音朗读部分程序:
Try  //用于将语音函数实例化和初始化
                        {
                            svsf = new SpeechVoiceSpeakFlags();
                            svc = new SpVoiceClass();
                            svetType("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(in           od.Fill(ds,"ds");
        }

然后可以选择是否置顶显示,主要代码如下
if (top == 0)
            {
                this.TopMost = true;
                button2.Text = "取消置顶";
                top = 1;
            }
            else
            {
                this.TopMost = false;
                button2.Text = "置顶显示";
                top = 0;
            }

然后选择是否需要语音点名,然后开始点名。主要代码如下:
Random ra = new Random();
          name_3.Text =ds.Tables[0].Rows[ra.Next(0, ds.Tables[0].Rows.Count)][1].ToString();
                if (checkBox1.Checked == true)
                {
                    try
                    {
                        svsf = new SpeechVoiceSpeakFlags();
                        svc = new SpVoiceClass();
                        svc.SetVolume(Convert.ToUInt16(80));
                        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;
                    }
                    mythread = new Thread(Voice);
                    mythread.Start();
                }
2.1 操作流程


3.2.4 出勤统计模块
1.1 设计方法
本功能模块主要为实现对历史出勤情况的一个统计汇总。主要分为学生个人出勤情况统计和班级出勤情况统计。主要工作流程见下图:


1.2 界面设计
点击tabControl1上的出勤统计选项卡,这时出现一个空白界面。然后向此界面上分别添加一个button按钮、dataGridView、groupBox和六个label。再给上述控件设定相应的参数,具体参数见下表:
类型 Name Text
button openfile_3 统计
dataGridView dataGridView4 
groupBox groupBox1 班级出勤情况:
label Label6 个人出勤情况:
label Label11 班  级:
label Label12 总人数:
label Label13 出勤总人次:
label Label14 缺席总人次:
label Label15 出 席 率:
这样出勤统计模块的界面就设计好了,如图所示:


1.3 主要程序代码说明
主要用于计算并显示统计结果。
算法示意:


public void dt_3(DataGridView Dgv)
        {   int c1,ct,cf=0,cg=1,to=0,cto=0;
            string c0=cf.ToString() ,cv=cg.ToString();
            DataTable dt3 = new DataTable();
            DataColumn dc1 = new DataColumn("姓  名", Type.GetType("System.String"));
            DataColumn dc2 = new DataColumn("缺席次数", Type.GetType("System.String"));
            DataColumn dc3 = new DataColumn("点名总次数", Type.GetType("System.String"));
            dt3.Columns.Add(dc1);
            dt3.Columns.Add(dc2);
            dt3.Columns.Add(dc3);
            for (int ij = 0; ij < row; ij++)
            {
                ct=c1=0;
                DataRow dr = dt3.NewRow();
                dr["姓  名"] = reutrnDs().Tables[0].Rows[ij][1];
                for (int cc = 3; cc<column;cc++ )
                {
                    if (reutrnDs().Tables[0].Rows[ij][cc].ToString()== c0)
                    {
                        c1++;
                        ct++;
                        cto++;
                    }
                    if (reutrnDs().Tables[0].Rows[ij][cc].ToString() == cv)
                    {
                        ct++;
                        to++;
                    }

                }
                dr["缺席次数"] = c1;
                dr["点名总次数"] = ct;
                dt3.Rows.Add(dr);
            }
            Dgv.DataSource = dt3;
            label11.Text += "  " + openFileDialog1.FileName.Substring(openFileDialog1.FileName.LastIndexOf("\\") + 1);
            label12.Text += "  " + row+"人";
            label13.Text += "  " + to+"人次";
            label14.Text += "  " + cto+"人次";
            float ccf;
           ccf= (float)to / ((float)to + (float)cto)*100;
            label15.Text += "  " +ccf.ToString("F")+"%";
        }
2.1操作流程
只需点击“统计”按钮,便可生成通解结果。
四、系统的测试与运行
4.1   软件测试
 尽管软件质量保证是贯穿软件开发全过程的活动,但最关键的步骤是软件测试,软件测试是对软件规格说明、软件设计和编码的最后复审,目的是在软件产品交付之前尽可能发现软件中潜伏的错误。大量统计表明,软件测试工作量往往占软件开发总工作量的40%以上。
这个阶段是用来测试程序,找出系统Bug并修改错误的过程。虽然在每个模块开发的过程中都进行过阶段性的测试,但是现场整体测试更接近将来系统投入使用的情况。
在查阅了资料后,了解到系统的整体测试方法主要有非渐增测试法和渐增测试法两种。其中渐增测试法适用于模块间数据流多、可以单独测试各个模块到测试多的模块的情况。由于系统各部分之间有密切的关系,所以选择渐增测试法作为测试的方法。
 测试时首先对各个模块的功能进行测试,对照需求分析逐个测试系统的功能;然后对照数据库的内容察看各个查询功能反馈的结果是否正确;最后整体运行系统,测试各个模块之间的衔接是否会对系统的整体性能发生影响。为了测试程序的健壮性,还可以在测试过程中故意输入一些错误的数据,保证系统能够自行处理这些错误,使得系统在日常的使用中不会由于工作失误而无法运行。

测试小结
在测试过程中,确实发现了很多的错误。一部分因为开发环境与实际使用环境不同产生的,比如说图片的效果不对,或者控件的位置出现偏移等等;还有数据库的连接问题,在不同的计算机上因为计算机名的不同导致无法连接数据库,这些问题通过现场的调试基本得到了解决。
使用面向对象的开发工具进行系统开发后,由于其独有的特点,所以调试时与传统的程序开发语言并不完全相同,就本次开发过程中使用的Microsoft Visual Studio 2005来说,例如:在Microsoft Visual Studio 2005的定义当中,面向对象的设计方法使得很多模块的变量封装起来,由此,对象的变量常常是不可见的,定义全局变量一定要在窗体之外的公用模块中,而且要定义为公用。
另一部分错误却出乎意料,比如说有些控件数组的初始化问题。因为要知道很多情况下程序的错误是连锁性的,一个语句错误,其后相关语句也跟着出错,所以找出错误源是很重要,在程序中设置断点或在调试模式下执行程序,可以快速发现和纠正错误,把无法初始化的控件元素单独初始化后,问题可以得到解决。
经过测试的过程,认识到自己在程序的编写和思路方面都存在一定的问题,相信经过不断的学习和经验积累,可以实现较大的改观。

参考文献
张忠国. Visual C#中随机数使用实例
关于红叶二级电站生产管理系统开发要求. 红叶二级电站生产管理系统 2008
配网管理系统---需求分析说明书. 红叶二级电站生产管理系统 2008
商小千. 燕山大学里仁学院“两课”社会调查报告 2006
白  春. POS系统在零售行业的应用  2005

c.SetVolume(Convert.ToUInt16(trackBar1.Value));
                            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);
 

【课堂点名软件(一)】相关文章:

幼儿园点名游戏的方式11-11

2017物流师考试重点名词解释10-28

一套软件测试笔试题目11-20

软件著作权登记一般要多久03-24

软件专业简历02-17

国产CAD软件12-05

CAD软件技巧08-12

CAD软件与office办公软件的完美结合12-06

一套比较完整的软件测试人员笔试题11-20

计算机一级考试题库软件12-18