if(b[j]
执行该程序输出结果如下:
一2 0 5 6 9 21 49 87 说明:
(l)该程序是通过调用sort( )函数对已知数组a中的8个int型数进行由小到大排序。被调用函数sort()是没有返回值的。 (2)主函数中调用函数格式如下: sort(a,n)
其中,实参a是一个已知的数组名,该数组是一个一维数组,8个int型元素。实参n的值为8.可见,sort ()函数的两个实参中,一个是地址值,另一个变量值。
被调用函数sort( )的两个形参中,一个是数组名b,它是一个没有指定大小的一维int型数组,其类型与数组a相同,其大小将与所对应的实参数组大小相等。另一个形参是变量m.因此,不难看出该函数调用中,第一个参数是属于传址调用,第二个参数是传值调用。在传址调用中,将数组a的首元素地址传给b数组,使得a,b两个数组共占同一段内存单元。由于是传址调用不必拷贝数组元素的副本,因此,效率较高,节省了时间和空间的开销。这是传址调用的又一好处。
由于a,b数组共占同一段内存单元,因此在。rt()函数中,通过b数组元素的改变,而使得数组a的元素发生了变化,于是完成由小到大的排序。
(3)在函数sort( )中,选择排序法的算法是这样的:通过双重for循环,每作一次外重for循环,从指定的数中挑出最小的一个放在指定的元素位置,例如,第一次外重for循环,从5个数中挑出最小的放在第。个元素的位置,第二次外重循环从剩下的7个数中再挑出最小的放在第1个元素的位置,依次类推,外重for循环共进行7次,便将8个数的顺序由小到大排好。内重for环是用来确定在要查找的数中找出最小数所对应的下标值,并将它赋给k变量。然后,通过三个赋值语句将数值最小的那个元素换到待选数中的最前边。即下标值为i的位置。这种排序方法每次找出一个最小的数放在前边,直到最后剩下一个数为止。
5.3.4函数的嵌套调用、
所谓函数的嵌套调用是指在调用一个函数的过程中,又调用另外一个函数。例如,在调用A函数的过程中,还可以调用B函数,在调用B函数的过程中,还可以调用C函数,?当C函数调用结束后返回到B函数,当B函数调用结束后返回到A函数,当A函数调用结束后再返回到A的调用函数中。假定main( )调用A函数,上述的嵌套调用关系可用下图所示:
图中①②③一表示了执行嵌套过程的顺序号。即从①开始,经过了三级嵌套,到⑩结束。
这里还需重申一遍,C语言中函数的定义不允许嵌套,就是说不允许在函数中定义函数,C:语言程序中若干个函数都是平行的、独立的。函数之间是通过调用联系的。函数的调用是允许嵌套的,就是说在调用某个函数的过程中,还允许调用其他函数。
下面举一个函数嵌套调用的例子,通过该例搞清调用、返回之间的关系。
[例5.7」分析下列程序的输出结果。
main()
printf (\a();
printf (\} a()
printf<\b();
printf (\} b() {
printf (\c();
printf (\C()
printf(\{ c() {
printf(\”): }
请读者分析该程序后,写出输出结果。 [例5.8] 编程求出下式之和。 lk+2K+3k+??+nK
假定k为4,n为6,编写求上述和的程序如下: # define K 4 t}define N 6 main ( )
printf(\powers of integers from 1 to%d=\ printf (\一of_powers (K,N)); }
sum of一powers(k,n) int k,n; {
int i,sum=0; for(i=1 i<=n;i++) sum+=powers(i,k); return (sum ), ;
powers (m.n ) int m,n