Guest User

Untitled

a guest
Feb 18th, 2018
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.67 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <time.h>
  5.  
  6. void WczytParamWielom(double wsp[]); //funkcja pobierajaca parametry wielomianu
  7. void WczytZakrDzie(double *pdmin, double *pdmax); //funckja pobierajaca zakres dziedziny
  8. void GenWielom(double wsp[], double dmin, double dmax, double wyniki[], int wielkosc); //funckja generujaca wielomian
  9. void Szum(double wyniki[], int wielkosc, double wsp[], double dmin, double dmax); //funkcja generujaca szum
  10. void ZapiszDoCSV(double wyniki[], int wielkosc, double dmin, double dmax); //funkcja zapisujaca pobrane dane do pliku CSV
  11. void OdczytZCSV(double wyniki[], int wielkosc, double *pdmin, double *pdmax); //funkcja wczytujaca dane z pliku CSV
  12. void Aproksymacja(double wyniki[], int wielkosc, double dmin, double dmax); //funkcja aproksymujaca wspolczynniki
  13.  
  14. int main(void)
  15. {
  16. int wiel=5, wybor=0, popr_dane=0;
  17. double ws[3]={0,0,0}, wy[5], dmin=0, dmax=0;
  18. char temp[100], *bufor;
  19. srand(time(NULL));
  20.  
  21. do
  22. {
  23. printf("\nMENU: \n\n");
  24. printf("\nWybierz opcje: \n1.Wprowadz parametry wielomianu\n2.Wprowadz dziedzine\n3.Generuj wartosci\n4.Dodaj szum\n5.Zapisz dane do pliku CSV\n6.Odczytaj dane z pliku CSV\n7.Aproksymuj wspolczynniki wielomianu\n8.Zakoncz program\n");
  25. while(popr_dane==0) //petla sprawdzajaca dane wejsciowe
  26. {
  27. scanf("%s", temp);
  28. wybor=strtod(temp, &bufor); //jezeli wsyztskie dane byly poprawne to wczyta się (do nieprzeczytanych danych) tylko znak konca linii
  29. if (*bufor != '\0')
  30. {
  31. printf("Ten parametr nie jest liczba, sprobuj ponownie!\n");
  32. popr_dane=0;
  33. }
  34. else
  35. {
  36. popr_dane=1;
  37. }
  38. }
  39. popr_dane=0;
  40. switch(wybor)
  41. {
  42. case 1: WczytParamWielom(ws); break;
  43. case 2: WczytZakrDzie(&dmin, &dmax); break;
  44. case 3: GenWielom(ws, dmin, dmax, wy, wiel); break;
  45. case 4: Szum(wy, wiel, ws, dmin, dmax); break;
  46. case 5: ZapiszDoCSV(wy, wiel, dmin, dmax); break;
  47. case 6: OdczytZCSV(wy, wiel, &dmin, &dmax); break;
  48. case 7: Aproksymacja(wy, wiel, dmin, dmax); break;
  49. }
  50. }while(wybor!=8);
  51. return 0;
  52. }
  53.  
  54. void WczytParamWielom(double wsp[])
  55. {
  56. int i=0, popr_dane=0;
  57. char temp[100], *bufor;
  58. while(i<3)
  59. {
  60. popr_dane=0;
  61. printf("Podaj %d parametr wielomianu:\n", i+1);
  62. while(popr_dane==0)
  63. {
  64. scanf("%s", temp);
  65. wsp[i]=strtod(temp, &bufor);
  66. if (*bufor != '\0')
  67. {
  68. printf("Ten wspolczynnik nie jest liczba, sprobuj ponownie!\n");
  69. popr_dane=0;
  70. }
  71. else
  72. {
  73. popr_dane=1;
  74. }
  75. }
  76. i++;
  77. }
  78. printf("Twoje wspolczynniki to: a=%lf\tb=%lf\tc=%lf",wsp[0],wsp[1],wsp[2]);
  79. }
  80.  
  81. void WczytZakrDzie(double *pdmin, double *pdmax)
  82. {
  83. double d=0;
  84. int i=2, popr_dane=0;
  85. char temp[100], *bufor;
  86. printf("Podaj pierwszy parametr okreslajacy dziedzine wielomianu:\n");
  87. while(popr_dane==0)
  88. {
  89. scanf("%s", temp);
  90. *pdmin=strtod(temp, &bufor);
  91. if (*bufor != '\0')
  92. {
  93. printf("Ten parametr nie jest liczba, sprobuj ponownie!\n");
  94. popr_dane=0;
  95. }
  96. else
  97. {
  98. popr_dane=1;
  99. }
  100. }
  101. popr_dane=0;
  102. printf("Podaj drugi parametr okreslajacy dziedzine wielomianu:\n");
  103. while(popr_dane==0)
  104. {
  105. scanf("%s", temp);
  106. *pdmax=strtod(temp, &bufor);
  107. if (*bufor != '\0')
  108. {
  109. printf("Ten parametr nie jest liczba, sprobuj ponownie!\n");
  110. popr_dane=0;
  111. }
  112. else
  113. {
  114. if(*pdmin==*pdmax)
  115. {
  116. printf("Podane liczby sa sobie rowne, podaj inna wartosc\n");
  117. popr_dane==0;
  118. }
  119. else
  120. {
  121. popr_dane=1;
  122. }
  123. }
  124. }
  125. if(*pdmin>*pdmax)
  126. {
  127. d=*pdmin;
  128. *pdmin=*pdmax;
  129. *pdmax=d;
  130. }
  131. printf("Twoja dziedzina zawiera sie w:\t{%lf , %lf}", *pdmin, *pdmax);
  132. }
  133.  
  134. void GenWielom(double wsp[], double dmin, double dmax, double wyniki[], int wielkosc)
  135. {
  136. if(dmin==dmax)
  137. printf("\nNie mozna utworzyc wielomianu, sprobuj:\n a) podac poprawnie wszystkie parametry oraz/lub dziedzine wielomianu\n b) wczytac dane z pliku\n");
  138. else
  139. {
  140. double x=0, del=0;
  141. int i;
  142. del=(dmax-dmin)/wielkosc;
  143. x=dmin;
  144. printf("wyniki:\n");
  145. for(i=0; i<wielkosc; i++)
  146. {
  147. wyniki[i]=(wsp[0]*(x*x))+(wsp[1]*x)+wsp[2]; //obliczanie wartosci wielomianu dla zadanej dziedziny
  148. printf("%lf\n", wyniki[i]);
  149. x+=del;
  150. }
  151. }
  152. }
  153.  
  154. void Szum(double wyniki[], int wielkosc, double wsp[], double dmin, double dmax)
  155. {
  156. if(dmin==dmax)
  157. printf("\nMusisz wygenerowac wielomian lub wczytac dane z pliku aby utworzyc szum\n");
  158. else
  159. {
  160. int i, popr_dane=0;
  161. double amplit;
  162. double szum[20];
  163. char temp[100], *bufor;
  164. printf("\npodaj amplitude: ");
  165. while(popr_dane==0)
  166. {
  167. scanf("%s", temp);
  168. amplit=strtod(temp, &bufor);
  169. if (*bufor != '\0')
  170. {
  171. printf("Ten parametr nie jest liczba, sprobuj ponownie!\n");
  172. popr_dane=0;
  173. }
  174. else
  175. {
  176. popr_dane=1;
  177. }
  178. }
  179. for (i=0; i<wielkosc; i++)
  180. {
  181. szum[i]=(((double)rand()/RAND_MAX)*amplit - (amplit/2)); //generowanie szumu
  182. printf("\n szum = %lf \n", szum[i]);
  183. wyniki[i]+=szum[i]; //zaszumianie przebiegu wielomianu
  184. printf("\n suma sygnalow = %lf \n", wyniki[i]);
  185. }
  186. }
  187. }
  188.  
  189. void ZapiszDoCSV(double wyniki[], int wielkosc, double dmin, double dmax)
  190. {
  191. int i;
  192. double x=dmin;
  193. FILE *f;
  194. if ((f=fopen("wielomian.csv", "w"))!=NULL)
  195. {
  196. //fprintf(f, "argumenty;wartosci");
  197. for(i=0; i<wielkosc; i++)
  198. {
  199. fprintf(f, "%lf;%lf\n",x, wyniki[i]); //zapis do pliku CSV w formacie (argument; wartosc)
  200. x+=(dmax-dmin)/wielkosc;
  201. }
  202. printf("\nzapis poprawny\n");
  203. }
  204. else printf("blad przy zapisie");
  205. fclose(f);
  206.  
  207. }
  208.  
  209. void OdczytZCSV(double wyniki[], int wielkosc, double *pdmin, double *pdmax)
  210. {
  211. double dmin=0, dmax=0;
  212. int i;
  213. double temp=0;
  214. double del=0;
  215. FILE *f;
  216. if ((f=fopen("wielomian.csv", "r"))!=NULL)
  217. {
  218. for(i=0; i<wielkosc; i++)
  219. {
  220. fscanf(f, "%lf;%lf",&temp, &wyniki[i]); //wczytywanie wartosci wielomianu z pliku CSV
  221. if(dmin==0 && dmax==0)
  222. {
  223. dmin=temp;
  224. dmax=temp;
  225. }
  226. if(dmax!=temp)
  227. del=temp-dmax; //na podstawie argumentow wczytanych z pliku odtwarzany jest zakres dziedziny
  228. if(dmin>temp)
  229. dmin=temp;
  230. if(dmax<temp)
  231. dmax=temp;
  232. printf("%lf\t%lf\t%lf\n", dmin, dmax+del, wyniki[i]);
  233. }
  234. *pdmin=dmin;
  235. *pdmax=dmax+del;
  236. printf("\nodczyt poprawny\n");
  237. }
  238. else printf("blad przy odczycie");
  239. fclose(f);
  240. }
  241.  
  242. void Aproksymacja(double wyniki[], int wielkosc, double dmin, double dmax)
  243. {
  244. if(dmin==dmax)
  245. printf("Nie mozna dokonac aproksymacji, sprobuj wygenerowac wielomian lub wczytac dane z pliku CSV");
  246. else
  247. {
  248. double macierz_x[3][3]={0,0,0,0,0,0,0,0,0}; //macierz X
  249. double macierz_y[3]={0,0,0}; //macierz Y
  250. double W; //wyznacznik macierzy X
  251. double Wa; //wyznacznik do wspolczynnika a
  252. double Wb; //wyznacznik do wspolczynnika b
  253. double Wc; //wyznacznik do wspolczynnika c
  254. double a,b,c;
  255. int i,j;
  256.  
  257. double x=dmin;
  258. for(i=0;i<wielkosc;i++)
  259. {
  260. macierz_x[0][0]+=(double)pow(x,0);
  261. macierz_x[0][1]+=(double)pow(x,1);
  262. macierz_x[1][0]+=(double)pow(x,1);
  263. macierz_x[0][2]+=(double)pow(x,2);
  264. macierz_x[1][1]+=(double)pow(x,2); //obliczanie macierzy X na podstawie argumentow z dziedziny
  265. macierz_x[2][0]+=(double)pow(x,2);
  266. macierz_x[1][2]+=(double)pow(x,3);
  267. macierz_x[2][1]+=(double)pow(x,3);
  268. macierz_x[2][2]+=(double)pow(x,4);
  269. x+=(dmax-dmin)/wielkosc;
  270. }
  271.  
  272. printf("\n\nTo jest macierz X\n");
  273. for(i=0; i<3; i++)
  274. {
  275. printf("\n\n ");
  276. for(j=0; j<3; j++)
  277. {
  278. printf("%lf ", macierz_x[i][j]);
  279. }
  280. }
  281.  
  282. x=dmin;
  283. for(i=0;i<wielkosc;i++)
  284. {
  285. macierz_y[0]+=pow(x,0)*wyniki[i];
  286. macierz_y[1]+=pow(x,1)*wyniki[i]; //obliczanie macierzy Y na podstawie argumentow i tablicy wartosci
  287. macierz_y[2]+=pow(x,2)*wyniki[i];
  288. x+=(dmax-dmin)/wielkosc;
  289. }
  290.  
  291. printf("\n\nTo jest macierz Y");
  292. for(i=0; i<3; i++)
  293. {
  294. printf("\n\n ");
  295. printf("%lf",macierz_y[i]);
  296. }
  297.  
  298. W= macierz_x[0][0]*macierz_x[1][1]*macierz_x[2][2]+
  299. macierz_x[0][1]*macierz_x[1][2]*macierz_x[2][0]+
  300. macierz_x[0][2]*macierz_x[1][0]*macierz_x[2][1]-
  301. macierz_x[0][1]*macierz_x[1][0]*macierz_x[2][2]- //obliczanie wyznacznika W
  302. macierz_x[0][0]*macierz_x[1][2]*macierz_x[2][1]-
  303. macierz_x[0][2]*macierz_x[1][1]*macierz_x[2][0];
  304.  
  305. printf("\n\nWyznacznik W=%lf ",W);
  306.  
  307. Wa=macierz_x[0][0]*macierz_x[1][1]*macierz_y[2]+
  308. macierz_x[0][1]*macierz_y[1]*macierz_x[2][0]+
  309. macierz_y[0]*macierz_x[1][0]*macierz_x[2][1]-
  310. macierz_x[0][1]*macierz_x[1][0]*macierz_y[2]- //obliczanie wyznacznika Wa
  311. macierz_x[0][0]*macierz_y[1]*macierz_x[2][1]-
  312. macierz_y[0]*macierz_x[1][1]*macierz_x[2][0];
  313.  
  314. printf("\n\nWyznacznik Wa=%lf ",Wa);
  315.  
  316. Wb= macierz_x[0][0]*macierz_y[1]*macierz_x[2][2]+
  317. macierz_y[0]*macierz_x[1][2]*macierz_x[2][0]+
  318. macierz_x[0][2]*macierz_x[1][0]*macierz_y[2]-
  319. macierz_y[0]*macierz_x[1][0]*macierz_x[2][2]- //obliczanie wyznacznika Wb
  320. macierz_x[0][0]*macierz_x[1][2]*macierz_y[2]-
  321. macierz_x[0][2]*macierz_y[1]*macierz_x[2][0];
  322.  
  323. printf("\n\nWyznacznik Wb=%lf ",Wb);
  324.  
  325. Wc= macierz_y[0]*macierz_x[1][1]*macierz_x[2][2]+
  326. macierz_x[0][1]*macierz_x[1][2]*macierz_y[2]+
  327. macierz_x[0][2]*macierz_y[1]*macierz_x[2][1]-
  328. macierz_x[0][1]*macierz_y[1]*macierz_x[2][2]- //obliczanie wyznacznika Wc
  329. macierz_y[0]*macierz_x[1][2]*macierz_x[2][1]-
  330. macierz_x[0][2]*macierz_x[1][1]*macierz_y[2];
  331.  
  332. printf("\n\nWyznacznik Wc=%lf ",Wc);
  333.  
  334. a=Wa/W;
  335. printf("\n\nz aproksymacji wyszlo ze wspolczynnik a=%lf ", a);
  336. b=Wb/W;
  337. printf("\n\nz aproksymacji wyszlo ze wspolczynnik b=%lf ", b);
  338. c=Wc/W;
  339. printf("\n\nz aproksymacji wyszlo ze wspolczynnik c=%lf ", c);
  340. }
  341. }
Add Comment
Please, Sign In to add comment