CS50 信用问题正在跳过 "else if" 部分

CS50 Credit Problem is skipping "else if" part

我真的卡在这里了。该程序对无效的信用卡号码给出正确答案,但从不说明它是 VISA、AMEX 还是 MASTERCARD。

我需要 post 完整的代码,因为我没有太多的 C 语言经验。

最后的校验和部分也可能是“bool”,但我总是收到错误消息。

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

int main(void)
{
  long long card;
  int checksum = 0;
  do
   {
    card = get_long_long("Number: ");
   }while (card <= 0);


    int count = 0;
    while (card != 0) {
        card /= 10;     // n = n/10
        ++count;
    }

if(count != 16 && count != 13 && count != 15){
      printf("INVALID\n");
  }
  else if(checksum != 0){
      printf("INVALID\n");
   }
  else if(card >= 34e13 || card >= 37e13){
        printf("AMEX\n");
    }
  else if(card >= 51e14 || card >= 52e14 || card >= 53e14 || card >= 54e14 || card >= 55e15) {
       printf("MASTERCARD\n");
           }
  else if(card >= 4e15 || card >=4e12) {
        printf("VISA\n");
        }
  else {
     printf("INVALID\n");
  }
}

int checksum(long long card_nr)
{
    int sum = 0;
    for (int i=0;card_nr !=0; i++, card_nr/=10 )
    {
        if(i % 2 == 0)
            sum += card_nr % 10;
        else
        {
            int digit = 2 * (card_nr % 10);
            sum += digit / 10 + digit % 10;
        }
    }
    return (sum % 10) == 0;
}

可能存在重大问题或只有一些括号,程序正在编译中。感谢您的帮助。

循环后:

    while (card != 0) {
        card /= 10;     // n = n/10
        ++count;
    }

card = 0,原卡号丢失

您可以将原始卡号保存到另一个变量中,然后进行比较。

此外,最好使用整数常量,如 54LL << 14 而不是浮点数 54e14

逻辑错误较多:

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

int main(void)
{
  long long card;
  int checksum = 0;
  do
   {
    card = get_long_long("Number: ");
   }while (card <= 0);


    int count = 0;
    // ** In here you destroy card, so later card whill allways be 0
    while (card != 0) {
        card /= 10;     // n = n/10
        ++count;
    }

if(count != 16 && count != 13 && count != 15){
      printf("INVALID\n");
  }
  else if(checksum != 0){
      printf("INVALID\n");
   }
   //** here it is the same as  if(card >= 34e13)
  else if(card >= 34e13 || card >= 37e13){
        printf("AMEX\n");
    }
   //** here it is the same as  if(card >= 51e14)
   //** also these values are already covered by last check
  else if(card >= 51e14 || card >= 52e14 || card >= 53e14 || card >= 54e14 || card >= 55e15) {
       printf("MASTERCARD\n");
           }
   //** here it is the same as  if(card >= 4e15)
   //** also these values are already covered by previous check
  else if(card >= 4e15 || card >=4e12) {
        printf("VISA\n");
        }
  else {
     printf("INVALID\n");
  }
}

int checksum(long long card_nr)
{
    int sum = 0;
    for (int i=0;card_nr !=0; i++, card_nr/=10 )
    {
        if(i % 2 == 0)
            sum += card_nr % 10;
        else
        {
            int digit = 2 * (card_nr % 10);
            sum += digit / 10 + digit % 10;
        }
    }
    return (sum % 10) == 0;
}```