回调函数的两个小案例_更好的理解回调函数

背景

这个作业来自自己上篇详解回调函数的第七部分的作业 ,下面是详解回调函数的链接:
https://blog.csdn.net/qq_41286360/article/details/90108331

1.实现一个函数,可以打印任意数组;

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

//参数1 传入数组首地址   参数2  数组中每个元素占用内存空间  参数3  数组长度
void printAllArray(void * arr , int eleSize, int len , void(*myPrint)(void *))
{
	char * p = arr;//利用p指针接受数组首地址
	for (int i = 0; i < len;i++)
	{
		//获取每个元素首地址
		char * pAddr = p + eleSize * i;

		//printf("%d\n", *(int*)pAddr );
		myPrint(pAddr);
	}
}

void printInt(void * data)
{
	int * num = data;
	printf("%d\n", *num);
}

void test01()
{
	int arr[] = { 1, 2, 3, 4, 5 };
	int len = sizeof(arr) / sizeof(int);
	printAllArray(arr, sizeof(int), len, printInt);

}


struct Person
{
	char name[64];
	int age;
};

void printPerson(void * data)
{
	struct Person * person = data;
	printf("姓名:%s  年龄: %d\n", person->name, person->age);
}

void test02()
{
	struct Person personArray[] =
	{
		{ "aaa", 18 },
		{ "bbb", 19 },
		{ "ccc", 20 },
		{ "ddd", 21 },
	};

	int len = sizeof(personArray) / sizeof(struct Person);
	printAllArray(personArray, sizeof(struct Person), len, printPerson);
}


int findArrayEle(void * array, int eleSize, int len , void * data , int(*myCompare)(void * ,void * ) )
{
	char * p = array;
	for (int i = 0; i < len;i++)
	{
		//获取到每个元素首地址
		char * eleAddr = p + eleSize * i;

		//if (用户传入的数据 == 数组中遍历的元素)
		//if (data == eleAddr) 错误 不可以直接用地址做比较
		if (myCompare(data, eleAddr))
		{
			return 1;
		}
	}
	return 0;
}

int comparePerson(void * data1,void * data2)
{
	struct Person * p1 = data1;
	struct Person * p2 = data2;

	//如果姓名相等 并且年龄相等 返回真
	if ( strcmp(p1->name,p2->name)== 0  && p1->age == p2->age)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

void test03()
{
	//查找数组中是否有指定类型的元素,如果有返回1,如果没有返回0
	struct Person personArray[] =
	{
		{ "aaa", 18 },
		{ "bbb", 19 },
		{ "ccc", 20 },
		{ "ddd", 21 },
	};

	int len = sizeof(personArray) / sizeof(struct Person);

	struct Person p = { "cccc", 20 };

	int ret = findArrayEle(personArray, sizeof(struct Person), len, &p, comparePerson);

	if (ret)
	{
		printf("找到元素\n");
	}
	else
	{
		printf("未找到\n");
	}

}

int main(){
	//test01();
	//test02();
	test03();
	system("pause");
	return EXIT_SUCCESS;
}

2. 实现一个函数,可以对任意类型数组排序;

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void selectSort(void * arr, int eleSize , int len  , int(*myCompare)( void* ,void * ) )
{
	
	char * temp = malloc(eleSize);

	for (int i = 0; i < len; i++)
	{
		//认定i就是最小值 或者最大值
		int minOrMax = i;

		for (int j = i + 1; j < len; j++)
		{
			//获取j元素首地址
			char * pJ = (char *)arr + eleSize * j;
			//获取当前最小值或最大值元素的首地址
			char * pMinOrMax = (char *)arr + eleSize *minOrMax;
			//if ( pJ  pMinOrMax)

			/*  升序
					if (*num1 < *num2)
					{
					return 1;
					}
			*/

			if (myCompare(pJ, pMinOrMax))
			{
				minOrMax = j;
			}
		}
		if (i != minOrMax) //如果认定最小值或最大值 不是计算出的minOrMax
		{
			//通过内存拷贝实现交换
			char * pI = (char *)arr + i * eleSize;
			char * pMinOrMax = (char *)arr + minOrMax * eleSize;

			memcpy(temp, pI, eleSize);
			memcpy(pI,pMinOrMax, eleSize);
			memcpy(pMinOrMax, temp, eleSize);
		}
	}

	if (temp != NULL)
	{
		free(temp);
		temp = NULL;
	}
}

int compareInt(void * data1,void * data2)
{
	int * num1 = data1;
	int * num2 = data2;

	//升序
	//if (*num1 < *num2)
	//{
	//	return 1;
	//}
	//else
	//{
	//	return 0;
	//}

	return *num1 < *num2;
}

void test01()
{
	int arr[] = { 10, 40, 30, 20, 50, 90, 70, 60 ,80};

	int len = sizeof(arr) / sizeof(int);
	selectSort(arr, sizeof(int), len, compareInt);

	for (int i = 0; i < len;i++)
	{
		printf("%d\n",arr[i]);
	}

}


//结构体数组排序
struct Person
{
	char name[64];
	int age;
};

//按照年龄做降序
int comparePerson(void * data1, void * data2)
{
	struct Person * p1 = data1;
	struct Person * p2 = data2;

	
	//if (p1->age > p2->age)
	//{
	//	return 1;
	//}
	//else
	//{
	//	return 0;
	//}

	return p1->age > p2->age;
}

void test02()
{
	struct Person arr[] = 
	{
		{ "aaa", 10 },
		{ "bbb", 40 },
		{ "ccc", 20 },
		{ "ddd", 30 },
		{ "eee", 50 },
	};

	int len = sizeof(arr) / sizeof(struct Person);
	selectSort(arr, sizeof(struct Person), len, comparePerson);

	for (int i = 0; i < len;i++)
	{
		printf("姓名: %s  年龄: %d\n", arr[i].name, arr[i].age);
	}

}

int main(){

	test01();
	//test02();


	system("pause");
	return EXIT_SUCCESS;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值