注册 登录
编程论坛 C语言论坛

新手,一元二次方程 functionz中,变量undeclear,且输出结果错误

xjxjxj 发布于 2022-07-06 16:21, 1228 次点击
double getnum(int i, int j, int k)
{

    delta = j*j - 4*i*k;

    if(delta > 0)

    {
        x1 = (-b + sqrt(delta))/(2 * a);
        x2 = (-b - sqrt(delta))/(2 * a);
        printf("该一元二次方程有两个解,x1 = %f,x2 = %f\n",x1, x2);
    }
    else  if(delta == 0)
    {
        x1 = (-b)/(2*a);
        x2 = x1;
        printf("该一元二次方程有一个解,x1=x2=%f\n",x1 ,x2);
    }
    else
    {
        printf("该一元二次方程无解\n");
    }

}


int main(void)
{
    double delta;
    double x1;
    double x2;
    int a,b,c;


    printf("请输入a的值: \n");
    scanf("%d",&a);
    printf("请输入b的值: \n");
    scanf("%d",&b);
    printf("请输入c的值: \n");
    scanf("%d",&c);

    getnum(a,b,c);

    return 0;
}

/*在code::blocks 16.01 中
C:\Users\xujiang\Desktop\ccccccc\一元二次方程\main.c|8|error: 'delta' undeclared (first use in this function)|
C:\Users\xujiang\Desktop\ccccccc\一元二次方程\main.c|13|error: 'x1' undeclared (first use in this function)|
C:\Users\xujiang\Desktop\ccccccc\一元二次方程\main.c|13|error: 'b' undeclared (first use in this function)|
C:\Users\xujiang\Desktop\ccccccc\一元二次方程\main.c|13|error: 'a' undeclared (first use in this function)|
C:\Users\xujiang\Desktop\ccccccc\一元二次方程\main.c|14|error: 'x2' undeclared (first use in this function)|

C:\Users\xujiang\Desktop\ccccccc\一元二次方程\main.c|27|warning: 'return' with no value, in function returning non-void [-Wreturn-type]|
C:\Users\xujiang\Desktop\ccccccc\一元二次方程\main.c|35|warning: unused variable 'x2' [-Wunused-variable]|
C:\Users\xujiang\Desktop\ccccccc\一元二次方程\main.c|34|warning: unused variable 'x1' [-Wunused-variable]|
C:\Users\xujiang\Desktop\ccccccc\一元二次方程\main.c|33|warning: unused variable 'delta' [-Wunused-variable]|
C:\Users\xujiang\Desktop\ccccccc\一元二次方程\main.c|28|warning: control reaches end of non-void function [-Wreturn-type]|
*/
3 回复
#2
不会游泳的虾2022-07-06 20:21
修改如下,供参考:
程序代码:
#include <stdio.h>
#include <math.h>
void  getnum(double i, double j, double k)
//double getnum(int i, int j, int k)
{
    double x1,x2;
    double delta = j*j - 4*i*k;

    if(delta > 0)

    {
        x1 = (-j + sqrt(delta))/(2 * i);
        // x1 = (-b + sqrt(delta))/(2 * a);
        x2 = (-j - sqrt(delta))/(2 * i);
        //x2 = (-b - sqrt(delta))/(2 * a);
        printf("该一元二次方程有两个解,x1 = %f,x2 = %f\n",x1, x2);
    }
    else  if(delta == 0)
    {
        x1 = (-j)/(2*i);
        //x1 = (-b)/(2*a);
        x2 = x1;
        printf("该一元二次方程有一个解,x1=x2=%f\n",x1 ,x2);
    }
    else
    {
        printf("该一元二次方程无解\n");
    }

}


int main(void)
{
    //double delta;
   
//double x1;
   
//double x2;
   
//int a,b,c;
    double a,b,c;

    printf("请输入a的值: \n");
    scanf("%lf",&a);
    //scanf("%d",&a);
    printf("请输入b的值: \n");
    scanf("%lf",&b);
    //scanf("%d",&b);
    printf("请输入c的值: \n");
    scanf("%lf",&c);
    //scanf("%d",&c);

    getnum(a,b,c);

    return 0;
}
#3
xjxjxj2022-07-06 20:44
回复 2楼 不会游泳的虾
谢谢您
#4
rjsp2022-07-07 11:06
题目本身就不好,形如 ax² + bx + c = 0,要计算 b*b 与 4*a*c 谁大谁小?
第一个难点,比如用户输入1.3,但double未必能精确保存1.3这个值呀;
第二个难点,即使a、b、c都精确保存着用户输入值,但计算 b*b - 4*a*c 时仍然存在着误差。

可能导致的结果就是,
1. 用户输入的值,应当是delta==0,但输出却是“有两个解”或“无解”
2. 用户输入的值,应当是delta>0,但输出却是“有一个解”或“无解”
3. 用户输入的值,应当是delta<0,但输出却是“有一个解”或“有两个解”
4. 输出“有两个解”,但这两个解的值一样。(即包括解值不一样但输出一样,也包括解值一样且输出一样)
1