Запуск условного в истинное утверждение условного - PullRequest
0 голосов
/ 27 февраля 2019

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

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

int main(void)
{
    int test = 0;
    double nr = get_double("Your card number please:\n ");
        while(test < 1)
        {
            if(nr / 100000000000000 < 10)
            {
                if(nr / 10000000000000 == 37)
                {
                    printf("AMEX");
                    test++;
                }
                else if(nr / 10000000000000 == 34)
                {
                    printf("AMEX");
                    test++;
                }
            }
            else {
            printf("false");
            }
        }
}

Вот пример, который должен работать: 378282246310005.Даже если я введу неправильный номер, ничего не отображается.Кроме того, я считаю, что цикл while не прерывается, потому что условия не выполняются, или я пропустил еще одну ошибку?

Заранее спасибо, peeps

1 Ответ

0 голосов
/ 27 февраля 2019

Вы используете double (представление числа с плавающей запятой, которое не обязательно должно быть целым числом), означающее, что при делении его на делители результат не усекается.Для вашего примера (входное значение равно 378282246310005), значение nr / 10000000000000 не равно 37, но на самом деле это double со значением приблизительно 37,8282246 ...

Входное значение не помещается в int,поэтому функция get_int, доступная в cs50.h, будет неуместна.Однако значение будет вписываться в long, в среде, в которой CS50 использует 1

Объявить nr с типом long и используйте get_long() для получения ввода от пользователя.Тогда значение nr / 10000000000000 будет усечено до нуля до 37, именно так, как вам нужно здесь.

Примечание относительно типов:

1 Авторы libcs50 document get_long() с 64-битным типом со знаком для long с учетом ожидаемой цепочки инструментов и среды.Это не всегда так, особенно если ваша среда (ОС, компилятор и т. Д.) Не соответствует тому, что авторы CS50 ожидают от вас.

Вы захотите убедиться, что ваши предположения верны, если выхотите использовать long в других средах;неразумно обобщать, что long будет 64-битным в будущем, без предварительной тщательной проверки, что это так.Для целей данного назначения будет достаточно указанного типа, но вы можете рассмотреть возможность изучения заголовка stdint.h, который предоставляет типы с гарантированным указанным размером.

...