标题:关于数组参数传递的过程中出现了问题,求大神解答
只看楼主
魂之子
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2019-12-25
结帖率:90.91%
已结贴  问题点数:18 回复次数:8 
关于数组参数传递的过程中出现了问题,求大神解答
问题描述;
二分法求函数根的原理为:如果连续函数f(x)在区间[a,b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f(r)=0。
二分法的步骤为:
检查区间长度,如果小于给定阈值,则停止,输出区间中点(a+b)/2;否则
如果f(a)f(b)<0,则计算中点的值f((a+b)/2);
如果f((a+b)/2)正好为0,则(a+b)/2就是要求的根;否则
如果f((a+b)/2)与f(a)同号,则说明根在区间[(a+b)/2,b],令a=(a+b)/2,重复循环;
如果f((a+b)/2)与f(b)同号,则说明根在区间[a,(a+b)/2],令b=(a+b)/2,重复循环。
本题目要求编写程序,计算给定3阶多项式f(x)的根
#include<stdio.h>
#define N 0.01
#define A 4

double F(double x,double a[]);
int main(){
   
    double a0,a1,a2,a3;
    double b0,b1;
    double roof;
    double x;
    double mediate;
   
    scanf("%fl %fl %fl %fl",&a0,&a1,&a2,&a3);
    double a[A]{a0,a1,a2,a3};
    scanf("%lf %lf",&b0,&b1);
    mediate = b0+b1;
   
    if(b0-b1<=N){
        printf("%f",(b1-b0)/2);
    }else{
        do{
            if(F(b0,a[])*F(mediate,a[])>0){
                b0 = mediate;
            } else{
                b1 = mediate;
            }
            mediate = b0+b1;
            roof = F(mediate,a[]);
            
        }while(roof-(int)roof>=N);   
   
    printf("%f",roof) ;
    }
    return 0;
   
}

    double F(double x,double a[]){
        double F;
        F = a[0]*x*x*x+a[1]*x*x+[a2]*x+a[3];
        return F;
    }   
搜索更多相关主题的帖子: 区间 参数 传递 double 数组 
2020-01-12 11:19
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
得分:0 
你的题目我不能看懂,不过代码好理解,不过这肯定会报错啊比如f函数他是一个函数,那为什么f函数里还有个f变量

[此贴子已经被作者于2020-1-12 11:35编辑过]


把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-01-12 11:33
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
得分:0 
下面有错上面更错啊,你f函数里的a[]没被mian函数定义你main函数用a[]也是石沉大海

把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-01-12 11:41
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
得分:0 
不过你这题完全可以用下图中的代码实现,for循环也可以

把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-01-12 11:47
魂之子
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2019-12-25
得分:0 
回复 3楼 叶纤
我没太明白你说的定义是什么意思,主函数中double a【N】不是定义吗?
2020-01-12 11:47
吕孟伟
Rank: 8Rank: 8
等 级:贵宾
威 望:27
帖 子:200
专家分:870
注 册:2018-10-4
得分:10 
先改语法错误:
程序代码:
#include<stdio.h>
#define N 0.01
#define A 4

double F(double x,double a[]);
int main() {

    double a0,a1,a2,a3;
    double b0,b1;
    double roof;
    double x;
    double mediate;

    scanf("%lf %lf %lf %lf",&a0,&a1,&a2,&a3);//第一处
    double a[A] = {a0,a1,a2,a3};//第二处  
    scanf("%lf %lf",&b0,&b1);
    mediate = b0+b1;

    if(b0-b1<=N) {
        printf("%lf",(b1-b0)/2);//第三处
    } else {
        do {
            if(F(b0,a)*F(mediate,a)>0) {//第四处
                b0 = mediate;
            } else {
                b1 = mediate;
            }
            mediate = b0+b1;
            roof = F(mediate,a);//第五处

        } while(roof-(int)roof>=N);

        printf("%lf",roof) ;//第六处
    }
    return 0;

}

double F(double x,double a[]) {
    double Fun;//第七处,我想这里应该不是递归吧?
    Fun = a[0]*x*x*x+a[1]*x*x+a[2]*x+a[3];//第八处
    return Fun;
}

借用一下侯捷的话:勿在浮沙筑高台。
2020-01-12 12:07
魂之子
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2019-12-25
得分:0 
回复 6楼 吕孟伟
非常感谢大哥帮我通过编译,感激不尽。现在编译过了,但是代码还是有问题,do while中的判断有问题直接就跳出来了,调试半天也没找出来错误。
输入:
3 -1 -3 1
-0.5 0.5
应该输出:

0.33
2020-01-12 13:17
魂之子
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2019-12-25
得分:0 
回复 6楼 吕孟伟
#include <stdio.h>
#define N 0.000001
#define A 4
#include <math.h>

double F(double x,double a[]);
int main(){
   
    double a0,a1,a2,a3;
    double b0,b1;
    double root;
    double x;
    double mediate;
   
    scanf("%lf %lf %lf %lf",&a0,&a1,&a2,&a3);
    double a[A] = {a0,a1,a2,a3};
    scanf("%lf %lf",&b0,&b1);
    mediate = (b0+b1)/2;
   
    if(b1-b0<=N){
        printf("%f",(b1-b0)/2);
    }else{
        do{
            if(F(b0,a)*F(mediate,a)>0){
                b0 = mediate;
            } else{
                b1 = mediate;
            }
            mediate = (b0+b1)/2;
            root = mediate;
            
        }while (fabs(F(b1,a)-F(b0,a)>=N));   
   
    printf("%.2f",root) ;
    }
    return 0;
   
}

    double F(double x,double a[]){
        double f;
        f = a[0]*x*x*x+a[1]*x*x+a[2]*x+a[3];
        return f;
    }   
2020-01-12 13:17
jklqwe111
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:35
帖 子:335
专家分:1125
注 册:2014-4-13
得分:8 
程序代码:
#include<stdio.h>
#define E 0.01
#define A 4

double fun(double x, double a[]);
int main() 
{
    double b0, b1,tb0,tb1;
    double a[A];
    double fun(double x, double a[]);
    double getValue(double a[], double b0, double b1);//递归函数
    
        scanf("%lf%lf%lf%lf", &a[0], &a[1], &a[2], &a[3]);

        scanf("%lf%lf", &b0, &b1);
        tb0 = fun(b0, a);
        tb1 = fun(b1, a);
        if(tb0*tb1>0)printf("No\n");
        else if (tb0==0)printf("value is :  %lf\n", b0);
        else if (tb1 == 0)printf("value is :  %lf\n", b1);
        else printf("value is :  %lf\n", getValue(a,b0,b1));
    
    return 0;
}

double fun(double x, double a[])
{
    
    return a[0] * x*x*x + a[1] * x*x + a[2] * x + a[3];
}

double getValue(double a[], double b0, double b1)
{
    double temp,tb;
    double fun(double x, double a[]);
    tb = (b0 + b1) / 2;
    temp = fun(tb, a);
    if (((b0-b1<0?b1-b0:b0-b1) < E) || (temp == 0))return tb;//递归结束

    else
    {

        if (temp*fun(b0, a) > 0)b0 = tb;//中点与b0符号相同,替换b0
        else b1 = tb;//中点与b0符号不同,替换b1

        return getValue(a, b0, b1);//递归调用
    }
}
2020-01-12 20:51



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-498905-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020061 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved