В противном случае ошибка при попытке определить високосные годы в С
Я только начал вводный курс по программированию на 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
Само выражение.