#include <stdio.h>
#include <stdlib.h>
int main(){
int f,x,s,y,t,l,year,sum;
f=year/1000;
x=year%1000;
s=x/100;
y=x%100;
t=y/10;
l=y%10;
sum=f+s+t+l;
printf("Enter a Year:");
scanf("%d",&year);
if (year%4==0){
printf("Leap,%d",sum);
}
else if (year%400==0){
printf("Leap,%d",sum);
}
else if (year%100==0){
printf("Regular,%d",sum);
}
else {printf("Regular,%d",sum);}
return 0;
}
Задача: ввести 4-значный год с помощью стандартного ввода (scanf). Показать, високосный год или нет. Если год високосный, отображать - Високосный, сумма цифр года. Если год не високосный, отображать - Обычный, сумма цифр года.
Он дает правильный вывод для високосного года, но не сумму цифр
ПК начинает с начала main()
и оценивает одно утверждение за другим. (Проще говоря, процедура запуска, сигналы, прерывания, многопоточность, раскручивание стека.... игнорируются). Игнорирование возвращаемого значения scanf()
является ошибкой программирования.
Выражения в C не являются формулами, которые автоматически вступают в силу при изменении связанных переменных. Они работают с текущим значением рассматриваемых переменных в этой точке программы.
Вам нужно переместить вычисление цифр после того, как вы прочитаете значение year
.
printf("Enter a Year:");
scanf("%d",&year);
f=year/1000;
x=year%1000;
s=x/100;
y=x%100;
t=y/10;
l=y%10;
sum=f+s+t+l;
Кроме того, вы захотите еще раз взглянуть на то, как вы вычисляете високосный год. Попробуйте 1900, 1999, 2000 и 2004 в качестве тестовых значений.
Отсутствие проверки возвращаемого значения scanf()
является ошибкой.
На ваш фактический вопрос ответил @dbush, однако ваши критерии високосного года также не совсем верны. Ваша первая ветка if
всегда будет выполняться, когда year % 4 == 0
, независимо от того, year % 100 == 0
. Итак, что вы действительно хотите, есть
if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) {
// leap year ...
}
else {
// no leap year ...
}
Ну, вы рассчитываете сумму ДО того, как вы читаете год от пользователя. Вы должны сделать это после.