Visa elektrotehnicka skola, Beograd
Ласло Краус
Објектно програмирање - колоквијуми
Први колоквијум
Друга група
12. 4. 2006.

Задатак | Напомене | Решење

Поставка задатка (решење | садржај)

Лагранжов (Lagrange) полином се задаје низом тачака (xi,yi), а вредност p(x) се за произвољно x рачуна према приложеној формули. Саставити на језику C++ класу за Лагранжове полиноме (тачке представљати структуром са два реална атрибута). Предвидети:

  1. иницијализацију полинома задатог реда (подразумевано 2) са тачкама једнаким (i,i), где је i индекс тачке,
  2. иницијализацију полинома другим полиномом,
  3. уништавање полинома,
  4. додељивање вредности једног полинома другом (p1=p2),
  5. дохватање реда полинома,
  6. приступање задатој тачки (p[i] – недозвољен индекс прекида програм),
  7. израчунавање вредности полинома (p(x)),
  8. читање полинома из датотеке (dat>>p – чита се ред полинома и низ тачака),
  9. уписивање полинома у датотеку (dat<<p) у облику p[(x0,y0);(x1,y1);;(xn,yn)].

Саставити на језику C++ главни програм који:


Напомене (садржај)


Решење задатка (поставка | садржај)

// polinom.h

#include <cstdlib>
#include <iostream>
using namespace std;

struct Tacka { double x, y; };

class Polinom {
  Tacka* a; int n;
  void kopiraj (const Polinom& p);
  void brisi () { delete [] a; }
public:
  explicit Polinom (int n=2);
  Polinom (const Polinom& p) { kopiraj (p); }
  ~Polinom () { brisi (); }
  Polinom& operator= (const Polinom& p) {
    if (this != &p) { brisi (); kopiraj (p); }
    return *this;
  }
  int red () const { return n; }
  Tacka& operator[] (int i) {
    if (i<0 || i>n) exit (1);
    return a[i];
  }
  const Tacka& operator[] (int i) const {
    if (i<0 || i>n) exit (1);
    return a[i];
  }
  double operator() (double x) const;
  friend istream& operator>> (istream& d, Polinom& p);
  friend ostream& operator<< (ostream& d, const Polinom& p);
};

// polinom.cpp #include "polinom.h" void Polinom::kopiraj(const Polinom& p) { a = new Tacka [(n = p.n) + 1]; for (int i=0; i<=n; i++) a[i] = p.a[i]; } Polinom::Polinom (int n) { a = new Tacka [(this->n = n) + 1]; for (int i=0; i<=n; i++) a[i].x = a[i].y = i; } double Polinom::operator() (double x) const { double p = 0; for (int i=0; i<=n; i++) { double q = a[i].y; for (int j=0; j<=n; j++) if (j != i) q *= (x - a[j].x) / (a[i].x - a[j].x); p += q; } return p; } istream& operator>> (istream& d, Polinom& p) { p.brisi (); d >> p.n; p.a = new Tacka [p.n+1]; for (int i=0; i<=p.n; i++) cin >> p.a[i].x >> p.a[i].y; return d; } ostream& operator<< (ostream& d, const Polinom& p) { d << "p["; for (int i=0; i<=p.n; i++) { if (i) d << ';'; d << '(' << p.a[i].x << ',' << p.a[i].y << ')'; } return d << ']'; }
// test.cpp #include "polinom.h" #include <iostream; using namespace std; int main () { while (true) { cout << "Red? "; int n; cin >> n; if (n < 0) break; Polinom p (n); cout << "Tacke? "; for (int i=0; i<=n; i++) cin >> p[i].x >> p[i].y; cout << "xmin, xmax, dx? "; double xmin, xmax, dx; cin >> xmin >> xmax >> dx; for (double x=xmin; x<=xmax; x+=dx) cout << x << '\t' << p(x) << endl; } }
Red? 3 Tacke? -1 1 0 -2 1 3 2 1 p= p[(-1,1);(0,-2);(1,3);(2,1)] xmin, xmax, dx? -2 3 .5 -2 27 -1.5 10.1875 -1 1 -0.5 -2.4375 0 -2 0.5 0.4375 1 3 1.5 3.8125 2 1 2.5 -7.3125 3 -23 Red? -1
(садржај)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

Copyright © 2010, Laslo Kraus
Последња ревизија: 4.10.2010.