lightinside utworzono 19 kwietnia 2012 utworzono 19 kwietnia 2012 Program służy do tworzenia histogramu z rozkładu normalnego.Problem, polega na tym że zamiast zapisywać histogramu, w pliku tekstowym sa zera. Czy mógłby ktoś pomóc w tym problemie? Główny problem polega na zapisie histogramu, bo na ekranie wyświetla dobrze. [code] #include <iostream> #include <cstdlib> // rand(), rand() and RAND_MAX #include <cmath> // sqrt(), log() and sin() #include <time.h> // time() #include <fstream> //obsuga plikow double normal(); using namespace std; double poj[10000][10000];//przechowuje nr roznych klas i elementow x tak by dla kazdego wiersza (dana klasa)przypadala dana liczba kolumn ktora okresla poszczegolne x ktore tam wpadly double min_kl[10000]; int main(void) { int i,j,k,l,m,u,w;//indeksy double max,min,modul_min,szer_gl,liczba_kl;// double tablica_na_x[10000];//przechowuje wylosowane x double max_kl[10000];//przechowuje max dla danej klasy double x,suma=0,suma_kwadratow=0,z; int ilosc;//ilosc x double szer_kl;//szerokosc pojedynczej klasy,stala dla wszystkich klas char nazwa[20];//przechowuje nazwe pliku srand((unsigned) time(NULL));//inicjalizacja "ziarna" void sort(double &, double &, double &);//odpowiada za sortowanie void klasy( double , double , double ); cout<<"Podaj nazwe pliku do ktorego chcesz zapisac wyniki (.txt na koncu): "; cin>>nazwa; ofstream fout(nazwa);//otworzenie pliku do zapisu cout<<"Podaj ilosc liczb do wylosowania (0 konczy): "; cin>>ilosc; while(ilosc!=0) { suma=0; suma_kwadratow=0; for(i=0;i<ilosc;++i) { x=normal();//losuje losowe liczby x suma+=x; suma_kwadratow+=(x*x); cout <<x <<endl; tablica_na_x[i]=x; } // min == max == pierwsza wylosowana liczba losowa min=tablica_na_x[0]; max=tablica_na_x[0]; for(int i=0;i<=ilosc;i++) { sort(max,min,tablica_na_x[i]); } szer_kl=0.16*sqrt(suma_kwadratow/ilosc-(suma/ilosc)*(suma/ilosc)); modul_min = fabs(min); szer_gl=modul_min + max; liczba_kl=szer_gl/szer_kl; klasy(modul_min ,szer_kl ,max); double zlicz[1000]; // każdy element tablicy to jakby słupek histogramu... //czyli jak jakis element z tablicy na x jest zaliczany do np. do 4 klasy to robisz zlicz[4] ++; for(int i=0;i<1000;i++) { zlicz[i] =0; // najpierw zerujemy wszystkie klasy } // teraz bierzemy element z tablicy na x i patrzymy do której klasy należy... // czyli bierzemy zerową klase i sprawdzamy if'em jak nie należy to następna klasa i tak aż znajdziemy lub skończą się klasy... for(int i=0;i<=ilosc;i++) // petla po ilosci bo sprawdzamy kazdy element z tablicy na x { int nr=0; // to bedzie numer klasy... bool end; do { end = false; //jesli element wiekszy lub równy min danej klasy i jednocześnie mniejszy od min następnej to zaliczamy go do tej klasy... // przedziały klas domknięte prawostronnie to znaczy element z tablicy na x należy do przedziału < min[nr] ,min[nr+1] ) if( tablica_na_x[i] >= min_kl[nr] && tablica_na_x[i] < min_kl[nr+1]) { zlicz[nr]++; // jak warunek spełniony to zaliczamy element do tej klasy end =true; // i konczymy poszukiwania... przechodzimy do następnego elemetu z tablicy na x } else nr++; // jak nie zaliczony to zwiększamy nr klasy if(nr > liczba_kl ) end =true; // jak nr wiekszy niż liczba klas to kończymy }while( !end ); // powtarzamy "do" doupuki end jest false... FILE *plik = fopen("hist.txt", "w"); for(int nr = 0; nr < 1000; nr++) { fprintf(plik, "%f ", zlicz[nr]); } fclose(plik); } for(u=0;u<ilosc;u++) { for( w=0;w<liczba_kl;w++) { if( tablica_na_x[u] >= min_kl[w] && tablica_na_x[u] < min_kl[w+1]) {poj[w][u]=z; cout<<"\n Element "<<u<<" nalezy do klasy"<<w; FILE *plik = fopen("hist2000.txt", "w");fprintf(plik, "%f ", poj[w][u]);fclose(plik); } } } FILE *plik; plik= fopen("hist2000.txt", "w"); for(int u = 0; u <= 1000; u++) { for(int w = 0; w <= 1000; w++) { fprintf(plik, "%f", poj[w][u]); fprintf(plik,"\n"); } fclose(plik); } cout<<"\n=======================================================================\n"; cout<<"Wartosc max = "<<max<<endl; cout<<"Wartosc min = "<<min<<endl; cout<<"Liczba klas "<<liczba_kl<<endl; cout<<"Roznica miedzy max i min = "<<szer_gl<<endl; cout<<"Ilosc wylosowanych liczb = "<<ilosc<<endl; cout<<"Srednia arytmetyczna to: = "<<suma/ilosc<<endl; cout<<"Wariancja wynosi: = "<<suma_kwadratow/ilosc-(suma/ilosc)*(suma/ilosc)<<endl; cout<<"Odchylenie standardowe to = "<<sqrt(suma_kwadratow/ilosc-(suma/ilosc)*(suma/ilosc))<<endl; cout<<"Szerokosc pojedynczej klasy wynosi = "<<szer_kl<<endl; cout<<"\n========================================================================\nPodaj ilosc liczb do wylosowania (0 konczy): "; cin>>ilosc; } //while end... fout.close();//zamknij plik return 0; } // losuje liczby o rozkladzie normalnym o zadanej sredniej i odchyleniu standardowym double normal() //metoda Transformacji Boxa-Mullera { static const double pii=3.141592654; static const double r_max=RAND_MAX+1; static float odchylenie=1, srednia=1; return odchylenie*sqrt(-2*log((rand()+1)/r_max))*sin(2*pii*rand()/r_max)+srednia; } void sort(double &a, double &b, double &c) { // a to max, b to min, c to element z tablicy o nazwie "tablica_na_x" if( c>a ) a=c; // jesli element z tablicy jest większy od max to zapisuje ten element jako max if( c<b ) b=c; // jesli element z tablicy jest mniejszy od min to zapisuje go jako min } void klasy( double min , double szerokosc , double max) { /* skoro liczba klas to (|min|+max)/szer klasy * to jak wezmiemy poczatek histogramu na |min| * i bedziemy dodawac szerokosc klasy * to po wykonaniu takiej operacji tyle razy ile jest klas otrzymamy max * czyli inaczej mowiac minimalna wartosc w histogramie to mod_min * szerokosc slupka histogramu to szer_kl * czyli pierszy slupek konczy sie mod_min + szer_kl... i wszystko co wieksze nalezy do nastepnego slupka histogramu * i tak dalej... przyjme że gdy liczba jest na granicy przedziału to nalezy do klasy wyzej czyli * np. gdy x = mod_min + szer_kl to program wpisze x do drugiego słupka * jako ze minimum histogramu jest moduł z liczby minimalnej */ int nrkl =0; // numer klasy histogramu min_kl[nrkl] =min; // minimalna wartosc w danej klasie do { nrkl +=1; // przechodizmy do nastepnej klasy min_kl[nrkl] = min_kl[nrkl-1] + szerokosc; // minimum poprzedniej klasy + szerokosc to minimum bierzacej klasy }while( min_kl[nrkl] < max ); // robimy tak dlugo az dostaniemy maksa histogramu... } [/code]
Maly1990 komentarz 19 kwietnia 2012 komentarz 19 kwietnia 2012 jesli zapisują się same zera to masz cos z zapisem. Zobacz czy pętla sie nie wykonuje zbyt długo, zobacz czy wyszstko jest dobrze z buforem zapisu no i zmienną ktora przechowuje dane w pamieci.
lightinside komentarz 19 kwietnia 2012 Autor komentarz 19 kwietnia 2012 Przyznam że program po skompilowaniu kiedy jakby zamiera na czas 1-2 sekund poczym wykonuje swoje.Nie wiem natomiast jak to poprawić ...
Wciąż szukasz rozwiązania problemu? Napisz teraz na forum!
Możesz zadać pytanie bez konieczności rejestracji - wystarczy, że wypełnisz formularz.