Название: Преобразование "число - текст"
Отправлено: 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
Спасибо. Про исправления в настройках проекта я забыл... или не знал.
|