Посчитать количество дней между двумя событиями - C (СИ)

Узнай цену своей работы

Формулировка задачи:

в функции interval считаю количество дней между двумя событиями, но не правильно, в чем проблема не понимаю, помогите
Листинг программы
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<conio.h>
  5. #include<locale.h>
  6.  
  7. struct hevent
  8. {
  9. int day, month, year;
  10. char event[20];
  11. };
  12. void input(struct hevent *he)//ввод исторического события;
  13. {
  14. FILE *fhe;
  15. char c;
  16. int i=0, m;
  17. if ((fhe=fopen("event.txt","a+"))!=NULL)
  18. {
  19. while((c=getc(fhe))!=EOF)
  20. {
  21. fscanf(fhe,"%d",&m);
  22. fscanf(fhe,"%s",he[i].event);
  23. fscanf(fhe,"%d",&he[i].day);
  24. fscanf(fhe,"%d",&he[i].month);
  25. fscanf(fhe,"%d",&he[i].year);
  26. i++;
  27. }
  28. }
  29. else printf("Error");
  30. printf("Введите событие:");
  31. scanf("%s", he[m].event);
  32. printf("Введите день:");
  33. scanf("%d", &he[m].day);
  34. printf("Введите месяц:");
  35. scanf("%d", &he[m].month);
  36. printf("Введите год:");
  37. scanf("%d", &he[m].year);
  38. fprintf(fhe,"\n%d %s %d %d %d", m+1, he[m].event, he[m].day, he[m].month, he[m].year);
  39. fclose(fhe);
  40. }
  41. void output(struct hevent *he)//вывод на экран списка исторических событий
  42. {
  43. FILE *fhe;
  44. char c;
  45. int i=0, j, m;
  46. if ((fhe=fopen("event.txt","r"))!=NULL)
  47. {
  48. while((c=getc(fhe))!=EOF)
  49. {
  50. fscanf(fhe,"%d",&m);
  51. fscanf(fhe,"%s",he[i].event);//событие
  52. fscanf(fhe,"%d",&he[i].day);//день
  53. fscanf(fhe,"%d",&he[i].month);//месяц
  54. fscanf(fhe,"%d",&he[i].year);//год
  55. i++;
  56. }
  57. }
  58. else printf("Error");
  59. printf("Исторические события:\n++++++++++++++++++++++++++++++\n");
  60. printf("Событие\tДень\tМесяц\tГод\n");
  61. for(j=0;j<m;j++)
  62. {
  63. printf("%s\t%d\t%d\t%d\n", he[j].event, he[j].day, he[j].month, he[j].year);
  64. }
  65. fclose(fhe);
  66. }
  67. int add_day_leap(unsigned int year) // Если год високосный добавить один день
  68. {
  69. return (!(year % 4) && (year % 100) || !(year % 400)) ? 1 : 0;
  70. }
  71. int get_days_month(int month, int year) // Вычисляем количество дней в месяце с учетом является ли год високосным
  72. {
  73. int days = 31;
  74. switch(month)
  75. {
  76. case 2: days = 28 + add_day_leap(year); break;
  77. case 4:
  78. case 6:
  79. case 9:
  80. case 11: days = 30; break;
  81. }
  82. return days;
  83. }
  84. int get_days_begin(int day, int month, int year)// Считаем количество дней от начала года до текущей даты
  85. {
  86. int days = 0;
  87. for(unsigned int i = 1; i < month; ++i)
  88. {
  89. days += get_days_month(i, year);
  90. }
  91. days += day; // складываем количество дней в месяцах от начала года
  92. // с количеством дней в месяце когда произошло событие
  93. return days;
  94. }
  95. int get_days_end(int day, int month, int year)// Считаем количество дней от текущей даты до конца года
  96. {
  97. int days = 0;
  98. for(unsigned int i = month + 1; i <= 12; ++i)
  99. {
  100. days += get_days_month(i, year);
  101. }
  102. days += (get_days_month(month, year) - day);
  103. return days;
  104. }
  105. void interval(struct hevent *he)//Вычислить интервал в днях, прошедший между двумя заданными историческими событиями
  106. {
  107. FILE *fhe;
  108. char c;
  109. int i = 0, m;
  110. if ((fhe=fopen("event.txt","r"))!=NULL)
  111. {
  112. while((c=getc(fhe))!=EOF)
  113. {
  114. ungetc(c, fhe);
  115. fscanf(fhe,"%d",&m);
  116. fscanf(fhe,"%s",he[i].event);//событие
  117. fscanf(fhe,"%d",&he[i].day);//день
  118. fscanf(fhe,"%d",&he[i].month);//месяц
  119. fscanf(fhe,"%d",&he[i].year);//год
  120. i++;
  121. }
  122. }
  123. else printf("Error");
  124. fclose(fhe);
  125. printf("\nИсторические события:\n++++++++++++++++++++++++++++++++++++++++++++\n");
  126. printf("Номер события\tСобытие\tДень\tМесяц\tГод\n");
  127. for(i = 0; i < m; ++i)
  128. {
  129. 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);
  130. }
  131. int event_1, event_2;
  132. printf("\nВведите номера событий для подсчета количества дней прошедших между ними:\n");
  133. printf("Номер первого события: ");
  134. scanf("%d", &event_1);
  135. fflush(stdin);
  136. printf("Номер второго события: ");
  137. scanf("%d", &event_2);
  138. fflush(stdin);
  139. 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, то поменять их местами
  140. {
  141. i = event_1;
  142. event_1 = event_2;
  143. event_2 = i;
  144. }
  145. long days = 0;
  146. int num_year = he[event_2].year - he[event_1].year - 1;
  147. int year = he[event_1].year + 1;
  148. for(i = 0; i < num_year; i++)
  149. {
  150. days += 365 + add_day_leap(year + i);
  151. }
  152. days += get_days_begin(he[event_2].day, he[event_2].month, he[event_2].year);
  153. printf("Количество дней от %d/%d/%d до %d/%d/%d равно %d.\n"
  154. ,he[event_1].day
  155. ,he[event_1].month
  156. ,he[event_1].year
  157. ,he[event_2].day
  158. ,he[event_2].month
  159. ,he[event_2].year
  160. ,days);
  161. }
  162. int main (void)
  163. {
  164. setlocale(LC_ALL, "rus");
  165. struct hevent st[1024];
  166. int i;
  167. while(1)
  168. {
  169. printf("\n++++++++++++++++++++++++++++++\nИсторические события\n++++++++++++++++++++++++++++++\n1.Ввести историческое событие\n2.Вывести исторические события\n3.Вычислить интервал в днях, между двумя заданными событиями\n4.Выход\nВведите номер команды:");
  170. scanf("%d",&i);
  171. switch(i)
  172. {
  173. case 1: input(st);break;
  174. case 2: output(st);break;
  175. case 3: interval(st);break;
  176. case 4: exit(1); break;
  177. default:printf("Error");
  178. }
  179. }
  180. return 0;
  181. }

Решение задачи: «Посчитать количество дней между двумя событиями»

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

Объяснение кода листинга программы

  1. Объявлена переменная days для хранения количества дней.
  2. Переменная num_year вычисляется как разность между годами второго и первого события минус единица.
  3. Переменная year равна году первого события плюс единица.
  4. В цикле for происходит подсчёт количества дней в полных годах между двумя событиями.
  5. В цикле выполняются следующие действия:
    • Увеличивается значение переменной days на сумму 365 и результат функции add_day_leap для года, увеличенного на i.
    • Вызывается функция get_days_end для получения количества дней от первого события до конца текущего года.
    • Вызывается функция get_days_begin для получения количества дней от начала следующего года до второго события.
  6. Выводится сообщение с количеством дней от первого события до второго.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.067 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы