Понимание вызова одной функции внутри другой C - PullRequest
0 голосов
/ 03 ноября 2018

Я хотел бы спросить о следующих недоразумениях языка Си, которые, как я вижу, возникают у меня.

Извините, если код не имеет правильного отступа, я старался изо всех сил, но в Интернете не так много руководств.

Программа запросила заданное начальное число '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. Есть ли способ уменьшить количество строк кода или уменьшить усилия при кодировании? Я имею в виду, простое решение будет полезно.

1 Ответ

0 голосов
/ 03 ноября 2018

Ваша функция 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. Так как I Понятия не имею, для чего предназначен 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...