Spis treści

Funkcje wirtualne, klasy abstrakcyjne

Przykład funkcji wirtualnej

class Bazowa
{
public:
   virtual void Wirtualna()
   {
      /* implementacja w klasie bazowej */
   }
};
 
class Pochodna : public Bazowa
{
public:
   virtual void Wirtualna() override
   {
      /* implementacja w klasie pochodnej */ 
   }
};

Przykład funkcji abstrakcyjnej

class KlasaAbstrakcyjna
{
    virtual int Wirtualna() = 0;
};

Przykład rzutowania dynamicznego

Bazowa *bazowa = new Bazowa();
Pochodna *pochodna = dynamic_cast<Pochodna*>(bazowa);
 
if(pochodna) { /* tylko gdy pochodna dziedziczy po bazowej */ }

Klasa funkcja Gaussa

Program rozszerza implementację programu z poprzednich zajęć, którego źródła znajdziesz w zakładce pliki lub w repozytorium GitHub.

1. Utwórz klasę Gauss - reprezentującą funkcję Gaussa zawierającą:

$$f(x)=\frac{1}{\sigma \sqrt{2 \pi}} \exp \left(\frac{-(x-\mu)^2}{2 \sigma^2}\right)$$

2. Utwórz klasę Funkcja, która uogólnia pojecie funkcji i będzie stanowiła klasę bazową klasy Wielomian i klasy Gauss. Jakie cechy (metody, atrybuty) można uogólnić do klasy Funkcja?
Klasa Funkcja zawiera:

Diagram klas

3. Napisz funkcję globalną o nazwie calka, która zwraca przybliżoną wartość całki funkcji oznaczonej na przedziale $[a,b]$. Obliczenia wykonywane są metodą złożonych prostokątów, gdzie sumujemy pola $n$ prostokątów $h\cdot f(x)$w równoodległych punktach na odcinku $[a, b]$

$$ \int_a^b f(x) \approx h \sum_{i=0}^{n-1} f(a+i \cdot h) \qquad \text{gdzie} \qquad h=\frac{b-a}{n} $$

Argumentami funkcji calka są:

4. Napisz program, który wyznaczy całkę funkcji Gaussa na przedziale $[\mu, 3\sigma]$ (wartości $\mu$ i $\sigma$ wybierz dowolnie) oraz całkę funkcji kwadratowej $f(x)=x^2$ na odcinku $[0, 1]$. Liczbę węzłów $n$ użytą do wyznaczenia całki podaje użytkownik na początku działania programu.

Przykład działania programu:

Ile wezlow calkowania? 100

Funkcja: Gauss (srednia=3, odchylenie=5)
Przedzial calkowania: [3, 15]
Wynik calkowania = 0.496318

Funkcja: f(x) = 1x^2 
Przedzial calkowania: [0, 1]
Wynik calkowania = 0.32835

Zadanie 7: Figury

Zaimplementuj klasy Figura, Kolo, Kwadrat i Trojkat oraz odpowiednie metody zgodnie z podanym diagramem:

Diagram klas

Każda figura dziedzicząca po klasie Figura implementuje funkcje obliczające pole i obwód danej figury. $$ \begin{array}{lll} P_{\circ}=\pi r^2 \qquad & P_{\square}=a^2 \qquad & P_{\triangle}=\frac{a^2\sqrt{3}}{4} \\ O_{\circ}=2\pi r & O_{\square}=4a & O_{\triangle}=3a \\ \end{array} $$

Dociąż operator przesunięcia bitowego « dla figur w taki sposób aby umieszczał w strumieniu wyjściowym std::ostream napis zawierający nazwę figury, wartość pola oraz obwodu figury, np.:

Kwadrat k(3);
cout << k << endl;
 
Trojkat t(3);
cout << t << endl;

spowoduje wypisanie na konsoli komunikatu postaci

Kwadrat o polu 9 i obwodzie 12
Trojkat o polu 3.89711 i obwodzie 9

Napisz klasę Sumator, której zadaniem jest sumowanie pól powierzchni figur. Klasa posiada pole suma o wartości rzeczywistej oraz udostępnia następujące operacje:

Napisz program wykorzystujący klasę Sumator do policzenia sumy pól n kół o promieniach $r=1, 2, 3, \ldots, n$ i $n$ kwadratów o bokach $a=1, 2, 3, \ldots, n$ oraz $n$ trójkątów równoramiennych o bokach $a=1, 2, 3, \ldots, n$. Wartość całkowitą $n$ podaje użytkownik na początku działania programu.

Przykład działania programu:

n=3

1: dodaje Kolo o polu 3.1415 i obwodzie 6.283
2: dodaje Kolo o polu 12.566 i obwodzie 12.566
3: dodaje Kolo o polu 28.2735 i obwodzie 18.849

1: dodaje Kwadrat o polu 1 i obwodzie 4
2: dodaje Kwadrat o polu 4 i obwodzie 8
3: dodaje Kwadrat o polu 9 i obwodzie 12

1: dodaje Trojkat o polu 0.433013 i obwodzie 3
2: dodaje Trojkat o polu 1.73205 i obwodzie 6
3: dodaje Trojkat o polu 3.89711 i obwodzie 9

Suma pol wynosi 64.0432

Rozwiązanie w postaci plików nagłówkowych *.h i źródłowych *.cpp umieść w Moodle Zadanie 7