Форум программистов, компьютерный форум CyberForum.ru

Упражнение из книги Страуструпа для начинающих. Точность вычислений - C++

Восстановить пароль Регистрация
 
PG94
2 / 2 / 0
Регистрация: 15.01.2012
Сообщений: 181
09.08.2013, 21:03     Упражнение из книги Страуструпа для начинающих. Точность вычислений #1
Добрый вечер. В конце одной из глав идёт след. упражнение:
Модифицируйте класс Fct так, чтобы в нём был дополнительный аргумент, позволяющий контролировать точность. Сделайте тип этого аргумента шаблонным параметром, чтобы повысить гибкость класса.
Как понять "контролировать точность"? Подскажите, пожалуйста, что же имелось ввиду.
Вот имеющийся код (класс Function):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
//------------------------------------------------------------------------------
 
typedef double Fct(double);
 
class Shape  {        // deals with color and style, and holds sequence of lines 
public:
    void draw() const;                 // deal with color and draw lines
    virtual void move(int dx, int dy); // move the shape +=dx and +=dy
 
    void set_color(Color col) { lcolor = col; }
    Color color() const { return lcolor; }
    void set_style(Line_style sty) { ls = sty; }
    Line_style style() const { return ls; }
    void set_fill_color(Color col) { fcolor = col; }
    Color fill_color() const { return fcolor; }
 
    Point point(int i) const { return points[i]; } // read only access to points
    int number_of_points() const { return int(points.size()); }
 
    virtual ~Shape() { }
protected:
    Shape();    
    virtual void draw_lines() const;   // draw the appropriate lines
    void add(Point p);                 // add p to points
    void set_point(int i,Point p);     // points[i]=p;
private:
    vector<Point> points;              // not used by all shapes
    Color lcolor;                      // color for lines and characters
    Line_style ls; 
    Color fcolor;                      // fill color
 
    Shape(const Shape&);               // prevent copying
    Shape& operator=(const Shape&);
};
 
//------------------------------------------------------------------------------
 
struct Function : Shape {
    // the function parameters are not stored
    Function(Fct f, double r1, double r2, Point orig,
        int count = 100, double xscale = 25, double yscale = 25);    
};
 
Function::Function(Fct f, double r1, double r2, Point xy,
                   int count, double xscale, double yscale)
// graph f(x) for x in [r1:r2) using count line segments with (0,0) displayed at xy
// x coordinates are scaled by xscale and y coordinates scaled by yscale
{
    if (r2-r1<=0) error("bad graphing range");
    if (count <=0) error("non-positive graphing count");
    double dist = (r2-r1)/count;
    double r = r1;
    for (int i = 0; i<count; ++i) {
        add(Point(xy.x+int(r*xscale),xy.y-int(f(r)*yscale)));
        r += dist;
    }
}
 
//-----------------------------------------------------------------------------
Класс FCT:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
class FCT : public Function {
public:
    FCT(Fct f, double r1, double r2, Point xy, int cnt=100, double xscl=25, double yscl=25)
        : Function(f,r1,r2,xy,cnt,xscl,yscl), func(f)
    {
        ag_min=r1;
        ag_max=r2;
        orig=xy;
        count=cnt;
        xscale=xscl;
        yscale=yscl;
    }
 
    void set_func(Fct f) { func=f; }
    void set_range(double r_min, double r_max) 
    { 
        ag_min=r_min; 
        ag_max=r_max;
    }
    void set_xy(Point xy) { orig=xy; }
    void set_scale(double xscl, double yscl)
    {
        xscale=xscl;
        yscale=yscl;
    }
 
    void make_changes();
private:
    Fct* func;
 
    double ag_min;
    double ag_max;
    Point orig;
    int count;
    double xscale;
    double yscale;
};
 
void FCT::make_changes()
{
    if (ag_max<ag_min) error("bad graphing range");
    if (count <=0) error("non-positive graphing count");
    double dist = (ag_max-ag_min)/count;
    double r = ag_min;
    for (int i = 0; i<count; ++i) {
       set_point(i,Point(orig.x+int(r*xscale),orig.y-int(func(r)*yscale)));
       r += dist;
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.08.2013, 21:03     Упражнение из книги Страуструпа для начинающих. Точность вычислений
Посмотрите здесь:

C++ Точность вычислений
Книги для начинающих C++
Посоветуйте книги по С++ для начинающих C++
Упражнение из Страуструпа (Определите таблицу названий месяцев года и числа дней в них) C++
Упражнение из Страуструпа: конкатенация С-строк C++
Библиотеки для книги Страуструпа C++
C++ Высокая точность вычислений (погрешность<10^-30)
C++ Упражнение для программы калькулятор из книги Язык программирования С++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 13:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru