All pastes #807126 Raw Edit

Someone

public text v1 · immutable
·published 2007-12-06 07:33 UTC
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;
}