A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© goobag 中级黑马   /  2014-4-25 16:41  /  1408 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

        我在做基础测试题的时候遇到过这么一个编程题。

        设计一个函数,找出整型数组元素的最小值(C语言编程题)

        我当时是那么分析的,单独设计一个函数来实现找出给定数组的最小元素,然后再返回这个数。在main函数中调用该函数,然后再打印出来。

        首先,函数需要一个参数,当然传个数组给它就可以了。

        然后,既然要找出数组中最小的元素,那一定要遍历数组        了。问题是怎么遍历呢?得知道数组的大小吧,可是函数定义时不        可能传给它一个固定大小的数组吧,那它的功能也太受限了吧。想        了许久,终于找到一个合适的方法来表示数组的大小,我用的是        sizeof(a)/sizeof(a[0]),这样就得到了数组的大小了,感觉也挺        通用的。主要问题解决了,然后就开始写代码了。我开始是这么写        的


#include<stdio.h>

int main()
{
        int a[10] = {10,2,3,4,5,6,7,8,9,1};
        printf("%d\n",min_element(a));

        return 0;
       
}


int min_element(int a[])
{
        int i,k;
        k = a[0];

        for(i=1 ; i<sizeof(a)/sizeof(a[0]) ; i++)
        {
                if(k > a[i])
                        k = a[i];
        }
        return k;
}

        写完后,检查了一下代码,感觉逻辑上是对的,应该没什么问题了。于是开始编译运行,编译的时候没问题,可是一运行,结果是10.显然不是我想要的结果。想了半天也不知道问题出在那里,感觉没错啊,可结果为什么会这样?原来是我基础太差,把一个重要的知识点给忽略了。

        那就是当数组名作参数时,在函数中会退化成指针。所以在min_element函数中,sizeof(a)的值不是数组所占的内存,而是指向这个数组的指针所占的内存。所以sizeof(a)/sizeof(a[0])的值是1,for循环里面的语句一次都没执行,最后打印出来的当然就是a[0]了。

        问题是找到了,可是这个问题怎么解决呢?我一直没找到方法,最后我只能放弃在一个独立的函数中实现这功能,而直接在main函数中实现了。然后我就把下面代码交上去了。

#include<stdio.h>
int main()
{
        int i,k;
        int a[10] = {10,2,3,4,5,6,7,8,9,1};
        k = a[0];
        for(i=1 ; i<sizeof(a)/sizeof(a[0]) ; i++)
        {
                if(k > a[i])
                        k = a[i];
        }
        printf("the min of array is %d\n",k);
        return 0;
}

显然这不是我想要的结果。不知道有没有什么好的解决方法。

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

5 个回复

倒序浏览
#include<stdio.h>
#define size 6
int xiao(int a[]) //返回最小元素的下标
{
int i=0,min=0;
int tmp=a[0];
for(i=0;i<size;++i)
{
if(tmp>a[i]){
tmp=a[i];
min=i;
}
}
return min;
}

int main(void){
int a[size]={100,25,6,166,198,12};
int min=0;
min=xiao(a);
printf("min=%d",a[min]);
return 0;
}

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 兰闻天 于 2014-4-25 17:43 编辑

#include <stdio.h>

int min_element(int a[], int dim)//传递两个参数,一个数组,一个数组元素个数。因为传递的数组无法统计数组个数

{

        int i,k;

        k=a[0];

        for (i=1; i<dim; i++)

       {

               if(k>a)

               {

                          k=a;

                }

       }

       return k;

}



int main()

{

       int a[]={10,2,3,4,5,6,7,8,9,1};

       int dim=sizeof(a)/sizeof(int);

       printf("%d\n",min_element(a,dim));

       return 0;

}
希望对你有帮助

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
同上。。。。
回复 使用道具 举报
blz01003hm 发表于 2014-4-25 17:23
#include
#define size 6
int xiao(int a[]) //返回最小元素的下标

这样数组大小就限制为6了,如果想求其他大小的数组的最小元素,那还要修改size啊!
回复 使用道具 举报
兰闻天 发表于 2014-4-25 17:37
#include

int min_element(int a[], int dim)//传递两个参数,一个数组,一个数组元素个数。因为传递的数 ...

嗯,谢谢!不过还是需要一个变量来指定数组大小,感觉还不太满意!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马