Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
PG94
2 / 2 / 0
Регистрация: 15.01.2012
Сообщений: 181
#1

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

09.08.2013, 21:03. Просмотров 359. Ответов 0
Метки нет (Все метки)

Добрый вечер. В конце одной из глав идёт след. упражнение:
Модифицируйте класс 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;
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.08.2013, 21:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Упражнение из книги Страуструпа для начинающих. Точность вычислений (C++):

Упражнение №8 глава 5 из книги Страуструпа - C++
Здравствуйте. Помогите решить задание. Напишите программу,считывающую ряд чисел и записывающую их в vector&lt;int&gt;.После того как...

Упражнение из книги Страуструпа. Программа угадай число. Можно ли написать лучше? - C++
Всем привет. Сделал упражнение к книге Бьерна Страуструпа &quot;Программирование. Принципы и практика использования С++&quot;. Текст упражнения...

Упражнение из книги Страуструпа. Программа мини-калькулятор. Цифры записанные в строковом формате - C++
Привет всем. Не могу понять, как необходимо изменить программу исходя из условия упражнения. Упражнение сформулировано так: ...

Упражнение из книги Страуструпа - C++
Напишите программу, проверяющую корректность предложений в соответствии с правилами &quot;Английской грамматики&quot; (см.ниже) Будем считать, что...

Упражнение из Страуструпа: конкатенация С-строк - C++
Напишите функцию cat(), которая принимает в качестве аргументов две С-строки и возвращает конкатенированную С-строку. Используйте операцию...

Библиотеки для книги Страуструпа - C++
Доброго времени суток! Дядя Бьярне использует библиотеки в своей книге &quot;Принципы и практика использования С++&quot;, которых нет в компиляторах....

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2013, 21:03
Привет! Вот еще темы с ответами:

Упражнение для программы калькулятор из книги Язык программирования С++ - C++
Здравствуйте. Вот упражнение и калькулятор из книги Страуструпа. Не могли бы вы объяснить мне, как ввести в калькулятор функцию sin() ?...

Упражнение из Страуструпа (Определите таблицу названий месяцев года и числа дней в них) - C++
Определите таблицу названий месяцев года и числа дней в них. Выведите ее. Сделайте это два раза: один раз используя вектор для названий и...

Книги для начинающих - C++
Здраствуюте, скажите, где можно скачать нормальную, простую для понятия новечкам книгу о программе С++ Builder 6? P.S. Зарание спасибо

Точность вычислений - C++
Для проверки точности вычислений существуют формулы и калькулятор на 200000 знаков до и после запятой. Проверяются любые вычисленные...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru