【问题标题】:Understanding calling one function inside another C了解在另一个 C 中调用一个函数
【发布时间】:2018-11-03 14:58:26
【问题描述】:

想请教以下对C语言的误区,我看是有的。

如果代码没有正确缩进,我很抱歉,我尽可能多地尝试,但互联网上没有那么多指南。

程序要求给定一个起始数字 'val' 和一个奇偶或奇偶交替序列(只要违反此规则就会停止)以打印带有 'val' 的更大素数。

我尝试了两个函数和主要函数:一个控制两个给定数字之间的 GCD,另一个跟踪最大的一个,但我想我在代码或 C 函数的概念中遗漏了一些东西,

因为编译时它返回我没有输入的 0 或大数字。

一个例子来理解我应该做什么:

如果我的序列是 10、7、8、23,而我的 val 是 3,我必须打印 23,因为它是 3 的最大整数素数。

代码如下:

#include <stdio.h>
int mcd(int a, int b)
{   // Gcd function
    if (a == 0)
        return b;
    else
        return mcd(b % a, b);
}

int valuta(int val, int h)  // Valuing Max function
{
    int temp = 0;
    if (mcd(val, h) == 1 && h > temp)
        temp = h;
    return temp;
}

int main()
{
    int val, d, x, y, z, t, contatore = 1;
    scanf("%d", &val);
    scanf("%d%d", &x, &y);
    if (x > y && mcd(val, x) == 1)
    {   // Two options
        t = x;
    }
    else if (y > x && mcd(val, y) == 1)
    {
        t = y;
    }
    if ((x % 2 == 0 && y % 2 == 0) || (x % 2 == 1 && y % 2 == 1))
    {   // Bad case
        if (x > y && mcd(val, x) == 1)
        {
            t = x;
            contatore = 0;
        }
        else if (y > x && mcd(val, y) == 1)
        {
            t = y;
            contatore = 0;
        }
    }
    else
    {
        while (contatore == 1)
        {
            scanf("%d", &z);
            t = valuta(val, z);
            if (x % 2 == 0 && z % 2 == 0)
            {   // Even- Odd - Even
                scanf("%d", &d);
                t = valuta(val, d);
                if (d % 2 == 0)
                {
                    contatore = 0;
                }
                else
                {
                    contatore = 0;
                }
            }
            if (x % 2 == 1 && z % 2 == 1)
            {   //Odd- Even- Odd
                scanf("%d", &d);
                t = valuta(val, d);
                if (d % 2 == 1)
                {
                    contatore = 0;
                }
                else
                {
                    contatore = 0;
                }
            }
        }
    }
    printf("%d\n", t);
    return 0;
}

PS。有什么方法可以减少代码行数或减少编码工作量?我的意思是,一个简单的解决方案会很有帮助。

【问题讨论】:

  • 您的函数valuta 有缺陷,因为每次调用它时,变量temp始终为零。
  • 在一个不相关的注释上,你的缩进不是很好,而且你的大括号定位非常不寻常,不能跟随缩进(结束 } 跟随缩进通常会使更容易阅读和查看块何时结束)。
  • 这里有问题吗!?我建议将问题简化为 1)您打算发生的事情,2)实际发生的事情。相反,您做出了一些疯狂的假设,即问题(无论是什么)与对函数调用的一些误解有关。一般来说,最好不要试图提出问题所在。这里对隐含问题的唯一合理答案是您的函数调用和定义是完全有效的,并且您对此没有任何问题。但这并不能真正解决您的问题吗?
  • 您的代码接受用户输入 - 如果您包含一些示例输入、预期结果和实际结果,将会有所帮助。输入没有提示,不清楚什么时候输入什么值。您对这段代码用途的描述完全不清楚。
  • 例如 "greatest integer prime with 3" 是什么意思?

标签: c function recursion primes stdio


【解决方案1】:

您的 valuta() 函数存在缺陷,它需要返回迄今为止的最大限定值,但不知道先前的最大值 - temp 始终为零。以下将先前的最大值作为参数:

int valuta(int val, int h, int previous )
{
    return ( mcd(val, h) == 1 && h > previous ) ? h : previous ;
}

并从main()调用,因此:

t = valuta( val, x, t ) ;

测试mcd(val, h) == 1 是有缺陷的,因为mcd() 只返回参数b 的值,它在递归中没有被修改,所以永远不会返回1,除非参数b 是1。因为我不知道mcd() 打算做什么,我不能告诉你如何解决它。它似乎是欧几里得最大公约数算法的错误实现,正确实现的应该是:

int mcd(int a, int b)
{
    if(b == 0)
        return a;
    else
        return mcd(b, a % b);
}

但我看不出这与:

"[...] 他最大的整数素数与 3 [...]

奇数/偶数偶数/奇数序列处理可以大大简化到它比您的方法更短和更简单的程度(根据要求) - 并且它可以工作!

以下是一个更清晰的起点,但可能不是解决方案,因为不清楚它应该做什么。

#include <stdio.h>
#include <stdbool.h>

int mcd(int a, int b)
{
    if(b == 0)
        return a;
    else
        return mcd(b, a % b);
}

int valuta(int val, int h, int previous )
{
    return ( mcd(val, h) && h > previous ) ? h : previous ;
}

int main()
{
    int val, x, t ;
    printf( "Enter value:") ;
    scanf("%d", &val);

    typedef enum 
    {
        EVEN = 0,
        ODD = 1,
        UNDEFINED
    } eOddEven ;

    eOddEven expect = UNDEFINED ;
    bool sequence_valid = true ;

    printf( "Enter sequence in odd/even or even/odd order (break sequence to exit):\n") ;
    while( sequence_valid )
    {
        scanf("%d", &x);
        if( expect == UNDEFINED )
        {
            // Sequence order determined by first value
            expect = (x & 1) == 0 ? EVEN : ODD ;
        }
        else
        {
            // Switch expected odd/even
            expect = (expect == ODD) ? EVEN : ODD ;

            // Is new value in the expected sequence?
            sequence_valid = (expect == ((x & 1) == 0 ? EVEN : ODD)) ;
        }

        //  If the sequence is valid...
        if( sequence_valid )
        {
           // Test if input is largest qualifying value
           t = valuta( val, x, t ) ;
        }
    }

    // Result
    printf("Result: %d\n", t);

    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 2019-09-17
    • 2013-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多