实验一——函数指针
来源:互联网 发布:淘宝旗袍 周婷 微博 编辑:程序博客网 时间:2024/05/16 06:30
这是系统级程序设计课程的第一个实验报告。
一、场景描述
用函数指针数组存放各种排序算法,通过指针去调用算法进行排序。
在本程序中,一共定义了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[n]; 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语句就能实现调用不同排序算法的功能。
四、理解与收获
函数指针就是指向函数的存储空间地址的指针,可以对函数指针进行赋值并且通过函数指针来调用函数,它的本质是一个指针。每一个函数都有一个入口地址,通过将函数名赋值给函数指针,也就是使函数指针指向该入口地址。
函数指针有两个用途:调用函数和做函数的参数。本程序主要是使用了它做函数参数的功能。通过传入不同的函数,就可以调用不同的排序算法。提供了调用的灵活性,简化结构,某种程序上也是实现了面向对象编程的多态性。
而函数指针数组,就是一个包含多个函数指针的数组,这样可以将多个函数进行统一标识。这体现在菜单驱动系统中。例如本程序就是提示用户输入一个整数值来选择排序算法菜单中的一个选项。用户的选择可以做函数指针数组的下标,而数组中的指针可以用来调用函数。
0 0
- 实验一——函数指针
- 记一次实验——复杂函数指针的调用
- 实验: 函数指针作为函数入参
- 函数指针——typedef函数指针
- 指向函数指针(一)
- 函数指针 一
- 函数指针学习一
- 函数指针例程一
- 一、C++ 函数指针
- 函数指针实战一
- 实验二—任务一
- 对于数组指针—指针数组;函数指针—函数指针数组,指向函数指针数组的指针,的理解
- C指针——函数指针
- C指针——函数指针
- C指针——函数指针
- C指针——函数指针
- C指针——函数指针
- C指针——函数指针
- 无需后台也能快速开发可演示的微信小应用(应用号)
- HDU_1240_Asteroids!
- Objective-C中@property的所有属性详解
- FR4133学习心得之LCD_E_Init
- 日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。以下为4个嫌疑犯的供词。
- 实验一——函数指针
- unix环境高级编程读后感
- JS——实现一个删除字符串左边空白字符的方法
- 字符串函数strcpy
- 安卓的体系
- Android中使用Handler造成内存泄露的分析和解决
- POJ 3184 DP+剪枝
- 深入理解python递归函数:汉诺塔游戏
- java基础2