理解函数指针数组和定义,转移表
函数指针数组的用途:转移表(计算器)
函数指针数组的用途:转移表(计算器)
#include<stdio.h>
#pragma warning(disable:4996)
int add(int m, int n)
{
return (m + n);
}
int sub(int m, int n)
{
return (m - n);
}
int mul(int m, int n)
{
return (m * n);
}
int div(int m, int n)
{
if (n == 0)
{
printf("error!\n");
return -1;
}
return (m / n);
}
void show()
{
printf("#########################\n");
printf("####1 add#######2 sub####\n");
printf("####3 mul#######4 div####\n");
printf("#########################\n");
printf("Please select:\n");
}
int main()
{
int m, n;
int x;
int ret = 0;
int(*p[5])(int m, int n) = { 0, add, sub, mul, div };//转移表
while (1)
{
show();
scanf("%d",&x);
if ((x<=4 && x>=1))
{
printf("输入操作数:");
scanf("%d%d",&m,&n);
ret = (*p[x])(m, n);
}
else
{
printf("error!\n");
}
printf("ret=%d\n",ret);
}
system("pause");
return 0;
}
6.练习使用qsort函数排序各种类型的数据。
void qsort(void*base, size_t num, size_t width, int(__cdecl*compare)(const void*, const void*));
void qsort(void*base, size_t num, size_t width, int(__cdecl*compare)(const void*, const void*));
#include<stdio.h>
int cmp1(const void * a, const void * b)
{
return (*(int*)a - *(int*)b);//> return 1;<return 0
}
int cmp2(const void * a, const void *b)
{
return(*(char*)a - *(char*)b);
}
int main()
{
int i;
int a[10] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
char b[10] = { 'a', 's', 'b', 'e', 'd', 'f', 'c','r','z','o'};
qsort(a, 10, sizeof(int), &cmp1);
qsort(b, 10, sizeof(char),&cmp2);
for (i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
printf("\n");
for (i = 0; i < 10; i++)
{
printf("%c ", b[i]);
}
printf("\n");
system("pause");
return 0;
}
7.模仿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 < 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 < count - 1; i++)
{
for (; 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 };
//char *arr[] = { "aaaa", "dddd", "ssss", "cccc", "bbbb" };
int i = 0;
bubble(arr, sizeof(arr) / sizeof (arr[0]), sizeof (int), int_cmp);
for (; i < sizeof (arr) / sizeof (arr[0]);i++)
{
printf("%d ",arr[i]);
}
system("pause");
return 0;
}
eg
#include<stdio.h>
int main()
{
char *c[] = { "ENTER", "NEW", "POINT", "FIRST" };
char **cp[] = { c + 3, c + 2, c + 1, c };//c
char ***cpp = cp;
printf("%s\n",**++cpp);
printf("%s\n", *--*++cpp+3);//+3 不改变cpp自身
printf("%s\n", *cpp[-2]+3);//+3
printf("%s\n", cpp[-1][-1]+1);//+1
system("pause");
return 0;
}