首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在卢恩的阿尔格号上写了个剧本。无法理解如何为修改后的脚本创建和调用函数

在卢恩的阿尔格号上写了个剧本。无法理解如何为修改后的脚本创建和调用函数
EN

Stack Overflow用户
提问于 2020-04-10 17:34:45
回答 1查看 80关注 0票数 3

我对编程很陌生。我目前正在进行非常严格的在线讲座,并使用Luhn的算法完成了一项任务。这只是一个脚本,直接贯穿,但对于我的未来,我想学习更有效的代码,因为项目变得更大。

这就是我的问题所在。我似乎无法理解如何正确定义或调用函数,也无法将我的脚本修改为更“高效”的内容。

(根据机器人的说法,一切都已经提交,我的脚本已经完美地完成了任务,所以我不想半途而废。)

这是完成的脚本,只有主要的功能,直接运行,我花了大约12-15个小时,使它工作,从一开始就没有错误。所有东西都是用C写的

代码语言:javascript
复制
#include <stdio.h>
#include <cs50.h>
#include <math.h>

int main(void)
{
    // this grabs the number and verifies the correct amount of digits
    int count;
    long number = 0;
    do
    {
        number = get_long("Number: ");
        count = (number == 0) ? 1 : (log10(number) + 1);
        if (count < 13 || count == 14 || count > 16)
        {
            printf("INVALID\n"); // This is to satisfy the uni. bot command check. Need a EOF for numbers with the wrong amount of digits.
            return (0);
        }
    }
    while (count < 13 || count == 14 || count > 16);
    //printf("Digits: %i\n", count);       // test print for debugging

    //This finds the first two digits of input number

    long int two = number;
    while (two >= 100)
    {
        two = two / 10;
    }
    //printf("First two numbers: %li\n", two);      // test print for debugging

    // verifies card using mod10 (Luhn's)
    long sum = 0;
    long bigdigit = 0;
    //printf("\nLUHN Number: %li\n\n", number);     // test print for debugging
    if (count == 13 || count == 15)
    {
        count += 1;
    }
    for (int i = count; i > 0; i--)
    {
        if (i % 2 == 0)
        {
            sum += (number % 10);
        }
        else
        {
            bigdigit = (2 * (number % 10));
            sum += (bigdigit / 10 + bigdigit % 10);
        }
        number = (number / 10);
        //printf("\nI : %i\n", i);      // test print for debugging
        //printf("Sum: %li\n", sum);        // test print for debugging
        //printf("Number: %li\n", number);      // test print for debugging
    }
    if (sum % 10 == 0)
    {
        printf("VALID\n");
    }
    else
    {
        printf("INVALID\n");
        return (0);
    }

    // checks what type of card

    if (two == 34 || two == 37)
    {
        printf("AMEX\n");
        return (0);
    }
    else if (two >= 51 && two <= 55)
    {
        printf("MASTERCARD\n");
        return (0);
    }
    else if (two >= 40 && two <= 49)
    {
        printf("VISA\n");
        return (0);
    }
    else
    {
        printf("INVALID\n");
        return (0);
    }
}

我试着把它分成三种功能,主叫。

长龙input_number();

  • bool luhn_check();

  • void company_check();

我被第二个函数困住了,不确定第三个函数是否应该是空的。

“修订”脚本v2

代码语言:javascript
复制
#include <stdio.h>
#include <cs50.h>
#include <math.h>

long input_number(long CCN);
int counter(long CCN, int count);
bool luhn_check(long CCN, int count);
long firsttwo(long CCN, long two);
void card_type(long two);


int main()
{
    long CCN = 0;
    int count = 0;
    long two = 0;
    CCN = input_number(CCN);
    count = counter(CCN, count);

    //printf("CCN: %li\n", CCN); //debugging purposes
    //printf("Digits: %i\n", count); //debugging purposes
    luhn_check(CCN, count);
    two = firsttwo(CCN, two);
    //printf("First Two: %li\n", two); //debugging purposes
    card_type(two);
}


    // this grabs the number and verifies the correct amount of digits
long input_number(long CCN)
{
    int count = 0;
    do
    {
        CCN = get_long("Number: ");
        count = (CCN == 0) ? 1 : (log10(CCN) + 1);
        if (count < 13 || count == 14 || count > 16)
        {
            //printf("INVALID\n"); // This is to satisfy the uni. bot command check. Need a EOF
            //return (0);
        }
    }
    while (count < 13 || count == 14 || count > 16);   
    return (CCN);
}

int counter(long CCN, int count)
{
 do
    {
        count = (CCN == 0) ? 1 : (log10(CCN) + 1);
    }
    while (count < 13 || count == 14 || count > 16);   
    return (count);   
}

    // verifies card using mod10 (Luhn's)
bool luhn_check(long CCN, int count)
{
    long sum = 0;
    long bigdigit = 0;
    //printf("\nLUHN Number: %ld\n\n", CCN);     // test print for debugging
    if (count == 13 || count == 15)
    {
        count += 1;
    }
    for (int i = count; i > 0; i--)
    {
        if (i % 2 == 0)
        {
            sum += (CCN % 10);
        }
        else
        {
            bigdigit = (2 * (CCN % 10));
            sum += (bigdigit / 10 + bigdigit % 10);
        }
        CCN = (CCN / 10);
        //printf("\nI : %i\n", i);      // test print for debugging
        //printf("Sum: %li\n", sum);        // test print for debugging
        //printf("Number: %li\n", CCN);      // test print for debugging
    }
    if (sum % 10 == 0)
    {
        printf("VALID\n");
        return (true);
    }
    else
    {
        printf("INVALID\n");
        return (false);
    }
}

            // grabs the first two numbers
long firsttwo(long CCN, long two)
{
    two = CCN;
    //printf("TWO CCN: %li\n", two); // debugging purposes
    while (two >= 100)
    {
        two = two / 10;
    }
    return (two);
}

            // finds card type and ends
void card_type(long two)
{
    if (two == 34 || two == 37)
    {
        printf("AMEX\n");
        //return (0);
    }
    else if (two >= 51 && two <= 55)
    {
        printf("MASTERCARD\n");
        //return (0);
    }
    else if (two >= 40 && two <= 49)
    {
        printf("VISA\n");
        //return (0);
    }
    else
    {
        printf("INVALID\n");
        //return (0);
    }
}

我已经完成了脚本的第二个版本和您的建议,除了输入的str之外,我将尝试在下一个版本中处理该方法,因为我还没有处理该类型。

除了使用字符串而不是b运行程序之外,还有什么事情我可以做得更有效吗?

EN

回答 1

Stack Overflow用户

发布于 2020-04-10 18:14:26

让我从关于您的函数input_number的几个注释开始

代码语言:javascript
复制
long input_number()
{
    // this grabs the number and verifies the correct amount of digits
    int count;
    [ .... ]

    while (count < 13 || count == 14 || count > 16);
    // Once this while loop starts, it will never terminate!
    // if count starts at 10 (which is less than 13), the body says "do nothing".
    // so count will continue to be unchanged, and the while-loop will continue to run.

    return (0);  // Code after a return statement will never be reached
                 // So your printf-statement below will NEVER happen.
                 // It also seems unlikely you want to return Zero.
                 // You probably want to return count, or some other value.

    printf("Digits: %i\n", count);       // test print for debugging
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61145595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档