Russian Qt Forum
Июнь 01, 2024, 13:14 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 [2] 3 4
16  Qt / Кладовая готовых решений / Re: Задача о 2-х велосипедистах и электромобиле. : Май 11, 2022, 19:30
В третьем классе чего - школы?
У современных студентов даже такая задача вызывает затруднения...
17  Qt / Кладовая готовых решений / Задача о 2-х велосипедистах и электромобиле. : Май 11, 2022, 15:14
Цитировать
Два велосипедиста выехали одновременно из пункта A по одной дороге с различными скоростями u и v метров в секунду. Через t секунд им вдогонку выехал электромобиль и через некоторое время обогнал одного, а затем и другого велосипедиста. При этом интервал между моментами обгона составил d секунд.

Вы должны написать программу , которая вычислит скорость движения электромобиля.

Формат входных данных
На вход через пробел подаются четыре натуральных числа: u, v, t, d. При этом u != v; u, v <= 50; t, d <= 10000. Гарантируется, что введенные данные будут таковы, что ответ не превысит 200.

Формат выходных данных
Программа должна вывести одно вещественное число — скорость электромобиля.

Методика проверки и пояснение к тесту
Ответ участника считается верным, если он отличается от ответа жюри не более чем на 10^-8.

Программа проверяется на 10 тестах. Прохождение каждого теста оценивается в 2 балла. При этом в первых пяти тестах ответ обязательно будет целым числом. Тест из условия задачи при проверке не используется.

Рассмотрим тест из примера. Утверждается, что для заданных параметров ответом является 12. Проверим это. Можно вычислить, что электромобиль, двигаясь со скоростью 12 м/с. догонит обгонит более медленного велосипедиста на расстоянии 480 метров, а более быстрого на расстоянии в 1200 метров. Действительно электромобиль преодолеет 480 и 1200 метров за 40 и 100 секунд соответственно. Таким образом, интервал между моментами обгона действительно равен 60. Велосипедисты до моментов обгона будут двигаться на 20 секунд дольше, по 60 и 120 секунд соответственно. И, проверив пройденное расстояние 60*8=480 и 120*10=1200, убедимся, что ответ верен. Обратите внимание, что это пояснение лишь показывает, как проверить правильность ответа, но не является алгоритмом решения.

Пример ввода:
10 8 20 60

Пример вывода:
12.0
Код:
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <qmath.h>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;

public slots:
    void press_pbtn_01();
};

#endif // WIDGET_H


Код:
#include "widget.h"
#include "ui_widget.h"



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

    QObject::connect(ui->pbtn_01,SIGNAL(clicked()),this,SLOT(press_pbtn_01()));
}



Widget::~Widget()
{
    delete ui;
}



void Widget::press_pbtn_01()
{
    QString str;

    str = ui->lineEdit_01->text();
    double u = str.toDouble();
    str = ui->lineEdit_02->text();
    double v = str.toDouble();
    str = ui->lineEdit_03->text();
    double t = str.toDouble();
    str = ui->lineEdit_04->text();
    double d = str.toDouble();

    double v_max = 200;
    double v_min = u;

    double x, s1, s2, vmash;

    while(qAbs(v_max - v_min) > 1e-12)
    {
        vmash = (v_max + v_min) / 2;

        s1 = vmash * (u * t) / (vmash - u);
        s2 = vmash * (v * t) / (vmash - v);

        x = qAbs(s1 - s2) / vmash;

        if(x < d) v_max = vmash;
        if(x > d) v_min = vmash;
    }

    ui->label_01->setText(QString::number(s1, 'g', 12));
    ui->label_02->setText(QString::number(s2, 'g', 12));
    ui->label_03->setText(QString::number(vmash, 'g', 12));
}
18  Qt / Кладовая готовых решений / Задача Джонсона для 2-х станков : Май 08, 2022, 10:19
Задача Джонсона для 2-х станков. Максимальное количество деталей - 10. Максимальное время обработки - 1000 минут. Ограничения условные и легко могут быть расширены коррекцией кода. Кнопка "Make" выполняет пошаговое выполнение программы. Кнопка "Run" - полное выполнение. При запуске программы таблица заполнена тестовыми значениями.

