https://blog.csdn.net/2301_76986990/article/details/132024624?spm=1001.2014.3001.5502
问题详情在这个链接博客里面,如有帮助,不胜感激!!
我猜是因为你在输入字符后,接了一个换行符(enter健)保留在了缓冲区里,然后被scanf读进去了,你试试在scanf后加一个getchar();
缓冲问题
不是恰好是a,因为数组不是所有位都初始化的,可能是某次运行留下来的,其他分析看了一下,没有大问题
代码里都是对数组越界操作,属于未定义行为,未定义行为就是运行结果不确定,所以得到的结果也是不确定的。
不知道你这个问题是否已经解决, 如果还没有解决的话://在一个长度为10的整型数组里面,保存了班级10个学生的考试成绩。要求编写5个函数,分别实现计算考试的总分,最高分,最低分,平均分和考试成绩降序排序。
#include<stdio.h>
int main(void)
{
int score[10]={67,98,75,63,82,79,81,91,66,84};
int x,a;
int y;
int sum = 0;//学生成绩总和
int max;//学生成绩的最高分
int min;//学生成绩的最低分
max = min = score[0];
int average = 0;//学生成绩的平均分
int arr[10];//降序排列后的数组
for(int k = 0;k<10;k++)
{
sum +=score[k];
if(score[k]<max) {
max=score[k];}
if(score[k]>min){
min = score[k];
}
}
average = sum/10;
for(x = 0;x<=10;x++)
for(a = 0;a<=10;a++)
{
if(score[x]<score[a])
{ y = score[x];
score[x]=score[a];
score[a]=y;
}
}
printf("降序排列后的成绩是:\n");
for(int k = 0;k<=10;k++)
{ if(score[k]==0)
continue;
printf("%d\n",score[k]);
}
printf("全班成绩的总分是:%d\n平均成绩是:%d\n最低成绩是:%d\n最高成绩是:%d\n",sum,average,max,min);
}
这段代码先利用循环求出最大值和最小值,我来解释一下为什么要用两个if,因为冒泡排序是从第二个数和后面一个数字比较;如果大于前面这个就和前面这个数交换位置。所以最大值和最小值的数组下标都在score【0】,也就是数组第一个值。这是我们完成的第一个需求。
这才是我们完整的排序过程。
下面是运行结果,可以看到我们的数组都按照从小到大的顺序排序好了,那么冒泡排序的任务就完成了。