数媒派(4)C语言实验五

实验五、函数指针及应用
知识拓展:
函数指针的应用,当调用一个函数时,可能不仅想传入该函数需要被处理的数据,还希望传入指向子程序的指针,该子程序决定如何处理数据。

也可以在数组中存储函数指针,然后使用数组的索引来调用这些函数。例如,键盘驱动程序可能使用函数指针数组,数组索引对应到了键盘编码。当用户按下一个键时,程序就会跳到对应的函数。与数组指针的声明一样,函数指针的声明也需要括号。

一个函数在编译时被分配一个入口地址,这个入口地址就称为函数的指针。

函数名代表函数的入口地址,这一点和数组一样。我们可以用一个指针变量来存放这个入口地址,然后通过该指针变量调用函数。如:假设有一个求两者较大的函数如下:

int max(int x, int y);

当我们调用这个函数时可以这样:

int c;
c=max(a,b);

这是通常调用方法,其实我们还可以定义一个函数指针,通过指针来调用,如:

int (*p)(a,b);

arrayOperate.c 对数组元素进行不同的函数操作

(1)程序说明:在这段程序中,设计foreach()函数,将函数指针作为参数。设计print()函数来打印数组,设计abs()函数来对数组元素的值取绝对值,设计opposite()函数来对数组元素取相反数,设计doubleArray()函数来对数组元素的每个值乘两倍。

(2)实验代码:

#include<stdio.h>
/*
程序说明:在这段程序中,设计foreach()函数,将函数指针作为参数。设计print()函数来打印数组,
        设计abs()函数来对数组元素的值取绝对值,设计opposite()函数来对数组元素取相反数,
        设计doubleArray()函数来对数组元素的每个值乘两倍。

*/

// 给返回值为void 参数为一个int的函数指针重命名,命名为pFunc_t
typedef void (*pFunc_t)(int*);

void for_each(int *arr, int size, pFunc_t p);
void print(int *n);
void opposite(int *n);
void abstract(int *n);
void doubleArray(int *n);

int main(void){
	pFunc_t pri = print;
	pFunc_t opp = opposite;
	pFunc_t abs = abstract;
    pFunc_t dou = doubleArray;
    int array[] = {23,-21,24,64,91,19,27};
    int length = sizeof(array)/sizeof(array[0]);
    printf("before any operation ,array travese :\n");
    for_each(array,length,pri); 

    printf("\nnow begin to get opposite num \n");
    for_each(array,length,opp);
    for_each(array,length,pri);
    printf("\nnow begin to get abstract num \n");
    for_each(array,length,abs);
    for_each(array,length,pri);

    printf("\n now begin to get double num \n");
    for_each(array,length,dou);
    for_each(array,length,pri);



	return 0;
}

calculus.c 对不同函数模拟求积分的过程

(1)程序说明:此程序模拟积分的过程,用来模拟计算不同函数的积分。在Calculate函数中,传入的是变量为func的函数指针
(2)实验代码:

#include<stdio.h>
#include<math.h>
/*
程序说明:此程序模拟积分的过程,用来模拟计算不同函数的积分
*/
double Calculate(double(*func)(double x), double a, double b);
double func_1(double);
double func_2(double);
double func_3(double);

   
void main()  
{  
    printf("%lf\n", Calculate(func_1, 0, 1));  
    printf("%lf\n", Calculate(func_2, 0, 1));
    printf("%lf\n", Calculate(func_3, 0, 1));
      
}  
/* Calculate用于计算积分。一共三个参数。
第一个为函数指针func,指向待积分函数。
二三参数为积分上下限.
*/
double Calculate(double(*func)(double x), double a, double b)  
{  
    double dx = 0.0001;//细分的区间长度  
    double sum = 0;  
    /*
    请在此完成对函数func的积分过程,细分的区间长度为dx
    */
    return sum;  
} 
double func_1(double x)  
{  
    return x*x;  
}  
   
double func_2(double x)  
{  
    return x*x*x;  
}  

double func_3(double x)
{
    return exp(x);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值