2015-09-01 7 views
2

Я работаю над программой уже более 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; 
} 
+0

комментарий над вашими функциями и циклами, чтобы указать их назначение в существующем коде, это укажет на любые возможные исправления. В дополнение к этому пропустите любые пустые строки, чтобы сделать ваш код более кратким и легким для чтения (без слишком большой прокрутки). – Ziezi

+1

@simplicisveritatis, сэр это быстрый код, орагонный код выглядит по-другому, я попытался показать минимальный код, который будет компилироваться, чтобы вы поняли, что мне нужно. – Michi

+0

не беспокоился, это было всего лишь предложение помочь читателю. Я не сомневаюсь, что исходный код выглядит лучше. – Ziezi

ответ

4

Вы знаете, в день первого месяца - 2, за месяц - и так все, что вам нужно сделать, это напечатать нужное количество пробелов перед вами выводом первого числа дней в функции printWeek:

for (i=0; i<weekday; i++) 
    printf ("-- "); 

(Я использовал тире для ясности).Это будет компенсирован первый день недели правильно:

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 

но так как вы проверить на индексе дня, первая линия будет торчать и последующие строки не будут правильными. Таким образом скорректировать настройку линии, добавив, что будний день снова:

if((i + firstDay + weekday - 1)%7 ==0)

Полный рутина, в том числе проходя по переменной первого дня-оф-недели, затем становится

void printWeek (int weekday, int firstDay,int lastDay){ 
    int i; 

    printf("Su Mo Tu We Th Fr Sa\n"); 
    for (i=0; i<weekday; i++) 
     printf ("-- "); 
    for(i = 1; i <= lastDay; i++) { 
     printf("%2d ", i); 
     if((i + firstDay + weekday - 1)%7 ==0){ 
      printf("\n"); 
     } 
    } 
} 

и выходы, как и ожидалось :

The day of the Week is 2 

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 
+0

Он работает, спасибо. – Michi

1

Так что это общая проблема, где данные не совсем совпадают.

Вам нужен счетчик для «дня недели» и отдельный счетчик для даты в месяце.

Я переименовал printWeek в printMonth. Отправить в начальный день недели (firstWeekDay) (0 - 6). Затем после печати заголовка создайте пробелы для местоположения начальной даты.

Наконец, конец недели основан на i и firstWeekDay, поэтому, когда необходимо добавить новую строку.

void printMonth(int firstDay,int lastDay, int firstWeekDay){ 
    int i; 
    printf("Su Mo Tu We Th Fr Sa\n"); 
    for(i = 0; i < firstWeekDay ; i ++) { 
     printf(" "); 
    } 
    for(i = 1; i <= lastDay; i++) { 
     printf("%2d ", i); 
     if((i + firstDay + firstWeekDay - 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); 

    printMonth(day,30, weekDay); 
    return 0; 
} 
Смежные вопросы