今天分享两个问题,设计函数指针作为函数参数和返回指针的函数的知识点。不懂这是不是属于原创,反正如果有触犯到谁的利益啊,可以告知我,我删贴。那啥不是有意的啊,不要讹我,咱穷啊。可以多多评论,很想与大家互动哈。
废话不多说,上题目。
- 题目 利用梯形法计算定积分,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+xx)\n”);
printf(“请输入您的选择(1.2or3)\n”);
scanf("%d",&flag);
if(flag1)
v=jifen(a,b,n,f1);
if(flag2)
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+xx);
}
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+ih)的运算//
return hs;
}
是不是很简单呀。。。(自动狗头保命嘿嘿)
下面我们讲解返回指针的函数
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语言,找了点我认为比较可以分享的小栗子,希望能对大家有所帮助吧。记得留言评论哟,期待互动哦。
祝期末都理想!!!!!