Russian Qt Forum
Ноябрь 22, 2024, 10:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Преобразование "число - текст"  (Прочитано 2357 раз)
alexu007
Чайник
*
Offline Offline

Сообщений: 58


Просмотр профиля
« : Апрель 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;
}
Записан
qtkoder777
Частый гость
***
Offline Offline

Сообщений: 245


Просмотр профиля
« Ответ #1 : Апрель 29, 2022, 21:59 »

Зачем весь этот код когда есть GPT-3, умеющий выполнять и не такие преобразования (скажем перевод с любого языка на любой другой)?

Если очень надо решить учебную задачу по написанию программы преобразования числа в текст - опять же поставьте Вашу задачу GPT-3. ИИ сгенерирует эффективный код на любом языке, решающий Вашу задачу.
Записан
tux
Global Moderator
Бывалый
*****
Offline Offline

Сообщений: 404



Просмотр профиля
« Ответ #2 : Апрель 29, 2022, 22:35 »

Неплохо.
Но, лучше бы сделать более-менее читаемое форматирование.
Ну и отрицательные числа - тоже числа. Правильные. Улыбающийся
В файл проекта надо добавить
QT  += widgets

В последней версии Qt5 уже нет
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("cp1251"));

Файлы лучше делать в UTF-8/ В 21 веке.
« Последнее редактирование: Апрель 29, 2022, 22:53 от tux » Записан

alexu007
Чайник
*
Offline Offline

Сообщений: 58


Просмотр профиля
« Ответ #3 : Май 01, 2022, 15:41 »

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

Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #4 : Май 01, 2022, 16:34 »

Цитировать
А "напрямую" перегнать в Qt 5.15 у меня не получается
как так? активируешь новый комплект в настройках проекта, дописываешь в .pro
Код:
greaterThan(QT_MAJOR_VERSION, 4): {
    QT += widgets
}
и исправляешь мелочи в коде при необходимости.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
alexu007
Чайник
*
Offline Offline

Сообщений: 58


Просмотр профиля
« Ответ #5 : Май 01, 2022, 17:21 »

Спасибо. Про исправления в настройках проекта я забыл... или не знал.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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