实验11:《单项成绩处理与数据集》实验指导书
文/尚小卫
【工作目标】
1 完成期限:4小时。
2 工作成果:用户成绩查询和数据集。
验收审核
完善全部扩展业务功能:使用标准用户管理、结构管理、页面管理、题目管理、成绩管理(单元和单项)。
实现业务功能
2个UI:
单项成绩编辑界面:
个人成绩界面:
历史纪录--单项成绩列表
指定单元不同题目成绩列表。
显示所有课程、登录课程、训练单元、训练内容和训练题目的成绩列表。
历史纪录--单项成绩图示
将查询的单项成绩列表显示为统计图。
1个BT:扩展单项成绩查询方法
SQL方法
登录用户本课程数据处理
历史纪录 -- 全部数据列表
成长纪录 -- 里程碑数据列表
对象方法
掌握标准组件 单项成绩类和 C#数据集。
标准 BT组件 btSHFItemScore、 btSHFItemScores
数据集 DataSet
3 验收标准。
验收审核
审核内容:
使用标准用户管理、结构管理、页面管理、题目管理、成绩管理(单元和单项)。
验收方法:
从实验程序进入,分步执行一个完整的业务流程:登录用户,选择一个核心业务训练(游戏),选择课程内容,完成一组训练,察看单元成绩和单项成绩。
从应用程序进入,自动执行一个完整的业务流程。
编程实现 完成单项成绩类的编辑和显示界面模块。
验收内容:
UI项目 2个窗体
实现一个单项成绩类btSHFItemScore的编辑窗口
实现一个用户的单项成绩btSHFItemScore的显示窗口
BT项目 3个方法
用户数据处理方法
登录用户的所有课程所有单项成绩的查询方法。
登录用户的登录课程所有单项成绩的查询方法。
登录用户的登录课程指定单元所有单项成绩并且返回用户名的查询方法。(需要联合成绩表和用户表)
使用DataSet处理查询结果
构造要显示的数据列表
验收要求:
UI项目
实现一个单项成绩类btSHFItemScore的编辑窗口
实现一个单项成绩类btSHFItemScore的显示窗口
个人成绩显示界面:成绩列表、组合直方图、发展曲线、成长曲线。
成绩列表(发展-里程碑数据、历史-全部数据)
直方图:里程碑数据的组合直方图(各个训练内容)
曲线图:里程碑数据发展曲线,历史数据为成长曲线。
在实验窗体中添加单项成绩类btSHFItemScore的编辑和显示业务环节。
BT项目
登录用户成绩数据处理
在数据库单项成绩表 R_SHFItemScores 中添加有不同用户、课程、单元和题目的成绩。
使用“登录用户的所有课程所有单项成绩的查询”显示数据于单项成绩表中添加的数据相同。
使用“登录用户的登录课程所有单项成绩的查询”显示数据于单项成绩表中添加的数据相同。
使用“登录用户的登录课程指定单元所有单项成绩并且返回用户名的查询”显示的用户名与用户表中的数据一致。(需要联合成绩表和用户表)
实验项目
2个UI业务环节
单项成绩类btSHFItemScore的编辑窗口可以浏览编辑各个单项成绩和成绩项目。
个人成绩显示界面:单项成绩列表、组合直方图、发展曲线、成长曲线。
3个BT业务功能
SQL查询:在实验窗体数据库访问列表中显示相应方法的SQL语句。
技术文档:需求列表、程序列表。
程序列表:V07-2.11版,添加单项成绩编辑、用户成绩显示界面、2个UI实验功能和3个BT实验功能。
工作文档:工作日志、实验报告。
工作日志:与模板一致,Word文档实现。
1 日志内容:工作项目名称、开始时间、结束时间。完成那些具体工作。
2 验收要求:Word 文档,格式与模板相同。
实验报告:
1 报告内容:图示纪录实际操作步骤,重点是编程实验部分的各个步骤。
2 验收要求:其他同学可以按照提交的实验报告重复实现相同的实验。
项目审核:按顺序验收。
【实验目的】
本实验为数据处理编程实践,重点掌握2种数据处理方法和数据图形显示编程方法。
巩固2种数据处理方法
SQL语句查询方法:使用数据库查询语句是一种成熟、简洁、方便的数据处理模式。
C#编程处理方法 :使用对象编程处理方法是一种灵活应对复杂业务逻辑的数据处理模式。
掌握数据集DataSet的基本编程方法,创建表、列、行,添加数据,访问数据。
【实验环境与工具】
Microsoft Visual Studio .NET 2008
C#编程语言
《尚府教学》实验工具
-标准BT组件 btSHFItemScore、 btSHFItemScores
C# DataSet
单项成绩类btSHFItemScore说明
public btSHFItemScore();
public btSHFItemScore(int sid);
public btSHFItemScore(int pid, int iid, int sid, int upid, int qid, int cid, DateTime sdt, int ant, string ta, bool tr, int ts);
public int AnswerTime { get; set; }
public int ConfigID { get; set; }
public int ItemScoreID { get; }
public int ProgramID { get; set; }
public int QuestionID { get; set; }
public DateTime StartDateTime { get; set; }
public int StudentID { get; set; }
public string TestAnswer { get; set; }
public bool TestRight { get; set; }
public int TestScore { get; set; }
public int UnitPracticeID { get; set; }
public void CopyToMe(btSHFItemScore isc);
public override string ToString();
单项成绩管理类btSHFItemScores说明
public btSHFItemScores();
public btSHFItemScores(string callStr);
public int AddOne(btSHFItemScore myItem);
public int DeleteOne(int itemId);
public ArrayList GetAll();
protected ArrayList GetAll(string sql);
public DataSet GetSQL(string sql);
public int UpdateOne(btSHFItemScore myItem);
【实验过程与步骤】
准备工作:存档、升级、创建第11版作业文件夹。
验收审核:准备工作 30分钟。
重点功能:扩展功能,自检和完善扩展功能点。
编程实验:开发工作180分钟。
UI项目添加交互窗体
BT项目 数据查询和统计功能
DataSet编程举例
实验项目编程
UI项目编程 单项成绩交互窗体
实现单项成绩类的数据编辑窗体:
实现单项成绩程类的数据编辑窗体:显示标准单项成绩类(btSHFItemScore)各项说明信息,实现编辑功能。
实现个人成绩显示界面:成绩列表、组合直方图、发展曲线、成长曲线。
实现个人成绩界面:显示标准单项成绩类(btSHFItemScore)成绩列表和曲线、直方图。
BT项目编程 数据查询和统计功能
登录用户本课程数据处理
全部数据列表 --
实现登录用户的相关课程所有单元的成绩查询方法。
public DataSet GetUserHistoryDs(int userID)
{
string sql;
sql =
" Select StartDateTime, ProgramID, UnitPracticeID, TestRight, TestScore " +
" From R_SHFItemScores " +
" Where StudentID = " + userID.ToString() +
" Order By StartDateTime ";
return GetSQL(sql);
}
实现登录用户的相关课程所有单元的成绩按单元顺序排列查询方法。
实现登录用户的相关课程指定单元的成绩查询方法。
DataSet编程举例
课程里程碑
/// <summary>课程里程碑
/// 查询:只取每个单元最好成绩
/// </summary>
/// <param name="UsID">=用户ID</param>
/// <param name="PgID">=程序ID</param>
/// <returns></returns>
public System.Data.DataSet GetUserProgramUnitScoreCourseLandmarkDs(int UsID, int PgID, bool Desc)
{
DataSet ds;
string sql;
string sDesc = "ASC";
if (Desc) sDesc = "DESC";
// 构造查询语句
sql =
"Select UnitPracticeID, StartDateTime, CorrectRate, RightNumber From R_SHFUnitScores " +
"Where StudentID = " + UsID + " AND ProgramID = " + PgID +
" Order By StartDateTime " + sDesc; // 指定单元升序或降序
ds = GetSQL(sql);
// 编程查旬每个单元中里面最大的成绩值, 存放在 ds1中。
int i1 = 0;
int i2 = 0;
ArrayList al = new ArrayList();
string s = "0";
// 挑选出所有的单元练习,保存在al中
// 挑出所有的UnitPracticeID 存放到一个String[]
foreach (System.Data.DataRow row in ds.Tables["Table"].Rows)
{
s = row["UnitPracticeID"].ToString();
if (!al.Contains(s)) al.Add(s);
}
// 挑选成绩最好的一个行
// 把这个行添加到新的 DataSet的行集中
// 创建数据集
DataSet ds1 = new DataSet("myLandMark");
// 创建数据表
DataTable dtmyLandMark = new DataTable("LandMark");
// 把数据表添加到数据集中
ds1.Tables.Add(dtmyLandMark);
// 添加数据列
ds1.Tables["LandMark"].Columns.Add("UnitPracticeID", typeof(int));
ds1.Tables["LandMark"].Columns.Add("StartDateTime", typeof(DateTime));
ds1.Tables["LandMark"].Columns.Add("CorrectRate", typeof(int));
ds1.Tables["LandMark"].Columns.Add("RightNumber", typeof(int));
// 在单元练习中挑选最好成绩
// 对于每个单元练习,挑选成绩最好的一个行,添加到ds1中。
foreach (string s1 in al)
{
if (ds.Tables["Table"].Rows.Count > 0)
{
DataRow rw = ds1.Tables["LandMark"].NewRow();//根据里程碑表创建新行
foreach (System.Data.DataRow row in ds.Tables["Table"].Rows)
{
i1 = System.Convert.ToInt32(row["CorrectRate"]);
if ((i1 > i2) && (row["UnitPracticeID"].ToString() == s1))
{
rw = row;
};
}
if (rw != null) ds1.Tables["LandMark"].ImportRow(rw);
}
}
return ds1;
}
获取得分分布
/// <summary> 获取得分分布
/// </summary>
/// <param name="proramID">课程标识</param>
/// <param name="unitID">单元标识</param>
/// <param name="intvl">分数间隔</param>
/// <returns></returns>
public DataSet GetScoreNormalDistributionDs(int proramID, int unitID, int intvl)
{
string sql;
string s1 = unitID.ToString();
DataSet ds1;
// 得分查询
sql =
" Select " +
" StartDateTime, CorrectRate, RightNumber, StudentID, UnitPracticeID " +
" From R_SHFUnitScores Where ProgramID = " + proramID + " AND UnitPracticeID = " + unitID +
" Order By CorrectRate "; // 指定单元升序或降序
ds1 = GetSQL(sql);
// 创建得分分布数据集
DataSet ds2 = new DataSet("myScoreDistr");
// 添加得分表
DataTable dtScoreTable = new DataTable("ScoreTable");//创建数据表
ds2.Tables.Add(dtScoreTable);//把数据表添加到数据集中
// 添加数据列
ds2.Tables["ScoreTable"].Columns.Add("Mark", typeof(int));
ds2.Tables["ScoreTable"].Columns.Add("CorrectRate", typeof(int));
ds2.Tables["ScoreTable"].Columns.Add("RightNumber", typeof(int));
//ds2.Tables["ScoreTable"].Columns.Add("StudentID", typeof(int));
修改表头
ds2.Tables["ScoreTable"].Columns["Mark"].Caption = "分值";
ds2.Tables["ScoreTable"].Columns["CorrectRate"].Caption = "正确率";
ds2.Tables["ScoreTable"].Columns["RightNumber"].Caption = "正确数";
// 在单元练习中挑选最好成绩
// 对于每个单元练习,挑选成绩最好的一个行,添加到ds1中。
int n = ( 100 / intvl) + 1;
int[] sd1 = new int[n + 1];
int[] sd2 = new int[n + 1];
//int[] sd3 = new int[n + 1];
int i1, i2;//, i3
// 统计分值
foreach (System.Data.DataRow row in ds1.Tables["Table"].Rows)
{
i1 = System.Convert.ToInt32(row["CorrectRate"]);
i2 = System.Convert.ToInt32(row["RightNumber"]);
//i3 = System.Convert.ToInt32(row["StudentID"]);
if (row["UnitPracticeID"].ToString() == s1)
{
sd1[(i1 / intvl) + 1]++;
sd2[(i2 / intvl) + 1]++;
};
}
//制作分布表
for ( int i = 0; i < n; i++)
{
DataRow rw = ds2.Tables["ScoreTable"].NewRow();
rw["Mark"] = i * intvl;
rw["CorrectRate"] = sd1[i];
rw["RightNumber"] = sd2[i];
ds2.Tables["ScoreTable"].Rows.Add(rw);
//dsUntyped.Tables["Master"].Rows.Add(dr);
}
return ds2;
}
实验项目编程
添加2个业务环节:单项成绩编辑与个人成绩管理。
添加3个业务查询功能。
冒烟试验
启动作业程序--选择实验程序
2个窗体实验
1 单项成绩编辑窗体 1)添加一个成绩到数据库;2)显示单项成绩列表;3)点列表中要修改的成绩显示到窗体中;4)修改后保存;5)保存的数据正确显示在列表中。
2 启动用户成绩显示窗体 1)选择全部、课程、内容、题目;2)显示历史数据;3)图表同步变化。
3个业务功能实验
数据库访问实验 下拉数据库访问菜单,依次选定SQL查询语句,在数据表中显示相应查询结果。
编写技术文档
程序列表:
修改日期和版本编号;V07-2.11
根据升级版实验窗体新增核心业务流程及实验功能后实现的V07-2.11版程序完善程序列表:
UI和BT项目--单项成绩类的数据编辑窗体和显示窗体。
教学实验项目--SHFXXX_TestV062新增的单项成绩类的实验流程。
完成工作文件
工作日志:1 实际工作日日期:开始时间、结束时间、工作项目名称和内容。
实验报告:1 报告内容:图示纪录实际操作步骤,重点是编程实验部分的各个步骤。
准备提交作业
程序代码1项:选定解决方案-右键-清理解决方案-关闭VS2008
技术文档2项:将项目需求列表、程序列表添加到源程序文件夹。
工作文档2项:将工作日志、实验报告添加到源程序文件夹。
小组提交1项:选定源程序文件夹-右键-压缩打包-完成V07-2.11版源程序-保存-提交组长审核。
邮件提交2项:技术文档、工作文档发送到作业邮箱,分别独立发送,要求作业发送格式正确。
截至时间:2010年06月16日 23:50