Название: Преобразование "число - текст" Отправлено: alexu007 от Апрель 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; } Название: Re: Преобразование "число - текст" Отправлено: qtkoder777 от Апрель 29, 2022, 21:59 Зачем весь этот код когда есть GPT-3, умеющий выполнять и не такие преобразования (скажем перевод с любого языка на любой другой)?
Если очень надо решить учебную задачу по написанию программы преобразования числа в текст - опять же поставьте Вашу задачу GPT-3. ИИ сгенерирует эффективный код на любом языке, решающий Вашу задачу. Название: Re: Преобразование "число - текст" Отправлено: tux от Апрель 29, 2022, 22:35 Неплохо.
Но, лучше бы сделать более-менее читаемое форматирование. Ну и отрицательные числа - тоже числа. Правильные. :) В файл проекта надо добавить QT += widgets В последней версии Qt5 уже нет QTextCodec::setCodecForCStrings(QTextCodec::codecForName("cp1251")); Файлы лучше делать в UTF-8/ В 21 веке. Название: Re: Преобразование "число - текст" Отправлено: alexu007 от Май 01, 2022, 15:41 Цитировать Файлы лучше делать в UTF-8/ В 21 веке Да эт понятно... но программы старые, написаны ещё на Qt 4.7. А "напрямую" перегнать в Qt 5.15 у меня не получается. Приходится создавать новый проект, делать такую же форму, и копировать код. Ну вот, переделанный на Qt 5.15 проект: Название: Re: Преобразование "число - текст" Отправлено: kambala от Май 01, 2022, 16:34 Цитировать А "напрямую" перегнать в Qt 5.15 у меня не получается как так? активируешь новый комплект в настройках проекта, дописываешь в .proКод: greaterThan(QT_MAJOR_VERSION, 4): { и исправляешь мелочи в коде при необходимости.QT += widgets } Название: Re: Преобразование "число - текст" Отправлено: alexu007 от Май 01, 2022, 17:21 Спасибо. Про исправления в настройках проекта я забыл... или не знал.
|