
C语言实现查找数组中最大值
大家好,今天给大家带来查找数组中最大值的两种做法,这里的数组元素是自定义的而非随机值
先看一种相较好理解的方法
1.迭代
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int length;
int arr[20] = {0};
int i, j;
int a = 0;
printf("请输入数组长度:\n");
scanf("%d" , &length);
for (i = 0; i < length;i++)
{
printf("请输入第%d个数字的大小:\n", ++a);
scanf("%d",&arr[i] );
}
int max = arr[0];
for ( j = 0;j < length;j++)
{
if (max < arr[j])
{
max = arr[j];
}
}
printf("最大值max=%d\n", max);
return 0;
}
第一种相较简单,下面来看第二种
2.函数递归
其实这道题用递归并不是很典型,这里属于为了递归而递归了,首先将完整代码放出
下面将代码分成三部分进行说明
一、主函数部分
其中szcsh函数用于初始化数组,Max函数用于比较得出数组中的最大值
需要注意的是max的初始化在初始化数组后,这样可以将max初始化为数组中的第一个元素,便于比较。
二、szcsh函数(初始化数组)
注意count1和count2均为全局变量 !!
1.其中count1用于记录输入数组中第几个元素,count2用于初始化数组,这里因为数组元素的下标从0开始,而输入的数字肯定是从第一个开始,故不能通过一个变量同时实现printf和scanf的功能。
2.
注意此处函数的定义返回类型为指针整型变量
这里稍作简单解释:
引用数组名时,如上图的arr,代表的其实是数组中第一个元素的地址,int arr[20]={};里的arr代表的是arr[0]的地址。又因为scanf传的是指针,也就是地址,所以下图第二行代码不需要&a
char a[10];
scanf("%s",a);
int b[10];
scanf("%d",&b[4]);
而第四行代码因为是对b数组中第五个元素赋值,因此需要&
综合以上我们知道了arr代表的其实是一个指针,因为返回类型也需要为指针类型!
也正是因为这里传的是指针,因此函数中形参的改变也就可以改变主函数中的实参,从而初始化arr[]
三、Max函数
}
j在main函数中初始化为1,又max已经初始化为数组中第一个元素,所以只需要从第二个元素开始比较, 即j为1时(j为数组下标)
判断当j为length时输出最大值
函数总输出结果:
注意,此处最大值打印了两次,假设数组长度为3,当j=2时,进行判断后函数递归进入Max,此时j+1变为3,判断后打印最大值,注意,此处打印后没有再次引用函数了!也就是说递归到此为止了,开始进行返回,因为j=2时调用函数时Max函数中的参数用到了++j,也就是先++再传参,那么此时j已经为3!继续向下判断,3=长度=3,故又打印了一次最大值,然后再返回上一级函数递归,i=1时,i++变为2,第二个判断不符合,因此不打印。
因为递归是层层递进的,调用时是一层一层,返回时也是一层一层,因此这里Max函数的返回类型并没有定义,用void定义了函数,下面是反例
可以看到如果Max函数采用return返回,输出的最大值是第二个元素,因为
只有第一次比较!!!!
后给max赋的值被最终传给了主函数,可以理解为深一层函数的值被浅一层函数返回的值覆盖了
因此这里最终还是用void定义了函数并在函数内部打印最大值(反例中在主函数打印)
最终代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int count1 = 0;
int count2 = 0;
int *szcsh(int length,int arr[])//完全初始化数组
{
if (count1 < length)
{
printf("请输入第%d个数字的大小\n", ++count1);
scanf("%d", &arr[count2]);
count2++;
szcsh(length, arr);
}
return arr;
}
void Max(int length, int arr[],int j,int max)
{
if (j < length)
{
if (max < arr[j])
{
max = arr[j];
Max(length, arr, ++j, max);
}
else
{
Max(length, arr, ++j, max);
}
}
if (j == length)
{
printf("最大值max=%d\n", max);
}
}
int main()//寻找数组中的最大值
{
int length;//数组长度
int arr[20] = { 0 };
int j = 1;//用于计算最大值所用的变量
printf("请输入数组长度:\n");//自定义长度
scanf("%d", &length);
szcsh(length, arr);
int max = arr[0];
Max(length, arr,j,max);
return 0;
}
若有更为优化的方法(如让最大值只打印一次),欢迎各位大佬点拨指正,对代码有不理解的地方也欢迎在评论区讨论!
今天的内容就到此为止啦!谢谢!预告一波递归大整理
更多推荐
所有评论(0)