一个班有 10 个学生的成绩,要求输人这 10 个学生的成绩,然后求出它们的平均成绩
#define _CRT_SECURE_NO_WARNINGS 1
#include
int main()
{
float sum = 0.0;
int i = 0;
float arr[10] = {0.0};
for (i = 0; i < 10; i++)
{
scanf("%f", &arr[i]);
}
for (i = 0; i < 10; i++)
{
sum += arr[i];
}
printf("%.2f", sum / 10);
return 0;
}
在上题基础上求出平均成绩最高的课程(以课程序号表示)及其成绩。
讲真这道题我不知道他在问什么?他要求平均成绩最高的课程,但是上题我们求的是每个学生单科成绩的平均成绩而不是平均成绩中最高的课程???所以我不明白他在问什么,求解答。
已知一个班 10 个学生的成绩,存放在一个一维数组中,要求找出其中成绩最高的学生的成绩和该生的序号。
#define _CRT_SECURE_NO_WARNINGS 1
#include
int main()
{
float sum = 0.0;
int i = 0;
float arr[10] = {0.0};
float max = 0.0;
for (i = 0; i < 10; i++) //输入数据
{
scanf("%f", &arr[i]);
}
for (i = 0; i < 10; i++) //开始比较
{
if (arr[i] > max)
{
max = arr[i];
}
}
printf("%d\n", i);
printf("%.2f", arr[i - 1]);
return 0;
}
有 3 个学生,上4门课,要求输入全部学生的各门课成绩,并分别求出每门课的平均成绩。
#define _CRT_SECURE_NO_WARNINGS 1
#include
/*
94 78 87 96
66 87 75 69
100 98 89 77
提供一组输入数据
*/
int main()
{
int i = 0;
int j = 0;
float sum_a = 0.0;
float sum_b = 0.0;
float sum_c = 0.0;
float sum_d = 0.0;
float arr[3][4] = { 0.0 };
for (i = 0; i < 3; i++)
{
for (j = 0; j < 4; j++)
{
scanf("%f", &arr[i][j]);
}
}
for (i = 0; i < 3; i++)
{
sum_a += arr[i][0];
sum_b += arr[i][1];
sum_c += arr[i][2];
sum_d += arr[i][3];
}
printf("first average:%.2f\n", sum_a / 3);
printf("second average:%.2f\n", sum_b / 3);
printf("third average:%.2f\n", sum_c / 3);
printf("forth average:%.2f\n", sum_d / 3);
return 0;
}
优化:
#define _CRT_SECURE_NO_WARNINGS 1
#include
/*
94 78 87 96
66 87 75 69
100 98 89 77
提供一组输入数据
*/
int main()
{
int i = 0;
int j = 0;
float sum = 0.0;
float arr[4][4] = { 0.0 };
for (i = 0; i < 3; i++)
{
for (j = 0; j < 4; j++)
{
scanf("%f", &arr[i][j]);
}
}
for (j = 0; j < 4; j++)
{
sum = 0.0;
for (i = 0; i < 3; i++)
{
sum += arr[i][j];
}
arr[3][j] = sum / 3;
printf("%d average:%.2f\n", j + 1, arr[3][j]);
}
return 0;
}
已知5 个学生的4 门课的成绩,要求求出每个学生的平均成绩,然后对平均成绩从高到低将各学生的成绩记录排序(成绩最高的学生的排在数组最前面的行,成绩最低的学生的排在数组最后面的行)。
#define _CRT_SECURE_NO_WARNINGS 1
#include
int main()
{
float arr[5][4] = { {94,78,87,76},{66,87,75,69},{100,98,89,77},{92,58,72,84},{82,73,67,54} };
int i = 0;
int j = 0;
float sum = 0;
int max = 0;
float average[5] = { 0.0 };
for (i = 0; i < 5; i++)
{
sum = 0.0;
for (j = 0; j < 4; j++)
{
sum += arr[i][j];
}
average[i] = sum / 4;
}
for (i = 0; i < 5; i++)
{
printf("%.2f", average[i]);
printf("\n");
}
return 0;
}
本题排序我们用选择排序法,而且是从大到小的选择排序法。
既然用选择排序法,那么选择排序法是什么呢?(以从大到小为例),具体的讲解可以看看别人的从小到大的排序法,我这边是基于从小到大的排序法对本题进行变种
代码如下:
//选择排序
sz = sizeof(average) / sizeof(average[0]); //算出average的元素个数
for (i = 0; i < sz; i++)
{
max = i;//假设i是最大值下标
//找出最大值的数组下标
for (j = 1 + i; j < sz - 1; j++) //这个解释有点长,详情请看①解释
{
if (average[j] > average[max])
{
max = j; //如果发现arr[j]中的值比arr[max]大,就记录最大值的下标
}
}
//找出最大值下标后,赋值
if (i != max)
{
temp = average[max];
average[max] = average[i];
average[i] = temp;
}
}
for (i = 0; i < 5; i++)
{
printf("%.2f", average[i]);
printf("\n");
}
return 0;
}
PS:绿色为固定不变的数字,橙色为该趟排序的一开始假定最大值,红色为该趟排序中找到的最大值
第一趟,选择排序
最后一趟不演示了
#define _CRT_SECURE_NO_WARNINGS 1
#include
int main()
{
float arr[5][4] = { {94,78,87,76},{66,87,75,69},{100,98,89,77},{92,58,72,84},{82,73,67,54} };
int i = 0;
int j = 0;
float sum = 0;
float average[5] = { 0.0 };
//选择排序需要用到的变量
float temp = 0;
int max = 0;
int sz = 0;
//计算平均值
for (i = 0; i < 5; i++)
{
sum = 0.0;
for (j = 0; j < 4; j++)
{
sum += arr[i][j];
}
average[i] = sum / 4;
}
//选择排序
sz = sizeof(average) / sizeof(average[0]); //算出average的元素个数
for (i = 0; i < sz; i++)
{
max = i;//假设i是最大值下标
//找出最大值的数组下标
for (j = 1 + i; j < sz - 1; j++)
{
if (average[j] > average[max])
{
max = j; //如果发现arr[j]中的值比arr[max]大,就记录最大值的下标
}
}
//找出最大值下标后,赋值
if (i != max)
{
temp = average[max];
average[max] = average[i];
average[i] = temp;
}
}
for (i = 0; i < 5; i++)
{
printf("%.2f", average[i]);
printf("\n");
}
return 0;
}