实验一——函数指针
2016-10-23 20:48
429 查看
这是系统级程序设计课程的第一个实验报告。
一、场景描述
用函数指针数组存放各种排序算法,通过指针去调用算法进行排序。
在本程序中,一共定义了4种排序算法——选择排序、插入排序、希尔排序、归并排序(当然后期还能加入更多的排序算法,比如冒泡排序) 。定义了一个通用排序接口void sort(void (sortAlgorithm)(int,int),int *array, int n) ,在主程序中由用户选择使用何种排序算法,调用sort方法,传入函数指针数组中对应的项,进行排序并且输出排序后的结果。
二、代码
三、程序优势
在主程序中只要调用sort方法,就可以不需要编写switch语句就能实现调用不同排序算法的功能。
四、理解与收获
函数指针就是指向函数的存储空间地址的指针,可以对函数指针进行赋值并且通过函数指针来调用函数,它的本质是一个指针。每一个函数都有一个入口地址,通过将函数名赋值给函数指针,也就是使函数指针指向该入口地址。
函数指针有两个用途:调用函数和做函数的参数。本程序主要是使用了它做函数参数的功能。通过传入不同的函数,就可以调用不同的排序算法。提供了调用的灵活性,简化结构,某种程序上也是实现了面向对象编程的多态性。
而函数指针数组,就是一个包含多个函数指针的数组,这样可以将多个函数进行统一标识。这体现在菜单驱动系统中。例如本程序就是提示用户输入一个整数值来选择排序算法菜单中的一个选项。用户的选择可以做函数指针数组的下标,而数组中的指针可以用来调用函数。
一、场景描述
用函数指针数组存放各种排序算法,通过指针去调用算法进行排序。
在本程序中,一共定义了4种排序算法——选择排序、插入排序、希尔排序、归并排序(当然后期还能加入更多的排序算法,比如冒泡排序) 。定义了一个通用排序接口void sort(void (sortAlgorithm)(int,int),int *array, int n) ,在主程序中由用户选择使用何种排序算法,调用sort方法,传入函数指针数组中对应的项,进行排序并且输出排序后的结果。
二、代码
/* * 函数指针数组的应用————多种排序算法 * 用函数指针数组存放各种排序算法,通过指针去调用算法进行排序 */ #include <stdio.h> //比较大小 int less(int v, int w) { if (v < w) { return 1; } else return 0; } //交换位置 void exch(int *array,int v, int w) { int tmp = array[v]; array[v] = array[w]; array[w] = tmp; } //打印数组 void show(int *array, int n) { for (int i = 0; i < n; ++i) { printf("%d ", array[i]); } printf("\n"); } //选择排序 void selectSort(int *array, int n) { for (int i = 0; i < n; ++i) { int min = i; for (int j = i+1; j < n; ++j) { if (less(array[j], array[min])) { min = j; } } exch(array, min, i); } } //插入排序 void insertSort(int *array, int n) { for (int i = 0; i < n; ++i) { for (int j = i; j > 0 && less(array[j], array[j - 1]); --j) { exch(array, j, j - 1); } } } //希尔排序 void shellSort(int *array, int n) { int h = 1; while (h < n / 3) { h = 3 * h + 1; } while (h >= 1) { for (int i = h; i < n; ++i) { for (int j = i; j >= h && less(array[j], array[j - h]); j -= h) { exch(array, j, j - h); } } h = h/3; } } //归并排序 void merge(int *array,int lo,int mid,int hi, int *aux) { int i = lo, j = mid + 1; for (int k = lo; k <= hi; ++k) { aux[k] = array[k]; } for (int l = lo; l <= hi; ++l) { if (i > mid) array[l] = aux[j++]; else if (j > hi) array[l] = aux[i++]; else if (less(aux[i],aux[j])) array[l] = aux[i++]; else array[l] = aux[j++]; } } void mergeSortRecursive(int *array,int lo,int hi, int *aux) { if (hi <= lo) return; int mid = lo + (hi - lo) / 2; mergeSortRecursive(array, lo, mid, aux); mergeSortRecursive(array, mid + 1, hi, aux); merge(array, lo, mid, hi, aux); } void mergeSort(int *array, int n) { int aux ; mergeSortRecursive(array, 0, n - 1, aux); } //通用排序接口,传入的是函数指针,具体视传入的是哪个排序算法而定 void sort(void (*sortAlgorithm)(int*,int),int *array, int n) { sortAlgorithm(array, n); show(array,n); } int main(int argc, char *args[]) { int count = 0; //函数指针数组,存放各种排序算法 void (*sortAlgorithm[])(int*,int) = {selectSort,insertSort,shellSort,mergeSort}; printf("这是一个简单的应用函数指针数组的例子————多种排序算法\n"); printf("请输入整数的个数:"); scanf("%d", &count); int array[count]; printf("请输入你想排序的整数列:"); for (int i = 0; i < count; ++i) { scanf("%d", array + i); } printf("请选择排序方式:\n"); printf("1----选择排序\n"); printf("2----插入排序\n"); printf("3----希尔排序\n"); printf("4----归并排序\n"); int choice; scanf("%d", &choice); printf("排序后的结果如下:"); sort(sortAlgorithm[choice-1], array, count); return 0; }
三、程序优势
在主程序中只要调用sort方法,就可以不需要编写switch语句就能实现调用不同排序算法的功能。
四、理解与收获
函数指针就是指向函数的存储空间地址的指针,可以对函数指针进行赋值并且通过函数指针来调用函数,它的本质是一个指针。每一个函数都有一个入口地址,通过将函数名赋值给函数指针,也就是使函数指针指向该入口地址。
函数指针有两个用途:调用函数和做函数的参数。本程序主要是使用了它做函数参数的功能。通过传入不同的函数,就可以调用不同的排序算法。提供了调用的灵活性,简化结构,某种程序上也是实现了面向对象编程的多态性。
而函数指针数组,就是一个包含多个函数指针的数组,这样可以将多个函数进行统一标识。这体现在菜单驱动系统中。例如本程序就是提示用户输入一个整数值来选择排序算法菜单中的一个选项。用户的选择可以做函数指针数组的下标,而数组中的指针可以用来调用函数。
相关文章推荐
- 实验 9 指针1 输入一行字符,要求用自定义的函数void f(char *line)统计和输出字符串中数字字符、英文字符和其他字符的个数
- 实验9 指针1 1、程序填空:下列程序在数组中同时查找最大元素和最小元素的下标,分别存放在 main()函数的max 和 min 变量中。要求:根据运行结果分析程序和填空,并注释说明填充依据。
- 实验: 函数指针作为函数入参
- 实验9 指针1 、程序填空:下列程序在数组中同时查找最大元素和最小元素的下标,分别存放在 main()函数的max 和 min 变量中。要求:根据运行结果分析程序和填空,并注释说明填充依
- 【分析】一个C++溢出虚函数指针的更真实试验
- 14、函数的传值和传指针
- 成员函数指针与高性能的C++委托(中篇)
- 使用指针来将多维数组传递给函数
- 函数指针point of function
- typedef使用大全3(指向函数的指针)
- 【例子】一个C++溢出虚函数指针的更真实试验
- C++成员函数指针一种用法
- 水滴石穿C语言之指针、数组和函数
- Item 14. 函数指针(Function Pointers)
- Item 16. 指向成员函数的指针
- Item 14. 函数指针(Function Pointers)
- 成员函数指针与高性能的C++委托(上篇)
- 指向函数的指针数组
- C语言之指针、数组和函数
- Item 16. 指向成员函数的指针