c程序设计 教学课件 作者 赵震奇讲义word教案 项目十七 学校成绩管理系统.doc

(16页)

'c程序设计 教学课件 作者 赵震奇讲义word教案 项目十七 学校成绩管理系统.doc'

《c程序设计 教学课件 作者 赵震奇讲义word教案 项目十七 学校成绩管理系统.doc》由会员分享,提供在线免费全文阅读可下载,此文档格式为doc,更多相关《c程序设计 教学课件 作者 赵震奇讲义word教案 项目十七 学校成绩管理系统.doc》文档请在天天文库搜索。

1、教案教 师班级科 目C#程序设计开课时间地 点机房课题名称项目十七 学校成绩管理系统课时数60背景分析本课程是为软件技术专业的学生开设的一门很重要的程序设计类课程。根据课程教学目标和学生的专业特点,教学中应当注重培养学生的操作能力、思维能力和学习能力。本课采用以项目教学为主,边讲边做,让学生在做的过程中学会探索、学会合作。学习目标设 定1. 控件属性及事件,ADO.NET等知识的综合运用。2. 培养学生积极思考、敢于尝试,让学生体验学习的乐趣,激发学生对本课程的学习兴趣。学习任务描 述学习任务围绕学生成绩管理系统的设计与实现而展开,根据教师设计的项目,并将其分解为七个任务完成。通过任务的设定,在对比中,引导学生自主学习、合作学习、竞争学习。教学情境创 设本节课通过对一个贴近学生生活的项目学习,引导学生做中学习、合作学习。围绕课堂总目标,让学生在不断的成功体验中进行快乐学习。教学资源准 备。

2、时间资源:课前资料收集、课堂教学、课后资料整理、完成作业信息资源:教案、教学素材人员资源:1位专业教师,1位专业指导教师,学生小组设备资源:2.2 GHz 或速度更快的 CPU、1GB或更大容量的 RAM、1280x1024 显示器、7200 RPM 或更高转速的硬盘;操作系统:Windows XP 、Vista或2000以上;开发软件:Visual Studio 2005/2008 中文版(含MSDN);教 学 过 程 实 施内 容方法【导入】当今是21世纪,在工、农业不断的发展的同时,Internet也迅速发展起来,并且已经飞速改变人们的生活和工作。现在,学校需要统计不同班级在不同学期的各个课程的成绩统计,在C#中可以利用ADO.NET技术开发此系统。【新课】项目十七 学校成绩管理系统【项目描述】需求分析是成功管理系统的基础,因此在下面将会对学校成绩管理系统做详细的需求分析。在对学校成。

3、绩管理系统机制进行详细了解与分析后,一个功能完备的学校成绩管理系统必须具备一下主要功能:1. 学期管理:添加学生在校学期,自动生成学期编号。2. 课程管理:添加开设的课程,自动生成课程编号。3. 班级管理:添加学校班级,自动生成班级序号。4. 学生信息管理:添加每个学生的详细信息,并添加所属班级。5. 班级课程管理:管理某个班级,某学期开设的课程,并生成班级课程序号。6. 用户权限管理:管理用户账号、密码、权限。7. 学生成绩录入:某个班级的班主任只能对本班级的学生进行成绩录入。8. 学生成绩统计:进行全校学生的成绩进行统计。因该项目有很多模块雷同的地方,故我下面会提出一个模块进行分析,其他请参考。【项目分析】系统总体功能需求如图所示。学期管理学校成绩管理系统课程管理班级管理学生信息管理班级课程管理用户权限管理学生成绩录入学生成绩统计系统总体功能需求任务一建立一个空解决方案并添加3个子项目。

