实验一——函数指针

来源:互联网 发布:淘宝旗袍 周婷 微博 编辑:程序博客网 时间: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
原创粉丝点击