CS50 Credit Problem пропускает часть "иначе, если" - PullRequest
0 голосов
/ 02 августа 2020

Я действительно застрял здесь. Программа дает правильный ответ на номера недействительных кредитных карт, но никогда не говорит, что это за VISA, AMEX или MASTERCARD.

Мне нужно опубликовать полный код, потому что у меня нет такого большого опыта работы с языком 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;
}

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

Ответы [ 2 ]

0 голосов
/ 02 августа 2020

Много ошибок с логом c:

#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;
}```
0 голосов
/ 02 августа 2020

После l oop:

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

card = 0 и исходный номер карты утерян.

Вы можете сохранить исходный номер карты в другую переменную и затем сравнить его.

Также лучше использовать целые константы вроде 54LL << 14 вместо float 54e14

...