题目:
编写一个函数,输入n为偶数时,调用函数求1/2+1/4+…+1/n,当输入n为奇数时,调用函数1/1+1/3+…+1/n(利用指针函数)
前言
今天在准备复试复习c语言过程中遇到这题,不难,主要是用来复习指针函数,但花了我很多时间,题目指明用的是指针函数,结果几乎所有题解都用的函数指针(无语,题目错了?)
指针函数和函数指针差别
正文
指针函数写法
我觉得此方法写这题挺麻烦的,不过既然题目需要~
double* func(int n, double* s, int t){
while(t <= n){
*s = *s + 1.0/t;
t += 2;
}
return s;
}
int main(){
int n;
scanf("%d", &n);
double a = 0.0;
double* s = &a;
double* sum = NULL;
if(n % 2 == 0)
sum = func(n, s, 2);//偶
else
sum = func(n, s, 1);//奇
printf("%lf\n", *sum);
return 0;
}
结果测试
2
0.500000
3
1.333333
收获
刚开始我写了如下代码
double* s = NULL;
*s = 0.0;
但是程序无结果,调试就报段错误,最后查阅发现原因。在声明指针后,希望通过*给它背后的存储区赋值,但指针没有指向实际的内存区域,所以报错。
修改后代码如下:
double a = 0.0;
double* s = &a;
//先分配一块内存空间给a,然后让指针指向此内存空间
函数指针写法
毕竟网上都是这么写的,练练这种写法
函数指针详细说明-C语言中文网
double func(int n, int t){
double s = 0;
while(t <= n){
s += 1.0/t;
t += 2;
}
return s;
}
int main(){
int n;
scanf("%d", &n);
double (*p)(int, int);//函数指针声明
p = func;//func是函数的名字也是首地址,给p
double sum;
if(n % 2 == 0)
sum = (*p)(n, 2);//这个*p其实和原来函数名字作用一样
else
sum = (*p)(n, 1);
printf("%lf", sum);
return 0;
}