如何求出一组数中的最大最小值?
先来回忆一下如何求三个整数的最大值?
1 2 3 4 5 6 7 8 9 10 11 | #include <stdio.h> int main() { int a, b, c, max; scanf("%d%d%d",&a,&b,&c); max = a; if (b>max) max = b; if (c>max) max = c; printf("%d\n", max); return 0; } |
如果使用数组来完成同样的功能,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 | #include <stdio.h> int main() { int a[3], max; scanf("%d%d%d",a+0,a+1,a+2); /* scanf("%d%d%d",&a[0],&a[1],&a[2]); */ max = a[0]; if (a[1]>max) max = a[1]; if (a[2]>max) max = a[2]; printf("%d\n", max); return 0; } |
如果有更多的数,就需要使用循环了。
1 2 3 4 5 6 7 8 9 10 | #include <stdio.h> int main() { int i, max, a[5]={3,4,15,6,-7}; max = a[0]; for (i=1; i<5; i++) if (a[i]>max) max = a[i]; printf("%d\n", max); return 0; } |
那么如何来求长度为n的数组 a 中的最大值呢? 这个功能经常用到,可以写成函数 find_max
1 2 3 4 | int find_max(int a[], n) { } |
下面的代码是求出最大值,直接返回。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #include <stdio.h> int find_max(int a[], int n) { int i, max; max = a[0]; /* 假定 a[0] 最大 */ for (i=1; i<n; i++) /* 依次将a[1]..a[n-1]和当前选出的最大值比较 */ if (a[i]>max) max = a[i]; /* 如果 a[i] 更大,则取而代之*/ return max; } int main(int argc, char *argv[]) { int v[6] = { 2, 3, 9, 1, 0, 7}; /* 数组初始化 */ printf("%d\n", find_max(v, 6)); return 0; } |
其实更好的方法是求出最大值所在的位置,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <stdio.h> int find_max(int a[ ], int n) { int i, pos; /* pos是位置position的简写*/ pos = 0; for (i=1; i<n; i++) if (a[i]>a[pos]) pos = i; return pos; } int main(int argc, char *argv[]) { int v[6] = { 2, 3, 9, 1, 0, 7}; int pos; pos = find_max(v, 6); printf("%d\n", v[pos]); return 0; } |
下面使用另外的方式来实现同样的功能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <stdio.h> void find_max(int a[], int n, int *pmax) { int i, max; *pmax = a[0]; for (i=1; i<n; i++) if (a[i]>*pmax) *pmax = a[i]; } int main(int argc, char *argv[]) { int v[6] = { 2, 3, 9, 1, 0, 7}; /* 数组初始化 */ int max; find_max(v, 6, &max); printf("%d\n", max); return 0; } |
这种方式不再返回值(返回值类型为void),函数体中没有了 return语句。
这种方式有什么好处呢? 适合在一个函数中返回多个值。如下所示,在函数 find_maxmin_min 中求出了最大和最小值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include <stdio.h> void find_max_min(int a[], int n, int *pmax, int *pmin) { int i; *pmax = a[0]; for (i=1; i<n; i++) if (a[i]>*pmax) *pmax = a[i]; *pmin = a[0]; for (i=1; i<n; i++) if (a[i]<*pmin) *pmin = a[i]; } int main(int argc, char *argv[]) { int v[6] = { 2, 3, 9, 1, 0, 7}; /* 数组初始化 */ int max, min; find_max_min(v, 6, &max, &min); printf("%d %d\n", max, min); return 0; } |