Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- #include <time.h>
- void WczytParamWielom(double wsp[]); //funkcja pobierajaca parametry wielomianu
- void WczytZakrDzie(double *pdmin, double *pdmax); //funckja pobierajaca zakres dziedziny
- void GenWielom(double wsp[], double dmin, double dmax, double wyniki[], int wielkosc); //funckja generujaca wielomian
- void Szum(double wyniki[], int wielkosc, double wsp[], double dmin, double dmax); //funkcja generujaca szum
- void ZapiszDoCSV(double wyniki[], int wielkosc, double dmin, double dmax); //funkcja zapisujaca pobrane dane do pliku CSV
- void OdczytZCSV(double wyniki[], int wielkosc, double *pdmin, double *pdmax); //funkcja wczytujaca dane z pliku CSV
- void Aproksymacja(double wyniki[], int wielkosc, double dmin, double dmax); //funkcja aproksymujaca wspolczynniki
- int main(void)
- {
- int wiel=5, wybor=0, popr_dane=0;
- double ws[3]={0,0,0}, wy[5], dmin=0, dmax=0;
- char temp[100], *bufor;
- srand(time(NULL));
- do
- {
- printf("\nMENU: \n\n");
- 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");
- while(popr_dane==0) //petla sprawdzajaca dane wejsciowe
- {
- scanf("%s", temp);
- wybor=strtod(temp, &bufor); //jezeli wsyztskie dane byly poprawne to wczyta się (do nieprzeczytanych danych) tylko znak konca linii
- if (*bufor != '\0')
- {
- printf("Ten parametr nie jest liczba, sprobuj ponownie!\n");
- popr_dane=0;
- }
- else
- {
- popr_dane=1;
- }
- }
- popr_dane=0;
- switch(wybor)
- {
- case 1: WczytParamWielom(ws); break;
- case 2: WczytZakrDzie(&dmin, &dmax); break;
- case 3: GenWielom(ws, dmin, dmax, wy, wiel); break;
- case 4: Szum(wy, wiel, ws, dmin, dmax); break;
- case 5: ZapiszDoCSV(wy, wiel, dmin, dmax); break;
- case 6: OdczytZCSV(wy, wiel, &dmin, &dmax); break;
- case 7: Aproksymacja(wy, wiel, dmin, dmax); break;
- }
- }while(wybor!=8);
- return 0;
- }
- void WczytParamWielom(double wsp[])
- {
- int i=0, popr_dane=0;
- char temp[100], *bufor;
- while(i<3)
- {
- popr_dane=0;
- printf("Podaj %d parametr wielomianu:\n", i+1);
- while(popr_dane==0)
- {
- scanf("%s", temp);
- wsp[i]=strtod(temp, &bufor);
- if (*bufor != '\0')
- {
- printf("Ten wspolczynnik nie jest liczba, sprobuj ponownie!\n");
- popr_dane=0;
- }
- else
- {
- popr_dane=1;
- }
- }
- i++;
- }
- printf("Twoje wspolczynniki to: a=%lf\tb=%lf\tc=%lf",wsp[0],wsp[1],wsp[2]);
- }
- void WczytZakrDzie(double *pdmin, double *pdmax)
- {
- double d=0;
- int i=2, popr_dane=0;
- char temp[100], *bufor;
- printf("Podaj pierwszy parametr okreslajacy dziedzine wielomianu:\n");
- while(popr_dane==0)
- {
- scanf("%s", temp);
- *pdmin=strtod(temp, &bufor);
- if (*bufor != '\0')
- {
- printf("Ten parametr nie jest liczba, sprobuj ponownie!\n");
- popr_dane=0;
- }
- else
- {
- popr_dane=1;
- }
- }
- popr_dane=0;
- printf("Podaj drugi parametr okreslajacy dziedzine wielomianu:\n");
- while(popr_dane==0)
- {
- scanf("%s", temp);
- *pdmax=strtod(temp, &bufor);
- if (*bufor != '\0')
- {
- printf("Ten parametr nie jest liczba, sprobuj ponownie!\n");
- popr_dane=0;
- }
- else
- {
- if(*pdmin==*pdmax)
- {
- printf("Podane liczby sa sobie rowne, podaj inna wartosc\n");
- popr_dane==0;
- }
- else
- {
- popr_dane=1;
- }
- }
- }
- if(*pdmin>*pdmax)
- {
- d=*pdmin;
- *pdmin=*pdmax;
- *pdmax=d;
- }
- printf("Twoja dziedzina zawiera sie w:\t{%lf , %lf}", *pdmin, *pdmax);
- }
- void GenWielom(double wsp[], double dmin, double dmax, double wyniki[], int wielkosc)
- {
- if(dmin==dmax)
- printf("\nNie mozna utworzyc wielomianu, sprobuj:\n a) podac poprawnie wszystkie parametry oraz/lub dziedzine wielomianu\n b) wczytac dane z pliku\n");
- else
- {
- double x=0, del=0;
- int i;
- del=(dmax-dmin)/wielkosc;
- x=dmin;
- printf("wyniki:\n");
- for(i=0; i<wielkosc; i++)
- {
- wyniki[i]=(wsp[0]*(x*x))+(wsp[1]*x)+wsp[2]; //obliczanie wartosci wielomianu dla zadanej dziedziny
- printf("%lf\n", wyniki[i]);
- x+=del;
- }
- }
- }
- void Szum(double wyniki[], int wielkosc, double wsp[], double dmin, double dmax)
- {
- if(dmin==dmax)
- printf("\nMusisz wygenerowac wielomian lub wczytac dane z pliku aby utworzyc szum\n");
- else
- {
- int i, popr_dane=0;
- double amplit;
- double szum[20];
- char temp[100], *bufor;
- printf("\npodaj amplitude: ");
- while(popr_dane==0)
- {
- scanf("%s", temp);
- amplit=strtod(temp, &bufor);
- if (*bufor != '\0')
- {
- printf("Ten parametr nie jest liczba, sprobuj ponownie!\n");
- popr_dane=0;
- }
- else
- {
- popr_dane=1;
- }
- }
- for (i=0; i<wielkosc; i++)
- {
- szum[i]=(((double)rand()/RAND_MAX)*amplit - (amplit/2)); //generowanie szumu
- printf("\n szum = %lf \n", szum[i]);
- wyniki[i]+=szum[i]; //zaszumianie przebiegu wielomianu
- printf("\n suma sygnalow = %lf \n", wyniki[i]);
- }
- }
- }
- void ZapiszDoCSV(double wyniki[], int wielkosc, double dmin, double dmax)
- {
- int i;
- double x=dmin;
- FILE *f;
- if ((f=fopen("wielomian.csv", "w"))!=NULL)
- {
- //fprintf(f, "argumenty;wartosci");
- for(i=0; i<wielkosc; i++)
- {
- fprintf(f, "%lf;%lf\n",x, wyniki[i]); //zapis do pliku CSV w formacie (argument; wartosc)
- x+=(dmax-dmin)/wielkosc;
- }
- printf("\nzapis poprawny\n");
- }
- else printf("blad przy zapisie");
- fclose(f);
- }
- void OdczytZCSV(double wyniki[], int wielkosc, double *pdmin, double *pdmax)
- {
- double dmin=0, dmax=0;
- int i;
- double temp=0;
- double del=0;
- FILE *f;
- if ((f=fopen("wielomian.csv", "r"))!=NULL)
- {
- for(i=0; i<wielkosc; i++)
- {
- fscanf(f, "%lf;%lf",&temp, &wyniki[i]); //wczytywanie wartosci wielomianu z pliku CSV
- if(dmin==0 && dmax==0)
- {
- dmin=temp;
- dmax=temp;
- }
- if(dmax!=temp)
- del=temp-dmax; //na podstawie argumentow wczytanych z pliku odtwarzany jest zakres dziedziny
- if(dmin>temp)
- dmin=temp;
- if(dmax<temp)
- dmax=temp;
- printf("%lf\t%lf\t%lf\n", dmin, dmax+del, wyniki[i]);
- }
- *pdmin=dmin;
- *pdmax=dmax+del;
- printf("\nodczyt poprawny\n");
- }
- else printf("blad przy odczycie");
- fclose(f);
- }
- void Aproksymacja(double wyniki[], int wielkosc, double dmin, double dmax)
- {
- if(dmin==dmax)
- printf("Nie mozna dokonac aproksymacji, sprobuj wygenerowac wielomian lub wczytac dane z pliku CSV");
- else
- {
- double macierz_x[3][3]={0,0,0,0,0,0,0,0,0}; //macierz X
- double macierz_y[3]={0,0,0}; //macierz Y
- double W; //wyznacznik macierzy X
- double Wa; //wyznacznik do wspolczynnika a
- double Wb; //wyznacznik do wspolczynnika b
- double Wc; //wyznacznik do wspolczynnika c
- double a,b,c;
- int i,j;
- double x=dmin;
- for(i=0;i<wielkosc;i++)
- {
- macierz_x[0][0]+=(double)pow(x,0);
- macierz_x[0][1]+=(double)pow(x,1);
- macierz_x[1][0]+=(double)pow(x,1);
- macierz_x[0][2]+=(double)pow(x,2);
- macierz_x[1][1]+=(double)pow(x,2); //obliczanie macierzy X na podstawie argumentow z dziedziny
- macierz_x[2][0]+=(double)pow(x,2);
- macierz_x[1][2]+=(double)pow(x,3);
- macierz_x[2][1]+=(double)pow(x,3);
- macierz_x[2][2]+=(double)pow(x,4);
- x+=(dmax-dmin)/wielkosc;
- }
- printf("\n\nTo jest macierz X\n");
- for(i=0; i<3; i++)
- {
- printf("\n\n ");
- for(j=0; j<3; j++)
- {
- printf("%lf ", macierz_x[i][j]);
- }
- }
- x=dmin;
- for(i=0;i<wielkosc;i++)
- {
- macierz_y[0]+=pow(x,0)*wyniki[i];
- macierz_y[1]+=pow(x,1)*wyniki[i]; //obliczanie macierzy Y na podstawie argumentow i tablicy wartosci
- macierz_y[2]+=pow(x,2)*wyniki[i];
- x+=(dmax-dmin)/wielkosc;
- }
- printf("\n\nTo jest macierz Y");
- for(i=0; i<3; i++)
- {
- printf("\n\n ");
- printf("%lf",macierz_y[i]);
- }
- W= macierz_x[0][0]*macierz_x[1][1]*macierz_x[2][2]+
- macierz_x[0][1]*macierz_x[1][2]*macierz_x[2][0]+
- macierz_x[0][2]*macierz_x[1][0]*macierz_x[2][1]-
- macierz_x[0][1]*macierz_x[1][0]*macierz_x[2][2]- //obliczanie wyznacznika W
- macierz_x[0][0]*macierz_x[1][2]*macierz_x[2][1]-
- macierz_x[0][2]*macierz_x[1][1]*macierz_x[2][0];
- printf("\n\nWyznacznik W=%lf ",W);
- Wa=macierz_x[0][0]*macierz_x[1][1]*macierz_y[2]+
- macierz_x[0][1]*macierz_y[1]*macierz_x[2][0]+
- macierz_y[0]*macierz_x[1][0]*macierz_x[2][1]-
- macierz_x[0][1]*macierz_x[1][0]*macierz_y[2]- //obliczanie wyznacznika Wa
- macierz_x[0][0]*macierz_y[1]*macierz_x[2][1]-
- macierz_y[0]*macierz_x[1][1]*macierz_x[2][0];
- printf("\n\nWyznacznik Wa=%lf ",Wa);
- Wb= macierz_x[0][0]*macierz_y[1]*macierz_x[2][2]+
- macierz_y[0]*macierz_x[1][2]*macierz_x[2][0]+
- macierz_x[0][2]*macierz_x[1][0]*macierz_y[2]-
- macierz_y[0]*macierz_x[1][0]*macierz_x[2][2]- //obliczanie wyznacznika Wb
- macierz_x[0][0]*macierz_x[1][2]*macierz_y[2]-
- macierz_x[0][2]*macierz_y[1]*macierz_x[2][0];
- printf("\n\nWyznacznik Wb=%lf ",Wb);
- Wc= macierz_y[0]*macierz_x[1][1]*macierz_x[2][2]+
- macierz_x[0][1]*macierz_x[1][2]*macierz_y[2]+
- macierz_x[0][2]*macierz_y[1]*macierz_x[2][1]-
- macierz_x[0][1]*macierz_y[1]*macierz_x[2][2]- //obliczanie wyznacznika Wc
- macierz_y[0]*macierz_x[1][2]*macierz_x[2][1]-
- macierz_x[0][2]*macierz_x[1][1]*macierz_y[2];
- printf("\n\nWyznacznik Wc=%lf ",Wc);
- a=Wa/W;
- printf("\n\nz aproksymacji wyszlo ze wspolczynnik a=%lf ", a);
- b=Wb/W;
- printf("\n\nz aproksymacji wyszlo ze wspolczynnik b=%lf ", b);
- c=Wc/W;
- printf("\n\nz aproksymacji wyszlo ze wspolczynnik c=%lf ", c);
- }
- }
Add Comment
Please, Sign In to add comment