exercise21

理解函数指针数组和定义,转移表
函数指针数组的用途:转移表(计算器)

#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*));

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值