4、【任务描述】为系统建立一个空解决方案, 并建立3个子项目(BLL)、(DAL)和(UIL),设置“UIL”为启动项目。【任务实施】1. 建立一个空解决方案“SchoolClassScoreManageSystem”,【文件】【新建】【项目】如图2. 建立3个子项目,右击【解决方案】【添加】【新建项目】如图左图中,包括了如下三个项目,被突出显示的“UIL”是启动项目:l BLL层:逻辑层是系统的中间层,它利用数据层的接口获得需要的数据,并对数据进行操作。l DAL层:数据层是系统的低层,定义了系统的最基础的操作。l UIL层:显示层是系统的最上层,在用户输入相应的指令时,它通过调用逻辑层定义的操作来响应用户的意图,并显示出结果。任务二 完成登录窗口绘图功能【任务描述】绘制系统名称和版本号,如图技巧:1. 添加数据库连接,选择数据集所在项目,【项目】【属性】【设置】点击【值】后面的按钮配置如图。

5、 最后确定。系统自动生成连接字符串。2. 用户权限的控制(数据表User的Keys字段),给这个字段定义varchar(50)类型,如管理员则值内不包含“,”如:“0512”,如班主任则用“,”间隔如:“0512,0511”(因为一个老师可能是两个不同班级的班主任)。【任务实施】1. 在项目BBL新建一个类(LogicLayer.cs)并在类里添加一个过程(PaintImage)。2. 实现PaintImage过程。/// /// 画图/// /// 项目标题/// 版本号/// 字体/// 版本号字体/// 呈现图片的控件public void PaintImage(string sExeCapion, string sVersion, string sFontName, string sVerFontName, PictureBox picBoxLogin){const int Dec。

6、Width = 2;RectangleF rect = picBoxLogin.ClientRectangle;Image image = new Bitmap((int)rect.Width, (int)rect.Height);Graphics g = Graphics.FromImage(image);//清除锯齿效果g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;//画黑色Brush brush = new SolidBrush(Color.FromArgb(47, 67, 115));g.FillRectangle(brush, rect);brush.Dispose();//画红色rect.Offset(DecWidth, DecWidth);rect.Height = rect.Hei。

7、ght - DecWidth * 2;rect.Width = rect.Width - DecWidth * 2;Color beginColor = Color.FromArgb(255, 255, 255);Color endColor = Color.FromArgb(163, 184, 226);try{//填充渐变色背景brush = new LinearGradientBrush(rect, beginColor, endColor, LinearGradientMode.Vertical);g.FillRectangle(brush, rect);}finally{brush.Dispose();} //画白色字体 Font font = new Font(sFontName, 26, FontStyle.Bold);SizeF sSize = g.MeasureStrin。

8、g(sExeCapion, font);PointF point = new PointF(10, (rect.Height - sSize.Height) / 2 + DecWidth);g.DrawString(sExeCapion, font, Brushes.White, point);//画绿色字体point.X = point.X - 1;point.Y = point.Y - 1;g.DrawString(sExeCapion, font, Brushes.Green, point);//画版本号string version = Assembly.GetExecutingAssembly().GetName().Version.ToString();//画白色字体 font.Dispose();font = new Font(sVerFontName, 9, FontStyl。

9、e.Bold);sSize = g.MeasureString(sExeCapion, font);point.X = rect.Width - sSize.Width * 2 + 40;point.Y = rect.Height - (float)(sSize.Height * 1.5);g.DrawString(sVersion + version, font, Brushes.Black, point);picBoxLogin.Image = image;g.Dispose();font.Dispose();}3. 转到登录窗体(FrmLogin.cs)下重写OnLoad。4. 重写OnLoad,传递参数给PaintImage过程。protected override void OnLoad(EventArgs e){base.OnLoad(e);LogicLayer ll = ne。

10、w LogicLayer();ll.PaintImage("学校成绩管理", "版本", "华文行楷", "Arial", this.picBoxLogin);}5. 请按F5键,查看运行结果。任务三 将用户信息保存到注册表【任务描述】为了能保存用户信息,减少不必要的记住输入密码麻烦,我们将用户的信息保存到注册表。【任务实施】1. 声明一些私有的静态变量保存对注册表的设置参数。private const string userRoot = "HKEY_CURRENT_USER";private const string subKey = "AddressList";private const string keyName = userRoot + "\\SoftWare\\" + subKey;private const string loginInfo = "LoginInfo";2. 。

11、在LogicLayer类里添加一个私有的类,用来序列化用户信息。[SerializableAttribute] //序列化 标识private class LoginUserInfo{public string UserNo;public string UserPwd;public bool SaveUserPwd;};3. 保存数据到注册表。/// /// 保存信息到注册表/// public void SaveInfoToRegistry(string UserNo, string UserPwd, bool SaveUserPwd){LoginUserInfo userInfo = new LoginUserInfo();userInfo.UserNo = UserNo;userInfo.UserPwd = UserPwd;userInfo.SaveUserPwd = SaveUse。

12、rPwd;MemoryStream stream = new MemoryStream();try{//创建二进制序列化类BinaryFormatter binFmt = new BinaryFormatter();//序列化类binFmt.Serialize(stream, userInfo); stream.Position = 0;//将流的二进制信息写到注册表Registry.SetValue(keyName, loginInfo, stream.GetBuffer(), RegistryValueKind.Binary); }catch{throw;}finally{stream.Close();stream.Dispose();}}4. 读取保存在注册表的信息。/// /// 读取保存在注册表的信息/// public void ReadUserInfo(TextBox Txt。

13、UserNo, TextBox TxtUserPwd, CheckBox ChkMemPwd){//读取注册表信息byte[] bytes = (byte[])Registry.GetValue(keyName, loginInfo, null);if ((bytes != null) && (bytes.Length > 0)){MemoryStream stream = new MemoryStream();try{//将信息写入流中 stream.Write(bytes, 0, bytes.Length); stream.Position = 0; BinaryFormatter binFmt = new BinaryFormatter(); LoginUserInfo userInfo = new LoginUserInfo(); //反序列 userInfo = (Logi。

14、nUserInfo)binFmt.Deserialize(stream); ChkMemPwd.Checked = userInfo.SaveUserPwd; if (userInfo.SaveUserPwd) { TxtUserNo.Text = userInfo.UserNo; TxtUserPwd.Text = userInfo.UserNo; } } catch {throw;   }   finally   { stream.Close();   stream.Dispose();}}}5. 转到登录窗体(FrmLogin.cs)下,在重写的OnLoad下读取注册表信息(ReadUserInfo)。6. 在登录按钮下保存用户信息(SaveInfoToRegistry)。7. 请按F5键,查看运行结果。任务四 新建登录窗体,添加控件,并设置其属性【任务描述】以登录窗口为例,演示一下。

15、本项目,添加窗体和控件的规范。其他窗体请仿照。【任务实施】右击UIL项目层,添加Windows窗口,命名为FrmLogin.cs。1. 设置窗体属性,字体和大小,边框样式,窗体图标,是否最大化,是否最小化,窗体大小可以自作调整,窗体出现的位置,窗体显示标题,其它属性默认值。2. 在窗体上添加必要的控件并命名,控件NameText用途其它PictureBoxpicBoxLogin无显示GDI+图片无LabelLabNo账号:显示账号:提示AutoSize为TrueLabelLabPwd密码:显示密码:提示AutoSize为TrueTextBoxTxtUserNo无接受用户账号无TextBoxTxtUserPwd无接受用户密码PasswordChar为*LinkLabelLikResumePwd取回密码弹出取回密码窗体AutoSize为TrueCheckBoxChkMemPwd记住密码记住用户。

