繁体   English   中英

如何修复这些错误? CS50 Pset1 学分

[英]How do I fix these errors? CS50 Pset1 Credit

有人可以帮我吗? 这是我的代码和我得到的检查错误。 不太明白问题出在哪里以及为什么会出现问题。

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

int main (void)

{
    
    long long card;
    do
    {
    card = get_long_long("Card Number: ");
    }
    while (card < 0);

    long long int card1, card2, card3, card4, card5, card6, card7, card8;
    
    card1 = ((card%100)/10)*2;
    card2 = ((card%10000)/1000)*2;
    card3 = ((card%1000000)/100000)*2;
    card4 = ((card%100000000)/10000000)*2;
    card5 = ((card%10000000000)/1000000000)*2;
    card6 = ((card%1000000000000)/100000000000)*2;
    card7 = ((card%100000000000000)/10000000000000)*2;
    card8 = ((card%10000000000000000)/1000000000000000)*2;
    
    card1 = (card1%100)/10 + (card1%10);
    card2 = (card2%100)/10 + (card2%10);
    card3 = (card3%100)/10 + (card3%10);
    card4 = (card4%100)/10 + (card4%10);
    card5 = (card5%100)/10 + (card5%10);
    card6 = (card6%100)/10 + (card6%10);
    card7 = (card7%100)/10 + (card7%10);
    card8 = (card8%100)/10 + (card8%10);
    
    long long int card9, card10, card11, card12, card13, card14, card15, card16;
    
    card9 = (card%10);
    card10 = (card%1000)/100;
    card11 = (card%100000)/10000;
    card12 = (card%10000000)/1000000;
    card13 = (card%1000000000)/100000000;
    card14 = (card%100000000000)/10000000000;
    card15 = (card%10000000000000)/1000000000000;
    card16 = (card%1000000000000000)/100000000000000;
    
    long long int sum1, sum2, sum3;
    
    sum1 = card1 + card2 + card3 + card4 + card5 + card6 + card7 + card8;
    sum2 = card9 + card10 + card11 + card12 + card13 + card14 + card15 + card16;
    sum3 = sum1 + sum2;
    
    long long length = 0;
    long long visa = card;
    long long amex = card;
    long long master = card;
    
    if (sum3 % 10 != 0)
    
    {
        printf("%s\n", "INVALID CARD");
        return 0;
    }
   
    while (card>0)
    {
        card = card/10;
        length++;
    }
    
    //if VISA
    
    while (visa >= 10)
    {
        visa /= 10;
    }
    if (visa == 4 && (length == 13 || length == 16))
    
    {
        printf("%s\n","VISA");
        return 0;
    }
    
    //if AMEX
    
    while (amex >= 100000000000000)
    {
        amex /= 100000000000000;
    }
    if ((amex == 34 || amex == 37) && (length == 15))
    
    {
        printf("%s\n","AMERICAN EXPRESS");
        return 0; 
    }
    
    //if MASTER
    
    while (master >= 100000000000000)
    {
        master /= 100000000000000;
    }
        if ((master == 51 || master == 52 || master == 53 || master == 54 || master == 55) && (length == 16))
    
    {
        printf("%s\n","MASTERCARD");
        return 0; 
    }
     
    else
    {
        printf("INVALID CARD\n");
        return 0;
    }
    
}
:) credit.c exists

:) credit.c compiles

:( identifies 378282246310005 as AMEX
    expected "AMEX\n", not "INVALID CARD\n..."

:( identifies 371449635398431 as AMEX
    expected "AMEX\n", not "INVALID CARD\n..."

:) identifies 5555555555554444 as MASTERCARD

:) identifies 5105105105105100 as MASTERCARD

:) identifies 4111111111111111 as VISA

:) identifies 4012888888881881 as VISA

:) identifies 4222222222222 as VISA

:( identifies 1234567890 as INVALID
    expected "INVALID\n", not "INVALID CARD\n..."

:( identifies 369421438430814 as INVALID
    expected "INVALID\n", not "INVALID CARD\n..."

:( identifies 4062901840 as INVALID
    expected "INVALID\n", not "INVALID CARD\n..."

:( identifies 5673598276138003 as INVALID
    expected "INVALID\n", not "INVALID CARD\n..."

:( identifies 4111111111111113 as INVALID
    expected "INVALID\n", not "INVALID CARD\n..."

:( identifies 4222222222223 as INVALID
    expected "INVALID\n", not "INVALID CARD\n..."

我不会给你解决方案,因为这会违反本课程的原则。 有人建议您使用数组,这是一个很好的建议,但 CS50 下周将教您,以便您知道现在执行此操作的困难方法,因此请尝试在不查找这些内容的情况下解决此问题。

您应该始终密切注意代码检查器上的错误消息:

  • ' *:( 将 4222222222223 标识为无效
  • 预期“无效\n”,而不是“无效卡”* '

一旦你弄清楚那里出了什么问题,你就可以确定 AMEX 有什么问题,以及你是如何设置它来计算的。 尝试使用 debug50 运行本节并查看对例如“371449635398431”所做的操作(这将导致打印出 AMEX)。

检查您在该部分中的 printf 的方式。 这不符合检查员的规范。

关于风格的快速建议:你在硬编码。 您可以更动态地编写其中的一些内容,利用抽象和 for 循环,就像本周课程中介绍的那样。 这些将消除一遍又一遍地输入例如 1000000000000000 的需要,并帮助您避免犯错误和调试它们。 如果不好好学习他们现在给你的工具,接下来的几周将比必要的更难。

  • if ((master == 51 || master == 52 || master == 53 || master == 54 || master == 55) && (length == 16))

在这里,对于一个没有错误的示例,您可以使用 >= 和 <= 使这容易阅读和编辑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM