实验要求:
编写程序对电信3001班某学期程序设计基础课程期末考试命题情况进行分析。
假设该班有30位学生,期末考试成绩是0~100之间的整数,数据用例自己设计,试卷满分为100分。
要求根据30位学生该课程成绩计算出“课程考核分析与总结报告”表格中的最高成绩、最低成绩、平均成绩、各分数段人数及所占比例,以及四项分析指标:标准差、偏态值、区分度和效度(实数均保留两位小数)。
- 输入样例1:
请输入学生人数:30
请输入学生分数:40 95 66 71 82 83 98 68 35 79 45 86 59 61 85 91 12 64 60 71 80 60 78 65 88 76 74 84 45 35
输出样例:
最高分:98
最低分:12
平均成绩:67.87
90以上:3 人,占比:10.00%
89-80 :7 人,占比:23.33%
79-70 :6 人,占比:20.00%
69-60 :7 人,占比:23.33%
59-30 :6 人,占比:20.00%
29-0 :1 人,占比: 3.33%
标准差:19.81
偏态值:-0.47
区分度:0.47
效度 :0.42
- 输入样例2:
请输入学生人数:64
请输入学生分数:27 34 47 67 66 25 74 56 15 47 44 63 90 44 66 60 62 37 38 33 51 31 54 27 62 19 80 48 95 44 60 21 77 98 34 60 52 53 78 93 62 50 80 53 74 95 96 87 90 79 66 49 35 91 60 62 62 82 36 50 33 33 44 37
输出样例:
最高分: 98
最低分: 15
平均成绩: 56.84
100_90: 8 人, 占比 12.50%
89_80: 4 人, 占比 6.25%
79_70: 5 人, 占比 7.81%
69_60: 14 人, 占比 21.88%
59_30: 27 人, 占比 42.19%
29_0 : 6 人, 占比 9.38%
标准差:21.59
偏态值:0.26
区分度:0.56
效度 :0.49
C语言:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
//自定义函数头:
int max(int a[], int n); //数组中的最大值
int min(int a[], int n); //数组中的最小值
double average(int a[], int n); //数组所含数的平均数
int between(int a[], int n); //求取中位数
//主函数:
int main()
{
int n;
printf("请输入学生人数:");
scanf("%d", &n);
printf("请输入学生分数:");
int a[101];
for (int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
} //成绩数组a[101]初始化
int highest = max(a, n); //数组最大值
int lowest = min(a, n); //数组最小值
double averag = average(a, n); //数组平均数
int count[101];
for (int j = 0; j < 101; j++)
{
count[j] = 0;
} //计数数组count[101]初始化遍历
int b = 90;
int c = 99;
for (int q = 0; q < 4; q++)
{
for (int e = 0; e < n; e++)
{
int u = a[e] >= b && a[e] <= c;
if (u == 1)
{
count[b]++; //对计数数组count[101]在指定范围内计数
}
}
b -= 10;
c -= 10;
}
b = 30;
c = 59;
for (int w = 0; w < 2; w++)
{
for (int r = 0; r < n; r++)
{
int u = a[r] >= b && a[r] <= c;
if (u == 1)
{
count[b]++; //对计数数组count[101]在指定范围内计数
}
}
b -= 30;
c -= 30;
}
double occupy[101];
for (int p = 0; p < 101; p++)
{
occupy[p] = 0.0;
} //对数组occupy[101]初始化遍历
int d = 90;
for (int t = 0; t < 10; t++)
{
occupy[d] = count[d] * 1.0 / n; //用数组occupy[101]存储对应范围的占比
d = d - 10;
}
double sum = 0;
for (int i = 0; i < n; i++)
{
sum = sum + pow((a[i] - averag), 2);
}
double v = pow(sum * 1.0 / n, 0.5); //计算标准差
int bet = between(a, n); //存储中位数
//printf("中位数:%d\n", bet); (测试)
double pian = 3.0 * (averag - bet*1.0) / v; //计算偏态值
int z = n * (0.27); //计算27%对应的人数(只取整数)
for (int i = 0; i < n; i++)
{
for (int j = i + 1; j < n; j++)
{
if (a[i] > a[j])
{
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
} //将成绩从小到大在数组a[101]中重新排序
double lower = average(a, z);//获得低分组1平均数
for (int i = 0; i < n; i++)
{
for (int j = i + 1; j < n; j++)
{
if (a[i] < a[j])
{
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
} //将成绩从大到小在数组a[101]中重新排序
double higher = average(a, z);//获得高分组1平均数
double judge = 1.0*(higher - lower) / 100;//计算区分度
int k = n * (1.0/3.0); //计算三分之一对应的人数(只取整数)
for (int i = 0; i < n; i++)
{
for (int j = i + 1; j < n; j++)
{
if (a[i] > a[j])
{
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
} //将成绩从小到大在数组a[101]中重新排序
double lower2 = average(a, k);//获得低分组2平均数
for (int i = 0; i < n; i++)
{
for (int j = i + 1; j < n; j++)
{
if (a[i] < a[j])
{
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
} //将成绩从大到小在数组a[101]中重新排序
double higher2 = average(a, k);//获得高分组2平均数
double xiao = 1.0 * (higher2 - lower2) / 100;//计算效度
//输出组:
printf("最高分:%d\n", highest);
printf("最低分:%d\n", lowest);
printf("平均成绩:%.2f\n", averag);
printf("90以上:%d人,占比:%.2f%%\n", count[90], 100 * occupy[90]);
printf("89-80:%d人,占比:%.2f%%\n", count[80], 100 * occupy[80]);
printf("79-70:%d人,占比:%.2f%%\n", count[70], 100 * occupy[70]);
printf("69-60:%d人,占比:%.2f%%\n", count[60], 100 * occupy[60]);
printf("59-30:%d人,占比:%.2f%%\n", count[30], 100 * occupy[30]);
printf("29-0:%d人,占比:%.2f%%\n", count[0], 100 * occupy[0]);
printf("标准差:%.2f\n", v);
printf("偏态值:%.2f\n", pian);
printf("区分度:%.2f\n", judge);
printf("效度:%.2f", xiao);
return 0;
}
//自定义函数:
int max(int a[], int n)
{
int ma = a[0];
for (int i = 1; i < n; i++)
{
if (ma < a[i])
ma = a[i];
}
return ma;
}
int min(int a[], int n)
{
int mi = a[0];
for (int i = 1; i < n; i++)
{
if (mi > a[i])
mi = a[i];
}
return mi;
}
double average(int a[], int n)
{
double sum = 0;
for (int i = 0; i < n; i++)
{
sum = sum + a[i];
}
double av = sum * 1.0 / n;
return av;
}
int between(int a[], int n)
{
for (int i = 0; i < n; i++)
{
for (int j = i+1; j < n; j++)
{
if (a[i] > a[j])
{
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
int bet;
if (n % 2 == 0 && n > 1)
{
bet = 0.5 * (a[(n / 2) - 1] + a[(n / 2)]);
}
else
bet = a[((n + 1) / 2) - 1];
return bet;
}