数组实现打分时去除最高分最低分求平均值

本文讲解如何使用数组存储评委分数,通过数组操作找出最大值和最小值,以及两种方法——直接累加与冒泡排序求平均分,展示了程序设计中的数组应用和基本排序算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是数组:在程序设计中,为了处理方便,通常把具有相同的若干变量按有序的形式组织起来,这些顺序排列的同类数据元素的集合称为数组

一般定义式: 类型说明符 数组名 [常表达式]
类型说明符:任一种基本数据类型或构造数据类型,即为数组元素的类型
常量表达式:表示数组元素的个数,也称为数组的长度
例如: int a[10]; 声明数组a,有十个元素,且有10个元素都是int型
数组元素的引用: 数组名[下标值] 下标从0开始

计算10个评委给出的分,并将最大最小值取出后,计算平均值

思路一:思路1:找出最大最小值后从总分中减去

int dAvg() {
	float score[10], sum, max, min, ave;
	int i, len = 10;
	//评委输入分数
	for (i = 0; i < len; i++)
	{
		scanf("%f", &score[i]);//循环接收输入的分数
	}
	//用循环求评委的总和,最高分和最低分
	sum = 0;
	max = min = score[0];//将score[o]赋值给max和min作为后续的比大小
	for (i = 0; i < len; i++)
	{
		sum = sum + score[i];//累加评委给的分数
		if (score[i] > max)  //将数组中的元素循环和 score[0](max)进行对比  大于则将该元素给max
		{
			max = score[i];
		}
		if (score[i] < min)
		{
			min = score[i];
		}
	}
	//计算平均值
	ave = (sum - max - min) / 8;
	//输出最后分数
	printf("ave=%f", ave);
	return 0;
}

思路二:将数组中的元素进行冒泡排序后取中间八个值进行计算
什么是冒泡排序:

冒泡排序的英文Bubble Sort,是一种最基础的交换排序。之所以叫做冒泡排序,因为每一个元素都可以像小气泡一样,根据自身大小一点一点向数组的一侧移动。

冒泡排序的原理:

在这里可以理解为依次比较相邻的两个数,将小数放在前面,大数放在后面,经过循环实现小数不断向前移动,而大数则被置换到后面
int dAvg_maop() {
	float score[10], sum, max, min, ave;
	int i,j, len = 10,temp;//temp 用于冒泡排序时暂时存放值
	//评委输入分数
	for (i = 0; i < len; i++)
	{
		scanf("%f", &score[i]);//循环接收输入的分数
	}
	//采用冒泡排序方法,对评委按照从小到大的顺序重新排序
	
	for ( i = 1; i < len; i++)
	{
		for ( j = 0; j < len-i; j++)
		{
			if (score[j] > score[j + 1])//依次比较相邻的两个数,将小数放在前面,大数放在后面
			{
				temp = score[j];  
				score[j] = score[j + 1];
				score[j + 1] = temp;

			}
		}
	}

	//计算中间八个数据的和
	sum = 0;
	for ( i = 1; i < len-1; i++)
	{
		sum += score[i];//该for循环累加从下标为 1 到 下标为 8 的数据,因为下表为 0 和 9 分别为最小和最大值 
	}
	//计算平均值
	ave = sum / 8;
	//输出最后分数
	printf("ave=%f", ave);
	return 0;
}

二维数组

上面我们考虑得是只有一个选手,如果参赛的选手有很多个,那这时就需要用到二维数组或者多纬数组了
二维数组的定义: 类型说明符 数组名[常量表达式1][常量表达式2]
其中常量表达式1表示的是一维下标的长度,常量表达式2表示的是第二维下标的长度

