请c语言高手进来帮我解决个问题~关于数组求最值!
设计一个子函数f和一个主函数,子函数f对任一个
一维数组,求其最小值、次最小值及相应下标。
(1)主函数设置一个一维数组,调用子函数f,输出这个数组的最小值、次最小值及相应下标,不能使用全局变量。
(2)主函数设置一个二维数组,用这个二维数组的一行作为实在参数,调用子函数f,输出这个数组的最小值、次最小值及 相应下标,不能使用全局变量。
注:1. 一次完成;
参考答案:数组求最小值和次小值
#include<stdio.h>
#define SIZE 8
void find(int a[],int size,int*p1,int*ap1,int*p2,int*ap2);
int ifmin(int a1,int a2);
main()
{
int a[SIZE]={5,15,25,76,16,45,55,35};
int min,submin,amin,asubmin;
if(SIZE<=1)
{ printf("There should be more numbers.");
return 0;}
find(a,SIZE,&min,&amin,&submin,&asubmin);
printf("The smallest is a[%d]=%d\n",min,amin);
if(submin!=-1)
printf("The subsmallest is a[%d]=%d\n",submin,asubmin);
else printf("All the numbers are the same.\n");
return 0;
}
void find(int a[],int size,int*p1,int*ap1,int*p2,int*ap2)
{
int i=1,k,j;
k=ifmin(a[0],a[1]);
while(k==0&&i<=size-2)
{i++;
k=ifmin(a[0],a[i]);} /*针对数组前几个值相等的情况*/
if(k==0)
{*ap1=a[0]; /*对应于所有值都相等的情况*/
*p1=0;
*p2=-1;}
else if(k==-1) /*先赋初值*/
{*p1=0;
*ap1=a[0];
*p2=i;
*ap2=a[i];}
else
{*p1=i;
*ap1=a[i];
*p2=0;
*ap2=a[0];}
for(j=i+1;j<=size-1;j++) /*在循环中修正*/
{if(*ap1>a[j])
{
*ap2=*ap1;
*p2=*p1;
*ap1=a[j];
*p1=j;}
else if(*ap1!=a[j]&&*ap2>a[j]) /*确保次小值不被多次出现的最小值覆盖*/
{*ap2=a[j];
*p2=j;}}
}
int ifmin(int a1,int a2) /*判断值是否相等*/
{
if(a1==a2)
return 0;
else if(a1<a2)
return -1;
else return 1;
}