Садржај
2 Класе и објекти
2.1 Основни појмови о класама и објектима
3 Генеричке класе
4 Наслеђивање и полиморфизам
5 Примери пројеката са решењима
5.1 Различита кретања
5.2 Квиз
5.4 Приказ рада алгоритама сортирања

Вредност функције

Овај пример је знатно већи од претходна два и обухвата неколико пројеката. Најважнији пројекат у примеру је библиотека Funkcije, која омогућава задавање функције у текстуалном облику и брзо израчунавање вредности те функције за разне вредности променљиве \(x\). Ова библиотека се затим користи у различитим апликацијама.

Прва употреба библиотеке Funkcije је једноставна конзолна апликација, која табеларно приказује вредности задате функције у задатом интервалу. Она уједно служи и за тестирање библиотеке.

Друга употреба је апликација за цртање графика функције коју унесе корисник. У овој апликацији је употребљена и библиотека CoordinateConverter, која омогућава флексибилан приказ координатног система и прерачунавање координата из координатног система света у координатни систем екрана и обрнуто.

Трећа употреба је апликација која израчунава приближну вредност променљиве \(x\) за коју функција има вредност нула.

Дакле, у примеру се појављују следећи пројекти:

  • библиотека Funkcije,

  • конзолна апликација за тестирање и табелирање вредности функције,

  • библиотека CoordinateConverter, која је коришћена и раније,

  • графичка апликација за цртање графика произвољне функције,

  • конзолна апликација за налажење нула функције.

Класа Function и изведене класе

Суштина сваке математичке функције је да дефинише правило по коме се дати реалан број \(x\) пресликава у реалан број \(f(x)\). Према томе, класа која представља математичку функцију треба да има метод попут:

double Value(double x)

…помоћу кога се добија вредност функције за дато \(x\). Пошто свака функција ту вредност одређује на свој начин, можемо да формирамо апстрактну класу Function са јавним апстрактним методом Value, који свака конкретна функција треба да имплементира на свој начин.

abstract public class Function
{
    abstract public double Value(double x);
}

Функције се често компонују у сложене функције, на пример \(e^{\sin(x)}\), \(\sqrt{x^2+1}\) и слично. Да бисмо могли да градимо овакве, сложене функције, згодно је да објекат који представља функцију садржи референце на друге функције, које се појављују као њени параметри. На пример, ако желимо да формирамо објекат који представља функцију \(e^{f(x)}\) где је \(f\) нека већ креирана функција, згодно је да нова, експоненцијална функција садржи референцу на функцију \(f\) и да је користи за израчунавање своје вредности.

Тако долазимо до прве, поједностављене верзије хијерархије класа за представљање математичких функција:

Након оваквог креирања класа Sine, Exponential, Product, Variable и Constant, можемо да пишемо наредбе попут:

Function x = new Variable();
Function sin = new Sine(x);
Function expsin = new Exponential(sin);
Console.WriteLine("exp(sin(0)) = {0}", expsin.Value(0));

Function tri = new Constant(3);
Function triPutaX = new Product(tri, x);
Console.WriteLine("3 x 5 = {0}", triPutaX.Value(5));

Додатну удобност добијамо ако напишемо и оператор за имплицитну конверзију реалног броја у константну функцију.

public static implicit operator Function(double c) {
    return new Constant(c);
}

Слично томе, можемо да додамо и оператор за имплицитну конверзију стринга у функцију типа Variable.

public static implicit operator Function(string s) {
    return new Variable(s);
}

Сада уместо:

Function x = new Variable();
Function tri = new Constant(3);
Function triPutaX = new Product(tri, x);

…можемо краће да пишемо

Function triPutaX = new Product(3, "x"); // implicitna konverzija

Креирањем врло сличних класа за остале уобичајене функције долазимо до коначног облика хијерархије класа за представљање математичких функција. На крају фајла је мала класа FunctionTester којом испробавамо написани кôд.

(Created using Swinx, RunestoneComponents and PetljaDoc)
© 2022 Petlja
A- A+