С Новым годом! Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
2 / 2 / 0
Регистрация: 28.11.2013
Сообщений: 26
1

Посчитать количество дней между двумя событиями

09.04.2014, 14:44. Показов 1651. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
в функции interval считаю количество дней между двумя событиями, но не правильно, в чем проблема не понимаю, помогите
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<locale.h>
 
 
struct hevent
{
    int day, month, year;
    char event[20];
};
 
void input(struct hevent *he)//ввод исторического события;
{
    FILE *fhe;
    char c;
    int i=0, m;
    if ((fhe=fopen("event.txt","a+"))!=NULL)
    {   
        while((c=getc(fhe))!=EOF)
        {
            fscanf(fhe,"%d",&m);
            fscanf(fhe,"%s",he[i].event);
            fscanf(fhe,"%d",&he[i].day);
            fscanf(fhe,"%d",&he[i].month);
            fscanf(fhe,"%d",&he[i].year);
               i++;
        }
    }
    else printf("Error");
 
    printf("Введите событие:");       
        scanf("%s", he[m].event);
    printf("Введите день:");     
        scanf("%d", &he[m].day);
    printf("Введите месяц:");       
        scanf("%d", &he[m].month);
    printf("Введите год:");           
        scanf("%d", &he[m].year);
 
    fprintf(fhe,"\n%d %s %d %d %d", m+1, he[m].event, he[m].day, he[m].month, he[m].year);
    fclose(fhe);
}
 
void output(struct hevent *he)//вывод на экран списка исторических событий
{
    FILE *fhe;
    char c;
    int i=0, j, m;
 
    if ((fhe=fopen("event.txt","r"))!=NULL)
    {   
        while((c=getc(fhe))!=EOF)
        {
            fscanf(fhe,"%d",&m);
            fscanf(fhe,"%s",he[i].event);//событие
            fscanf(fhe,"%d",&he[i].day);//день
            fscanf(fhe,"%d",&he[i].month);//месяц
            fscanf(fhe,"%d",&he[i].year);//год
            i++;
        }
    }
    else printf("Error");
 
    printf("Исторические события:\n++++++++++++++++++++++++++++++\n");
    printf("Событие\tДень\tМесяц\tГод\n");
 
    for(j=0;j<m;j++)
    {
        printf("%s\t%d\t%d\t%d\n", he[j].event, he[j].day, he[j].month, he[j].year);
    }
    fclose(fhe);
}
 
int add_day_leap(unsigned int year) // Если год високосный добавить один день
{
    return (!(year % 4) && (year % 100) || !(year % 400)) ? 1 : 0;
} 
int get_days_month(int month, int year) // Вычисляем количество дней в месяце с учетом является ли год високосным
{
    int days = 31;    
    switch(month) 
    {
        case 2: days = 28 + add_day_leap(year); break;
        case 4:
        case 6:
        case 9:
        case 11: days = 30; break;
    }    
    return days;
}
int get_days_begin(int day, int month, int year)// Считаем количество дней от начала года до текущей даты 
{
    int days = 0;
    for(unsigned int i = 1; i < month; ++i) 
    {
        days += get_days_month(i, year);
    }    
    days += day; // складываем количество дней в месяцах от начала года
                 // с количеством дней в месяце когда произошло событие    
    return days;
} 
int get_days_end(int day, int month, int year)// Считаем количество дней от текущей даты до конца года
{
    int days = 0;
    for(unsigned int i = month + 1; i <= 12; ++i) 
    {
        days += get_days_month(i, year);
    }
    
    days += (get_days_month(month, year) - day);    
    return days;
}
 
void interval(struct hevent *he)//Вычислить интервал в днях, прошедший между двумя заданными историческими событиями
{
    FILE *fhe;
    char c;
    int i = 0, m;   
 
    if ((fhe=fopen("event.txt","r"))!=NULL)
    {   
        while((c=getc(fhe))!=EOF)
        {
            ungetc(c, fhe);
            fscanf(fhe,"%d",&m);
            fscanf(fhe,"%s",he[i].event);//событие
            fscanf(fhe,"%d",&he[i].day);//день
            fscanf(fhe,"%d",&he[i].month);//месяц
            fscanf(fhe,"%d",&he[i].year);//год
            i++;
        }
    }
    else printf("Error");
    fclose(fhe);
 
    printf("\nИсторические события:\n++++++++++++++++++++++++++++++++++++++++++++\n");
    printf("Номер события\tСобытие\tДень\tМесяц\tГод\n");
    for(i = 0; i < m; ++i)
    {
        printf("%d\t\t%s\t%d\t%d\t%d\n",i, he[i].event, he[i].day, he[i].month, he[i].year);
    }
    
    int event_1, event_2;
    printf("\nВведите номера событий для подсчета количества дней прошедших между ними:\n");
    printf("Номер первого события: ");
    scanf("%d", &event_1);
    fflush(stdin);
    printf("Номер второго события: ");
    scanf("%d", &event_2);
    fflush(stdin);
 
    if((he[event_2].year < he[event_1].year) || (he[event_2].month < he[event_1].month) || (he[event_2].day < he[event_1].day)) // Проверим если событие 1 произошло позже события 2, то поменять их местами
    {
        i = event_1;
        event_1 = event_2;
        event_2 = i;
    }
    
    long days = 0;
    int num_year = he[event_2].year - he[event_1].year - 1;
    int year = he[event_1].year + 1;
    for(i = 0; i < num_year; i++) 
    {
        days += 365 + add_day_leap(year + i);
    }
    
    days += get_days_begin(he[event_2].day, he[event_2].month, he[event_2].year);
    
    printf("Количество дней от %d/%d/%d до %d/%d/%d равно %d.\n"
        ,he[event_1].day
        ,he[event_1].month
        ,he[event_1].year
        ,he[event_2].day
        ,he[event_2].month
        ,he[event_2].year
        ,days);
}
 
int main (void)
{
    setlocale(LC_ALL, "rus");
    struct hevent st[1024];
    int i;
    while(1)
    {
        printf("\n++++++++++++++++++++++++++++++\nИсторические события\n++++++++++++++++++++++++++++++\n1.Ввести историческое событие\n2.Вывести исторические события\n3.Вычислить интервал в днях, между двумя заданными событиями\n4.Выход\nВведите номер команды:");
        scanf("%d",&i);
        switch(i)
        {
            case 1: input(st);break;
            case 2: output(st);break;
            case 3: interval(st);break;
            case 4: exit(1); break;
            default:printf("Error");
        }
    }
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.04.2014, 14:44
Ответы с готовыми решениями:

Посчитать количество дней между двумя датами
Где ошибки?#include &lt;stdio.h&gt; struct date { int day; int month; int year; } ...

Посчитать количество чисел между двумя значениями
Привет. Столнулся с такой проблемкой. Задается одномерный массив. В массиве нужно найти макс и мин...

Вычислите количество дней между двумя датами,заданными в формате DD/MM/YYYY,включая начальный и конечный день.
Вычислите количество дней между двумя датами,заданными в формате DD/MM/YYYY,включая начальный и...

Структура "Историческое событие". Найти интервал между двумя событиями в днях
Ввести структуру ИСТОРИЧЕСКОЕ СОБЫТИЕ с полями ЧИСЛО, МЕСЯЦ, ГОД, СОБЫТИЕ. Составить и...

3
54 / 54 / 47
Регистрация: 16.03.2014
Сообщений: 110
Записей в блоге: 2
09.04.2014, 20:48 2
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Потому что потеряли строчку см. ранее.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    long days = 0;
    int num_year = he[event_2].year - he[event_1].year - 1;
    int year = he[event_1].year + 1;
    // Надо посчитать количество дней в полных годах между двумя событиями
    for(i = 0; i < num_year; ++i) {
        days += 365 + add_day_leap(year + i);
    }
    
    // И в двух неполных годах
    // от первого события до конца года
    days += get_days_end(he[event_1].day, he[event_1].month, he[event_1].year); // !!!!! Вот эту !!!!!
    // от начала года до второго события
    days += get_days_begin(he[event_2].day, he[event_2].month, he[event_2].year);
 
    printf("Количество дней от %d/%d/%d до %d/%d/%d равно %l.\n"
        ,he[event_1].day
        ,he[event_1].month
        ,he[event_1].year
        ,he[event_2].day
        ,he[event_2].month
        ,he[event_2].year
        ,days);
1
2 / 2 / 0
Регистрация: 28.11.2013
Сообщений: 26
10.04.2014, 17:54  [ТС] 3
Спасибо)

Добавлено через 18 часов 47 минут
chjornoe_solnce, я снова вас беспокою, но при тесте в результате которого должен выводиться ответ 1, выводится 366, я не смог разобраться в чем дело, помогите пожалуйста.
0
54 / 54 / 47
Регистрация: 16.03.2014
Сообщений: 110
Записей в блоге: 2
13.04.2014, 14:35 4
Как-то так вот получается

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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
 
struct Event {
    int day;
    int month;
    int year;
    
    char description[20];
};
 
//----------------------------------------------------------------------
// Вспомогательные функции для подсчета дней
//----------------------------------------------------------------------
// Функция определения является ли год високосным
bool leap_year(int year) {
    return (!(year % 4) && (year % 100) || !(year % 400)) ? true : false;
}
 
// Функция добовляет день если год високосный
int add_day_leap(int year) {
    return (leap_year(year) == true) ? 1 : 0;
}
 
// Функция расчета дней в году
int get_days_year(int year) {
    return 365 + ((leap_year(year) == true) ? 1 : 0);
}
 
// Функция расчета дней в месяцах
int get_days_month(int month, int year) {
    int days = 31;
    
    switch(month) {
        case 2:
            days = 28 + add_day_leap(year);
            break;
        case 4:
        case 6:
        case 9:
        case 11:
            days = 30;
            break;
    }
    
    return days;
}
//----------------------------------------------------------------------
 
 
//----------------------------------------------------------------------
// Функции подсчета дней в годах, месяцах
//----------------------------------------------------------------------
// Функция попсчета дней в полных годах
unsigned int get_days_full_year(int byear, int eyear) {
    unsigned int days = 0;
    
    if(byear == eyear) {
        return get_days_year(byear);
    }
    
    for(unsigned int i = byear; i <= eyear; ++i) {
        days += get_days_year(i);
    }
    
    return days;
}
 
// Функция подсчета дней в полных месяцах
unsigned int get_days_full_month(int bmonth, int emonth, int year) {
    unsigned int days = 0;
    
    if(bmonth == emonth) {
        return get_days_month(bmonth, year);;
    }
    
    for(unsigned int i = bmonth; i <= emonth; ++i) {
        days += get_days_month(i, year);
    }
    
    return days;
}
 
// Функция подсчитывающая количество дней до конца месяца
unsigned int get_days_month_end(int day, int month, int year) {
    unsigned int days = (get_days_month(month, year) - day);
    
    return days;
}
//----------------------------------------------------------------------
 
 
//----------------------------------------------------------------------
// Функции расчета дней между событиями
//----------------------------------------------------------------------
// Функция расчитывающая количество дней между двумя событиями если разные года
unsigned int get_days_events_year(struct Event *ev1, struct Event *ev2) {
    unsigned int days = get_days_full_year(ev1->year + 1, ev2->year - 1);
    
    if(12 != ev1->month) {
        days += get_days_full_month(ev1->month, 12, ev1->year);
    }
    
    if(1 != ev2->month) {
        days += get_days_full_month(1, ev2->month, ev2->year);
    }
    
    days += ev2->day;
    days += get_days_month_end(ev1->day, ev1->month, ev1->year);
    
    return days;
}
 
// Функция расчитывает количество дней между двумя событиями если года одинаковые
unsigned int get_days_events_month(struct Event *ev1, struct Event *ev2) {
    unsigned int days = get_days_full_month(ev1->month + 1, ev2->month - 1, ev1->year);
    
    days += get_days_month_end(ev1->day, ev1->month, ev1->year);
    days += ev2->day;
    
    return days;
}
 
unsigned int get_days_events(struct Event *ev1, struct Event *ev2) {
    unsigned int days = 0;
    
    if(ev2->year == ev1->year) {
        if(ev2->month == ev1->month) {
            days = abs(ev1->day - ev2->day);
        } else {
            if(ev2->month > ev1->month) {
                days = get_days_events_month(ev1, ev2);
            } else {
                days = get_days_events_month(ev2, ev1);
            }
        }
    } else {
        if(ev2->year > ev1->year) {
            days = get_days_events_year(ev1, ev2);
        } else {
            days = get_days_events_year(ev2, ev1);
        }
    }
    
    return days;
}
//----------------------------------------------------------------------
 
 
//----------------------------------------------------------------------
int main(int argc, char *argv[]) {
    struct Event evnts[] = {{ 2, 12, 2012, "Event 1"}
                           ,{ 2,  1, 2014, "Event 2"}
                           ,{ 2, 12, 2012, "Event 3"}
                           ,{ 2,  1, 2013, "Event 4"}
                           ,{ 2, 12, 2012, "Event 5"}
                           ,{12, 12, 2012, "Event 6"}
                           ,{10, 10, 2012, "Event 7"}
                           ,{12, 12, 2012, "Event 8"}
                           ,{12, 12, 2012, "Event 9"}
                           ,{22, 12, 2012, "Event 0"}};
    
    unsigned int SIZE_EVNTS = sizeof(evnts) / sizeof(evnts[0]);
    
    for(unsigned int i = 0, j = 1; i < SIZE_EVNTS; i += 2, j += 2) {
        fprintf(stdout, "Количество дней между событием \"%s\" (%2d/%2d/%d) и событием \"%s\"(%2d/%2d/%d) равно: %d\n"
               ,evnts[i].description
               ,evnts[i].day
               ,evnts[i].month
               ,evnts[i].year
               ,evnts[j].description
               ,evnts[j].day
               ,evnts[j].month
               ,evnts[j].year
               ,get_days_events(&evnts[i], &evnts[j]));
    }
    
    return EXIT_SUCCESS;
}
Сборка по Linux
Bash
1
$ gcc -std=gnu99 -o pname file.c
0
13.04.2014, 14:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.04.2014, 14:35
Помогаю со студенческими работами здесь

Посчитать количество дней с даты рождения до текущего момента!?
Необходимо посчитать количество дней с даты рождения до текущего момента!? Подскажите код на языке...

Посчитать сумму элементов последовательности между двумя первыми нулями (переделать код)
Есть код, в котором при вводе последовательности чисел считает сумму чисел между двумя ПОСЛЕДНИМИ...

Найти количество элементов в массиве между двумя, заданными пользователем
Найти колличесто элементов в массиве между заданными пользлвателем с клавиатуры. массив одномерный...

Считать количество часов, минут и секунд между двумя временными точками
программа должна считать количество часов минут и секунд между двумя заданными временами #include...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru