C程序书中例题不太明白!初学者求教!

来源:百度知道 编辑:UC知道 时间:2024/06/06 18:02:57
是谭浩强编的《C程序设计(第二版)》中167页的一个程序,讲数组名做参数的,举例程序如下:

void sort(int araay[ ],int n)
{int i,j,k,t;
for(i=0;i<n-1;i++)
{k=i;
for(j=i+1;j<n;j++)
if (array[j]<array[k])k=j;
t=array[k];array[k]=array[i];array[i]=t;}
}

main()
{int a[10],i;
printf("enter the array\n");
for(i=0;i<10;i++)
scanf("%d",&a[i];
sort(a,10);
printf("The sorted array: \n);
for(i=0;i<10;i++)
printf("%d",a[i]);
printf("\n");
}

实在是有点看不懂,书上说是用的选择法给数组排序,方法我是看懂了,但是程序还是有点不明白,尤其是被调函数sort有点看不懂,求高手指教一下,越详细越好哇~谢谢乐!

或许我理解你的疑惑,你是不是觉得为什么在函数中进行交换,而没有返回,结果就变了呢。感觉跟以前那些直接调用数的函数有区别~~
其实sort中的int araay[ ]就是代表数组的形参,你调用函数的时候是把实参的首地址传进去,调用以数组做实参的函数跟调用以数做实参的函数不一样~~所以当你在函数中对这个数组进行改动时,实际值也会变动~~因为改的是对应地址当中的值。这个当你学了后面的指针以后就会详细了解,因为指针运用讲简单点也就是地址的运用~~所以首先你要先理解为什么不用返回就能得到结果~
然后在慢慢理解下面的内容,n很好理解,就是数组的长度。这是一个嵌套循环,先对K付初值,i=0,此时k=0,然后进行内部循环,这是要注意,里面的循环是
for(j=i+1;j<n;j++)
if (array[j]<array[k])k=j; 不要把下面交换也算进去~~
内部的循环就是记录数值较小的数组的下标,将其赋给k,当j=n时,就找到了此时数组当中最小的那个的下标,内部循环结束,然后进行交换把最小的数排在第i+1位,此时i=0,也就是排在第一位。
然后重复上面的循环,i递增,每次都找到第i+1小的数。整个循环结束,你所输入的数组也就按从小到大排列了~~
然后在主函数当中把排序好的数组输出~~
PS:为什么能不返回就把函数中所排好的数组输出,也就是我上面的解释~~其实书上也有的,你可以去自己看看,会比我的更详细~~懂了吗?

专升本?呵呵,,,
有答案书卖。可以考虑

yhfgfgfffffffffffffffffffffffffff

不明白就别明白嘛,这么简单的道理都不知道

首先你应该看出来第二个循环结束后array[k]中是剩余没排数中最小的,
t=array[k];array[k]=array[i];array[i]=t 这个就是把最小的那个数放在未排数中的第一个.
例:待排数为 4 5 2 3 1
i=0时 找出了最小数1
然后放在array[0]中,
此时4这个数保存在了原来 1 的位置 也就是array[4];
当i=1时 变成