数组下标越界
题目是一个有10个元素的数组,存有10个考生的分数,写5个函数,分别计算总分,最高分,最低分,平均分,分数升序排列。我写了5函数,问题出在最高分和最低分函数上。我用了两种方法,第一种是最高分和最低分都用冒泡法分别排序,分别运行的时候没有问题,
但和其他3函数一起运行时候就打印最小值不是63了,而且一个很大的数,我想是一个垃圾值(下标越界造成的);但是我重新建个项目,只把
max函数和min函数两个函数放进去和main函数一起运行就没有出错。不明白问题出在哪里了。请教下各位帮我看下:我认为是下标越界造成的,
中间出个一次问题:最小值对了63,最大值就不对了。把最大值改对了,最小值就不对了。
下面附上具体的代码,求教:看计算max和min方法1就可以了。方法2是调用降序排列后输出的没有问题。
#include <stdio.h>
#include <stdlib.h>
#define N 10
//求总分
int sum(int arr[])
{
int n=0; //局部变量,所以每个函数都可以声明n
int sum1=0;
for(;n<10;n++)
{
sum1+=arr[n];
}
return sum1;
}
//求最高分方法1
int max(int arr[])
{
int n=0;
int temp=0;
int max1=0;
for(n=0;n<9;n++)
{
if(arr[n]>arr[n+1])
{
temp=arr[n];
arr[n]=arr[n+1];
arr[n+1]=temp;
}
}
max1=arr[9];
return max1;
}
//求最低分1 注意数组下标越界
int min(int arr[])
{
int n=0;
int temp=0;
int min1=0;
for(n=9;n>=0;n--)
{
if(arr[n-1]>arr[n])
{
temp=arr[n-1];
arr[n-1]=arr[n];
arr[n]=temp;
}
}
min1=arr[0]; //此时循环后最小值在最上方;
return min1;
}
/*
//求最高分方法2
int max(int arr[])
{
int max1=0;
int LtoH(int arr[]); //排序函数LtoH在max后面,所以先声明排序函数
LtoH(arr); //声明之后才能调用
max1=arr[9];
return max1;
}
//求最低分方法2
int min(int arr[])
{
int min1=0;
int LtoH(int arr[]);
LtoH(arr);
min1=arr[0];
return min1;
}
*/
//求平均分,调用求总分函数sum()
float avg(int sum)
{
float avg1;
avg1=(float)sum/10;
return avg1;
}
//成绩升序排序,从低分到高分
int LtoH(int arr[])
{
int n=0,m=0,temp=0;
for(n=9;n>0;n--)
{
for(m=0;m<n;m++)
{
if(arr[m]>arr[m+1])
{
temp=arr[m];
arr[m]=arr[m+1];
arr[m+1]=temp;
}
}
}
}
int main()
{
int score[N]={67,98,75,63,82,79,81,91,66,84};
int sum2=0,max2=0,min2=0;
float avg2;
int n=0;
sum2=sum(score);
printf("总分:%d\n",sum2);
max2=max(score);
printf("最高分:%d\n",max2);
min2=min(score);
printf("最低分:%d\n",min2);
avg2=avg(sum2);
printf("平均分:%.1f\n",avg2);
LtoH(score);
printf("成绩降序排列:");
for(n=0;n<10;n++)
printf("%d ",score[n]);
printf("\n");
system("pause");
return 0;
}
[此贴子已经被作者于2016-3-10 14:12编辑过]