【编者按】网学网ASP类作品频道为大家收集整理了“asp+aceess计算机网上考试系统的设计|ASP在线考试系统|在线阅卷“提供大家参考,希望对大家有所帮助!
客服咨询,网学网竭诚为您服务,本站永久域名:myeducs.cn |
§4.系统具体实现 一.准备 定义两个结构体类型来存放学生基本信息和班级基本信息。结构体形式如下: typedef struct { char SN[10]; //学号 char Name[20]; //姓名 float Mk_Cs[MCourseNo]; //科目k的分数 float Sum_Cou; //总分 int Order_Cou[MCourseNo]; //科目k的年级排名 int Order_Sum; //总分年级排名 }SC; //学生基本信息 typedef struct { int CN; //班号(如“三班”则CN为3) float Aver_Mk_Cs[MCourseNo]; //科目k的班级平均分 float Aver_Sum_Cou; //总分的班级平均分 int ClassOrder_Cou[MCourseNo]; //该班科目k的年级排名 int ClassOrder_Sum; //该班总分的年级排名 } Aver_Class; //班级基本信息 根据一般学校的办学规模,限定系统使用范围为:班级数MaxClassNo不超过20个,实际科目数CourseNo不超过10个,各班级实际人数SNo_EachClass[ClassNo] 均不超过99个。 为给用户留下良好印象、维护本人版权,当用户进入该系统时,屏幕上首先会显示: “***********欢迎使用中小学考试成绩处理系统************ 系统创建者:山东师范大学数学科学学院2002级学生 刘坤 ” 同时,出现如下提示:“单击‘B’开始使用本系统”,当用户输入‘B’后,系统会分别从用户键盘和附加文件上读取所需信息。当从键盘读取信息时,系统会提示用户如何进行操作,而从附加文件读取信息是在后台进行的,用户不需看到。 需要从键盘上读取的信息有: 1. MaxClassNo(实际班级数) 2. CourseNo(实际考试科目总数) 3. 控制变量sign.即当你是管理员,需一次将一个学生的全部成绩输入时,将‘A’或‘a’赋给sign;当你是任课教师,只能输入本科目成绩时,将‘S’或‘s’赋给sign。 而从附加文件上获取的信息有: 1.SNo_EachClass[ClassNo](各班实际人数) 2.Stu_Cou[ClassNo][Num_Stu].SN(学号) 3.Stu_Cou[ClassNo][Num_Stu].Name(姓名) 4.Stu_Cou[ClassNo][Num_Stu].Mk_Cs[i](所有学生的各科成绩) 其中ClassNo代表班号,Num_Stu代表班内学号 二.处理 当所有准备工作基本就绪时,便开始利用所输入数据,逐步得到所需要的结果。具体步骤为: 1. 计算所有学生总分 即任意学生总分 Stu_Cou[ClassNo][Num_Stu].Sum_Cou= Stu_Cou[ClassNo][Num_Stu].Mk_Cs[i], 2. 对该年级全体学生进行单科成绩排序和总分排序 方法:对每一门科目(如科目k),先利用直接选择排序法进行班内排序,再利用败者树法进行全体排序。 注释:(1)直接选择排序,首先对某班所有学生成绩进行比较,找出科目k成绩最高者(假设是第maxi名学生),然后与排在首位学生按如下方式进行对换: T=Stu_Cou[ClassNo][1]; Stu_Cou[ClassNo][1]=Stu_Cou[ClassNo][maxi]; Stu_Cou[ClassNo][maxi]=T; (算法1) 以此方法重排记录,得到科目k第二名,第三名...,第SNo_EachClass[ClassNo]名,即最后一名。 (2)败者树法,该方法较为难懂,这里只做简单介绍。 将待排序的MaxClassNo个班级看作MaxClassNo个队列,这些队列是按照关键字(本处为科目k成绩)从大到小进行排列的。构造含MaxClassNo+1个结点的败者树,并将上述队列的队头看作叶子结点,并与其父结点进行比较,选出胜者继续向上比较,而败者留在父结点位置上,按此方法,每选出一个胜者(该胜者记录着最大关键字所在队列的队列号,即科目k该轮比较成绩最高者所在班级的班号),便将该队列队头指针往下移动一格,也就是让该班下一位同学参与比较,直到所有班级所有学生都比较完毕。 该方法中最关键的地方在于给每个学生赋予年级名次,当若干个学生的成绩 相同时,其名次也应相同。 我是这样实现上述要求的: 首先设一比较变量preMark来记录上一位同学的成绩,并赋初值为200,再设q为败者树法比较所得出的胜者。 然后执行下述程序段: int q=ls[1],t; if(preMark!=b[q].key)//上一位同学成绩与待赋名次者成绩不相同 { Stu_Cou[q][Head_Class[q]].Order_Sum=To_od; //To_od是总名次 ReTo_od=To_od; //ReTo_od保存自加前的To_od } else Stu_Cou[q][Head_Class[q]].Order_Sum=ReTo_od; //当preMark=b[q].key时,应赋予相同名次(注:ReTo_od是 //上次记录下的名次,不是本次) preMark=b[q].key;//记录本次成绩以备下次比较 To_od++; //每次排名后总名次要往后推进一个 Head_Class[q]++; //让本班下一名同学参加比较 (算法2) 将所有单科成绩排序完毕后,再进行总分排序。排序算法与单科排序类似,只是待比较关键字为学生总分,如此而已。 排序完成后,各班级学生记录将定格在按总分从高到低的排序上,这样额外的也就得到了学生总分的班级名次。 3. (该步骤可任选)计算各班单科平均分和总分平均分,并且以此利用直接选择排序法进行排序。最终得到各班的单科年级排名和总分年级排名。 算法:令ac[ClassNo].Aver_Mk_Cs[k]表示第ClassNo班中所有学生在科目k上的平均分,则其计算公式为: ac[ClassNo].Aver_Mk_Cs[k]= / SNo_EachClass[ClassNo] 其中Stu_Cou[ClassNo][Num_Stu].Aver_Mk_Cs[k]为第ClassNo班学号为Num_Stu学生的科目k成绩,SNo_EachClass[ClassNo]为该班总人数。 平均分得到后,在全年级内利用直接选择排序法进行排序。 按如上方法将所有科目排完序后,再计算班级总分平均分,并利用类似方法进行排序。 同样,在班级记录中最后定格的顺序是总分排名顺序。 到这里,对数据的加工处理已经结束,但如何将结果以清晰明了的方法显现在读者面前?这便是下一步要解决的问题。 三. 输出 排名结果将分别在“学生排名.doc”和“班级排名.doc” 中输出。
首先创建一个文件“学生排名.doc”并将其打开,在文档第一行输出:“1. 学生排名:” ;在第二行输出: “学号 姓名 科目1名称(如语文) 科目2名称…….总分” 然后利用函数fprintf()的格式控制功能将具体学生的学号,姓名以及所有科目成绩、排名、总分成绩、排名都输出到对应项下方(见操作示例,图8)
如果用户选择了进行班级排名,且也要将排名结果输出,则其输出方法与学生排名类似。 首先创建并打开文件“班级排名.doc”,将“2. 班级排名:”输出到文档第一行,然后在第二行输出以下内容: “班号 科目1名称(如语文) 科目2名称…….总分” 同样利用函数fprintf()的格式控制功能输出具体班级排名记录(见操作示例,图9)。 §5系统使用说明及操作示例 使 用 说 明 尊敬的用户: 您好,欢迎使用《中小学考试成绩处理系统》,首先感谢您对本系统的信任和支持,如果您是第一次使用本系统,请您先仔细阅读下面的文字。 在执行应用文件“运行.exe”之前,您需要做以下工作: 一.打开文件夹“处理系统”。 二.在文件“各班实际人数.txt”中输入贵校所处理年级中各班的人数。 输入方式为: 1. 在“班号”正下方输入1,2等数字来代表某个班,如“三班”则输入‘3’。 2. 在“实际人数”正下方输入该班的参加考试人数。 3. 以此方式将各班的参加考试人数全部输入。 三.在文件“科目名称.txt”中输入该年级开设的所有科目的名称,并且要和上方科目号对应起来。例如:若该年级只开设5门课程,则在科目1至科目5下输入科目名称,其余不管。 四.在文件“学号姓名.txt”中按同样方法输入所有学生的学号和姓名。 五.如果您要一次将所有学生成绩全部输入,则您应在“全部成绩.txt” 中输入班号,班内学号以及各科成绩,例如:若一名学生的学号是0205,则其班号和班内学号分别是2,5,若一名学生的学号是0527,则其班号和班内学号分别是5,27。如果您是任课教师,只想输入本科目全体学生的成绩,则您可以在文件夹“处理系统”中找到对应科目的文件并输入成绩。 六.在全部操作都完成后,系统会自动生成两个文件“学生排名.doc”, “班级排名.doc”,在这两个文件中存放有您所需要的各种排名,您可以将其打印出来或者拷贝到其它文件夹中。 最后,提醒各位用户,文件夹“处理系统”中所有文件都是系统自带的,不得删除,文件中已有文字不得作任何形式的修改(您自己添加的数据除外),否则将导致该系统不可用。为了防止您由于不慎而出现上述错误,建议您在打开文件夹“处理系统”之前作一备份,那么当您真的由于失误而改变了文件原有格式时,就可以利用备份找回原格式。
§6.系统评价 优点: 1. 本系统实现了输入、输出、控制三方面的分离,既简化了操作,又提高了用户的工作效率 假如这三方面都集中在一起,则会出现如下问题: ① 无论输入数据量多大都不可间断,必须一次输入,而且用完即消失,数据无法保存。 ② 在DOS界面下,汉字的输入非常困难,而且一旦出错难以修改。 ③ 输出结果仍显示在DOS界面下,无法保存,更无法打印 2.为方便用户,系统提供了两种成绩输入方式(1.全部输入,2.单科输入)。不论采取哪种方式,用户都可以按任意次序输入成绩,不必预先整理成按学号输入的模式。 3.本系统采用各种先进的算法使排序速度大大加快,占用内存大大减少。 下面给出运行本系统的时间代价和空间代价(内存开销) ① 时间代价: 系统所花费的时间主要用在排序上,因所处理实际数据量大小不同而差别较大。现假设有M个班级,每个班中有N名学生,共开设k门课程,则总的时间代价为: O(M*N*k)(计算总分)+O((k+1)*(N*(N-1)+3*N+(㏒M)*M*N))(学生排名)+O(M*N*k+(k+1)*M*(M-1)/2))(班级排名) = O((k+1)*N*N+(k+1)*M*N*(㏒M)) ② 空间代价: 系统空间开销主要是在学生信息记录和班级信息记录上,按本人所设的各项可允许最大值,可计算得: 二维数组Stu_Cou[MClassNo+1][MaxNum_SNo+1](学生基本信息表)共占内存为: (MClassNo+1)*(MaxNum_SNo+1)*(sizeof(SN)+ sizeof(Name)+ sizeof(Mk_Cs)+ sizeof(Sum_Cou)+ sizeof(Order_Cou)+ sizeof(Order_Sum)) =21*100(10+20+4*10+4+2*10+2) ≈210 000(字节) 一维数组ac[MClassNo+1](班级基本信息)共占内存大约为: (MClassNo+1)*(sizeof(CN)+ sizeof(Aver_Mk_Cs)+ sizeof(Aver_Sum_Cou)+sizeof(ClassOrder_Cou)+sizeof(ClassOrder_Sum) ) =21*(2+4*10+4+2*10+2) ≈1470(字节) 即总体上数据共占内存大约为0.2MB 缺点: 1.本系统是用面向过程的C语言写成,通篇只有一个主函数,没有实现模块化设计的要求,更不用说“低耦合,高内聚”的目标了。 2.缺乏相应的数据库支持,无法实现数据共享,也不能实现网上实时查询功能。 3.界面不够友好,性能也不太稳定,而且用户也只能严格按照使用说明的要求输入数据,否则极有可能引起系统无法运行或得出错误结果。 §7.心得体会 本系统虽然简陋,但却花费了我不少的心血,从开始构思,对问题进行定义到系统初步完成并调试成功大约花费了十天左右的时间。在这段时间里,我遇到了不少困难,有些甚至是就我现在的水平根本无法解决的。我想过要放弃,我想 过随便从网上下载一个论文交上就算了。但是由于老师和朋友的鼓励和支持,以及自己不肯就此认输的那股倔劲,我坚持做了下来。毕竟,在本科阶段可以有充足的时间做个小软件的机会并不多,所以一定要好好锻炼一下解决实际问题的能力,为将来读研究生做好准备。 然而,系统的初步完成并不等于最终完成,事实上第一个版本所能实现的功能非常有限,而且极不稳定,稍有不慎就会出现一些莫名其妙的结果。另外它对用户的要求也非常高,不仅输入不方便,输出结果也只能在屏幕上显示。可读性不是很强,也不能打印到纸面上或拷贝到其它目录下。 由于第一个版本的上述缺陷,我又开始了新一轮的系统改进工作,从“Markmanage.exe”(系统的可执行文件) 到“Markmanage7.exe”再到最后定型的“运行.exe”,一共做了七次较大的修改,最终形成现在的样子。另外,系统的名字也做了几次改动,从原来的《考试成绩管理系统》到现在的《中小学考试成绩处理系统》。之所以给系统限定“中小学”是因为本人认为该系统不可直接应用于大学生考试成绩的处理。众所周知,大学生同一学期所开设的科目有难有易,取得同样分数所付出的时间和精力是不一样的,所以将成绩直接记为各科成绩简单相加有点不太合理,因此本系统若不加以修改而直接用来处理大学成绩是不合适的。另外将“管理系统”改为“处理系统”更突出了本系统的功能是处理成绩而不是管理成绩。更确切的说,本系统并不具备对成绩进行长期管理的功能。 我最初是想利用C++来编写这个小软件的,但是这要涉及到类、对象、继承等面向对象方面的知识,而我在这些方面并不是很熟悉,于是改用面向过程的C语言来实现所要完成的功能。 由于我本人水平和C语言本身的限制,这个系统并没有完全实现我最初预想的功能。 我本来想设计一个数据库,并将学生的所有成绩存入数据库中以便能够实现查询功能(即学生输入学号和姓名可查到自己的成绩和各科排名、总分排名),但由于我在数据库和网络方面的知识非常有限,最终放弃了这一想法。暂时放弃并不意味着我不会朝这个方向努力,恰恰相反,随着进一步的学习与实践,我一定能够做出效率更高、功能更全、性能更稳定的真正的《管理系统》。 附:系统源文件 |
本站发布的计算机毕业设计均是完整无错的全套作品,包含开题报告+程序+论文+源代码+翻译+答辩稿PPT |
本文选自计算机毕业设计http://myeducs.cn |