详解回调函数的第7部分的作业答案
背景
这个作业来自自己上篇详解回调函数的第七部分的作业 ,下面是详解回调函数的链接:
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;
}