Вопрос високосного года, невозможно получить ввод или сбой .exe - PullRequest
0 голосов
/ 06 июня 2019

извините, может быть очень глуп, только начал изучать C. это базовая проверка, является ли год ввода високосным или нет. Я не понимаю, где я иду не так. исполняемый файл запускается, но как только я ввожу год и нажимаю ввод, он закрывается.

Я попытался удалить return 0;, используя void main, потому что я думал, что это вызывает внезапный сбой. Я не знаю достаточно, чтобы попробовать что-нибудь еще.

#include <stdio.h>

int main() {
   int year;
   printf("Enter year below\n");
   scanf("%d", &year);
   if (year % 4 == 0) {
       if (year % 100 == 0) {
           if (year % 400 == 0)
               printf("%d is a Leap year", year);
           else
               printf("%d is not a Leap year", year);
       } else
           printf("%d is a Leap year", year);
   } else
        printf("%d is not a Leap year", year);

    return 0;
}

Я ожидал, что он сможет проверить високосный год, но он просто рухнет.

Ответы [ 3 ]

2 голосов
/ 07 июня 2019

Вы запускаете консольную программу в Windows прямо из IDE.Windows открывает окно терминала на время действия программы и закрывает его сразу после завершения программы.

Эта проблема мучает студентов, пытающихся использовать C в этой устаревшей системе в течение 25 лет.Microsoft, похоже, не желает исправлять эту проблему, либо в терминале, либо в IDE.Правда в том, что они вообще не поощряют программирование на C, но такая же проблема возникает и для других языков.

Вы можете заставить программу ждать дополнительного ввода перед завершением, чтобы вы могли видеть ее вывод.Тем не менее, вы должны прочитать более одного дополнительного символа, так как scanf() оставит символ новой строки, созданный клавишей, ожидающей в стандартном вводе.

Вот модифицированная версия, которая должна работать:

#include <stdio.h>

int main() {
    int year;

    printf("Enter year below\n");

    if (scanf("%d", &year) != 1) {
        printf("invalid input\n");
    } else {
        if (year % 4 == 0) {
            if (year % 100 == 0) {
                if (year % 400 == 0)
                    printf("%d is a Leap year\n", year);
                else
                    printf("%d is not a Leap year\n", year);
            } else {
                printf("%d is a Leap year\n", year);
            }
        } else {
           printf("%d is not a Leap year\n", year);
        }
    }
    getchar();  /* read the pending newline */
    getchar();  /* read extra input to keep the terminal window open */
    return 0;
}

Как прокомментировал chux, алгоритм реализует правила для григорианского календаря , установленные папой Григорием XIII в 1582 году и постепенно применяемые в разное время по всему миру.Использование этого метода в течение многих лет до 1582 года кажется неправильным с исторической точки зрения, но на самом деле довольно распространено и полезно.Он известен как Гленгорианский календарь с пропелепсией .

1 голос
/ 06 июня 2019

Должно быть scanf("%d", &year); вместо scanf("%d", year);. scanf требует адрес переменной для записи. Ваш компилятор должен был предупредить вас об этом.

0 голосов
/ 06 июня 2019

Если вы напрямую запускаете .exe из Windows, он автоматически закрывается, потому что после завершения работы приложения Windows закрывает окно. Вы можете запустить его из командной строки или поместить что-то в конец кода, чтобы оставить сеанс открытым (например, getchar()).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...