16、登陆信息AutoSize为TrueGroupBoxgroupBox1无分隔符Size为280,8ButtonBtnLogin登陆用户登陆无ButtonBtnReset重置清除数据无ButtonBtnExit退出取消登陆无3. 请按F5键,查看运行结果。任务五 建立强类型数据集【任务描述】在日常开发中,为了编写数据的增加、更新、修改、删除等功能而不得不面对枯燥的代码,做重复又重复的工作。.NET 2.0正式版的发布,对我们程序开发人员来说无疑是一件很大的喜事,Visual Studio 2005 的一些新的增强功能和ADO.NET 2.0的新特性让我们开发高可伸缩的多层数据库应用程序更加简单和快捷。 下边通过一个例子来详细介绍如何通过vs2008来生成强类型DataSet简化开发流程,生成可伸缩性的多层数据库应用程序。【任务实施】1. 在数据层DAL上右击【添加】【新建项】数据集(StuBa。

17、se.xsd)确定后出现下图2. 单击【服务器资源管理器】右击【数据连接】【添加连接】会出现下图,跟添加数据库连接一样配置。选择服务器名(.),使用Sql Server 省份验证(sa),选择数据库。3. 将【服务器资源管理器】中的表或视图直接拖到右边的数据集中。上面是表,呈现表的架构,下面是表适配器,用来对表进行操作。可以右击【添加查询】因为我这已经完成,所以我不在重复,其实很简单跟数据中新建查询一样,你可以自己试试。任务六 强类型数据集的使用【任务描述】使用强类型数据集进行有效编码。下面的实例在逻辑层(BLL)DataLayer类中添加分别添加4个函数,查询学期(GetSemester)、添加学期(InsertSemester)、删除学期(DeleteSemester)和修改学期(UpDateSemester)。【任务实施】1. 添加查询学期(GetSemester)函数,获取学期信息。

18、。/// /// 查询学期/// /// public DataTable GetSemester(){//实例化数据集StuBase ds = new StuBase();//学期表适配器SemesterTableAdapter da = new SemesterTableAdapter();//实例化一个学期表实例StuBase.SemesterDataTable dt = ds.Semester;//填充学期表实例da.Fill(dt);return dt;}2. 添加添加学期(InsertSemester)函数,插入学期信息。/// /// 添加学期/// /// 学期名称/// public int InsertSemester(string SemesterName){//实例化数据集StuBase ds = new StuBase();//学期表适配器SemesterTabl。

19、eAdapter da = new SemesterTableAdapter();//实例化一个学期表实例StuBase.SemesterDataTable dt = ds.Semester;//如果找到表里有记录则表示重复键,反之插入数据if (da.FillBySemesterName(dt, SemesterName) == 1)return 0;elsereturn da.InsertQuery(SemesterName);}3. 添加删除学期(DeleteSemester)函数,删除学期信息。/// /// 删除学期/// /// 学期编号/// 学期名称/// public int DeleteSemester(int SemesterID,string SemesterName){SemesterTableAdapter da = new SemesterTableAdapt。

20、er();return da.DeleteQuery(SemesterID, SemesterName);}4. 添加修改学期(UpDateSemester)函数,修改学期信息。/// /// 修改学期/// /// 原学期编号/// 原学期名称/// 学期名称/// public int UpDateSemester(int Ole_SemesterID,string Ole_SemesterName,string SemesterName){SemesterTableAdapter da = new SemesterTableAdapter();return da.UpdateQuery(SemesterName, Ole_SemesterID, Ole_SemesterName, Ole_SemesterID);}任务七 学生信息的统计【任务描述】学生信息是从多个不同的数据源等到,其。

21、中还用到了交叉表显示某门课程的成绩。下图是运行结果:在这里显示的数据不是一张完整的表而是几张表的“合成”,尤其是显示课程名和成绩更是用到了交叉表。技巧:设计思路是通过学生成绩表一层一层的解剖与插入数据正好相反。学生成绩表学生信息表班级课程表学期表课程表班级表通过上面一些表的结构可以得到显示和插入的正反操作思路:显示数据:1. 用户登录,通过用户的权限(0512)和学生成绩表(StuScore)的StuNo前4位进行比较(0512),选择出他们班的同学。2. 遍历(0512)班的所有同学,到学生信息表(StuInfo)匹配出学生姓名(StuName)。3. 遍历(0512)班的所有同学,到班级课程表(ClassCourse)匹配出对应的记录。4. 通过上一步匹配出的记录的学期编号(SemesterID)到学期表里找出相应的学期名称(SemesterName)。5. 通过第3步匹配出的记录的课。

