Структура "Историческое событие". Найти интервал между двумя событиями в днях - C (СИ)

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

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

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

Решение задачи: «Структура "Историческое событие". Найти интервал между двумя событиями в днях»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <math.h>
  4.  
  5. int mn[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  6.  
  7. struct _event
  8. {
  9. int day;
  10. int month;
  11. int year;
  12. char* event;
  13. };
  14.  
  15. struct event_node
  16. {
  17. struct _event* ev;
  18. struct event_node* next;
  19. };
  20.  
  21. int is_leap_year(int year)
  22. {
  23. if (year%4 == 0)
  24. return 1;
  25. else
  26. return 0;
  27. }
  28.  
  29. // ввод
  30.  
  31. // аргумент функции нельзя передавать через одинарный указатель.
  32.  
  33. void enter_event(struct event_node** c)
  34. {
  35. struct event_node* iterator;
  36. if (*c == 0)
  37. {
  38. *c = (struct event_node*) malloc( sizeof(struct event_node) );
  39. if (*c != 0)
  40. {
  41. (*c)->next = 0;
  42. (*c)->ev = 0;
  43. (*c)->ev = (struct _event*) malloc( sizeof(struct _event) );
  44. if ((*c)->ev != 0)
  45. {
  46. (*c)->ev->event = 0;
  47. (*c)->ev->day = 18;
  48. (*c)->ev->month = 3;
  49. (*c)->ev->year = 2015;
  50. (*c)->ev->event = (char*) malloc( 2 * sizeof(char) );
  51. if ((*c)->ev->event != 0)
  52. {
  53. (*c)->ev->event[0] = 't';
  54. (*c)->ev->event[1] = '\0';
  55. }
  56. }
  57. }
  58. }
  59. else
  60. {
  61. iterator = *c;
  62. while (iterator->next != 0)
  63. iterator  = iterator ->next;
  64. iterator->next = (struct event_node*) malloc( sizeof(struct event_node) );
  65. if (iterator ->next != 0)
  66. {
  67. iterator->next->next = 0;
  68. iterator->next->ev = (struct _event*) malloc( sizeof(struct _event) );
  69. if (iterator ->next ->ev != 0)
  70. {
  71. iterator->next->ev->event = 0;
  72. iterator->next->ev->day = 18;
  73. iterator->next->ev->month = 3;
  74. iterator->next->ev->year = 2015;
  75. iterator->next->ev->event = (char*) malloc( 2 * sizeof(char) );
  76. if (iterator->next->ev->event != 0)
  77. {
  78. iterator->next->ev->event[0] = 't';
  79. iterator->next->ev->event[1] = '\0';
  80. }
  81. }
  82. }
  83. }
  84. }
  85.  
  86. // вывод
  87.  
  88. void print_event_internal(struct _event* c)
  89. {
  90. if (c == 0) return;
  91. printf("%d %d %d %s\n", c->day, c->month, c->year, c->event);
  92. }
  93.  
  94. void print_event(struct event_node** c)
  95. {
  96. struct event_node* iterator = *c;
  97. if (iterator == 0) return;
  98. while (iterator->next != 0)
  99. {
  100. print_event_internal(iterator->ev);
  101. iterator  = iterator ->next;
  102. }
  103. print_event_internal(iterator->ev);
  104. }
  105.  
  106.  
  107.  
  108. // разность между датами (предполагается что год 1 события c больше года 2 события с1)
  109. // погрешность +-1
  110.  
  111. int diff_event_internal(struct _event* c, struct _event* c1)
  112. {
  113. int day;
  114. int month;
  115. int year;
  116. int tday;
  117. int tmonth;
  118. int tyear;
  119. int r;
  120.  
  121. if (c == 0) return -1;
  122.  
  123. day = c1->day;
  124. month = c1->month;
  125. year = c1->year;
  126.  
  127. if (year == c->year)
  128. {
  129. if (month == c->month) { return (abs(day - c->day)); }
  130. else
  131. {
  132. r = c->day;
  133. tmonth = c->month;
  134. tmonth--;
  135. while (tmonth != month && tmonth > 0)
  136. {
  137. r += mn[tmonth-1];
  138. if (tmonth-1 == 1&& is_leap_year(c->year) ) r += 1;  
  139. tmonth--;
  140. }
  141. tday = mn[tmonth-1];
  142. if (tmonth-1 == 1 && is_leap_year(c->year)) tday += 1;
  143. r += abs(tday - day);
  144. return r;
  145. }
  146. }
  147. else
  148. {
  149. //
  150.  
  151. r = c->day;
  152. tmonth = c->month;
  153. tmonth--;
  154. while ( tmonth > 0 )
  155. {
  156. r += mn[tmonth-1];
  157. tmonth--;
  158. }
  159. tyear = c->year;
  160. tyear--;
  161. while(tyear != year && tyear > 0)
  162. {
  163. r += 364;
  164. if ( is_leap_year(tyear) == 1) r += 1;
  165. tyear--;
  166. }
  167. //
  168. tmonth = 12;
  169.  
  170. while (tmonth != month && tmonth > 0)
  171. {
  172. r += mn[tmonth-1];
  173. if (tmonth-1 == 1 && is_leap_year(c->year) ) r += 1;
  174. tmonth--;
  175. }
  176. tday = mn[tmonth-1];
  177. if (tmonth-1 == 1 && is_leap_year(c->year)) tday += 1;
  178. r += abs(tday - day);
  179.  
  180. return r;
  181. //
  182. }
  183.  
  184. return (-1);
  185. }
  186.  
  187. int diff_event(struct event_node** c)
  188. {
  189. struct event_node* iterator = *c;
  190.  
  191. // событие, с которым происходит сравнение
  192. struct _event c1;
  193. c1.day = 18;
  194. c1.month = 1;
  195. c1.year = 2013;
  196.  
  197. if (iterator == 0) return;
  198. while (iterator->next != 0)
  199. {
  200. printf("%d\n", diff_event_internal(iterator->ev, &c1));
  201. iterator  = iterator ->next;
  202. }
  203. printf("%d\n", diff_event_internal(iterator->ev, &c1));
  204. return 0;
  205. }
  206.  
  207.  
  208. // сборка мусора неавтоматическая (garbage collection unautomatic)
  209. void free_event(struct event_node** c)
  210. {
  211. struct event_node* f;
  212. struct event_node* iterator = *c;
  213. if (iterator == 0) return;
  214. while (iterator->next != 0)
  215. {
  216. f = iterator;
  217. iterator  = iterator ->next;
  218. if (f->ev->event  != 0) free(f->ev->event); f->ev->event = 0;
  219. if (f->ev != 0) free(f->ev); f->ev = 0;
  220. if (f != 0) free(f); f = 0;
  221. }
  222. if (iterator != 0) free(iterator); iterator = 0;
  223. }
  224.  
  225.  
  226.  
  227.  
  228. int main(int argc, char* argv[])
  229. {
  230. struct event_node* first;
  231. first = 0;
  232. enter_event(&first);
  233. enter_event(&first);
  234. enter_event(&first);
  235. print_event(&first);
  236. diff_event(&first);
  237. free_event(&first);
  238. return 0;
  239. }

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

Структура Историческое событие реализуется в виде массива структур _event. В данном случае, массив имеет размер 12, что соответствует количеству месяцев в году. Каждый элемент массива содержит информацию о дне, месяце и годе события, а также строку с описанием события. Для работы с этими структурами создается структура event_node, которая содержит указатель на следующую структуру event_node (для связывания структур в список) и указатель на структуру _event. Функция is_leap_year() используется для определения, является ли год високосным. Функция enter_event() добавляет новое событие в начало списка. Если список пуст, то создается новый узел списка. В противном случае, новый узел списка добавляется в начало списка. Функция print_event() выводит все события из списка на экран. Функция diff_event() вычисляет разницу между двумя событиями в днях. Если год события c1 больше года события c, то разница вычисляется в днях. Если год события c1 меньше года события c, то разница вычисляется в днях, при этом год c1 уменьшается до года c. Функция free_event() освобождает память, занятую узлами списка и структурами _event. В функции main() создается первый узел списка, затем добавляются еще два события, после чего список выводится на экран и вычисляется разница между первым и последним событиями. Затем память, занятая узлами списка и структурами _event, освобождается.

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


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

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

10   голосов , оценка 3.7 из 5

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

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

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