函数指针作为函数参数和返回指针的函数

今天分享两个问题,设计函数指针作为函数参数和返回指针的函数的知识点。不懂这是不是属于原创,反正如果有触犯到谁的利益啊,可以告知我,我删贴。那啥不是有意的啊,不要讹我,咱穷啊。可以多多评论,很想与大家互动哈。
废话不多说,上题目。

  1. 题目 利用梯形法计算定积分,f(x)一共有三种。看代码哈。(涉及知识点是函数指针作为函数参数)
#include<stdio.h>
int main(void) 
 {
	float f1(float),f2(float),f3(float);
	float jifen(float,float,int,float(*)(float));
	float a,b,v;
	int n,flag;
	printf("请输入积分上下限\n");
	scanf("%f%f",&a,&b);
	printf("请输入将区间分成多少份\n");
	scanf("%d",&n);
	printf("请按下面选项来选择\n");
	printf("1.f1(x)=x*x-2*x+2\n");
	printf("2.f2(x)=1+x+x*x+x*x*x\n");
	printf("3.f3(x)=x/(1+x*x)\n");
	printf("请输入您的选择(1.2or3)\n");
	scanf("%d",&flag);
	if(flag==1)
	  v=jifen(a,b,n,f1);
	if(flag==2)
	  v=jifen(a,b,n,f2);
	if(flag==3)
	  v=jifen(a,b,n,f3); 
	printf("v=%.2f\n",v);
	return 0;   
 } 
 float f1(float x)
 {
 	return x*x-2*x+2;
 }
  float f2(float x)
 {
 	return 1+x+x*x+x*x*x;
 }
  float f3(float x)
 {
 	return x/(1+x*x);
 }
 float jifen(float a,float b,int n,float(*p)(float x))
 {
 	int i;
 	float h,s=0;
 	h=(b-a)/n;
	s=((*p)(a)+(*p)(b))/2;
	for(i=1;i<n;i++)
	  s+=(*p)(a+i*h);
	return h*s;
 }

#include<stdio.h>
int main(void)
{
float f1(float),f2(float),f3(float);
//这里是函数申明 函数遵循“先申明再使用”的原则。函数原型是对函数的申明,其作用就是把函数名、函数类型以及形参的个数、顺序、类型等通知编译系统。这样当函数被调用时,可对实参形参的类型、个数等匹配情况进行检查。就类似于我告诉别人我这个函数有多少人(多少个参数),都是哪个国家的人(类型),至于人名(变量名)我不用说,留在后面函数定义的时候再交代。所以这里是没错的//
float jifen(float,float,int,float()(float));//同样是函数申明//
//float(
)(float)看到没这里是一个函数指针来作为函数jifen的参数//
float a,b,v;
int n,flag;
printf(“请输入积分上下限\n”);
scanf("%f%f",&a,&b);
printf(“请输入将区间分成多少份\n”);
scanf("%d",&n);
printf(“请按下面选项来选择\n”);
printf(“1.f1(x)=xx-2x+2\n”);
printf(“2.f2(x)=1+x+xx+xxx\n");
printf("3.f3(x)=x/(1+x
x)\n”);
printf(“请输入您的选择(1.2or3)\n”);
scanf("%d",&flag);
if(flag1)
v=jifen(a,b,n,f1);
if(flag
2)
v=jifen(a,b,n,f2);
if(flag==3)
v=jifen(a,b,n,f3);
//函数调用,看到没这里就可以函数直接当另外一个函数的实参了//
printf(“v=%.2f\n”,v);
return 0;
}
float f1(float x)
{
return xx-2x+2;
}
float f2(float x)
{
return 1+x+xx+xxx;
}
float f3(float x)
{
return x/(1+x
x);
}
float jifen(float a,float b,int n,float(*p)(float x))
//看到没这里是定义所以变量名都有了。float(*p)(float x)这就是函数指针的定义。前面是返回值类型后面是函数的参数。就是函数名换成(*p)这个指针加括号。注意括号不能少。//
{
int i;
float h,s=0;
h=(b-a)/n;
s=((p)(a)+(p)(b))/2;
for(i=1;i<n;i++)
s+=(p)(a+ih);//相当与f(1.2or3)(a+i
h)的运算//
return h
s;
}

是不是很简单呀。。。(自动狗头保命嘿嘿)
下面我们讲解返回指针的函数
2. 题目:一个班有若干名学生,每个学生有四门课,交互式输入每个学生的各门课的成绩,找出其中有不及格课程的学生的序号,并输出所有的课程成绩。

#include<stdio.h>
#define N 3
int main(void)
{
 float*search(float(*)[4]),* p,score[N][4];
 int i,j;
 for(i=0;i<N;i++)
 {
 	printf("请输入第%d学生的分数:\n",i+1);
 	 for(j=0;j<4;j++)
 	 scanf("%f",&score[i][j]);
 }	
 printf("不及格的学生的各科成绩\n");
 for(i=0;i<N;i++)
 {
 	p=search(score+i);
 	if(p==*(score+i))
 	{
 		printf("NO.%d 学生分数:",i+1);
		for(j=0;j<4;j++)
			printf("%5.2f ",*(p+j));
		printf("\n"); 
	 }
  } 
  return 0;
} 
float*search(float(*p)[4]) 
{
	int i;
	float*q=*p;
	for(i=0;i<4;i++)
	 if(*(q+i)<60) return *p;
	return *(p+1); 
}

#include<stdio.h>
#define N 3 //常量的定义,注意后面没有分号//
int main(void)
{
floatsearch(float()[4]),* p,score[N][4];
// 返回指针的函数的申明以及定义指针,数组//
//这里说一下返回指针的函数的一般定义形式:
类型标识符 * 函数名(参数列表)
注意这里没有分号****不要和指向函数的指针变量的定义混淆,那个是一定要括号的。//
int i,j;
for(i=0;i<N;i++)
{
printf(“请输入第%d学生的分数:\n”,i+1);
for(j=0;j<4;j++)
scanf("%f",&score[i][j]);
} //简单的输入//
printf(“不及格的学生的各科成绩\n”);
for(i=0;i<N;i++)
{
p=search(score+i);//调用函数返回的是指针是指针/
if(p==* (score+i))//这里咋一看不知道是啥/ 不要慌 /
{
printf(“NO.%d 学生分数:”,i+1);
for(j=0;j<4;j++)
printf("%5.2f “,*(p+j));
printf(”\n");
}
}
return 0;
}
float * search(float(*p)[4])
//float(*p)[4]这里是一个指向二维数组行的表达//
{
int i;
float *q=*p;//重新变量,注意这里是指针定义并赋值//
for(i=0;i<4;i++)
if( * (q+i)<60) return * p;//这里是判断每一行的元素是否有不及格的如果有返回 *p,如果没有则返回下一行
注意这是二维
*p表示的每一行的地址,不是值,是地址,是地址,是地址//
return * (p+1); //这也是地址//
}
好了就到这,中午没睡,看了看C语言,找了点我认为比较可以分享的小栗子,希望能对大家有所帮助吧。记得留言评论哟,期待互动哦。
祝期末都理想!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值