Код:
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QMessageBox>


QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;

    int dt[10][3];
    int data_t1[10][3];
    int data_t2[10][3];

    // позиция в таблице
    int r_min;
    int r_max;

    // количество введённых данных
    int cx_max;
    // количество ходов
    int cx_move;

    // считает максимальное время простоя
    void make_rating();
    //
    void print_table();

public slots:
    void press_pbtn_01();
    void press_pbtn_02();
    void press_pbtn_03();
    void press_pbtn_04();
};

#endif // WIDGET_H


Код:
#include "widget.h"
#include "ui_widget.h"


// https://math.semestr.ru/dinam/jonson.php


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

    ui->tableWidget_1->setSelectionMode(QAbstractItemView::NoSelection);
    ui->tableWidget_2->setSelectionMode(QAbstractItemView::NoSelection);

    int data[6][2] = {{6,3},{8,5},{4,5},{4,2},{5,8},{8,4}};


    for(int i = 0; i < 10; i++)
        for(int j = 0; j < 3; j++)
        {
            if(!j) data_t1[i][j] = i+1;
            else data_t1[i][j] = -1;

            if(i < 6 && j > 0)
                data_t1[i][j] = data[i][j-1];

            data_t2[i][j] = -1;
        }

    for(int row = 0; row < 10; row++)
        for(int col = 0; col < 3; col++)
        {
            QTableWidgetItem *item1 = new QTableWidgetItem;
            item1->setTextAlignment(Qt::AlignCenter);
            if(!col) item1->setBackgroundColor(Qt::yellow);
            ui->tableWidget_1->setItem(row, col, item1);

            QTableWidgetItem *item2 = new QTableWidgetItem;
            item2->setTextAlignment(Qt::AlignCenter);
            if(!col) item2->setBackgroundColor(Qt::yellow);
            ui->tableWidget_2->setItem(row, col, item2);
        }

    print_table();


    QObject::connect(ui->pbtn_01,SIGNAL(clicked()),this,SLOT(press_pbtn_01()));
    QObject::connect(ui->pbtn_02,SIGNAL(clicked()),this,SLOT(press_pbtn_02()));
    QObject::connect(ui->pbtn_03,SIGNAL(clicked()),this,SLOT(press_pbtn_03()));
    QObject::connect(ui->pbtn_04,SIGNAL(clicked()),this,SLOT(press_pbtn_04()));
}




Widget::~Widget()
{
    delete ui;
}




// load
void Widget::press_pbtn_01()
{
    int x;
    static QString str;

    r_min = 0;
    r_max = 0;

    for(int row = 0; row < 10; row++)
        for(int col = 0; col < 3; col++)
        {
            if(col > 0)
            {
                str = ui->tableWidget_1->item(row, col)->text();
                if(str == "") x = -1;
                else
                {
                    r_max++;
                    x = str.toInt();
                }

                data_t1[row][col] = x;
            }

            dt[row][col] = data_t1[row][col];
            data_t2[row][col] = -1;
        }

    print_table();

    r_max /= 2;
    cx_max = r_max;
    cx_move = r_max--;

    ui->label_02->setNum(0);
    ui->label_03->setNum(0);

    if(cx_move)
    {
        ui->pbtn_02->setEnabled(true);
        ui->pbtn_03->setEnabled(true);
    }
}




// make
void Widget::press_pbtn_02()
{
    int x;
    int r = 0;
    int b = 0;
    int x_min = 1001;

    if(!cx_move) return;
    ui->pbtn_03->setEnabled(false);

    cx_move--;

    for(int row = 0; row < 10; row++)
        for(int col = 1; col < 3; col++)
        {
            x = dt[row][col];
            if(x == -1) continue;

            if(x < x_min)
            {
                b = col;
                r = row;
                x_min = x;
            }
        }


    if(b == 1)
    {
        data_t2[r_min][0] = r+1;
        data_t2[r_min][1] = dt[r][1];
        data_t2[r_min][2] = dt[r][2];
        r_min++;
    }

    if(b == 2)
    {
        data_t2[r_max][0] = r+1;
        data_t2[r_max][1] = dt[r][1];
        data_t2[r_max][2] = dt[r][2];
        r_max--;
    }

    print_table();

    dt[r][1] = -1;
    dt[r][2] = -1;

    if(!cx_move)
    {
        make_rating();
        ui->pbtn_02->setEnabled(false);
    }

}




// run
void Widget::press_pbtn_03()
{
    ui->pbtn_02->setEnabled(false);
    ui->pbtn_03->setEnabled(false);

    for(int i = 0; i < cx_max; i++)
    {
        press_pbtn_02();
    }
}




// clear
void Widget::press_pbtn_04()
{
    r_min = 0;
    r_max = 0;
    cx_move = 0;

    for(int row = 0; row < 10; row++)
        for(int col = 0; col < 3; col++)
        {
            if(col > 0) data_t1[row][col] = -1;
            data_t2[row][col] = -1;
        }

    print_table();

    ui->label_02->clear();
    ui->label_03->clear();

    ui->pbtn_02->setEnabled(false);
    ui->pbtn_03->setEnabled(false);

}




void Widget::make_rating()
{
    int k;
    int res_t1 = -1;
    int res_t2 = -1;
    int sum;
    int sum2 = 0;

    sum = data_t1[0][1];
    if(sum > res_t1) res_t1 = sum;

    for(int i = 1; i < cx_max; i++)
    {
        sum += data_t1[i][1];
        sum2 += data_t1[i-1][2];
        k = sum - sum2;
        if(k > res_t1) res_t1 = k;
    }


    sum2 = 0;
    sum = data_t2[0][1];
    if(sum > res_t2) res_t2 = sum;

    for(int i = 1; i < cx_max; i++)
    {
        sum += data_t2[i][1];
        sum2 += data_t2[i-1][2];
        k = sum - sum2;
        if(k > res_t2) res_t2 = k;
    }

    ui->label_02->setNum(res_t1);
    ui->label_03->setNum(res_t2);
}





void Widget::print_table()
{
    int x;
    QString str;


    for(int row = 0; row < 10; row++)
        for(int col = 0; col < 3; col++)
        {
            x = data_t1[row][col];
            if(x < 0) str = "";
            else str = QString::number(x);
            ui->tableWidget_1->item(row, col)->setText(str);

            x = data_t2[row][col];
            if(x < 0) str = "";
            else str = QString::number(x);
            ui->tableWidget_2->item(row, col)->setText(str);
        }

}




    //QMessageBox msgBox;

    //msgBox.setText(QString::number(r) + "  " + QString::number(b));
    //msgBox.exec();

19  Qt / Кладовая готовых решений / Re: Круги в таблице QTableWidget, имитация графики : Май 05, 2022, 17:18
Russian Qt Forum - будем поддерживать отечественного производителя. И импортозамещение.
20  Qt / Кладовая готовых решений / Re: Круги в таблице QTableWidget, имитация графики : Май 05, 2022, 13:13
Слышал, и даже заходил - но ни разу имеющаяся там информация мне не помогла. Набор каких-то ссылок на файлы, не имеющие полезной информации - по крайней мере для меня.

А в чём проблема? Тема называется "Кладовая готовых решений", я как раз и выкладываю готовые решения, полезные для новичков, тех кто делает первые шаги в Qt.
21  Qt / Кладовая готовых решений / Круги в таблице QTableWidget, имитация графики : Май 05, 2022, 10:19
Рисование цветных кругов в ячейках таблицы QTableWidget, псевдографика. Подходит для игры Го и подобных:

Код:
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QLabel>



QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;

public slots:
    void press_pbtn_01();
    void table_clik(int, int);

};
#endif // WIDGET_H


Код:
#include "widget.h"
#include "ui_widget.h"



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

    // отключение курсора
    ui->tableWidget->setSelectionMode(QAbstractItemView::NoSelection);

    // инициализация таблицы
    for(int i = 0; i < 10; i++)
        for(int j = 0; j < 10; j++)
        {
            ui->tableWidget->setCellWidget(i ,j, new QLabel);
        }



    QObject::connect(ui->pbtn_01,SIGNAL(clicked()),this,SLOT(press_pbtn_01()));

    QObject::connect(ui->tableWidget,SIGNAL(cellClicked(int, int)),
                                               this,SLOT(table_clik(int, int)));

}



Widget::~Widget()
{
    delete ui;
}



// clear
void Widget::press_pbtn_01()
{
    QString str = "border-radius: 13px; background-color:white;";

    for(int row = 0; row < 10; row++)
        for(int col = 0; col < 10; col++)
        {
            QLabel *lbl(qobject_cast<QLabel*>(ui->tableWidget->cellWidget(row, col)));
            lbl->setStyleSheet(str);
        }

    this -> repaint();
}




// клик в таблицу
void Widget::table_clik(int row, int col)
{
    static int cx = 0;

    QString str = "border-radius: 13px; background-color:red;";
    if(cx % 2) str = "border-radius: 13px; background-color:blue;";

    QLabel *lbl(qobject_cast<QLabel*>(ui->tableWidget->cellWidget(row, col)));

    lbl->setFixedSize(26, 26);
    lbl->setStyleSheet(str);

    cx++;
}

22  Qt / Кладовая готовых решений / Re: Вычисление 3200 знаков числа Пи : Май 04, 2022, 19:02
Алгоритм реализует вычисления по формуле, приведённой ниже. Вот всё, что удалось накопать.
23  Qt / Кладовая готовых решений / Вычисление 3200 знаков числа Пи : Май 03, 2022, 21:02
Алгоритм не мой, я только "перелицевал" его с С на Qt C++. Как работает - не знаю. Но работает. 3200 знаков вычисляет за доли секунды (на моём компе).

Оригинал программы на С:
Код
C
int a=10000,b,c=2800,d,e,f[2801],g;main(){for(;b-c;)f[b++]=a/5; for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)for(b=c;d+=f[b]*a, f[b]=d%--g,d/=g--,--b;d*=b);}

Код программы на С++. Хедер не выкладываю, там только слот кнопки.

Код:
#include "widget.h"
#include "ui_widget.h"



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

    QObject::connect(ui->pbtn_01,SIGNAL(clicked()),this,SLOT(press_pbtn_01()));
}



Widget::~Widget()
{
    delete ui;
}




void Widget::press_pbtn_01()
{
    quint64 a = 10000;
    quint64 b;
    quint64 c = 11200;    //2800 5600 11200 22400 89600 112000
    quint64 d;
    quint64 e = 0;
    quint64 f[11201];     //2801 5601 11201 22401 89601 112001
    quint64 g;

    quint32 x;
    quint32 cx = 0;

    QString str;

    //заполняет массив значением а/5 = 2000
    for (b = 0; b < c+1; b++) f[b] = a/5;

    //вычисление
    while(c)
    {
        d = 0;
        g = c * 2;

        for (b = c; b > 1; b--)
        {
            d += f[b] * a;
            g--;
            f[b] = d % g;
            d /= g;
            g--;
            d *= b;
        }

            x = e + d/a;

            // строка для вывода на экран
            // добавляется по 4 цифры
            // дополняется спереди нулями до 000X
            str += QString::number(x).rightJustified(4, '0');

            // число знаков
            cx++;

        c -= 14;
        e = d % a;
    }


    ui->label_02->setText(QString::number(cx*4));
    ui->textEdit->append(str);
}

24  Qt / Кладовая готовых решений / Нахождение цифры № n в непрерывной последовательности цифр чисел Фибоначчи : Май 02, 2022, 08:49
Находит цифру и визуально показывает его в последовательности:

Код:
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;

public slots:
    void press_pbtn_01();

};
#endif // WIDGET_H

Код:
#include "widget.h"
#include "ui_widget.h"



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

    QObject::connect(ui->pbtn_01, SIGNAL(clicked()), this, SLOT(press_pbtn_01()));
}



Widget::~Widget()
{
    delete ui;
}



// количество цифр в числе
int len_digit(quint64 x)
{
    int cx = 0;
    while(x > 0)
    {
        cx++;
        x /= 10;
    }

return cx;
}





void Widget::press_pbtn_01()
{
    QString str, s1, s2;
    quint64 fib0, fib1;
    quint32 i, k, cx, cf;

    QString strinp = ui->lineEdit_01->text();
    quint32 inp = strinp.toInt();

    ui->lineEdit_02->clear();

    ui->label_01->clear();
    ui->label_02->clear();

    if((!inp) || (inp > 929)) return;

    fib0 = 0;
    fib1 = 1;
    cx = 1;
    cf = 0;

    while(cx < inp)
    {
        fib0 = fib0 + fib1;
        fib1 = fib0 - fib1;

        cx += len_digit(fib1);
        cf++;
        str += QString::number(fib1);
    }

    k = len_digit(fib1);
    str.remove(str.length() - k, k);

    if(inp == 1)
    {
        cf = 1;
        fib1 = 0;
    }

    fib0 = fib1;
    s1 = QString::number(fib0);

    for(i = 0; i < cx - inp; i++)
    {
        fib1 /= 10;
    }

    for(i = 0; i < k; i++)
    {
        quint32 m = k - (cx - inp) - 1;

        if(i == m) s2 += "_";
        s2 += s1.at(i);
        if(i == m) s2 += "_";
    }

    ui->lineEdit_02->setText(str + s2);

    str = QString::number(cf);

    ui->label_01->setText(QString::number(fib1 % 10));
    ui->label_02->setText(str + "   " + QString::number(fib0));

}


25  Qt / Кладовая готовых решений / Re: Преобразование систем счисления 2-16 : Май 02, 2022, 07:32
Задача была учебной. Бедняге студенту злой препод "ничего не объяснил", и сразу "задал такую непосильную задачу". Задачу я решил, но код выкладывать не стал. Не люблю работать за двоечников. Да ему (студенту) это бы и не помогло. Программа написана на Qt и оконная, а ему нужна консольная, и что-бы не меняя ни одного символа сразу показать преподу. Модификация чужих программ и подгонка их под свои требования вгоняет двоечников в гарантированный ступор.
26  Qt / Кладовая готовых решений / Re: Преобразование "число - текст" : Май 01, 2022, 17:21
Спасибо. Про исправления в настройках проекта я забыл... или не знал.
27  Qt / Кладовая готовых решений / Преобразование систем счисления 2-16 : Май 01, 2022, 17:20
Преобразование систем счисления 2-16.
Не производится никаких проверок на корректность введённых чисел.
Максимальный размер чисел - те, которые "влезают" в 64 разряда.
Код:
Код:
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>


QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE



class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;


public slots:
    void press_pbtn_01();
};

#endif // WIDGET_H


Код:
#include "widget.h"
#include "ui_widget.h"


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

    QObject::connect(ui->pbtn_01,SIGNAL(clicked()),this,SLOT(press_pbtn_01()));
}




Widget::~Widget()
{
    delete ui;
}




// перевод числа из х в десятичную систему
QString conv_any_todec(int x, QString str_in)
{
    // удаление пробелов из входной строки
    str_in = str_in.remove(" ");

    QString s1;
    quint32 ln = str_in.length() - 1;
    quint64 k, sum = 0;

    for(quint32 j = 0; j <= ln; j++)
    {
        s1 = str_in.at(ln - j);

        if(s1 == "A") s1 = "10";
        if(s1 == "B") s1 = "11";
        if(s1 == "C") s1 = "12";
        if(s1 == "D") s1 = "13";
        if(s1 == "E") s1 = "14";
        if(s1 == "F") s1 = "15";

        k = 1;
        for(quint32 i = 0; i < j; i++) k *= x;

        sum += s1.toInt() * k;
    }

    return QString::number(sum);
}




// перевод числа из десятичной в х систему
QString conv_dec_toany(int x, QString str_in)
{
    QString s1, res;
    quint32 k;
    quint64 dig = str_in.toULongLong();

    while(dig > 0)
    {
        k = dig % x;
        dig /= x;

        if(k < 10) s1 = QString::number(k);

        if(k == 10) s1 = "A";
        if(k == 11) s1 = "B";
        if(k == 12) s1 = "C";
        if(k == 13) s1 = "D";
        if(k == 14) s1 = "E";
        if(k == 15) s1 = "F";

        res += s1;
    }

    s1.clear();
    for(int j = res.length()-1; j >= 0; j--)
    {
        s1.append(res.at(j));
    }

    return s1;
}






//функция добавляет пробелы в число 12345678 -> 12 345 678
//---------------------------------------------------------------------------
QString fn_SpsToInt(QString str, quint32 k)
{
    int x = str.length() - k;
    while(x > 0) {str.insert(x, QString(" ")); x -= k;}

    return str;
}




// кнопка "Start"
void Widget::press_pbtn_01()
{
    QString str, dec, res;
    quint32 chl, k;

    str = ui->lineEdit_1->text();
    chl = str.toInt();

    str = ui->lineEdit_2->text().toUpper();
    ui->lineEdit_2->setText(str);

    dec = conv_any_todec(chl, str);

    str = ui->lineEdit_3->text();
    chl = str.toUInt();

    if(chl == 10) k = 3;
    else k = 4;

    res = conv_dec_toany(chl, dec);

    ui->label->setText(fn_SpsToInt(dec, 3));
    ui->lineEdit_4->setText(fn_SpsToInt(res, k));

}
28  Qt / Кладовая готовых решений / Re: Преобразование "число - текст" : Май 01, 2022, 15:41
Цитировать
Файлы лучше делать в UTF-8/ В 21 веке
Да эт понятно... но программы старые, написаны ещё на Qt 4.7. А "напрямую" перегнать в Qt 5.15 у меня не получается. Приходится создавать новый проект, делать такую же форму, и копировать код.
Ну вот, переделанный на Qt 5.15 проект:

29  Qt / Кладовая готовых решений / Re: Нахождение простого числа. : Апрель 29, 2022, 06:38
Решение учебного задания. И все случаи, где нужны простые числа до 264. Если бы я умел получать простые числа 2512 и выше - я бы не сидел на этом форуме, а работал где-нибудь топовым программистом...
30  Qt / Кладовая готовых решений / Преобразование "число - текст" : Апрель 28, 2022, 20:18
Программа преобразует введённое пользователем число в текст:

widget.h
Код:
namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT
   
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
   
private:
    Ui::Widget *ui;

public slots:
    void MyEventHandler1();

};

#endif // WIDGET_H


widget.cpp

Код:
#include "widget.h"
#include "ui_widget.h"



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

    QObject::connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(MyEventHandler1()));

}



Widget::~Widget()
{
    delete ui;
}





//функция добавляет пробелы в число 12345678 -> 12 345 678
//---------------------------------------------------------------------------
QString fn_SpsToInt(QString str)
{
    int x = str.length() - 3;
    while(x > 0) {str.insert(x, QString(" ")); x -= 3;}

    return str;
}




// ***********************************************************************************
// функция обрабатывает по три цифры
QString fnThreeDigitText(int xx)
{

    QString edn[] = {"", "один", "два", "три", "четыре", "пять",
                   "шесть", "семь", "восемь", "девять", "десять",
                   "одиннадцать", "двенадцать", "тринадцать",
                   "четырнадцать", "пятнадцать", "шестнадцать",
                   "семнадцать", "восемнадцать", "девятнадцать"
                  };

    QString dec[] = {"двадцать", "тридцать", "сорок", "пятьдесят",
                   "шестьдесят", "семьдесят", "восемьдесят", "девяносто"};

    QString han[] = {"сто", "двести" ,"триста", "четыреста", "пятьсот",
                   "шестьсот", "семьсот", "восемьсот", "девятьсот"};

    QString str;


    int y = xx / 100;

    if(y > 0) str = han[y-1] + " ";

    xx = xx % 100;
    y = xx / 10;

    if(xx > 19)
    {
         str += dec[y-2] + " ";
         xx = xx % 10;
    }

    str += edn[xx];

    return str;
}




// ***********************************************************************************
// функция превращения числа в строку слов
QString fnOllDigitsText(qint64 xx)
{
    // return если ноль
    if(xx == 0) return "ноль";

    int y, z, Cx = 0;

    QString s1, s2, rez;
    QString gig[] = {"", "тысяч", "миллион", "миллиард", "триллион"};


    // собсна процесс превращения числа в строку слов
    while(xx > 0)
    {
        if(xx % 1000)
        {
            y = xx % 10;
            z = xx % 100;

            s1 = fnThreeDigitText(xx % 1000);
            s2 = gig[Cx];

            // отсюда начинаются шаманские танцы с бубном
            // с целью изменения склонений и спряжений
            if(Cx == 1)
            {
                if((z < 10) || (z > 20))
                {
                    if(y == 1) s2 += "а";
                    if((y > 1) && (y < 5)) s2 += "и";

                    if(y == 1) s1.replace(s1.length()-2, 2, "на");
                    if(y == 2) s1.replace(s1.length()-2, 2, "ве");
                }
            }

            if(Cx > 1)
            {
                if((z > 10) && (z < 21)) s2 += "ов";

                else if((y > 1) && (y < 5)) s2 += "а";
                else if((y == 0) || (y > 4)) s2 += "ов";
            }
            // конец шаманских танцев с бубном


            rez = "\n" + s1 + " " + s2 + ", " + rez;
        }

        Cx++;
        xx = xx / 1000;
    }


    // удаляем лишние последние пробелы и запятые
    y = rez.length(); Cx = 0;

    while(y--)
    {
        if((rez.at(y) == ' ')||(rez.at(y) == ',')) Cx++;
        else break;
    }

    rez.resize(rez.length() - Cx);

    // удаляем непечатные символы с начала и конца строки
    // и добавляем точку в конце
    rez = rez.trimmed();   // + ".";

    // делаем первую букву заглавной
    rez[0] = rez.at(0).toUpper();

    return rez;
}







// ***********************************************************************************
// обработка нажатия кнопок
void Widget::MyEventHandler1()
{
    QChar s;
    QString inp = ui->lineEdit->text();

    if(inp == "") return;

    // проверка правильности введенного числа
    for(int i = 0; i < inp.length(); i++)
        {
        s = inp.at(i);

        if(s < '0' || s > '9')
            {
            ui->label_1->setText("неправильное число");
            return ;
            }
        }

    ui->label_4->setText(fn_SpsToInt(inp));
    ui->label_1->setText(fnOllDigitsText(inp.toLongLong()));

    return;
}
Страниц: 1 [2] 3 4

Страница сгенерирована за 0.135 секунд. Запросов: 23.