Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2020
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.55 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <locale.h>
  5. #include <string.h>
  6.  
  7. #define DLUGOSC_TEKSTU 64
  8.  
  9. struct Kontakt
  10. {
  11. char imie[DLUGOSC_TEKSTU];
  12. char nazwisko[DLUGOSC_TEKSTU];
  13. char numer[DLUGOSC_TEKSTU];
  14. char grupa[DLUGOSC_TEKSTU];
  15. };
  16. typedef struct Kontakt Kontakt;
  17.  
  18. struct Element
  19. {
  20. Kontakt kontakt;
  21. struct Element* poprzedni;
  22. struct Element* nastepny;
  23. };
  24. typedef struct Element Element;
  25.  
  26. struct Lista
  27. {
  28. Element* glowa;
  29. Element* ogon;
  30. int rozmiar;
  31. };
  32. typedef struct Lista Lista;
  33.  
  34. void ustawKodowaniePolskichZnakow();
  35. int czytajLiczbeCalkowita(const char* komunikat);
  36. const char* czytajTekst(const char* komunikat);
  37. const char* czytajNazwePliku(const char* komunikat, const char* rozszerzenie);
  38. void czytaj(const char* komunikat, const char* format, const char* blad, void* rezultat);
  39. void listaInicjalizuj(Lista* lista);
  40. void listaZwolnij(Lista* lista);
  41. void listaDodajNaPoczatek(Lista* lista, Kontakt* kontakt);
  42. void listaDodajNaKoniec(Lista* lista, Kontakt* kontakt);
  43. void listaWypisz(Lista* lista);
  44. int listaUsun(Lista* lista, int indeks);
  45. Element* listaPobierzElement(Lista* lista, int indeks);
  46. int listaWstaw(Lista* lista, Kontakt* kontakt, int indeks);
  47. int listaWczytaj(const char* nazwaPliku, Lista* lista);
  48.  
  49. main()
  50. {
  51. int wybor, koniec;
  52. char* sciezka;
  53. Lista lista;
  54. Kontakt kontakt;
  55. ustawKodowaniePolskichZnakow();
  56. koniec = 0;
  57. listaInicjalizuj(&lista);
  58.  
  59. while (!koniec)
  60. {
  61. printf("Legenda:\n");
  62. printf(" 1 <- Wczytaj kontakty\n");
  63. printf(" 2 <- Wyświetl kontakty\n");
  64. printf(" 3 <- \n");
  65. printf(" 4 <- \n");
  66. printf(" 5 <- \n");
  67. printf(" 6 <- \n");
  68. printf(" 7 <- \n");
  69. printf(" 8 <- \n");
  70. printf(" 9 <- \n");
  71. printf(" 10 <- \n");
  72. printf(" 0 <- Koniec działania programu\n");
  73. wybor = czytajLiczbeCalkowita("");
  74. switch (wybor)
  75. {
  76. case 0:
  77. koniec = 1;
  78. break;
  79. case 1:
  80. sciezka = czytajNazwePliku("Podaj nazwę pliku: ", ".csv");
  81. listaZwolnij(&lista);
  82. if (!listaWczytaj(sciezka, &lista))
  83. {
  84. printf("Nie udało się wczytać pliku\n");
  85. }
  86. break;
  87. case 2:
  88. listaWypisz(&lista);
  89. break;
  90. }
  91. }
  92. }
  93.  
  94. void ustawKodowaniePolskichZnakow()
  95. {
  96. system("chcp 1250 > nul");
  97. }
  98.  
  99. int czytajLiczbeCalkowita(const char* komunikat)
  100. {
  101. int liczba;
  102. czytaj(komunikat, "%d", "Podana wartość nie jest liczbą całkowitą", &liczba);
  103. return liczba;
  104. }
  105.  
  106. const char* czytajTekst(const char* komunikat)
  107. {
  108. static char tekst[1024];
  109. czytaj(komunikat, "%s", "Podana wartość nie jest tekstem", tekst);
  110. return tekst;
  111. }
  112.  
  113. const char* czytajNazwePliku(const char* komunikat, const char* rozszerzenie)
  114. {
  115. const char* nazwaPliku;
  116. nazwaPliku = czytajTekst(komunikat);
  117. if (strstr(nazwaPliku, rozszerzenie) == NULL)
  118. {
  119. strcat(nazwaPliku, rozszerzenie);
  120. }
  121. return nazwaPliku;
  122. }
  123.  
  124. void czytaj(const char* komunikat, const char* format, const char* blad, void* rezultat)
  125. {
  126. while (1)
  127. {
  128. printf(komunikat);
  129. if (scanf(format, rezultat) == 1)
  130. {
  131. break;
  132. }
  133. printf("%s\n", blad);
  134. fseek(stdin, 0, SEEK_END);
  135. }
  136. }
  137.  
  138. void listaInicjalizuj(Lista* lista)
  139. {
  140. lista->glowa = NULL;
  141. lista->ogon = NULL;
  142. lista->rozmiar = 0;
  143. }
  144.  
  145. void listaZwolnij(Lista* lista)
  146. {
  147. Element* p, * t;
  148. p = lista->glowa;
  149. while (p != NULL)
  150. {
  151. t = p->nastepny;
  152. free(p);
  153. p = t;
  154. }
  155. lista->glowa = NULL;
  156. lista->ogon = NULL;
  157. lista->rozmiar = 0;
  158. }
  159.  
  160. void listaDodajNaPoczatek(Lista* lista, Kontakt* kontakt) //wpisałem po zajęciach
  161. {
  162. Element* p;
  163. p = malloc(sizeof(Element));
  164. p->kontakt = *kontakt;
  165. p->poprzedni = NULL;
  166. p->nastepny = lista->glowa;
  167. lista->glowa = p;
  168. lista->rozmiar++;
  169. if (p->nastepny != NULL)
  170. {
  171. p->nastepny->poprzedni = p;
  172. }
  173. else
  174. {
  175. lista->ogon = p;
  176. }
  177. }
  178.  
  179. void listaDodajNaKoniec(Lista* lista, Kontakt* kontakt)
  180. {
  181. Element* p;
  182. p = malloc(sizeof(Element));
  183. p->kontakt = *kontakt;
  184. p->nastepny = NULL;
  185. p->poprzedni = lista->ogon;
  186. lista->ogon = p;
  187. lista->rozmiar++;
  188. if (p->poprzedni != NULL)
  189. {
  190. p->poprzedni->nastepny = p;
  191. }
  192. else
  193. {
  194. lista->glowa = p;
  195. }
  196. }
  197.  
  198. void listaWypisz(Lista* lista)
  199. {
  200. Element* p;
  201. p = lista->glowa;
  202. while (p != NULL)
  203. {
  204. printf("%s %s %s %s\n", p->kontakt.imie, p->kontakt.nazwisko, p->kontakt.numer, p->kontakt.grupa);
  205. p = p->nastepny;
  206. }
  207. }
  208.  
  209. int listaUsun(Lista* lista, int indeks)
  210. {
  211. Element* p;
  212. p = listaPobierzElement(lista, indeks);
  213. if (p != NULL)
  214. {
  215. lista->rozmiar--;
  216. if (p->poprzedni != NULL)
  217. {
  218. p->poprzedni->nastepny = p->nastepny;
  219. }
  220. else
  221. {
  222. lista->glowa = p->nastepny;
  223. }
  224. if (p->nastepny != NULL)
  225. {
  226. p->nastepny->poprzedni = p->poprzedni;
  227. }
  228. else
  229. {
  230. lista->ogon = p->poprzedni;
  231. }
  232. free(p);
  233. return 1;
  234. }
  235. return 0;
  236. }
  237.  
  238. Element* listaPobierzElement(Lista* lista, int indeks)
  239. {
  240. Element* p;
  241. if (indeks >= 0 && indeks < lista->rozmiar)
  242. {
  243. p = lista->glowa;
  244. while (indeks-- > 0)
  245. {
  246. p = p->nastepny;
  247. }
  248. return p;
  249. }
  250. return NULL;
  251. }
  252.  
  253. int listaWstaw(Lista* lista, Kontakt* kontakt, int indeks)
  254. {
  255. Element* e, * p;
  256. e = listaPobierzElement(lista, indeks);
  257. if (e != NULL)
  258. {
  259. if (e == lista->glowa)
  260. {
  261. listaDodajNaPoczatek(lista, kontakt);
  262. }
  263. else
  264. {
  265. p = malloc(sizeof(Element));
  266. p->kontakt = *kontakt;
  267. p->nastepny = e;
  268. p->poprzedni = e->poprzedni;
  269. e->poprzedni->nastepny = p;
  270. e->poprzedni = p;
  271. lista->rozmiar++;
  272. }
  273. return 1;
  274. }
  275. return 0;
  276. }
  277.  
  278. int listaWczytaj(const char* nazwaPliku, Lista* lista)
  279. {
  280. FILE* plik;
  281. Kontakt kontakt;
  282. char linia[512];
  283. char* token;
  284.  
  285. plik = fopen(nazwaPliku, "rb");
  286. if (plik != NULL)
  287. {
  288. // WCZYTAJ KOLEJNĄ LINIĘ
  289. while (fgets(linia, sizeof(linia), plik) != NULL)
  290. {
  291. // WSTAW ZERO KOŃCZĄCE ZAMIAST ZNAKU NOWEGO WIERSZA '\n'
  292. linia[strlen(linia) - 1] = '\0';
  293.  
  294. // CZYTAMY PIERWSZY TOKEN (IMIĘ)
  295. if ((token = strtok(linia, ";")) != NULL)
  296. {
  297. // imie <= token
  298. strcpy(kontakt.imie, token);
  299. }
  300. else
  301. {
  302. return 0;
  303. }
  304.  
  305. // CZYTAMY DRUGI TOKEN (NAZWISKO)
  306. if ((token = strtok(NULL, ";")) != NULL)
  307. {
  308. strcpy(kontakt.nazwisko, token);
  309. }
  310. else
  311. {
  312. return 0;
  313. }
  314.  
  315. // TRZECI
  316. if ((token = strtok(NULL, ";")) != NULL)
  317. {
  318. strcpy(kontakt.numer, token);
  319. }
  320. else
  321. {
  322. return 0;
  323. }
  324.  
  325. // CZWARTY
  326. if ((token = strtok(NULL, ";")) != NULL)
  327. {
  328. strcpy(kontakt.grupa, token);
  329. }
  330. else
  331. {
  332. return 0;
  333. }
  334.  
  335. // DODAJEMY SPARSOWANY (PRZETWORZONY) KONTAKT NA KONIEC LISTY
  336. listaDodajNaKoniec(lista, &kontakt);
  337. }
  338. fclose(plik);
  339. return 1;
  340. }
  341. return 0;
  342. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement