的话,把空格前的字符串赋予a[n],并在串str中把至空格为止的字符全部删除;若空格不存在,则把str赋予a[n],令str为空串。所以,实际上,它是以空格为分隔,把各数字字串,分别置于数组a中,即a={'9'、'3','34','321'}。
第34到48行,冒泡排序经典程序段,不同的是,大小的评价标准不一样。它是以相邻两数字字串连接在一起的数值大小为衡量标准。以a[j]='3'、a[j+1]='34'为例,执行完第40、44行的语句后可求得t1=334、t2=343,由于t1<t2,交换a[j]、a[j+1]。这样从“大”到“小”排列后依次输出结果:9343321。
也即,输出由这些数字字串排列生成的最大数值。
技巧六:子程序调用
在处理子程序调用时,应注意参数的传递,特别是区分值参与变参。如果存在全程变量与局部变量交叉使用时,要注意变量的作用域。必须清楚,只有在调用的子程序完全执行....完毕..,才能返回调用该子程序的程序中继续执行。
递归调用是子程序调用的重点,也是难点。如何有效正确计算递归程序的结果呢,下面举几个例子说明一下:
[选例十]
#include<stdio.h>
#include<stdlib.h>
voidw(intnum)
{
if(num>=14)w(num/14);
printf("%d\n",num);
}
intmain()
{
w(2009);
system("pause");
return0;
}
程序运行的结果是:
[解析]具体执行过程如下:(注意箭号顺序)三个printf语句,依次输出:101432009
本例应用大括号的方式全部展开递归调用的过程,只要谨记所调用的子程序执行完毕方能返回调用该子程序的程序中继续执行,严格把关语句的执行顺序就可以了。
只是,很多时候,我们没法,或者很难手工全部展开递归的详细过程,这时,一般可以采用“自底向上”,从递归边界出发,递推出结果。如:
[选例十一]
#include<stdio.h>
#include<stdlib.h> w(143)
)45