rendered paste body
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <vector>
#include <iomanip>
#include <sstream>
using std::cout;
using std::endl;
using std::ios;
using std::setprecision;
using std::setw;
template<typename T>
int max(const std::vector<T>& a){
typename std::vector<T>::const_iterator pos;
pos = std::max_element(a.begin(), a.end());
return (std::distance(a.begin(), pos) /* + 1*/);
}
template<typename T>
int przydziel(const T& x, const std::vector<T>& a){
typename std::vector<T>::const_reverse_iterator pos = a.rbegin();
int i=a.size();
for(pos; pos != a.rend(); ++pos)
if (x > *pos)
return i;
else --i;
}
int main(int argc, char* argv[]){
std::string filename;
//przetworzenie argumentow wejsciowych
switch(argc){
case 2:
filename=argv[1];
break;
default:
cout << "Uzycie: " << argv[0] << " plik" << endl;
cout << "podaj nazwe pliku: ";
std::cin >> filename;
break;
}
std::ifstream wczytaj;
std::vector<float> przedz_l, przedz_p, cum_n, n;
float temp_a=0, temp_b=0, temp;
int temp_c=0, m;
float suma_n = 0, moda;
float beta05, beta025, beta075;
float q025, q05, q075;
std::string tak_nie;
//otwarcie pliku do czytania
wczytaj.open(filename.c_str(), ios::binary);
if(!wczytaj){
std::cerr << "bledna nazwa pliku" << endl;
system("PAUSE");
exit (1);
}
//wypelnienie wektorow
if(wczytaj.is_open()){
while(!wczytaj.eof()){
if(wczytaj >> temp_a >> temp_b >> temp_c){
przedz_l.push_back(temp_a);
przedz_p.push_back(temp_b);
n.push_back(temp_c);
}
}
}
wczytaj.close();
//obliczenie cum_n
for(int i=0;i<n.size();i++){
suma_n += n[i];
if(i == 0) cum_n.push_back(n[i]);
else cum_n.push_back(cum_n[i-1]+n[i]);
}
//wyznaczenie pozycji najwiekszego n(j)
m = max<float>(n);
if(m == 0) temp = 0;
else temp = n[m-1];
//obliczenie mody
moda = przedz_l[m] +
((n[m]-temp)/((n[m]-temp)+(n[m]-n[m+1])))*(przedz_p[m] - przedz_l[m]);
//kwartyl rzedu 0.5
beta05 = 0.5 * suma_n;
m = przydziel<float>(beta05, cum_n );
if( m == 0) temp = 0;
else temp = cum_n[m-1];
q05 = przedz_l[m] + ((beta05-temp)/n[m])*(przedz_p[m] - przedz_l[m]);
//kwartyl rzedu 0.25
beta025 = 0.25 * suma_n;
m = przydziel<float>(beta025, cum_n);
if( m == 0) temp = 0;
else temp = cum_n[m-1];
q025 = przedz_l[m] + ((beta025-temp)/n[m])*(przedz_p[m] - przedz_l[m]);
//kwartyl rzedu 0.75
beta075 = 0.75 * suma_n;
m = przydziel<float>(beta075, cum_n);
if( m == 0) temp = 0;
else temp = cum_n[m-1];
q075 = przedz_l[m] + ((beta075-temp)/n[m])*(przedz_p[m] - przedz_l[m]);
std::ostringstream str;
//wypisanie "tabeli" do strumienia
str << "\r\n";
str << setw(12) << "<x(j)-x(j)+" << (char)30 << "x)" << setw(6) <<" n(j)" << setw(6) <<" cum n(j)" << "\r\n";
for(int i=0;i<przedz_l.size();i++){
str.setf(ios::right, ios::adjustfield);
str << setw(6) << przedz_l[i] << ' ';
str << setw(6) << przedz_p[i] << ' ';
str << setw(6) << n[i] << ' ';
str << setw(6) << cum_n[i] << "\r\n";
}
//wypisanie obliczen do strumienia
str << "\r\n";
str.setf(ios::left, ios::adjustfield);
str << setw(15) << "MIARA" << setw(12) << " WARTOSC" << setw(12) << " PRZYBLIZENIE" << "\r\n" << "\r\n";
str.setf(ios::right, ios::adjustfield);
str.precision(10);
str << "Suma n(j) = " << setw(12) << suma_n << " = - " << "\r\n";
str << "Kwantyl 0.25 = " << setw(12) << q025 << " = " << setprecision(3) << q025 << "\r\n";
str.precision(10);
str << "Kwantyl 0.50 = " << setw(12) << q05 << " = " << setprecision(3) << q05 << "\r\n";
str.precision(10);
str << "Kwantyl 0.75 = " << setw(12) << q075 << " = " << setprecision(3) << q075 << "\r\n";
str.precision(10);
str << "Moda = " << setw(12) << moda << " = " << setprecision(6) << moda << "\r\n" << "\r\n";
cout << str.str() << endl;
bool pyt=true, plik=false;
while(pyt){
cout << "Czy chcesz zapisac wyniki obliczen do pliku? [t/n] ";
std::cin >> tak_nie;
if(tak_nie == "n" || tak_nie == "N"){
pyt=false;
plik=false;
}else if(tak_nie == "t" || tak_nie == "T"){
pyt=false;
plik=true;
}
else cout << "niepoprawna odpowiedz" << endl;
}
//zapis do pliku/na ekran
if(plik){
std::ofstream zapisz;
zapisz.open(filename.c_str(), ios::binary|ios::app|ios::out);
if(!zapisz) std::cerr << "blad przy otwarciu pliku" << endl;
zapisz << "\r\n" << "\r\n" << str.str() << "\r\n";
zapisz.close();
}
system("PAUSE");
return 0;
}