C语言回调函数实例

C 专栏收录该内容
6 篇文章 0 订阅

今天刚学习了C语言回调函数,现炒现卖,写一个实例供参考
在主函数调用SearchStudents函数的时候给它传递了SearchByNumber这个函数,而SearchStudents函数内部又返回调用了SearchByNumber,故为回调

#include<stdio.h>
#include<stdlib.h>

#define	null	((void*)0)	

//定义一个学生结构体
typedef struct
{
	char *Name;
	long Number;
	unsigned char ChinesSocre;
	unsigned char MathSocre;
	unsigned char EnglishSocre;
	long sumSocre;
	float averageSocre;
} STU,*PSTU;


//定义回调函数指针
typedef int (*SearchFunCallBack)(void const *, void const *);


//查找学生并计算总成绩和平均成绩。
PSTU SearchStudents(PSTU pStuList,SearchFunCallBack searchFun,void const * searchValue)
{
	while(pStuList->Name != null)
	{
		if(searchFun(pStuList,searchValue) == 1)
		{
			pStuList->sumSocre=pStuList->ChinesSocre+pStuList->MathSocre+pStuList->EnglishSocre;
			pStuList->averageSocre=pStuList->sumSocre/3.0f;

			break;
		}
		pStuList++;
	}
	return pStuList;
}

//通过学号查找学生
int SearchByNumber(void const * ListNode,void const * value)
{
	PSTU pStu;
	pStu = (PSTU)ListNode;
	if(pStu->Number == *(long *)value)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}


//通过姓名查找学生
int SearchByName(void const * ListNode,void const * value)
{
	PSTU pStu;
	pStu = (PSTU)ListNode;
	if(pStu->Name == (char *)value)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}


void main()
{
	PSTU pStu;
	STU students[3];
	students[0].Name="小张";
	students[0].Number=1001;
	students[0].ChinesSocre=78;
	students[0].MathSocre=86;
	students[0].EnglishSocre=85;

	students[1].Name="小明";
	students[1].Number=1002;
	students[1].ChinesSocre=96;
	students[1].MathSocre=67;
	students[1].EnglishSocre=90;

	students[2].Name="小李";
	students[2].Number=1003;
	students[2].ChinesSocre=87;
	students[2].MathSocre=75;
	students[2].EnglishSocre=95;

	while(1)
	{
		long value = 1003;
		//pStu = SearchStudents(students,SearchByNumber,&value);	// 通过学号查找
		pStu = SearchStudents(students,SearchByName,"小明");		// 通过姓名查找
		if(pStu->Name == null)
		{
			printf("没有找到该学生。\n");
		}
		else
		{
			printf("查找到相应的学生:\n姓    名:%s\n学    号:%d\n语文成绩:%d\n数学成绩:%d\n英语成绩:%d\n总 成 绩:%d\n平均成绩:%.2f"
				,pStu->Name,pStu->Number,pStu->ChinesSocre,pStu->MathSocre,pStu->EnglishSocre,pStu->sumSocre,pStu->averageSocre);
		}

		while(1);
	}

}


  • 0
    点赞
  • 0
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值