课程成绩分析系统设计_第1页
课程成绩分析系统设计_第2页
课程成绩分析系统设计_第3页
课程成绩分析系统设计_第4页
课程成绩分析系统设计_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、应用软件课程设计课程成绩分析系统设计数学0801班 *一、实验目的给定某课程成绩和相应学号,存为txt文件,通过文件载入,实现以下功能:程序1-1:利用自定义函数输出该门课程的最高分以及获得者学号、人数;最低分以及获得者学号、人数;该门课程的平均分与方差。程序1-2:利用MATLAB自带命令输出该门课程的最高分以及获得者学号、人数;最低分以及获得者学号、人数;该门课程的平均分与方差。程序2:利用自定义函数将成绩由高到低排序,显示排序结果、相应学号以及名次。排序结果保存到a.mat文件中。程序3:将学生成绩均匀分成10个分数段,计算每个分数段上的学生人数,绘制学生成绩频数分布直方图并在图形窗口中

2、显示。二、算法说明程序1-1:求最高分的自定义函数伪代码程序框图见附录11,求最低分的函数算法与之一致:1、if length(x)=length(y)%判断x、y长度是否相同 disp('给定学号和成绩人数不匹配!') else2、zdf=Inf; zgf=-Inf;%考虑到成绩可能不是百分制,便分别把正无穷、负无穷赋值给max、min。 l=length(x);zgfn=0;zdfn=0;d=0;v=0;xx=(l);yy=(l);%zgfx=;zdfx=;3、i=1,2,l%第一次循环求出最高分4、if y(i)>zgf;%判断成绩与前面最高分的大小。5、zgf=y

