Форум программистов, компьютерный форум CyberForum.ru

Написать календарь, чтобы он совпадал с реальным календарем - C++

Восстановить пароль Регистрация
 
Semen94
0 / 0 / 0
Регистрация: 17.02.2014
Сообщений: 14
24.02.2014, 20:26     Написать календарь, чтобы он совпадал с реальным календарем #1
Задача стоит написать календарь, чтобы он совпадал с реальным календарем (учитывая высокосный год).
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.02.2014, 20:26     Написать календарь, чтобы он совпадал с реальным календарем
Посмотрите здесь:

C++ Как написать прогу чтобы отправить бесплатный СМС
Написать программу чтобы выводила надпись Hello world C++
Механизмы взаимодействия прикладных программ с системным календарем и таймером C++
C++ Написать программу, которая вычисляет оптимальный вес девушки, сравнивает его с реальным
C++ Дан список слов. Найти наиболее длинную последовательность слов, чтобы конец предыдущего совпадал с началом следующего
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dazzer
0 / 0 / 0
Регистрация: 22.02.2014
Сообщений: 5
24.02.2014, 21:02     Написать календарь, чтобы он совпадал с реальным календарем #2
Нарыл старую программу, делал упражнение из книги Дейтела, вроде работает
C++
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
// Calendar 2011 - 2039
 
#include "stdafx.h"
#include <stdio.h>
#include <math.h>
 
int main(int argc, char* argv[])
{
    int year, month = 0, day = 0, monthDay, stMonthDay, leapDayPlus = 0, counter;
    int monthLimit[12] = {30, 27, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30};
    bool leapYear = false;
 
    while(1)
    {
        printf("Enter year 2011 - 2039: 20");
        scanf("%d",&year);  
        if( year >= 11 && year <= 39 )
            break;
        else
            printf("\nError! For correct work year must be in interval [2011;2039]\n");
    }
    if( (year - 12) % 4 == 0)
    {
        leapYear = true;
        printf("Leap-year\n");
        monthLimit[1] = 28;
    }
    
    for(counter = 0; counter <= year - 11; counter++) 
    {
        if((counter - 2) % 4 == 0)
            leapDayPlus += 1;       // Each leap-year increase this var. by 1, while counter moving from (0) to (year-11)
    }
    stMonthDay = (counter + 4 + leapDayPlus) % 7;   // "stMonthDay" - first day of year in the calendar with taking into account leap-years.
    for(month = 0; month <= 11; month++)
    {
        printf("\n---------------------------------------------------\n");
        switch(month)
        {
        case 0:
            printf("January");
            break;
        case 1:
            printf("Febrary");
            break;
        case 2:
            printf("March");
            break;
        case 3:
            printf("April");
            break;
        case 4:
            printf("May");
            break;
        case 5:
            printf("June");
            break;
        case 6:
            printf("July");
            break;
        case 7:
            printf("August");
            break;
        case 8:
            printf("September");
            break;
        case 9:
            printf("October");
            break;
        case 10:
            printf("November");
            break;
        case 11:
            printf("December");
            break;
        }
        printf("\n");
        printf("Mo\tTu\tWe\tTh\tFr\tSa\tSu\n");
        day = 0;
        while(day < stMonthDay)
            {
                printf("\t");
                day++;
            }
        counter = 0;
        for(day = 0; day <= monthLimit[month]; day++)
        {
            if(((day + stMonthDay) % 7 == 0) && day != 0)
            {
                printf("\n");
                printf("%d\t", day + 1);
                counter = 0;
            }
            else
            {
                printf("%d\t", day + 1);
                counter++;
            }
        }
        if(counter < 6)
            stMonthDay = counter + 1;
        else
            stMonthDay = 0;
        
    }       
 
    getchar();
    getchar();
    return 0;
}
Semen94
0 / 0 / 0
Регистрация: 17.02.2014
Сообщений: 14
24.02.2014, 21:08  [ТС]     Написать календарь, чтобы он совпадал с реальным календарем #3
А вот такой вопрос, если выдать запрос на дату не в промежутке 2011-2039 года, что оно выдаст?
Если поставить условие, что мне нужно любой год найти, будь то 1690 или 2178? как быть?)
dazzer
0 / 0 / 0
Регистрация: 22.02.2014
Сообщений: 5
24.02.2014, 21:40     Написать календарь, чтобы он совпадал с реальным календарем #4
У меня, в записной книжке(!) была схема универсального календаря, но там было написано, что она работает на каком-то интервале, уже не помню, вроде около 100 лет. По ней я пробовал сделать, но не получилось, тогда я сделал счетчик дней от текущего 11 года вверх. Идея в том, что порядок дней недели и количества дней в месяце не нарушается никогда (кроме февряля). Теоретически можно точно так же двигаться вниз.
gazlan
2861 / 1809 / 272
Регистрация: 27.08.2010
Сообщений: 4,893
Записей в блоге: 1
24.02.2014, 22:00     Написать календарь, чтобы он совпадал с реальным календарем #5
Цитата Сообщение от Semen94 Посмотреть сообщение
будь-то 1690 или 2178
Пролептический григорианский календарь
Humster13
 Аватар для Humster13
3 / 3 / 1
Регистрация: 16.02.2014
Сообщений: 22
24.02.2014, 23:19     Написать календарь, чтобы он совпадал с реальным календарем #6
Цитата Сообщение от dazzer Посмотреть сообщение
Нарыл старую программу, делал упражнение из книги Дейтела, вроде работает
Она у Вас не совсем на С++, скорее на Си.. Ниже см. на языке С++, но она написана в KDE, могут возникнуть вопросы по русскому шрифту и паузой в консоле.

Кликните здесь для просмотра всего текста
C++
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
// Calendar 2011 - 2039
 
