Я работаю над программой уже более 3 месяцев, и сегодня я решил, что программа в какой-то момент должна распечатать текущий данный календарь.Распечатать текущий месяц Календарь
календарь должен выглядеть следующим образом:
Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
Так что я создал следующую функцию:
void printWeek(int firstDay,int lastDay){
int i;
printf("Su Mo Tu We Th Fr Sa\n");
for(i = 1; i <= lastDay; i++) {
printf("%2d ", i);
if((i + firstDay - 1)%7 ==0){
printf("\n");
}
}
}
и печатает следующее:
Su Mo Tu We Th Fr Sa
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
месяц бее ч мы говорим в сентябре (2015) и должен выглядеть следующим образом:
Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
потому, что начало сентября 2015 вторник не воскресенье, я создал еще одну функцию, которая возвращает номер дня (Sunday == 0
, Monday == 1
... Saturday == 6
):
int dayWeek(int d, int m, int y){
int month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int day[] = {0, 1, 2, 3, 4, 5, 6};
int i;
if (y % 4 == 0 && (y % 100 != 0 || y % 400 == 0)){
month[1] = 29;
}
if (y < 1900 || m < 1 || m > 12 || d < 1 || d > month[m - 1]) {
printf("This is an invalid date.\n");
exit(1);
}
for (i = 1900; i < y; i++){
if (i % 4 == 0 && (i % 100 != 0 || i % 400 == 0)){
d += 366;
}else{
d += 365;
}
}
for (i = 0; i < m - 1; i++){
d += month[i];
}
return day[d % 7];
}
в какой-то момент программа печатает календарь с первого дня и в последний день приведенных данных.
Вопрос: Как я могу иметь следующий вывод:
Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
Я уже знаю, что функция dayWeek()
возвращает 2, который является вторник (первый день недели с сентября 2015 года), но я не знаю, как изменить функцию printWeek()
; печатать 1 сентября как вторник, а не воскресенье. Надеюсь, вы поймете моего бедного английского.
Вот код, который я сейчас:
#include<stdio.h>
#include<stdlib.h>
int dayWeek(int d, int m, int y){
int month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int day[] = {0, 1, 2, 3, 4, 5, 6};
int i;
if (y % 4 == 0 && (y % 100 != 0 || y % 400 == 0)){
month[1] = 29;
}
if (y < 1900 || m < 1 || m > 12 || d < 1 || d > month[m - 1]) {
printf("This is an invalid date.\n");
exit(1);
}
for (i = 1900; i < y; i++){
if (i % 4 == 0 && (i % 100 != 0 || i % 400 == 0)){
d += 366;
}else{
d += 365;
}
}
for (i = 0; i < m - 1; i++){
d += month[i];
}
return day[d % 7];
}
void printWeek(int firstDay,int lastDay){
int i;
printf("Su Mo Tu We Th Fr Sa\n");
for(i = 1; i <= lastDay; i++) {
printf("%2d ", i);
if((i + firstDay - 1)%7 ==0){
printf("\n");
}
}
}
int main(void){
int day = 1;
int month = 9;
int year = 2015;
int weekDay = dayWeek(day,month,year);
printf("The day of the Week is\t%d\n\n",weekDay);
printWeek(day,30);
return 0;
}
комментарий над вашими функциями и циклами, чтобы указать их назначение в существующем коде, это укажет на любые возможные исправления. В дополнение к этому пропустите любые пустые строки, чтобы сделать ваш код более кратким и легким для чтения (без слишком большой прокрутки). – Ziezi
@simplicisveritatis, сэр это быстрый код, орагонный код выглядит по-другому, я попытался показать минимальный код, который будет компилироваться, чтобы вы поняли, что мне нужно. – Michi
не беспокоился, это было всего лишь предложение помочь читателю. Я не сомневаюсь, что исходный код выглядит лучше. – Ziezi