Advertisement
Guest User

Untitled

a guest
Mar 28th, 2020
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.99 KB | None | 0 0
  1. #pragma warning (disable : 4996)
  2.  
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6. #include <malloc.h>
  7.  
  8. struct pomiar {
  9. unsigned int nr_pomiaru;
  10. unsigned int nr_czujnika;
  11. char data_i_czas[20];
  12. double temp;
  13. struct pomiar *next = NULL;
  14. struct pomiar *previous = NULL;
  15. };
  16.  
  17. struct glowyList
  18. {
  19. pomiar *pomiar1[4] = { NULL };
  20. };
  21.  
  22. pomiar* plik(char nazwa[]);
  23. void ilePomiarow(pomiar* head);
  24. glowyList utworzenieList(pomiar* head);
  25. void zwolnieniePamieci(pomiar *head);
  26.  
  27. pomiar* plik(char nazwa[])
  28. {
  29. FILE* plik;
  30. // otwarcie pliku
  31. if ((plik = fopen(nazwa, "r")) == NULL)
  32. {
  33. printf("Nie moge otworzyc pliku\n");
  34. exit(0);
  35. }
  36. unsigned int nr_pomiaru;
  37. unsigned int nr_czujnika;
  38. char data_i_czas[20];
  39. double temp;
  40. pomiar *head = NULL, *wsk = NULL;
  41. // uzupelnienie głównej listy
  42. while ((fscanf(plik, "%u %u %s %lf", &nr_pomiaru, &nr_czujnika, data_i_czas, &temp)) == 4)
  43. {
  44. if (head == NULL)
  45. {
  46. wsk = head = (pomiar*)malloc(sizeof(pomiar));
  47. }
  48. else
  49. {
  50. wsk = wsk->next = (pomiar*)malloc(sizeof(pomiar));
  51. }
  52. wsk->nr_pomiaru = nr_pomiaru;
  53. wsk->nr_czujnika = nr_czujnika;
  54. strcpy(wsk->data_i_czas, data_i_czas);
  55. wsk->temp = temp;
  56. wsk->next = NULL;
  57. }
  58. fclose(plik);
  59. if (head == NULL)
  60. {
  61. return NULL;
  62. }
  63. return head;
  64. }
  65.  
  66. void ilePomiarow(pomiar* head)
  67. {
  68. if (head != NULL)
  69. {
  70. int ile = 1; // liczba pomiarow zapisanych w liscie
  71. pomiar *wsk = NULL;
  72. wsk = head;
  73. printf("Pierwszy element listy:\n%u %u %s %.2lf\n", wsk->nr_pomiaru, wsk->nr_czujnika, wsk->data_i_czas, wsk->temp);
  74. while (wsk->next!= NULL)
  75. {
  76. ++ile;
  77. wsk = wsk->next;
  78. }
  79. printf("Ostatni element listy:\n%u %u %s %.2lf\n", wsk->nr_pomiaru, wsk->nr_czujnika, wsk->data_i_czas, wsk->temp);
  80. printf("W liscie zapisanych jest %d pomiarow\n\n", ile);
  81. }
  82. else
  83. {
  84. printf("Brak pomiarow\n");
  85. }
  86. }
  87.  
  88. glowyList utworzenieList(pomiar* head)
  89. {
  90. int i;
  91. glowyList Listy;
  92. pomiar *wsk = head;
  93. pomiar *glowy[4] = { NULL };
  94. pomiar *wsk2[4] = { NULL };
  95. //skopiowanie wskaźników z listy głównej do 4 wyjściowych
  96. while (wsk != NULL)
  97. {
  98. if (wsk->nr_czujnika == 1)
  99. {
  100. i = 0;
  101. if (glowy[i] == NULL)
  102. {
  103. wsk2[i] = glowy[i] = (pomiar*)malloc(sizeof(pomiar));
  104. }
  105. else
  106. {
  107. wsk2[i] = wsk2[i]->next = (pomiar*)malloc(sizeof(pomiar));
  108. }
  109. wsk2[i]->nr_pomiaru = wsk->nr_pomiaru;
  110. wsk2[i]->nr_czujnika = wsk->nr_czujnika;
  111. strcpy(wsk2[i]->data_i_czas, wsk->data_i_czas);
  112. wsk2[i]->temp = wsk->temp;
  113. wsk2[i]->next = NULL;
  114. wsk = wsk->next;
  115. }
  116. else if (wsk->nr_czujnika == 2)
  117. {
  118. i = 1;
  119. if (glowy[i] == NULL)
  120. {
  121. wsk2[i] = glowy[i] = (pomiar*)malloc(sizeof(pomiar));
  122. }
  123. else
  124. {
  125. wsk2[i] = wsk2[i]->next = (pomiar*)malloc(sizeof(pomiar));
  126. }
  127. wsk2[i]->nr_pomiaru = wsk->nr_pomiaru;
  128. wsk2[i]->nr_czujnika = wsk->nr_czujnika;
  129. strcpy(wsk2[i]->data_i_czas, wsk->data_i_czas);
  130. wsk2[i]->temp = wsk->temp;
  131. wsk2[i]->next = NULL;
  132. wsk = wsk->next;
  133. }
  134. else if (wsk->nr_czujnika == 3)
  135. {
  136. i = 2;
  137. if (glowy[i] == NULL)
  138. {
  139. wsk2[i] = glowy[i] = (pomiar*)malloc(sizeof(pomiar));
  140. }
  141. else
  142. {
  143. wsk2[i] = wsk2[i]->next = (pomiar*)malloc(sizeof(pomiar));
  144. }
  145. wsk2[i]->nr_pomiaru = wsk->nr_pomiaru;
  146. wsk2[i]->nr_czujnika = wsk->nr_czujnika;
  147. strcpy(wsk2[i]->data_i_czas, wsk->data_i_czas);
  148. wsk2[i]->temp = wsk->temp;
  149. wsk2[i]->next = NULL;
  150. wsk = wsk->next;
  151. }
  152. else if (wsk->nr_czujnika == 4)
  153. {
  154. i = 3;
  155. if (glowy[i] == NULL)
  156. {
  157. wsk2[i] = glowy[i] = (pomiar*)malloc(sizeof(pomiar));
  158. }
  159. else
  160. {
  161. wsk2[i] = wsk2[i]->next = (pomiar*)malloc(sizeof(pomiar));
  162. }
  163. wsk2[i]->nr_pomiaru = wsk->nr_pomiaru;
  164. wsk2[i]->nr_czujnika = wsk->nr_czujnika;
  165. strcpy(wsk2[i]->data_i_czas, wsk->data_i_czas);
  166. wsk2[i]->temp = wsk->temp;
  167. wsk2[i]->next = NULL;
  168. wsk = wsk->next;
  169. }
  170. else
  171. {
  172. wsk = wsk->next;
  173. }
  174. for (int i = 0; i < 4; ++i)
  175. {
  176. Listy.pomiar1[i] = glowy[i];
  177. }
  178. }
  179. return Listy;
  180. }
  181.  
  182. pomiar* najwyzszaTemperatura(pomiar* pomiar1)
  183. {
  184. double max = INT_MIN;
  185. pomiar* wsk1 = pomiar1, *tempMax = pomiar1;
  186. while (wsk1 != NULL)
  187. {
  188. if (wsk1->temp > max)
  189. {
  190. max = wsk1->temp;
  191. tempMax = wsk1;
  192. }
  193. wsk1 = wsk1->next;
  194. }
  195. printf("Najwyzsza temperatura zanotowana za pomoca %d czujnika wynosi %lf stopni Celsjusza, zanotowano ja %s byl to %d pomiar\n", tempMax->nr_czujnika, tempMax->temp, tempMax->data_i_czas, tempMax->nr_pomiaru);
  196. // dolaczenie elementu listy przed glowe
  197. pomiar* pomiar2 = (pomiar*)malloc(sizeof(pomiar));
  198. pomiar2->nr_pomiaru = tempMax->nr_pomiaru;
  199. pomiar2->nr_czujnika = tempMax->nr_czujnika;
  200. strcpy(pomiar2->data_i_czas, tempMax->data_i_czas);
  201. pomiar2->temp = tempMax->temp;
  202. pomiar2->next = pomiar1;
  203. return pomiar2;
  204. }
  205.  
  206. void zwolnieniePamieci(pomiar *head)
  207. {
  208. pomiar *wsk = head;
  209. while (wsk != NULL)
  210. {
  211. wsk = wsk->next;
  212. free(head);
  213. head = wsk;
  214. }
  215. }
  216.  
  217. pomiar* listaDwukierunkowa(pomiar* pomiar1)
  218. {
  219. pomiar *wsk = pomiar1;
  220. pomiar *glowa = NULL, *wskg = NULL;
  221. while (wsk != NULL)
  222. {
  223. if (glowa == NULL)
  224. {
  225. wskg = glowa = (pomiar*)malloc(sizeof(pomiar));
  226. wskg->previous = NULL;
  227. }
  228. else
  229. {
  230. wskg->next = (pomiar*)malloc(sizeof(pomiar));
  231. wskg->next->previous = wskg;
  232. wskg = wskg->next;
  233. }
  234. wskg->nr_czujnika = wsk->nr_czujnika;
  235. wskg->nr_pomiaru = wsk->nr_pomiaru;
  236. wskg->temp = wsk->temp;
  237. strcpy(wskg->data_i_czas, wsk->data_i_czas);
  238. wsk = wsk->next;
  239. }
  240. return glowa;
  241. }
  242.  
  243. int main()
  244. {
  245. char nazwa[40] = "pomiary.txt";
  246. pomiar *head = NULL, *wsk = NULL;
  247. head = plik(nazwa);
  248. printf("Glowna lista:\n\n");
  249. ilePomiarow(head);
  250. glowyList Listy = utworzenieList(head);
  251. // zwolnienie pamięci głownej listy
  252. zwolnieniePamieci(head);
  253. // alokacja tablicy dwukierunkowej
  254. pomiar *dwukierunkowa = NULL;
  255. dwukierunkowa = listaDwukierunkowa(Listy.pomiar1[0]);
  256. // wypisanie informacji o listach
  257. int i = 0;
  258. printf("Pierwsza Lista:\n\n");
  259. ilePomiarow(Listy.pomiar1[i]);
  260. printf("Druga Lista:\n\n");
  261. ilePomiarow(Listy.pomiar1[++i]);
  262. printf("Trzecia Lista:\n\n");
  263. ilePomiarow(Listy.pomiar1[++i]);
  264. printf("Czwarta Lista:\n\n");
  265. ilePomiarow(Listy.pomiar1[++i]);
  266. printf("Pierwsza Lista(lista dwukierunkowa)\n");
  267. ilePomiarow(dwukierunkowa);
  268. // dodanie elementu listy na poczatek
  269. for (i = 0; i < 4; ++i)
  270. {
  271. Listy.pomiar1[i] = najwyzszaTemperatura(Listy.pomiar1[i]);
  272. }
  273. dwukierunkowa = najwyzszaTemperatura(dwukierunkowa);
  274. // ponowne wypisanie informacji o listach
  275. i = 0;
  276. printf("\nPierwsza Lista po zmianie:\n\n");
  277. ilePomiarow(Listy.pomiar1[i]);
  278. printf("Druga Lista po zmianie:\n\n");
  279. ilePomiarow(Listy.pomiar1[++i]);
  280. printf("Trzecia Lista po zmianie:\n\n");
  281. ilePomiarow(Listy.pomiar1[++i]);
  282. printf("Czwarta Lista po zmianie:\n\n");
  283. ilePomiarow(Listy.pomiar1[++i]);
  284. printf("Pierwsza Lista(lista dwukierunkowa) po zmianie\n");
  285. ilePomiarow(dwukierunkowa);
  286. // zwolnienie pamięci 4 list
  287. for (int i = 0; i < 4; ++i)
  288. {
  289. zwolnieniePamieci(Listy.pomiar1[i]);
  290. }
  291. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement