2 / 2 / 0
Регистрация: 28.11.2013
Сообщений: 26

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

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

Студворк — интернет-сервис помощи студентам
в функции 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.04.2014, 14:44
Ответы с готовыми решениями:

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

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

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

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

Решение

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

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  [ТС]
Спасибо)

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

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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.04.2014, 14:35
Помогаю со студенческими работами здесь

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

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

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

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

Считать количество часов, минут и секунд между двумя временными точками
программа должна считать количество часов минут и секунд между двумя заданными временами #include &lt;stdio.h&gt; struct time{ ...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

Новые блоги и статьи
50 самых полезных примеров кода Python для частых задач
py-thonny 17.06.2025
Эффективность работы разработчика часто измеряется не количеством написаных строк, а скоростью решения задач. Готовые сниппеты значительно ускоряют разработку, помогают избежать типичных ошибок и. . .
C# и продвинутые приемы работы с БД
stackOverflow 17.06.2025
Каждый . NET разработчик рано или поздно сталкивается с ситуацией, когда привычные методы работы с базами данных превращаются в источник бессонных ночей. Я сам неоднократно попадал в такие ситуации,. . .
Angular: Вопросы и ответы на собеседовании
Reangularity 15.06.2025
Готовишься к техническому интервью по Angular? Я собрал самые распространенные вопросы, с которыми сталкиваются разработчики на собеседованиях в этом году. От базовых концепций до продвинутых. . .
Архитектура Onion в ASP.NET Core MVC
stackOverflow 15.06.2025
Что такое эта "луковая" архитектура? Термин предложил Джеффри Палермо (Jeffrey Palermo) в 2008 году, и с тех пор подход только набирал обороты. Суть проста - представьте себе лук с его. . .
Unity 4D
GameUnited 13.06.2025
Четырехмерное пространство. . . Звучит как что-то из научной фантастики, правда? Однако для меня, как разработчика со стажем в игровой индустрии, четвертое измерение давно перестало быть абстракцией из. . .
SSE (Server-Sent Events) в ASP.NET Core и .NET 10
UnmanagedCoder 13.06.2025
Кажется, Microsoft снова подкинула нам интересную фичу в новой версии фреймворка. Работая с превью . NET 10, я наткнулся на нативную поддержку Server-Sent Events (SSE) в ASP. NET Core Minimal APIs. Эта. . .
С днём независимости России!
Hrethgir 13.06.2025
Решил побеседовать, с утра праздничного дня, с LM о завоеваниях. То что она написала о народе, представителем которого я являюсь сам сначала возмутило меня, но дальше только смешило. Это чисто. . .
Лето вокруг.
kumehtar 13.06.2025
Лето вокруг. Наполненное бурями и ураганами событий. На фоне магии Жизни, священной и вечной, неумелой рукой человека рисуется панорама душевного непокоя. Странные серые краски проникают и. . .
Популярные LM модели ориентированы на увеличение затрат ресурсов пользователями сгенерированного кода (грязь -заслуги чистоплюев).
Hrethgir 12.06.2025
Вообще обратил внимание, что они генерируют код (впрочем так-же ориентированы разработчики чипов даже), чтобы пользователь их использующий уходил в тот или иной убыток. Это достаточно опытные модели,. . .
Топ10 библиотек C для квантовых вычислений
bytestream 12.06.2025
Квантовые вычисления - это та область, где теория встречается с практикой на границе наших знаний о физике. Пока большая часть шума вокруг квантовых компьютеров крутится вокруг языков высокого уровня. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru