了解指针,爱上指针(5)
- 回调函数
- qsort函数
- 冒泡排序模拟实现qsort函数
回调函数
回调函数:就是一个通过函数指针调用的函数。
把函数的指针作为参数传给另一个函数,当这个指针被用来调用指向的函数时,此时被调用的函数就是回调函数。
前面我们讲到了转移表,在这把转移表的代码在回顾一遍:
void menu()
{
printf("*************************************************\n");
printf("*************************************************\n");
printf("*******1.Add 2.Sub 3.Div 4.Mul********\n");
printf("********************0.退出***********************\n");
printf("*************************************************\n");
}
int Add(int x, int y)
{
return x + y;
}
int Sub(int x, int y)
{
return x - y;
}
int Div(int x, int y)
{
return x / y;
}
int mul(int x, int y)
{
return x * y;
}
int main()
{
int input = 0;
int x = 0;
int y = 0;
int ret = 0;
int (*p[5])(int x, int y) = { 0,Add,Sub,Div,mul };
do
{
printf("请选择:");
scanf("%d",&input);
if (input>=1&&input<=4)
{
printf("请输入两个操作数:");
scanf("%d %d", &x, &y);
ret = (*p[input])(x, y);
printf("%d\n", ret);
}
else if (input == 0)
{
printf("退出计算器\n");
}
else
{
printf("请重新输入\n");
}
} while(input);
return 0;
}
将转移表的代码加入回调函数:
void menu()
{
printf("*************************************************\n");
printf("*************************************************\n");
printf("*******1.Add 2.Sub 3.Div 4.Mul********\n");
printf("********************0.退出***********************\n");
printf("*************************************************\n");
}
int Add(int x,int y)
{
return x + y;
}
int Sub(int x,int y)
{
return x - y;
}
int Div(int x,int y)
{
return x / y;
}
int Mul(int x,int y)
{
return x * y;
}
void Cals(int(*p)(int,int))
{
int x=0;
int y=0;
printf("请输入两个参数:");
scanf("%d %d",&x,&y);
int ret = p(x,y);
printf("%d\n",ret);
}
int main()
{
int input = 0;
do
{
menu();
printf("请选择:");
scanf("%d",&input);
switch (input)
{
case 1:
Cals(Add);
break;
case 2:
Cals(Sub);
break;
case 3:
Cals(Div);
break;
case 4:
Cals(Mul);
break;
case 0:
printf("退出\n");
break;
default:
printf("请重新输入");
break;
}
} while (input);
return 0;
}
qsort函数
qsort函数声明:
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
- void*base,指向要排序的数组的第一个元素的指针。
- size_t nitems 指向的数组的元素个数。
- size_t size 指向的数组的大小。
- int(compar)(const voidconst void) 用来比较两个数的函数。
这里我们用qsort函数来排序一个整型数组:
int com_int(const void* a, const void* b)
{
return *(int*)a - *(int*)b;
}
int main()
{
int a[10] = {2,1,4,3,6,8,9,3,1,10};
int sz = sizeof(a) / sizeof(a[0]);
qsort(a, sz, sizeof(a[0]), com_int);
for (int i=0;i<10;i++)
{
printf("%d ",a[i]);
}
return 0;
}
用qsort函数排序一个字符数组:
char cmp_char(const void*a,const void*b)
{
return *(char*)a - *(char*)b;
}
int main()
{
char a[] = {'w','d','q','v','e'};
int sz = sizeof(a) / sizeof(a[0]);
qsort(a,sz,sizeof(a[0]),cmp_char );
for (int i=0;i<sz;i++)
{
printf("%c ",a[i]);
}
return 0;
}
用qsort函数排序一个浮点型数组:
排序浮点型需要注意:不能想整型那样通过相减来判断大小,要用三目操作符。
int cmp_double(const void*a,const void*b)
{
return *(double*)a > *(double*)b ? 1 : 0;
}
int main()
{
double a[] = {1.2,3.1,4.2,9.6,3.1,5.5};
int sz = sizeof(a) / sizeof(a[0]);
qsort(a,sz,sizeof(a[0]),cmp_double );
for (int i=0;i<sz;i++)
{
printf("%lf ",a[i]);
}
return 0;
}
用qsort函数排序一个字符串:
int cmp_char(const void*str,const void*str1)
{
return strcmp(*(char**)str , *(char**)str1 );
}
int main()
{
char* a[] = { "aaa" ,"fff","eee","bbb"};
int sz = sizeof(a) / sizeof(a[0]);
qsort(a,sz,sizeof(a[0]),cmp_char );
for (int i=0;i<sz;i++)
{
printf("%s ", a[i]);
}
return 0;
}
冒泡排序模拟实现qsort函数
#include <stdio.h>
int int_cmp(const void* p1, const void* p2)
{
return (*(int*)p1 - *(int*)p2);
}
void _swap(void* p1, void* p2, int size)
{
int i = 0;
for (i = 0; i < size; i++)
{
char tmp = *((char*)p1 + i);
*((char*)p1 + i) = *((char*)p2 + i);
*((char*)p2 + i) = tmp;
}
}
void bubble(void* base, int count, int size, int(*cmp)(void*, void*))
{
int i = 0;
int j = 0;
for (i = 0; i < count - 1; i++)
{
for (j = 0; j < count - i - 1; j++)
{
if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)
{
_swap((char*)base + j * size, (char*)base + (j + 1) * size,
size);
}
}
}
}
int main()
{
int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
int i = 0;
bubble(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp);
for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}