//#include "stdafx.h" // - не для KDE
#include <iostream>
#include "math.h"
 
using namespace std;
 
int main(int argc, char* argv[])
{
    int year, month = 0, day = 0, monthDay, stMonthDay, leapDayPlus = 0, counter;
    int monthLimit[12] = {30, 27, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30};
    bool leapYear = false;
    
 
    while(1)
    {
        cout << ("Введите год 2011 - 2039: 20");
        cin >> year;  
        if( year >= 11 && year <= 39 )
            break;
        else
            cout << ("\nОшибка! Для правильной работы год необходимо указать из интервала [2011;2039]\n");
    }
    if( (year - 12) % 4 == 0)
    {
        leapYear = true;
        cout << ("\nВИСОКОСНЫЙ ГОД\n");
        monthLimit[1] = 28;
    }
    
    for(counter = 0; counter <= year - 11; counter++) 
    {
        if((counter - 2) % 4 == 0)
            leapDayPlus += 1;       // Each leap-year increase this var. by 1, while counter moving from (0) to (year-11)
    }
    stMonthDay = (counter + 4 + leapDayPlus) % 7;   // "stMonthDay" - first day of year in the calendar with taking into account leap-years.
    for(month = 0; month <= 11; month++)
    {
        cout << ("\n---------------------------------------------------\n");
        switch(month)
        {
        case 0:
            cout << ("Январь");
            break;
        case 1:
            cout << ("Февраль");
            break;
        case 2:
            cout << ("Март");
            break;
        case 3:
            cout << ("Апрель");
            break;
        case 4:
            cout << ("Май");
            break;
        case 5:
            cout << ("Июнь");
            break;
        case 6:
            cout << ("Июль");
            break;
        case 7:
            cout << ("Август");
            break;
        case 8:
            cout << ("Сентябрь");
            break;
        case 9:
            cout << ("Октябрь");
            break;
        case 10:
            cout << ("Ноябрь");
            break;
        case 11:
            cout << ("Декабрь");
            break;
        }
        cout << "\n";
        cout << "Пн\tВт\tСр\tЧт\tПт\tСб\tВс\n";
        day = 0;
        while(day < stMonthDay)
            {
                cout << (" \t");
                day++;
            }
        counter = 0;
        for(day = 0; day <= monthLimit[month]; day++)
        {
            if(((day + stMonthDay) % 7 == 0) && day != 0)
            {
                cout << ("\n");
                cout << day + 1 << "\t";
                counter = 0;
            }
            else
            {
                cout << day + 1 << "\t";
                counter++;
            }
        }
        if(counter < 6)
            stMonthDay = counter + 1;
        else
            stMonthDay = 0;
        
    }       
 
    
    return 0;
}


Код рабочий ...

Написать календарь, чтобы он совпадал с реальным календарем

Можно взять за основу, чтоб с нуля не писать.
gazlan
2861 / 1809 / 272
Регистрация: 27.08.2010
Сообщений: 4,893
Записей в блоге: 1
25.02.2014, 00:35     Написать календарь, чтобы он совпадал с реальным календарем #7
Консоль. Столетие вычисляет неправильно. И, вообще, DOS. Как пример интерфейса :-)
Миниатюры
Написать календарь, чтобы он совпадал с реальным календарем  
Вложения
Тип файла: 7z days.com.7z (11.4 Кб, 9 просмотров)
Humster13
 Аватар для Humster13
3 / 3 / 1
Регистрация: 16.02.2014
Сообщений: 22
25.02.2014, 00:44     Написать календарь, чтобы он совпадал с реальным календарем #8
А исходный код где? Мы тут вроде программить пытаемся.
gazlan
2861 / 1809 / 272
Регистрация: 27.08.2010
Сообщений: 4,893
Записей в блоге: 1
25.02.2014, 01:10     Написать календарь, чтобы он совпадал с реальным календарем #9
Ну, у меня есть какие-то собственные исходники и календарных расчетов и консольной псевдографики, но тоже достаточно древние. Если есть интерес к консоли (класс-обертка для WinAPI), то выложу, а календарные расчеты несложно сделать по формуле Целлера (Zeller's congruence).
Semen94
0 / 0 / 0
Регистрация: 17.02.2014
Сообщений: 14
25.02.2014, 01:13  [ТС]     Написать календарь, чтобы он совпадал с реальным календарем #10
Humster13, Дописал код, чтобы без ошибок запустилась - все нормально. Жаль что только интервал такой маленький)
Humster13
 Аватар для Humster13
3 / 3 / 1
Регистрация: 16.02.2014
Сообщений: 22
25.02.2014, 01:22     Написать календарь, чтобы он совпадал с реальным календарем #11
Цитата Сообщение от Semen94 Посмотреть сообщение
... Жаль что только интервал такой маленький
С интервалом разберемся. Если не срочно, то потихоньку что-нить напишем.

Добавлено через 3 минуты
Цитата Сообщение от gazlan Посмотреть сообщение
по формуле Целлера (Zeller's congruence).
Спасибо за ссылку, пригодится.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2014, 02:02     Написать календарь, чтобы он совпадал с реальным календарем
Еще ссылки по теме:

Как написать чтобы программа считала и то и то ?! C++
Нужно написать календарь на С++ C++
Как написать чтобы объект принимал значение косинуса C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Semen94
0 / 0 / 0
Регистрация: 17.02.2014
Сообщений: 14
25.02.2014, 02:02  [ТС]     Написать календарь, чтобы он совпадал с реальным календарем #12
Не срочно, спасибо, сам еще покумекаю чего нибудь.
Yandex
Объявления
25.02.2014, 02:02     Написать календарь, чтобы он совпадал с реальным календарем
Ответ Создать тему
Опции темы

Текущее время: 21:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru