Qt cvičení - rozvoj funkce sinus

Z GeoWikiCZ
Přejít na: navigace, hledání

Napište interaktivní GUI aplikaci, která pro zadaný argument počítá jednotlivé kroky rozvoje funkce sinus pro zadaný argument v bodě nula.

Qt-rozvoj fce sinus.png

Třída MainWindow definuje privátní atributy x, y, n, c, s viz jejich popis v komentářích.

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    double x;    // argument
    double y;    // spravna hodnota
    int    n;    // index
    double c;    // clen
    double s;    // castecny soucet

private slots:
    void on_pushButton_clicked();
    void on_lineEdit_x_textChanged(QString );
};

Konstruktor explicitně maže obsah widgetů Label, které jsou používány pro výstup údajů.

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    ui->label_sin   ->clear();
    ui->label_n     ->clear();
    ui->label_clen  ->clear();
    ui->label_soucet->clear();
    ui->label_chyba ->clear();
}

Při změně widgetu LineEdit (zadání argumentu x) jsou nastaveny hodnoty interních atributů (slot reagující na signál text changed).

void MainWindow::on_lineEdit_x_textChanged(QString )
{
    x = ui->lineEdit_x->text().toDouble();
    y = std::sin(x);
    ui->label_sin->setText("sin(x) = " + QString::number(y));

    n = 1;   // index
    c = x;   // prvni clen
    s = x;   // castecny soucet

    ui->label_n     ->setText(QString::number(n));
    ui->label_clen  ->setText(QString::number(c));
    ui->label_soucet->setText(QString::number(s));
    ui->label_chyba ->setText(QString::number(s-y));
}

Výpočet dalšího členu rozvoje (a zobrazení průběžného stavu) se provádí ve slotu vždy po stisknutí tlačítka Další. Hodnota členu rozvoje se přitom počítá z předchozího členu rozvoje (tj. nikdy například nepočítáme explicitně faktoriály nebo mocniny).

void MainWindow::on_pushButton_clicked()
{
    c /= (n+1)*(n+2);
    n += 2;
    c *= -x*x;
    s += c;

    ui->label_n     ->setText(QString::number(n));
    ui->label_clen  ->setText(QString::number(c));
    ui->label_soucet->setText(QString::number(s));
    ui->label_chyba ->setText(QString::number(s-y));
}

Příklady funkcí pro výpočet funkční hodnoty rozvojem viz příklady 6, 7, 8 a 9.