C++ Bc. 5 cpp

Z GeoWikiCZ
(přesměrováno z C plus plus Bc. 5 cpp)
Přejít na: navigace, hledání
#include <iostream>
#include <sstream> // istringstream
#include <list>
#include <vector>
#include <iomanip> // manipulatory datoveho proudu

void histogram(const std::list<double>& data, double min, double max, int N,
               std::vector<double>& hist);

int main ()
{
  using namespace std;

  istringstream input ("1.64 3.84 5.93 7.98 9.54 6.98 4.99 3.28 2.25 2.13 "
		       "4.58 6.60 7.72 8.88 8.56 5.47 3.59 7.43 4.31 4.68 "
		       "6.10 6.43 5.43 5.33 5.69");

  const double min = 2.0;
  const double max = 9;
  const int    N   = 7;

  list<double>   data;
  vector<double> hist;

  // nacist vstupni data do kontejneru 'data'
  double hodnota;
  while (input >> hodnota)
    {
      data.push_back (hodnota);
    }

  histogram (data, min, max, N, hist);

  // vypsat histogram
  cout.setf (ios_base::fixed, ios_base::floatfield);
  
  const double delta = (max - min) / N;

  for (int i = 0; i < hist.size (); i++)
    {
      stringstream interval;
      interval.setf (cout.flags());
      
      interval.precision (1);
      if (i != 0 && i != (hist.size() - 1))
	{
	  interval << (min + (i - 1) * delta) << "-" << min + i * delta;
	}
      else
	{
	  if (i == 0)
	    {
	      interval << "<" << min;
	    }
	  else
	    {
	      interval << ">" <<  max;
	    }
	}

      cout << setw (11) << interval.str();

      cout.precision (2);
      cout << setw (8) << hist[i] / data.size () * 1e2 << endl;
    }

  return 0;
}
 
void histogram(const std::list<double>& data, double min, double max, int N,
               std::vector<double>& hist) {

  const double delta = (max - min) / N;

  hist.resize (N+2);

  for (std::list<double>::const_iterator i = data.begin (), e = data.end ();
       i != e; ++i)
    {
      if ((*i) < min)
	{
	  hist[0]++;
	  continue;
	}

      if ((*i) >= max)
	{
	  hist[N+1]++;
	  continue;
	}

      for (int in = 0; in < N; in++)
	{
	  if ((*i) >= (min + in * delta) && (*i) < (min + (in + 1) * delta))
	    {
	      hist[in+1]++;
	      break;
	    }
	}
    }

  return;
}

Příklad výstupu:

       <2.0    4.00
   2.0-3.0    8.00
   3.0-4.0   12.00
   4.0-5.0   16.00
   5.0-6.0   20.00
   6.0-7.0   16.00
   7.0-8.0   12.00
   8.0-9.0    8.00
       >9.0    4.00

[ Zpět ]