函数指针作为函数参数,实现冒泡排序的升序排序和降序排序

#include<stdio.h>

#define N 10//定义数组元素个数
int Ascending(int a,int b);//升序排列的函数声明
int Descending(int a,int b);//降序排列的函数声明
void swap(int*,int*);//交换数据的函数声明
void BubbleSort(int a[],int n,int (*compare)(int,int));//声明排序函数,通过函数指针作为函数调用
void Display(int a[],int n);//输出数组元素的函数声明
void main()
{
	int a[N]={12,34,21,46,89,54,26,8,6,17};
	int flag;
	while(1)
	{
		printf("输入1:从小到大排序。\n输入2:从大到小排序\n输入3:退出!\n");
		scanf("%d",&flag);
		switch(flag)
		{
		case 1:
			printf("排序前的数据为:");
            Display(a,N);
			BubbleSort(a,N,Ascending);//从小到大排序,将函数作为参数传递
			printf("从小到大排列后的数据为:");
			Display(a,N);
			break;
		case 2:
            printf("排序前的数据为:");
            Display(a,N);
			BubbleSort(a,N,Descending);//从大到小排序,将函数作为参数传递
			printf("从大到小排列后的数据为:");
			Display(a,N);
			break;
		case 3:
			return;
			break;
		default:
			printf("输入数据不合法,请重新输入。\n");
			break;
		}
	}
}
//冒泡排序,将函数作为参数传递,判断是从小到大还是从大到小排序
void BubbleSort(int a[],int n,int(*compare)(int,int))
{
	int i,j;
	for(i=0;i<n;i++)
	{
		for(j=0;j<n-1;j++)
			if((*compare)(a[j],a[j+1]))
				swap(&a[j],&a[j+1]);
	}
}
//交换数组的元素
void swap(int *a,int *b)
{
	int t;
	t=*a;
	*a=*b;
	*b=t;
}
//判断相邻数据的大小,如果前者大,升序排列需要交换
int Ascending(int a,int b)
{
	if(a>b)
		return 1;
	else
		return 0;
}
//判断相邻数据的大小,如果前者大,降序排列需要交换
int Descending(int a,int b)
{
	if(a<b)
		return 1;
	else
		return 0;
}
void Display(int a[],int n)//输出数据元素
{
    int i;
	for(i=0;i<n;i++)
		printf("%5d",a[i]);
	printf("\n");
}

程序运行结果

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 11:53:20

函数指针作为函数参数,实现冒泡排序的升序排序和降序排序的相关文章

函数指针作为函数參数,实现冒泡排序的升序排序和降序排序

#include<stdio.h> #define N 10//定义数组元素个数 int Ascending(int a,int b);//升序排列的函数声明 int Descending(int a,int b);//降序排列的函数声明 void swap(int*,int*);//交换数据的函数声明 void BubbleSort(int a[],int n,int (*compare)(int,int));//声明排序函数,通过函数指针作为函数调用 void Display(int a[

Day8 函数指针做函数参数

课堂笔记 课程回顾 多态 virtual关键字 纯虚函数 virtual func() = 0; 提前布局vptr指针 面向接口编程 延迟绑定 多态的析构函数的虚函数. 多继承的二义性 . 重载 重写 重定义. 实现多态的理论基础:函数指针做函数参数. vptr指针与虚函数表. 构造函数不应为虚函数 多态会降低程序的执行速度.不建议所有的函数都是虚函数. 多态时的指针步进. 多继承在项目开发中使用的比较少. linux从2.4内核升级到2.6的时候,做到了电源可以热插拔,提前将电源驱动的接口规划

C基础--函数指针作为函数的参数

#include <stdio.h> int add(int a, int b) { printf("%d\t%d\n", a, b); return a+b; } char max_ch(char *str) { int max, i; max = 0; for (i = 0; str[i] != '\0'; i++) if (str[i] > str[max]) max = i; return str[max]; } int main1(void) { int r

C++基础8【难】 回顾:数组指针,函数指针,函数指针做函数参数 C语言多态

1,数组指针语法梳理 回顾,如何定义数组数据类型: 回顾,如何定义指针类型数组: 回顾,如何直接定义 一个指向数组类型的指针: 2,函数指针语法梳理 1)如何定义一个函数类型 2)如何定义一个函数指针类型 3)如何定义一个函数指针(指向一个函数的入口地址) [中级程序员 转 高级程序员的 必经之路] 1,函数类型做函数的参数 把函数的入口地址传过来,奇怪的效果:[多态就是这样] 函数指针 做 函数参数 思想剖析 1,数组指针语法梳理 回顾,如何定义数组数据类型: [email protected

C和C++函数指针作为函数参数的区别

1.函数作为参数加*和不加* 例1: void print(int i) { printf("not parameter%d\n",i); } void debugfun(void <span style="color:#ff0000;">(*funprint</span>)(int)) { funprint(2); return; } main() { debugfun(print); } 输出: not parameter2 例2:(去掉

C#委托与C语言函数指针及函数指针数组

C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用的时候通过指针访问这个函数. 在C语言中函数指针的申明如下: //可以理解为申明一个指着变量 Func ,它的类型是 返回Type(可以为 void )类型的参数,接收 (Type one,Type two,...)类型的//参数(可以不接受参数). Type *Func(Type one,Type

函数指针与函数指针数组的使用方法

转自:http://blog.csdn.net/feitianxuxue/article/details/7300291 函数指针与函数指针数组的使用方法 函数指针: 函数指针包含函数在内存中的地址.数组名实际上就是数组的第一个元素在内存中的地址,类似地,函数名实际上也是执行这个函数任务的代码在内存中的起始地址. 函数指针可以传递给函数.从函数返回.保存在数组中.赋予另一个函数指针或者调用底层函数. 下面我们用数值算法accumulate讨论下函数指针的用法.accumulate是一种常用的ST

入职培训笔记记录--day9(1、指针函数与函数指针、函数指针数组 2、malloc memset 3、递归函数 4、结构体 5、共用体---》大小端 6、枚举)

1.指针函数与函数指针.函数指针数组 指针函数:返回值为指针的函数 char *fun() { char str[] = "hello world"; return str; } int main() { char *p = fun(); puts(p); return 0; } 编译时,会出现警告,返回了一个已经被释放掉的内存空间的首地址解决方法:1.static 2.char *str = "hello world"; 3.malloc 注意:使用完后要free

函数指针、函数指针数组

参考:百度百科 |函数指针|词条. 指针_函数,就不说了.自己感觉就是So-easy的.[ 声明格式:returnType *Function(arguments); ] 重点是 函数指针,以及突然冒出来的 函数指针数组;(特别说明,我习惯先写代码,再写注释:情况A:代码在左,注释向右.情况B:代码在上,注释在下.) 函数指针,我形象的描述 函数<-指针,(文中一切有问题请指正,谢谢).[声明格式: returnType(*pointer)(arguments); ] 举例: int fun(i