Я запрограммировал очень простой календарь на C. Он принимает год в качестве входных данных и затем вычисляет даты и дни недели для этого года. Предполагается, что дата 0001-01-01 - понедельник. У меня получилось хорошо работать, кроме как в одном месте. Когда он собирается распечатать строку со всеми 31-ю датами. В основном, что происходит неправильно, когда он проверяет, есть ли что-нибудь для печати в 31-ом классе (чего там нет), он исключает переменную недели недели. Который делает следующие 31 даты неверными. Есть ли кто-нибудь, кто может увидеть, что я сделал что-то неправильно или могу помочь мне? :)Weird output Calendar in C
EDIT Забыл упомянуть, что это задача, которую нужно решить без каких-либо формул для расчета дневного кода и так далее. Единственной ссылкой, разрешенной для использования, является то, что дата 0001-01-01 является понедельником.
Heres my code. (Да, это немного грязный атм, но я все еще учусь.)
int isLeapYear(int year){
if(((year%4==0) && (year%100!=0)) || (year%400==0)){
return 1;
}
else
return 0;
}
int getYear(){
int year = 0;
while(year==0 || year < 0){
printf("Enter year: ");
scanf("%d", &year);
if(year > 0){
break;
}
printf("Invalid input. Try again.\n\n");
}
return year;
}
void printWeekday(int w){
switch(w){
case 0:
printf("Sun");
break;
case 1:
printf("Mon");
break;
case 2:
printf("Tue");
break;
case 3:
printf("Wed");
break;
case 4:
printf("Thu");
break;
case 5:
printf("Fri");
break;
case 6:
printf("Sat");
break;
}
}
void printMonth(int m){
switch(m){
case 1:
printf("Jan");
break;
case 2:
printf(" Feb");
break;
case 3:
printf(" Mar");
break;
case 4:
printf(" Apr");
break;
case 5:
printf(" May");
break;
case 6:
printf(" Jun");
break;
case 7:
printf(" Jul");
break;
case 8:
printf(" Aug");
break;
case 9:
printf(" Sep");
break;
case 10:
printf(" Oct");
break;
case 11:
printf(" Nov");
break;
case 12:
printf(" Dec\n");
break;
}
}
void calendar(int year){
int y = 1;
int m = 1;
int d = 1;
int loop = 1;
int day = 1;
int days_in_month[14] = {0,31,28,31,30,31,30,31,31,30,31,30,31,0};
if(isLeapYear(year)){
days_in_month[1] = 29;
}
for(m=1; m<=12; m++){
printMonth(m);
}
while(loop){
int weekday = 1;
for(y=1; y<=year; y++){
for(m=1; m<=12; m++){
for(d=1; d<=31; d++){
if(weekday%7 == 0){
// printf("h");
weekday = 0;
}
if(y==year){
if(day>days_in_month[m]){
printf(" ");
printf("%d", weekday);
break;
}else if(d == day){
//printf("%d", weekday);
if(m == 1){
printf("%02d ", d);
printWeekday(weekday);
}else if(m == 12){
printf(" %02d ", d);
printWeekday(weekday);
printf("\n");
}else{
printf(" %02d ", d);
printWeekday(weekday);
}
}
}
if(d<=days_in_month[m]){
weekday = weekday + 1;
}
}
}
}
day++;
if(day == 32){
break;
}
}
}
int main()
{
int end = 1;
while(end){
int year = getYear();
printf(" %d\n", year);
calendar(year);
printf("\nEnter 0 to quit: ");
scanf("%d", &end);
//system("cls");
}
return 0;
}
Days_in_Month [1] = 29; -> должно быть days_in_month [2] = 29; –
Ой, я забыл изменить это, когда тестировал, хотя это относится только к високосным годам, это не проблема печально :) –
Я полагаю, что ваш вопрос о 'void calendar (int year)' в вашем коде. Не могли бы вы объяснить, какой должна быть ожидаемая входная функция этой функции и ее соответствующая продукция? Примером может служить пример (возможно, один, показывающий ошибку). –