Advertisement
Guest User

Untitled

a guest
Nov 12th, 2019
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.48 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <locale.h>
  5.  
  6. void ustawKodowaniePolskichZnakow();
  7. int czytajLiczbeCalkowita(const char* komunikat);
  8. double czytajLiczbeRzeczywista(const char* komunikat);
  9. const char* czytajTekst(const char* komunikat);
  10. void czytaj(const char* komunikat, const char* format, const char* blad, void* rezultat);
  11. void generator(double wspolczynniki[], double dMin, double dMax, double wyniki[], int rozmiartablicy);
  12. void czytajWspolczynniki(double wspolczynniki[]);
  13. void czytajDziedzine(double* dMin, double* dMax);
  14. int czytajRozmiarTablicyWynikowej();
  15. double losowanieSzumu();
  16. void szum(double sygnalWejsciowy[], double sygnalZaszumiony[], int rozmiar);
  17. void zapiszFunkcje(double funkcja[], int rozmiar, double dMin, double dMax, const char* sciezka);
  18. int odczytajDlugoscFunkcji(const char* sciezka);
  19. double* odczytajFunkcje(const char* sciezka, double* dMin, double* dMax);
  20. double srednia(double a, double b, double c, double d, double e);
  21. void filtrSredniej(double* funkcja, int rozmiar);
  22. int porownaj(const void* x, const void* y);
  23. double mediana(double a, double b, double c, double d, double e);
  24. void filtrMedianowy(double* funkcja, int rozmiar);
  25.  
  26. int main()
  27. {
  28. double wspolczynniki[4];
  29. double* funkcja;
  30. double dMin, dMax;
  31. int rozmiar, wybor, koniec;
  32. char* sciezka;
  33. ustawKodowaniePolskichZnakow();
  34. srand(time(NULL));
  35.  
  36. dMin = 0; //domyślne wartości
  37. dMax = 10;
  38. rozmiar = 100;
  39. wspolczynniki[0] = 1; //a*sin(bx + c) + d (domyślnie po prostu sin x)
  40. wspolczynniki[1] = 1;
  41. wspolczynniki[2] = 0;
  42. wspolczynniki[3] = 0;
  43. funkcja = malloc(rozmiar * sizeof(double));
  44. generator(wspolczynniki, dMin, dMax, funkcja, rozmiar);
  45. koniec = 0;
  46.  
  47. while (!koniec)
  48. {
  49. printf("Legenda:\n");
  50. printf(" 1 <- Podanie współczynników do funkcji a*sin(bx + c) + d (domyślnie sin x)\n");
  51. printf(" 2 <- Podanie zakresu dziedziny (domyślnie zakres [0;10])\n");
  52. printf(" 3 <- Podanie długości tablicy (domyślnie 100)\n");
  53. printf(" 4 <- Generuj funkcję\n");
  54. printf(" 5 <- Zaszum funkcję\n");
  55. printf(" 6 <- Filtr medianowy\n");
  56. printf(" 7 <- Filtr średniej ruchomej\n");
  57. printf(" 8 <- Zapisanie do pliku wyników\n");
  58. printf(" 9 <- Odczytanie danych z pliku\n");
  59. printf(" 10 <- Koniec działania programu\n");
  60. wybor = czytajLiczbeCalkowita("");
  61. switch (wybor)
  62. {
  63. case 1:
  64. czytajWspolczynniki(wspolczynniki);
  65. break;
  66. case 2:
  67. czytajDziedzine(&dMin, &dMax);
  68. break;
  69. case 3:
  70. rozmiar = czytajRozmiarTablicyWynikowej();
  71. free(funkcja);
  72. funkcja = malloc(rozmiar * sizeof(double));
  73. generator(wspolczynniki, dMin, dMax, funkcja, rozmiar); // generujemy nową funkcję podczas zmiany rozmiaru
  74. break;
  75. case 4:
  76. generator(wspolczynniki, dMin, dMax, funkcja, rozmiar);
  77. break;
  78. case 5:
  79. szum(funkcja, funkcja, rozmiar);
  80. break;
  81. case 6:
  82. filtrMedianowy(funkcja, rozmiar);
  83. break;
  84. case 7:
  85. filtrSredniej(funkcja, rozmiar);
  86. break;
  87. case 8:
  88. sciezka = czytajTekst("Podaj ścieżkę do pliku: ");
  89. zapiszFunkcje(funkcja, rozmiar, dMin, dMax, sciezka);
  90. break;
  91. case 9:
  92. sciezka = czytajTekst("Podaj ścieżkę do pliku: ");
  93. funkcja = odczytajFunkcje(sciezka, &dMin, &dMax);
  94. break;
  95. case 10:
  96. koniec = 1;
  97. break;
  98. default:
  99. printf("Wybrano nieprawidłową opcję\n");
  100. }
  101. }
  102. free(funkcja);
  103. return 0;
  104. }
  105.  
  106. void ustawKodowaniePolskichZnakow()
  107. {
  108. system("chcp 1250 > nul");
  109. }
  110.  
  111. int czytajLiczbeCalkowita(const char* komunikat)
  112. {
  113. int liczba;
  114. czytaj(komunikat, "%d", "Podana wartość nie jest liczbą całkowitą", &liczba);
  115. return liczba;
  116. }
  117.  
  118. double czytajLiczbeRzeczywista(const char* komunikat)
  119. {
  120. double liczba;
  121. czytaj(komunikat, "%lf", "Podana wartość nie jest liczbą rzeczywistą", &liczba);
  122. return liczba;
  123. }
  124.  
  125. const char* czytajTekst(const char* komunikat)
  126. {
  127. static char tekst[1024];
  128. czytaj(komunikat, "%s", "Podana wartość nie jest tekstem", tekst);
  129. return tekst;
  130. }
  131.  
  132. void czytaj(const char* komunikat, const char* format, const char* blad, void* rezultat)
  133. {
  134. while (1)
  135. {
  136. printf(komunikat);
  137. if (scanf(format, rezultat) == 1)
  138. {
  139. break;
  140. }
  141. printf("%s\n", blad);
  142. fseek(stdin, 0, SEEK_END);
  143. }
  144. }
  145.  
  146. void generator(double wspolczynniki[], double dMin, double dMax, double wyniki[], int rozmiartablicy)
  147. {
  148. double krok;
  149. int i;
  150. krok = (dMax - dMin) / rozmiartablicy;
  151. i = 0;
  152. for (double x = dMin; x <= dMax; x += krok)
  153. {
  154. if (i == rozmiartablicy)
  155. {
  156. break;
  157. }
  158. //a*sin(bx + c) + d
  159. wyniki[i++] = wspolczynniki[0] * sin(wspolczynniki[1] * x + wspolczynniki[2]) + wspolczynniki[3];
  160. }
  161. }
  162.  
  163. void czytajWspolczynniki(double wspolczynniki[])
  164. {
  165. wspolczynniki[0] = czytajLiczbeRzeczywista("Podaj współczynnik a: ");
  166. wspolczynniki[1] = czytajLiczbeRzeczywista("Podaj współczynnik b: ");
  167. wspolczynniki[2] = czytajLiczbeRzeczywista("Podaj współczynnik c: ");
  168. wspolczynniki[3] = czytajLiczbeRzeczywista("Podaj współczynnik d: ");
  169. }
  170.  
  171. void czytajDziedzine(double* dMin, double* dMax)
  172. {
  173. while (1)
  174. {
  175. *dMin = czytajLiczbeRzeczywista("Podaj początek dziedziny: "); //zamienić dMin na zakres[0] a dMax na zakres[1]
  176. *dMax = czytajLiczbeRzeczywista("Podaj koniec dziedziny: ");
  177. if (*dMin < *dMax)
  178. {
  179. break;
  180. }
  181. printf("Początek dziedziny powinien być mniejszy od końca dziedziny\n");
  182. }
  183. }
  184.  
  185. int czytajRozmiarTablicyWynikowej()
  186. {
  187. int rozmiar;
  188. while (1)
  189. {
  190. rozmiar = czytajLiczbeCalkowita("Podaj rozmiar tablicy wynikowej: ");
  191. if (rozmiar > 0)
  192. {
  193. break;
  194. }
  195. printf("Rozmiar powinien być wiekszy od zera\n");
  196. }
  197. return rozmiar;
  198. }
  199.  
  200. double losowanieSzumu()
  201. {
  202. double n;
  203. n = (double)rand() / (double)RAND_MAX; //losownie liczby [0,1]
  204. return n * 2.0 - 1.0; //zamiana przedziału na [-1,1]
  205. }
  206.  
  207. void szum(double sygnalWejsciowy[], double sygnalZaszumiony[], int rozmiar)
  208. {
  209. int i;
  210. double n;
  211. n = 0.0;
  212. for (i = 0; i < rozmiar; i++)
  213. {
  214. if (rand() % 2 == 0)
  215. {
  216. n = losowanieSzumu();
  217. }
  218. sygnalZaszumiony[i] = sygnalWejsciowy[i] + n;
  219. }
  220. }
  221.  
  222. void zapiszFunkcje(double funkcja[], int rozmiar, double dMin, double dMax, const char* sciezka)
  223. {
  224. FILE* plik;
  225. int i;
  226. double krok;
  227. plik = fopen(sciezka, "wb");
  228. //setlocale(LC_ALL, "polish_poland"); //robi przecinki zamiast kropek w pliku
  229. if (plik == NULL)
  230. {
  231. return;
  232. }
  233. krok = (dMax - dMin) / rozmiar;
  234. i = 0;
  235. for (double x = dMin; x <= dMax; x += krok)
  236. {
  237. if (i == rozmiar)
  238. {
  239. break;
  240. }
  241. fprintf(plik, "%lf;%lf\n", x, funkcja[i++]);
  242. }
  243. fclose(plik);
  244. }
  245.  
  246. int odczytajDlugoscFunkcji(const char* sciezka)
  247. {
  248. FILE* plik;
  249. int dlugosc;
  250. double x, y;
  251. plik = fopen(sciezka, "rb");
  252. if (plik == NULL)
  253. {
  254. return -1; // też może być return 0;
  255. }
  256. dlugosc = 0;
  257. while (1)
  258. {
  259. if (fscanf(plik, "%lf;%lf", &x, &y) != 2) // bo jeden lf to 1, więc gdy jakiś nie spełniony (różne od 2) to break
  260. {
  261. break;
  262. }
  263. dlugosc++;
  264. }
  265. fclose(plik);
  266. return dlugosc;
  267. }
  268.  
  269. double* odczytajFunkcje(const char* sciezka, double* dMin, double* dMax)
  270. {
  271. FILE* plik;
  272. int dlugosc, i;
  273. double x, y;
  274. double* funkcja;
  275. plik = fopen(sciezka, "rb");
  276. if (plik == NULL)
  277. {
  278. return NULL;
  279. }
  280. dlugosc = odczytajDlugoscFunkcji(sciezka);
  281. funkcja = (double*)malloc(dlugosc * sizeof(double));
  282. i = 0;
  283. while (1)
  284. {
  285. if (fscanf(plik, "%lf;%lf", &x, &y) != 2)
  286. {
  287. break;
  288. }
  289. funkcja[i] = y;
  290. *dMax = x;
  291. if (i == 0)
  292. {
  293. *dMin = x;
  294. }
  295. i++;
  296. }
  297. fclose(plik);
  298. return funkcja;
  299. }
  300.  
  301. /*double medianaPieciuElementow(double a, double b, double c, double d, double e)
  302. {
  303. double x[5];
  304. x[0] = a;
  305. x[1] = b;
  306. x[2] = c;
  307. x[3] = d;
  308. x[4] = e;
  309. double temp;
  310. int i, j;
  311. for (i = 0; i < 4; i++) {
  312. for (j = i + 1; j < 5; j++) {
  313. if (x[j] < x[i]) {
  314. temp = x[i];
  315. x[i] = x[j];
  316. x[j] = temp;
  317. }
  318. }
  319. }
  320. return x[2];
  321. }*/
  322.  
  323. double srednia(double a, double b, double c, double d, double e)
  324. {
  325. return (a + b + c + d + e) / 5.0;
  326. }
  327. // funkcja Mean zwraca średnią arytmetyczną z pięciu wartości
  328.  
  329. void filtrSredniej(double* funkcja, int rozmiar)
  330. {
  331. double a, b, c, d, e;
  332. int i;
  333. for (i = 0; i < (rozmiar - 5); i++)
  334. {
  335. a = funkcja[i];
  336. b = funkcja[i + 1];
  337. c = funkcja[i + 2];
  338. d = funkcja[i + 3];
  339. e = funkcja[i + 4];
  340.  
  341. funkcja[i + 2] = srednia(a, b, c, d, e);
  342. }
  343. }
  344. // funkcja filtrSredniej środkowemu elementowi tablicy przypisuje średnią wartości a,b,c,d,e
  345.  
  346. int porownaj(const void* x, const void* y)
  347. {
  348. double i, j, k;
  349.  
  350. i = *(double*)x; // pierwsza gwiazdka - dereferencja, czyli pobranie wartości spod danego adresu
  351. // druga gwiazdka - rzutowanie wskaźnika void na wskaźnik double
  352. j = *(double*)y; // analogicznie
  353. k = i - j;
  354. if (k == 0)
  355. {
  356. return 0;
  357. }
  358. if (k < 0)
  359. {
  360. return -1;
  361. }
  362. return 1; // jeżeli zwrócona wartość z Compare jest dodatnia to qsort przestawia elementy tablicy
  363. // w przeciwnym wypadku zostawia je tak jak było (czy mamy zero, czy wartość ujemną)
  364. }
  365.  
  366. double mediana(double a, double b, double c, double d, double e)
  367. {
  368. double t[] = { a, b, c, d, e };
  369.  
  370. qsort(t, 5, sizeof(double), porownaj);
  371.  
  372. return t[2];
  373. }
  374. // funkcja mediana zwraca medianę
  375. // qsort na podstawie porównania (Compare) sortuje każde kolejne pięć elementów tablicy
  376. // i wyłania medianę
  377.  
  378. void filtrMedianowy(double* funkcja, int rozmiar)
  379. {
  380. double a, b, c, d, e;
  381. int i;
  382. for (i = 0; i < rozmiar - 5; i++)
  383. {
  384. a = funkcja[i];
  385. b = funkcja[i + 1];
  386. c = funkcja[i + 2];
  387. d = funkcja[i + 3];
  388. e = funkcja[i + 4];
  389.  
  390. funkcja[i + 2] = mediana(a, b, c, d, e);
  391. }
  392. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement