C语言第11课
主要内容:函数指针
一、函数指针定义
int maxValue(int a,int b)
{
return a > b ?
a : b;
}
函数名和数组名一样是地址,存在在代码区
int maxValue(int a。int b)
int (*p)(int。int)= NULL
函数指针定义。p是变量,其它是类型(通常没有形參a。b)
p = maxValue(函数指针的使用:赋值函数名)
int m = p(3,5)(指针可当函数用)
练习:定义两个函数,一个求最大值,一个求和。用户从控制台输入两个整数,在从控制台输入max或sum分别求
3和5的最大值或和,(提示:定义一个函数指针,依据输入内容指向不同的函数。最后一次调用完毕)
int maxValue ( int a, int b ) / / 求最大值的函数
{
return a > b ? a : b;
}
int sumValue ( int a, int b ) / / 求和的函数
{
return a + b;
}
int main( int argc, const char *argv[])
{
void (*p) (int , int) = NULL; / / 定义一个指针变量
int a , b; / / 定义两个须要用的整型变量
printf(" 请输入两个整数: "); / / 让用户输入两个整数
scanf(" %d%d ",&a,&b); / / 标准的输入函数
printf(" 请输入sum或者max: "); / / 让用户输入sum或者max
char *name = malloc(sizeof(char) * 10); / / 申请char类型的乘以10的内存空间
scanf(" %s ", name);
/ / 推断用户输入的是sum还是max
if (strcmp(name, " sum ") == 0){
p = sumValue;
}else if (strcmp(name, " max ") == 0){
p = maxValue;
}else {
printf(" 输入错误,失败 ");
}
free (name); / / 释放内存,一定不能忘
int result = p(a, b);/ / 定义result接收结果
printf(" %d ", result);/ / 输出结果
}
二、回调函数
函数指针做參数
int getValue(int a, int b, int (*p)(int , int));
getValue: 函数名
int (*p)(int ,int): 函数指针做getValue函数的參数
int value = getValue(3, 5, maxValue);(函数调用:getValue函数运行过程中再调用(回调)maxValue)
如图所看到的:
练习:写一函数查找成绩在90分以上的学生,是用回调函数在姓名后面加“高富帅”
typedef struct { / / 定义一个结构体
char name[20];
int age;
float score;
} Student;
void printfStudent(Student *stu, int count)。
void printfStudent(Student *stu, int count) / / 声明并编写一个打印结构体数组的函数
{
for(int i = 0; i < count ; i++){
printf("%s %d %.2f", (stu + i) ->name, (stu + i) ->age, (stu + i) ->score);
}
}
/ / 声明并编写查找90分以上的学生并在姓名后面加“高富帅”
void changeStudent(Student *stu, int count, void (*p)(Student *));
void changeStudent(Student *stu, int count, void(*p)(Student *))
{
for (int i = 0; i < count ; i++){
if ((stu + i) ->score >= 90){
p(stu + i);
}
}
}
void changeName(Student *stu);
void changeName(Student *stu)
{
strcat (stu ->name, " 高富帅 ");
}
int main(int argc, const char*argv[]){
Student student = {/ / 定义结构体变量
{" 方世玉 ", 26, 92},
{" 令狐冲 ", 30, 89},
{" 韦小宝 ", 27, 99},
{" 花仙子 ", 20, 80},
{" 大教主 ", 24, 80}
};
int count = sizeof(student) / sizeof(Student); / / 求结构体数组的长度
printfStudent(stuent, count); / / 打印没查找前的结构体数组
changeStudent(student, count, changeName); / / 推断是否符合条件90分以上的进行改变
printfStudent(student, count) / / 打印查找后的结构体数组
}
三、动态排序
排序需求不定,无法预測的需求变更
void sortArray(int *array, int count)
{
for (int i = 0; i < count - 1; i++){
for (int j = 0; j < count - 1 - i; j++){
if (条件(需求)) {
交换
}
}
}
}
决定排序方式的重要语句封装成函数在此回调
int 数组动态排序
typedef BOOL(* PFUNC)(int , int); / / 为函数指针类型起名为PFUNC
void sortArray(int *array, int count , PFUNC p); / / 动态函数排序声明
演示样例:
/ / 1:创建一个结构体
typedef struct {
char name[20];
int age;
float score;
} Student;
/ / 3:打印学生结构体数组的函数
void printfStudent(Student *stu, int count);
void printfStudent(Student *stu, int count)
{
for (int i = 0; i < count; i++){
printf("%s %d %.2f",(stu + i) ->name, (stu + i) ->age, (stu + i) ->score);
}
printf("\n");
}
/ / 5:写一个函数依据分数从小到大排序
void paiXuStudent(Student *stu, int count, BOOL (*PFUNC)(Student *stu1, Student *stu2));
void paiXuStudent(Student *stu, int count, BOOL (*PFUNC)(Student *stu1, Student *stu2))
{
for (int i = 0; i < count - 1; i++){
for (int j = 0; j < count - 1 - i; j++){
if (PFUNC((stu + j), (stu + j + 1))){
Student temp;
temp = *(stu + j);
*(stu + j) = *(stu + j + 1);
*(stu + j + 1) = temp;
}
}
}
}
/ / 6:定义一个按分数比較大小的函数
BOOL biJiaoScore(Student *stu1, Student *stu2);
BOOL biJiaoScore(Student *stu1, Student *stu2)
{
return stu1 ->score > stuff ->score;
}
/ / 定义一个按年龄排序的函数
BOOL compareAge(Student *stu1, Student *stu2);
BOOL compareAge(Student *stu1, Student *stu2)
{
return stu1 ->age > stuff ->age
}
int main(int argc, char * argv[]){
/ / 2:创建学生结构体数组
Student *student = {
{"索隆", 22, 93},
{"香吉士", 21, 97},
{"犬夜叉", 20, 80},
{"路飞", 19, 70}
};
/ / 4:排序前调用打印函数打印结构体数组
int count = sizeof(student) / sizeof(Student);
printfStudent(student, count);
/ / 7:调用函数
paiXuStudent(student, count , biJiaoScore);
/ / paiXuStudent(student, count , compareAge);按年龄排序(仅仅需传入函数就可)
/ / 8:打印排序后的结构体数组
printfStudent(student, count);
}
版权声明:本文博主原创文章,博客,未经同意不得转载。
C语言第11课的更多相关文章
- 第11课 - enum, sizeof, typedef 分析
第11课 - enum, sizeof, typedef 分析 1. enum介绍 (1)enum是C语言中的一种自定义类型,和struct.union地位相同,格式如下: // enum每个值的最后 ...
- OPENGL NEHE Lesson11 11课的计算公式推导
计算多边形公式推导: 条件x 离散的值从0到45; y离散的值从0到45; z是符合正弦波. 问题: 1 要求x’=f(x)映射到 x’ ∈[-4.5, 4.5], x ∈{0, 1, 2, …, 4 ...
- Js笔记-第11课
// 第11课 作用域精解 运行期上下文,当函数执行时,会创建一个成为执行期上下文的内部对象.一个执行期上下文定义了一个函数执行时的环境,函数每次执行时对应的执行期上下文都是独 ...
- 《快乐编程大本营》java语言训练班 2课:java的变量
<快乐编程大本营>java语言训练班 2课:java的变量 1变量介绍 2变量分类,数值变量 3变量分类-字符串变量 4变量分类-布尔变量 5变量分类-对象 http://code6g.c ...
- [原创]零基础R语言教程---第二课---R语言入门
这节教程简单描述了R语言中常用的数据类型, 向量,字符串,矩阵,列表,数据框,以及附带了一个小例子 对于这节课所附带的例子需要做下列补充: 1.这个例子面向于对整列的数据进行预测 2.如果你需要求单行 ...
- 妙味课堂:JavaScript初级--第11课:字符串、查找高亮显示
1.数字字母 Unicode 编码 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content- ...
- C语言求1-1/3+1/5-1/7+...——小程序,大道理
问题:用C语言编写程序求1-1/3+1/5-1/7+... 示例: #include <stdio.h> void main(){ ; ,a=; ){ sum=sum+n/a; n=-n; ...
- C语言I博课作业04
这个作业属于哪个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/SE2020-1/homework/11489 我在这个作业课程 ...
- C语言基础(11)-随机数发生器
一. rand() rand是一个C语言库函数,功能是生成一个随机数.rand需要一个不同的种子,才能生成不同的随机数. 二. srand(int seed) rand需要一个不同的种子,才能生成不同 ...
随机推荐
- 新手学Unity3d的一些网站及相应学习路线
一.unity3d有什么优势 如果您对开发游戏感兴趣,而又没有决定选择哪一个游戏引擎,别犹豫了 unity3d是一个很好的选择! 就我来看unity3d优势主要有以下几方面:首先部署简单,自带了一个I ...
- Lua基础(转)
局部定义与代码块: 使用local声明一个局部变量或局部函数,局部对象只在被声明的那个代码块中有效. 代码块:一个控制结构.一个函数体.一个chunk(一个文件或文本串)(Lua把chunk当做函数处 ...
- 打印出所有"水仙花数
时间限制: 1 Sec 内存限制: 128 MB 提交: 695 解决: 352 [提交][状态][讨论版] 题目描述 打印出所有"水仙花数",所谓"水仙花数&quo ...
- java javaEE javaWEB J2EE程序猿猿程序是脑损伤,终身工作程序猿
这几天我越来越郁闷.程序员现在很火----特javaEE员. 但我觉得火只是给人们的工作程序员. 原因 javaweb该项目是非常大的.没听过那个码农能单独接到什么项目.仅仅能被人剥削. 有人不信,我 ...
- Mysql入门到精通数据表的操作
变更表 ALTER TABLE tb_name; 1.加入场 ALTER TABLE tb_name ADD 字段名字 字段类型 约束条件 [FIRST/AFTER 字段名称] 1>加入user ...
- ICT工作的思考<两>
2周奋战.我负责的LB昨天完成了最后一个模块.最后20日. 一周早于预期,经理说,出乎他的意料.So 奖励表,昨日,管理人员与我们合作,吃烧烤补补身子.我只想说,最后一个喘息. 这两周的生活确挺忙碌的 ...
- 思维导图之C++语言程序设计总结
花了大约一周的时间,将c++的课本过了一遍,米老师说第一遍不求甚解,仅仅管去看就能够了,我很成功地运行了老师这种方法,嘿嘿.那么c++是什么呢?百度上这样说,它是一种使用很广泛的计算机编程语言.C++ ...
- MemoryBarrier,Volatile
使用MemoryBarrier,Volatile进行同步 上一节介绍了使用信号量进行同步,本节主要介绍一些非阻塞同步的方法.本节主要介绍MemoryBarrier,volatile,Interlock ...
- 于Eclipse传导C/C++配置方法开发(20140721新)
Eclipse 它是一个开源.基于Java可扩展的开发平台. 在其自己的.它只是一个框架和一组服务.对于通过插件组件构建开发环境. --从百度百科的短语. 简单的说Eclipse 是免费的开源的Jav ...
- 新秀学习Hibernate——一个简单的例子
一个.Hibernate开发. 上篇博客已经为大家介绍了持久层框架的发展流程,持久层框架的种类. 为了可以使用Hibernate高速上手,我们先解说一个简单的Hibernate应用实例hibernat ...