22、程编号(CourseID)到课程表里找出相应的课程名称(CourseName)。6. 手动建立表,添加列(StuNo)、(StuName)、(SemesterName),遍历课程表的所有记录把课程名称添加成列。插入数据:1. 用户登录,通过用户的权限(0512),到学生信息表(StuInfo)匹配班级编号(ClassID),找出本班的所有学生的学生编号(StuID)。2. 通过班级名称(0512),到班级表(SClass)找出班级编号(ClassID)。3. 通过用户选择的学期名称(SemesterName),到学期表(Semester)找出学期编号(SemesterID)。4. 通过用户选择的课程名称(CourseName),到课程表(Course)找出课程编号(CourseID)。5. 通过第2、3、4步得到的(ClassID)、(SemesterID)、(CourseID)匹配班级课。

23、程表(ClassCourse)得到班级课程编号(ClassCourseID)6. 把第1步的学生编号(StuID)和第5步的班级课程编号(ClassCourseID)和用户输入的成绩(Score)添加到学生成绩表(StuScore)。难点:1. 交叉表。首先先看看我在Excel里的截图 (未使用交叉显示数据) (使用交叉显示数据)从上面两张截图可以看出必要的时候使用交叉表显示数据的最大优点一目了然。那到底如何实现呢?在这里只给你一个思路具体请看下文,交叉表的实现最关键的就是将某张表的字段值变为另外一张表的列。foreach (StuBase.CourseRow cr in dt_Course.Rows){ //将课程表的课程名称添加到新表dt的列中 dt.Columns.Add(cr["CourseName"].ToString(), typeof(float)); }2. 如何将某一门课。

24、程的成绩显示到对应的课程下面。//通过课程编号找出课程名称,并在对应的课程名称下添加成绩da_Course.FillByCourseID(dt_Course,int.Parse(dt_ClassCourse.Rows[0]["CourseID"].ToString())); dr[dt_Course.Rows[0]["CourseName"].ToString()] = float.Parse(ssr["Score"].ToString());3. 一个同学有几门课,如何只显示一条数据将表添加主键,通过对表的主键进行查找,看是否有记录。无则添加,反之修改。【任务实施】1. 在DataLayer类中添加一个查询学生成绩的函数(GetStuScore)。2. 实现具体函数。/// /// 查询学生成绩/// /// public DataTable GetStuScore(){//实例化数据集。

25、StuBase ds = new StuBase();//学生信息表StuBase.StuInfoDataTable dt_StuInfo = ds.StuInfo;//学生信息表适配器StuInfoTableAdapter da_StuInfo = new StuInfoTableAdapter();//班级成绩表StuBase.ClassCourseDataTable dt_ClassCourse = ds.ClassCourse;//班级成绩表适配器ClassCourseTableAdapter da_ClassCourse = new ClassCourseTableAdapter();//学期表StuBase.SemesterDataTable dt_Semester = ds.Semester;//学期表适配器SemesterTableAdapter da_Semester =。

26、 new SemesterTableAdapter();//课程表StuBase.CourseDataTable dt_Course = ds.Course;//课程表适配器CourseTableAdapter da_Course = new CourseTableAdapter();//填充课程表da_Course.Fill(dt_Course);//学生成绩表StuBase.StuScoreDataTable dt_StuScore = ds.StuScore;//学生成绩表适配器StuScoreTableAdapter da_StuScore = new StuScoreTableAdapter();//通过教师的权限(0512)找出学生成绩表中是0512班的学生da_StuScore.FillByStuNo(dt_StuScore, "0512");//新建显示表DataTable。

27、 dt = new DataTable();//添加列dt.Columns.Add("StuNo", typeof(string));dt.Columns.Add("StuName", typeof(string));dt.Columns.Add("SemesterName", typeof(string));foreach (StuBase.CourseRow cr in dt_Course.Rows){//将课程表的课程名称添加到新表dt的列中dt.Columns.Add(cr["CourseName"].ToString(), typeof(float));}//设置显示表的主键dt.PrimaryKey = new DataColumn[] { dt.Columns["StuNo"] };DataRow dr = null;//遍历学生成绩表foreach (StuBase.Stu。

28、ScoreRow ssr in dt_StuScore.Rows){//通过主键查找该用户是否存在!if (dt.Rows.Find(ssr["StuNo"].ToString()) == null){//添加一个新行dr = dt.NewRow();//从学生信息表里查找对应的学生并添加对应列 da_StuInfo.FillByStuNo(dt_StuInfo, ssr["StuNo"].ToString()); dr["StuNo"] = ssr["StuNo"].ToString(); dr["StuName"] = dt_StuInfo.Rows[0]["StuName"].ToString(); //从班级课程表里通过班级课程编号找出对应的数据 da_ClassCourse.FillByClassCourseID(dt_ClassCourse, int.Parse(ssr["Cl。

29、assCourseID"].ToString())); //通过上步找到的学期编号添加学期名称 da_Semester.FillBySemesterID(dt_Semester, int.Parse(dt_ClassCourse.Rows[0]["SemesterID"].ToString())); dr["SemesterName"] = dt_Semester.Rows[0]["SemesterName"].ToString(); //通过课程编号找出课程名称,并在对应的课程名称下添加成绩 da_Course.FillByCourseID(dt_Course, int.Parse(dt_ClassCourse.Rows[0]["CourseID"].ToString())); dr[dt_Course.Rows[0]["CourseName"].ToString()] = float.。

30、Parse(ssr["Score"].ToString()); dt.Rows.Add(dr);}else{dr = dt.Rows.Find(ssr["StuNo"].ToString());da_StuInfo.FillByStuNo(dt_StuInfo, ssr["StuNo"].ToString()); dr["StuNo"] = ssr["StuNo"].ToString(); dr["StuName"] = dt_StuInfo.Rows[0]["StuName"].ToString(); da_ClassCourse.FillByClassCourseID(dt_ClassCourse, int.Parse(ssr["ClassCourseID"].ToString())); da_Semester.FillBySemesterID(dt_Semester, int.Par。

31、se(dt_ClassCourse.Rows[0]["SemesterID"].ToString())); dr["SemesterName"] = dt_Semester.Rows[0]["SemesterName"].ToString(); da_Course.FillByCourseID(dt_Course, int.Parse(dt_ClassCourse.Rows[0]["CourseID"].ToString())); dr[dt_Course.Rows[0]["CourseName"].ToString()] = float.Parse(ssr["Score"].ToString());}}return dt;}3. 在统计窗体通过BindingSource,BindingNavigator和DataGridView控件集合实现数据的导航浏览。BindingNavigator的BindingSource数据源指定BindingSource控件,在窗体加载时BindingSource控件的数据源指定查询学生成绩函数(GetStuScore),DataGridView数据源业指定BindingSource。【项目小结】学习者创建学校成绩管理系统,实现学期管理、课程管理、班级管理、学生信息管理、班级课程管理、用户权限管理、学生成绩录入以及成绩统计功能,通过本项目,学生能学会了GDI+部分相关类、注册表操作、三层架构思想以及强类型和弱类型数据集的操作等ADO.NET相关知识点。【思考与练习】1.编写程序“高职学生就业信息管理系统”。2.编写程序“XXX班信息管理系统”。创设情境、激发学习兴趣营造良好的学习氛围明确任务,通过系列实验逐步呈现知识。

关 键 词:
教案 项目 word 学校 讲义 成绩 作者 教学 管理 程序设计
 天天文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文
本文标题:c程序设计 教学课件 作者 赵震奇讲义word教案 项目十七 学校成绩管理系统.doc
链接地址: https://www.wenku365.com/s-59387011.html
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服点击这里,给天天文库发消息,QQ:1290478887 - 联系我们

本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有【成交的100%(原创)】。本站是网络服务平台方,若您的权利被侵害,侵权客服QQ:1290478887 欢迎举报。

1290478887@qq.com 2017-2027 https://www.wenku365.com 网站版权所有

粤ICP备19057495号 

收起
展开