3、(i);%假设高于最高分,将该成绩赋值为最高分。6、结束判断,结束循环。7、i=1,2,l%第二次循环,找出所有成绩为最高分的学生学号。8、if y(j)=zgf;%判断成绩是否等于最高分。9、zgfn=zgfn+1;%假设相等,那么人数增加1。 zgfx(zgfn)=x(j);%并且将学号计入统计矩阵。10、结束循环,结束判断。求平均分与方差的自编程序框图图示程序框图见附录12:1、i=1,2,l;2、d=d+y(i);求和。3、结束循环。4、u=d/l;%求出平均数。5、j=1,2,l;6、v=v+(u-y(j)2;求偏差平方和。7、结束循环。8、v=v/(l-1);%偏差平方和除以自由度

4、的到方差。9、结束循环。以上程序整合到一个函数文件yunxing.m详见附录1中,通过运行脚本文件pdriver.m详见附录2运行。程序1-2:利用MATLAB内部函数求最高分的伪代码最低分与之一致:1、zgf,izgf=max(y);%取出最高分以及相应位置2、disp('最高分:',num2str(zgf);disp('相应学号为:');disp(num2str(x(izgf)%显示该成绩获得者学号3、y(izgf)=-Inf;%令最高分为负无穷,确保该同学的成绩离开判断程序。4、不确定次数的循环当max(y)=zgf时,执行循环。5、zgf,izgf=ma

5、x(y);6、disp(num2str(x(izgf)%显示获得最高分同学的学号。7、y(izgf)=-Inf;%令最高分为负无穷,确保该同学的成绩离开新的循环。8、n=n+1;%对最高分个数计数。9、结束循环10、disp('共有',num2str(n),'人')%显示获得者人数利用MATLAB内部函数求平均分与方差的伪代码: 1、a=mean(y);2、disp('')%显示分隔符3、disp('平均成绩为:',num2str(a)4、s=std(y);5、s2=s2;%标准差平方得方差6、disp('方差为:'

6、;,num2str(s2)以上程序整合到一个脚本文件pquick.m中参见附录3。程序2:1、n=0;l=length(x);2、i=1,2,l3、zgf,izgf=max(y);%提取最高分及位置。4、判断最高分是否与前一个最高分一致,假设一致,那么名次同前;假设不一致,那么名次增加1。5、yy(i)=zgf;%定义新的成绩向量yy用以存放排号顺序的成绩。6、xx(i)=x(izgf);% 定义新的学号向量xx用以存放排号顺序的成绩。7、y(izgf)=-Inf;%定义该最高成绩为负无穷,退出查找最大值循环。8、结束循环以上程序参见paixu.m(附录4),通过脚本文件pxdriver.m附

7、录5驱动运行。程序3:1、load xy.txt;y=xy(:,2);clear xy;s=zeros(10,1);%载入分数,将每个分数段上的学生数量定义为s向量的每一个分量。2、x=5:10:95;%每10分为一个分数段,取个位数为5的分数代替一个分数段上的成绩。3、i=1,2,,length(y);4、%判断第i个同学的成绩分属哪一个分数段,并将相应分数段上的人数加1。5、结束循环。6、bar(x,s,0.7),xlabel('分数段'),ylabel('人数'),title('学生成绩直方图')%画出直方图。 colormap(1 0.7

8、 0.1)%改变直方图颜色,使之看上去更加美观。以上程序参见脚本文件zftorgin.m附录6。三、测试结果利用表1的数据,将学号和成绩存入xy.txt中。学号成绩学号成绩2021050127942021050149712021050128902021050150452021050129672021050151452021050130802021050152772021050131652021050153792021050132812021050154672021050133602021050155902021050135602021050156892021050136602021050157

9、72202105013771202105015870202105013890202105015994202105013981202105016094202105014076202105016186202105014182202105016294202105014260202105016385202105014373202105016473202105014479202105016560202105014560202105016660202105014661202105016790202105014773202105016862202105014869202105016945表1运行附录中的程序

10、1,得到结果如下程序1-1与程序1-2的输出结果完全一致:最高分:94相应学号为:2021050127202105015920210501602021050162人数:4最低分:45相应学号为:202105015020210501512021050169人数:3运行附录中的程序2,得到结果如下:名次 学号 成绩 1 2021050127 94 1 2021050159 94 1 2021050160 94 1 2021050162 94 5 2021050128 90 5 2021050138 90 5 2021050155 90 5 2021050167 90 9 2021050156 89

11、10 2021050161 8611 2021050163 8512 2021050141 8213 2021050132 8113 2021050139 8115 2021050130 8016 2021050144 7916 2021050153 7918 2021050152 7719 2021050140 7620 2021050143 7320 2021050147 7320 2021050164 7323 2021050157 7224 2021050137 7124 2021050149 7126 2021050158 7027 2021050148 6928 202105012

12、9 6728 2021050154 6730 2021050131 6531 2021050168 6232 2021050146 6133 2021050133 6033 2021050135 6033 2021050136 6033 2021050142 6033 2021050145 6033 2021050165 6033 2021050166 6040 2021050150 4540 2021050151 4540 2021050169 45运行附录中的程序3,得到如下频数分布直方图图1。图1四、分析与探讨1、 对于程序2的排序问题,目前流行的算法之一是比拟法,即进行l次循环l代表学

13、生人数,每次循环均找出该次循环下的最高分,将该分数与相应学号赋值给新的矩阵元素。加之本文前述的排名算法,编写比拟法排序算法下的脚本文件paixu1.m见附录10,运行结果与程序2完全相同。2、 频数分布直方图中完全可以将频数为0的前几个分数段去掉,使输出结果更清晰。为实现次目标,本文尝试对其进行改良,改良后的程序参见附录7,得到两种模式的直方图比照方图3:图2显然,修正后的程序更加合理。3、 在本文中,程序1、2均考虑了当成绩为非百分制时的情况。考虑到模型的适用性,应将非百分制的情况考虑在内。改良后的程序参见附录8。该程序将最高分与最低分之间的分数差均匀分为10份,得到直方图如图3:图34、

14、本文三个程序需要分别运行,对相应的脚本文件进行修改、整合即可运行一个脚本文件给出所有结果。附录9便是这项改良的脚本文件。为验证该程序的正确性,给定新的学号与成绩200分制如表2:学号成绩学号成绩学号成绩2021020056180202102007013420210202141562021020057192202102007115620210202151262021020058156202102007214220210202161802021020059124202102007312420210202171682021020060136202102007498202102021817020210

15、200611882021020075140202102021916420210200621282021020076942021020210188202102006310820210200771702021020211160202102006410820210200781442021020212136202102006512020210200791302021020213124202102006618820210202101462021020214100202102006716420210202111642021020215188202102006814020210202129020210202

16、169420210200691282021020213174202102021760表2将表中学号、成绩存入文件中,运行上述程序,得到以下结果直方图见图4: 名次 学号 成绩 1 2021020057 192 2 2021020061 188 2 2021020066 188 2 2021020210 188 2 2021020215 188 6 2021020056 180 6 2021020216 180 8 2021020213 174 9 2021020077 170 9 2021020218 17011 2021020217 16812 2021020067 16412 202102

17、0211 16412 2021020219 16415 2021020211 16016 2021020058 15616 2021020071 15616 2021020214 15619 2021020210 14620 2021020078 14421 2021020072 14222 2021020068 14022 2021020075 14024 2021020060 13624 2021020212 13626 2021020070 13427 2021020079 13028 2021020062 12828 2021020069 12830 2021020215 12631

18、2021020059 12431 2021020073 12431 2021020213 12434 2021020065 12035 2021020063 10835 2021020064 10837 2021020214 10038 2021020074 9839 2021020076 9439 2021020216 9441 2021020212 9042 2021020217 60最高分:192相应学号为:2021020057人数:1最低分:60相应学号为:2021020217人数:1图4附录:1、 给定x、y值,输出y的最大值、最小值以及对应x的值以及个数,输出y的均值与方差。由脚本

19、文件pdriver.m驱动。function zgf,zgfn,zgfx,zdf,zdfn,zdfx,u,v=yunxing(x,y)if length(x)=length(y)%判断x、y长度是否相同 disp('给定学号和成绩人数不匹配!')elsezdf=Inf; zgf=-Inf;%考虑到成绩可能不是百分制,便分别把正无穷、负无穷赋值给max、min。l=length(x);zgfn=0;zdfn=0;d=0;v=0;xx=(l);yy=(l);%zgfx=;zdfx=;%第一次循环求出最高分for i=1:l; if y(i)>zgf; zgf=y(i); en

20、dend%考虑到取得最高分的学生可能不唯一,所以有第二次循环,用以找出所有成绩为最高分的学生学号。for j=1:l; if y(j)=zgf; zgfn=zgfn+1; zgfx(zgfn)=x(j); endend%以下为对最低分的计算,原理与上述根本相同。for i=1:l; if y(i)<zdf; zdf=y(i); endendfor j=1:l; if y(j)=zdf; zdfn=zdfn+1; zdfx(zdfn)=x(j); endend%求平均分的程序。for i=1:l; d=d+y(i);endu=d/l;%求方差的程序。for j=1:l; v=v+(u-y(

21、j)2;endv=v/(l-1);end2、 读取学生学号和成绩,驱动yunxing.m文件求出最高分、最低分以及对应学生学号和人数,输出平均分与方差。clc;clear;load xy.txt;x=xy(:,1);y=xy(:,2);clear xy disp('最高分:',num2str(zgf),disp('相应学号为:')disp(num2str(zgfx')disp('人数:',num2str(zgfn);disp('')disp('最低分:',num2str(zdf),disp('相应学

22、号为:')disp(num2str(zdfx')disp('人数:',num2str(zdfn);disp('')disp('平均分:',num2str(u);disp('方差:',num2str(v);3、 读取学生学号和成绩,利用MATLAB自带函数求出最高分、最低分以及对应学生学号和人数,输出平均分与方差。clear;clc;load xy.txt;x=xy(:,1);y=xy(:,2);clear xyzgf,izgf=max(y);%取出最高分以及相应位置disp('最高分:',num2s

23、tr(zgf)disp('相应学号为:');disp(num2str(x(izgf)y(izgf)=-Inf;%令最高分为负无穷,确保该同学的成绩离开新的判断程序。n=1;%最高分至少有一个人。while max(y)=zgf;%不确定次数的循环。 zgf,izgf=max(y); disp(num2str(x(izgf)%显示获得最高分同学的学号。 y(izgf)=-Inf;%令最高分为负无穷,确保该同学的成绩离开新的判断程序。 n=n+1;%对最高分个数计数。enddisp('共有',num2str(n),'人')%求最低分以及相应学号,与上

24、述一致。clear;load xy.txt;x=xy(:,1);y=xy(:,2);clear xyzdf,izdf=min(y);disp('')disp('最高分:',num2str(zdf)disp('相应学号为:');disp(num2str(x(izdf)y(izdf)=Inf;n=1;while min(y)=zdf; zdf,izdf=min(y); disp(num2str(x(izdf) y(izdf)=Inf; n=n+1;enddisp('共有',num2str(n),'人')%求平均成绩与方

25、差。clearload xy.txt;x=xy(:,1);y=xy(:,2);clear xya=mean(y);disp('')disp('平均成绩为:',num2str(a)s=std(y);s2=s2;disp('方差为:',num2str(s2)4、 paixu.m由pxdriver.m驱动运行function mc,xx,yy=paixu(x,y);if length(x)=length(y)%判断x、y长度是否相同 disp('给定学号和成绩人数不匹配!')else n=0;l=length(x); zgf,izgf=

26、max(y);%提取最高分以及位置。 yy(1)=zgf;%定义新的成绩向量yy用以存放排号顺序的成绩。 xx(1)=x(izgf);% 定义新的学号向量xx用以存放排号顺序的成绩。 y(izgf)=-Inf;%定义该最高成绩为负无穷,退出查找最大值循环 mc(1)=1; for i=2:l; zgf,izgf=max(y);%提取最高分以及位置。 if zgf=yy(i-1) mc(i)=mc(i-1); else mc(i)=i; end yy(i)=zgf;%定义新的成绩向量yy用以存放排号顺序的成绩。 xx(i)=x(izgf);% 定义新的学号向量xx用以存放排号顺序的成绩。 y(i

27、zgf)=-Inf;%定义该最高成绩为负无穷,退出查找最大值循环 endend5、 pxdriver.m驱动paixu.m运行,对成绩进行降序排序clc;clear;load xy.txt;x=xy(:,1);y=xy(:,2);clear xymc,xx,yy=paixu(x,y);%以下三行将名次、学号、成绩向量连接到xy矩阵中。%xy(:,1)=1:length(x);xy(:,1)=mc;xy(:,2)=xx;xy(:,3)=yy;disp(' 名次 学号 成绩')%创立表格标题头。a=xy;fprintf(1,'% % %n',xy')%dis

28、p(num2str(xy)%显示名次、学号。成绩。save a.mat a%将变量a存入a.mat文件中。6、 zftorgin.m将百分制成绩均匀分成10个分数段,并画出频数分布直方图clc;clear; load xy.txt; y=xy(:,2);clear xy;s=zeros(10,1);x=5:10:95;%每10分为一个分数段,取个位数为5的分数代替一个分数段上的成绩。yy=fix(y./10);for i=1:length(y); %判断成绩分属哪一个分数段,并将相应分数段上的人数加1。 switch yy(i) case 0 s(1)=s(1)+1; case 1 s(2)=

29、s(2)+1; case 2 s(3)=s(3)+1; case 3 s(4)=s(4)+1; case 4 s(5)=s(5)+1; case 5 s(6)=s(6)+1; case 6 s(7)=s(7)+1; case 7 s(8)=s(8)+1; case 8 s(9)=s(9)+1; otherwise s(10)=s(10)+1; endendfigurebar(x,s,0.7),xlabel('分数段'),ylabel('人数'),title('学生成绩直方图')%画出直方图。colormap(1 0.7 0.1)%改变直方图颜色,

30、使之看上去更加美观。7、 zft.m程序3的改良,比照删除频数为0分数段前后的频数分布直方图clc;clear; load xy.txt;y=xy(:,2);clear xy;s=zeros(1,10);l=length(y);x=5:10:95;yy=fix(y./10);for i=1:l; switch yy(i) case 0 s(1)=s(1)+1; case 1 s(2)=s(2)+1; case 2 s(3)=s(3)+1; case 3 s(4)=s(4)+1; case 4 s(5)=s(5)+1; case 5 s(6)=s(6)+1; case 6 s(7)=s(7)+1

31、; case 7 s(8)=s(8)+1; case 8 s(9)=s(9)+1; otherwise s(10)=s(10)+1; endend%增加判断程序,从第一个人数非零的分数段开始取值。for j=1:10; if s(j)>0 t=j; break endendss=s(j:10);%将频数为0的分量从频数向量中剔除。xx=10*j-5:10:95;figuresubplot(1,2,1),bar(x,s,0.7),xlabel('分数段'),ylabel('人数'),title('学生成绩直方图')colormap(1 0.7

32、 0.1)subplot(1,2,2),bar(xx,ss,0.7),xlabel('分数段'),ylabel('人数'),title('学生成绩直方图')colormap(0.2 0.5 1)8、 (适用性更加广泛的模型,将最高分与最低分之间的分数差均匀分为10份绘制直方图)clc;clear; load xy.txt;y=xy(:,2);clear xys=zeros(1,10);l=length(y);zdf=min(y);zgf=max(y);%取出最高分和最低分。d=(zgf-zdf)/10;%将最高分与最低分等分10份。x=zdf+(

33、d/2):d:zgf-(d/2);%每个分数段取中间数作为该分数段的横坐标。yy=fix(y-zdf)./d);%判断成绩所属分数段。for i=1:l; switch yy(i) case 0 s(1)=s(1)+1; case 1 s(2)=s(2)+1; case 2 s(3)=s(3)+1; case 3 s(4)=s(4)+1; case 4 s(5)=s(5)+1; case 5 s(6)=s(6)+1; case 6 s(7)=s(7)+1; case 7 s(8)=s(8)+1; case 8 s(9)=s(9)+1; otherwise s(10)=s(10)+1; ende

34、nd%绘制直方图。figurebar(x,s,0.7),xlabel('分数段'),ylabel('人数'),title('学生成绩直方图')colormap(1 0.2 0.4)9、 super.m给出所有结果,需要引用paixu.m和yunxing.m两个函数文件。clc;clear;load xy.txt,x=xy(:,1);y=xy(:,2); clear xymc,xx,yy=paixu(x,y);%以下三行将名次、学号、成绩向量连接到xy矩阵中。%xy(:,1)=1:length(x);xy(:,1)=mc;xy(:,2)=xx;xy

35、(:,3)=yy;disp('名次 学号 成绩')%创立表格标题头。a=xy;disp(num2str(xy)%显示名次、学号。成绩。save a.mat a%将变量a存入a.mat文件中。disp('')disp('最高分:',num2str(zgf),disp('相应学号为:')disp(num2str(zgfx')disp('人数:',num2str(zgfn);disp('')disp('最低分:',num2str(zdf),disp('相应学号为:'

36、)disp(num2str(zdfx')disp('人数:',num2str(zdfn);disp('')disp('平均分:',num2str(u);disp('方差:',num2str(v);s=zeros(1,10);l=length(y);zdf=min(y);zgf=max(y);%取出最高分和最低分。d=(zgf-zdf)/10;%将最高分与最低分等分10份。x=zdf+(d/2):d:zgf-(d/2);%每个分数段取中间数作为该分数段的横坐标。yy=fix(y-zdf)./d);%判断成绩所属分数段。for i=1:l; switch yy(i) case 0 s(1)=s(1)+1; case 1 s(2)=s(2)+1; case 2 s(3)=s(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论