目前主要分为三个专栏,后续还会添加:
专栏如下: C语言刷题解析 C语言系列文章 我的成长经历
感谢阅读!
初来乍到,如有错误请指出,感谢!
描述
公务员面试现场打分。有7位考官,从键盘输入若干组成绩,每组7个分数(百分制),去掉一个最高分和一个最低分,输出每组的平均成绩。
(注:本题有多组输入)
输入描述:
每一行,输入7个整数(0~100),代表7个成绩,用空格分隔。
输出描述:
每一行,输出去掉最高分和最低分的平均成绩,小数点后保留2位,每行输出后换行。
示例1
解题思路 :
/* 解题思路 : 使用数组来解决这题
假设最低分为100 最高分为0
定义 min 和 max 变量 用来存放最高分和最低分
*/
初始化变量: 首先,我们需要初始化一个数组来存储每组的7个分数,以及两个变量来存储最高分和最低分。
读取输入: 使用 while
循环和 scanf
函数来持续读取用户的输入,直到输入结束。在循环中,我们需要为每组输入分配一个数组来存储分数。
找到最高分和最低分: 在读取每组分数后,我们需要遍历这7个分数,找到最高分和最低分。这可以通过遍历数组并更新两个变量(一个用于存储最高分,一个用于存储最低分)来实现。
计算剩余分数的总和: 在确定了最高分和最低分后,我们需要计算除去这两个分数后剩余5个分数的总和。这可以通过再次遍历数组,累加除了最高分和最低分之外的分数来实现。
计算平均分: 得到剩余5个分数的总和后,我们将其除以5来计算平均分。
格式化输出: 计算出平均分后,我们需要将其格式化为保留两位小数的格式,并使用 printf
函数输出。
循环结束条件: 输入直到用户停止输入,因此 while
循环需要一个合适的结束条件,通常是用户输入结束或者输入的数据不再满足每行7个整数的要求。
代码 1 :
/* 解题思路 : 使用数组来解决这题
假设最低分为100 最高分为0
定义 min 和 max 变量 用来存放最高分和最低分
*/
# include <stdio.h> // 包含标准输入输出库
int main () {
// 定义变量sum用来累加输入的分数
int sum = 0;
// 初始化min为100,假设最低分为100
int min = 100;
// 初始化max为0,假设最高分为0
int max = 0;
// 初始化一个数组arr,用来存储7个考官的分数,初始值为0
int arr[7] = {0};
// 循环7次,用于接收用户输入的每个分数
for(int i = 0; i < 7; i++)
{
// 使用scanf函数读取用户输入的整数,并存储在数组arr的对应位置
scanf("%d", &arr[i]);
// 如果当前输入的分数大于max,则更新max为这个分数
if(arr[i] > max)
{
max = arr[i];
}
// 如果当前输入的分数小于min,则更新min为这个分数
if(arr[i] < min)
{
min = arr[i];
}
// 将当前输入的分数累加到sum中
sum += arr[i];
}
// 计算去掉一个最高分和一个最低分后的平均分
// 使用5.0作为除数确保进行浮点数除法,得到精确的小数结果
double val = (sum - max - min) / 5.0;
// 输出计算得到的平均分,保留两位小数
printf("%.2lf\n", val);
// 程序结束,返回0
return 0;
}
代码 2 :
#include <stdio.h>
int main() {
int scores[7]; // 存储每组7个分数的数组
double average; // 存储计算出的平均分
// 持续读取输入直到用户停止输入
while (scanf("%d %d %d %d %d %d %d", &scores[0], &scores[1], &scores[2], &scores[3], &scores[4], &scores[5], &scores[6]) == 7) {
// 初始化最高分和最低分为数组的第一个元素
int maxScore = scores[0], minScore = scores[0];
// 遍历数组找到最高分和最低分
for (int i = 1; i < 7; ++i) {
if (scores[i] > maxScore) maxScore = scores[i];
if (scores[i] < minScore) minScore = scores[i];
}
// 计算除去最高分和最低分后剩余分数的总和
int sum = 0;
for (int i = 0; i < 7; ++i) {
if (scores[i] != maxScore && scores[i] != minScore) {
sum += scores[i];
}
}
// 计算平均分
average = (double)sum / 5;
// 输出平均分,保留两位小数
printf("%.2f\n", average);
}
return 0;
}
代码 3 :
#include <stdio.h> // 引入标准输入输出库,用于程序中的输入输出操作
int main() {
int a, max = 0, small = 100, sum = 0, count = 0;
// 初始化变量
// a: 用于存储每次输入的分数
// max: 用于存储当前遇到的最大分数,初始设为0
// small: 用于存储当前遇到的最小分数,初始设为100
// sum: 用于累加所有输入的分数
// count: 用于计数输入的分数数量
while (scanf("%d", &a) != EOF) // 使用while循环持续读取输入,直到EOF(文件结束符)
{
if (a > max) // 如果当前输入的分数a大于已知的最大分数max
{
max = a; // 更新max为当前输入的分数a
}
if (a < small) // 如果当前输入的分数a小于已知的最小分数small
{
small = a; // 更新small为当前输入的分数a
}
sum += a; // 将当前输入的分数a累加到sum中
count++; // 计数器count加1,表示已输入一个分数
if (count == 7) // 当计数器count等于7时,表示一组7个分数已经输入完毕
{
printf("%.2f\n", (sum - max - small) / 5.0); // 计算并输出这组分数的平均分,去掉一个最高分和一个最低分后
// 重置所有变量以准备下一组分数的输入
count = 0; // 重置计数器
max = 0; // 重置最大分数
small = 100; // 重置最小分数
sum = 0; // 重置分数总和
}
}
return 0; // 程序正常结束,返回0
}
代码 4 :
#include<stdio.h> // 引入标准输入输出库,用于程序中的输入输出操作
int main() {
int arr[7] = {0}; // 初始化一个数组arr,用于存储7个考官的打分,初始值设为0
int i = 0 , j = 0; // 初始化循环变量i和j
float sum = 0 , aver = 0; // 初始化总分数sum和平均分aver,这里使用float类型以保留小数结果
/* 输入成绩 */
for( i = 0 ; i < 7 ; i++) {
scanf("%d ",&arr[i]); // 循环读取7个整数,存储到数组arr中
}
/* 根据冒泡排序法排序 */
/* 排除1到7名,数组里表示是0到6名 */
for(i = 0 ; i < 7 ; i++) {
for(j = 0 ; j < 7 - 1 - i ; j++) {
if(arr[j] > arr[j+1]) { // 如果当前元素arr[j]大于下一个元素arr[j+1]
int tmp = 0;
tmp = arr[j]; // 交换两个元素的位置,以实现排序
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
/* 这里只取2到6名的成绩加和,数组里面表示是1到5 */
for( i = 1 ; i < 6; i++) { // 从数组的第二个元素开始累加,因为冒泡排序后,最小的元素在arr[0]
sum += arr[i]; // 累加分数,计算去掉最高分和最低分后剩余分数的总和
}
/* 计算即可 */
aver = sum / 5.00; // 计算平均分,除以5.00确保进行浮点数除法,保留小数点后两位
printf("%.2f",aver); // 输出计算得到的平均分,保留两位小数
return 0; // 程序正常结束,返回0
}
扩展:如何在数组中寻找最大值和最小值
暴力搜索法(逐一遍历)
这是最直接的方法,通过遍历数组中的每个元素来找到最大值和最小值。
int findMaxAndMin(int arr[], int size) {
if (size <= 0) return -1; // 错误处理,数组大小应该大于0
int max = arr[0]; // 假设第一个元素是最大值
int min = arr[0]; // 假设第一个元素是最小值
for (int i = 1; i < size; ++i) {
if (arr[i] > max) {
max = arr[i]; // 发现更大的值,更新最大值
}
if (arr[i] < min) {
min = arr[i]; // 发现更小的值,更新最小值
}
}
return max; // 通常这个方法会返回最大值,最小值通过另一个变量返回
}
暴力搜索法,也常被称为穷举法,是一种简单直观的算法设计策略,用于解决搜索问题,包括在数组中寻找最大值和最小值。以下是使用暴力搜索法寻找数组中最大值和最小值的基本思路:
1. 初始化
- 假设数组的第一个元素既是最大值也是最小值。
- 用变量
max
存储最大值,用变量min
存储最小值,并初始化为数组的第一个元素。
2. 遍历数组
- 从数组的第二个元素开始遍历整个数组(索引从1开始,直到数组的最后一个元素)。
3. 更新最大值和最小值
- 对于数组中的每个元素,执行以下操作:
- 如果当前元素大于
max
,则将max
更新为当前元素的值。 - 如果当前元素小于
min
,则将min
更新为当前元素的值。
- 如果当前元素大于
4. 重复步骤3
- 继续遍历数组,直到所有元素都被检查过。
5. 输出结果
- 遍历完成后,
max
变量包含数组中的最大值,min
变量包含数组中的最小值。 - 可以返回这两个值,或者根据需要进行其他操作。