修改例8中的程序实例, 用函数指针编程实现一个通用的排序函数, 既能实现对学生成绩的升序排列,又能实现对学生成绩的降序排序

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

#define N 40

int ReadScore(int score[]);
void PrintScore(int score[], int n);
void SelectionSort(int a[], int n, int (*compare)(int a, int b));
int Ascending(int a, int b);
int Descending(int a, int b);
void Swap(int* x, int* y);
int main()
{
    int score[N], n;
    int order;             //值为1表示升序排序,值为2表示降序排序
    n = ReadScore(score);  //输入成绩,返回学生人数
    printf("Total student are %d\n", n);
    printf("Enter 1 to sort in ascending order,\n");
    printf("Enter 2 to sort in descending order:");
    scanf("%d", &order);
    printf("Data items in original order\n");
    PrintScore(score, n);    //输出排序前的成绩
    if (order == 1)\
    {
        SelectionSort(score, n, Ascending);   //函数指针指向Ascending
        printf("Data items in original order\n");
    }
    else
    {
        SelectionSort(score, n, Descending);   //函数指针指向Descending
        printf("Data items in original order\n");
    }
    PrintScore(score, n);   //输出排序后的成绩
    return 0;
}
//函数功能: 输入学生某门课的成绩,当输入负值时,结束输入,返回学生人数
int ReadScore(int score[])
{
    int i = -1;
    do {
        i++;
        printf("Input score:");
        scanf("%d", &score[i]);
    } while (score[i] >= 0);
    return i;
}
//函数功能: 输出学生成绩
void PrintScore(int score[], int n)
{
    int i;
    for (i = 0; i < n; i++)
    {
        printf("%4d", score[i]);
    }
    printf("\n");
}
//函数功能: 调用函数指针compare指向的函数实现对数组a的交换法排序
void SelectionSort(int a[], int n, int (*compare)(int a, int b))
{
    int i, j, k;
    for (i = 0; i < n - 1; i++)
    {
        k = i;
        for (j = i + 1; j < n; j++)
        {
            if ((*compare) (a[j], a[k])) k = j;
        }
        if (k != i) Swap(&a[k], &a[i]);
    }
}
//使数据按升序排列
int Ascending(int a, int b)
{
    return a < b;      //这样比较决定了按升序排列,如果 a < b,则交换
}
//使数据按降序排序
int Descending(int a, int b)
{
    return a > b;      //这样比较决定了按升序排列,如果 a > b,则交换
}
//函数功能: 两整数值交换
void Swap(int* x, int* y)
{
    int temp;
    temp = *x;
    *x = *y;
    *y = temp;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值