Diskuse:C++ Bc. 13

Z GeoWikiCZ
Dobry den,

prohlizel jsem si priklady pro bakalare vcetne Vaseho vypracovani a u
prikladu cislo 13 jsem pravdepodobne narazil na chybu. V tomto zadani je
ukolem napsat vypocet polynomu pomoci Hornerova schema a dale napsat
funkci scitajici dva polynomy. U obou vypoctu je pro  standartni vystup
uvedeno:
for (double x=0; x<1.05; x+=0.1)
    {
      cout << x << "\t" << polynom(x, p) << endl;
    }
Pri tomto reseni je 2x vypsano reseni polynomu, ale podruhe je ovlivneno
funkci souctu.
Myslim si, ze u druheho vypoctu by bylo vhodne napr. toto:
for (int i = p.size()-1; x > -1; x--)
    {
      cout << p[i] << " | ";
    }
cout <<endl;

S pozdravem
Stepancic Petr G2-63

Děkuji za připomínku. Nemyslím, že jde o chybu, to je věc názoru. Příklady ve sbírce a hlavně programky pro demonstraci výsledků řešení se snažím uvádět co možná nejjednodušší. Pokud bych vypisoval koeficienty součtu, pak bych měl vypsat i koeficienty sčítaných polynomů a napsat funkci pro výpis koeficinetů zadaného polynomu (viz následující ukázka). Ponechávám zadání v původním tvaru

#include <iostream>
#include <vector>
#include <cmath>

double polynom(double x, const std::vector<double>& a);
void   soucet (const std::vector<double>& q, const std::vector<double>& r,
               std::vector<double>& p);

void   tisk(const char* n, const std::vector<double>& t)
{
  std::cout << n << "(x) = ";
  for (int i=t.size()-1; i>=0; i--)
    {
      std::cout << std::abs(t[i]);
      if (i)
        { 
          std::cout << ".x";
          if (i > 1) std::cout << "^" << i;
          if (t[i-1] >= 0) 
            std::cout << " + ";
          else
            std::cout << " - ";
        }
      else 
        std::cout << std::endl;
    }
}

int main()
{
  using namespace std;

  vector<double> p, q, r, s;
  p.push_back(9);
  p.push_back(2);
  p.push_back(5);
  p.push_back(2);
  p.push_back(7);

  q.push_back( 3);
  q.push_back(-1);
  q.push_back( 2);

  r.push_back(6);
  r.push_back(3);
  r.push_back(3);
  r.push_back(2);
  r.push_back(7);

  soucet(q, r, s);

  tisk("p", p);
  tisk("q", q);
  tisk("r", r);
  tisk("s", s);

  cout << "\n x \t p(x) \t s(x)\n"; 
  for (double x=0; x<1.05; x+=0.1)
    {
      cout << x << "\t" 
           << polynom(x, p) << "\t"
           << polynom(x, s) 
           << endl;
    }
}


double polynom(double x, const std::vector<double>& a)
{
  int    n = a.size();
  double h = a[--n];
  do 
    {
      h *= x;
      h += a[--n];
    } while (n);

  return h;
}


void   soucet (const std::vector<double>& q, const std::vector<double>& r,
               std::vector<double>& p)
{
  // ve vystupnim kontejneru 'p' musime nejprve zrusit vsechny jeho prvky
  p.clear();
  const int nq  = q.size();
  const int nr  = r.size();
  const int max = std::max(nq, nr);

  for (int i=0; i<max; i++)
    {
      double s = 0;
      if (i < nq) s += q[i];
      if (i < nr) s += r[i];
      p.push_back(s);
    }
}
p(x) = 7.x^4 + 2.x^3 + 5.x^2 + 2.x + 9
q(x) = 2.x^2 - 1.x + 3
r(x) = 7.x^4 + 2.x^3 + 3.x^2 + 3.x + 6
s(x) = 7.x^4 + 2.x^3 + 5.x^2 + 2.x + 9

 x 	 p(x) 	 s(x)
0	9	9
0.1	9.2527	9.2527
0.2	9.6272	9.6272
0.3	10.1607	10.1607
0.4	10.9072	10.9072
0.5	11.9375	11.9375
0.6	13.3392	13.3392
0.7	15.2167	15.2167
0.8	17.6912	17.6912
0.9	20.9007	20.9007
1	25	25