Advertisement
Guest User

Untitled

a guest
Nov 12th, 2019
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.13 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <WCHAR.h>
  4. #include <math.h>
  5. #include <stdlib.h>
  6. #include <time.h>
  7. #include <locale.h>
  8.  
  9.  
  10. double funkcja (double *wspolczynnik, double x)
  11. {
  12. return (wspolczynnik[0] / wspolczynnik[1]) * sin(wspolczynnik[2] * (x - wspolczynnik[3]));
  13. }
  14.  
  15. void dziedzina(double *xmin, double *xmax)
  16. {
  17. int wybor=0;
  18. double* pom;
  19. printf("Podaj poczatek twojej dziedziny: ");
  20. scanf_s("%lf", xmin);
  21. printf("Podaj koniec twojej dziedziny: ");
  22. scanf_s("%lf", xmax);
  23.  
  24. if (*xmin > *xmax)
  25.  
  26. {
  27. printf("podales zle dziedzine poczatek przedzialu nie moze byc wiekszy niz koniec!\n");
  28. printf("masz dwie mozliwosci do wyboru\n");
  29. printf("1. Zamien wartosc minimum i maksimum\n");
  30. printf("2. Podaj dziedzine jeszcze raz\n ");
  31. scanf_s("%d", &wybor);
  32. switch (wybor)
  33. {
  34. case 1:
  35. pom = xmin;
  36. xmin = xmax;
  37. xmax = pom;
  38. printf("twoja dziedzina teraz jest od %lf do %lf\n", *xmin, *xmax);
  39.  
  40. break;
  41. case 2:
  42. printf("Podaj poczatek twojej dziedziny: ");
  43. scanf_s("%lf", xmin);
  44. printf("Podaj koniec twojej dziedziny: ");
  45. scanf_s("%lf", xmax);
  46. break;
  47.  
  48. default:
  49. if (wybor != 1 && wybor != 2)
  50. {
  51. printf("wybrales opcje ktora nie istnieje w menu\n");
  52. printf("sproboj jeszcze raz\n");
  53. scanf_s("%d", &wybor);
  54. }
  55. break;
  56. }
  57.  
  58. }
  59.  
  60.  
  61. }
  62.  
  63. void wspolczynniki(double *tab)
  64. {
  65. printf("podaj wspolczynnik A:\n");
  66. scanf_s("%lf", &tab[0]);
  67. printf("podaj wspolczynnik B:\n");
  68. scanf_s("%lf", &tab[1]);
  69. if(tab[1]==0)
  70. {
  71. printf("nie mozna dzielic przez 0, popraw!\n");
  72. printf("podaj wspolczynnik B jeszcze raz:\n");
  73. scanf_s("%lf", &tab[1]);
  74.  
  75. }
  76. printf("podaj wspolczynnik C:\n");
  77. scanf_s("%lf", &tab[2]);
  78. printf("podaj wspolczynnik D:\n");
  79. scanf_s("%lf", &tab[3]);
  80.  
  81. }
  82.  
  83. void generuj(double *wspolczynnik, double max, double min, double *tab_wynik, int wielkosc)
  84. {
  85. double skalowanie = (max - min + 1) / (double)wielkosc;
  86.  
  87. for (int i = 0; i < wielkosc; i++)
  88. {
  89. double x = min + skalowanie * (double)i;
  90. double y = funkcja(wspolczynnik, x);
  91. tab_wynik[i] = y;
  92. printf("%lf\n", tab_wynik[i]);
  93.  
  94.  
  95. }
  96. }
  97.  
  98. void zaszum(double* tab_zaszum, double* tab_sygnal, int rozmiar)
  99. {
  100.  
  101. for (int i = 0; i < rozmiar; i++)
  102. {
  103. int x = rand() % (100 +1);
  104. if (x <= 27)
  105. {
  106.  
  107. double k = (rand() % 100) - 50;
  108.  
  109. double szu = k * 1.0 / 1000.0;
  110. tab_zaszum[i] = tab_sygnal[i] + szu;
  111.  
  112. }
  113. else
  114. tab_zaszum[i] = tab_sygnal[i];
  115.  
  116. }
  117. }
  118.  
  119. void zapisz_do_pliku(double* tab_sygnal, int rozmiar)
  120. {
  121. FILE* plik;
  122. plik = fopen("sygnal.CSV", "w");
  123. if (plik == NULL)
  124. {
  125. printf("nie udalo sie");
  126. return;
  127. }
  128. for (int i = 0; i < rozmiar; i++)
  129. {
  130. fprintf(plik, "%lf\n", tab_sygnal[i]);
  131. }
  132. fclose(plik);
  133. }
  134.  
  135. double* odczyt_z_pliku(char* nazwa_pliku, int* rozmiar_tabicy)
  136. {
  137. FILE* plik;
  138. plik = fopen(nazwa_pliku, "r");
  139. if (plik == NULL)
  140. {
  141. printf("nie udalo sie");
  142. return;
  143. }
  144. int c;
  145. int licznik=0;
  146. while ((c=fgetc(plik)) != EOF)
  147. {
  148. if (c == '\n')
  149. licznik++;
  150.  
  151. }
  152. double* tab = (double*)malloc(licznik * sizeof(double));
  153. fseek(plik, 0, SEEK_SET);
  154. for (int i = 0; i < licznik; i++)
  155. {
  156. fscanf(plik, "%lf\n", &tab[i]);
  157. }
  158.  
  159. for (int i = 0; i < licznik; i++)
  160. {
  161. printf("%lf\n", tab[i]);
  162. }
  163.  
  164. *rozmiar_tabicy = licznik;
  165. return tab;
  166. }
  167.  
  168. void mediana(double* tab_zaszum, double* tab_odszum, int wielkosc_tablicy)
  169. {
  170. for (int i = 0; i < wielkosc_tablicy; i++)
  171. {
  172. if (i >= 2 && i < wielkosc_tablicy - 2)
  173. {
  174. //1. przekopiuj 5 ele do okna
  175. //2. B¹belik !
  176. //3. zapisz mediane
  177.  
  178. double okno[5];
  179. int poczind=i-2;
  180. for (int j = 0; j < 5; j++)
  181. {
  182. okno[j] = tab_zaszum[poczind];
  183. poczind++;
  184. }
  185.  
  186. //2.bubble sort
  187. for (int z = 0; z < 5; z++)
  188. {
  189. for (int l = 0; l < 4; l++)
  190. {
  191. if (okno[l] > okno[l + 1])
  192. {
  193. double temp;
  194. temp = okno[l];
  195. okno[l] = okno[l + 1];
  196. okno[l + 1] = temp;
  197.  
  198.  
  199. }
  200. }
  201. }
  202.  
  203. tab_odszum[i] = okno[2];
  204.  
  205.  
  206.  
  207.  
  208.  
  209. }
  210. tab_odszum[i] = tab_zaszum[i];
  211. }
  212. }
  213.  
  214. void srednia(double* tab_zaszum, double* tab_odszum, int wielkosc_tablicy)
  215. {
  216. for (int i = 0; i < wielkosc_tablicy; i++)
  217. {
  218. if (i >= 2 && i < wielkosc_tablicy - 2)
  219. {
  220. double suma = 0;
  221. for (int k = -2; k < 3; k++)
  222. {
  223. suma += tab_zaszum[i + k];
  224. }
  225.  
  226.  
  227. tab_odszum[i] = suma / 5.0;
  228. }
  229. tab_odszum[i] = tab_zaszum[i];
  230. }
  231.  
  232. }
  233.  
  234. int main()
  235. {
  236. double xmax, xmin;
  237. double wspolczynnik[4];
  238. int wielkosc_tablicy=0;
  239. int liczba=0;
  240. srand(time(NULL)); //inicjalizacja losowych liczb
  241.  
  242. double* tab_sygnal = NULL;
  243.  
  244.  
  245. double* tab_wynik = (double*)malloc(wielkosc_tablicy * sizeof(double));
  246. double* tab_zaszum_wyniki = (double*)malloc(wielkosc_tablicy * sizeof(double));
  247. double* odczytana_tab = NULL;
  248. double* odszumiona = malloc(wielkosc_tablicy * sizeof(double));
  249. while(1)
  250. {
  251. printf("menu:\n");
  252. printf("1. genreuj funkcje.\n");
  253. printf("2. zaszum funkcje.\n");
  254. printf("3. zapisz funkcje do pliku.\n");
  255. printf("4. odczytaj fukncje z istniejacego juz pliku.\n");
  256. printf("5. odfiltruj funkcje filtrem medianowym.\n");
  257. printf("6. odfiltruj funkcje filtrem srednia.\n");
  258. printf("7. zakoncz.\n");
  259.  
  260. scanf_s("%d", &liczba);
  261. switch (liczba)
  262. {
  263. case 1:
  264.  
  265. if (tab_sygnal != NULL)
  266. free(tab_sygnal);
  267. tab_sygnal = malloc(wielkosc_tablicy * sizeof(double));
  268.  
  269. printf("funkcja: y(x)= a/b*sin(c*(x-d))\n");
  270. wspolczynniki(wspolczynnik);
  271. printf("%lf %lf %lf %lf\n", wspolczynnik[0], wspolczynnik[1], wspolczynnik[2], wspolczynnik[3]);
  272.  
  273. dziedzina(&xmin, &xmax);
  274.  
  275.  
  276. printf("podaj wielkosc twojej funkcji: ");
  277. scanf_s("%d", &wielkosc_tablicy);
  278. if (wielkosc_tablicy < 0)
  279. {
  280. printf("wielkosc tablicy nie moze byc liczba ujemna, sprobuj podac jeszcze raz:\n");
  281. scanf_s("%d", &wielkosc_tablicy);
  282. printf("aktualna wielkosc twojej funkcji wynosi: %d ", wielkosc_tablicy);
  283. }
  284. generuj(wspolczynnik, xmax, xmin, tab_wynik, wielkosc_tablicy);
  285.  
  286.  
  287. break;
  288.  
  289. case 2:
  290.  
  291. if (tab_sygnal != NULL)
  292.  
  293. {
  294. zaszum(tab_zaszum_wyniki, tab_wynik, wielkosc_tablicy);
  295. for (int i = 0; i < wielkosc_tablicy; i++)
  296. {
  297. printf("%lf\n", tab_zaszum_wyniki[i]);
  298. }
  299. }
  300. else
  301. {
  302. printf("musisz najpierw wygenerowac funkcje!!\n");
  303. break;
  304. }
  305.  
  306.  
  307.  
  308. case 3 :
  309.  
  310. if (tab_sygnal != NULL)
  311.  
  312. {
  313. zapisz_do_pliku(tab_zaszum_wyniki, wielkosc_tablicy);
  314. }
  315. else
  316. {
  317. printf("musisz najpierw wygenerowac funkcje!!\n");
  318. break;}
  319.  
  320.  
  321.  
  322. case 4 :
  323.  
  324.  
  325. if (tab_sygnal == NULL)
  326.  
  327. {
  328. double* odczyt_tablica = odczyt_z_pliku("sygnal.CSV", &wielkosc_tablicy);
  329. }
  330. else
  331. {
  332. printf("wygeneruj sobie nowa funkcje!\n");
  333. break;
  334.  
  335. }
  336.  
  337.  
  338.  
  339. case 5:
  340. if (tab_sygnal != NULL)
  341.  
  342. {
  343. mediana(tab_zaszum_wyniki, odszumiona, wielkosc_tablicy);
  344.  
  345. printf("Odszumiona\n");
  346. for (int i = 0; i < wielkosc_tablicy; i++)
  347. {
  348. printf("%lf\n", odszumiona[i]);
  349. }
  350.  
  351. }
  352. else
  353. {
  354. printf("musisz najpierw wygenerowac funkcje!!\n");
  355. break;
  356. }
  357.  
  358.  
  359. case 6:
  360. if (tab_sygnal != NULL)
  361.  
  362. {
  363. srednia(tab_zaszum_wyniki, odszumiona, wielkosc_tablicy);
  364.  
  365. printf("Odszumiona\n");
  366. for (int i = 0; i < wielkosc_tablicy; i++)
  367. {
  368. printf("%lf\n", odszumiona[i]);
  369. }
  370.  
  371. }
  372. else
  373. {
  374. printf("musisz najpierw wygenerowac funkcje!!\n");
  375. break;
  376. }
  377.  
  378.  
  379.  
  380.  
  381. default:
  382. if (liczba != 1 && liczba != 2 && liczba != 3 && liczba != 4 && liczba != 5 && liczba != 6 && liczba != 7)
  383. {
  384. printf("wybrales opcje ktora nie istnieje w menu\n");
  385. printf("sproboj jeszcze raz\n");
  386. scanf_s("%d", &liczba);
  387. break;
  388. }
  389.  
  390.  
  391.  
  392. }
  393. }
  394.  
  395. free(tab_wynik);
  396. free(tab_zaszum_wyniki);
  397. free(odczytana_tab);
  398. free(odszumiona);
  399.  
  400. return 0;
  401.  
  402. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement