实验三(成绩评估)

实验要求:

编写程序对电信3001班某学期程序设计基础课程期末考试命题情况进行分析。

假设该班有30位学生,期末考试成绩是0~100之间的整数,数据用例自己设计,试卷满分为100分。

要求根据30位学生该课程成绩计算出“课程考核分析与总结报告”表格中的最高成绩、最低成绩、平均成绩、各分数段人数及所占比例,以及四项分析指标:标准差、偏态值、区分度和效度(实数均保留两位小数)。

  1. 输入样例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 

  1. 输入样例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;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值