老师布置的程序实验作业:
下面程序为选择排序,要求按如下步骤完成本题实验,理解和掌握函数参数的传递,理解函数的嵌套调用。
1) 阅读程序,理解选择排序的思想
2) 上机编辑,调试程序
3) 用两组数据,给出程序运行结果,
4) 用单步执行,观察程序执行的流程
5) 画出流程图描述程序的实现
6) 问题:什么是函数的嵌套调用?
原理:
选择排序,即从乱序输入的一组数组(个数为n)中,找出其中大(最小)元素所在的位置,把该元素的和最右边(最左边)的元素交换位置。接下来,排除已排序元素,在剩下元素中寻找最大(最小元素)。。。重复操作,直到操作了n-1遍后,所有元素都已经排好序,再输出排序后的数组。
代码:
#include <iostream> using namespace std; #define N 10 int max(int a[], int n); void sel_sort(int a[], int n); int main() { loop: //使用loop控制流程,方便调试 int a[N]; for (int i = 0; i < N; i++) //一次输入数组的值 { cin >> a[i]; } //调用函数sel_sort,函数sel_sort中嵌套调用函数max sel_sort(a, N); //a相当与指针,实际上传递了数组a[10]的首地址也即是a[0]的地址 for (int i = 0; i < 10; i++) { cout << a[i] << " "; } cout << endl; goto loop; system("pause"); } int max(int a[], int n) { int i, j = 0; for (i = 1; i < n; i++) { if (a[i] > a[j]) { j = i; } } return j; //把j返回给sel_sort函数中max函数的调用点 } void sel_sort(int a[], int n) { int j; //在函数sel_sort中可见 int i = n; for (; i > 1; i--) { j=max(a, i); //调用max函数,把数组和变量i传输过去,i用来控制max中选择最大值的范围,每选完一个最大值,缩小一次范围,直到缩小为2 int temp = a[i-1]; //交换当前未排序的最右边的值与经max函数求出的当前范围中的最大值 a[i-1] = a[j]; a[j] = temp; } //经过9次选择排序后,得出从左往右是从小到大排序的数列 return; //函数返回类型为void,此行可省略 }
调试结果:
错漏百出非常拙劣的程序框图:
函数嵌套调用:
函数的定义是相互平行的,不可在一个函数定义中定义另一个函数,但函数可以在另一个函数中被调用。函数的嵌套调用就是,在一个函数中,调用其他的函数,通过其他函数的行为或者是调用其他函数的返回值来达到某种目的。