В противном случае ошибка при попытке определить високосные годы в С

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

#include <stdio.h>

int main (void) {
    int start, finish, leap;

    printf("Enter start year: ");
    scanf("%d", &start);

    printf("Enter finish year: ");
    scanf("%d", &finish);


    while (start <= finish)  {

        if ((start%400 == 0) || (start%4 == 0))
            else if (start%100 != 0)
        }

        printf("%d\n", start);
        start = start + 1



    return 0;
}

Я продолжаю получать ошибку "ожидаемого выражения", и она указывает на начало оператора else if. Работает поэтапно, и оператор if работает, чтобы распечатать все годы, кратные 400 или 4.

Я пытаюсь исключить числа, которые делятся на 100 сейчас... какие-либо идеи о том, что идет не так?

5 ответов

Решение

Ваша проблема проще, чем вы думаете. Посмотрите на этот код:

   if ((start%400 == 0) || (start%4 == 0))
            else if (year%100 != 0)

У вас есть оператор if, который не следует за ним.

   if ((start%400 == 0) || (start%4 == 0)) {}
            else if (year%100 != 0) {}

это устранит ошибку, но я уверен, что вы хотите что-то сделать в этих блоках кода!

    while (start <= finish) 
    {

        if ((start%400 == 0) && (start%4 == 0) && (start%100 !=0))
             printf("%d is a leap Year",start);
        start++;
    }

и нет необходимости в переменной прыжка

Надеюсь это поможет

Семантика:

    if <expr> <statment|block> [else <statement|block>]

Итак, следуя if ((start%400 == 0) || (start%4 == 0)) заявление ожидается, а не else,

Ваш } далее не соответствует открытию {,

Правильное утверждение будет:

    if ((start%400 == 0) || (start%4 == 0))
        printf("Hello\n");
    else if (year%100 != 0)
        printf("world\n");
    else
        printf("Oops~\n");

Дэвид Хоэлзер дал вам ответ, который вам нужен; Я собираюсь предложить способ продумать, как организовать ваше заявление if.

Давайте сделаем шаг назад и начнем с нуля. Вам необходимо проверить на следующие условия:

A: Год делится на 4
Б: Год не делится на 100
C: Год делится на 400

Год является високосным, если A верно и либо B или же C верно 1. Начнем с тестирования каждого условия отдельно:

if ( A )                  /* A is true */
{                         /* AND */
  if ( B )                /* B is true */
  {
    // leap year
  }                       /* OR */
  else if ( C )           /* C is true */
  {
    // leap year
  }
  else
  {
    // not leap year
  }
}
else
{
  // not leap year
}

Это просто и понятно, но немного избыточно. Мы можем объединить тесты для B а также C вот так:

if ( A )               /* A is true */
{                      /* AND */
  if ( B || C )        /* B OR C is true */
  {
    // leap year
  }
  else
  {
    // not leap year
  }
}
else
{
  // not leap year
}

Это намного лучше, но все же имеет некоторую избыточность. Мы можем объединить тесты еще дальше:

if ( A && ( B || C ) ) /* A is true AND B OR C is true */
{
  // leap year
}
else
{
  // not leap year
}

&& имеет более высокий приоритет, чем || так что если мы хотим лечить B || C как единственный операнд && мы должны сгруппировать их явно. Кроме того, оба && а также || "короткое замыкание"; если значение выражения может быть определено после вычисления левого операнда, правый операнд вообще не оценивается. IOW, если A ложно, ни B ни C будет оцениваться (ложно && х ложно). Если B правда, C не будет оцениваться (верно || х верно).

Теперь это просто вопрос перевода A, B, а также C к фактическим выражениям, которые вы хотите проверить и заменить // leap year а также // not leap year с заявлениями, которые вы хотите выполнить для этих случаев.


1. Если год делится на 400, то он также делится на 100.

Согласно необходимому синтаксису, указанному в C11 глава §6.8.4.1

if ( expression ) statement else statement

если мы сравним ваш код, то после if ( expression ),

FWIW, если блок оператора не указан явно, следующий оператор (строка) считается оператором, связанным с предыдущим оператором выбора (if). else заявление не может быть частью if тело как то будет отсутствовать необходимое if заявление там.

Я не совсем проверил логику, но я думаю, вы можете просто использовать еще один || присоединиться к части, упомянутой в else if часть в первом if Само выражение.

Другие вопросы по тегам