实验四. S-P表分析软件设计 专 业:教育技术班 学 号:
姓 名:
一.实验题目 S-P表分析软件设计 二.实验要求 要求自定数据(50人参加10个题目的考试),按照S-P表的原理进行排序,分别计算出此次测试的差异系数、每个人的注意系数和每个问题的注意系数。
三.实验原理 利用数组存储数据,在用循环根据公式计算出此次测量的参数 输入原始数据 四.算法与流程图 在原始数据组成的数组的边界增加一行一列 统计每个学生总得分和每个问题的答对人数 按照每个学生得分高低行排序 输出sp表 根据公式计算出相关参数 五.程序原代码 #include <math.h> #include <stdio.h> main() { int i,j,m,n; int a[6][5],b[6][5],c[6][5]; float d=0.0,D=0.0,r=0.0,p=0.0,q=0.0, p0=0.0,p1=0.0,pa=0.0,cs=0.0, s0=0.0,s1=0.0,sa=0.0,cp=0.0; printf(“pleae input your score:\n“); for(i=0;i<5;i++) { for(j=0;j<4;j++) scanf(“%d“,&a[i][j]); } //输入原始数据(5个学生分别回答4个问题的情况)
for(i=0;i<6;i++) { a[i][4]=0; } for(j=0;j<5;j++) { a[5][j]=0; } //在原始数据组成的数组的边界增加一行一列(统计每个学生的得 分、每个问题的答对数,方便排序)
for(i=0;i<5;i++) { for(j=0;j<4;j++) { if(a[i][j]==1) { a[i][4]=a[i][4]+1; a[5][j]=a[5][j]+1; a[5][4]=a[5][0]+a[5][1]+a[5][2]+a[5][3]; } } } //统计每个学生总得分和每个问题的答对人数 for(m=1;m<=5;m++) { for(i=0;i<5-m;i++) { if(a[i][4]<a[i+1][4]) for(j=0;j<5;j++) { b[i][j]=a[i][j]; a[i][j]=a[i+1][j]; a[i+1][j]=b[i][j]; } } } //按照每个学生得分高低行排序(数组最后一列元素的大小)
for(n=1;n<=4;n++) { for(j=0;j<4-n;j++) { if(a[5][j]<a[5][j+1]) for(i=0;i<6;i++) { c[i][j]=a[i][j]; a[i][j]=a[i][j+1]; a[i][j+1]=c[i][j]; } } } //按照每个问题的答对人数列排序(数组最后一行元素的大小)
printf(“ the S-P table is:\n“); for(i=0;i<6;i++) { for(j=0;j<5;j++) printf(“%2d“,a[i][j]); printf(“\n“); } printf(“\n“); //输出SP表 for(i=0;i<5;i++) { for(j=0;j<4;j++) b[i][j]=0; //建立另外一个初始值全为0的数组 } for(i=0;i<5;i++) { for(j=0;j<a[i][4];j++) b[i][j]=1; // 根据每个学生的得分判断每行前几列为1 } for(j=0;j<4;j++) { for(i=0;i<a[5][j];i++) b[i][j]=2; // 根据每个问题的正答数判断每列前几行为2 } for(i=0;i<5;i++) { for(j=0;j<4;j++) if(a[i][j]==1) p=p+a[i][j]; //统计所有学生回答所有问题的正答数(a[5][4])
} for(i=0;i<5;i++) { for(j=0;j<4;j++) if(b[i][j]==1) q=q+b[i][j]; //数组b中的元素有1有2,先统计此时1的个数 } for(i=0;i<5;i++) { for(j=0;j<a[i][4];j++) b[i][j]=1; //重新对数组b按照学生得分赋值1(为了统计不重叠的2的个数)
} for(i=0;i<5;i++) { for(j=0;j<4;j++) if(b[i][j]==2) q=q+1; //在统计1的个数基础之上加不重叠的2的个数(实现SP所包含的元素的个数)
} r=p/(5*4); //所有问题的平均正答率 D=q/(5*4); //差异量 d=0.7*D/(r*(1-r)); //差异系数 printf(“q=%5.2f\nd=%5.2f\n“,D,d); for(i=0;i<5;i++) { p0=0.0;p1=0.0;pa=0.0; { for(j=0;j<a[i][4];j++) if(a[i][j]==0) p0=p0+a[5][j]; //根据学生i的总得分为临界点 求S线左侧0的个数P0 } { for(j=a[i][4];j<4;j++) if(a[i][j]==1) p1=p1+a[5][j]; //根据学生i的总得分为临界点 求S线左侧1的个数P1 } { for(j=0;j<a[i][4];j++) pa=pa+a[5][j]; //根据学生i的总得分为临界点 求S线左侧所有问题的答对总数Pa } cs=(p0-p1)/(pa-a[i][4]*p/4); //每个学生的注意系数计算公式 printf(“p0=%5.2f p1=%5.2f pa=%5.2f cs=%5.2f\n“,p0,p1,pa,cs); } printf(“\n“); for(j=0;j<4;j++) { s0=0.0;s1=0.0;sa=0.0; { for(i=0;i<a[5][j];i++) if(a[i][j]==0) s0=s0+a[i][4]; } //根据J问题的答对人数为临界点 求P线上方0的个数S0 { for(i=a[5][j];i<5;i++) if(a[i][j]==1) s1=s1+a[i][4]; } //根据J问题的答对人数为临界点 求P线上方1的个数S1 { for(i=0;i<a[5][j];i++) sa=sa+a[i][4]; } //P曲线上方所有学生的得分之和Sa cp=(s0-s1)/(sa-a[5][j]*p/5); //每个问题的注意系数计算公式 printf(“s0=%5.2f s1=%5.2f sa=%5.2f cp=%5.2f\n“,s0,s1,sa,cp); } } 六. 运行结果: