在C中调用函数内部的函数

fykwrbwg  于 2023-04-11  发布在  其他
关注(0)|答案(3)|浏览(145)

我一直在尝试编写一个求解二次方程的程序。一切似乎都很好,但我试图再次运行的函数在我调用它们之后没有启动。我不明白我做错了什么。

#include <stdio.h>
#include <math.h>

int main(){
    float a, b, c, delta, x1, x2;
    char YN;
    void enter(){
        printf("Insert the value of 'a':\n");
        scanf("%f", &a);
        printf("Insert the value of 'b':\n");
        scanf("%f", &b);
        printf("Insert the value of 'c':\n");
        scanf("%f", &c);
        delta = (b*b) - (4 * a * c);
        x1 = (-b-sqrt(delta))/(2*a);
        x2 = (-b+sqrt(delta))/(2*a);
    }

    void solve(){
        if (delta > 0){
            printf("The first root of the equation is %f.", x1);
            printf("The second root of the equation is %f.", x2);
        }
        else if (x1 == x2){
            printf("The only root of the equation is %f.", x1);
        }
        else{
            printf("The equation has no real roots.");
        }
    }

    void input(){
        scanf("%c", &YN);
    }

    void check(){
        if (YN == 'Y'){
            solve();
        }
        else if (YN == 'N'){
            enter();
        }
        else {
            input();
        }
    }

    enter();
    printf("Your equation must be: %f x^2 + %f x + %f, is it correct? Type Y for yes, N for no.\n", a, b, c);
    input();
    check();
    return 0;
}

因为我认为变量使函数无法工作,所以我尝试在solve函数之外添加变量,但它并不真正起作用。

hs1ihplo

hs1ihplo1#

在标准C语言中,你不能在其他函数中定义函数。相反,你必须在main()之外单独声明/定义函数。
此外,你可以有全局变量,可以被你所有的函数“全局”访问。它们的作用域不是特定的函数。要做到这一点,在你的主函数之外声明它们。
这里有几个问题:
1.不建议所有变量都是全局变量。学习如何使用函数参数和通过引用传递,而不是引用全局变量。你也可以通过让函数返回值来清理这一点。
1.在我看来,你在这里拥有的函数不需要在它们自己的函数中,它们可以全部包含在你的主函数中。
下面是一个格式正确的代码示例:

#include <stdio.h>
#include <math.h>

// Function Declarations here
void enter();
void solve();
void input();
void check();

// Global Variables
float a, b, c, delta, x1, x2;
char YN;

int main(){
    enter();
    solve();
    input();
    check();

    enter();
    printf("Your equation must be: %f x^2 + %f x + %f, is it correct? Type Y 
       for yes, N for no.\n", a, b, c);
    input();
    check();
    return 0;
}

// Function Definitions here

void enter(){
        printf("Insert the value of 'a':\n");
        scanf("%f", &a);
        printf("Insert the value of 'b':\n");
        scanf("%f", &b);
        printf("Insert the value of 'c':\n");
        scanf("%f", &c);
        delta = (b*b) - (4 * a * c);
        x1 = (-b-sqrt(delta))/(2*a);
        x2 = (-b+sqrt(delta))/(2*a);
}

void solve(){
    if (delta > 0){
       printf("The first root of the equation is %f.", x1);
       printf("The second root of the equation is %f.", x2);
    }
    else if (x1 == x2){
       printf("The only root of the equation is %f.", x1);
    }
    else{
       printf("The equation has no real roots.");
    }
}

void input(){
    scanf("%c", &YN);
}

void check(){
    if (YN == 'Y'){
       solve();
    }
    else if (YN == 'N'){
       enter();
    }
    else {
       input();
    }
}
r7knjye2

r7knjye22#

你在这里有很多问题。
1.嵌套函数。
1.不使用函数的参数和返回值
1.错误的函数逻辑(在你的例子中,只有输入函数才有意义)。一般来说,逻辑很差
1.在取平方根之前,您不检查delta

double getFloatValue(const char *message)
{
    double f;
    do 
    {
        printf("\n%s", message);
    }while(scanf("%lf", &f) != 1);
    return f;
}

char getChar(const char *message)
{
    int c;

    printf("%s", message);
    do
    {
        c = fgetc(stdin);
        if(c == EOF) 
        {
            c = 'N';
            break;
        }
        c = toupper((unsigned char)c);

    }
    while(!isalpha((unsigned char )c) && c != 'Y' && c != 'N');
    return c;
}

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

    do 
    {
        a = getFloatValue("Enter a:");
        b = getFloatValue("Enter b:");
        c = getFloatValue("Enter c:");

        printf("\nEquation: %f * X^2 %+f * X %+f\n", a, b, c);

        delta = (b*b) - (4 * a * c);
        if(delta >= 0)
        {
            x1 = (-b-sqrt(delta))/(2*a);
            x2 = (-b+sqrt(delta))/(2*a);
            if(x1 == x2) 
            {
                printf("The only root of the equation is %f.\n", x1);
            }
            else
            {
                printf("The first root of the equation is %f.\n", x1);
                printf("The second root of the equation is %f.\n", x2);
            }
        }
        else
        {
            printf("No roots\n");
        }
    }while(getChar("Another equation? (Y/N)") == 'Y');

    return 0;
}

https://godbolt.org/z/jb74M4qWq

q43xntqr

q43xntqr3#

你有 * 嵌套 * 函数。
虽然gcc [在某种程度上]允许这样做,但它不是标准的。生成的代码很难看/容易出错。
更好的方法是将vars设置为全局作用域。或者,重新构造程序,这样就不需要这样做(例如,将更多的项作为参数传递)。
你试图做一个“lambda”函数或“闭包”。
一种方法是让一个struct包含所有在mainfunction 作用域的变量,并传递一个指向该变量的指针。下面是一个 backbone 示例:

struct vars {
    float a, b, c, delta, x1, x2;
};

void
enter(struct vars *v)
{
    printf("Insert the value of 'a':\n");
    scanf("%f", &v->a);

    printf("Insert the value of 'b':\n");
    scanf("%f", &v->b);

    printf("Insert the value of 'c':\n");
    scanf("%f", &v->c);

    v->delta = (v->b * v->b) - (4 * v->a * v->c);
    v->x1 = (-v->b - sqrt(v->delta)) / (2 * v->a);
    v->x2 = (-v->b + sqrt(v->delta)) / (2 * v->a);
}

int
main(void)
{
    struct vars vars;

    enter(&vars);
    // ...

    return 0;
}

请注意:“天下没有免费的午餐”。在支持lambda函数的语言中(例如C++等),隐藏/生成的代码与上面类似。

相关问题