#define NUM_XUANSHOU 10
#define NUM_PINGWEI 10   
//定义全局常量  该常量名一般定义为大写
int dAvg_dou() {

	float score[NUM_XUANSHOU][NUM_PINGWEI], sum, max, min;
	float ave[NUM_XUANSHOU];//存放选手的平均分数
	int i, j;
	//输入分数
	for ( i = 0; i < NUM_XUANSHOU; i++)
	{
		for ( j = 0; j <NUM_PINGWEI; j++)
		{
			scanf("%d",&score[i][j]);
		}
	}

	//采用双重循环以及计算各选手的总分,最大值,最低分,并计算其最后得分
	for ( i = 0; i < NUM_XUANSHOU; i++)
	{
		sum = 0;
		max = score[i][0];
		min = score[i][0];
		for ( j = 0; j < NUM_PINGWEI; j++)
		{
			sum += score[i][j];
			if (max > score[i][j]) {
				max = score[i][j];
			}
			if (min > score[i][j])
			{
				min = score[i][j];
			}
		}
		ave[i] = (sum - max - min) / (NUM_PINGWEI - 2);
	}
	//输出各选手的平均成绩
	for ( i = 0; i < NUM_XUANSHOU; i++)
	{
		printf("选手%d的平均成绩是:%f", i + 1, ave[i]);
	}
}
<think>好的,用户想在PHP中计算评分,去掉最高分最低分后的平均值总数。首先,我需要明确具体的步骤。首先,用户可能需要将评分存储在一个数组里。然后,需要对这个数组进行排序,去掉一个最后一个元素,也就是最低最高分。接下来,计算剩下的元素的总平均值。 首先,我需要检查用户提供的输入是否有效,比如确保数组中有足够的元素,否则去掉两个元素后可能就没有数据了。例如,如果只有三个评分,去掉两个后只剩一个,但这种情况可能合理,但需要处理可能的错误。 然后,考虑如何排序数组。在PHP中,可以使用sort()函数进行升序排序,或者rsort()进行降序排序。升序排序后,去掉一个最后一个元素即可。排序后的数组,使用array_shift()array_pop()可以移除首尾元素,或者直接计算排除它们。 另外,总计算可以用array_sum()函数,而平均值则是总除以剩余元素的数量。需要注意的是,如果数组长度小于等于2,处理后的数组可能为空,这候需要处理除以零的情况,或者给出提示。 可能还需要考虑是否有多个相同的最高分最低分的情况。比如,如果有多个最低分去掉其中一个还是全部?根据通常的做法,应该是只去掉一个最高一个最低,不管有多少重复的。 接下来,编写代码的大致步骤可能是: 1. 接收评分数组。 2. 检查数组长度是否足够,比如至少3个元素,否则无法去掉两个。 3. 排序数组。 4. 移除第一个最后一个元素。 5. 计算平均值。 6. 返回结果。 然后,我需要将这些步骤转化为PHP代码。例如: $scores = [5, 3, 8, 4, 2]; sort($scores); array_shift($scores); array_pop($scores); $total = array_sum($scores); $average = $total / count($scores); 但要注意,如果原数组长度小于等于2,移除两个元素后可能没有元素,导致count为0,这候需要处理错误。例如,添加条件判断: if (count($scores) <= 2) { // 处理错误或返回0 } 或者,可能用户希望即使只剩一个元素,也计算它的值。需要根据实际需决定。 此外,用户提到的总数可能是指处理后的总数,即总,或者是处理后的评分数量。需要明确用户的需。问题中的“总数”可能是指总,或者是剩余的数量。需要根据上下文判断,但通常总更可能,比如总分。 最后,将这些步骤整合成一个函数,确保代码的健壮性,处理可能的错误情况,比如空数组、非数值元素等。但用户的问题可能不需要处理这些复杂情况,只是基本实现。 总结,核心步骤是排序、去掉首尾、计算平均值。需要注意数组长度的问题,避免除以零错误。</think>在PHP中计算评分去掉最高分最低分后的平均值总数,可以通过以下步骤实现: ### 实现步骤 1. **数据准备**:将评分存入数组 2. **排序处理**:对数组进行排序并移除首尾元素 3. **计算结果**:计算剩余元素的总平均值 4. **异常处理**:处理边界条件(如元素不足) ### 示例代码 ```php function calculateAdjustedScore($scores) { if (count($scores) < 3) { return ["error" => "至少需要3个评分"]; } sort($scores); // 升序排序 array_shift($scores); // 移除最低分 array_pop($scores); // 移除最高分 $total = array_sum($scores); $average = $total / count($scores); return [ "total" => $total, "average" => round($average, 2), // 保留两位小数 "count" => count($scores) ]; } // 示例使用 $ratings = [9.5, 8.0, 7.5, 9.0, 6.5]; $result = calculateAdjustedScore($ratings); print_r($result); ``` ### 执行结果 ``` Array ( [total] => 24.5 [average] => 8.17 [count] => 3 ) ``` ### 关键点说明 1. **数组排序**:使用`sort()`函数对评分升序排列,确保首尾为极端值 2. **元素移除**:`array_shift()`移除最小值,`array_pop()`移除最大值 3. **数值精度**:通过`round()`控制小数点位数,避免出现类似$8.166666...$的情况 4. **边界处理**:当评分数量不足3个返回错误提示,避免空数组计算 这种处理方式类似于数据库查询中对结果集的二次筛选[^1],通过预处理极端值保证计算结果的公平性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值