| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3322 人关注过本帖
标题:数组下标越界
只看楼主 加入收藏
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:11 
数组下标越界
题目是一个有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编辑过]

搜索更多相关主题的帖子: 而且 项目 元素 
2016-03-10 13:56
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
收藏
得分:0 
补充下:我做了如下尝试
1:方法1的max函数、sum函数、avg函数、LtoH函数、main函数一起,运行输出都正常
2:方法1的min函数、sum函数、avg函数、LtoH函数、main函数一起,运行输出都正常
3:新建一个项目,把方法1的max函数,方法1的min函数,main函数放一起,运行输出都正常。
4:问题就是把5个函数放一起,有时候是方法1的max输出不对,min对,有时候min1的不对,max的值对;
我中间加了很多printf来输出具体的arr[n]和arr[n+1],arrp[n-1]在循环时候每一次的值,也发现是最边界的数字会错。我认为是下标越界了,
但是尝试改了max及min中n的值来控制循环的次数,还是不能同时让max和min都对;
问题应该不是很难的,可能是我迷住了眼,一时想不清里头的头绪,所以请各位帮忙看下,谢谢

[此贴子已经被作者于2016-3-10 14:07编辑过]

2016-03-10 14:03
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
收藏
得分:18 
下面是更简单的方法,求最大最小是一样的。你求min的时候数组下标到-1了。
程序代码:
int max(int arr[])
{
    int max=arr[0],i;
    
    for(i=1;i<N;i++)
    {
        if(arr[i]>max)  max=arr[i];
    }
    
    return max;
}


[此贴子已经被作者于2016-3-10 14:16编辑过]


   唯实惟新 至诚致志
2016-03-10 14:05
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:2 
函数名不能重复

DO IT YOURSELF !
2016-03-10 14:05
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
收藏
得分:0 
回复 3楼 qq1023569223
嗯。那个两两比较不是用来排序的,是找出10个数中的最大值,最小值而已。排序是LtoH这个函数
2016-03-10 14:08
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
收藏
得分:0 
回复 4楼 wp231957
函数名没有重复吧?你是说max和min都有两个吗?在运行的时候我屏蔽了同名的函数其中的一个,只留的方法1或者只留方法2的。那是我在方法1解决不了,想的第二个方法,第二个方法调用LtoH排序函数后直接输出两头的一个最大值,一个最小值的。显然第二种方法简单,但是我还是想把我在方法1中遇到的问题搞懂,谢谢

[此贴子已经被作者于2016-3-10 14:13编辑过]

2016-03-10 14:10
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
收藏
得分:0 
回复 3楼 qq1023569223
嗯,这个方法简单,不过我还是想把 我在上面遇到的问题出现的原因搞清楚。谢谢
2016-03-10 14:14
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
收藏
得分:0 
回复 7楼 wanglianyi1
程序代码:
int min(int arr[])
{
    int n=0;
    int temp=0;
    int min1=0;
    for(n=9;n>=1;n--)  //n>=1,n-1>=0
    {
        if(arr[n-1]>arr[n])
            {
                temp=arr[n-1];
                arr[n-1]=arr[n];
                arr[n]=temp;
            }
    }
    min1=arr[0];
    return min1;
} 

   唯实惟新 至诚致志
2016-03-10 14:18
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
收藏
得分:0 
回复 8楼 qq1023569223
嗯。谢谢。我之前是n>=0,新建项目max和min一起运行就没问题。为什么5个函数一起就出问题了呢。每个函数都应该是独立的吧?
5个函数一起的话把n>=0改成n>0也对了。
在这里,n>0和你给的n>=1效果应该是一样的吧?n是int的

[此贴子已经被作者于2016-3-10 14:35编辑过]

2016-03-10 14:30
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
收藏
得分:0 
回复 3楼 qq1023569223
嗯,是下标到-1了,我每仔细看每一步的比较,以为我最后输出的arr[0],即使下标出现-1,但应该没有参与比较,没注意细节,谢谢你
2016-03-10 14:45
快速回复:数组下标越界
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.039982 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved